ETH Price: $2,670.18 (+1.25%)
Gas: 0.89 Gwei

Token

Art Gamblers (AG)
 

Overview

Max Total Supply

127 AG

Holders

48

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 AG
0xdafe9399ad9f641bcd386959052d649df3dbba4f
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:
NFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

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

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

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

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

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

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

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables
     * (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

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

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

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

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

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

    // Mapping from token ID to approved address.
    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual returns (uint256) {
        // Counter underflow is impossible as `_currentIndex` does not decrement,
        // and it is initialized to `_startTokenId()`.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

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

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

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

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

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

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

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

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

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

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token IDs
     * are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token IDs
     * have been transferred. This includes minting.
     * And also called after one token has been burned.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

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

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

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

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

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

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

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

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

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

// File: contracts/goo_zombies.sol



pragma solidity ^0.8.7;




contract NFT is ERC721A, Ownable {
  using StringsUpgradeable for uint256;
  string baseURI;
  string public baseExtension = ".json";
  uint256 public totalFree = 10000;
  uint256 public maxSupply = 10000;
  
  bool public paused = false;
  bool public revealed = false;
  string public notRevealedUri;
  
  uint256 public ownerSave = 0;
  uint256 public maxPerFree = 2;
  uint256 public maxCount = 10;
  uint256 public price = 0.001 ether;
  //uint256 public totalFreeMinted = 0;


  uint256 _startTime = 1667415600;
  mapping(address => uint256) public playerCount;
  mapping(address => uint256) public mintFreeAmout;


  constructor(
    string memory _name,
    string memory _symbol,
    string memory _initBaseURI,
    string memory _initNotRevealedUri
  ) ERC721A(_name, _symbol) {
    setBaseURI(_initBaseURI);
    setNotRevealedURI(_initNotRevealedUri);
  }

  function setStartTime(uint time) public onlyOwner {
    _startTime = time;
  }


  function setScaleData(uint256 maxPerFree_, uint256 maxCount_, uint256 price_, uint256 MaxTotalFree_) external onlyOwner 
  {
    maxPerFree = maxPerFree_;
    maxCount = maxCount_;
    price = price_;
    totalFree = MaxTotalFree_;
  }

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


  // public
  function mint(uint256 count) external payable {
    uint256 cost = price;
    
    uint256 supply = totalSupply();
    uint256 playerMintFreeAmout = mintFreeAmout[msg.sender];

    require(block.timestamp >= _startTime,"not the right time");
    require(count > 0,"mint Amount less than 1");
    require(supply + count <= (maxSupply - ownerSave),"No more");
    require(count + playerCount[msg.sender] <= maxCount,"player max mint");
    require(!paused,"scale paused");

      //   if ((totalFreeMinted + count < totalFree - ownerSave + 1) && (playerMintFreeAmout < maxPerFree)) { 
      //       if(count >= (maxPerFree - playerMintFreeAmout))
      //       {
      //        require(msg.value >= (count * cost) - ((maxPerFree - playerMintFreeAmout) * cost), "Please send the exact ETH amount");
      //        mintFreeAmout[msg.sender] = maxPerFree;
      //        totalFreeMinted += maxPerFree;
      //       }
      //       else
      //       {
      //        require(msg.value >= 0, "Please send the exact ETH amount");
      //        mintFreeAmout[msg.sender] += count;
      //        totalFreeMinted += count;
      //       }
      // }

    if ((playerMintFreeAmout < maxPerFree)) { 
            if(count >= (maxPerFree - playerMintFreeAmout))
            {
             require(msg.value >= (count * cost) - ((maxPerFree - playerMintFreeAmout) * cost), "Please send the exact ETH amount");
             mintFreeAmout[msg.sender] = maxPerFree;
            }
            else
            {
             require(msg.value >= 0, "Please send the exact ETH amount");
             mintFreeAmout[msg.sender] += count;
            }
      }
        
      else{
          require(msg.value >= count * cost, "Please send the exact ETH amount");
      }

    playerCount[msg.sender] += count;

    _safeMint(msg.sender, count);

  }

    
  function airDorp(address player,uint256 _airAmount) public payable onlyOwner{
    uint256 supply = totalSupply();
    require(_airAmount > 0);
    require(supply + _airAmount <= maxSupply);

    
      _safeMint(player, _airAmount);

  }




  // function walletOfOwner(address _owner)
  //   public
  //   view
  //   returns (uint256[] memory)
  // {
  //   uint256 ownerTokenCount = balanceOf(_owner);
  //   uint256[] memory tokenIds = new uint256[](ownerTokenCount);
  //   for (uint256 i; i < ownerTokenCount; i++) {
  //     tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
  //   }
  //   return tokenIds;
  // }

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    
    if(revealed == false) {
        return notRevealedUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
        : "";
  }

  //only owner
  function reveal() public onlyOwner {
      revealed = true;
  }

    function setOwnerSave(uint count) public onlyOwner {
    ownerSave = count;
  }
  
  function maxFreePerWallet() public view returns (uint256) {
      return maxPerFree;
  }

  function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
    notRevealedUri = _notRevealedURI;
  }

  function setBaseURI(string memory _newBaseURI) public onlyOwner {
    baseURI = _newBaseURI;
  }

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }
 
  function withdraw() public payable onlyOwner {

    // =============================================================================
    
    // This will payout the owner 95% of the contract balance.
    // Do not remove this otherwise you will not be able to withdraw the funds.
    // =============================================================================
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
    // =============================================================================
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"_airAmount","type":"uint256"}],"name":"airDorp","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintFreeAmout","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":"notRevealedUri","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":"ownerSave","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"playerCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"reveal","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setOwnerSave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPerFree_","type":"uint256"},{"internalType":"uint256","name":"maxCount_","type":"uint256"},{"internalType":"uint256","name":"price_","type":"uint256"},{"internalType":"uint256","name":"MaxTotalFree_","type":"uint256"}],"name":"setScaleData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90805190602001906200005192919062000367565b50612710600b55612710600c556000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055506000600f556002601055600a60115566038d7ea4c68000601255636362be30601355348015620000c357600080fd5b5060405162003e3738038062003e378339818101604052810190620000e9919062000495565b838381600290805190602001906200010392919062000367565b5080600390805190602001906200011c92919062000367565b506200012d6200018160201b60201c565b600081905550505062000155620001496200018660201b60201c565b6200018e60201b60201c565b62000166826200025460201b60201c565b62000177816200028060201b60201c565b505050506200078a565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000264620002ac60201b60201c565b80600990805190602001906200027c92919062000367565b5050565b62000290620002ac60201b60201c565b80600e9080519060200190620002a892919062000367565b5050565b620002bc6200018660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002e26200033d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200033b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200033290620005aa565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003759062000672565b90600052602060002090601f016020900481019282620003995760008555620003e5565b82601f10620003b457805160ff1916838001178555620003e5565b82800160010185558215620003e5579182015b82811115620003e4578251825591602001919060010190620003c7565b5b509050620003f49190620003f8565b5090565b5b8082111562000413576000816000905550600101620003f9565b5090565b60006200042e6200042884620005f5565b620005cc565b9050828152602081018484840111156200044d576200044c62000741565b5b6200045a8482856200063c565b509392505050565b600082601f8301126200047a57620004796200073c565b5b81516200048c84826020860162000417565b91505092915050565b60008060008060808587031215620004b257620004b16200074b565b5b600085015167ffffffffffffffff811115620004d357620004d262000746565b5b620004e18782880162000462565b945050602085015167ffffffffffffffff81111562000505576200050462000746565b5b620005138782880162000462565b935050604085015167ffffffffffffffff81111562000537576200053662000746565b5b620005458782880162000462565b925050606085015167ffffffffffffffff81111562000569576200056862000746565b5b620005778782880162000462565b91505092959194509250565b6000620005926020836200062b565b91506200059f8262000761565b602082019050919050565b60006020820190508181036000830152620005c58162000583565b9050919050565b6000620005d8620005eb565b9050620005e68282620006a8565b919050565b6000604051905090565b600067ffffffffffffffff8211156200061357620006126200070d565b5b6200061e8262000750565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200065c5780820151818401526020810190506200063f565b838111156200066c576000848401525b50505050565b600060028204905060018216806200068b57607f821691505b60208210811415620006a257620006a1620006de565b5b50919050565b620006b38262000750565b810181811067ffffffffffffffff82111715620006d557620006d46200070d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61369d806200079a6000396000f3fe6080604052600436106102465760003560e01c80638da5cb5b11610139578063b88d4fde116100b6578063da3ef23f1161007a578063da3ef23f146107e9578063e3e3c66514610812578063e80509241461083d578063e985e9c51461087a578063f2c4ce1e146108b7578063f2fde38b146108e057610246565b8063b88d4fde1461070f578063c66828621461072b578063c7c39ffc14610756578063c87b56dd14610781578063d5abeb01146107be57610246565b8063a0712d68116100fd578063a0712d681461066c578063a22cb46514610688578063a475b5dd146106b1578063a7027357146106c8578063b3f50e72146106f357610246565b80638da5cb5b1461059757806395d89b41146105c257806397084843146105ed5780639ef2d87a14610616578063a035b1fe1461064157610246565b80633e0a322d116101c75780635c975abb1161018b5780635c975abb1461049e5780636246d7fb146104c95780636352211e1461050657806370a0823114610543578063715018a61461058057610246565b80633e0a322d146103dc5780633e8f7e9f1461040557806342842e0e1461042e578063518302271461044a57806355f804b31461047557610246565b8063095ea7b31161020e578063095ea7b31461034457806318160ddd1461036057806323b872dd1461038b578063333e44e6146103a75780633ccfd60b146103d257610246565b806301ffc9a71461024b57806302329a291461028857806306fdde03146102b1578063081812fc146102dc578063081c8c4414610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906129a0565b610909565b60405161027f9190612e31565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa9190612973565b61099b565b005b3480156102bd57600080fd5b506102c66109c0565b6040516102d39190612e4c565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190612a43565b610a52565b6040516103109190612dca565b60405180910390f35b34801561032557600080fd5b5061032e610ad1565b60405161033b9190612e4c565b60405180910390f35b61035e60048036038101906103599190612933565b610b5f565b005b34801561036c57600080fd5b50610375610ca3565b6040516103829190612f8e565b60405180910390f35b6103a560048036038101906103a0919061281d565b610cba565b005b3480156103b357600080fd5b506103bc610fdf565b6040516103c99190612f8e565b60405180910390f35b6103da610fe5565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190612a43565b61106d565b005b34801561041157600080fd5b5061042c60048036038101906104279190612a43565b61107f565b005b6104486004803603810190610443919061281d565b611091565b005b34801561045657600080fd5b5061045f6110b1565b60405161046c9190612e31565b60405180910390f35b34801561048157600080fd5b5061049c600480360381019061049791906129fa565b6110c4565b005b3480156104aa57600080fd5b506104b36110e6565b6040516104c09190612e31565b60405180910390f35b3480156104d557600080fd5b506104f060048036038101906104eb91906127b0565b6110f9565b6040516104fd9190612f8e565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190612a43565b611111565b60405161053a9190612dca565b60405180910390f35b34801561054f57600080fd5b5061056a600480360381019061056591906127b0565b611123565b6040516105779190612f8e565b60405180910390f35b34801561058c57600080fd5b506105956111dc565b005b3480156105a357600080fd5b506105ac6111f0565b6040516105b99190612dca565b60405180910390f35b3480156105ce57600080fd5b506105d761121a565b6040516105e49190612e4c565b60405180910390f35b3480156105f957600080fd5b50610614600480360381019061060f9190612a70565b6112ac565b005b34801561062257600080fd5b5061062b6112d6565b6040516106389190612f8e565b60405180910390f35b34801561064d57600080fd5b506106566112dc565b6040516106639190612f8e565b60405180910390f35b61068660048036038101906106819190612a43565b6112e2565b005b34801561069457600080fd5b506106af60048036038101906106aa91906128f3565b61172c565b005b3480156106bd57600080fd5b506106c6611837565b005b3480156106d457600080fd5b506106dd61185c565b6040516106ea9190612f8e565b60405180910390f35b61070d60048036038101906107089190612933565b611866565b005b61072960048036038101906107249190612870565b6118b0565b005b34801561073757600080fd5b50610740611923565b60405161074d9190612e4c565b60405180910390f35b34801561076257600080fd5b5061076b6119b1565b6040516107789190612f8e565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a39190612a43565b6119b7565b6040516107b59190612e4c565b60405180910390f35b3480156107ca57600080fd5b506107d3611b10565b6040516107e09190612f8e565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b91906129fa565b611b16565b005b34801561081e57600080fd5b50610827611b38565b6040516108349190612f8e565b60405180910390f35b34801561084957600080fd5b50610864600480360381019061085f91906127b0565b611b3e565b6040516108719190612f8e565b60405180910390f35b34801561088657600080fd5b506108a1600480360381019061089c91906127dd565b611b56565b6040516108ae9190612e31565b60405180910390f35b3480156108c357600080fd5b506108de60048036038101906108d991906129fa565b611bea565b005b3480156108ec57600080fd5b50610907600480360381019061090291906127b0565b611c0c565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109945750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6109a3611c90565b80600d60006101000a81548160ff02191690831515021790555050565b6060600280546109cf9061325e565b80601f01602080910402602001604051908101604052809291908181526020018280546109fb9061325e565b8015610a485780601f10610a1d57610100808354040283529160200191610a48565b820191906000526020600020905b815481529060010190602001808311610a2b57829003601f168201915b5050505050905090565b6000610a5d82611d0e565b610a93576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e8054610ade9061325e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0a9061325e565b8015610b575780601f10610b2c57610100808354040283529160200191610b57565b820191906000526020600020905b815481529060010190602001808311610b3a57829003601f168201915b505050505081565b6000610b6a82611111565b90508073ffffffffffffffffffffffffffffffffffffffff16610b8b611d6d565b73ffffffffffffffffffffffffffffffffffffffff1614610bee57610bb781610bb2611d6d565b611b56565b610bed576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610cad611d75565b6001546000540303905090565b6000610cc582611d7a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d2c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d3884611e48565b91509150610d4e8187610d49611d6d565b611e6f565b610d9a57610d6386610d5e611d6d565b611b56565b610d99576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e01576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e0e8686866001611eb3565b8015610e1957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ee785610ec3888887611eb9565b7c020000000000000000000000000000000000000000000000000000000017611ee1565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610f6f576000600185019050600060046000838152602001908152602001600020541415610f6d576000548114610f6c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fd78686866001611f0c565b505050505050565b600b5481565b610fed611c90565b6000610ff76111f0565b73ffffffffffffffffffffffffffffffffffffffff164760405161101a90612db5565b60006040518083038185875af1925050503d8060008114611057576040519150601f19603f3d011682016040523d82523d6000602084013e61105c565b606091505b505090508061106a57600080fd5b50565b611075611c90565b8060138190555050565b611087611c90565b80600f8190555050565b6110ac838383604051806020016040528060008152506118b0565b505050565b600d60019054906101000a900460ff1681565b6110cc611c90565b80600990805190602001906110e29291906125c4565b5050565b600d60009054906101000a900460ff1681565b60146020528060005260406000206000915090505481565b600061111c82611d7a565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561118b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111e4611c90565b6111ee6000611f12565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112299061325e565b80601f01602080910402602001604051908101604052809291908181526020018280546112559061325e565b80156112a25780601f10611277576101008083540402835291602001916112a2565b820191906000526020600020905b81548152906001019060200180831161128557829003601f168201915b5050505050905090565b6112b4611c90565b83601081905550826011819055508160128190555080600b8190555050505050565b60115481565b60125481565b6000601254905060006112f3610ca3565b90506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060135442101561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137590612f4e565b60405180910390fd5b600084116113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b890612ece565b60405180910390fd5b600f54600c546113d19190613174565b84836113dd9190613093565b111561141e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141590612e6e565b60405180910390fd5b601154601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561146c9190613093565b11156114ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a490612f6e565b60405180910390fd5b600d60009054906101000a900460ff16156114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f490612eae565b60405180910390fd5b60105481101561167757806010546115159190613174565b84106115d757828160105461152a9190613174565b611534919061311a565b8385611540919061311a565b61154a9190613174565b34101561158c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158390612eee565b60405180910390fd5b601054601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611672565b600034101561161b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161290612eee565b60405180910390fd5b83601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461166a9190613093565b925050819055505b6116c6565b8284611683919061311a565b3410156116c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bc90612eee565b60405180910390fd5b5b83601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117159190613093565b925050819055506117263385611fd8565b50505050565b8060076000611739611d6d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117e6611d6d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161182b9190612e31565b60405180910390a35050565b61183f611c90565b6001600d60016101000a81548160ff021916908315150217905550565b6000601054905090565b61186e611c90565b6000611878610ca3565b90506000821161188757600080fd5b600c5482826118969190613093565b11156118a157600080fd5b6118ab8383611fd8565b505050565b6118bb848484610cba565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461191d576118e684848484611ff6565b61191c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a80546119309061325e565b80601f016020809104026020016040519081016040528092919081815260200182805461195c9061325e565b80156119a95780601f1061197e576101008083540402835291602001916119a9565b820191906000526020600020905b81548152906001019060200180831161198c57829003601f168201915b505050505081565b60105481565b60606119c282611d0e565b611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f890612f2e565b60405180910390fd5b60001515600d60019054906101000a900460ff1615151415611aaf57600e8054611a2a9061325e565b80601f0160208091040260200160405190810160405280929190818152602001828054611a569061325e565b8015611aa35780601f10611a7857610100808354040283529160200191611aa3565b820191906000526020600020905b815481529060010190602001808311611a8657829003601f168201915b50505050509050611b0b565b6000611ab9612156565b90506000815111611ad95760405180602001604052806000815250611b07565b80611ae3846121e8565b600a604051602001611af793929190612d84565b6040516020818303038152906040525b9150505b919050565b600c5481565b611b1e611c90565b80600a9080519060200190611b349291906125c4565b5050565b600f5481565b60156020528060005260406000206000915090505481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bf2611c90565b80600e9080519060200190611c089291906125c4565b5050565b611c14611c90565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7b90612e8e565b60405180910390fd5b611c8d81611f12565b50565b611c98612349565b73ffffffffffffffffffffffffffffffffffffffff16611cb66111f0565b73ffffffffffffffffffffffffffffffffffffffff1614611d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0390612f0e565b60405180910390fd5b565b600081611d19611d75565b11158015611d28575060005482105b8015611d66575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611d89611d75565b11611e1157600054811015611e105760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611e0e575b6000811415611e04576004600083600190039350838152602001908152602001600020549050611dd9565b8092505050611e43565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611ed0868684612351565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ff282826040518060200160405280600081525061235a565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261201c611d6d565b8786866040518563ffffffff1660e01b815260040161203e9493929190612de5565b602060405180830381600087803b15801561205857600080fd5b505af192505050801561208957506040513d601f19601f8201168201806040525081019061208691906129cd565b60015b612103573d80600081146120b9576040519150601f19603f3d011682016040523d82523d6000602084013e6120be565b606091505b506000815114156120fb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600980546121659061325e565b80601f01602080910402602001604051908101604052809291908181526020018280546121919061325e565b80156121de5780601f106121b3576101008083540402835291602001916121de565b820191906000526020600020905b8154815290600101906020018083116121c157829003601f168201915b5050505050905090565b60606000821415612230576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612344565b600082905060005b6000821461226257808061224b906132c1565b915050600a8261225b91906130e9565b9150612238565b60008167ffffffffffffffff81111561227e5761227d6133f7565b5b6040519080825280601f01601f1916602001820160405280156122b05781602001600182028036833780820191505090505b5090505b6000851461233d576001826122c99190613174565b9150600a856122d8919061330a565b60306122e49190613093565b60f81b8183815181106122fa576122f96133c8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561233691906130e9565b94506122b4565b8093505050505b919050565b600033905090565b60009392505050565b61236483836123f7565b60008373ffffffffffffffffffffffffffffffffffffffff163b146123f257600080549050600083820390505b6123a46000868380600101945086611ff6565b6123da576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106123915781600054146123ef57600080fd5b50505b505050565b6000805490506000821415612438576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124456000848385611eb3565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506124bc836124ad6000866000611eb9565b6124b6856125b4565b17611ee1565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461255d57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612522565b506000821415612599576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506125af6000848385611f0c565b505050565b60006001821460e11b9050919050565b8280546125d09061325e565b90600052602060002090601f0160209004810192826125f25760008555612639565b82601f1061260b57805160ff1916838001178555612639565b82800160010185558215612639579182015b8281111561263857825182559160200191906001019061261d565b5b509050612646919061264a565b5090565b5b8082111561266357600081600090555060010161264b565b5090565b600061267a61267584612fce565b612fa9565b9050828152602081018484840111156126965761269561342b565b5b6126a184828561321c565b509392505050565b60006126bc6126b784612fff565b612fa9565b9050828152602081018484840111156126d8576126d761342b565b5b6126e384828561321c565b509392505050565b6000813590506126fa8161360b565b92915050565b60008135905061270f81613622565b92915050565b60008135905061272481613639565b92915050565b60008151905061273981613639565b92915050565b600082601f83011261275457612753613426565b5b8135612764848260208601612667565b91505092915050565b600082601f83011261278257612781613426565b5b81356127928482602086016126a9565b91505092915050565b6000813590506127aa81613650565b92915050565b6000602082840312156127c6576127c5613435565b5b60006127d4848285016126eb565b91505092915050565b600080604083850312156127f4576127f3613435565b5b6000612802858286016126eb565b9250506020612813858286016126eb565b9150509250929050565b60008060006060848603121561283657612835613435565b5b6000612844868287016126eb565b9350506020612855868287016126eb565b92505060406128668682870161279b565b9150509250925092565b6000806000806080858703121561288a57612889613435565b5b6000612898878288016126eb565b94505060206128a9878288016126eb565b93505060406128ba8782880161279b565b925050606085013567ffffffffffffffff8111156128db576128da613430565b5b6128e78782880161273f565b91505092959194509250565b6000806040838503121561290a57612909613435565b5b6000612918858286016126eb565b925050602061292985828601612700565b9150509250929050565b6000806040838503121561294a57612949613435565b5b6000612958858286016126eb565b92505060206129698582860161279b565b9150509250929050565b60006020828403121561298957612988613435565b5b600061299784828501612700565b91505092915050565b6000602082840312156129b6576129b5613435565b5b60006129c484828501612715565b91505092915050565b6000602082840312156129e3576129e2613435565b5b60006129f18482850161272a565b91505092915050565b600060208284031215612a1057612a0f613435565b5b600082013567ffffffffffffffff811115612a2e57612a2d613430565b5b612a3a8482850161276d565b91505092915050565b600060208284031215612a5957612a58613435565b5b6000612a678482850161279b565b91505092915050565b60008060008060808587031215612a8a57612a89613435565b5b6000612a988782880161279b565b9450506020612aa98782880161279b565b9350506040612aba8782880161279b565b9250506060612acb8782880161279b565b91505092959194509250565b612ae0816131a8565b82525050565b612aef816131ba565b82525050565b6000612b0082613045565b612b0a818561305b565b9350612b1a81856020860161322b565b612b238161343a565b840191505092915050565b6000612b3982613050565b612b438185613077565b9350612b5381856020860161322b565b612b5c8161343a565b840191505092915050565b6000612b7282613050565b612b7c8185613088565b9350612b8c81856020860161322b565b80840191505092915050565b60008154612ba58161325e565b612baf8186613088565b94506001821660008114612bca5760018114612bdb57612c0e565b60ff19831686528186019350612c0e565b612be485613030565b60005b83811015612c0657815481890152600182019150602081019050612be7565b838801955050505b50505092915050565b6000612c24600783613077565b9150612c2f8261344b565b602082019050919050565b6000612c47602683613077565b9150612c5282613474565b604082019050919050565b6000612c6a600c83613077565b9150612c75826134c3565b602082019050919050565b6000612c8d601783613077565b9150612c98826134ec565b602082019050919050565b6000612cb0602083613077565b9150612cbb82613515565b602082019050919050565b6000612cd3602083613077565b9150612cde8261353e565b602082019050919050565b6000612cf6602f83613077565b9150612d0182613567565b604082019050919050565b6000612d1960008361306c565b9150612d24826135b6565b600082019050919050565b6000612d3c601283613077565b9150612d47826135b9565b602082019050919050565b6000612d5f600f83613077565b9150612d6a826135e2565b602082019050919050565b612d7e81613212565b82525050565b6000612d908286612b67565b9150612d9c8285612b67565b9150612da88284612b98565b9150819050949350505050565b6000612dc082612d0c565b9150819050919050565b6000602082019050612ddf6000830184612ad7565b92915050565b6000608082019050612dfa6000830187612ad7565b612e076020830186612ad7565b612e146040830185612d75565b8181036060830152612e268184612af5565b905095945050505050565b6000602082019050612e466000830184612ae6565b92915050565b60006020820190508181036000830152612e668184612b2e565b905092915050565b60006020820190508181036000830152612e8781612c17565b9050919050565b60006020820190508181036000830152612ea781612c3a565b9050919050565b60006020820190508181036000830152612ec781612c5d565b9050919050565b60006020820190508181036000830152612ee781612c80565b9050919050565b60006020820190508181036000830152612f0781612ca3565b9050919050565b60006020820190508181036000830152612f2781612cc6565b9050919050565b60006020820190508181036000830152612f4781612ce9565b9050919050565b60006020820190508181036000830152612f6781612d2f565b9050919050565b60006020820190508181036000830152612f8781612d52565b9050919050565b6000602082019050612fa36000830184612d75565b92915050565b6000612fb3612fc4565b9050612fbf8282613290565b919050565b6000604051905090565b600067ffffffffffffffff821115612fe957612fe86133f7565b5b612ff28261343a565b9050602081019050919050565b600067ffffffffffffffff82111561301a576130196133f7565b5b6130238261343a565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061309e82613212565b91506130a983613212565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130de576130dd61333b565b5b828201905092915050565b60006130f482613212565b91506130ff83613212565b92508261310f5761310e61336a565b5b828204905092915050565b600061312582613212565b915061313083613212565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156131695761316861333b565b5b828202905092915050565b600061317f82613212565b915061318a83613212565b92508282101561319d5761319c61333b565b5b828203905092915050565b60006131b3826131f2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561324957808201518184015260208101905061322e565b83811115613258576000848401525b50505050565b6000600282049050600182168061327657607f821691505b6020821081141561328a57613289613399565b5b50919050565b6132998261343a565b810181811067ffffffffffffffff821117156132b8576132b76133f7565b5b80604052505050565b60006132cc82613212565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156132ff576132fe61333b565b5b600182019050919050565b600061331582613212565b915061332083613212565b9250826133305761332f61336a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f206d6f726500000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f7363616c65207061757365640000000000000000000000000000000000000000600082015250565b7f6d696e7420416d6f756e74206c657373207468616e2031000000000000000000600082015250565b7f506c656173652073656e64207468652065786163742045544820616d6f756e74600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f6e6f74207468652072696768742074696d650000000000000000000000000000600082015250565b7f706c61796572206d6178206d696e740000000000000000000000000000000000600082015250565b613614816131a8565b811461361f57600080fd5b50565b61362b816131ba565b811461363657600080fd5b50565b613642816131c6565b811461364d57600080fd5b50565b61365981613212565b811461366457600080fd5b5056fea2646970667358221220264bba966a7f7312869225092b809be8a17587af5b90263b6ebf21b3030c288664736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000c4172742047616d626c6572730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000241470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d654d7446595954566342653273677471555153576936574e744833326f6354466e76746477555a56656843692f000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d654d7446595954566342653273677471555153576936574e744833326f6354466e76746477555a56656843690000000000000000000000

