ETH Price: $2,456.10 (+2.54%)

Token

ImpersGENESIS (IMPG)
 

Overview

Max Total Supply

888 IMPG

Holders

131

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 IMPG
0xabd426D1E14bc003521FEd7646D4826A81a8d24f
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:
ImpersGENESIS

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
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();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            IERC165
    // ==============================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // 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 tokenId of the next token 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`
    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 => address) private _tokenApprovals;

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

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

    /**
     * @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 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 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 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 returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    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: 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.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view 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 auxillary 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 auxillary 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 {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * 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 ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

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

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

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

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

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

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _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, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

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

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

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

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

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // 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 `_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));

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                getApproved(tokenId) == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

            // 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++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _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))
                }
            }
        }
    }

    /**
     * @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 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 returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 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: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }
            
            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

// File: erc721a/contracts/extensions/IERC721AQueryable.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev Interface of an ERC721AQueryable compliant contract.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

// File: erc721a/contracts/extensions/ERC721AQueryable.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;



/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

// File: @openzeppelin/contracts/utils/Arrays.sol


// OpenZeppelin Contracts v4.4.1 (utils/Arrays.sol)

pragma solidity ^0.8.0;


/**
 * @dev Collection of functions related to array types.
 */
library Arrays {
    /**
     * @dev Searches a sorted `array` and returns the first index that contains
     * a value greater or equal to `element`. If no such index exists (i.e. all
     * values in the array are strictly less than `element`), the array length is
     * returned. Time complexity O(log n).
     *
     * `array` is expected to be sorted in ascending order, and to contain no
     * repeated elements.
     */
    function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {
        if (array.length == 0) {
            return 0;
        }

        uint256 low = 0;
        uint256 high = array.length;

        while (low < high) {
            uint256 mid = Math.average(low, high);

            // Note that mid will always be strictly less than high (i.e. it will be a valid array index)
            // because Math.average rounds down (it does integer division with truncation).
            if (array[mid] > element) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }

        // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.
        if (low > 0 && array[low - 1] == element) {
            return low - 1;
        } else {
            return low;
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // 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;
    }
}

// File: contracts/NFT.sol


//created by dgnmaster - find me on twitter @dgnmaster1 for help







pragma solidity >=0.8.13 <0.9.0;

contract ImpersGENESIS is ERC721A, Ownable, ReentrancyGuard { 

  using Strings for uint256;

// ================== Variables Start =======================
    
  string public uri; 
  string public hiddenMetadataUri; 
  string public uriSuffix = ".json"; 
  uint256 public cost1 = 0 ether; 
  uint256 public cost2 = 0.003 ether; 
  uint256 public supplyPhase1 = 222; 
  uint256 public supplyLimit = 888; 
  uint256 public maxMintAmountPerTx = 20;
  uint256 public maxLimitPerWallet = 50; 
  bool public sale = false; 
  bool public revealed = true; 

// ================== Variables End =======================  

// ================== Constructor Start =======================

  constructor(
    string memory _uri,
    string memory _hiddenMetadataUri
  ) ERC721A("ImpersGENESIS", "IMPG")  {
    seturi(_uri);
    setHiddenMetadataUri(_hiddenMetadataUri);
  }

// ================== Constructor End =======================

// ================== Mint Functions Start =======================

  function UpdateCost(uint256 _supply) internal view returns  (uint256 _cost) {

      if (_supply < supplyPhase1) {
          return cost1;
        }
      if (_supply < supplyLimit){
          return cost2;
        }
  }
  
  function Mint(uint256 _mintAmount) public payable {
    //Dynamic Price
    uint256 supply = totalSupply();
    //Normal requirements 
    require(sale, 'The Sale is paused!');
    require(_mintAmount > 0 && _mintAmount <= maxLimitPerWallet, 'Invalid mint amount!');
    require(totalSupply() + _mintAmount <= supplyLimit, 'Max supply exceeded!');
    require(balanceOf(msg.sender) + _mintAmount <= maxLimitPerWallet, 'Max mint per wallet exceeded!');
    require(msg.value >= UpdateCost(supply) * _mintAmount, 'Insufficient funds!');
     
    //Mint
     _safeMint(_msgSender(), _mintAmount);
  }  

  function Airdrop(uint256 _mintAmount, address _receiver) public onlyOwner {
    require(totalSupply() + _mintAmount <= supplyLimit, 'Max supply exceeded!');
    _safeMint(_receiver, _mintAmount);
  }

// ================== Mint Functions End =======================  

// ================== Set Functions Start =======================

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

  function seturi(string memory _uri) public onlyOwner {
    uri = _uri;
  }

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
  hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setSaleStatus(bool _sale) public onlyOwner {
    sale = _sale;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setmaxLimitPerWallet(uint256 _maxLimitPerWallet) public onlyOwner {
    maxLimitPerWallet = _maxLimitPerWallet;
  }

  function setcost1(uint256 _cost1) public onlyOwner {
    cost1 = _cost1;
  }  

  function setcost2(uint256 _cost2) public onlyOwner {
    cost2 = _cost2;
  }  

  function setsupplyLimit(uint256 _supplyLimit) public onlyOwner {
    supplyLimit = _supplyLimit;
  }

  function withdraw() public onlyOwner {
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
  }

 // function price(uint256 _mintAmount) public view returns (uint256){
  function price() public view returns (uint256){
         if (totalSupply() < supplyPhase1) {
          return cost1;
          }
         if (totalSupply() < supplyLimit){
          return cost2;
        }
  }

function tokensOfOwner(address owner) external view returns (uint256[] memory) {
    unchecked {
        uint256[] memory a = new uint256[](balanceOf(owner)); 
        uint256 end = _nextTokenId();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;
        for (uint256 i; i < end; i++) {
            TokenOwnership memory ownership = _ownershipAt(i);
            if (ownership.burned) {
                continue;
            }
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                a[tokenIdsIdx++] = i;
            }
        }
        return a;    
    }
}

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

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');

    if (revealed == false) {
      return hiddenMetadataUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : '';
  }

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

// ================== Read Functions End =======================  

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_uri","type":"string"},{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"Airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"Mint","outputs":[],"stateMutability":"payable","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":"cost1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLimitPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","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":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":[],"name":"sale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_sale","type":"bool"}],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost1","type":"uint256"}],"name":"setcost1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost2","type":"uint256"}],"name":"setcost2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxLimitPerWallet","type":"uint256"}],"name":"setmaxLimitPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supplyLimit","type":"uint256"}],"name":"setsupplyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"seturi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyPhase1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c9080519060200190620000519291906200043f565b506000600d55660aa87bee538000600e5560de600f55610378601055601460115560326012556000601360006101000a81548160ff0219169083151502179055506001601360016101000a81548160ff021916908315150217905550348015620000ba57600080fd5b5060405162004722380380620047228339818101604052810190620000e091906200068c565b6040518060400160405280600d81526020017f496d7065727347454e45534953000000000000000000000000000000000000008152506040518060400160405280600481526020017f494d5047000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001649291906200043f565b5080600390805190602001906200017d9291906200043f565b506200018e620001e860201b60201c565b6000819055505050620001b6620001aa620001f160201b60201c565b620001f960201b60201c565b6001600981905550620001cf82620002bf60201b60201c565b620001e0816200036a60201b60201c565b5050620007f8565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002cf620001f160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002f56200041560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200034e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003459062000772565b60405180910390fd5b80600a9080519060200190620003669291906200043f565b5050565b6200037a620001f160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003a06200041560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003f9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003f09062000772565b60405180910390fd5b80600b9080519060200190620004119291906200043f565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200044d90620007c3565b90600052602060002090601f016020900481019282620004715760008555620004bd565b82601f106200048c57805160ff1916838001178555620004bd565b82800160010185558215620004bd579182015b82811115620004bc5782518255916020019190600101906200049f565b5b509050620004cc9190620004d0565b5090565b5b80821115620004eb576000816000905550600101620004d1565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000558826200050d565b810181811067ffffffffffffffff821117156200057a57620005796200051e565b5b80604052505050565b60006200058f620004ef565b90506200059d82826200054d565b919050565b600067ffffffffffffffff821115620005c057620005bf6200051e565b5b620005cb826200050d565b9050602081019050919050565b60005b83811015620005f8578082015181840152602081019050620005db565b8381111562000608576000848401525b50505050565b6000620006256200061f84620005a2565b62000583565b90508281526020810184848401111562000644576200064362000508565b5b62000651848285620005d8565b509392505050565b600082601f83011262000671576200067062000503565b5b8151620006838482602086016200060e565b91505092915050565b60008060408385031215620006a657620006a5620004f9565b5b600083015167ffffffffffffffff811115620006c757620006c6620004fe565b5b620006d58582860162000659565b925050602083015167ffffffffffffffff811115620006f957620006f8620004fe565b5b620007078582860162000659565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200075a60208362000711565b9150620007678262000722565b602082019050919050565b600060208201905081810360008301526200078d816200074b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007dc57607f821691505b602082108103620007f257620007f162000794565b5b50919050565b613f1a80620008086000396000f3fe60806040526004361061025b5760003560e01c806370a0823111610144578063b071401b116100b6578063da5e1f4d1161007a578063da5e1f4d146108b2578063e0a80853146108db578063e985e9c514610904578063eac989f814610941578063f2fde38b1461096c578063f6484980146109955761025b565b8063b071401b146107d1578063b88d4fde146107fa578063c87b56dd14610823578063d897833e14610860578063d9f0a671146108895761025b565b806394354fd01161010857806394354fd0146106d157806395d89b41146106fc5780639a1b288514610727578063a035b1fe14610752578063a22cb4651461077d578063a45ba8e7146107a65761025b565b806370a08231146105ec578063715018a6146106295780637871e154146106405780638462151c146106695780638da5cb5b146106a65761025b565b806321a3c248116101dd5780634fdd43cb116101a15780634fdd43cb146104da57806351830227146105035780635503a0e81461052e5780635a0b8b23146105595780636352211e146105845780636ad1fe02146105c15761025b565b806321a3c2481461041d57806323b872dd1461044657806333573dc21461046f5780633ccfd60b1461049a57806342842e0e146104b15761025b565b8063095ea7b311610224578063095ea7b31461034a57806316ba10e01461037357806318160ddd1461039c57806319d1997a146103c757806320d55b51146103f25761025b565b806275770a1461026057806301ffc9a71461028957806306fdde03146102c657806307883703146102f1578063081812fc1461030d575b600080fd5b34801561026c57600080fd5b5061028760048036038101906102829190612ee3565b6109be565b005b34801561029557600080fd5b506102b060048036038101906102ab9190612f68565b610a44565b6040516102bd9190612fb0565b60405180910390f35b3480156102d257600080fd5b506102db610ad6565b6040516102e89190613064565b60405180910390f35b61030b60048036038101906103069190612ee3565b610b68565b005b34801561031957600080fd5b50610334600480360381019061032f9190612ee3565b610d2e565b60405161034191906130c7565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c919061310e565b610daa565b005b34801561037f57600080fd5b5061039a60048036038101906103959190613283565b610f50565b005b3480156103a857600080fd5b506103b1610fe6565b6040516103be91906132db565b60405180910390f35b3480156103d357600080fd5b506103dc610ffd565b6040516103e991906132db565b60405180910390f35b3480156103fe57600080fd5b50610407611003565b60405161041491906132db565b60405180910390f35b34801561042957600080fd5b50610444600480360381019061043f9190612ee3565b611009565b005b34801561045257600080fd5b5061046d600480360381019061046891906132f6565b61108f565b005b34801561047b57600080fd5b5061048461109f565b60405161049191906132db565b60405180910390f35b3480156104a657600080fd5b506104af6110a5565b005b3480156104bd57600080fd5b506104d860048036038101906104d391906132f6565b6111a1565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190613283565b6111c1565b005b34801561050f57600080fd5b50610518611257565b6040516105259190612fb0565b60405180910390f35b34801561053a57600080fd5b5061054361126a565b6040516105509190613064565b60405180910390f35b34801561056557600080fd5b5061056e6112f8565b60405161057b91906132db565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a69190612ee3565b6112fe565b6040516105b891906130c7565b60405180910390f35b3480156105cd57600080fd5b506105d6611310565b6040516105e39190612fb0565b60405180910390f35b3480156105f857600080fd5b50610613600480360381019061060e9190613349565b611323565b60405161062091906132db565b60405180910390f35b34801561063557600080fd5b5061063e6113db565b005b34801561064c57600080fd5b5061066760048036038101906106629190613376565b611463565b005b34801561067557600080fd5b50610690600480360381019061068b9190613349565b611544565b60405161069d9190613474565b60405180910390f35b3480156106b257600080fd5b506106bb611688565b6040516106c891906130c7565b60405180910390f35b3480156106dd57600080fd5b506106e66116b2565b6040516106f391906132db565b60405180910390f35b34801561070857600080fd5b506107116116b8565b60405161071e9190613064565b60405180910390f35b34801561073357600080fd5b5061073c61174a565b60405161074991906132db565b60405180910390f35b34801561075e57600080fd5b50610767611750565b60405161077491906132db565b60405180910390f35b34801561078957600080fd5b506107a4600480360381019061079f91906134c2565b61178c565b005b3480156107b257600080fd5b506107bb611903565b6040516107c89190613064565b60405180910390f35b3480156107dd57600080fd5b506107f860048036038101906107f39190612ee3565b611991565b005b34801561080657600080fd5b50610821600480360381019061081c91906135a3565b611a17565b005b34801561082f57600080fd5b5061084a60048036038101906108459190612ee3565b611a8a565b6040516108579190613064565b60405180910390f35b34801561086c57600080fd5b5061088760048036038101906108829190613626565b611be2565b005b34801561089557600080fd5b506108b060048036038101906108ab9190612ee3565b611c7b565b005b3480156108be57600080fd5b506108d960048036038101906108d49190612ee3565b611d01565b005b3480156108e757600080fd5b5061090260048036038101906108fd9190613626565b611d87565b005b34801561091057600080fd5b5061092b60048036038101906109269190613653565b611e20565b6040516109389190612fb0565b60405180910390f35b34801561094d57600080fd5b50610956611eb4565b6040516109639190613064565b60405180910390f35b34801561097857600080fd5b50610993600480360381019061098e9190613349565b611f42565b005b3480156109a157600080fd5b506109bc60048036038101906109b79190613283565b612039565b005b6109c66120cf565b73ffffffffffffffffffffffffffffffffffffffff166109e4611688565b73ffffffffffffffffffffffffffffffffffffffff1614610a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a31906136df565b60405180910390fd5b8060108190555050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a9f57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610acf5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610ae59061372e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b119061372e565b8015610b5e5780601f10610b3357610100808354040283529160200191610b5e565b820191906000526020600020905b815481529060010190602001808311610b4157829003601f168201915b5050505050905090565b6000610b72610fe6565b9050601360009054906101000a900460ff16610bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bba906137ab565b60405180910390fd5b600082118015610bd557506012548211155b610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b90613817565b60405180910390fd5b60105482610c20610fe6565b610c2a9190613866565b1115610c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6290613908565b60405180910390fd5b60125482610c7833611323565b610c829190613866565b1115610cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cba90613974565b60405180910390fd5b81610ccd826120d7565b610cd79190613994565b341015610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1090613a3a565b60405180910390fd5b610d2a610d246120cf565b83612107565b5050565b6000610d3982612125565b610d6f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610db582612184565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e1c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e3b612250565b73ffffffffffffffffffffffffffffffffffffffff1614610e9e57610e6781610e62612250565b611e20565b610e9d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610f586120cf565b73ffffffffffffffffffffffffffffffffffffffff16610f76611688565b73ffffffffffffffffffffffffffffffffffffffff1614610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc3906136df565b60405180910390fd5b80600c9080519060200190610fe2929190612db3565b5050565b6000610ff0612258565b6001546000540303905090565b60105481565b600f5481565b6110116120cf565b73ffffffffffffffffffffffffffffffffffffffff1661102f611688565b73ffffffffffffffffffffffffffffffffffffffff1614611085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107c906136df565b60405180910390fd5b80600e8190555050565b61109a838383612261565b505050565b600d5481565b6110ad6120cf565b73ffffffffffffffffffffffffffffffffffffffff166110cb611688565b73ffffffffffffffffffffffffffffffffffffffff1614611121576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611118906136df565b60405180910390fd5b600061112b611688565b73ffffffffffffffffffffffffffffffffffffffff164760405161114e90613a8b565b60006040518083038185875af1925050503d806000811461118b576040519150601f19603f3d011682016040523d82523d6000602084013e611190565b606091505b505090508061119e57600080fd5b50565b6111bc83838360405180602001604052806000815250611a17565b505050565b6111c96120cf565b73ffffffffffffffffffffffffffffffffffffffff166111e7611688565b73ffffffffffffffffffffffffffffffffffffffff161461123d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611234906136df565b60405180910390fd5b80600b9080519060200190611253929190612db3565b5050565b601360019054906101000a900460ff1681565b600c80546112779061372e565b80601f01602080910402602001604051908101604052809291908181526020018280546112a39061372e565b80156112f05780601f106112c5576101008083540402835291602001916112f0565b820191906000526020600020905b8154815290600101906020018083116112d357829003601f168201915b505050505081565b60125481565b600061130982612184565b9050919050565b601360009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361138a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6113e36120cf565b73ffffffffffffffffffffffffffffffffffffffff16611401611688565b73ffffffffffffffffffffffffffffffffffffffff1614611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144e906136df565b60405180910390fd5b6114616000612608565b565b61146b6120cf565b73ffffffffffffffffffffffffffffffffffffffff16611489611688565b73ffffffffffffffffffffffffffffffffffffffff16146114df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d6906136df565b60405180910390fd5b601054826114eb610fe6565b6114f59190613866565b1115611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152d90613908565b60405180910390fd5b6115408183612107565b5050565b6060600061155183611323565b67ffffffffffffffff81111561156a57611569613158565b5b6040519080825280602002602001820160405280156115985781602001602082028036833780820191505090505b50905060006115a56126ce565b905060008060005b8381101561167b5760006115c0826126d7565b90508060400151156115d2575061166e565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461161257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361166c578186858060010196508151811061165f5761165e613aa0565b5b6020026020010181815250505b505b80806001019150506115ad565b5083945050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60115481565b6060600380546116c79061372e565b80601f01602080910402602001604051908101604052809291908181526020018280546116f39061372e565b80156117405780601f1061171557610100808354040283529160200191611740565b820191906000526020600020905b81548152906001019060200180831161172357829003601f168201915b5050505050905090565b600e5481565b6000600f5461175d610fe6565b101561176d57600d549050611789565b601054611778610fe6565b101561178857600e549050611789565b5b90565b611794612250565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117f8576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611805612250565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118b2612250565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118f79190612fb0565b60405180910390a35050565b600b80546119109061372e565b80601f016020809104026020016040519081016040528092919081815260200182805461193c9061372e565b80156119895780601f1061195e57610100808354040283529160200191611989565b820191906000526020600020905b81548152906001019060200180831161196c57829003601f168201915b505050505081565b6119996120cf565b73ffffffffffffffffffffffffffffffffffffffff166119b7611688565b73ffffffffffffffffffffffffffffffffffffffff1614611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a04906136df565b60405180910390fd5b8060118190555050565b611a22848484612261565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a8457611a4d84848484612702565b611a83576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611a9582612125565b611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb90613b41565b60405180910390fd5b60001515601360019054906101000a900460ff16151503611b8157600b8054611afc9061372e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b289061372e565b8015611b755780601f10611b4a57610100808354040283529160200191611b75565b820191906000526020600020905b815481529060010190602001808311611b5857829003601f168201915b50505050509050611bdd565b6000611b8b612852565b90506000815111611bab5760405180602001604052806000815250611bd9565b80611bb5846128e4565b600c604051602001611bc993929190613c31565b6040516020818303038152906040525b9150505b919050565b611bea6120cf565b73ffffffffffffffffffffffffffffffffffffffff16611c08611688565b73ffffffffffffffffffffffffffffffffffffffff1614611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c55906136df565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b611c836120cf565b73ffffffffffffffffffffffffffffffffffffffff16611ca1611688565b73ffffffffffffffffffffffffffffffffffffffff1614611cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cee906136df565b60405180910390fd5b8060128190555050565b611d096120cf565b73ffffffffffffffffffffffffffffffffffffffff16611d27611688565b73ffffffffffffffffffffffffffffffffffffffff1614611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d74906136df565b60405180910390fd5b80600d8190555050565b611d8f6120cf565b73ffffffffffffffffffffffffffffffffffffffff16611dad611688565b73ffffffffffffffffffffffffffffffffffffffff1614611e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfa906136df565b60405180910390fd5b80601360016101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a8054611ec19061372e565b80601f0160208091040260200160405190810160405280929190818152602001828054611eed9061372e565b8015611f3a5780601f10611f0f57610100808354040283529160200191611f3a565b820191906000526020600020905b815481529060010190602001808311611f1d57829003601f168201915b505050505081565b611f4a6120cf565b73ffffffffffffffffffffffffffffffffffffffff16611f68611688565b73ffffffffffffffffffffffffffffffffffffffff1614611fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb5906136df565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361202d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202490613cd4565b60405180910390fd5b61203681612608565b50565b6120416120cf565b73ffffffffffffffffffffffffffffffffffffffff1661205f611688565b73ffffffffffffffffffffffffffffffffffffffff16146120b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ac906136df565b60405180910390fd5b80600a90805190602001906120cb929190612db3565b5050565b600033905090565b6000600f548210156120ed57600d549050612102565b60105482101561210157600e549050612102565b5b919050565b612121828260405180602001604052806000815250612a44565b5050565b600081612130612258565b1115801561213f575060005482105b801561217d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080612193612258565b11612219576000548110156122185760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612216575b6000810361220c5760046000836001900393508381526020019081526020016000205490506121e2565b809250505061224b565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b600061226c82612184565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146122d3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166122f4612250565b73ffffffffffffffffffffffffffffffffffffffff16148061232357506123228561231d612250565b611e20565b5b806123685750612331612250565b73ffffffffffffffffffffffffffffffffffffffff1661235084610d2e565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806123a1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612407576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124148585856001612cf7565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61251186612cfd565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316036125995760006001840190506000600460008381526020019081526020016000205403612597576000548114612596578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126018585856001612d07565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008054905090565b6126df612e39565b6126fb6004600084815260200190815260200160002054612d0d565b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612728612250565b8786866040518563ffffffff1660e01b815260040161274a9493929190613d49565b6020604051808303816000875af192505050801561278657506040513d601f19601f820116820180604052508101906127839190613daa565b60015b6127ff573d80600081146127b6576040519150601f19603f3d011682016040523d82523d6000602084013e6127bb565b606091505b5060008151036127f7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a80546128619061372e565b80601f016020809104026020016040519081016040528092919081815260200182805461288d9061372e565b80156128da5780601f106128af576101008083540402835291602001916128da565b820191906000526020600020905b8154815290600101906020018083116128bd57829003601f168201915b5050505050905090565b60606000820361292b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a3f565b600082905060005b6000821461295d57808061294690613dd7565b915050600a826129569190613e4e565b9150612933565b60008167ffffffffffffffff81111561297957612978613158565b5b6040519080825280601f01601f1916602001820160405280156129ab5781602001600182028036833780820191505090505b5090505b60008514612a38576001826129c49190613e7f565b9150600a856129d39190613eb3565b60306129df9190613866565b60f81b8183815181106129f5576129f4613aa0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a319190613e4e565b94506129af565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612ab0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612aea576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612af76000858386612cf7565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612b5c60018514612da9565b901b60a042901b612b6c86612cfd565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612c70575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c206000878480600101955087612702565b612c56576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612bb1578260005414612c6b57600080fd5b612cdb565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612c71575b816000819055505050612cf16000858386612d07565b50505050565b50505050565b6000819050919050565b50505050565b612d15612e39565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b6000819050919050565b828054612dbf9061372e565b90600052602060002090601f016020900481019282612de15760008555612e28565b82601f10612dfa57805160ff1916838001178555612e28565b82800160010185558215612e28579182015b82811115612e27578251825591602001919060010190612e0c565b5b509050612e359190612e7c565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612e95576000816000905550600101612e7d565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b612ec081612ead565b8114612ecb57600080fd5b50565b600081359050612edd81612eb7565b92915050565b600060208284031215612ef957612ef8612ea3565b5b6000612f0784828501612ece565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f4581612f10565b8114612f5057600080fd5b50565b600081359050612f6281612f3c565b92915050565b600060208284031215612f7e57612f7d612ea3565b5b6000612f8c84828501612f53565b91505092915050565b60008115159050919050565b612faa81612f95565b82525050565b6000602082019050612fc56000830184612fa1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613005578082015181840152602081019050612fea565b83811115613014576000848401525b50505050565b6000601f19601f8301169050919050565b600061303682612fcb565b6130408185612fd6565b9350613050818560208601612fe7565b6130598161301a565b840191505092915050565b6000602082019050818103600083015261307e818461302b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130b182613086565b9050919050565b6130c1816130a6565b82525050565b60006020820190506130dc60008301846130b8565b92915050565b6130eb816130a6565b81146130f657600080fd5b50565b600081359050613108816130e2565b92915050565b6000806040838503121561312557613124612ea3565b5b6000613133858286016130f9565b925050602061314485828601612ece565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6131908261301a565b810181811067ffffffffffffffff821117156131af576131ae613158565b5b80604052505050565b60006131c2612e99565b90506131ce8282613187565b919050565b600067ffffffffffffffff8211156131ee576131ed613158565b5b6131f78261301a565b9050602081019050919050565b82818337600083830152505050565b6000613226613221846131d3565b6131b8565b90508281526020810184848401111561324257613241613153565b5b61324d848285613204565b509392505050565b600082601f83011261326a5761326961314e565b5b813561327a848260208601613213565b91505092915050565b60006020828403121561329957613298612ea3565b5b600082013567ffffffffffffffff8111156132b7576132b6612ea8565b5b6132c384828501613255565b91505092915050565b6132d581612ead565b82525050565b60006020820190506132f060008301846132cc565b92915050565b60008060006060848603121561330f5761330e612ea3565b5b600061331d868287016130f9565b935050602061332e868287016130f9565b925050604061333f86828701612ece565b9150509250925092565b60006020828403121561335f5761335e612ea3565b5b600061336d848285016130f9565b91505092915050565b6000806040838503121561338d5761338c612ea3565b5b600061339b85828601612ece565b92505060206133ac858286016130f9565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6133eb81612ead565b82525050565b60006133fd83836133e2565b60208301905092915050565b6000602082019050919050565b6000613421826133b6565b61342b81856133c1565b9350613436836133d2565b8060005b8381101561346757815161344e88826133f1565b975061345983613409565b92505060018101905061343a565b5085935050505092915050565b6000602082019050818103600083015261348e8184613416565b905092915050565b61349f81612f95565b81146134aa57600080fd5b50565b6000813590506134bc81613496565b92915050565b600080604083850312156134d9576134d8612ea3565b5b60006134e7858286016130f9565b92505060206134f8858286016134ad565b9150509250929050565b600067ffffffffffffffff82111561351d5761351c613158565b5b6135268261301a565b9050602081019050919050565b600061354661354184613502565b6131b8565b90508281526020810184848401111561356257613561613153565b5b61356d848285613204565b509392505050565b600082601f83011261358a5761358961314e565b5b813561359a848260208601613533565b91505092915050565b600080600080608085870312156135bd576135bc612ea3565b5b60006135cb878288016130f9565b94505060206135dc878288016130f9565b93505060406135ed87828801612ece565b925050606085013567ffffffffffffffff81111561360e5761360d612ea8565b5b61361a87828801613575565b91505092959194509250565b60006020828403121561363c5761363b612ea3565b5b600061364a848285016134ad565b91505092915050565b6000806040838503121561366a57613669612ea3565b5b6000613678858286016130f9565b9250506020613689858286016130f9565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136c9602083612fd6565b91506136d482613693565b602082019050919050565b600060208201905081810360008301526136f8816136bc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061374657607f821691505b602082108103613759576137586136ff565b5b50919050565b7f5468652053616c65206973207061757365642100000000000000000000000000600082015250565b6000613795601383612fd6565b91506137a08261375f565b602082019050919050565b600060208201905081810360008301526137c481613788565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000613801601483612fd6565b915061380c826137cb565b602082019050919050565b60006020820190508181036000830152613830816137f4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061387182612ead565b915061387c83612ead565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138b1576138b0613837565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006138f2601483612fd6565b91506138fd826138bc565b602082019050919050565b60006020820190508181036000830152613921816138e5565b9050919050565b7f4d6178206d696e74207065722077616c6c657420657863656564656421000000600082015250565b600061395e601d83612fd6565b915061396982613928565b602082019050919050565b6000602082019050818103600083015261398d81613951565b9050919050565b600061399f82612ead565b91506139aa83612ead565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139e3576139e2613837565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000613a24601383612fd6565b9150613a2f826139ee565b602082019050919050565b60006020820190508181036000830152613a5381613a17565b9050919050565b600081905092915050565b50565b6000613a75600083613a5a565b9150613a8082613a65565b600082019050919050565b6000613a9682613a68565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613b2b602f83612fd6565b9150613b3682613acf565b604082019050919050565b60006020820190508181036000830152613b5a81613b1e565b9050919050565b600081905092915050565b6000613b7782612fcb565b613b818185613b61565b9350613b91818560208601612fe7565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613bbf8161372e565b613bc98186613b61565b94506001821660008114613be45760018114613bf557613c28565b60ff19831686528186019350613c28565b613bfe85613b9d565b60005b83811015613c2057815481890152600182019150602081019050613c01565b838801955050505b50505092915050565b6000613c3d8286613b6c565b9150613c498285613b6c565b9150613c558284613bb2565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613cbe602683612fd6565b9150613cc982613c62565b604082019050919050565b60006020820190508181036000830152613ced81613cb1565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613d1b82613cf4565b613d258185613cff565b9350613d35818560208601612fe7565b613d3e8161301a565b840191505092915050565b6000608082019050613d5e60008301876130b8565b613d6b60208301866130b8565b613d7860408301856132cc565b8181036060830152613d8a8184613d10565b905095945050505050565b600081519050613da481612f3c565b92915050565b600060208284031215613dc057613dbf612ea3565b5b6000613dce84828501613d95565b91505092915050565b6000613de282612ead565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e1457613e13613837565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e5982612ead565b9150613e6483612ead565b925082613e7457613e73613e1f565b5b828204905092915050565b6000613e8a82612ead565b9150613e9583612ead565b925082821015613ea857613ea7613837565b5b828203905092915050565b6000613ebe82612ead565b9150613ec983612ead565b925082613ed957613ed8613e1f565b5b82820690509291505056fea2646970667358221220924ebe219b7e58fa1d655cbea32546bed23883f844c785fa557f9d56b229ad3564736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5a73686f655773686d5153577839444e5956645469416f4d3335636f726e356e4a354851374a3158534c37452f000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061025b5760003560e01c806370a0823111610144578063b071401b116100b6578063da5e1f4d1161007a578063da5e1f4d146108b2578063e0a80853146108db578063e985e9c514610904578063eac989f814610941578063f2fde38b1461096c578063f6484980146109955761025b565b8063b071401b146107d1578063b88d4fde146107fa578063c87b56dd14610823578063d897833e14610860578063d9f0a671146108895761025b565b806394354fd01161010857806394354fd0146106d157806395d89b41146106fc5780639a1b288514610727578063a035b1fe14610752578063a22cb4651461077d578063a45ba8e7146107a65761025b565b806370a08231146105ec578063715018a6146106295780637871e154146106405780638462151c146106695780638da5cb5b146106a65761025b565b806321a3c248116101dd5780634fdd43cb116101a15780634fdd43cb146104da57806351830227146105035780635503a0e81461052e5780635a0b8b23146105595780636352211e146105845780636ad1fe02146105c15761025b565b806321a3c2481461041d57806323b872dd1461044657806333573dc21461046f5780633ccfd60b1461049a57806342842e0e146104b15761025b565b8063095ea7b311610224578063095ea7b31461034a57806316ba10e01461037357806318160ddd1461039c57806319d1997a146103c757806320d55b51146103f25761025b565b806275770a1461026057806301ffc9a71461028957806306fdde03146102c657806307883703146102f1578063081812fc1461030d575b600080fd5b34801561026c57600080fd5b5061028760048036038101906102829190612ee3565b6109be565b005b34801561029557600080fd5b506102b060048036038101906102ab9190612f68565b610a44565b6040516102bd9190612fb0565b60405180910390f35b3480156102d257600080fd5b506102db610ad6565b6040516102e89190613064565b60405180910390f35b61030b60048036038101906103069190612ee3565b610b68565b005b34801561031957600080fd5b50610334600480360381019061032f9190612ee3565b610d2e565b60405161034191906130c7565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c919061310e565b610daa565b005b34801561037f57600080fd5b5061039a60048036038101906103959190613283565b610f50565b005b3480156103a857600080fd5b506103b1610fe6565b6040516103be91906132db565b60405180910390f35b3480156103d357600080fd5b506103dc610ffd565b6040516103e991906132db565b60405180910390f35b3480156103fe57600080fd5b50610407611003565b60405161041491906132db565b60405180910390f35b34801561042957600080fd5b50610444600480360381019061043f9190612ee3565b611009565b005b34801561045257600080fd5b5061046d600480360381019061046891906132f6565b61108f565b005b34801561047b57600080fd5b5061048461109f565b60405161049191906132db565b60405180910390f35b3480156104a657600080fd5b506104af6110a5565b005b3480156104bd57600080fd5b506104d860048036038101906104d391906132f6565b6111a1565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190613283565b6111c1565b005b34801561050f57600080fd5b50610518611257565b6040516105259190612fb0565b60405180910390f35b34801561053a57600080fd5b5061054361126a565b6040516105509190613064565b60405180910390f35b34801561056557600080fd5b5061056e6112f8565b60405161057b91906132db565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a69190612ee3565b6112fe565b6040516105b891906130c7565b60405180910390f35b3480156105cd57600080fd5b506105d6611310565b6040516105e39190612fb0565b60405180910390f35b3480156105f857600080fd5b50610613600480360381019061060e9190613349565b611323565b60405161062091906132db565b60405180910390f35b34801561063557600080fd5b5061063e6113db565b005b34801561064c57600080fd5b5061066760048036038101906106629190613376565b611463565b005b34801561067557600080fd5b50610690600480360381019061068b9190613349565b611544565b60405161069d9190613474565b60405180910390f35b3480156106b257600080fd5b506106bb611688565b6040516106c891906130c7565b60405180910390f35b3480156106dd57600080fd5b506106e66116b2565b6040516106f391906132db565b60405180910390f35b34801561070857600080fd5b506107116116b8565b60405161071e9190613064565b60405180910390f35b34801561073357600080fd5b5061073c61174a565b60405161074991906132db565b60405180910390f35b34801561075e57600080fd5b50610767611750565b60405161077491906132db565b60405180910390f35b34801561078957600080fd5b506107a4600480360381019061079f91906134c2565b61178c565b005b3480156107b257600080fd5b506107bb611903565b6040516107c89190613064565b60405180910390f35b3480156107dd57600080fd5b506107f860048036038101906107f39190612ee3565b611991565b005b34801561080657600080fd5b50610821600480360381019061081c91906135a3565b611a17565b005b34801561082f57600080fd5b5061084a60048036038101906108459190612ee3565b611a8a565b6040516108579190613064565b60405180910390f35b34801561086c57600080fd5b5061088760048036038101906108829190613626565b611be2565b005b34801561089557600080fd5b506108b060048036038101906108ab9190612ee3565b611c7b565b005b3480156108be57600080fd5b506108d960048036038101906108d49190612ee3565b611d01565b005b3480156108e757600080fd5b5061090260048036038101906108fd9190613626565b611d87565b005b34801561091057600080fd5b5061092b60048036038101906109269190613653565b611e20565b6040516109389190612fb0565b60405180910390f35b34801561094d57600080fd5b50610956611eb4565b6040516109639190613064565b60405180910390f35b34801561097857600080fd5b50610993600480360381019061098e9190613349565b611f42565b005b3480156109a157600080fd5b506109bc60048036038101906109b79190613283565b612039565b005b6109c66120cf565b73ffffffffffffffffffffffffffffffffffffffff166109e4611688565b73ffffffffffffffffffffffffffffffffffffffff1614610a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a31906136df565b60405180910390fd5b8060108190555050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a9f57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610acf5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610ae59061372e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b119061372e565b8015610b5e5780601f10610b3357610100808354040283529160200191610b5e565b820191906000526020600020905b815481529060010190602001808311610b4157829003601f168201915b5050505050905090565b6000610b72610fe6565b9050601360009054906101000a900460ff16610bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bba906137ab565b60405180910390fd5b600082118015610bd557506012548211155b610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b90613817565b60405180910390fd5b60105482610c20610fe6565b610c2a9190613866565b1115610c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6290613908565b60405180910390fd5b60125482610c7833611323565b610c829190613866565b1115610cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cba90613974565b60405180910390fd5b81610ccd826120d7565b610cd79190613994565b341015610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1090613a3a565b60405180910390fd5b610d2a610d246120cf565b83612107565b5050565b6000610d3982612125565b610d6f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610db582612184565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e1c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e3b612250565b73ffffffffffffffffffffffffffffffffffffffff1614610e9e57610e6781610e62612250565b611e20565b610e9d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610f586120cf565b73ffffffffffffffffffffffffffffffffffffffff16610f76611688565b73ffffffffffffffffffffffffffffffffffffffff1614610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc3906136df565b60405180910390fd5b80600c9080519060200190610fe2929190612db3565b5050565b6000610ff0612258565b6001546000540303905090565b60105481565b600f5481565b6110116120cf565b73ffffffffffffffffffffffffffffffffffffffff1661102f611688565b73ffffffffffffffffffffffffffffffffffffffff1614611085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107c906136df565b60405180910390fd5b80600e8190555050565b61109a838383612261565b505050565b600d5481565b6110ad6120cf565b73ffffffffffffffffffffffffffffffffffffffff166110cb611688565b73ffffffffffffffffffffffffffffffffffffffff1614611121576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611118906136df565b60405180910390fd5b600061112b611688565b73ffffffffffffffffffffffffffffffffffffffff164760405161114e90613a8b565b60006040518083038185875af1925050503d806000811461118b576040519150601f19603f3d011682016040523d82523d6000602084013e611190565b606091505b505090508061119e57600080fd5b50565b6111bc83838360405180602001604052806000815250611a17565b505050565b6111c96120cf565b73ffffffffffffffffffffffffffffffffffffffff166111e7611688565b73ffffffffffffffffffffffffffffffffffffffff161461123d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611234906136df565b60405180910390fd5b80600b9080519060200190611253929190612db3565b5050565b601360019054906101000a900460ff1681565b600c80546112779061372e565b80601f01602080910402602001604051908101604052809291908181526020018280546112a39061372e565b80156112f05780601f106112c5576101008083540402835291602001916112f0565b820191906000526020600020905b8154815290600101906020018083116112d357829003601f168201915b505050505081565b60125481565b600061130982612184565b9050919050565b601360009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361138a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6113e36120cf565b73ffffffffffffffffffffffffffffffffffffffff16611401611688565b73ffffffffffffffffffffffffffffffffffffffff1614611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144e906136df565b60405180910390fd5b6114616000612608565b565b61146b6120cf565b73ffffffffffffffffffffffffffffffffffffffff16611489611688565b73ffffffffffffffffffffffffffffffffffffffff16146114df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d6906136df565b60405180910390fd5b601054826114eb610fe6565b6114f59190613866565b1115611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152d90613908565b60405180910390fd5b6115408183612107565b5050565b6060600061155183611323565b67ffffffffffffffff81111561156a57611569613158565b5b6040519080825280602002602001820160405280156115985781602001602082028036833780820191505090505b50905060006115a56126ce565b905060008060005b8381101561167b5760006115c0826126d7565b90508060400151156115d2575061166e565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461161257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361166c578186858060010196508151811061165f5761165e613aa0565b5b6020026020010181815250505b505b80806001019150506115ad565b5083945050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60115481565b6060600380546116c79061372e565b80601f01602080910402602001604051908101604052809291908181526020018280546116f39061372e565b80156117405780601f1061171557610100808354040283529160200191611740565b820191906000526020600020905b81548152906001019060200180831161172357829003601f168201915b5050505050905090565b600e5481565b6000600f5461175d610fe6565b101561176d57600d549050611789565b601054611778610fe6565b101561178857600e549050611789565b5b90565b611794612250565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117f8576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611805612250565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118b2612250565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118f79190612fb0565b60405180910390a35050565b600b80546119109061372e565b80601f016020809104026020016040519081016040528092919081815260200182805461193c9061372e565b80156119895780601f1061195e57610100808354040283529160200191611989565b820191906000526020600020905b81548152906001019060200180831161196c57829003601f168201915b505050505081565b6119996120cf565b73ffffffffffffffffffffffffffffffffffffffff166119b7611688565b73ffffffffffffffffffffffffffffffffffffffff1614611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a04906136df565b60405180910390fd5b8060118190555050565b611a22848484612261565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a8457611a4d84848484612702565b611a83576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611a9582612125565b611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb90613b41565b60405180910390fd5b60001515601360019054906101000a900460ff16151503611b8157600b8054611afc9061372e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b289061372e565b8015611b755780601f10611b4a57610100808354040283529160200191611b75565b820191906000526020600020905b815481529060010190602001808311611b5857829003601f168201915b50505050509050611bdd565b6000611b8b612852565b90506000815111611bab5760405180602001604052806000815250611bd9565b80611bb5846128e4565b600c604051602001611bc993929190613c31565b6040516020818303038152906040525b9150505b919050565b611bea6120cf565b73ffffffffffffffffffffffffffffffffffffffff16611c08611688565b73ffffffffffffffffffffffffffffffffffffffff1614611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c55906136df565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b611c836120cf565b73ffffffffffffffffffffffffffffffffffffffff16611ca1611688565b73ffffffffffffffffffffffffffffffffffffffff1614611cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cee906136df565b60405180910390fd5b8060128190555050565b611d096120cf565b73ffffffffffffffffffffffffffffffffffffffff16611d27611688565b73ffffffffffffffffffffffffffffffffffffffff1614611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d74906136df565b60405180910390fd5b80600d8190555050565b611d8f6120cf565b73ffffffffffffffffffffffffffffffffffffffff16611dad611688565b73ffffffffffffffffffffffffffffffffffffffff1614611e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfa906136df565b60405180910390fd5b80601360016101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a8054611ec19061372e565b80601f0160208091040260200160405190810160405280929190818152602001828054611eed9061372e565b8015611f3a5780601f10611f0f57610100808354040283529160200191611f3a565b820191906000526020600020905b815481529060010190602001808311611f1d57829003601f168201915b505050505081565b611f4a6120cf565b73ffffffffffffffffffffffffffffffffffffffff16611f68611688565b73ffffffffffffffffffffffffffffffffffffffff1614611fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb5906136df565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361202d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202490613cd4565b60405180910390fd5b61203681612608565b50565b6120416120cf565b73ffffffffffffffffffffffffffffffffffffffff1661205f611688565b73ffffffffffffffffffffffffffffffffffffffff16146120b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ac906136df565b60405180910390fd5b80600a90805190602001906120cb929190612db3565b5050565b600033905090565b6000600f548210156120ed57600d549050612102565b60105482101561210157600e549050612102565b5b919050565b612121828260405180602001604052806000815250612a44565b5050565b600081612130612258565b1115801561213f575060005482105b801561217d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080612193612258565b11612219576000548110156122185760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612216575b6000810361220c5760046000836001900393508381526020019081526020016000205490506121e2565b809250505061224b565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b600061226c82612184565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146122d3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166122f4612250565b73ffffffffffffffffffffffffffffffffffffffff16148061232357506123228561231d612250565b611e20565b5b806123685750612331612250565b73ffffffffffffffffffffffffffffffffffffffff1661235084610d2e565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806123a1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612407576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124148585856001612cf7565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61251186612cfd565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316036125995760006001840190506000600460008381526020019081526020016000205403612597576000548114612596578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126018585856001612d07565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008054905090565b6126df612e39565b6126fb6004600084815260200190815260200160002054612d0d565b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612728612250565b8786866040518563ffffffff1660e01b815260040161274a9493929190613d49565b6020604051808303816000875af192505050801561278657506040513d601f19601f820116820180604052508101906127839190613daa565b60015b6127ff573d80600081146127b6576040519150601f19603f3d011682016040523d82523d6000602084013e6127bb565b606091505b5060008151036127f7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a80546128619061372e565b80601f016020809104026020016040519081016040528092919081815260200182805461288d9061372e565b80156128da5780601f106128af576101008083540402835291602001916128da565b820191906000526020600020905b8154815290600101906020018083116128bd57829003601f168201915b5050505050905090565b60606000820361292b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a3f565b600082905060005b6000821461295d57808061294690613dd7565b915050600a826129569190613e4e565b9150612933565b60008167ffffffffffffffff81111561297957612978613158565b5b6040519080825280601f01601f1916602001820160405280156129ab5781602001600182028036833780820191505090505b5090505b60008514612a38576001826129c49190613e7f565b9150600a856129d39190613eb3565b60306129df9190613866565b60f81b8183815181106129f5576129f4613aa0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a319190613e4e565b94506129af565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612ab0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612aea576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612af76000858386612cf7565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612b5c60018514612da9565b901b60a042901b612b6c86612cfd565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612c70575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c206000878480600101955087612702565b612c56576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612bb1578260005414612c6b57600080fd5b612cdb565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612c71575b816000819055505050612cf16000858386612d07565b50505050565b50505050565b6000819050919050565b50505050565b612d15612e39565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b6000819050919050565b828054612dbf9061372e565b90600052602060002090601f016020900481019282612de15760008555612e28565b82601f10612dfa57805160ff1916838001178555612e28565b82800160010185558215612e28579182015b82811115612e27578251825591602001919060010190612e0c565b5b509050612e359190612e7c565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612e95576000816000905550600101612e7d565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b612ec081612ead565b8114612ecb57600080fd5b50565b600081359050612edd81612eb7565b92915050565b600060208284031215612ef957612ef8612ea3565b5b6000612f0784828501612ece565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f4581612f10565b8114612f5057600080fd5b50565b600081359050612f6281612f3c565b92915050565b600060208284031215612f7e57612f7d612ea3565b5b6000612f8c84828501612f53565b91505092915050565b60008115159050919050565b612faa81612f95565b82525050565b6000602082019050612fc56000830184612fa1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613005578082015181840152602081019050612fea565b83811115613014576000848401525b50505050565b6000601f19601f8301169050919050565b600061303682612fcb565b6130408185612fd6565b9350613050818560208601612fe7565b6130598161301a565b840191505092915050565b6000602082019050818103600083015261307e818461302b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130b182613086565b9050919050565b6130c1816130a6565b82525050565b60006020820190506130dc60008301846130b8565b92915050565b6130eb816130a6565b81146130f657600080fd5b50565b600081359050613108816130e2565b92915050565b6000806040838503121561312557613124612ea3565b5b6000613133858286016130f9565b925050602061314485828601612ece565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6131908261301a565b810181811067ffffffffffffffff821117156131af576131ae613158565b5b80604052505050565b60006131c2612e99565b90506131ce8282613187565b919050565b600067ffffffffffffffff8211156131ee576131ed613158565b5b6131f78261301a565b9050602081019050919050565b82818337600083830152505050565b6000613226613221846131d3565b6131b8565b90508281526020810184848401111561324257613241613153565b5b61324d848285613204565b509392505050565b600082601f83011261326a5761326961314e565b5b813561327a848260208601613213565b91505092915050565b60006020828403121561329957613298612ea3565b5b600082013567ffffffffffffffff8111156132b7576132b6612ea8565b5b6132c384828501613255565b91505092915050565b6132d581612ead565b82525050565b60006020820190506132f060008301846132cc565b92915050565b60008060006060848603121561330f5761330e612ea3565b5b600061331d868287016130f9565b935050602061332e868287016130f9565b925050604061333f86828701612ece565b9150509250925092565b60006020828403121561335f5761335e612ea3565b5b600061336d848285016130f9565b91505092915050565b6000806040838503121561338d5761338c612ea3565b5b600061339b85828601612ece565b92505060206133ac858286016130f9565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6133eb81612ead565b82525050565b60006133fd83836133e2565b60208301905092915050565b6000602082019050919050565b6000613421826133b6565b61342b81856133c1565b9350613436836133d2565b8060005b8381101561346757815161344e88826133f1565b975061345983613409565b92505060018101905061343a565b5085935050505092915050565b6000602082019050818103600083015261348e8184613416565b905092915050565b61349f81612f95565b81146134aa57600080fd5b50565b6000813590506134bc81613496565b92915050565b600080604083850312156134d9576134d8612ea3565b5b60006134e7858286016130f9565b92505060206134f8858286016134ad565b9150509250929050565b600067ffffffffffffffff82111561351d5761351c613158565b5b6135268261301a565b9050602081019050919050565b600061354661354184613502565b6131b8565b90508281526020810184848401111561356257613561613153565b5b61356d848285613204565b509392505050565b600082601f83011261358a5761358961314e565b5b813561359a848260208601613533565b91505092915050565b600080600080608085870312156135bd576135bc612ea3565b5b60006135cb878288016130f9565b94505060206135dc878288016130f9565b93505060406135ed87828801612ece565b925050606085013567ffffffffffffffff81111561360e5761360d612ea8565b5b61361a87828801613575565b91505092959194509250565b60006020828403121561363c5761363b612ea3565b5b600061364a848285016134ad565b91505092915050565b6000806040838503121561366a57613669612ea3565b5b6000613678858286016130f9565b9250506020613689858286016130f9565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136c9602083612fd6565b91506136d482613693565b602082019050919050565b600060208201905081810360008301526136f8816136bc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061374657607f821691505b602082108103613759576137586136ff565b5b50919050565b7f5468652053616c65206973207061757365642100000000000000000000000000600082015250565b6000613795601383612fd6565b91506137a08261375f565b602082019050919050565b600060208201905081810360008301526137c481613788565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000613801601483612fd6565b915061380c826137cb565b602082019050919050565b60006020820190508181036000830152613830816137f4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061387182612ead565b915061387c83612ead565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138b1576138b0613837565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006138f2601483612fd6565b91506138fd826138bc565b602082019050919050565b60006020820190508181036000830152613921816138e5565b9050919050565b7f4d6178206d696e74207065722077616c6c657420657863656564656421000000600082015250565b600061395e601d83612fd6565b915061396982613928565b602082019050919050565b6000602082019050818103600083015261398d81613951565b9050919050565b600061399f82612ead565b91506139aa83612ead565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139e3576139e2613837565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000613a24601383612fd6565b9150613a2f826139ee565b602082019050919050565b60006020820190508181036000830152613a5381613a17565b9050919050565b600081905092915050565b50565b6000613a75600083613a5a565b9150613a8082613a65565b600082019050919050565b6000613a9682613a68565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613b2b602f83612fd6565b9150613b3682613acf565b604082019050919050565b60006020820190508181036000830152613b5a81613b1e565b9050919050565b600081905092915050565b6000613b7782612fcb565b613b818185613b61565b9350613b91818560208601612fe7565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613bbf8161372e565b613bc98186613b61565b94506001821660008114613be45760018114613bf557613c28565b60ff19831686528186019350613c28565b613bfe85613b9d565b60005b83811015613c2057815481890152600182019150602081019050613c01565b838801955050505b50505092915050565b6000613c3d8286613b6c565b9150613c498285613b6c565b9150613c558284613bb2565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613cbe602683612fd6565b9150613cc982613c62565b604082019050919050565b60006020820190508181036000830152613ced81613cb1565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613d1b82613cf4565b613d258185613cff565b9350613d35818560208601612fe7565b613d3e8161301a565b840191505092915050565b6000608082019050613d5e60008301876130b8565b613d6b60208301866130b8565b613d7860408301856132cc565b8181036060830152613d8a8184613d10565b905095945050505050565b600081519050613da481612f3c565b92915050565b600060208284031215613dc057613dbf612ea3565b5b6000613dce84828501613d95565b91505092915050565b6000613de282612ead565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e1457613e13613837565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e5982612ead565b9150613e6483612ead565b925082613e7457613e73613e1f565b5b828204905092915050565b6000613e8a82612ead565b9150613e9583612ead565b925082821015613ea857613ea7613837565b5b828203905092915050565b6000613ebe82612ead565b9150613ec983612ead565b925082613ed957613ed8613e1f565b5b82820690509291505056fea2646970667358221220924ebe219b7e58fa1d655cbea32546bed23883f844c785fa557f9d56b229ad3564736f6c634300080d0033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5a73686f655773686d5153577839444e5956645469416f4d3335636f726e356e4a354851374a3158534c37452f000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _uri (string): ipfs://QmZshoeWshmQSWx9DNYVdTiAoM35corn5nJ5HQ7J1XSL7E/
Arg [1] : _hiddenMetadataUri (string):

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d5a73686f655773686d5153577839444e5956645469416f
Arg [4] : 4d3335636f726e356e4a354851374a3158534c37452f00000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

