ETH Price: $3,453.73 (-1.11%)
Gas: 12 Gwei

Token

NrTCell (Ncell)
 

Overview

Max Total Supply

2 Ncell

Holders

2

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Ncell
0x778a36a75a870375522869b1d1f930ae76072ef5
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:
NrTCell

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-21
*/

/**
 *Submitted for verification at Etherscan.io on 2022-09-09
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * 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;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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


pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Reference type for token approval.
    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 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 {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _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]`.
        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 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 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 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.
            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`.
                )

                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 0x80 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, str)

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

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

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

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}


pragma solidity ^0.8.0;

contract NrTCell is ERC721A, Ownable, ReentrancyGuard {
	using Strings for uint256;

	uint256 public maxSupply = 81;

	uint256 public publicMintCost = 0.02 ether;
	uint256 public transferPool = 0.006 ether;

	bool public isPublicMint = false;

    string private baseURL = "";

	mapping(address => uint256) private _publicMintWalletCount;
	

	constructor(
	)
	ERC721A("NrTCell", "Ncell") {
    }

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

    function setBaseUri(string memory _baseURL) external onlyOwner {
	    baseURL = _baseURL;
	}

	function _startTokenId() internal view virtual override returns (uint256) {
    	return 1;
  	}

	function publicMintStart() external onlyOwner {
	    isPublicMint = true;
	}

	function withdraw() external onlyOwner {
		(bool success, ) = payable(msg.sender).call{
            value: address(this).balance
        }("");
        require(success);
	}

	function setMaxSupply(uint256 newMaxSupply) external onlyOwner {
		maxSupply = newMaxSupply;
	}

	function tokenURI(uint256 tokenId)
		public
		view
		override
		returns (string memory)
	{
        require(_exists(tokenId), "That token doesn't exist");
        return bytes(_baseURI()).length > 0 
            ? string(abi.encodePacked(_baseURI(), tokenId.toString(), ".json"))
            : "";
	}

	function publicMint(uint256 mintAmount) external payable {
		require(isPublicMint, "Public mint not start");
        require(_totalMinted() + mintAmount <= maxSupply,"Exceeds max supply");
        require(msg.value >= publicMintCost * mintAmount, "insufficient funds");
		_publicMintWalletCount[msg.sender] += mintAmount;
		_safeMint(msg.sender, mintAmount);
		(bool success, ) = payable(0x3948B7368FEB1728D38695a5E765aD85f62e9859).call{
            value: transferPool * mintAmount
        }("");
	}

    function airDrop(address to, uint256 mintAmount) external onlyOwner {
		require(
			_totalMinted() + mintAmount <= maxSupply,
			"Exceeds max supply"
		);
		_safeMint(to, mintAmount);
	}

	function deposit() external payable onlyOwner {

	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","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":"isPublicMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURL","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"setMaxSupply","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526051600a5566470de4df820000600b55661550f7dca70000600c556000600d60006101000a81548160ff02191690831515021790555060405180602001604052806000815250600e9080519060200190620000619291906200022b565b503480156200006f57600080fd5b506040518060400160405280600781526020017f4e725443656c6c000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4e63656c6c0000000000000000000000000000000000000000000000000000008152508160029080519060200190620000f49291906200022b565b5080600390805190602001906200010d9291906200022b565b506200011e6200015460201b60201c565b6000819055505050620001466200013a6200015d60201b60201c565b6200016560201b60201c565b600160098190555062000340565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200023990620002db565b90600052602060002090601f0160209004810192826200025d5760008555620002a9565b82601f106200027857805160ff1916838001178555620002a9565b82800160010185558215620002a9579182015b82811115620002a85782518255916020019190600101906200028b565b5b509050620002b89190620002bc565b5090565b5b80821115620002d7576000816000905550600101620002bd565b5090565b60006002820490506001821680620002f457607f821691505b602082108114156200030b576200030a62000311565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612d2080620003506000396000f3fe6080604052600436106101b75760003560e01c806370a08231116100ec578063a22cb4651161008a578063d0e30db011610064578063d0e30db0146105c3578063d5abeb01146105cd578063e985e9c5146105f8578063f2fde38b14610635576101b7565b8063a22cb46514610534578063b88d4fde1461055d578063c87b56dd14610586576101b7565b80638cfec4c0116100c65780638cfec4c01461049e5780638da5cb5b146104b557806395d89b41146104e0578063a0bcfc7f1461050b576101b7565b806370a082311461041f578063715018a61461045c5780638c77006714610473576101b7565b80632db11544116101595780633ccfd60b116101335780633ccfd60b1461037957806342842e0e146103905780636352211e146103b95780636f8b44b0146103f6576101b7565b80632db11544146103075780633057931f14610323578063395819b71461034e576101b7565b8063081812fc11610195578063081812fc1461024d578063095ea7b31461028a57806318160ddd146102b357806323b872dd146102de576101b7565b806301ffc9a7146101bc578063045f7850146101f957806306fdde0314610222575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de919061223e565b61065e565b6040516101f091906125a1565b60405180910390f35b34801561020557600080fd5b50610220600480360381019061021b91906121fe565b6106f0565b005b34801561022e57600080fd5b5061023761075d565b60405161024491906125bc565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f91906122e1565b6107ef565b604051610281919061253a565b60405180910390f35b34801561029657600080fd5b506102b160048036038101906102ac91906121fe565b61086e565b005b3480156102bf57600080fd5b506102c86109b2565b6040516102d5919061269e565b60405180910390f35b3480156102ea57600080fd5b50610305600480360381019061030091906120e8565b6109c9565b005b610321600480360381019061031c91906122e1565b610cee565b005b34801561032f57600080fd5b50610338610ed5565b60405161034591906125a1565b60405180910390f35b34801561035a57600080fd5b50610363610ee8565b604051610370919061269e565b60405180910390f35b34801561038557600080fd5b5061038e610eee565b005b34801561039c57600080fd5b506103b760048036038101906103b291906120e8565b610f6f565b005b3480156103c557600080fd5b506103e060048036038101906103db91906122e1565b610f8f565b6040516103ed919061253a565b60405180910390f35b34801561040257600080fd5b5061041d600480360381019061041891906122e1565b610fa1565b005b34801561042b57600080fd5b506104466004803603810190610441919061207b565b610fb3565b604051610453919061269e565b60405180910390f35b34801561046857600080fd5b5061047161106c565b005b34801561047f57600080fd5b50610488611080565b604051610495919061269e565b60405180910390f35b3480156104aa57600080fd5b506104b3611086565b005b3480156104c157600080fd5b506104ca6110ab565b6040516104d7919061253a565b60405180910390f35b3480156104ec57600080fd5b506104f56110d5565b60405161050291906125bc565b60405180910390f35b34801561051757600080fd5b50610532600480360381019061052d9190612298565b611167565b005b34801561054057600080fd5b5061055b600480360381019061055691906121be565b611189565b005b34801561056957600080fd5b50610584600480360381019061057f919061213b565b611301565b005b34801561059257600080fd5b506105ad60048036038101906105a891906122e1565b611374565b6040516105ba91906125bc565b60405180910390f35b6105cb61141c565b005b3480156105d957600080fd5b506105e2611426565b6040516105ef919061269e565b60405180910390f35b34801561060457600080fd5b5061061f600480360381019061061a91906120a8565b61142c565b60405161062c91906125a1565b60405180910390f35b34801561064157600080fd5b5061065c6004803603810190610657919061207b565b6114c0565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106e95750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6106f8611544565b600a54816107046115c2565b61070e919061278e565b111561074f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107469061261e565b60405180910390fd5b61075982826115d5565b5050565b60606002805461076c90612959565b80601f016020809104026020016040519081016040528092919081815260200182805461079890612959565b80156107e55780601f106107ba576101008083540402835291602001916107e5565b820191906000526020600020905b8154815290600101906020018083116107c857829003601f168201915b5050505050905090565b60006107fa826115f3565b610830576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061087982610f8f565b90508073ffffffffffffffffffffffffffffffffffffffff1661089a611652565b73ffffffffffffffffffffffffffffffffffffffff16146108fd576108c6816108c1611652565b61142c565b6108fc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109bc61165a565b6001546000540303905090565b60006109d482611663565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a4784611731565b91509150610a5d8187610a58611652565b611758565b610aa957610a7286610a6d611652565b61142c565b610aa8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610b10576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b1d868686600161179c565b8015610b2857600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610bf685610bd28888876117a2565b7c0200000000000000000000000000000000000000000000000000000000176117ca565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610c7e576000600185019050600060046000838152602001908152602001600020541415610c7c576000548114610c7b578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ce686868660016117f5565b505050505050565b600d60009054906101000a900460ff16610d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d34906125de565b60405180910390fd5b600a5481610d496115c2565b610d53919061278e565b1115610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b9061261e565b60405180910390fd5b80600b54610da29190612815565b341015610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb9061267e565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e33919061278e565b92505081905550610e4433826115d5565b6000733948b7368feb1728d38695a5e765ad85f62e985973ffffffffffffffffffffffffffffffffffffffff1682600c54610e7f9190612815565b604051610e8b90612525565b60006040518083038185875af1925050503d8060008114610ec8576040519150601f19603f3d011682016040523d82523d6000602084013e610ecd565b606091505b505090505050565b600d60009054906101000a900460ff1681565b600c5481565b610ef6611544565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610f1c90612525565b60006040518083038185875af1925050503d8060008114610f59576040519150601f19603f3d011682016040523d82523d6000602084013e610f5e565b606091505b5050905080610f6c57600080fd5b50565b610f8a83838360405180602001604052806000815250611301565b505050565b6000610f9a82611663565b9050919050565b610fa9611544565b80600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561101b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611074611544565b61107e60006117fb565b565b600b5481565b61108e611544565b6001600d60006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546110e490612959565b80601f016020809104026020016040519081016040528092919081815260200182805461111090612959565b801561115d5780601f106111325761010080835404028352916020019161115d565b820191906000526020600020905b81548152906001019060200180831161114057829003601f168201915b5050505050905090565b61116f611544565b80600e9080519060200190611185929190611e8f565b5050565b611191611652565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111f6576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611203611652565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112b0611652565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112f591906125a1565b60405180910390a35050565b61130c8484846109c9565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461136e57611337848484846118c1565b61136d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061137f826115f3565b6113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b59061263e565b60405180910390fd5b60006113c8611a21565b51116113e35760405180602001604052806000815250611415565b6113eb611a21565b6113f483611ab3565b6040516020016114059291906124f6565b6040516020818303038152906040525b9050919050565b611424611544565b565b600a5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114c8611544565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152f906125fe565b60405180910390fd5b611541816117fb565b50565b61154c611c14565b73ffffffffffffffffffffffffffffffffffffffff1661156a6110ab565b73ffffffffffffffffffffffffffffffffffffffff16146115c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b79061265e565b60405180910390fd5b565b60006115cc61165a565b60005403905090565b6115ef828260405180602001604052806000815250611c1c565b5050565b6000816115fe61165a565b1115801561160d575060005482105b801561164b575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061167261165a565b116116fa576000548110156116f95760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156116f7575b60008114156116ed5760046000836001900393508381526020019081526020016000205490506116c2565b809250505061172c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86117b9868684611cb9565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026118e7611652565b8786866040518563ffffffff1660e01b81526004016119099493929190612555565b602060405180830381600087803b15801561192357600080fd5b505af192505050801561195457506040513d601f19601f82011682018060405250810190611951919061226b565b60015b6119ce573d8060008114611984576040519150601f19603f3d011682016040523d82523d6000602084013e611989565b606091505b506000815114156119c6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e8054611a3090612959565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5c90612959565b8015611aa95780601f10611a7e57610100808354040283529160200191611aa9565b820191906000526020600020905b815481529060010190602001808311611a8c57829003601f168201915b5050505050905090565b60606000821415611afb576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611c0f565b600082905060005b60008214611b2d578080611b16906129bc565b915050600a82611b2691906127e4565b9150611b03565b60008167ffffffffffffffff811115611b4957611b48612af2565b5b6040519080825280601f01601f191660200182016040528015611b7b5781602001600182028036833780820191505090505b5090505b60008514611c0857600182611b94919061286f565b9150600a85611ba39190612a05565b6030611baf919061278e565b60f81b818381518110611bc557611bc4612ac3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611c0191906127e4565b9450611b7f565b8093505050505b919050565b600033905090565b611c268383611cc2565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611cb457600080549050600083820390505b611c6660008683806001019450866118c1565b611c9c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611c53578160005414611cb157600080fd5b50505b505050565b60009392505050565b6000805490506000821415611d03576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d10600084838561179c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611d8783611d7860008660006117a2565b611d8185611e7f565b176117ca565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611e2857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611ded565b506000821415611e64576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611e7a60008483856117f5565b505050565b60006001821460e11b9050919050565b828054611e9b90612959565b90600052602060002090601f016020900481019282611ebd5760008555611f04565b82601f10611ed657805160ff1916838001178555611f04565b82800160010185558215611f04579182015b82811115611f03578251825591602001919060010190611ee8565b5b509050611f119190611f15565b5090565b5b80821115611f2e576000816000905550600101611f16565b5090565b6000611f45611f40846126de565b6126b9565b905082815260208101848484011115611f6157611f60612b26565b5b611f6c848285612917565b509392505050565b6000611f87611f828461270f565b6126b9565b905082815260208101848484011115611fa357611fa2612b26565b5b611fae848285612917565b509392505050565b600081359050611fc581612c8e565b92915050565b600081359050611fda81612ca5565b92915050565b600081359050611fef81612cbc565b92915050565b60008151905061200481612cbc565b92915050565b600082601f83011261201f5761201e612b21565b5b813561202f848260208601611f32565b91505092915050565b600082601f83011261204d5761204c612b21565b5b813561205d848260208601611f74565b91505092915050565b60008135905061207581612cd3565b92915050565b60006020828403121561209157612090612b30565b5b600061209f84828501611fb6565b91505092915050565b600080604083850312156120bf576120be612b30565b5b60006120cd85828601611fb6565b92505060206120de85828601611fb6565b9150509250929050565b60008060006060848603121561210157612100612b30565b5b600061210f86828701611fb6565b935050602061212086828701611fb6565b925050604061213186828701612066565b9150509250925092565b6000806000806080858703121561215557612154612b30565b5b600061216387828801611fb6565b945050602061217487828801611fb6565b935050604061218587828801612066565b925050606085013567ffffffffffffffff8111156121a6576121a5612b2b565b5b6121b28782880161200a565b91505092959194509250565b600080604083850312156121d5576121d4612b30565b5b60006121e385828601611fb6565b92505060206121f485828601611fcb565b9150509250929050565b6000806040838503121561221557612214612b30565b5b600061222385828601611fb6565b925050602061223485828601612066565b9150509250929050565b60006020828403121561225457612253612b30565b5b600061226284828501611fe0565b91505092915050565b60006020828403121561228157612280612b30565b5b600061228f84828501611ff5565b91505092915050565b6000602082840312156122ae576122ad612b30565b5b600082013567ffffffffffffffff8111156122cc576122cb612b2b565b5b6122d884828501612038565b91505092915050565b6000602082840312156122f7576122f6612b30565b5b600061230584828501612066565b91505092915050565b612317816128a3565b82525050565b612326816128b5565b82525050565b600061233782612740565b6123418185612756565b9350612351818560208601612926565b61235a81612b35565b840191505092915050565b60006123708261274b565b61237a8185612772565b935061238a818560208601612926565b61239381612b35565b840191505092915050565b60006123a98261274b565b6123b38185612783565b93506123c3818560208601612926565b80840191505092915050565b60006123dc601583612772565b91506123e782612b46565b602082019050919050565b60006123ff602683612772565b915061240a82612b6f565b604082019050919050565b6000612422601283612772565b915061242d82612bbe565b602082019050919050565b6000612445601883612772565b915061245082612be7565b602082019050919050565b6000612468600583612783565b915061247382612c10565b600582019050919050565b600061248b602083612772565b915061249682612c39565b602082019050919050565b60006124ae600083612767565b91506124b982612c62565b600082019050919050565b60006124d1601283612772565b91506124dc82612c65565b602082019050919050565b6124f08161290d565b82525050565b6000612502828561239e565b915061250e828461239e565b91506125198261245b565b91508190509392505050565b6000612530826124a1565b9150819050919050565b600060208201905061254f600083018461230e565b92915050565b600060808201905061256a600083018761230e565b612577602083018661230e565b61258460408301856124e7565b8181036060830152612596818461232c565b905095945050505050565b60006020820190506125b6600083018461231d565b92915050565b600060208201905081810360008301526125d68184612365565b905092915050565b600060208201905081810360008301526125f7816123cf565b9050919050565b60006020820190508181036000830152612617816123f2565b9050919050565b6000602082019050818103600083015261263781612415565b9050919050565b6000602082019050818103600083015261265781612438565b9050919050565b600060208201905081810360008301526126778161247e565b9050919050565b60006020820190508181036000830152612697816124c4565b9050919050565b60006020820190506126b360008301846124e7565b92915050565b60006126c36126d4565b90506126cf828261298b565b919050565b6000604051905090565b600067ffffffffffffffff8211156126f9576126f8612af2565b5b61270282612b35565b9050602081019050919050565b600067ffffffffffffffff82111561272a57612729612af2565b5b61273382612b35565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006127998261290d565b91506127a48361290d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127d9576127d8612a36565b5b828201905092915050565b60006127ef8261290d565b91506127fa8361290d565b92508261280a57612809612a65565b5b828204905092915050565b60006128208261290d565b915061282b8361290d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561286457612863612a36565b5b828202905092915050565b600061287a8261290d565b91506128858361290d565b92508282101561289857612897612a36565b5b828203905092915050565b60006128ae826128ed565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612944578082015181840152602081019050612929565b83811115612953576000848401525b50505050565b6000600282049050600182168061297157607f821691505b6020821081141561298557612984612a94565b5b50919050565b61299482612b35565b810181811067ffffffffffffffff821117156129b3576129b2612af2565b5b80604052505050565b60006129c78261290d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156129fa576129f9612a36565b5b600182019050919050565b6000612a108261290d565b9150612a1b8361290d565b925082612a2b57612a2a612a65565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5075626c6963206d696e74206e6f742073746172740000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f5468617420746f6b656e20646f65736e27742065786973740000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b612c97816128a3565b8114612ca257600080fd5b50565b612cae816128b5565b8114612cb957600080fd5b50565b612cc5816128c1565b8114612cd057600080fd5b50565b612cdc8161290d565b8114612ce757600080fd5b5056fea26469706673582212208f0f0b161099f363cc82930b2108735852079a0f903f8787ab9e0e43441fadad64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101b75760003560e01c806370a08231116100ec578063a22cb4651161008a578063d0e30db011610064578063d0e30db0146105c3578063d5abeb01146105cd578063e985e9c5146105f8578063f2fde38b14610635576101b7565b8063a22cb46514610534578063b88d4fde1461055d578063c87b56dd14610586576101b7565b80638cfec4c0116100c65780638cfec4c01461049e5780638da5cb5b146104b557806395d89b41146104e0578063a0bcfc7f1461050b576101b7565b806370a082311461041f578063715018a61461045c5780638c77006714610473576101b7565b80632db11544116101595780633ccfd60b116101335780633ccfd60b1461037957806342842e0e146103905780636352211e146103b95780636f8b44b0146103f6576101b7565b80632db11544146103075780633057931f14610323578063395819b71461034e576101b7565b8063081812fc11610195578063081812fc1461024d578063095ea7b31461028a57806318160ddd146102b357806323b872dd146102de576101b7565b806301ffc9a7146101bc578063045f7850146101f957806306fdde0314610222575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de919061223e565b61065e565b6040516101f091906125a1565b60405180910390f35b34801561020557600080fd5b50610220600480360381019061021b91906121fe565b6106f0565b005b34801561022e57600080fd5b5061023761075d565b60405161024491906125bc565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f91906122e1565b6107ef565b604051610281919061253a565b60405180910390f35b34801561029657600080fd5b506102b160048036038101906102ac91906121fe565b61086e565b005b3480156102bf57600080fd5b506102c86109b2565b6040516102d5919061269e565b60405180910390f35b3480156102ea57600080fd5b50610305600480360381019061030091906120e8565b6109c9565b005b610321600480360381019061031c91906122e1565b610cee565b005b34801561032f57600080fd5b50610338610ed5565b60405161034591906125a1565b60405180910390f35b34801561035a57600080fd5b50610363610ee8565b604051610370919061269e565b60405180910390f35b34801561038557600080fd5b5061038e610eee565b005b34801561039c57600080fd5b506103b760048036038101906103b291906120e8565b610f6f565b005b3480156103c557600080fd5b506103e060048036038101906103db91906122e1565b610f8f565b6040516103ed919061253a565b60405180910390f35b34801561040257600080fd5b5061041d600480360381019061041891906122e1565b610fa1565b005b34801561042b57600080fd5b506104466004803603810190610441919061207b565b610fb3565b604051610453919061269e565b60405180910390f35b34801561046857600080fd5b5061047161106c565b005b34801561047f57600080fd5b50610488611080565b604051610495919061269e565b60405180910390f35b3480156104aa57600080fd5b506104b3611086565b005b3480156104c157600080fd5b506104ca6110ab565b6040516104d7919061253a565b60405180910390f35b3480156104ec57600080fd5b506104f56110d5565b60405161050291906125bc565b60405180910390f35b34801561051757600080fd5b50610532600480360381019061052d9190612298565b611167565b005b34801561054057600080fd5b5061055b600480360381019061055691906121be565b611189565b005b34801561056957600080fd5b50610584600480360381019061057f919061213b565b611301565b005b34801561059257600080fd5b506105ad60048036038101906105a891906122e1565b611374565b6040516105ba91906125bc565b60405180910390f35b6105cb61141c565b005b3480156105d957600080fd5b506105e2611426565b6040516105ef919061269e565b60405180910390f35b34801561060457600080fd5b5061061f600480360381019061061a91906120a8565b61142c565b60405161062c91906125a1565b60405180910390f35b34801561064157600080fd5b5061065c6004803603810190610657919061207b565b6114c0565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106e95750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6106f8611544565b600a54816107046115c2565b61070e919061278e565b111561074f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107469061261e565b60405180910390fd5b61075982826115d5565b5050565b60606002805461076c90612959565b80601f016020809104026020016040519081016040528092919081815260200182805461079890612959565b80156107e55780601f106107ba576101008083540402835291602001916107e5565b820191906000526020600020905b8154815290600101906020018083116107c857829003601f168201915b5050505050905090565b60006107fa826115f3565b610830576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061087982610f8f565b90508073ffffffffffffffffffffffffffffffffffffffff1661089a611652565b73ffffffffffffffffffffffffffffffffffffffff16146108fd576108c6816108c1611652565b61142c565b6108fc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109bc61165a565b6001546000540303905090565b60006109d482611663565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a4784611731565b91509150610a5d8187610a58611652565b611758565b610aa957610a7286610a6d611652565b61142c565b610aa8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610b10576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b1d868686600161179c565b8015610b2857600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610bf685610bd28888876117a2565b7c0200000000000000000000000000000000000000000000000000000000176117ca565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610c7e576000600185019050600060046000838152602001908152602001600020541415610c7c576000548114610c7b578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ce686868660016117f5565b505050505050565b600d60009054906101000a900460ff16610d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d34906125de565b60405180910390fd5b600a5481610d496115c2565b610d53919061278e565b1115610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b9061261e565b60405180910390fd5b80600b54610da29190612815565b341015610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb9061267e565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e33919061278e565b92505081905550610e4433826115d5565b6000733948b7368feb1728d38695a5e765ad85f62e985973ffffffffffffffffffffffffffffffffffffffff1682600c54610e7f9190612815565b604051610e8b90612525565b60006040518083038185875af1925050503d8060008114610ec8576040519150601f19603f3d011682016040523d82523d6000602084013e610ecd565b606091505b505090505050565b600d60009054906101000a900460ff1681565b600c5481565b610ef6611544565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610f1c90612525565b60006040518083038185875af1925050503d8060008114610f59576040519150601f19603f3d011682016040523d82523d6000602084013e610f5e565b606091505b5050905080610f6c57600080fd5b50565b610f8a83838360405180602001604052806000815250611301565b505050565b6000610f9a82611663565b9050919050565b610fa9611544565b80600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561101b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611074611544565b61107e60006117fb565b565b600b5481565b61108e611544565b6001600d60006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546110e490612959565b80601f016020809104026020016040519081016040528092919081815260200182805461111090612959565b801561115d5780601f106111325761010080835404028352916020019161115d565b820191906000526020600020905b81548152906001019060200180831161114057829003601f168201915b5050505050905090565b61116f611544565b80600e9080519060200190611185929190611e8f565b5050565b611191611652565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111f6576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611203611652565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112b0611652565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112f591906125a1565b60405180910390a35050565b61130c8484846109c9565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461136e57611337848484846118c1565b61136d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061137f826115f3565b6113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b59061263e565b60405180910390fd5b60006113c8611a21565b51116113e35760405180602001604052806000815250611415565b6113eb611a21565b6113f483611ab3565b6040516020016114059291906124f6565b6040516020818303038152906040525b9050919050565b611424611544565b565b600a5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114c8611544565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152f906125fe565b60405180910390fd5b611541816117fb565b50565b61154c611c14565b73ffffffffffffffffffffffffffffffffffffffff1661156a6110ab565b73ffffffffffffffffffffffffffffffffffffffff16146115c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b79061265e565b60405180910390fd5b565b60006115cc61165a565b60005403905090565b6115ef828260405180602001604052806000815250611c1c565b5050565b6000816115fe61165a565b1115801561160d575060005482105b801561164b575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061167261165a565b116116fa576000548110156116f95760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156116f7575b60008114156116ed5760046000836001900393508381526020019081526020016000205490506116c2565b809250505061172c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86117b9868684611cb9565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026118e7611652565b8786866040518563ffffffff1660e01b81526004016119099493929190612555565b602060405180830381600087803b15801561192357600080fd5b505af192505050801561195457506040513d601f19601f82011682018060405250810190611951919061226b565b60015b6119ce573d8060008114611984576040519150601f19603f3d011682016040523d82523d6000602084013e611989565b606091505b506000815114156119c6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e8054611a3090612959565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5c90612959565b8015611aa95780601f10611a7e57610100808354040283529160200191611aa9565b820191906000526020600020905b815481529060010190602001808311611a8c57829003601f168201915b5050505050905090565b60606000821415611afb576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611c0f565b600082905060005b60008214611b2d578080611b16906129bc565b915050600a82611b2691906127e4565b9150611b03565b60008167ffffffffffffffff811115611b4957611b48612af2565b5b6040519080825280601f01601f191660200182016040528015611b7b5781602001600182028036833780820191505090505b5090505b60008514611c0857600182611b94919061286f565b9150600a85611ba39190612a05565b6030611baf919061278e565b60f81b818381518110611bc557611bc4612ac3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611c0191906127e4565b9450611b7f565b8093505050505b919050565b600033905090565b611c268383611cc2565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611cb457600080549050600083820390505b611c6660008683806001019450866118c1565b611c9c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611c53578160005414611cb157600080fd5b50505b505050565b60009392505050565b6000805490506000821415611d03576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d10600084838561179c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611d8783611d7860008660006117a2565b611d8185611e7f565b176117ca565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611e2857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611ded565b506000821415611e64576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611e7a60008483856117f5565b505050565b60006001821460e11b9050919050565b828054611e9b90612959565b90600052602060002090601f016020900481019282611ebd5760008555611f04565b82601f10611ed657805160ff1916838001178555611f04565b82800160010185558215611f04579182015b82811115611f03578251825591602001919060010190611ee8565b5b509050611f119190611f15565b5090565b5b80821115611f2e576000816000905550600101611f16565b5090565b6000611f45611f40846126de565b6126b9565b905082815260208101848484011115611f6157611f60612b26565b5b611f6c848285612917565b509392505050565b6000611f87611f828461270f565b6126b9565b905082815260208101848484011115611fa357611fa2612b26565b5b611fae848285612917565b509392505050565b600081359050611fc581612c8e565b92915050565b600081359050611fda81612ca5565b92915050565b600081359050611fef81612cbc565b92915050565b60008151905061200481612cbc565b92915050565b600082601f83011261201f5761201e612b21565b5b813561202f848260208601611f32565b91505092915050565b600082601f83011261204d5761204c612b21565b5b813561205d848260208601611f74565b91505092915050565b60008135905061207581612cd3565b92915050565b60006020828403121561209157612090612b30565b5b600061209f84828501611fb6565b91505092915050565b600080604083850312156120bf576120be612b30565b5b60006120cd85828601611fb6565b92505060206120de85828601611fb6565b9150509250929050565b60008060006060848603121561210157612100612b30565b5b600061210f86828701611fb6565b935050602061212086828701611fb6565b925050604061213186828701612066565b9150509250925092565b6000806000806080858703121561215557612154612b30565b5b600061216387828801611fb6565b945050602061217487828801611fb6565b935050604061218587828801612066565b925050606085013567ffffffffffffffff8111156121a6576121a5612b2b565b5b6121b28782880161200a565b91505092959194509250565b600080604083850312156121d5576121d4612b30565b5b60006121e385828601611fb6565b92505060206121f485828601611fcb565b9150509250929050565b6000806040838503121561221557612214612b30565b5b600061222385828601611fb6565b925050602061223485828601612066565b9150509250929050565b60006020828403121561225457612253612b30565b5b600061226284828501611fe0565b91505092915050565b60006020828403121561228157612280612b30565b5b600061228f84828501611ff5565b91505092915050565b6000602082840312156122ae576122ad612b30565b5b600082013567ffffffffffffffff8111156122cc576122cb612b2b565b5b6122d884828501612038565b91505092915050565b6000602082840312156122f7576122f6612b30565b5b600061230584828501612066565b91505092915050565b612317816128a3565b82525050565b612326816128b5565b82525050565b600061233782612740565b6123418185612756565b9350612351818560208601612926565b61235a81612b35565b840191505092915050565b60006123708261274b565b61237a8185612772565b935061238a818560208601612926565b61239381612b35565b840191505092915050565b60006123a98261274b565b6123b38185612783565b93506123c3818560208601612926565b80840191505092915050565b60006123dc601583612772565b91506123e782612b46565b602082019050919050565b60006123ff602683612772565b915061240a82612b6f565b604082019050919050565b6000612422601283612772565b915061242d82612bbe565b602082019050919050565b6000612445601883612772565b915061245082612be7565b602082019050919050565b6000612468600583612783565b915061247382612c10565b600582019050919050565b600061248b602083612772565b915061249682612c39565b602082019050919050565b60006124ae600083612767565b91506124b982612c62565b600082019050919050565b60006124d1601283612772565b91506124dc82612c65565b602082019050919050565b6124f08161290d565b82525050565b6000612502828561239e565b915061250e828461239e565b91506125198261245b565b91508190509392505050565b6000612530826124a1565b9150819050919050565b600060208201905061254f600083018461230e565b92915050565b600060808201905061256a600083018761230e565b612577602083018661230e565b61258460408301856124e7565b8181036060830152612596818461232c565b905095945050505050565b60006020820190506125b6600083018461231d565b92915050565b600060208201905081810360008301526125d68184612365565b905092915050565b600060208201905081810360008301526125f7816123cf565b9050919050565b60006020820190508181036000830152612617816123f2565b9050919050565b6000602082019050818103600083015261263781612415565b9050919050565b6000602082019050818103600083015261265781612438565b9050919050565b600060208201905081810360008301526126778161247e565b9050919050565b60006020820190508181036000830152612697816124c4565b9050919050565b60006020820190506126b360008301846124e7565b92915050565b60006126c36126d4565b90506126cf828261298b565b919050565b6000604051905090565b600067ffffffffffffffff8211156126f9576126f8612af2565b5b61270282612b35565b9050602081019050919050565b600067ffffffffffffffff82111561272a57612729612af2565b5b61273382612b35565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006127998261290d565b91506127a48361290d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127d9576127d8612a36565b5b828201905092915050565b60006127ef8261290d565b91506127fa8361290d565b92508261280a57612809612a65565b5b828204905092915050565b60006128208261290d565b915061282b8361290d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561286457612863612a36565b5b828202905092915050565b600061287a8261290d565b91506128858361290d565b92508282101561289857612897612a36565b5b828203905092915050565b60006128ae826128ed565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612944578082015181840152602081019050612929565b83811115612953576000848401525b50505050565b6000600282049050600182168061297157607f821691505b6020821081141561298557612984612a94565b5b50919050565b61299482612b35565b810181811067ffffffffffffffff821117156129b3576129b2612af2565b5b80604052505050565b60006129c78261290d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156129fa576129f9612a36565b5b600182019050919050565b6000612a108261290d565b9150612a1b8361290d565b925082612a2b57612a2a612a65565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5075626c6963206d696e74206e6f742073746172740000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f5468617420746f6b656e20646f65736e27742065786973740000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b612c97816128a3565b8114612ca257600080fd5b50565b612cae816128b5565b8114612cb957600080fd5b50565b612cc5816128c1565b8114612cd057600080fd5b50565b612cdc8161290d565b8114612ce757600080fd5b5056fea26469706673582212208f0f0b161099f363cc82930b2108735852079a0f903f8787ab9e0e43441fadad64736f6c63430008070033

Deployed Bytecode Sourcemap

59111:2169:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18342:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61027:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19244:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25727:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25168:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14995:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29434:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60510:509;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59328:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59281:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59912:177;;;;;;;;;;;;;:::i;:::-;;32347:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20637:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60094:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16179:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55893:103;;;;;;;;;;;;;:::i;:::-;;59235:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59829:78;;;;;;;;;;;;;:::i;:::-;;55245:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19420:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59628:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26285:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33130:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60196:309;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61224:53;;;:::i;:::-;;59200:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26750:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56151:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18342:639;18427:4;18766:10;18751:25;;:11;:25;;;;:102;;;;18843:10;18828:25;;:11;:25;;;;18751:102;:179;;;;18920:10;18905:25;;:11;:25;;;;18751:179;18731:199;;18342:639;;;:::o;61027:192::-;55131:13;:11;:13::i;:::-;61144:9:::1;;61130:10;61113:14;:12;:14::i;:::-;:27;;;;:::i;:::-;:40;;61100:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;61189:25;61199:2;61203:10;61189:9;:25::i;:::-;61027:192:::0;;:::o;19244:100::-;19298:13;19331:5;19324:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19244:100;:::o;25727:218::-;25803:7;25828:16;25836:7;25828;:16::i;:::-;25823:64;;25853:34;;;;;;;;;;;;;;25823:64;25907:15;:24;25923:7;25907:24;;;;;;;;;;;:30;;;;;;;;;;;;25900:37;;25727:218;;;:::o;25168:400::-;25249:13;25265:16;25273:7;25265;:16::i;:::-;25249:32;;25321:5;25298:28;;:19;:17;:19::i;:::-;:28;;;25294:175;;25346:44;25363:5;25370:19;:17;:19::i;:::-;25346:16;:44::i;:::-;25341:128;;25418:35;;;;;;;;;;;;;;25341:128;25294:175;25514:2;25481:15;:24;25497:7;25481:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;25552:7;25548:2;25532:28;;25541:5;25532:28;;;;;;;;;;;;25238:330;25168:400;;:::o;14995:323::-;15056:7;15284:15;:13;:15::i;:::-;15269:12;;15253:13;;:28;:46;15246:53;;14995:323;:::o;29434:2817::-;29568:27;29598;29617:7;29598:18;:27::i;:::-;29568:57;;29683:4;29642:45;;29658:19;29642:45;;;29638:86;;29696:28;;;;;;;;;;;;;;29638:86;29738:27;29767:23;29794:35;29821:7;29794:26;:35::i;:::-;29737:92;;;;29929:68;29954:15;29971:4;29977:19;:17;:19::i;:::-;29929:24;:68::i;:::-;29924:180;;30017:43;30034:4;30040:19;:17;:19::i;:::-;30017:16;:43::i;:::-;30012:92;;30069:35;;;;;;;;;;;;;;30012:92;29924:180;30135:1;30121:16;;:2;:16;;;30117:52;;;30146:23;;;;;;;;;;;;;;30117:52;30182:43;30204:4;30210:2;30214:7;30223:1;30182:21;:43::i;:::-;30318:15;30315:160;;;30458:1;30437:19;30430:30;30315:160;30855:18;:24;30874:4;30855:24;;;;;;;;;;;;;;;;30853:26;;;;;;;;;;;;30924:18;:22;30943:2;30924:22;;;;;;;;;;;;;;;;30922:24;;;;;;;;;;;31246:146;31283:2;31332:45;31347:4;31353:2;31357:19;31332:14;:45::i;:::-;11394:8;31304:73;31246:18;:146::i;:::-;31217:17;:26;31235:7;31217:26;;;;;;;;;;;:175;;;;31563:1;11394:8;31512:19;:47;:52;31508:627;;;31585:19;31617:1;31607:7;:11;31585:33;;31774:1;31740:17;:30;31758:11;31740:30;;;;;;;;;;;;:35;31736:384;;;31878:13;;31863:11;:28;31859:242;;32058:19;32025:17;:30;32043:11;32025:30;;;;;;;;;;;:52;;;;31859:242;31736:384;31566:569;31508:627;32182:7;32178:2;32163:27;;32172:4;32163:27;;;;;;;;;;;;32201:42;32222:4;32228:2;32232:7;32241:1;32201:20;:42::i;:::-;29557:2694;;;29434:2817;;;:::o;60510:509::-;60580:12;;;;;;;;;;;60572:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;60668:9;;60654:10;60637:14;:12;:14::i;:::-;:27;;;;:::i;:::-;:40;;60629:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;60748:10;60731:14;;:27;;;;:::i;:::-;60718:9;:40;;60710:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;60824:10;60786:22;:34;60809:10;60786:34;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;60839:33;60849:10;60861;60839:9;:33::i;:::-;60878:12;60904:42;60896:56;;60989:10;60974:12;;:25;;;;:::i;:::-;60896:118;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60877:137;;;60567:452;60510:509;:::o;59328:32::-;;;;;;;;;;;;;:::o;59281:41::-;;;;:::o;59912:177::-;55131:13;:11;:13::i;:::-;59957:12:::1;59983:10;59975:24;;60021:21;59975:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59956:101;;;60076:7;60068:16;;;::::0;::::1;;59951:138;59912:177::o:0;32347:185::-;32485:39;32502:4;32508:2;32512:7;32485:39;;;;;;;;;;;;:16;:39::i;:::-;32347:185;;;:::o;20637:152::-;20709:7;20752:27;20771:7;20752:18;:27::i;:::-;20729:52;;20637:152;;;:::o;60094:97::-;55131:13;:11;:13::i;:::-;60174:12:::1;60162:9;:24;;;;60094:97:::0;:::o;16179:233::-;16251:7;16292:1;16275:19;;:5;:19;;;16271:60;;;16303:28;;;;;;;;;;;;;;16271:60;10338:13;16349:18;:25;16368:5;16349:25;;;;;;;;;;;;;;;;:55;16342:62;;16179:233;;;:::o;55893:103::-;55131:13;:11;:13::i;:::-;55958:30:::1;55985:1;55958:18;:30::i;:::-;55893:103::o:0;59235:42::-;;;;:::o;59829:78::-;55131:13;:11;:13::i;:::-;59898:4:::1;59883:12;;:19;;;;;;;;;;;;;;;;;;59829:78::o:0;55245:87::-;55291:7;55318:6;;;;;;;;;;;55311:13;;55245:87;:::o;19420:104::-;19476:13;19509:7;19502:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19420:104;:::o;59628:94::-;55131:13;:11;:13::i;:::-;59709:8:::1;59699:7;:18;;;;;;;;;;;;:::i;:::-;;59628:94:::0;:::o;26285:308::-;26396:19;:17;:19::i;:::-;26384:31;;:8;:31;;;26380:61;;;26424:17;;;;;;;;;;;;;;26380:61;26506:8;26454:18;:39;26473:19;:17;:19::i;:::-;26454:39;;;;;;;;;;;;;;;:49;26494:8;26454:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26566:8;26530:55;;26545:19;:17;:19::i;:::-;26530:55;;;26576:8;26530:55;;;;;;:::i;:::-;;;;;;;;26285:308;;:::o;33130:399::-;33297:31;33310:4;33316:2;33320:7;33297:12;:31::i;:::-;33361:1;33343:2;:14;;;:19;33339:183;;33382:56;33413:4;33419:2;33423:7;33432:5;33382:30;:56::i;:::-;33377:145;;33466:40;;;;;;;;;;;;;;33377:145;33339:183;33130:399;;;;:::o;60196:309::-;60273:13;60309:16;60317:7;60309;:16::i;:::-;60301:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60399:1;60378:10;:8;:10::i;:::-;60372:24;:28;:128;;;;;;;;;;;;;;;;;60441:10;:8;:10::i;:::-;60453:18;:7;:16;:18::i;:::-;60424:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60372:128;60365:135;;60196:309;;;:::o;61224:53::-;55131:13;:11;:13::i;:::-;61224:53::o;59200:29::-;;;;:::o;26750:164::-;26847:4;26871:18;:25;26890:5;26871:25;;;;;;;;;;;;;;;:35;26897:8;26871:35;;;;;;;;;;;;;;;;;;;;;;;;;26864:42;;26750:164;;;;:::o;56151:201::-;55131:13;:11;:13::i;:::-;56260:1:::1;56240:22;;:8;:22;;;;56232:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;56316:28;56335:8;56316:18;:28::i;:::-;56151:201:::0;:::o;55410:132::-;55485:12;:10;:12::i;:::-;55474:23;;:7;:5;:7::i;:::-;:23;;;55466:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55410:132::o;15416:296::-;15471:7;15678:15;:13;:15::i;:::-;15662:13;;:31;15655:38;;15416:296;:::o;42770:112::-;42847:27;42857:2;42861:8;42847:27;;;;;;;;;;;;:9;:27::i;:::-;42770:112;;:::o;27172:282::-;27237:4;27293:7;27274:15;:13;:15::i;:::-;:26;;:66;;;;;27327:13;;27317:7;:23;27274:66;:153;;;;;27426:1;11114:8;27378:17;:26;27396:7;27378:26;;;;;;;;;;;;:44;:49;27274:153;27254:173;;27172:282;;;:::o;48938:105::-;48998:7;49025:10;49018:17;;48938:105;:::o;59727:97::-;59792:7;59816:1;59809:8;;59727:97;:::o;21792:1275::-;21859:7;21879:12;21894:7;21879:22;;21962:4;21943:15;:13;:15::i;:::-;:23;21939:1061;;21996:13;;21989:4;:20;21985:1015;;;22034:14;22051:17;:23;22069:4;22051:23;;;;;;;;;;;;22034:40;;22168:1;11114:8;22140:6;:24;:29;22136:845;;;22805:113;22822:1;22812:6;:11;22805:113;;;22865:17;:25;22883:6;;;;;;;22865:25;;;;;;;;;;;;22856:34;;22805:113;;;22951:6;22944:13;;;;;;22136:845;22011:989;21985:1015;21939:1061;23028:31;;;;;;;;;;;;;;21792:1275;;;;:::o;28335:479::-;28437:27;28466:23;28507:38;28548:15;:24;28564:7;28548:24;;;;;;;;;;;28507:65;;28719:18;28696:41;;28776:19;28770:26;28751:45;;28681:126;28335:479;;;:::o;27563:659::-;27712:11;27877:16;27870:5;27866:28;27857:37;;28037:16;28026:9;28022:32;28009:45;;28187:15;28176:9;28173:30;28165:5;28154:9;28151:20;28148:56;28138:66;;27563:659;;;;;:::o;34191:159::-;;;;;:::o;48247:311::-;48382:7;48402:16;11518:3;48428:19;:41;;48402:68;;11518:3;48496:31;48507:4;48513:2;48517:9;48496:10;:31::i;:::-;48488:40;;:62;;48481:69;;;48247:311;;;;;:::o;23615:450::-;23695:14;23863:16;23856:5;23852:28;23843:37;;24040:5;24026:11;24001:23;23997:41;23994:52;23987:5;23984:63;23974:73;;23615:450;;;;:::o;35015:158::-;;;;;:::o;56512:191::-;56586:16;56605:6;;;;;;;;;;;56586:25;;56631:8;56622:6;;:17;;;;;;;;;;;;;;;;;;56686:8;56655:40;;56676:8;56655:40;;;;;;;;;;;;56575:128;56512:191;:::o;35613:716::-;35776:4;35822:2;35797:45;;;35843:19;:17;:19::i;:::-;35864:4;35870:7;35879:5;35797:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35793:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36097:1;36080:6;:13;:18;36076:235;;;36126:40;;;;;;;;;;;;;;36076:235;36269:6;36263:13;36254:6;36250:2;36246:15;36239:38;35793:529;35966:54;;;35956:64;;;:6;:64;;;;35949:71;;;35613:716;;;;;;:::o;59529:91::-;59581:13;59608:7;59601:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59529:91;:::o;57015:723::-;57071:13;57301:1;57292:5;:10;57288:53;;;57319:10;;;;;;;;;;;;;;;;;;;;;57288:53;57351:12;57366:5;57351:20;;57382:14;57407:78;57422:1;57414:4;:9;57407:78;;57440:8;;;;;:::i;:::-;;;;57471:2;57463:10;;;;;:::i;:::-;;;57407:78;;;57495:19;57527:6;57517:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57495:39;;57545:154;57561:1;57552:5;:10;57545:154;;57589:1;57579:11;;;;;:::i;:::-;;;57656:2;57648:5;:10;;;;:::i;:::-;57635:2;:24;;;;:::i;:::-;57622:39;;57605:6;57612;57605:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;57685:2;57676:11;;;;;:::i;:::-;;;57545:154;;;57723:6;57709:21;;;;;57015:723;;;;:::o;53927:98::-;53980:7;54007:10;54000:17;;53927:98;:::o;41997:689::-;42128:19;42134:2;42138:8;42128:5;:19::i;:::-;42207:1;42189:2;:14;;;:19;42185:483;;42229:11;42243:13;;42229:27;;42275:13;42297:8;42291:3;:14;42275:30;;42324:233;42355:62;42394:1;42398:2;42402:7;;;;;;42411:5;42355:30;:62::i;:::-;42350:167;;42453:40;;;;;;;;;;;;;;42350:167;42552:3;42544:5;:11;42324:233;;42639:3;42622:13;;:20;42618:34;;42644:8;;;42618:34;42210:458;;42185:483;41997:689;;;:::o;47948:147::-;48085:6;47948:147;;;;;:::o;36791:2454::-;36864:20;36887:13;;36864:36;;36927:1;36915:8;:13;36911:44;;;36937:18;;;;;;;;;;;;;;36911:44;36968:61;36998:1;37002:2;37006:12;37020:8;36968:21;:61::i;:::-;37512:1;10476:2;37482:1;:26;;37481:32;37469:8;:45;37443:18;:22;37462:2;37443:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;37791:139;37828:2;37882:33;37905:1;37909:2;37913:1;37882:14;:33::i;:::-;37849:30;37870:8;37849:20;:30::i;:::-;:66;37791:18;:139::i;:::-;37757:17;:31;37775:12;37757:31;;;;;;;;;;;:173;;;;37947:16;37978:11;38007:8;37992:12;:23;37978:37;;38262:16;38258:2;38254:25;38242:37;;38634:12;38594:8;38553:1;38491:25;38432:1;38371;38344:335;38759:1;38745:12;38741:20;38699:346;38800:3;38791:7;38788:16;38699:346;;39018:7;39008:8;39005:1;38978:25;38975:1;38972;38967:59;38853:1;38844:7;38840:15;38829:26;;38699:346;;;38703:77;39090:1;39078:8;:13;39074:45;;;39100:19;;;;;;;;;;;;;;39074:45;39152:3;39136:13;:19;;;;37217:1950;;39177:60;39206:1;39210:2;39214:12;39228:8;39177:20;:60::i;:::-;36853:2392;36791:2454;;:::o;24167:324::-;24237:14;24470:1;24460:8;24457:15;24431:24;24427:46;24417:56;;24167:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8516:366::-;8658:3;8679:67;8743:2;8738:3;8679:67;:::i;:::-;8672:74;;8755:93;8844:3;8755:93;:::i;:::-;8873:2;8868:3;8864:12;8857:19;;8516:366;;;:::o;8888:::-;9030:3;9051:67;9115:2;9110:3;9051:67;:::i;:::-;9044:74;;9127:93;9216:3;9127:93;:::i;:::-;9245:2;9240:3;9236:12;9229:19;;8888:366;;;:::o;9260:::-;9402:3;9423:67;9487:2;9482:3;9423:67;:::i;:::-;9416:74;;9499:93;9588:3;9499:93;:::i;:::-;9617:2;9612:3;9608:12;9601:19;;9260:366;;;:::o;9632:::-;9774:3;9795:67;9859:2;9854:3;9795:67;:::i;:::-;9788:74;;9871:93;9960:3;9871:93;:::i;:::-;9989:2;9984:3;9980:12;9973:19;;9632:366;;;:::o;10004:400::-;10164:3;10185:84;10267:1;10262:3;10185:84;:::i;:::-;10178:91;;10278:93;10367:3;10278:93;:::i;:::-;10396:1;10391:3;10387:11;10380:18;;10004:400;;;:::o;10410:366::-;10552:3;10573:67;10637:2;10632:3;10573:67;:::i;:::-;10566:74;;10649:93;10738:3;10649:93;:::i;:::-;10767:2;10762:3;10758:12;10751:19;;10410:366;;;:::o;10782:398::-;10941:3;10962:83;11043:1;11038:3;10962:83;:::i;:::-;10955:90;;11054:93;11143:3;11054:93;:::i;:::-;11172:1;11167:3;11163:11;11156:18;;10782:398;;;:::o;11186:366::-;11328:3;11349:67;11413:2;11408:3;11349:67;:::i;:::-;11342:74;;11425:93;11514:3;11425:93;:::i;:::-;11543:2;11538:3;11534:12;11527:19;;11186:366;;;:::o;11558:118::-;11645:24;11663:5;11645:24;:::i;:::-;11640:3;11633:37;11558:118;;:::o;11682:701::-;11963:3;11985:95;12076:3;12067:6;11985:95;:::i;:::-;11978:102;;12097:95;12188:3;12179:6;12097:95;:::i;:::-;12090:102;;12209:148;12353:3;12209:148;:::i;:::-;12202:155;;12374:3;12367:10;;11682:701;;;;;:::o;12389:379::-;12573:3;12595:147;12738:3;12595:147;:::i;:::-;12588:154;;12759:3;12752:10;;12389:379;;;:::o;12774:222::-;12867:4;12905:2;12894:9;12890:18;12882:26;;12918:71;12986:1;12975:9;12971:17;12962:6;12918:71;:::i;:::-;12774:222;;;;:::o;13002:640::-;13197:4;13235:3;13224:9;13220:19;13212:27;;13249:71;13317:1;13306:9;13302:17;13293:6;13249:71;:::i;:::-;13330:72;13398:2;13387:9;13383:18;13374:6;13330:72;:::i;:::-;13412;13480:2;13469:9;13465:18;13456:6;13412:72;:::i;:::-;13531:9;13525:4;13521:20;13516:2;13505:9;13501:18;13494:48;13559:76;13630:4;13621:6;13559:76;:::i;:::-;13551:84;;13002:640;;;;;;;:::o;13648:210::-;13735:4;13773:2;13762:9;13758:18;13750:26;;13786:65;13848:1;13837:9;13833:17;13824:6;13786:65;:::i;:::-;13648:210;;;;:::o;13864:313::-;13977:4;14015:2;14004:9;14000:18;13992:26;;14064:9;14058:4;14054:20;14050:1;14039:9;14035:17;14028:47;14092:78;14165:4;14156:6;14092:78;:::i;:::-;14084:86;;13864:313;;;;:::o;14183:419::-;14349:4;14387:2;14376:9;14372:18;14364:26;;14436:9;14430:4;14426:20;14422:1;14411:9;14407:17;14400:47;14464:131;14590:4;14464:131;:::i;:::-;14456:139;;14183:419;;;:::o;14608:::-;14774:4;14812:2;14801:9;14797:18;14789:26;;14861:9;14855:4;14851:20;14847:1;14836:9;14832:17;14825:47;14889:131;15015:4;14889:131;:::i;:::-;14881:139;;14608:419;;;:::o;15033:::-;15199:4;15237:2;15226:9;15222:18;15214:26;;15286:9;15280:4;15276:20;15272:1;15261:9;15257:17;15250:47;15314:131;15440:4;15314:131;:::i;:::-;15306:139;;15033:419;;;:::o;15458:::-;15624:4;15662:2;15651:9;15647:18;15639:26;;15711:9;15705:4;15701:20;15697:1;15686:9;15682:17;15675:47;15739:131;15865:4;15739:131;:::i;:::-;15731:139;;15458:419;;;:::o;15883:::-;16049:4;16087:2;16076:9;16072:18;16064:26;;16136:9;16130:4;16126:20;16122:1;16111:9;16107:17;16100:47;16164:131;16290:4;16164:131;:::i;:::-;16156:139;;15883:419;;;:::o;16308:::-;16474:4;16512:2;16501:9;16497:18;16489:26;;16561:9;16555:4;16551:20;16547:1;16536:9;16532:17;16525:47;16589:131;16715:4;16589:131;:::i;:::-;16581:139;;16308:419;;;:::o;16733:222::-;16826:4;16864:2;16853:9;16849:18;16841:26;;16877:71;16945:1;16934:9;16930:17;16921:6;16877:71;:::i;:::-;16733:222;;;;:::o;16961:129::-;16995:6;17022:20;;:::i;:::-;17012:30;;17051:33;17079:4;17071:6;17051:33;:::i;:::-;16961:129;;;:::o;17096:75::-;17129:6;17162:2;17156:9;17146:19;;17096:75;:::o;17177:307::-;17238:4;17328:18;17320:6;17317:30;17314:56;;;17350:18;;:::i;:::-;17314:56;17388:29;17410:6;17388:29;:::i;:::-;17380:37;;17472:4;17466;17462:15;17454:23;;17177:307;;;:::o;17490:308::-;17552:4;17642:18;17634:6;17631:30;17628:56;;;17664:18;;:::i;:::-;17628:56;17702:29;17724:6;17702:29;:::i;:::-;17694:37;;17786:4;17780;17776:15;17768:23;;17490:308;;;:::o;17804:98::-;17855:6;17889:5;17883:12;17873:22;;17804:98;;;:::o;17908:99::-;17960:6;17994:5;17988:12;17978:22;;17908:99;;;:::o;18013:168::-;18096:11;18130:6;18125:3;18118:19;18170:4;18165:3;18161:14;18146:29;;18013:168;;;;:::o;18187:147::-;18288:11;18325:3;18310:18;;18187:147;;;;:::o;18340:169::-;18424:11;18458:6;18453:3;18446:19;18498:4;18493:3;18489:14;18474:29;;18340:169;;;;:::o;18515:148::-;18617:11;18654:3;18639:18;;18515:148;;;;:::o;18669:305::-;18709:3;18728:20;18746:1;18728:20;:::i;:::-;18723:25;;18762:20;18780:1;18762:20;:::i;:::-;18757:25;;18916:1;18848:66;18844:74;18841:1;18838:81;18835:107;;;18922:18;;:::i;:::-;18835:107;18966:1;18963;18959:9;18952:16;;18669:305;;;;:::o;18980:185::-;19020:1;19037:20;19055:1;19037:20;:::i;:::-;19032:25;;19071:20;19089:1;19071:20;:::i;:::-;19066:25;;19110:1;19100:35;;19115:18;;:::i;:::-;19100:35;19157:1;19154;19150:9;19145:14;;18980:185;;;;:::o;19171:348::-;19211:7;19234:20;19252:1;19234:20;:::i;:::-;19229:25;;19268:20;19286:1;19268:20;:::i;:::-;19263:25;;19456:1;19388:66;19384:74;19381:1;19378:81;19373:1;19366:9;19359:17;19355:105;19352:131;;;19463:18;;:::i;:::-;19352:131;19511:1;19508;19504:9;19493:20;;19171:348;;;;:::o;19525:191::-;19565:4;19585:20;19603:1;19585:20;:::i;:::-;19580:25;;19619:20;19637:1;19619:20;:::i;:::-;19614:25;;19658:1;19655;19652:8;19649:34;;;19663:18;;:::i;:::-;19649:34;19708:1;19705;19701:9;19693:17;;19525:191;;;;:::o;19722:96::-;19759:7;19788:24;19806:5;19788:24;:::i;:::-;19777:35;;19722:96;;;:::o;19824:90::-;19858:7;19901:5;19894:13;19887:21;19876:32;;19824:90;;;:::o;19920:149::-;19956:7;19996:66;19989:5;19985:78;19974:89;;19920:149;;;:::o;20075:126::-;20112:7;20152:42;20145:5;20141:54;20130:65;;20075:126;;;:::o;20207:77::-;20244:7;20273:5;20262:16;;20207:77;;;:::o;20290:154::-;20374:6;20369:3;20364;20351:30;20436:1;20427:6;20422:3;20418:16;20411:27;20290:154;;;:::o;20450:307::-;20518:1;20528:113;20542:6;20539:1;20536:13;20528:113;;;20627:1;20622:3;20618:11;20612:18;20608:1;20603:3;20599:11;20592:39;20564:2;20561:1;20557:10;20552:15;;20528:113;;;20659:6;20656:1;20653:13;20650:101;;;20739:1;20730:6;20725:3;20721:16;20714:27;20650:101;20499:258;20450:307;;;:::o;20763:320::-;20807:6;20844:1;20838:4;20834:12;20824:22;;20891:1;20885:4;20881:12;20912:18;20902:81;;20968:4;20960:6;20956:17;20946:27;;20902:81;21030:2;21022:6;21019:14;20999:18;20996:38;20993:84;;;21049:18;;:::i;:::-;20993:84;20814:269;20763:320;;;:::o;21089:281::-;21172:27;21194:4;21172:27;:::i;:::-;21164:6;21160:40;21302:6;21290:10;21287:22;21266:18;21254:10;21251:34;21248:62;21245:88;;;21313:18;;:::i;:::-;21245:88;21353:10;21349:2;21342:22;21132:238;21089:281;;:::o;21376:233::-;21415:3;21438:24;21456:5;21438:24;:::i;:::-;21429:33;;21484:66;21477:5;21474:77;21471:103;;;21554:18;;:::i;:::-;21471:103;21601:1;21594:5;21590:13;21583:20;;21376:233;;;:::o;21615:176::-;21647:1;21664:20;21682:1;21664:20;:::i;:::-;21659:25;;21698:20;21716:1;21698:20;:::i;:::-;21693:25;;21737:1;21727:35;;21742:18;;:::i;:::-;21727:35;21783:1;21780;21776:9;21771:14;;21615:176;;;;:::o;21797:180::-;21845:77;21842:1;21835:88;21942:4;21939:1;21932:15;21966:4;21963:1;21956:15;21983:180;22031:77;22028:1;22021:88;22128:4;22125:1;22118:15;22152:4;22149:1;22142:15;22169:180;22217:77;22214:1;22207:88;22314:4;22311:1;22304:15;22338:4;22335:1;22328:15;22355:180;22403:77;22400:1;22393:88;22500:4;22497:1;22490:15;22524:4;22521:1;22514:15;22541:180;22589:77;22586:1;22579:88;22686:4;22683:1;22676:15;22710:4;22707:1;22700:15;22727:117;22836:1;22833;22826:12;22850:117;22959:1;22956;22949:12;22973:117;23082:1;23079;23072:12;23096:117;23205:1;23202;23195:12;23219:102;23260:6;23311:2;23307:7;23302:2;23295:5;23291:14;23287:28;23277:38;;23219:102;;;:::o;23327:171::-;23467:23;23463:1;23455:6;23451:14;23444:47;23327:171;:::o;23504:225::-;23644:34;23640:1;23632:6;23628:14;23621:58;23713:8;23708:2;23700:6;23696:15;23689:33;23504:225;:::o;23735:168::-;23875:20;23871:1;23863:6;23859:14;23852:44;23735:168;:::o;23909:174::-;24049:26;24045:1;24037:6;24033:14;24026:50;23909:174;:::o;24089:155::-;24229:7;24225:1;24217:6;24213:14;24206:31;24089:155;:::o;24250:182::-;24390:34;24386:1;24378:6;24374:14;24367:58;24250:182;:::o;24438:114::-;;:::o;24558:168::-;24698:20;24694:1;24686:6;24682:14;24675:44;24558:168;:::o;24732:122::-;24805:24;24823:5;24805:24;:::i;:::-;24798:5;24795:35;24785:63;;24844:1;24841;24834:12;24785:63;24732:122;:::o;24860:116::-;24930:21;24945:5;24930:21;:::i;:::-;24923:5;24920:32;24910:60;;24966:1;24963;24956:12;24910:60;24860:116;:::o;24982:120::-;25054:23;25071:5;25054:23;:::i;:::-;25047:5;25044:34;25034:62;;25092:1;25089;25082:12;25034:62;24982:120;:::o;25108:122::-;25181:24;25199:5;25181:24;:::i;:::-;25174:5;25171:35;25161:63;;25220:1;25217;25210:12;25161:63;25108:122;:::o

Swarm Source

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