Deployed Bytecode

0x6080604052600436106102465760003560e01c80638da5cb5b11610139578063b88d4fde116100b6578063da3ef23f1161007a578063da3ef23f146107e9578063e3e3c66514610812578063e80509241461083d578063e985e9c51461087a578063f2c4ce1e146108b7578063f2fde38b146108e057610246565b8063b88d4fde1461070f578063c66828621461072b578063c7c39ffc14610756578063c87b56dd14610781578063d5abeb01146107be57610246565b8063a0712d68116100fd578063a0712d681461066c578063a22cb46514610688578063a475b5dd146106b1578063a7027357146106c8578063b3f50e72146106f357610246565b80638da5cb5b1461059757806395d89b41146105c257806397084843146105ed5780639ef2d87a14610616578063a035b1fe1461064157610246565b80633e0a322d116101c75780635c975abb1161018b5780635c975abb1461049e5780636246d7fb146104c95780636352211e1461050657806370a0823114610543578063715018a61461058057610246565b80633e0a322d146103dc5780633e8f7e9f1461040557806342842e0e1461042e578063518302271461044a57806355f804b31461047557610246565b8063095ea7b31161020e578063095ea7b31461034457806318160ddd1461036057806323b872dd1461038b578063333e44e6146103a75780633ccfd60b146103d257610246565b806301ffc9a71461024b57806302329a291461028857806306fdde03146102b1578063081812fc146102dc578063081c8c4414610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906129a0565b610909565b60405161027f9190612e31565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa9190612973565b61099b565b005b3480156102bd57600080fd5b506102c66109c0565b6040516102d39190612e4c565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190612a43565b610a52565b6040516103109190612dca565b60405180910390f35b34801561032557600080fd5b5061032e610ad1565b60405161033b9190612e4c565b60405180910390f35b61035e60048036038101906103599190612933565b610b5f565b005b34801561036c57600080fd5b50610375610ca3565b6040516103829190612f8e565b60405180910390f35b6103a560048036038101906103a0919061281d565b610cba565b005b3480156103b357600080fd5b506103bc610fdf565b6040516103c99190612f8e565b60405180910390f35b6103da610fe5565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190612a43565b61106d565b005b34801561041157600080fd5b5061042c60048036038101906104279190612a43565b61107f565b005b6104486004803603810190610443919061281d565b611091565b005b34801561045657600080fd5b5061045f6110b1565b60405161046c9190612e31565b60405180910390f35b34801561048157600080fd5b5061049c600480360381019061049791906129fa565b6110c4565b005b3480156104aa57600080fd5b506104b36110e6565b6040516104c09190612e31565b60405180910390f35b3480156104d557600080fd5b506104f060048036038101906104eb91906127b0565b6110f9565b6040516104fd9190612f8e565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190612a43565b611111565b60405161053a9190612dca565b60405180910390f35b34801561054f57600080fd5b5061056a600480360381019061056591906127b0565b611123565b6040516105779190612f8e565b60405180910390f35b34801561058c57600080fd5b506105956111dc565b005b3480156105a357600080fd5b506105ac6111f0565b6040516105b99190612dca565b60405180910390f35b3480156105ce57600080fd5b506105d761121a565b6040516105e49190612e4c565b60405180910390f35b3480156105f957600080fd5b50610614600480360381019061060f9190612a70565b6112ac565b005b34801561062257600080fd5b5061062b6112d6565b6040516106389190612f8e565b60405180910390f35b34801561064d57600080fd5b506106566112dc565b6040516106639190612f8e565b60405180910390f35b61068660048036038101906106819190612a43565b6112e2565b005b34801561069457600080fd5b506106af60048036038101906106aa91906128f3565b61172c565b005b3480156106bd57600080fd5b506106c6611837565b005b3480156106d457600080fd5b506106dd61185c565b6040516106ea9190612f8e565b60405180910390f35b61070d60048036038101906107089190612933565b611866565b005b61072960048036038101906107249190612870565b6118b0565b005b34801561073757600080fd5b50610740611923565b60405161074d9190612e4c565b60405180910390f35b34801561076257600080fd5b5061076b6119b1565b6040516107789190612f8e565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a39190612a43565b6119b7565b6040516107b59190612e4c565b60405180910390f35b3480156107ca57600080fd5b506107d3611b10565b6040516107e09190612f8e565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b91906129fa565b611b16565b005b34801561081e57600080fd5b50610827611b38565b6040516108349190612f8e565b60405180910390f35b34801561084957600080fd5b50610864600480360381019061085f91906127b0565b611b3e565b6040516108719190612f8e565b60405180910390f35b34801561088657600080fd5b506108a1600480360381019061089c91906127dd565b611b56565b6040516108ae9190612e31565b60405180910390f35b3480156108c357600080fd5b506108de60048036038101906108d991906129fa565b611bea565b005b3480156108ec57600080fd5b50610907600480360381019061090291906127b0565b611c0c565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109945750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6109a3611c90565b80600d60006101000a81548160ff02191690831515021790555050565b6060600280546109cf9061325e565b80601f01602080910402602001604051908101604052809291908181526020018280546109fb9061325e565b8015610a485780601f10610a1d57610100808354040283529160200191610a48565b820191906000526020600020905b815481529060010190602001808311610a2b57829003601f168201915b5050505050905090565b6000610a5d82611d0e565b610a93576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e8054610ade9061325e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0a9061325e565b8015610b575780601f10610b2c57610100808354040283529160200191610b57565b820191906000526020600020905b815481529060010190602001808311610b3a57829003601f168201915b505050505081565b6000610b6a82611111565b90508073ffffffffffffffffffffffffffffffffffffffff16610b8b611d6d565b73ffffffffffffffffffffffffffffffffffffffff1614610bee57610bb781610bb2611d6d565b611b56565b610bed576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610cad611d75565b6001546000540303905090565b6000610cc582611d7a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d2c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d3884611e48565b91509150610d4e8187610d49611d6d565b611e6f565b610d9a57610d6386610d5e611d6d565b611b56565b610d99576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e01576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e0e8686866001611eb3565b8015610e1957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ee785610ec3888887611eb9565b7c020000000000000000000000000000000000000000000000000000000017611ee1565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610f6f576000600185019050600060046000838152602001908152602001600020541415610f6d576000548114610f6c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fd78686866001611f0c565b505050505050565b600b5481565b610fed611c90565b6000610ff76111f0565b73ffffffffffffffffffffffffffffffffffffffff164760405161101a90612db5565b60006040518083038185875af1925050503d8060008114611057576040519150601f19603f3d011682016040523d82523d6000602084013e61105c565b606091505b505090508061106a57600080fd5b50565b611075611c90565b8060138190555050565b611087611c90565b80600f8190555050565b6110ac838383604051806020016040528060008152506118b0565b505050565b600d60019054906101000a900460ff1681565b6110cc611c90565b80600990805190602001906110e29291906125c4565b5050565b600d60009054906101000a900460ff1681565b60146020528060005260406000206000915090505481565b600061111c82611d7a565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561118b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111e4611c90565b6111ee6000611f12565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112299061325e565b80601f01602080910402602001604051908101604052809291908181526020018280546112559061325e565b80156112a25780601f10611277576101008083540402835291602001916112a2565b820191906000526020600020905b81548152906001019060200180831161128557829003601f168201915b5050505050905090565b6112b4611c90565b83601081905550826011819055508160128190555080600b8190555050505050565b60115481565b60125481565b6000601254905060006112f3610ca3565b90506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060135442101561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137590612f4e565b60405180910390fd5b600084116113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b890612ece565b60405180910390fd5b600f54600c546113d19190613174565b84836113dd9190613093565b111561141e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141590612e6e565b60405180910390fd5b601154601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561146c9190613093565b11156114ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a490612f6e565b60405180910390fd5b600d60009054906101000a900460ff16156114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f490612eae565b60405180910390fd5b60105481101561167757806010546115159190613174565b84106115d757828160105461152a9190613174565b611534919061311a565b8385611540919061311a565b61154a9190613174565b34101561158c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158390612eee565b60405180910390fd5b601054601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611672565b600034101561161b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161290612eee565b60405180910390fd5b83601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461166a9190613093565b925050819055505b6116c6565b8284611683919061311a565b3410156116c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bc90612eee565b60405180910390fd5b5b83601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117159190613093565b925050819055506117263385611fd8565b50505050565b8060076000611739611d6d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117e6611d6d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161182b9190612e31565b60405180910390a35050565b61183f611c90565b6001600d60016101000a81548160ff021916908315150217905550565b6000601054905090565b61186e611c90565b6000611878610ca3565b90506000821161188757600080fd5b600c5482826118969190613093565b11156118a157600080fd5b6118ab8383611fd8565b505050565b6118bb848484610cba565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461191d576118e684848484611ff6565b61191c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a80546119309061325e565b80601f016020809104026020016040519081016040528092919081815260200182805461195c9061325e565b80156119a95780601f1061197e576101008083540402835291602001916119a9565b820191906000526020600020905b81548152906001019060200180831161198c57829003601f168201915b505050505081565b60105481565b60606119c282611d0e565b611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f890612f2e565b60405180910390fd5b60001515600d60019054906101000a900460ff1615151415611aaf57600e8054611a2a9061325e565b80601f0160208091040260200160405190810160405280929190818152602001828054611a569061325e565b8015611aa35780601f10611a7857610100808354040283529160200191611aa3565b820191906000526020600020905b815481529060010190602001808311611a8657829003601f168201915b50505050509050611b0b565b6000611ab9612156565b90506000815111611ad95760405180602001604052806000815250611b07565b80611ae3846121e8565b600a604051602001611af793929190612d84565b6040516020818303038152906040525b9150505b919050565b600c5481565b611b1e611c90565b80600a9080519060200190611b349291906125c4565b5050565b600f5481565b60156020528060005260406000206000915090505481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bf2611c90565b80600e9080519060200190611c089291906125c4565b5050565b611c14611c90565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7b90612e8e565b60405180910390fd5b611c8d81611f12565b50565b611c98612349565b73ffffffffffffffffffffffffffffffffffffffff16611cb66111f0565b73ffffffffffffffffffffffffffffffffffffffff1614611d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0390612f0e565b60405180910390fd5b565b600081611d19611d75565b11158015611d28575060005482105b8015611d66575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611d89611d75565b11611e1157600054811015611e105760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611e0e575b6000811415611e04576004600083600190039350838152602001908152602001600020549050611dd9565b8092505050611e43565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611ed0868684612351565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ff282826040518060200160405280600081525061235a565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261201c611d6d565b8786866040518563ffffffff1660e01b815260040161203e9493929190612de5565b602060405180830381600087803b15801561205857600080fd5b505af192505050801561208957506040513d601f19601f8201168201806040525081019061208691906129cd565b60015b612103573d80600081146120b9576040519150601f19603f3d011682016040523d82523d6000602084013e6120be565b606091505b506000815114156120fb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600980546121659061325e565b80601f01602080910402602001604051908101604052809291908181526020018280546121919061325e565b80156121de5780601f106121b3576101008083540402835291602001916121de565b820191906000526020600020905b8154815290600101906020018083116121c157829003601f168201915b5050505050905090565b60606000821415612230576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612344565b600082905060005b6000821461226257808061224b906132c1565b915050600a8261225b91906130e9565b9150612238565b60008167ffffffffffffffff81111561227e5761227d6133f7565b5b6040519080825280601f01601f1916602001820160405280156122b05781602001600182028036833780820191505090505b5090505b6000851461233d576001826122c99190613174565b9150600a856122d8919061330a565b60306122e49190613093565b60f81b8183815181106122fa576122f96133c8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561233691906130e9565b94506122b4565b8093505050505b919050565b600033905090565b60009392505050565b61236483836123f7565b60008373ffffffffffffffffffffffffffffffffffffffff163b146123f257600080549050600083820390505b6123a46000868380600101945086611ff6565b6123da576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106123915781600054146123ef57600080fd5b50505b505050565b6000805490506000821415612438576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124456000848385611eb3565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506124bc836124ad6000866000611eb9565b6124b6856125b4565b17611ee1565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461255d57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612522565b506000821415612599576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506125af6000848385611f0c565b505050565b60006001821460e11b9050919050565b8280546125d09061325e565b90600052602060002090601f0160209004810192826125f25760008555612639565b82601f1061260b57805160ff1916838001178555612639565b82800160010185558215612639579182015b8281111561263857825182559160200191906001019061261d565b5b509050612646919061264a565b5090565b5b8082111561266357600081600090555060010161264b565b5090565b600061267a61267584612fce565b612fa9565b9050828152602081018484840111156126965761269561342b565b5b6126a184828561321c565b509392505050565b60006126bc6126b784612fff565b612fa9565b9050828152602081018484840111156126d8576126d761342b565b5b6126e384828561321c565b509392505050565b6000813590506126fa8161360b565b92915050565b60008135905061270f81613622565b92915050565b60008135905061272481613639565b92915050565b60008151905061273981613639565b92915050565b600082601f83011261275457612753613426565b5b8135612764848260208601612667565b91505092915050565b600082601f83011261278257612781613426565b5b81356127928482602086016126a9565b91505092915050565b6000813590506127aa81613650565b92915050565b6000602082840312156127c6576127c5613435565b5b60006127d4848285016126eb565b91505092915050565b600080604083850312156127f4576127f3613435565b5b6000612802858286016126eb565b9250506020612813858286016126eb565b9150509250929050565b60008060006060848603121561283657612835613435565b5b6000612844868287016126eb565b9350506020612855868287016126eb565b92505060406128668682870161279b565b9150509250925092565b6000806000806080858703121561288a57612889613435565b5b6000612898878288016126eb565b94505060206128a9878288016126eb565b93505060406128ba8782880161279b565b925050606085013567ffffffffffffffff8111156128db576128da613430565b5b6128e78782880161273f565b91505092959194509250565b6000806040838503121561290a57612909613435565b5b6000612918858286016126eb565b925050602061292985828601612700565b9150509250929050565b6000806040838503121561294a57612949613435565b5b6000612958858286016126eb565b92505060206129698582860161279b565b9150509250929050565b60006020828403121561298957612988613435565b5b600061299784828501612700565b91505092915050565b6000602082840312156129b6576129b5613435565b5b60006129c484828501612715565b91505092915050565b6000602082840312156129e3576129e2613435565b5b60006129f18482850161272a565b91505092915050565b600060208284031215612a1057612a0f613435565b5b600082013567ffffffffffffffff811115612a2e57612a2d613430565b5b612a3a8482850161276d565b91505092915050565b600060208284031215612a5957612a58613435565b5b6000612a678482850161279b565b91505092915050565b60008060008060808587031215612a8a57612a89613435565b5b6000612a988782880161279b565b9450506020612aa98782880161279b565b9350506040612aba8782880161279b565b9250506060612acb8782880161279b565b91505092959194509250565b612ae0816131a8565b82525050565b612aef816131ba565b82525050565b6000612b0082613045565b612b0a818561305b565b9350612b1a81856020860161322b565b612b238161343a565b840191505092915050565b6000612b3982613050565b612b438185613077565b9350612b5381856020860161322b565b612b5c8161343a565b840191505092915050565b6000612b7282613050565b612b7c8185613088565b9350612b8c81856020860161322b565b80840191505092915050565b60008154612ba58161325e565b612baf8186613088565b94506001821660008114612bca5760018114612bdb57612c0e565b60ff19831686528186019350612c0e565b612be485613030565b60005b83811015612c0657815481890152600182019150602081019050612be7565b838801955050505b50505092915050565b6000612c24600783613077565b9150612c2f8261344b565b602082019050919050565b6000612c47602683613077565b9150612c5282613474565b604082019050919050565b6000612c6a600c83613077565b9150612c75826134c3565b602082019050919050565b6000612c8d601783613077565b9150612c98826134ec565b602082019050919050565b6000612cb0602083613077565b9150612cbb82613515565b602082019050919050565b6000612cd3602083613077565b9150612cde8261353e565b602082019050919050565b6000612cf6602f83613077565b9150612d0182613567565b604082019050919050565b6000612d1960008361306c565b9150612d24826135b6565b600082019050919050565b6000612d3c601283613077565b9150612d47826135b9565b602082019050919050565b6000612d5f600f83613077565b9150612d6a826135e2565b602082019050919050565b612d7e81613212565b82525050565b6000612d908286612b67565b9150612d9c8285612b67565b9150612da88284612b98565b9150819050949350505050565b6000612dc082612d0c565b9150819050919050565b6000602082019050612ddf6000830184612ad7565b92915050565b6000608082019050612dfa6000830187612ad7565b612e076020830186612ad7565b612e146040830185612d75565b8181036060830152612e268184612af5565b905095945050505050565b6000602082019050612e466000830184612ae6565b92915050565b60006020820190508181036000830152612e668184612b2e565b905092915050565b60006020820190508181036000830152612e8781612c17565b9050919050565b60006020820190508181036000830152612ea781612c3a565b9050919050565b60006020820190508181036000830152612ec781612c5d565b9050919050565b60006020820190508181036000830152612ee781612c80565b9050919050565b60006020820190508181036000830152612f0781612ca3565b9050919050565b60006020820190508181036000830152612f2781612cc6565b9050919050565b60006020820190508181036000830152612f4781612ce9565b9050919050565b60006020820190508181036000830152612f6781612d2f565b9050919050565b60006020820190508181036000830152612f8781612d52565b9050919050565b6000602082019050612fa36000830184612d75565b92915050565b6000612fb3612fc4565b9050612fbf8282613290565b919050565b6000604051905090565b600067ffffffffffffffff821115612fe957612fe86133f7565b5b612ff28261343a565b9050602081019050919050565b600067ffffffffffffffff82111561301a576130196133f7565b5b6130238261343a565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061309e82613212565b91506130a983613212565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130de576130dd61333b565b5b828201905092915050565b60006130f482613212565b91506130ff83613212565b92508261310f5761310e61336a565b5b828204905092915050565b600061312582613212565b915061313083613212565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156131695761316861333b565b5b828202905092915050565b600061317f82613212565b915061318a83613212565b92508282101561319d5761319c61333b565b5b828203905092915050565b60006131b3826131f2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561324957808201518184015260208101905061322e565b83811115613258576000848401525b50505050565b6000600282049050600182168061327657607f821691505b6020821081141561328a57613289613399565b5b50919050565b6132998261343a565b810181811067ffffffffffffffff821117156132b8576132b76133f7565b5b80604052505050565b60006132cc82613212565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156132ff576132fe61333b565b5b600182019050919050565b600061331582613212565b915061332083613212565b9250826133305761332f61336a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f206d6f726500000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f7363616c65207061757365640000000000000000000000000000000000000000600082015250565b7f6d696e7420416d6f756e74206c657373207468616e2031000000000000000000600082015250565b7f506c656173652073656e64207468652065786163742045544820616d6f756e74600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f6e6f74207468652072696768742074696d650000000000000000000000000000600082015250565b7f706c61796572206d6178206d696e740000000000000000000000000000000000600082015250565b613614816131a8565b811461361f57600080fd5b50565b61362b816131ba565b811461363657600080fd5b50565b613642816131c6565b811461364d57600080fd5b50565b61365981613212565b811461366457600080fd5b5056fea2646970667358221220264bba966a7f7312869225092b809be8a17587af5b90263b6ebf21b3030c288664736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000c4172742047616d626c6572730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000241470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d654d7446595954566342653273677471555153576936574e744833326f6354466e76746477555a56656843692f000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d654d7446595954566342653273677471555153576936574e744833326f6354466e76746477555a56656843690000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Art Gamblers
Arg [1] : _symbol (string): AG
Arg [2] : _initBaseURI (string): ipfs://QmeMtFYYTVcBe2sgtqUQSWi6WNtH32ocTFnvtdwUZVehCi/
Arg [3] : _initNotRevealedUri (string): ipfs://QmeMtFYYTVcBe2sgtqUQSWi6WNtH32ocTFnvtdwUZVehCi

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [5] : 4172742047616d626c6572730000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [7] : 4147000000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [9] : 697066733a2f2f516d654d744659595456634265327367747155515357693657
Arg [10] : 4e744833326f6354466e76746477555a56656843692f00000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [12] : 697066733a2f2f516d654d744659595456634265327367747155515357693657
Arg [13] : 4e744833326f6354466e76746477555a56656843690000000000000000000000