58321:5153:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61488:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13073:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18086:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59589:610;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20154:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19614:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60859:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12127:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58704:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58665:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61402:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21040:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58589:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61596:137;;;;;;;;;;;;;:::i;:::-;;21281:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60723:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58858:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58550:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58785:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17875:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58828:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13752:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54597:103;;;;;;;;;;;;;:::i;:::-;;60207:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62031:712;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53946:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58742:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18255:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58625:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61811:216;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20430:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58513:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61048:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21537:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62850:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60965:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61184:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61316:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60554:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20809:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58490:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54855:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60641:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61488:102;54177:12;:10;:12::i;:::-;54166:23;;:7;:5;:7::i;:::-;:23;;;54158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61572:12:::1;61558:11;:26;;;;61488:102:::0;:::o;13073:615::-;13158:4;13473:10;13458:25;;:11;:25;;;;:102;;;;13550:10;13535:25;;:11;:25;;;;13458:102;:179;;;;13627:10;13612:25;;:11;:25;;;;13458:179;13438:199;;13073:615;;;:::o;18086:100::-;18140:13;18173:5;18166:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18086:100;:::o;59589:610::-;59667:14;59684:13;:11;:13::i;:::-;59667:30;;59740:4;;;;;;;;;;;59732:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;59797:1;59783:11;:15;:51;;;;;59817:17;;59802:11;:32;;59783:51;59775:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;59905:11;;59890;59874:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;59866:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;59995:17;;59980:11;59956:21;59966:10;59956:9;:21::i;:::-;:35;;;;:::i;:::-;:56;;59948:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;60095:11;60074:18;60085:6;60074:10;:18::i;:::-;:32;;;;:::i;:::-;60061:9;:45;;60053:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;60157:36;60167:12;:10;:12::i;:::-;60181:11;60157:9;:36::i;:::-;59639:560;59589:610;:::o;20154:204::-;20222:7;20247:16;20255:7;20247;:16::i;:::-;20242:64;;20272:34;;;;;;;;;;;;;;20242:64;20326:15;:24;20342:7;20326:24;;;;;;;;;;;;;;;;;;;;;20319:31;;20154:204;;;:::o;19614:474::-;19687:13;19719:27;19738:7;19719:18;:27::i;:::-;19687:61;;19769:5;19763:11;;:2;:11;;;19759:48;;19783:24;;;;;;;;;;;;;;19759:48;19847:5;19824:28;;:19;:17;:19::i;:::-;:28;;;19820:175;;19872:44;19889:5;19896:19;:17;:19::i;:::-;19872:16;:44::i;:::-;19867:128;;19944:35;;;;;;;;;;;;;;19867:128;19820:175;20034:2;20007:15;:24;20023:7;20007:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20072:7;20068:2;20052:28;;20061:5;20052:28;;;;;;;;;;;;19676:412;19614:474;;:::o;60859:100::-;54177:12;:10;:12::i;:::-;54166:23;;:7;:5;:7::i;:::-;:23;;;54158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60943:10:::1;60931:9;:22;;;;;;;;;;;;:::i;:::-;;60859:100:::0;:::o;12127:315::-;12180:7;12408:15;:13;:15::i;:::-;12393:12;;12377:13;;:28;:46;12370:53;;12127:315;:::o;58704:32::-;;;;:::o;58665:33::-;;;;:::o;61402:78::-;54177:12;:10;:12::i;:::-;54166:23;;:7;:5;:7::i;:::-;:23;;;54158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61468:6:::1;61460:5;:14;;;;61402:78:::0;:::o;21040:170::-;21174:28;21184:4;21190:2;21194:7;21174:9;:28::i;:::-;21040:170;;;:::o;58589:30::-;;;;:::o;61596:137::-;54177:12;:10;:12::i;:::-;54166:23;;:7;:5;:7::i;:::-;:23;;;54158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61641:7:::1;61662;:5;:7::i;:::-;61654:21;;61683;61654:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61640:69;;;61724:2;61716:11;;;::::0;::::1;;61633:100;61596:137::o:0;21281:185::-;21419:39;21436:4;21442:2;21446:7;21419:39;;;;;;;;;;;;:16;:39::i;:::-;21281:185;;;:::o;60723:130::-;54177:12;:10;:12::i;:::-;54166:23;;:7;:5;:7::i;:::-;:23;;;54158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60829:18:::1;60809:17;:38;;;;;;;;;;;;:::i;:::-;;60723:130:::0;:::o;58858:27::-;;;;;;;;;;;;;:::o;58550:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58785:37::-;;;;:::o;17875:144::-;17939:7;17982:27;18001:7;17982:18;:27::i;:::-;17959:52;;17875:144;;;:::o;58828:24::-;;;;;;;;;;;;;:::o;13752:224::-;13816:7;13857:1;13840:19;;:5;:19;;;13836:60;;13868:28;;;;;;;;;;;;;;13836:60;9091:13;13914:18;:25;13933:5;13914:25;;;;;;;;;;;;;;;;:54;13907:61;;13752:224;;;:::o;54597:103::-;54177:12;:10;:12::i;:::-;54166:23;;:7;:5;:7::i;:::-;:23;;;54158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54662:30:::1;54689:1;54662:18;:30::i;:::-;54597:103::o:0;60207:202::-;54177:12;:10;:12::i;:::-;54166:23;;:7;:5;:7::i;:::-;:23;;;54158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60327:11:::1;;60312;60296:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;60288:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;60370:33;60380:9;60391:11;60370:9;:33::i;:::-;60207:202:::0;;:::o;62031:712::-;62092:16;62138:18;62173:16;62183:5;62173:9;:16::i;:::-;62159:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62138:52;;62202:11;62216:14;:12;:14::i;:::-;62202:28;;62241:19;62271:25;62312:9;62307:403;62327:3;62323:1;:7;62307:403;;;62352:31;62386:15;62399:1;62386:12;:15::i;:::-;62352:49;;62420:9;:16;;;62416:65;;;62457:8;;;62416:65;62525:1;62499:28;;:9;:14;;;:28;;;62495:103;;62568:9;:14;;;62548:34;;62495:103;62637:5;62616:26;;:17;:26;;;62612:87;;62682:1;62663;62665:13;;;;;;62663:16;;;;;;;;:::i;:::-;;;;;;;:20;;;;;62612:87;62337:373;62307:403;62332:3;;;;;;;62307:403;;;;62727:1;62720:8;;;;;;62031:712;;;:::o;53946:87::-;53992:7;54019:6;;;;;;;;;;;54012:13;;53946:87;:::o;58742:38::-;;;;:::o;18255:104::-;18311:13;18344:7;18337:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18255:104;:::o;58625:34::-;;;;:::o;61811:216::-;61849:7;61889:12;;61873:13;:11;:13::i;:::-;:28;61869:73;;;61923:5;;61916:12;;;;61869:73;61973:11;;61957:13;:11;:13::i;:::-;:27;61953:69;;;62005:5;;61998:12;;;;61953:69;61811:216;;:::o;20430:308::-;20541:19;:17;:19::i;:::-;20529:31;;:8;:31;;;20525:61;;20569:17;;;;;;;;;;;;;;20525:61;20651:8;20599:18;:39;20618:19;:17;:19::i;:::-;20599:39;;;;;;;;;;;;;;;:49;20639:8;20599:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;20711:8;20675:55;;20690:19;:17;:19::i;:::-;20675:55;;;20721:8;20675:55;;;;;;:::i;:::-;;;;;;;;20430:308;;:::o;58513:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61048:130::-;54177:12;:10;:12::i;:::-;54166:23;;:7;:5;:7::i;:::-;:23;;;54158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61153:19:::1;61132:18;:40;;;;61048:130:::0;:::o;21537:396::-;21704:28;21714:4;21720:2;21724:7;21704:9;:28::i;:::-;21765:1;21747:2;:14;;;:19;21743:183;;21786:56;21817:4;21823:2;21827:7;21836:5;21786:30;:56::i;:::-;21781:145;;21870:40;;;;;;;;;;;;;;21781:145;21743:183;21537:396;;;;:::o;62850:445::-;62924:13;62954:17;62962:8;62954:7;:17::i;:::-;62946:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;63048:5;63036:17;;:8;;;;;;;;;;;:17;;;63032:64;;63071:17;63064:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63032:64;63104:28;63135:10;:8;:10::i;:::-;63104:41;;63190:1;63165:14;63159:28;:32;:130;;;;;;;;;;;;;;;;;63227:14;63243:19;:8;:17;:19::i;:::-;63264:9;63210:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63159:130;63152:137;;;62850:445;;;;:::o;60965:77::-;54177:12;:10;:12::i;:::-;54166:23;;:7;:5;:7::i;:::-;:23;;;54158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61031:5:::1;61024:4;;:12;;;;;;;;;;;;;;;;;;60965:77:::0;:::o;61184:126::-;54177:12;:10;:12::i;:::-;54166:23;;:7;:5;:7::i;:::-;:23;;;54158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61286:18:::1;61266:17;:38;;;;61184:126:::0;:::o;61316:78::-;54177:12;:10;:12::i;:::-;54166:23;;:7;:5;:7::i;:::-;:23;;;54158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61382:6:::1;61374:5;:14;;;;61316:78:::0;:::o;60554:81::-;54177:12;:10;:12::i;:::-;54166:23;;:7;:5;:7::i;:::-;:23;;;54158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60623:6:::1;60612:8;;:17;;;;;;;;;;;;;;;;;;60554:81:::0;:::o;20809:164::-;20906:4;20930:18;:25;20949:5;20930:25;;;;;;;;;;;;;;;:35;20956:8;20930:35;;;;;;;;;;;;;;;;;;;;;;;;;20923:42;;20809:164;;;;:::o;58490:17::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54855:201::-;54177:12;:10;:12::i;:::-;54166:23;;:7;:5;:7::i;:::-;:23;;;54158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54964:1:::1;54944:22;;:8;:22;;::::0;54936:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;55020:28;55039:8;55020:18;:28::i;:::-;54855:201:::0;:::o;60641:76::-;54177:12;:10;:12::i;:::-;54166:23;;:7;:5;:7::i;:::-;:23;;;54158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60707:4:::1;60701:3;:10;;;;;;;;;;;;:::i;:::-;;60641:76:::0;:::o;52670:98::-;52723:7;52750:10;52743:17;;52670:98;:::o;59353:228::-;59414:13;59454:12;;59444:7;:22;59440:65;;;59488:5;;59481:12;;;;59440:65;59527:11;;59517:7;:21;59513:63;;;59559:5;;59552:12;;;;59513:63;59353:228;;;;:::o;22545:104::-;22614:27;22624:2;22628:8;22614:27;;;;;;;;;;;;:9;:27::i;:::-;22545:104;;:::o;22188:273::-;22245:4;22301:7;22282:15;:13;:15::i;:::-;:26;;:66;;;;;22335:13;;22325:7;:23;22282:66;:152;;;;;22433:1;9861:8;22386:17;:26;22404:7;22386:26;;;;;;;;;;;;:43;:48;22282:152;22262:172;;22188:273;;;:::o;15390:1129::-;15457:7;15477:12;15492:7;15477:22;;15560:4;15541:15;:13;:15::i;:::-;:23;15537:915;;15594:13;;15587:4;:20;15583:869;;;15632:14;15649:17;:23;15667:4;15649:23;;;;;;;;;;;;15632:40;;15765:1;9861:8;15738:6;:23;:28;15734:699;;16257:113;16274:1;16264:6;:11;16257:113;;16317:17;:25;16335:6;;;;;;;16317:25;;;;;;;;;;;;16308:34;;16257:113;;;16403:6;16396:13;;;;;;15734:699;15609:843;15583:869;15537:915;16480:31;;;;;;;;;;;;;;15390:1129;;;;:::o;36170:105::-;36230:7;36257:10;36250:17;;36170:105;:::o;62749:95::-;62814:7;62837:1;62830:8;;62749:95;:::o;27427:2515::-;27542:27;27572;27591:7;27572:18;:27::i;:::-;27542:57;;27657:4;27616:45;;27632:19;27616:45;;;27612:86;;27670:28;;;;;;;;;;;;;;27612:86;27711:22;27760:4;27737:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;27781:43;27798:4;27804:19;:17;:19::i;:::-;27781:16;:43::i;:::-;27737:87;:147;;;;27865:19;:17;:19::i;:::-;27841:43;;:20;27853:7;27841:11;:20::i;:::-;:43;;;27737:147;27711:174;;27903:17;27898:66;;27929:35;;;;;;;;;;;;;;27898:66;27993:1;27979:16;;:2;:16;;;27975:52;;28004:23;;;;;;;;;;;;;;27975:52;28040:43;28062:4;28068:2;28072:7;28081:1;28040:21;:43::i;:::-;28156:15;:24;28172:7;28156:24;;;;;;;;;;;;28149:31;;;;;;;;;;;28548:18;:24;28567:4;28548:24;;;;;;;;;;;;;;;;28546:26;;;;;;;;;;;;28617:18;:22;28636:2;28617:22;;;;;;;;;;;;;;;;28615:24;;;;;;;;;;;10143:8;9745:3;28998:15;:41;;28956:21;28974:2;28956:17;:21::i;:::-;:84;:128;28910:17;:26;28928:7;28910:26;;;;;;;;;;;:174;;;;29254:1;10143:8;29204:19;:46;:51;29200:626;;29276:19;29308:1;29298:7;:11;29276:33;;29465:1;29431:17;:30;29449:11;29431:30;;;;;;;;;;;;:35;29427:384;;29569:13;;29554:11;:28;29550:242;;29749:19;29716:17;:30;29734:11;29716:30;;;;;;;;;;;:52;;;;29550:242;29427:384;29257:569;29200:626;29873:7;29869:2;29854:27;;29863:4;29854:27;;;;;;;;;;;;29892:42;29913:4;29919:2;29923:7;29932:1;29892:20;:42::i;:::-;27531:2411;;27427:2515;;;:::o;55216:191::-;55290:16;55309:6;;;;;;;;;;;55290:25;;55335:8;55326:6;;:17;;;;;;;;;;;;;;;;;;55390:8;55359:40;;55380:8;55359:40;;;;;;;;;;;;55279:128;55216:191;:::o;11821:95::-;11868:7;11895:13;;11888:20;;11821:95;:::o;16999:153::-;17059:21;;:::i;:::-;17100:44;17119:17;:24;17137:5;17119:24;;;;;;;;;;;;17100:18;:44::i;:::-;17093:51;;16999:153;;;:::o;33639:716::-;33802:4;33848:2;33823:45;;;33869:19;:17;:19::i;:::-;33890:4;33896:7;33905:5;33823:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33819:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34123:1;34106:6;:13;:18;34102:235;;34152:40;;;;;;;;;;;;;;34102:235;34295:6;34289:13;34280:6;34276:2;34272:15;34265:38;33819:529;33992:54;;;33982:64;;;:6;:64;;;;33975:71;;;33639:716;;;;;;:::o;63301:98::-;63361:13;63390:3;63383:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63301:98;:::o;47361:723::-;47417:13;47647:1;47638:5;:10;47634:53;;47665:10;;;;;;;;;;;;;;;;;;;;;47634:53;47697:12;47712:5;47697:20;;47728:14;47753:78;47768:1;47760:4;:9;47753:78;;47786:8;;;;;:::i;:::-;;;;47817:2;47809:10;;;;;:::i;:::-;;;47753:78;;;47841:19;47873:6;47863:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47841:39;;47891:154;47907:1;47898:5;:10;47891:154;;47935:1;47925:11;;;;;:::i;:::-;;;48002:2;47994:5;:10;;;;:::i;:::-;47981:2;:24;;;;:::i;:::-;47968:39;;47951:6;47958;47951:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;48031:2;48022:11;;;;;:::i;:::-;;;47891:154;;;48069:6;48055:21;;;;;47361:723;;;;:::o;23022:2236::-;23145:20;23168:13;;23145:36;;23210:1;23196:16;;:2;:16;;;23192:48;;23221:19;;;;;;;;;;;;;;23192:48;23267:1;23255:8;:13;23251:44;;23277:18;;;;;;;;;;;;;;23251:44;23308:61;23338:1;23342:2;23346:12;23360:8;23308:21;:61::i;:::-;23912:1;9228:2;23883:1;:25;;23882:31;23870:8;:44;23844:18;:22;23863:2;23844:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;10008:3;24313:29;24340:1;24328:8;:13;24313:14;:29::i;:::-;:56;;9745:3;24250:15;:41;;24208:21;24226:2;24208:17;:21::i;:::-;:84;:162;24157:17;:31;24175:12;24157:31;;;;;;;;;;;:213;;;;24387:20;24410:12;24387:35;;24437:11;24466:8;24451:12;:23;24437:37;;24513:1;24495:2;:14;;;:19;24491:635;;24535:313;24591:12;24587:2;24566:38;;24583:1;24566:38;;;;;;;;;;;;24632:69;24671:1;24675:2;24679:14;;;;;;24695:5;24632:30;:69::i;:::-;24627:174;;24737:40;;;;;;;;;;;;;;24627:174;24843:3;24828:12;:18;24535:313;;24929:12;24912:13;;:29;24908:43;;24943:8;;;24908:43;24491:635;;;24992:119;25048:14;;;;;;25044:2;25023:40;;25040:1;25023:40;;;;;;;;;;;;25106:3;25091:12;:18;24992:119;;24491:635;25156:12;25140:13;:28;;;;23621:1559;;25190:60;25219:1;25223:2;25227:12;25241:8;25190:20;:60::i;:::-;23134:2124;23022:2236;;;:::o;35003:159::-;;;;;:::o;19175:148::-;19239:14;19300:5;19290:15;;19175:148;;;:::o;35821:158::-;;;;;:::o;16613:295::-;16679:31;;:::i;:::-;16756:6;16723:9;:14;;:41;;;;;;;;;;;9745:3;16809:6;:32;;16775:9;:24;;:67;;;;;;;;;;;16899:1;9861:8;16872:6;:23;:28;;16853:9;:16;;:47;;;;;;;;;;;16613:295;;;:::o;19410:142::-;19468:14;19529:5;19519:15;;19410:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:149::-;1061:7;1101:66;1094:5;1090:78;1079:89;;1025:149;;;:::o;1180:120::-;1252:23;1269:5;1252:23;:::i;:::-;1245:5;1242:34;1232:62;;1290:1;1287;1280:12;1232:62;1180:120;:::o;1306:137::-;1351:5;1389:6;1376:20;1367:29;;1405:32;1431:5;1405:32;:::i;:::-;1306:137;;;;:::o;1449:327::-;1507:6;1556:2;1544:9;1535:7;1531:23;1527:32;1524:119;;;1562:79;;:::i;:::-;1524:119;1682:1;1707:52;1751:7;1742:6;1731:9;1727:22;1707:52;:::i;:::-;1697:62;;1653:116;1449:327;;;;:::o;1782:90::-;1816:7;1859:5;1852:13;1845:21;1834:32;;1782:90;;;:::o;1878:109::-;1959:21;1974:5;1959:21;:::i;:::-;1954:3;1947:34;1878:109;;:::o;1993:210::-;2080:4;2118:2;2107:9;2103:18;2095:26;;2131:65;2193:1;2182:9;2178:17;2169:6;2131:65;:::i;:::-;1993:210;;;;:::o;2209:99::-;2261:6;2295:5;2289:12;2279:22;;2209:99;;;:::o;2314:169::-;2398:11;2432:6;2427:3;2420:19;2472:4;2467:3;2463:14;2448:29;;2314:169;;;;:::o;2489:307::-;2557:1;2567:113;2581:6;2578:1;2575:13;2567:113;;;2666:1;2661:3;2657:11;2651:18;2647:1;2642:3;2638:11;2631:39;2603:2;2600:1;2596:10;2591:15;;2567:113;;;2698:6;2695:1;2692:13;2689:101;;;2778:1;2769:6;2764:3;2760:16;2753:27;2689:101;2538:258;2489:307;;;:::o;2802:102::-;2843:6;2894:2;2890:7;2885:2;2878:5;2874:14;2870:28;2860:38;;2802:102;;;:::o;2910:364::-;2998:3;3026:39;3059:5;3026:39;:::i;:::-;3081:71;3145:6;3140:3;3081:71;:::i;:::-;3074:78;;3161:52;3206:6;3201:3;3194:4;3187:5;3183:16;3161:52;:::i;:::-;3238:29;3260:6;3238:29;:::i;:::-;3233:3;3229:39;3222:46;;3002:272;2910:364;;;;:::o;3280:313::-;3393:4;3431:2;3420:9;3416:18;3408:26;;3480:9;3474:4;3470:20;3466:1;3455:9;3451:17;3444:47;3508:78;3581:4;3572:6;3508:78;:::i;:::-;3500:86;;3280:313;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:180;5232:77;5229:1;5222:88;5329:4;5326:1;5319:15;5353:4;5350:1;5343:15;5370:281;5453:27;5475:4;5453:27;:::i;:::-;5445:6;5441:40;5583:6;5571:10;5568:22;5547:18;5535:10;5532:34;5529:62;5526:88;;;5594:18;;:::i;:::-;5526:88;5634:10;5630:2;5623:22;5413:238;5370:281;;:::o;5657:129::-;5691:6;5718:20;;:::i;:::-;5708:30;;5747:33;5775:4;5767:6;5747:33;:::i;:::-;5657:129;;;:::o;5792:308::-;5854:4;5944:18;5936:6;5933:30;5930:56;;;5966:18;;:::i;:::-;5930:56;6004:29;6026:6;6004:29;:::i;:::-;5996:37;;6088:4;6082;6078:15;6070:23;;5792:308;;;:::o;6106:154::-;6190:6;6185:3;6180;6167:30;6252:1;6243:6;6238:3;6234:16;6227:27;6106:154;;;:::o;6266:412::-;6344:5;6369:66;6385:49;6427:6;6385:49;:::i;:::-;6369:66;:::i;:::-;6360:75;;6458:6;6451:5;6444:21;6496:4;6489:5;6485:16;6534:3;6525:6;6520:3;6516:16;6513:25;6510:112;;;6541:79;;:::i;:::-;6510:112;6631:41;6665:6;6660:3;6655;6631:41;:::i;:::-;6350:328;6266:412;;;;;:::o;6698:340::-;6754:5;6803:3;6796:4;6788:6;6784:17;6780:27;6770:122;;6811:79;;:::i;:::-;6770:122;6928:6;6915:20;6953:79;7028:3;7020:6;7013:4;7005:6;7001:17;6953:79;:::i;:::-;6944:88;;6760:278;6698:340;;;;:::o;7044:509::-;7113:6;7162:2;7150:9;7141:7;7137:23;7133:32;7130:119;;;7168:79;;:::i;:::-;7130:119;7316:1;7305:9;7301:17;7288:31;7346:18;7338:6;7335:30;7332:117;;;7368:79;;:::i;:::-;7332:117;7473:63;7528:7;7519:6;7508:9;7504:22;7473:63;:::i;:::-;7463:73;;7259:287;7044:509;;;;:::o;7559:118::-;7646:24;7664:5;7646:24;:::i;:::-;7641:3;7634:37;7559:118;;:::o;7683:222::-;7776:4;7814:2;7803:9;7799:18;7791:26;;7827:71;7895:1;7884:9;7880:17;7871:6;7827:71;:::i;:::-;7683:222;;;;:::o;7911:619::-;7988:6;7996;8004;8053:2;8041:9;8032:7;8028:23;8024:32;8021:119;;;8059:79;;:::i;:::-;8021:119;8179:1;8204:53;8249:7;8240:6;8229:9;8225:22;8204:53;:::i;:::-;8194:63;;8150:117;8306:2;8332:53;8377:7;8368:6;8357:9;8353:22;8332:53;:::i;:::-;8322:63;;8277:118;8434:2;8460:53;8505:7;8496:6;8485:9;8481:22;8460:53;:::i;:::-;8450:63;;8405:118;7911:619;;;;;:::o;8536:329::-;8595:6;8644:2;8632:9;8623:7;8619:23;8615:32;8612:119;;;8650:79;;:::i;:::-;8612:119;8770:1;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8741:117;8536:329;;;;:::o;8871:474::-;8939:6;8947;8996:2;8984:9;8975:7;8971:23;8967:32;8964:119;;;9002:79;;:::i;:::-;8964:119;9122:1;9147:53;9192:7;9183:6;9172:9;9168:22;9147:53;:::i;:::-;9137:63;;9093:117;9249:2;9275:53;9320:7;9311:6;9300:9;9296:22;9275:53;:::i;:::-;9265:63;;9220:118;8871:474;;;;;:::o;9351:114::-;9418:6;9452:5;9446:12;9436:22;;9351:114;;;:::o;9471:184::-;9570:11;9604:6;9599:3;9592:19;9644:4;9639:3;9635:14;9620:29;;9471:184;;;;:::o;9661:132::-;9728:4;9751:3;9743:11;;9781:4;9776:3;9772:14;9764:22;;9661:132;;;:::o;9799:108::-;9876:24;9894:5;9876:24;:::i;:::-;9871:3;9864:37;9799:108;;:::o;9913:179::-;9982:10;10003:46;10045:3;10037:6;10003:46;:::i;:::-;10081:4;10076:3;10072:14;10058:28;;9913:179;;;;:::o;10098:113::-;10168:4;10200;10195:3;10191:14;10183:22;;10098:113;;;:::o;10247:732::-;10366:3;10395:54;10443:5;10395:54;:::i;:::-;10465:86;10544:6;10539:3;10465:86;:::i;:::-;10458:93;;10575:56;10625:5;10575:56;:::i;:::-;10654:7;10685:1;10670:284;10695:6;10692:1;10689:13;10670:284;;;10771:6;10765:13;10798:63;10857:3;10842:13;10798:63;:::i;:::-;10791:70;;10884:60;10937:6;10884:60;:::i;:::-;10874:70;;10730:224;10717:1;10714;10710:9;10705:14;;10670:284;;;10674:14;10970:3;10963:10;;10371:608;;;10247:732;;;;:::o;10985:373::-;11128:4;11166:2;11155:9;11151:18;11143:26;;11215:9;11209:4;11205:20;11201:1;11190:9;11186:17;11179:47;11243:108;11346:4;11337:6;11243:108;:::i;:::-;11235:116;;10985:373;;;;:::o;11364:116::-;11434:21;11449:5;11434:21;:::i;:::-;11427:5;11424:32;11414:60;;11470:1;11467;11460:12;11414:60;11364:116;:::o;11486:133::-;11529:5;11567:6;11554:20;11545:29;;11583:30;11607:5;11583:30;:::i;:::-;11486:133;;;;:::o;11625:468::-;11690:6;11698;11747:2;11735:9;11726:7;11722:23;11718:32;11715:119;;;11753:79;;:::i;:::-;11715:119;11873:1;11898:53;11943:7;11934:6;11923:9;11919:22;11898:53;:::i;:::-;11888:63;;11844:117;12000:2;12026:50;12068:7;12059:6;12048:9;12044:22;12026:50;:::i;:::-;12016:60;;11971:115;11625:468;;;;;:::o;12099:307::-;12160:4;12250:18;12242:6;12239:30;12236:56;;;12272:18;;:::i;:::-;12236:56;12310:29;12332:6;12310:29;:::i;:::-;12302:37;;12394:4;12388;12384:15;12376:23;;12099:307;;;:::o;12412:410::-;12489:5;12514:65;12530:48;12571:6;12530:48;:::i;:::-;12514:65;:::i;:::-;12505:74;;12602:6;12595:5;12588:21;12640:4;12633:5;12629:16;12678:3;12669:6;12664:3;12660:16;12657:25;12654:112;;;12685:79;;:::i;:::-;12654:112;12775:41;12809:6;12804:3;12799;12775:41;:::i;:::-;12495:327;12412:410;;;;;:::o;12841:338::-;12896:5;12945:3;12938:4;12930:6;12926:17;12922:27;12912:122;;12953:79;;:::i;:::-;12912:122;13070:6;13057:20;13095:78;13169:3;13161:6;13154:4;13146:6;13142:17;13095:78;:::i;:::-;13086:87;;12902:277;12841:338;;;;:::o;13185:943::-;13280:6;13288;13296;13304;13353:3;13341:9;13332:7;13328:23;13324:33;13321:120;;;13360:79;;:::i;:::-;13321:120;13480:1;13505:53;13550:7;13541:6;13530:9;13526:22;13505:53;:::i;:::-;13495:63;;13451:117;13607:2;13633:53;13678:7;13669:6;13658:9;13654:22;13633:53;:::i;:::-;13623:63;;13578:118;13735:2;13761:53;13806:7;13797:6;13786:9;13782:22;13761:53;:::i;:::-;13751:63;;13706:118;13891:2;13880:9;13876:18;13863:32;13922:18;13914:6;13911:30;13908:117;;;13944:79;;:::i;:::-;13908:117;14049:62;14103:7;14094:6;14083:9;14079:22;14049:62;:::i;:::-;14039:72;;13834:287;13185:943;;;;;;;:::o;14134:323::-;14190:6;14239:2;14227:9;14218:7;14214:23;14210:32;14207:119;;;14245:79;;:::i;:::-;14207:119;14365:1;14390:50;14432:7;14423:6;14412:9;14408:22;14390:50;:::i;:::-;14380:60;;14336:114;14134:323;;;;:::o;14463:474::-;14531:6;14539;14588:2;14576:9;14567:7;14563:23;14559:32;14556:119;;;14594:79;;:::i;:::-;14556:119;14714:1;14739:53;14784:7;14775:6;14764:9;14760:22;14739:53;:::i;:::-;14729:63;;14685:117;14841:2;14867:53;14912:7;14903:6;14892:9;14888:22;14867:53;:::i;:::-;14857:63;;14812:118;14463:474;;;;;:::o;14943:182::-;15083:34;15079:1;15071:6;15067:14;15060:58;14943:182;:::o;15131:366::-;15273:3;15294:67;15358:2;15353:3;15294:67;:::i;:::-;15287:74;;15370:93;15459:3;15370:93;:::i;:::-;15488:2;15483:3;15479:12;15472:19;;15131:366;;;:::o;15503:419::-;15669:4;15707:2;15696:9;15692:18;15684:26;;15756:9;15750:4;15746:20;15742:1;15731:9;15727:17;15720:47;15784:131;15910:4;15784:131;:::i;:::-;15776:139;;15503:419;;;:::o;15928:180::-;15976:77;15973:1;15966:88;16073:4;16070:1;16063:15;16097:4;16094:1;16087:15;16114:320;16158:6;16195:1;16189:4;16185:12;16175:22;;16242:1;16236:4;16232:12;16263:18;16253:81;;16319:4;16311:6;16307:17;16297:27;;16253:81;16381:2;16373:6;16370:14;16350:18;16347:38;16344:84;;16400:18;;:::i;:::-;16344:84;16165:269;16114:320;;;:::o;16440:169::-;16580:21;16576:1;16568:6;16564:14;16557:45;16440:169;:::o;16615:366::-;16757:3;16778:67;16842:2;16837:3;16778:67;:::i;:::-;16771:74;;16854:93;16943:3;16854:93;:::i;:::-;16972:2;16967:3;16963:12;16956:19;;16615:366;;;:::o;16987:419::-;17153:4;17191:2;17180:9;17176:18;17168:26;;17240:9;17234:4;17230:20;17226:1;17215:9;17211:17;17204:47;17268:131;17394:4;17268:131;:::i;:::-;17260:139;;16987:419;;;:::o;17412:170::-;17552:22;17548:1;17540:6;17536:14;17529:46;17412:170;:::o;17588:366::-;17730:3;17751:67;17815:2;17810:3;17751:67;:::i;:::-;17744:74;;17827:93;17916:3;17827:93;:::i;:::-;17945:2;17940:3;17936:12;17929:19;;17588:366;;;:::o;17960:419::-;18126:4;18164:2;18153:9;18149:18;18141:26;;18213:9;18207:4;18203:20;18199:1;18188:9;18184:17;18177:47;18241:131;18367:4;18241:131;:::i;:::-;18233:139;;17960:419;;;:::o;18385:180::-;18433:77;18430:1;18423:88;18530:4;18527:1;18520:15;18554:4;18551:1;18544:15;18571:305;18611:3;18630:20;18648:1;18630:20;:::i;:::-;18625:25;;18664:20;18682:1;18664:20;:::i;:::-;18659:25;;18818:1;18750:66;18746:74;18743:1;18740:81;18737:107;;;18824:18;;:::i;:::-;18737:107;18868:1;18865;18861:9;18854:16;;18571:305;;;;:::o;18882:170::-;19022:22;19018:1;19010:6;19006:14;18999:46;18882:170;:::o;19058:366::-;19200:3;19221:67;19285:2;19280:3;19221:67;:::i;:::-;19214:74;;19297:93;19386:3;19297:93;:::i;:::-;19415:2;19410:3;19406:12;19399:19;;19058:366;;;:::o;19430:419::-;19596:4;19634:2;19623:9;19619:18;19611:26;;19683:9;19677:4;19673:20;19669:1;19658:9;19654:17;19647:47;19711:131;19837:4;19711:131;:::i;:::-;19703:139;;19430:419;;;:::o;19855:179::-;19995:31;19991:1;19983:6;19979:14;19972:55;19855:179;:::o;20040:366::-;20182:3;20203:67;20267:2;20262:3;20203:67;:::i;:::-;20196:74;;20279:93;20368:3;20279:93;:::i;:::-;20397:2;20392:3;20388:12;20381:19;;20040:366;;;:::o;20412:419::-;20578:4;20616:2;20605:9;20601:18;20593:26;;20665:9;20659:4;20655:20;20651:1;20640:9;20636:17;20629:47;20693:131;20819:4;20693:131;:::i;:::-;20685:139;;20412:419;;;:::o;20837:348::-;20877:7;20900:20;20918:1;20900:20;:::i;:::-;20895:25;;20934:20;20952:1;20934:20;:::i;:::-;20929:25;;21122:1;21054:66;21050:74;21047:1;21044:81;21039:1;21032:9;21025:17;21021:105;21018:131;;;21129:18;;:::i;:::-;21018:131;21177:1;21174;21170:9;21159:20;;20837:348;;;;:::o;21191:169::-;21331:21;21327:1;21319:6;21315:14;21308:45;21191:169;:::o;21366:366::-;21508:3;21529:67;21593:2;21588:3;21529:67;:::i;:::-;21522:74;;21605:93;21694:3;21605:93;:::i;:::-;21723:2;21718:3;21714:12;21707:19;;21366:366;;;:::o;21738:419::-;21904:4;21942:2;21931:9;21927:18;21919:26;;21991:9;21985:4;21981:20;21977:1;21966:9;21962:17;21955:47;22019:131;22145:4;22019:131;:::i;:::-;22011:139;;21738:419;;;:::o;22163:147::-;22264:11;22301:3;22286:18;;22163:147;;;;:::o;22316:114::-;;:::o;22436:398::-;22595:3;22616:83;22697:1;22692:3;22616:83;:::i;:::-;22609:90;;22708:93;22797:3;22708:93;:::i;:::-;22826:1;22821:3;22817:11;22810:18;;22436:398;;;:::o;22840:379::-;23024:3;23046:147;23189:3;23046:147;:::i;:::-;23039:154;;23210:3;23203:10;;22840:379;;;:::o;23225:180::-;23273:77;23270:1;23263:88;23370:4;23367:1;23360:15;23394:4;23391:1;23384:15;23411:234;23551:34;23547:1;23539:6;23535:14;23528:58;23620:17;23615:2;23607:6;23603:15;23596:42;23411:234;:::o;23651:366::-;23793:3;23814:67;23878:2;23873:3;23814:67;:::i;:::-;23807:74;;23890:93;23979:3;23890:93;:::i;:::-;24008:2;24003:3;23999:12;23992:19;;23651:366;;;:::o;24023:419::-;24189:4;24227:2;24216:9;24212:18;24204:26;;24276:9;24270:4;24266:20;24262:1;24251:9;24247:17;24240:47;24304:131;24430:4;24304:131;:::i;:::-;24296:139;;24023:419;;;:::o;24448:148::-;24550:11;24587:3;24572:18;;24448:148;;;;:::o;24602:377::-;24708:3;24736:39;24769:5;24736:39;:::i;:::-;24791:89;24873:6;24868:3;24791:89;:::i;:::-;24784:96;;24889:52;24934:6;24929:3;24922:4;24915:5;24911:16;24889:52;:::i;:::-;24966:6;24961:3;24957:16;24950:23;;24712:267;24602:377;;;;:::o;24985:141::-;25034:4;25057:3;25049:11;;25080:3;25077:1;25070:14;25114:4;25111:1;25101:18;25093:26;;24985:141;;;:::o;25156:845::-;25259:3;25296:5;25290:12;25325:36;25351:9;25325:36;:::i;:::-;25377:89;25459:6;25454:3;25377:89;:::i;:::-;25370:96;;25497:1;25486:9;25482:17;25513:1;25508:137;;;;25659:1;25654:341;;;;25475:520;;25508:137;25592:4;25588:9;25577;25573:25;25568:3;25561:38;25628:6;25623:3;25619:16;25612:23;;25508:137;;25654:341;25721:38;25753:5;25721:38;:::i;:::-;25781:1;25795:154;25809:6;25806:1;25803:13;25795:154;;;25883:7;25877:14;25873:1;25868:3;25864:11;25857:35;25933:1;25924:7;25920:15;25909:26;;25831:4;25828:1;25824:12;25819:17;;25795:154;;;25978:6;25973:3;25969:16;25962:23;;25661:334;;25475:520;;25263:738;;25156:845;;;;:::o;26007:589::-;26232:3;26254:95;26345:3;26336:6;26254:95;:::i;:::-;26247:102;;26366:95;26457:3;26448:6;26366:95;:::i;:::-;26359:102;;26478:92;26566:3;26557:6;26478:92;:::i;:::-;26471:99;;26587:3;26580:10;;26007:589;;;;;;:::o;26602:225::-;26742:34;26738:1;26730:6;26726:14;26719:58;26811:8;26806:2;26798:6;26794:15;26787:33;26602:225;:::o;26833:366::-;26975:3;26996:67;27060:2;27055:3;26996:67;:::i;:::-;26989:74;;27072:93;27161:3;27072:93;:::i;:::-;27190:2;27185:3;27181:12;27174:19;;26833:366;;;:::o;27205:419::-;27371:4;27409:2;27398:9;27394:18;27386:26;;27458:9;27452:4;27448:20;27444:1;27433:9;27429:17;27422:47;27486:131;27612:4;27486:131;:::i;:::-;27478:139;;27205:419;;;:::o;27630:98::-;27681:6;27715:5;27709:12;27699:22;;27630:98;;;:::o;27734:168::-;27817:11;27851:6;27846:3;27839:19;27891:4;27886:3;27882:14;27867:29;;27734:168;;;;:::o;27908:360::-;27994:3;28022:38;28054:5;28022:38;:::i;:::-;28076:70;28139:6;28134:3;28076:70;:::i;:::-;28069:77;;28155:52;28200:6;28195:3;28188:4;28181:5;28177:16;28155:52;:::i;:::-;28232:29;28254:6;28232:29;:::i;:::-;28227:3;28223:39;28216:46;;27998:270;27908:360;;;;:::o;28274:640::-;28469:4;28507:3;28496:9;28492:19;28484:27;;28521:71;28589:1;28578:9;28574:17;28565:6;28521:71;:::i;:::-;28602:72;28670:2;28659:9;28655:18;28646:6;28602:72;:::i;:::-;28684;28752:2;28741:9;28737:18;28728:6;28684:72;:::i;:::-;28803:9;28797:4;28793:20;28788:2;28777:9;28773:18;28766:48;28831:76;28902:4;28893:6;28831:76;:::i;:::-;28823:84;;28274:640;;;;;;;:::o;28920:141::-;28976:5;29007:6;29001:13;28992:22;;29023:32;29049:5;29023:32;:::i;:::-;28920:141;;;;:::o;29067:349::-;29136:6;29185:2;29173:9;29164:7;29160:23;29156:32;29153:119;;;29191:79;;:::i;:::-;29153:119;29311:1;29336:63;29391:7;29382:6;29371:9;29367:22;29336:63;:::i;:::-;29326:73;;29282:127;29067:349;;;;:::o;29422:233::-;29461:3;29484:24;29502:5;29484:24;:::i;:::-;29475:33;;29530:66;29523:5;29520:77;29517:103;;29600:18;;:::i;:::-;29517:103;29647:1;29640:5;29636:13;29629:20;;29422:233;;;:::o;29661:180::-;29709:77;29706:1;29699:88;29806:4;29803:1;29796:15;29830:4;29827:1;29820:15;29847:185;29887:1;29904:20;29922:1;29904:20;:::i;:::-;29899:25;;29938:20;29956:1;29938:20;:::i;:::-;29933:25;;29977:1;29967:35;;29982:18;;:::i;:::-;29967:35;30024:1;30021;30017:9;30012:14;;29847:185;;;;:::o;30038:191::-;30078:4;30098:20;30116:1;30098:20;:::i;:::-;30093:25;;30132:20;30150:1;30132:20;:::i;:::-;30127:25;;30171:1;30168;30165:8;30162:34;;;30176:18;;:::i;:::-;30162:34;30221:1;30218;30214:9;30206:17;;30038:191;;;;:::o;30235:176::-;30267:1;30284:20;30302:1;30284:20;:::i;:::-;30279:25;;30318:20;30336:1;30318:20;:::i;:::-;30313:25;;30357:1;30347:35;;30362:18;;:::i;:::-;30347:35;30403:1;30400;30396:9;30391:14;;30235:176;;;;:::o

Swarm Source

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