Deployed Bytecode Sourcemap

57634:5699:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24528:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62694:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25430:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31921:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57916:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31354:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21181:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35560:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57774:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62774:556;;;:::i;:::-;;58537:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62151:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38481:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57883:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62462:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57852:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58173:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26823:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22365:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5307:103;;;;;;;;;;;;;:::i;:::-;;4659:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25606:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58625:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58020:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58053:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59010:1890;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32479:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62078:65;;;;;;;;;;;;;:::i;:::-;;62240:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60912:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39272:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57732:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57986:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61559:497;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57811:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62566:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57953:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58224:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32870:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62336:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5565:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24528:639;24613:4;24952:10;24937:25;;:11;:25;;;;:102;;;;25029:10;25014:25;;:11;:25;;;;24937:102;:179;;;;25106:10;25091:25;;:11;:25;;;;24937:179;24917:199;;24528:639;;;:::o;62694:73::-;4545:13;:11;:13::i;:::-;62755:6:::1;62746;;:15;;;;;;;;;;;;;;;;;;62694:73:::0;:::o;25430:100::-;25484:13;25517:5;25510:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25430:100;:::o;31921:218::-;31997:7;32022:16;32030:7;32022;:16::i;:::-;32017:64;;32047:34;;;;;;;;;;;;;;32017:64;32101:15;:24;32117:7;32101:24;;;;;;;;;;;:30;;;;;;;;;;;;32094:37;;31921:218;;;:::o;57916:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31354:408::-;31443:13;31459:16;31467:7;31459;:16::i;:::-;31443:32;;31515:5;31492:28;;:19;:17;:19::i;:::-;:28;;;31488:175;;31540:44;31557:5;31564:19;:17;:19::i;:::-;31540:16;:44::i;:::-;31535:128;;31612:35;;;;;;;;;;;;;;31535:128;31488:175;31708:2;31675:15;:24;31691:7;31675:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;31746:7;31742:2;31726:28;;31735:5;31726:28;;;;;;;;;;;;31432:330;31354:408;;:::o;21181:323::-;21242:7;21470:15;:13;:15::i;:::-;21455:12;;21439:13;;:28;:46;21432:53;;21181:323;:::o;35560:2825::-;35702:27;35732;35751:7;35732:18;:27::i;:::-;35702:57;;35817:4;35776:45;;35792:19;35776:45;;;35772:86;;35830:28;;;;;;;;;;;;;;35772:86;35872:27;35901:23;35928:35;35955:7;35928:26;:35::i;:::-;35871:92;;;;36063:68;36088:15;36105:4;36111:19;:17;:19::i;:::-;36063:24;:68::i;:::-;36058:180;;36151:43;36168:4;36174:19;:17;:19::i;:::-;36151:16;:43::i;:::-;36146:92;;36203:35;;;;;;;;;;;;;;36146:92;36058:180;36269:1;36255:16;;:2;:16;;;36251:52;;;36280:23;;;;;;;;;;;;;;36251:52;36316:43;36338:4;36344:2;36348:7;36357:1;36316:21;:43::i;:::-;36452:15;36449:160;;;36592:1;36571:19;36564:30;36449:160;36989:18;:24;37008:4;36989:24;;;;;;;;;;;;;;;;36987:26;;;;;;;;;;;;37058:18;:22;37077:2;37058:22;;;;;;;;;;;;;;;;37056:24;;;;;;;;;;;37380:146;37417:2;37466:45;37481:4;37487:2;37491:19;37466:14;:45::i;:::-;17580:8;37438:73;37380:18;:146::i;:::-;37351:17;:26;37369:7;37351:26;;;;;;;;;;;:175;;;;37697:1;17580:8;37646:19;:47;:52;37642:627;;;37719:19;37751:1;37741:7;:11;37719:33;;37908:1;37874:17;:30;37892:11;37874:30;;;;;;;;;;;;:35;37870:384;;;38012:13;;37997:11;:28;37993:242;;38192:19;38159:17;:30;38177:11;38159:30;;;;;;;;;;;:52;;;;37993:242;37870:384;37700:569;37642:627;38316:7;38312:2;38297:27;;38306:4;38297:27;;;;;;;;;;;;38335:42;38356:4;38362:2;38366:7;38375:1;38335:20;:42::i;:::-;35691:2694;;;35560:2825;;;:::o;57774:32::-;;;;:::o;62774:556::-;4545:13;:11;:13::i;:::-;63152:7:::1;63173;:5;:7::i;:::-;63165:21;;63194;63165:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63151:69;;;63235:2;63227:11;;;::::0;::::1;;62819:511;62774:556::o:0;58537:80::-;4545:13;:11;:13::i;:::-;58607:4:::1;58594:10;:17;;;;58537:80:::0;:::o;62151:81::-;4545:13;:11;:13::i;:::-;62221:5:::1;62209:9;:17;;;;62151:81:::0;:::o;38481:193::-;38627:39;38644:4;38650:2;38654:7;38627:39;;;;;;;;;;;;:16;:39::i;:::-;38481:193;;;:::o;57883:28::-;;;;;;;;;;;;;:::o;62462:98::-;4545:13;:11;:13::i;:::-;62543:11:::1;62533:7;:21;;;;;;;;;;;;:::i;:::-;;62462:98:::0;:::o;57852:26::-;;;;;;;;;;;;;:::o;58173:46::-;;;;;;;;;;;;;;;;;:::o;26823:152::-;26895:7;26938:27;26957:7;26938:18;:27::i;:::-;26915:52;;26823:152;;;:::o;22365:233::-;22437:7;22478:1;22461:19;;:5;:19;;;22457:60;;;22489:28;;;;;;;;;;;;;;22457:60;16524:13;22535:18;:25;22554:5;22535:25;;;;;;;;;;;;;;;;:55;22528:62;;22365:233;;;:::o;5307:103::-;4545:13;:11;:13::i;:::-;5372:30:::1;5399:1;5372:18;:30::i;:::-;5307:103::o:0;4659:87::-;4705:7;4732:6;;;;;;;;;;;4725:13;;4659:87;:::o;25606:104::-;25662:13;25695:7;25688:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25606:104;:::o;58625:241::-;4545:13;:11;:13::i;:::-;58769:11:::1;58756:10;:24;;;;58798:9;58787:8;:20;;;;58822:6;58814:5;:14;;;;58847:13;58835:9;:25;;;;58625:241:::0;;;;:::o;58020:28::-;;;;:::o;58053:34::-;;;;:::o;59010:1890::-;59063:12;59078:5;;59063:20;;59096:14;59113:13;:11;:13::i;:::-;59096:30;;59133:27;59163:13;:25;59177:10;59163:25;;;;;;;;;;;;;;;;59133:55;;59224:10;;59205:15;:29;;59197:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;59279:1;59271:5;:9;59263:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;59353:9;;59341;;:21;;;;:::i;:::-;59331:5;59322:6;:14;;;;:::i;:::-;:41;;59314:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;59424:8;;59397:11;:23;59409:10;59397:23;;;;;;;;;;;;;;;;59389:5;:31;;;;:::i;:::-;:43;;59381:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;59467:6;;;;;;;;;;;59466:7;59458:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;60224:10;;60202:19;:32;60197:618;;;60279:19;60266:10;;:32;;;;:::i;:::-;60256:5;:43;60253:438;;60406:4;60383:19;60370:10;;:32;;;;:::i;:::-;60369:41;;;;:::i;:::-;60360:4;60352:5;:12;;;;:::i;:::-;60351:60;;;;:::i;:::-;60338:9;:73;;60330:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;60492:10;;60464:13;:25;60478:10;60464:25;;;;;;;;;;;;;;;:38;;;;60253:438;;;60587:1;60574:9;:14;;60566:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60670:5;60641:13;:25;60655:10;60641:25;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;60253:438;60197:618;;;60764:4;60756:5;:12;;;;:::i;:::-;60743:9;:25;;60735:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;60197:618;60850:5;60823:11;:23;60835:10;60823:23;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;60864:28;60874:10;60886:5;60864:9;:28::i;:::-;59056:1844;;;59010:1890;:::o;32479:234::-;32626:8;32574:18;:39;32593:19;:17;:19::i;:::-;32574:39;;;;;;;;;;;;;;;:49;32614:8;32574:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;32686:8;32650:55;;32665:19;:17;:19::i;:::-;32650:55;;;32696:8;32650:55;;;;;;:::i;:::-;;;;;;;;32479:234;;:::o;62078:65::-;4545:13;:11;:13::i;:::-;62133:4:::1;62122:8;;:15;;;;;;;;;;;;;;;;;;62078:65::o:0;62240:90::-;62289:7;62314:10;;62307:17;;62240:90;:::o;60912:245::-;4545:13;:11;:13::i;:::-;60995:14:::1;61012:13;:11;:13::i;:::-;60995:30;;61053:1;61040:10;:14;61032:23;;;::::0;::::1;;61093:9;;61079:10;61070:6;:19;;;;:::i;:::-;:32;;61062:41;;;::::0;::::1;;61120:29;61130:6;61138:10;61120:9;:29::i;:::-;60988:169;60912:245:::0;;:::o;39272:407::-;39447:31;39460:4;39466:2;39470:7;39447:12;:31::i;:::-;39511:1;39493:2;:14;;;:19;39489:183;;39532:56;39563:4;39569:2;39573:7;39582:5;39532:30;:56::i;:::-;39527:145;;39616:40;;;;;;;;;;;;;;39527:145;39489:183;39272:407;;;;:::o;57732:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57986:29::-;;;;:::o;61559:497::-;61657:13;61698:16;61706:7;61698;:16::i;:::-;61682:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;61807:5;61795:17;;:8;;;;;;;;;;;:17;;;61792:62;;;61832:14;61825:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61792:62;61862:28;61893:10;:8;:10::i;:::-;61862:41;;61948:1;61923:14;61917:28;:32;:133;;;;;;;;;;;;;;;;;61985:14;62001:18;:7;:16;:18::i;:::-;62021:13;61968:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61917:133;61910:140;;;61559:497;;;;:::o;57811:32::-;;;;:::o;62566:122::-;4545:13;:11;:13::i;:::-;62665:17:::1;62649:13;:33;;;;;;;;;;;;:::i;:::-;;62566:122:::0;:::o;57953:28::-;;;;:::o;58224:48::-;;;;;;;;;;;;;;;;;:::o;32870:164::-;32967:4;32991:18;:25;33010:5;32991:25;;;;;;;;;;;;;;;:35;33017:8;32991:35;;;;;;;;;;;;;;;;;;;;;;;;;32984:42;;32870:164;;;;:::o;62336:120::-;4545:13;:11;:13::i;:::-;62435:15:::1;62418:14;:32;;;;;;;;;;;;:::i;:::-;;62336:120:::0;:::o;5565:201::-;4545:13;:11;:13::i;:::-;5674:1:::1;5654:22;;:8;:22;;;;5646:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5730:28;5749:8;5730:18;:28::i;:::-;5565:201:::0;:::o;4824:132::-;4899:12;:10;:12::i;:::-;4888:23;;:7;:5;:7::i;:::-;:23;;;4880:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4824:132::o;33292:282::-;33357:4;33413:7;33394:15;:13;:15::i;:::-;:26;;:66;;;;;33447:13;;33437:7;:23;33394:66;:153;;;;;33546:1;17300:8;33498:17;:26;33516:7;33498:26;;;;;;;;;;;;:44;:49;33394:153;33374:173;;33292:282;;;:::o;55600:105::-;55660:7;55687:10;55680:17;;55600:105;:::o;20697:92::-;20753:7;20697:92;:::o;27978:1275::-;28045:7;28065:12;28080:7;28065:22;;28148:4;28129:15;:13;:15::i;:::-;:23;28125:1061;;28182:13;;28175:4;:20;28171:1015;;;28220:14;28237:17;:23;28255:4;28237:23;;;;;;;;;;;;28220:40;;28354:1;17300:8;28326:6;:24;:29;28322:845;;;28991:113;29008:1;28998:6;:11;28991:113;;;29051:17;:25;29069:6;;;;;;;29051:25;;;;;;;;;;;;29042:34;;28991:113;;;29137:6;29130:13;;;;;;28322:845;28197:989;28171:1015;28125:1061;29214:31;;;;;;;;;;;;;;27978:1275;;;;:::o;34455:485::-;34557:27;34586:23;34627:38;34668:15;:24;34684:7;34668:24;;;;;;;;;;;34627:65;;34845:18;34822:41;;34902:19;34896:26;34877:45;;34807:126;34455:485;;;:::o;33683:659::-;33832:11;33997:16;33990:5;33986:28;33977:37;;34157:16;34146:9;34142:32;34129:45;;34307:15;34296:9;34293:30;34285:5;34274:9;34271:20;34268:56;34258:66;;33683:659;;;;;:::o;40341:159::-;;;;;:::o;54909:311::-;55044:7;55064:16;17704:3;55090:19;:41;;55064:68;;17704:3;55158:31;55169:4;55175:2;55179:9;55158:10;:31::i;:::-;55150:40;;:62;;55143:69;;;54909:311;;;;;:::o;29801:450::-;29881:14;30049:16;30042:5;30038:28;30029:37;;30226:5;30212:11;30187:23;30183:41;30180:52;30173:5;30170:63;30160:73;;29801:450;;;;:::o;41165:158::-;;;;;:::o;5926:191::-;6000:16;6019:6;;;;;;;;;;;6000:25;;6045:8;6036:6;;:17;;;;;;;;;;;;;;;;;;6100:8;6069:40;;6090:8;6069:40;;;;;;;;;;;;5989:128;5926:191;:::o;49432:112::-;49509:27;49519:2;49523:8;49509:27;;;;;;;;;;;;:9;:27::i;:::-;49432:112;;:::o;41763:716::-;41926:4;41972:2;41947:45;;;41993:19;:17;:19::i;:::-;42014:4;42020:7;42029:5;41947:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41943:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42247:1;42230:6;:13;:18;42226:235;;;42276:40;;;;;;;;;;;;;;42226:235;42419:6;42413:13;42404:6;42400:2;42396:15;42389:38;41943:529;42116:54;;;42106:64;;;:6;:64;;;;42099:71;;;41763:716;;;;;;:::o;58887:102::-;58947:13;58976:7;58969:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58887:102;:::o;464:723::-;520:13;750:1;741:5;:10;737:53;;;768:10;;;;;;;;;;;;;;;;;;;;;737:53;800:12;815:5;800:20;;831:14;856:78;871:1;863:4;:9;856:78;;889:8;;;;;:::i;:::-;;;;920:2;912:10;;;;;:::i;:::-;;;856:78;;;944:19;976:6;966:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;944:39;;994:154;1010:1;1001:5;:10;994:154;;1038:1;1028:11;;;;;:::i;:::-;;;1105:2;1097:5;:10;;;;:::i;:::-;1084:2;:24;;;;:::i;:::-;1071:39;;1054:6;1061;1054:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1134:2;1125:11;;;;;:::i;:::-;;;994:154;;;1172:6;1158:21;;;;;464:723;;;;:::o;3210:98::-;3263:7;3290:10;3283:17;;3210:98;:::o;54610:147::-;54747:6;54610:147;;;;;:::o;48659:689::-;48790:19;48796:2;48800:8;48790:5;:19::i;:::-;48869:1;48851:2;:14;;;:19;48847:483;;48891:11;48905:13;;48891:27;;48937:13;48959:8;48953:3;:14;48937:30;;48986:233;49017:62;49056:1;49060:2;49064:7;;;;;;49073:5;49017:30;:62::i;:::-;49012:167;;49115:40;;;;;;;;;;;;;;49012:167;49214:3;49206:5;:11;48986:233;;49301:3;49284:13;;:20;49280:34;;49306:8;;;49280:34;48872:458;;48847:483;48659:689;;;:::o;42941:2966::-;43014:20;43037:13;;43014:36;;43077:1;43065:8;:13;43061:44;;;43087:18;;;;;;;;;;;;;;43061:44;43118:61;43148:1;43152:2;43156:12;43170:8;43118:21;:61::i;:::-;43662:1;16662:2;43632:1;:26;;43631:32;43619:8;:45;43593:18;:22;43612:2;43593:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;43941:139;43978:2;44032:33;44055:1;44059:2;44063:1;44032:14;:33::i;:::-;43999:30;44020:8;43999:20;:30::i;:::-;:66;43941:18;:139::i;:::-;43907:17;:31;43925:12;43907:31;;;;;;;;;;;:173;;;;44097:16;44128:11;44157:8;44142:12;:23;44128:37;;44678:16;44674:2;44670:25;44658:37;;45050:12;45010:8;44969:1;44907:25;44848:1;44787;44760:335;45421:1;45407:12;45403:20;45361:346;45462:3;45453:7;45450:16;45361:346;;45680:7;45670:8;45667:1;45640:25;45637:1;45634;45629:59;45515:1;45506:7;45502:15;45491:26;;45361:346;;;45365:77;45752:1;45740:8;:13;45736:45;;;45762:19;;;;;;;;;;;;;;45736:45;45814:3;45798:13;:19;;;;43367:2462;;45839:60;45868:1;45872:2;45876:12;45890:8;45839:20;:60::i;:::-;43003:2904;42941:2966;;:::o;30353:324::-;30423:14;30656:1;30646:8;30643:15;30617:24;30613:46;30603:56;;30353:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:765::-;7573:6;7581;7589;7597;7646:3;7634:9;7625:7;7621:23;7617:33;7614:120;;;7653:79;;:::i;:::-;7614:120;7773:1;7798:53;7843:7;7834:6;7823:9;7819:22;7798:53;:::i;:::-;7788:63;;7744:117;7900:2;7926:53;7971:7;7962:6;7951:9;7947:22;7926:53;:::i;:::-;7916:63;;7871:118;8028:2;8054:53;8099:7;8090:6;8079:9;8075:22;8054:53;:::i;:::-;8044:63;;7999:118;8156:2;8182:53;8227:7;8218:6;8207:9;8203:22;8182:53;:::i;:::-;8172:63;;8127:118;7487:765;;;;;;;:::o;8258:118::-;8345:24;8363:5;8345:24;:::i;:::-;8340:3;8333:37;8258:118;;:::o;8382:109::-;8463:21;8478:5;8463:21;:::i;:::-;8458:3;8451:34;8382:109;;:::o;8497:360::-;8583:3;8611:38;8643:5;8611:38;:::i;:::-;8665:70;8728:6;8723:3;8665:70;:::i;:::-;8658:77;;8744:52;8789:6;8784:3;8777:4;8770:5;8766:16;8744:52;:::i;:::-;8821:29;8843:6;8821:29;:::i;:::-;8816:3;8812:39;8805:46;;8587:270;8497:360;;;;:::o;8863:364::-;8951:3;8979:39;9012:5;8979:39;:::i;:::-;9034:71;9098:6;9093:3;9034:71;:::i;:::-;9027:78;;9114:52;9159:6;9154:3;9147:4;9140:5;9136:16;9114:52;:::i;:::-;9191:29;9213:6;9191:29;:::i;:::-;9186:3;9182:39;9175:46;;8955:272;8863:364;;;;:::o;9233:377::-;9339:3;9367:39;9400:5;9367:39;:::i;:::-;9422:89;9504:6;9499:3;9422:89;:::i;:::-;9415:96;;9520:52;9565:6;9560:3;9553:4;9546:5;9542:16;9520:52;:::i;:::-;9597:6;9592:3;9588:16;9581:23;;9343:267;9233:377;;;;:::o;9640:845::-;9743:3;9780:5;9774:12;9809:36;9835:9;9809:36;:::i;:::-;9861:89;9943:6;9938:3;9861:89;:::i;:::-;9854:96;;9981:1;9970:9;9966:17;9997:1;9992:137;;;;10143:1;10138:341;;;;9959:520;;9992:137;10076:4;10072:9;10061;10057:25;10052:3;10045:38;10112:6;10107:3;10103:16;10096:23;;9992:137;;10138:341;10205:38;10237:5;10205:38;:::i;:::-;10265:1;10279:154;10293:6;10290:1;10287:13;10279:154;;;10367:7;10361:14;10357:1;10352:3;10348:11;10341:35;10417:1;10408:7;10404:15;10393:26;;10315:4;10312:1;10308:12;10303:17;;10279:154;;;10462:6;10457:3;10453:16;10446:23;;10145:334;;9959:520;;9747:738;;9640:845;;;;:::o;10491:365::-;10633:3;10654:66;10718:1;10713:3;10654:66;:::i;:::-;10647:73;;10729:93;10818:3;10729:93;:::i;:::-;10847:2;10842:3;10838:12;10831:19;;10491:365;;;:::o;10862:366::-;11004:3;11025:67;11089:2;11084:3;11025:67;:::i;:::-;11018:74;;11101:93;11190:3;11101:93;:::i;:::-;11219:2;11214:3;11210:12;11203:19;;10862:366;;;:::o;11234:::-;11376:3;11397:67;11461:2;11456:3;11397:67;:::i;:::-;11390:74;;11473:93;11562:3;11473:93;:::i;:::-;11591:2;11586:3;11582:12;11575:19;;11234:366;;;:::o;11606:::-;11748:3;11769:67;11833:2;11828:3;11769:67;:::i;:::-;11762:74;;11845:93;11934:3;11845:93;:::i;:::-;11963:2;11958:3;11954:12;11947:19;;11606:366;;;:::o;11978:::-;12120:3;12141:67;12205:2;12200:3;12141:67;:::i;:::-;12134:74;;12217:93;12306:3;12217:93;:::i;:::-;12335:2;12330:3;12326:12;12319:19;;11978:366;;;:::o;12350:::-;12492:3;12513:67;12577:2;12572:3;12513:67;:::i;:::-;12506:74;;12589:93;12678:3;12589:93;:::i;:::-;12707:2;12702:3;12698:12;12691:19;;12350:366;;;:::o;12722:::-;12864:3;12885:67;12949:2;12944:3;12885:67;:::i;:::-;12878:74;;12961:93;13050:3;12961:93;:::i;:::-;13079:2;13074:3;13070:12;13063:19;;12722:366;;;:::o;13094:398::-;13253:3;13274:83;13355:1;13350:3;13274:83;:::i;:::-;13267:90;;13366:93;13455:3;13366:93;:::i;:::-;13484:1;13479:3;13475:11;13468:18;;13094:398;;;:::o;13498:366::-;13640:3;13661:67;13725:2;13720:3;13661:67;:::i;:::-;13654:74;;13737:93;13826:3;13737:93;:::i;:::-;13855:2;13850:3;13846:12;13839:19;;13498:366;;;:::o;13870:::-;14012:3;14033:67;14097:2;14092:3;14033:67;:::i;:::-;14026:74;;14109:93;14198:3;14109:93;:::i;:::-;14227:2;14222:3;14218:12;14211:19;;13870:366;;;:::o;14242:118::-;14329:24;14347:5;14329:24;:::i;:::-;14324:3;14317:37;14242:118;;:::o;14366:589::-;14591:3;14613:95;14704:3;14695:6;14613:95;:::i;:::-;14606:102;;14725:95;14816:3;14807:6;14725:95;:::i;:::-;14718:102;;14837:92;14925:3;14916:6;14837:92;:::i;:::-;14830:99;;14946:3;14939:10;;14366:589;;;;;;:::o;14961:379::-;15145:3;15167:147;15310:3;15167:147;:::i;:::-;15160:154;;15331:3;15324:10;;14961:379;;;:::o;15346:222::-;15439:4;15477:2;15466:9;15462:18;15454:26;;15490:71;15558:1;15547:9;15543:17;15534:6;15490:71;:::i;:::-;15346:222;;;;:::o;15574:640::-;15769:4;15807:3;15796:9;15792:19;15784:27;;15821:71;15889:1;15878:9;15874:17;15865:6;15821:71;:::i;:::-;15902:72;15970:2;15959:9;15955:18;15946:6;15902:72;:::i;:::-;15984;16052:2;16041:9;16037:18;16028:6;15984:72;:::i;:::-;16103:9;16097:4;16093:20;16088:2;16077:9;16073:18;16066:48;16131:76;16202:4;16193:6;16131:76;:::i;:::-;16123:84;;15574:640;;;;;;;:::o;16220:210::-;16307:4;16345:2;16334:9;16330:18;16322:26;;16358:65;16420:1;16409:9;16405:17;16396:6;16358:65;:::i;:::-;16220:210;;;;:::o;16436:313::-;16549:4;16587:2;16576:9;16572:18;16564:26;;16636:9;16630:4;16626:20;16622:1;16611:9;16607:17;16600:47;16664:78;16737:4;16728:6;16664:78;:::i;:::-;16656:86;;16436:313;;;;:::o;16755:419::-;16921:4;16959:2;16948:9;16944:18;16936:26;;17008:9;17002:4;16998:20;16994:1;16983:9;16979:17;16972:47;17036:131;17162:4;17036:131;:::i;:::-;17028:139;;16755:419;;;:::o;17180:::-;17346:4;17384:2;17373:9;17369:18;17361:26;;17433:9;17427:4;17423:20;17419:1;17408:9;17404:17;17397:47;17461:131;17587:4;17461:131;:::i;:::-;17453:139;;17180:419;;;:::o;17605:::-;17771:4;17809:2;17798:9;17794:18;17786:26;;17858:9;17852:4;17848:20;17844:1;17833:9;17829:17;17822:47;17886:131;18012:4;17886:131;:::i;:::-;17878:139;;17605:419;;;:::o;18030:::-;18196:4;18234:2;18223:9;18219:18;18211:26;;18283:9;18277:4;18273:20;18269:1;18258:9;18254:17;18247:47;18311:131;18437:4;18311:131;:::i;:::-;18303:139;;18030:419;;;:::o;18455:::-;18621:4;18659:2;18648:9;18644:18;18636:26;;18708:9;18702:4;18698:20;18694:1;18683:9;18679:17;18672:47;18736:131;18862:4;18736:131;:::i;:::-;18728:139;;18455:419;;;:::o;18880:::-;19046:4;19084:2;19073:9;19069:18;19061:26;;19133:9;19127:4;19123:20;19119:1;19108:9;19104:17;19097:47;19161:131;19287:4;19161:131;:::i;:::-;19153:139;;18880:419;;;:::o;19305:::-;19471:4;19509:2;19498:9;19494:18;19486:26;;19558:9;19552:4;19548:20;19544:1;19533:9;19529:17;19522:47;19586:131;19712:4;19586:131;:::i;:::-;19578:139;;19305:419;;;:::o;19730:::-;19896:4;19934:2;19923:9;19919:18;19911:26;;19983:9;19977:4;19973:20;19969:1;19958:9;19954:17;19947:47;20011:131;20137:4;20011:131;:::i;:::-;20003:139;;19730:419;;;:::o;20155:::-;20321:4;20359:2;20348:9;20344:18;20336:26;;20408:9;20402:4;20398:20;20394:1;20383:9;20379:17;20372:47;20436:131;20562:4;20436:131;:::i;:::-;20428:139;;20155:419;;;:::o;20580:222::-;20673:4;20711:2;20700:9;20696:18;20688:26;;20724:71;20792:1;20781:9;20777:17;20768:6;20724:71;:::i;:::-;20580:222;;;;:::o;20808:129::-;20842:6;20869:20;;:::i;:::-;20859:30;;20898:33;20926:4;20918:6;20898:33;:::i;:::-;20808:129;;;:::o;20943:75::-;20976:6;21009:2;21003:9;20993:19;;20943:75;:::o;21024:307::-;21085:4;21175:18;21167:6;21164:30;21161:56;;;21197:18;;:::i;:::-;21161:56;21235:29;21257:6;21235:29;:::i;:::-;21227:37;;21319:4;21313;21309:15;21301:23;;21024:307;;;:::o;21337:308::-;21399:4;21489:18;21481:6;21478:30;21475:56;;;21511:18;;:::i;:::-;21475:56;21549:29;21571:6;21549:29;:::i;:::-;21541:37;;21633:4;21627;21623:15;21615:23;;21337:308;;;:::o;21651:141::-;21700:4;21723:3;21715:11;;21746:3;21743:1;21736:14;21780:4;21777:1;21767:18;21759:26;;21651:141;;;:::o;21798:98::-;21849:6;21883:5;21877:12;21867:22;;21798:98;;;:::o;21902:99::-;21954:6;21988:5;21982:12;21972:22;;21902:99;;;:::o;22007:168::-;22090:11;22124:6;22119:3;22112:19;22164:4;22159:3;22155:14;22140:29;;22007:168;;;;:::o;22181:147::-;22282:11;22319:3;22304:18;;22181:147;;;;:::o;22334:169::-;22418:11;22452:6;22447:3;22440:19;22492:4;22487:3;22483:14;22468:29;;22334:169;;;;:::o;22509:148::-;22611:11;22648:3;22633:18;;22509:148;;;;:::o;22663:305::-;22703:3;22722:20;22740:1;22722:20;:::i;:::-;22717:25;;22756:20;22774:1;22756:20;:::i;:::-;22751:25;;22910:1;22842:66;22838:74;22835:1;22832:81;22829:107;;;22916:18;;:::i;:::-;22829:107;22960:1;22957;22953:9;22946:16;;22663:305;;;;:::o;22974:185::-;23014:1;23031:20;23049:1;23031:20;:::i;:::-;23026:25;;23065:20;23083:1;23065:20;:::i;:::-;23060:25;;23104:1;23094:35;;23109:18;;:::i;:::-;23094:35;23151:1;23148;23144:9;23139:14;;22974:185;;;;:::o;23165:348::-;23205:7;23228:20;23246:1;23228:20;:::i;:::-;23223:25;;23262:20;23280:1;23262:20;:::i;:::-;23257:25;;23450:1;23382:66;23378:74;23375:1;23372:81;23367:1;23360:9;23353:17;23349:105;23346:131;;;23457:18;;:::i;:::-;23346:131;23505:1;23502;23498:9;23487:20;;23165:348;;;;:::o;23519:191::-;23559:4;23579:20;23597:1;23579:20;:::i;:::-;23574:25;;23613:20;23631:1;23613:20;:::i;:::-;23608:25;;23652:1;23649;23646:8;23643:34;;;23657:18;;:::i;:::-;23643:34;23702:1;23699;23695:9;23687:17;;23519:191;;;;:::o;23716:96::-;23753:7;23782:24;23800:5;23782:24;:::i;:::-;23771:35;;23716:96;;;:::o;23818:90::-;23852:7;23895:5;23888:13;23881:21;23870:32;;23818:90;;;:::o;23914:149::-;23950:7;23990:66;23983:5;23979:78;23968:89;;23914:149;;;:::o;24069:126::-;24106:7;24146:42;24139:5;24135:54;24124:65;;24069:126;;;:::o;24201:77::-;24238:7;24267:5;24256:16;;24201:77;;;:::o;24284:154::-;24368:6;24363:3;24358;24345:30;24430:1;24421:6;24416:3;24412:16;24405:27;24284:154;;;:::o;24444:307::-;24512:1;24522:113;24536:6;24533:1;24530:13;24522:113;;;24621:1;24616:3;24612:11;24606:18;24602:1;24597:3;24593:11;24586:39;24558:2;24555:1;24551:10;24546:15;;24522:113;;;24653:6;24650:1;24647:13;24644:101;;;24733:1;24724:6;24719:3;24715:16;24708:27;24644:101;24493:258;24444:307;;;:::o;24757:320::-;24801:6;24838:1;24832:4;24828:12;24818:22;;24885:1;24879:4;24875:12;24906:18;24896:81;;24962:4;24954:6;24950:17;24940:27;;24896:81;25024:2;25016:6;25013:14;24993:18;24990:38;24987:84;;;25043:18;;:::i;:::-;24987:84;24808:269;24757:320;;;:::o;25083:281::-;25166:27;25188:4;25166:27;:::i;:::-;25158:6;25154:40;25296:6;25284:10;25281:22;25260:18;25248:10;25245:34;25242:62;25239:88;;;25307:18;;:::i;:::-;25239:88;25347:10;25343:2;25336:22;25126:238;25083:281;;:::o;25370:233::-;25409:3;25432:24;25450:5;25432:24;:::i;:::-;25423:33;;25478:66;25471:5;25468:77;25465:103;;;25548:18;;:::i;:::-;25465:103;25595:1;25588:5;25584:13;25577:20;;25370:233;;;:::o;25609:176::-;25641:1;25658:20;25676:1;25658:20;:::i;:::-;25653:25;;25692:20;25710:1;25692:20;:::i;:::-;25687:25;;25731:1;25721:35;;25736:18;;:::i;:::-;25721:35;25777:1;25774;25770:9;25765:14;;25609:176;;;;:::o;25791:180::-;25839:77;25836:1;25829:88;25936:4;25933:1;25926:15;25960:4;25957:1;25950:15;25977:180;26025:77;26022:1;26015:88;26122:4;26119:1;26112:15;26146:4;26143:1;26136:15;26163:180;26211:77;26208:1;26201:88;26308:4;26305:1;26298:15;26332:4;26329:1;26322:15;26349:180;26397:77;26394:1;26387:88;26494:4;26491:1;26484:15;26518:4;26515:1;26508:15;26535:180;26583:77;26580:1;26573:88;26680:4;26677:1;26670:15;26704:4;26701:1;26694:15;26721:117;26830:1;26827;26820:12;26844:117;26953:1;26950;26943:12;26967:117;27076:1;27073;27066:12;27090:117;27199:1;27196;27189:12;27213:102;27254:6;27305:2;27301:7;27296:2;27289:5;27285:14;27281:28;27271:38;;27213:102;;;:::o;27321:157::-;27461:9;27457:1;27449:6;27445:14;27438:33;27321:157;:::o;27484:225::-;27624:34;27620:1;27612:6;27608:14;27601:58;27693:8;27688:2;27680:6;27676:15;27669:33;27484:225;:::o;27715:162::-;27855:14;27851:1;27843:6;27839:14;27832:38;27715:162;:::o;27883:173::-;28023:25;28019:1;28011:6;28007:14;28000:49;27883:173;:::o;28062:182::-;28202:34;28198:1;28190:6;28186:14;28179:58;28062:182;:::o;28250:::-;28390:34;28386:1;28378:6;28374:14;28367:58;28250:182;:::o;28438:234::-;28578:34;28574:1;28566:6;28562:14;28555:58;28647:17;28642:2;28634:6;28630:15;28623:42;28438:234;:::o;28678:114::-;;:::o;28798:168::-;28938:20;28934:1;28926:6;28922:14;28915:44;28798:168;:::o;28972:165::-;29112:17;29108:1;29100:6;29096:14;29089:41;28972:165;:::o;29143:122::-;29216:24;29234:5;29216:24;:::i;:::-;29209:5;29206:35;29196:63;;29255:1;29252;29245:12;29196:63;29143:122;:::o;29271:116::-;29341:21;29356:5;29341:21;:::i;:::-;29334:5;29331:32;29321:60;;29377:1;29374;29367:12;29321:60;29271:116;:::o;29393:120::-;29465:23;29482:5;29465:23;:::i;:::-;29458:5;29455:34;29445:62;;29503:1;29500;29493:12;29445:62;29393:120;:::o;29519:122::-;29592:24;29610:5;29592:24;:::i;:::-;29585:5;29582:35;29572:63;;29631:1;29628;29621:12;29572:63;29519:122;:::o

Swarm Source

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