ETH Price: $3,032.84 (+3.97%)

Token

FREEPIZZA (FPP)
 

Overview

Max Total Supply

2,301 FPP

Holders

91

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 FPP
0xc2f6c86622441e1eba53086a2869829ef2b91fb2
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:
FreePizzaNft

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// 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: https://github.com/chiru-labs/ERC721A/blob/main/contracts/IERC721A.sol


// ERC721A Contracts v4.2.2
// 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;

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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol


// ERC721A Contracts v4.2.2
// 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 {
    // Reference type for token approval.
    struct TokenApprovalRef {
        address value;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _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 virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // 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`.
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

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

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

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

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

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

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, str)

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

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

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

// File: contracts/Pizza/Freepizza.sol


pragma solidity ^0.8.7;




contract FreePizzaNft is ERC721A, Ownable {
    using StringsUpgradeable for uint256;
    event Minted(address indexed _from, uint _amount, uint _value);

    address extendingContract;


    string public baseApiURI;
    
     //Utility
    bool public paused = false;
   

    //General Settings
    uint16 public maxMintAmountPerTransaction = 2;
    uint16 public maxMintAmountPerWallet = 2;


    //Inventory
    uint256 public maxSupply = 5000;

    //Prices
    uint256 public cost = 0 ether;
    

   

    

    

    constructor(string memory _baseUrl) ERC721A("FREEPIZZA", "FPP") {
        baseApiURI = _baseUrl;
    }

    //This function will be used to extend the project with more capabilities 
    function setExternalContract(address _bAddress) public onlyOwner {
        extendingContract = _bAddress;
    }


    //this function can be called only from the extending contract
    function mintExternal(address _address, uint256 _mintAmount) external {
        require(
            msg.sender == extendingContract,
            "Sorry you don't have permission to mint"
        );
        _safeMint(_address, _mintAmount);
    }


    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    // public
    function mint(uint256 _mintAmount) public payable {
        if (msg.sender != owner()) {
            uint256 ownerTokenCount = balanceOf(msg.sender);

            require(!paused);
            require(_mintAmount > 0, "Mint amount should be greater than 0");
            require(
                _mintAmount <= maxMintAmountPerTransaction,
                "Sorry you cant mint this amount at once"
            );
            require(
                totalSupply() + _mintAmount <= maxSupply,
                "Exceeds Max Supply"
            );
            require(
                (ownerTokenCount + _mintAmount) <= maxMintAmountPerWallet,
                "Sorry you cant mint more"
            );

            require(msg.value >= cost * _mintAmount, "Insuffient funds");
        }

        _mintLoop(msg.sender, _mintAmount);
         emit Minted(msg.sender,  _mintAmount, msg.value);
    }

    function gift(address _to, uint256 _mintAmount) public onlyOwner {
        _mintLoop(_to, _mintAmount);
    }

    function airdrop(address[] memory _airdropAddresses) public onlyOwner {
       
        for (uint256 i = 0; i < _airdropAddresses.length; i++) {
            address to = _airdropAddresses[i];
            _mintLoop(to, 1);
        }
    }

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

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(abi.encodePacked(currentBaseURI, tokenId.toString()))
                : "";
    }

    function setCost( uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    

    function setmaxMintAmountPerTransaction(uint16 _amount) public onlyOwner {
        maxMintAmountPerTransaction = _amount;
    }

    function setMaxMintAmountPerWallet(uint16 _amount) public onlyOwner {
        maxMintAmountPerWallet = _amount;
    }

   

    function setMaxSupply(uint256 _supply) public onlyOwner {
        maxSupply = _supply;
    }

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

    function togglePause() public onlyOwner {
        paused = !paused;
    }

    

    function _mintLoop(address _receiver, uint256 _mintAmount) internal {
        _safeMint(_receiver, _mintAmount);
    }

   

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseUrl","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":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Minted","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":"_airdropAddresses","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseApiURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","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":"maxMintAmountPerTransaction","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerWallet","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintExternal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bAddress","type":"address"}],"name":"setExternalContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"setMaxMintAmountPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"setmaxMintAmountPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600b60006101000a81548160ff0219169083151502179055506002600b60016101000a81548161ffff021916908361ffff1602179055506002600b60036101000a81548161ffff021916908361ffff160217905550611388600c556000600d553480156200007357600080fd5b5060405162003a2b38038062003a2b833981810160405281019062000099919062000390565b6040518060400160405280600981526020017f4652454550495a5a4100000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f465050000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200011d92919062000262565b5080600390805190602001906200013692919062000262565b50620001476200018f60201b60201c565b60008190555050506200016f620001636200019460201b60201c565b6200019c60201b60201c565b80600a90805190602001906200018792919062000262565b505062000565565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002709062000476565b90600052602060002090601f016020900481019282620002945760008555620002e0565b82601f10620002af57805160ff1916838001178555620002e0565b82800160010185558215620002e0579182015b82811115620002df578251825591602001919060010190620002c2565b5b509050620002ef9190620002f3565b5090565b5b808211156200030e576000816000905550600101620002f4565b5090565b60006200032962000323846200040a565b620003e1565b90508281526020810184848401111562000348576200034762000545565b5b6200035584828562000440565b509392505050565b600082601f83011262000375576200037462000540565b5b81516200038784826020860162000312565b91505092915050565b600060208284031215620003a957620003a86200054f565b5b600082015167ffffffffffffffff811115620003ca57620003c96200054a565b5b620003d8848285016200035d565b91505092915050565b6000620003ed62000400565b9050620003fb8282620004ac565b919050565b6000604051905090565b600067ffffffffffffffff82111562000428576200042762000511565b5b620004338262000554565b9050602081019050919050565b60005b838110156200046057808201518184015260208101905062000443565b8381111562000470576000848401525b50505050565b600060028204905060018216806200048f57607f821691505b60208210811415620004a657620004a5620004e2565b5b50919050565b620004b78262000554565b810181811067ffffffffffffffff82111715620004d957620004d862000511565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6134b680620005756000396000f3fe60806040526004361061020f5760003560e01c8063729ad39e11610118578063c87b56dd116100a0578063dc33e6811161006f578063dc33e68114610733578063e97800cb14610770578063e985e9c514610799578063f2fde38b146107d6578063f4da1846146107ff5761020f565b8063c87b56dd14610679578063cbce4c97146106b6578063cef11729146106df578063d5abeb01146107085761020f565b8063a22cb465116100e7578063a22cb465146105ba578063b88d4fde146105e3578063bbb897441461060c578063bc951b9114610637578063c4ae3168146106625761020f565b8063729ad39e1461051f5780638da5cb5b1461054857806395d89b4114610573578063a0712d681461059e5761020f565b806341827f131161019b5780635c975abb1161016a5780635c975abb1461043a5780636352211e146104655780636f8b44b0146104a257806370a08231146104cb578063715018a6146105085761020f565b806341827f131461039457806342842e0e146103bf57806344a0d68a146103e857806355f804b3146104115761020f565b806309e7fe1b116101e257806309e7fe1b146102e257806313faede61461030b57806318160ddd1461033657806323b872dd146103615780633ccfd60b1461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612779565b610828565b6040516102489190612b53565b60405180910390f35b34801561025d57600080fd5b506102666108ba565b6040516102739190612b6e565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612849565b61094c565b6040516102b09190612aec565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db91906126f0565b6109cb565b005b3480156102ee57600080fd5b506103096004803603810190610304919061256d565b610b0f565b005b34801561031757600080fd5b50610320610b5b565b60405161032d9190612ccb565b60405180910390f35b34801561034257600080fd5b5061034b610b61565b6040516103589190612ccb565b60405180910390f35b34801561036d57600080fd5b50610388600480360381019061038391906125da565b610b78565b005b610392610e9d565b005b3480156103a057600080fd5b506103a9610f25565b6040516103b69190612b6e565b60405180910390f35b3480156103cb57600080fd5b506103e660048036038101906103e191906125da565b610fb3565b005b3480156103f457600080fd5b5061040f600480360381019061040a9190612849565b610fd3565b005b34801561041d57600080fd5b50610438600480360381019061043391906127d3565b610fe5565b005b34801561044657600080fd5b5061044f611007565b60405161045c9190612b53565b60405180910390f35b34801561047157600080fd5b5061048c60048036038101906104879190612849565b61101a565b6040516104999190612aec565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190612849565b61102c565b005b3480156104d757600080fd5b506104f260048036038101906104ed919061256d565b61103e565b6040516104ff9190612ccb565b60405180910390f35b34801561051457600080fd5b5061051d6110f7565b005b34801561052b57600080fd5b5061054660048036038101906105419190612730565b61110b565b005b34801561055457600080fd5b5061055d611161565b60405161056a9190612aec565b60405180910390f35b34801561057f57600080fd5b5061058861118b565b6040516105959190612b6e565b60405180910390f35b6105b860048036038101906105b39190612849565b61121d565b005b3480156105c657600080fd5b506105e160048036038101906105dc91906126b0565b611480565b005b3480156105ef57600080fd5b5061060a6004803603810190610605919061262d565b61158b565b005b34801561061857600080fd5b506106216115fe565b60405161062e9190612cb0565b60405180910390f35b34801561064357600080fd5b5061064c611612565b6040516106599190612cb0565b60405180910390f35b34801561066e57600080fd5b50610677611626565b005b34801561068557600080fd5b506106a0600480360381019061069b9190612849565b61165a565b6040516106ad9190612b6e565b60405180910390f35b3480156106c257600080fd5b506106dd60048036038101906106d891906126f0565b611701565b005b3480156106eb57600080fd5b506107066004803603810190610701919061281c565b611717565b005b34801561071457600080fd5b5061071d61173f565b60405161072a9190612ccb565b60405180910390f35b34801561073f57600080fd5b5061075a6004803603810190610755919061256d565b611745565b6040516107679190612ccb565b60405180910390f35b34801561077c57600080fd5b506107976004803603810190610792919061281c565b611757565b005b3480156107a557600080fd5b506107c060048036038101906107bb919061259a565b61177f565b6040516107cd9190612b53565b60405180910390f35b3480156107e257600080fd5b506107fd60048036038101906107f8919061256d565b611813565b005b34801561080b57600080fd5b50610826600480360381019061082191906126f0565b611897565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061088357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108b35750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546108c990612fe9565b80601f01602080910402602001604051908101604052809291908181526020018280546108f590612fe9565b80156109425780601f1061091757610100808354040283529160200191610942565b820191906000526020600020905b81548152906001019060200180831161092557829003601f168201915b5050505050905090565b600061095782611935565b61098d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109d68261101a565b90508073ffffffffffffffffffffffffffffffffffffffff166109f7611994565b73ffffffffffffffffffffffffffffffffffffffff1614610a5a57610a2381610a1e611994565b61177f565b610a59576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610b1761199c565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b6000610b6b611a1a565b6001546000540303905090565b6000610b8382611a1f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bea576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610bf684611aed565b91509150610c0c8187610c07611994565b611b14565b610c5857610c2186610c1c611994565b61177f565b610c57576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610cbf576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ccc8686866001611b58565b8015610cd757600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610da585610d81888887611b5e565b7c020000000000000000000000000000000000000000000000000000000017611b86565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610e2d576000600185019050600060046000838152602001908152602001600020541415610e2b576000548114610e2a578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e958686866001611bb1565b505050505050565b610ea561199c565b6000610eaf611161565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ed290612ad7565b60006040518083038185875af1925050503d8060008114610f0f576040519150601f19603f3d011682016040523d82523d6000602084013e610f14565b606091505b5050905080610f2257600080fd5b50565b600a8054610f3290612fe9565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5e90612fe9565b8015610fab5780601f10610f8057610100808354040283529160200191610fab565b820191906000526020600020905b815481529060010190602001808311610f8e57829003601f168201915b505050505081565b610fce8383836040518060200160405280600081525061158b565b505050565b610fdb61199c565b80600d8190555050565b610fed61199c565b80600a90805190602001906110039291906122ce565b5050565b600b60009054906101000a900460ff1681565b600061102582611a1f565b9050919050565b61103461199c565b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110a6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6110ff61199c565b6111096000611bb7565b565b61111361199c565b60005b815181101561115d57600082828151811061113457611133613153565b5b60200260200101519050611149816001611c7d565b5080806111559061304c565b915050611116565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461119a90612fe9565b80601f01602080910402602001604051908101604052809291908181526020018280546111c690612fe9565b80156112135780601f106111e857610100808354040283529160200191611213565b820191906000526020600020905b8154815290600101906020018083116111f657829003601f168201915b5050505050905090565b611225611161565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114235760006112623361103e565b9050600b60009054906101000a900460ff161561127e57600080fd5b600082116112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b890612c70565b60405180910390fd5b600b60019054906101000a900461ffff1661ffff16821115611318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130f90612c10565b60405180910390fd5b600c5482611324610b61565b61132e9190612e10565b111561136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136690612b90565b60405180910390fd5b600b60039054906101000a900461ffff1661ffff1682826113909190612e10565b11156113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c890612c90565b60405180910390fd5b81600d546113df9190612e97565b341015611421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141890612bd0565b60405180910390fd5b505b61142d3382611c7d565b3373ffffffffffffffffffffffffffffffffffffffff167f25b428dfde728ccfaddad7e29e4ac23c24ed7fd1a6e3e3f91894a9a073f5dfff8234604051611475929190612ce6565b60405180910390a250565b806007600061148d611994565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661153a611994565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161157f9190612b53565b60405180910390a35050565b611596848484610b78565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115f8576115c184848484611c8b565b6115f7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600b60019054906101000a900461ffff1681565b600b60039054906101000a900461ffff1681565b61162e61199c565b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b606061166582611935565b6116a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169b90612c50565b60405180910390fd5b60006116ae611deb565b905060008151116116ce57604051806020016040528060008152506116f9565b806116d884611e7d565b6040516020016116e9929190612ab3565b6040516020818303038152906040525b915050919050565b61170961199c565b6117138282611c7d565b5050565b61171f61199c565b80600b60036101000a81548161ffff021916908361ffff16021790555050565b600c5481565b600061175082611fde565b9050919050565b61175f61199c565b80600b60016101000a81548161ffff021916908361ffff16021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61181b61199c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561188b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188290612bb0565b60405180910390fd5b61189481611bb7565b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191e90612bf0565b60405180910390fd5b6119318282612035565b5050565b600081611940611a1a565b1115801561194f575060005482105b801561198d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6119a4612053565b73ffffffffffffffffffffffffffffffffffffffff166119c2611161565b73ffffffffffffffffffffffffffffffffffffffff1614611a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0f90612c30565b60405180910390fd5b565b600090565b60008082905080611a2e611a1a565b11611ab657600054811015611ab55760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611ab3575b6000811415611aa9576004600083600190039350838152602001908152602001600020549050611a7e565b8092505050611ae8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611b7586868461205b565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c878282612035565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cb1611994565b8786866040518563ffffffff1660e01b8152600401611cd39493929190612b07565b602060405180830381600087803b158015611ced57600080fd5b505af1925050508015611d1e57506040513d601f19601f82011682018060405250810190611d1b91906127a6565b60015b611d98573d8060008114611d4e576040519150601f19603f3d011682016040523d82523d6000602084013e611d53565b606091505b50600081511415611d90576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054611dfa90612fe9565b80601f0160208091040260200160405190810160405280929190818152602001828054611e2690612fe9565b8015611e735780601f10611e4857610100808354040283529160200191611e73565b820191906000526020600020905b815481529060010190602001808311611e5657829003601f168201915b5050505050905090565b60606000821415611ec5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fd9565b600082905060005b60008214611ef7578080611ee09061304c565b915050600a82611ef09190612e66565b9150611ecd565b60008167ffffffffffffffff811115611f1357611f12613182565b5b6040519080825280601f01601f191660200182016040528015611f455781602001600182028036833780820191505090505b5090505b60008514611fd257600182611f5e9190612ef1565b9150600a85611f6d9190613095565b6030611f799190612e10565b60f81b818381518110611f8f57611f8e613153565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611fcb9190612e66565b9450611f49565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b61204f828260405180602001604052806000815250612064565b5050565b600033905090565b60009392505050565b61206e8383612101565b60008373ffffffffffffffffffffffffffffffffffffffff163b146120fc57600080549050600083820390505b6120ae6000868380600101945086611c8b565b6120e4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061209b5781600054146120f957600080fd5b50505b505050565b6000805490506000821415612142576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61214f6000848385611b58565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506121c6836121b76000866000611b5e565b6121c0856122be565b17611b86565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461226757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061222c565b5060008214156122a3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506122b96000848385611bb1565b505050565b60006001821460e11b9050919050565b8280546122da90612fe9565b90600052602060002090601f0160209004810192826122fc5760008555612343565b82601f1061231557805160ff1916838001178555612343565b82800160010185558215612343579182015b82811115612342578251825591602001919060010190612327565b5b5090506123509190612354565b5090565b5b8082111561236d576000816000905550600101612355565b5090565b600061238461237f84612d34565b612d0f565b905080838252602082019050828560208602820111156123a7576123a66131b6565b5b60005b858110156123d757816123bd8882612465565b8452602084019350602083019250506001810190506123aa565b5050509392505050565b60006123f46123ef84612d60565b612d0f565b9050828152602081018484840111156124105761240f6131bb565b5b61241b848285612fa7565b509392505050565b600061243661243184612d91565b612d0f565b905082815260208101848484011115612452576124516131bb565b5b61245d848285612fa7565b509392505050565b6000813590506124748161340d565b92915050565b600082601f83011261248f5761248e6131b1565b5b813561249f848260208601612371565b91505092915050565b6000813590506124b781613424565b92915050565b6000813590506124cc8161343b565b92915050565b6000815190506124e18161343b565b92915050565b600082601f8301126124fc576124fb6131b1565b5b813561250c8482602086016123e1565b91505092915050565b600082601f83011261252a576125296131b1565b5b813561253a848260208601612423565b91505092915050565b60008135905061255281613452565b92915050565b60008135905061256781613469565b92915050565b600060208284031215612583576125826131c5565b5b600061259184828501612465565b91505092915050565b600080604083850312156125b1576125b06131c5565b5b60006125bf85828601612465565b92505060206125d085828601612465565b9150509250929050565b6000806000606084860312156125f3576125f26131c5565b5b600061260186828701612465565b935050602061261286828701612465565b925050604061262386828701612558565b9150509250925092565b60008060008060808587031215612647576126466131c5565b5b600061265587828801612465565b945050602061266687828801612465565b935050604061267787828801612558565b925050606085013567ffffffffffffffff811115612698576126976131c0565b5b6126a4878288016124e7565b91505092959194509250565b600080604083850312156126c7576126c66131c5565b5b60006126d585828601612465565b92505060206126e6858286016124a8565b9150509250929050565b60008060408385031215612707576127066131c5565b5b600061271585828601612465565b925050602061272685828601612558565b9150509250929050565b600060208284031215612746576127456131c5565b5b600082013567ffffffffffffffff811115612764576127636131c0565b5b6127708482850161247a565b91505092915050565b60006020828403121561278f5761278e6131c5565b5b600061279d848285016124bd565b91505092915050565b6000602082840312156127bc576127bb6131c5565b5b60006127ca848285016124d2565b91505092915050565b6000602082840312156127e9576127e86131c5565b5b600082013567ffffffffffffffff811115612807576128066131c0565b5b61281384828501612515565b91505092915050565b600060208284031215612832576128316131c5565b5b600061284084828501612543565b91505092915050565b60006020828403121561285f5761285e6131c5565b5b600061286d84828501612558565b91505092915050565b61287f81612f25565b82525050565b61288e81612f37565b82525050565b600061289f82612dc2565b6128a98185612dd8565b93506128b9818560208601612fb6565b6128c2816131ca565b840191505092915050565b60006128d882612dcd565b6128e28185612df4565b93506128f2818560208601612fb6565b6128fb816131ca565b840191505092915050565b600061291182612dcd565b61291b8185612e05565b935061292b818560208601612fb6565b80840191505092915050565b6000612944601283612df4565b915061294f826131db565b602082019050919050565b6000612967602683612df4565b915061297282613204565b604082019050919050565b600061298a601083612df4565b915061299582613253565b602082019050919050565b60006129ad602783612df4565b91506129b88261327c565b604082019050919050565b60006129d0602783612df4565b91506129db826132cb565b604082019050919050565b60006129f3602083612df4565b91506129fe8261331a565b602082019050919050565b6000612a16602f83612df4565b9150612a2182613343565b604082019050919050565b6000612a39600083612de9565b9150612a4482613392565b600082019050919050565b6000612a5c602483612df4565b9150612a6782613395565b604082019050919050565b6000612a7f601883612df4565b9150612a8a826133e4565b602082019050919050565b612a9e81612f6f565b82525050565b612aad81612f9d565b82525050565b6000612abf8285612906565b9150612acb8284612906565b91508190509392505050565b6000612ae282612a2c565b9150819050919050565b6000602082019050612b016000830184612876565b92915050565b6000608082019050612b1c6000830187612876565b612b296020830186612876565b612b366040830185612aa4565b8181036060830152612b488184612894565b905095945050505050565b6000602082019050612b686000830184612885565b92915050565b60006020820190508181036000830152612b8881846128cd565b905092915050565b60006020820190508181036000830152612ba981612937565b9050919050565b60006020820190508181036000830152612bc98161295a565b9050919050565b60006020820190508181036000830152612be98161297d565b9050919050565b60006020820190508181036000830152612c09816129a0565b9050919050565b60006020820190508181036000830152612c29816129c3565b9050919050565b60006020820190508181036000830152612c49816129e6565b9050919050565b60006020820190508181036000830152612c6981612a09565b9050919050565b60006020820190508181036000830152612c8981612a4f565b9050919050565b60006020820190508181036000830152612ca981612a72565b9050919050565b6000602082019050612cc56000830184612a95565b92915050565b6000602082019050612ce06000830184612aa4565b92915050565b6000604082019050612cfb6000830185612aa4565b612d086020830184612aa4565b9392505050565b6000612d19612d2a565b9050612d25828261301b565b919050565b6000604051905090565b600067ffffffffffffffff821115612d4f57612d4e613182565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612d7b57612d7a613182565b5b612d84826131ca565b9050602081019050919050565b600067ffffffffffffffff821115612dac57612dab613182565b5b612db5826131ca565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612e1b82612f9d565b9150612e2683612f9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e5b57612e5a6130c6565b5b828201905092915050565b6000612e7182612f9d565b9150612e7c83612f9d565b925082612e8c57612e8b6130f5565b5b828204905092915050565b6000612ea282612f9d565b9150612ead83612f9d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612ee657612ee56130c6565b5b828202905092915050565b6000612efc82612f9d565b9150612f0783612f9d565b925082821015612f1a57612f196130c6565b5b828203905092915050565b6000612f3082612f7d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612fd4578082015181840152602081019050612fb9565b83811115612fe3576000848401525b50505050565b6000600282049050600182168061300157607f821691505b6020821081141561301557613014613124565b5b50919050565b613024826131ca565b810181811067ffffffffffffffff8211171561304357613042613182565b5b80604052505050565b600061305782612f9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561308a576130896130c6565b5b600182019050919050565b60006130a082612f9d565b91506130ab83612f9d565b9250826130bb576130ba6130f5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45786365656473204d617820537570706c790000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e7375666669656e742066756e647300000000000000000000000000000000600082015250565b7f536f72727920796f7520646f6e27742068617665207065726d697373696f6e2060008201527f746f206d696e7400000000000000000000000000000000000000000000000000602082015250565b7f536f72727920796f752063616e74206d696e74207468697320616d6f756e742060008201527f6174206f6e636500000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f4d696e7420616d6f756e742073686f756c64206265206772656174657220746860008201527f616e203000000000000000000000000000000000000000000000000000000000602082015250565b7f536f72727920796f752063616e74206d696e74206d6f72650000000000000000600082015250565b61341681612f25565b811461342157600080fd5b50565b61342d81612f37565b811461343857600080fd5b50565b61344481612f43565b811461344f57600080fd5b50565b61345b81612f6f565b811461346657600080fd5b50565b61347281612f9d565b811461347d57600080fd5b5056fea26469706673582212205e6ab8086bc79751eba18f8a7c12a3b2b0b3c76446fe85b9971cdcfed16e04ff64736f6c634300080700330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f75732d63656e7472616c312d6d6f666f732d36396136322e636c6f756466756e6374696f6e732e6e65742f6170702f70697a7a612f746f6b656e2f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061020f5760003560e01c8063729ad39e11610118578063c87b56dd116100a0578063dc33e6811161006f578063dc33e68114610733578063e97800cb14610770578063e985e9c514610799578063f2fde38b146107d6578063f4da1846146107ff5761020f565b8063c87b56dd14610679578063cbce4c97146106b6578063cef11729146106df578063d5abeb01146107085761020f565b8063a22cb465116100e7578063a22cb465146105ba578063b88d4fde146105e3578063bbb897441461060c578063bc951b9114610637578063c4ae3168146106625761020f565b8063729ad39e1461051f5780638da5cb5b1461054857806395d89b4114610573578063a0712d681461059e5761020f565b806341827f131161019b5780635c975abb1161016a5780635c975abb1461043a5780636352211e146104655780636f8b44b0146104a257806370a08231146104cb578063715018a6146105085761020f565b806341827f131461039457806342842e0e146103bf57806344a0d68a146103e857806355f804b3146104115761020f565b806309e7fe1b116101e257806309e7fe1b146102e257806313faede61461030b57806318160ddd1461033657806323b872dd146103615780633ccfd60b1461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612779565b610828565b6040516102489190612b53565b60405180910390f35b34801561025d57600080fd5b506102666108ba565b6040516102739190612b6e565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612849565b61094c565b6040516102b09190612aec565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db91906126f0565b6109cb565b005b3480156102ee57600080fd5b506103096004803603810190610304919061256d565b610b0f565b005b34801561031757600080fd5b50610320610b5b565b60405161032d9190612ccb565b60405180910390f35b34801561034257600080fd5b5061034b610b61565b6040516103589190612ccb565b60405180910390f35b34801561036d57600080fd5b50610388600480360381019061038391906125da565b610b78565b005b610392610e9d565b005b3480156103a057600080fd5b506103a9610f25565b6040516103b69190612b6e565b60405180910390f35b3480156103cb57600080fd5b506103e660048036038101906103e191906125da565b610fb3565b005b3480156103f457600080fd5b5061040f600480360381019061040a9190612849565b610fd3565b005b34801561041d57600080fd5b50610438600480360381019061043391906127d3565b610fe5565b005b34801561044657600080fd5b5061044f611007565b60405161045c9190612b53565b60405180910390f35b34801561047157600080fd5b5061048c60048036038101906104879190612849565b61101a565b6040516104999190612aec565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190612849565b61102c565b005b3480156104d757600080fd5b506104f260048036038101906104ed919061256d565b61103e565b6040516104ff9190612ccb565b60405180910390f35b34801561051457600080fd5b5061051d6110f7565b005b34801561052b57600080fd5b5061054660048036038101906105419190612730565b61110b565b005b34801561055457600080fd5b5061055d611161565b60405161056a9190612aec565b60405180910390f35b34801561057f57600080fd5b5061058861118b565b6040516105959190612b6e565b60405180910390f35b6105b860048036038101906105b39190612849565b61121d565b005b3480156105c657600080fd5b506105e160048036038101906105dc91906126b0565b611480565b005b3480156105ef57600080fd5b5061060a6004803603810190610605919061262d565b61158b565b005b34801561061857600080fd5b506106216115fe565b60405161062e9190612cb0565b60405180910390f35b34801561064357600080fd5b5061064c611612565b6040516106599190612cb0565b60405180910390f35b34801561066e57600080fd5b50610677611626565b005b34801561068557600080fd5b506106a0600480360381019061069b9190612849565b61165a565b6040516106ad9190612b6e565b60405180910390f35b3480156106c257600080fd5b506106dd60048036038101906106d891906126f0565b611701565b005b3480156106eb57600080fd5b506107066004803603810190610701919061281c565b611717565b005b34801561071457600080fd5b5061071d61173f565b60405161072a9190612ccb565b60405180910390f35b34801561073f57600080fd5b5061075a6004803603810190610755919061256d565b611745565b6040516107679190612ccb565b60405180910390f35b34801561077c57600080fd5b506107976004803603810190610792919061281c565b611757565b005b3480156107a557600080fd5b506107c060048036038101906107bb919061259a565b61177f565b6040516107cd9190612b53565b60405180910390f35b3480156107e257600080fd5b506107fd60048036038101906107f8919061256d565b611813565b005b34801561080b57600080fd5b50610826600480360381019061082191906126f0565b611897565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061088357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108b35750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546108c990612fe9565b80601f01602080910402602001604051908101604052809291908181526020018280546108f590612fe9565b80156109425780601f1061091757610100808354040283529160200191610942565b820191906000526020600020905b81548152906001019060200180831161092557829003601f168201915b5050505050905090565b600061095782611935565b61098d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109d68261101a565b90508073ffffffffffffffffffffffffffffffffffffffff166109f7611994565b73ffffffffffffffffffffffffffffffffffffffff1614610a5a57610a2381610a1e611994565b61177f565b610a59576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610b1761199c565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b6000610b6b611a1a565b6001546000540303905090565b6000610b8382611a1f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bea576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610bf684611aed565b91509150610c0c8187610c07611994565b611b14565b610c5857610c2186610c1c611994565b61177f565b610c57576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610cbf576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ccc8686866001611b58565b8015610cd757600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610da585610d81888887611b5e565b7c020000000000000000000000000000000000000000000000000000000017611b86565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610e2d576000600185019050600060046000838152602001908152602001600020541415610e2b576000548114610e2a578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e958686866001611bb1565b505050505050565b610ea561199c565b6000610eaf611161565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ed290612ad7565b60006040518083038185875af1925050503d8060008114610f0f576040519150601f19603f3d011682016040523d82523d6000602084013e610f14565b606091505b5050905080610f2257600080fd5b50565b600a8054610f3290612fe9565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5e90612fe9565b8015610fab5780601f10610f8057610100808354040283529160200191610fab565b820191906000526020600020905b815481529060010190602001808311610f8e57829003601f168201915b505050505081565b610fce8383836040518060200160405280600081525061158b565b505050565b610fdb61199c565b80600d8190555050565b610fed61199c565b80600a90805190602001906110039291906122ce565b5050565b600b60009054906101000a900460ff1681565b600061102582611a1f565b9050919050565b61103461199c565b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110a6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6110ff61199c565b6111096000611bb7565b565b61111361199c565b60005b815181101561115d57600082828151811061113457611133613153565b5b60200260200101519050611149816001611c7d565b5080806111559061304c565b915050611116565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461119a90612fe9565b80601f01602080910402602001604051908101604052809291908181526020018280546111c690612fe9565b80156112135780601f106111e857610100808354040283529160200191611213565b820191906000526020600020905b8154815290600101906020018083116111f657829003601f168201915b5050505050905090565b611225611161565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114235760006112623361103e565b9050600b60009054906101000a900460ff161561127e57600080fd5b600082116112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b890612c70565b60405180910390fd5b600b60019054906101000a900461ffff1661ffff16821115611318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130f90612c10565b60405180910390fd5b600c5482611324610b61565b61132e9190612e10565b111561136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136690612b90565b60405180910390fd5b600b60039054906101000a900461ffff1661ffff1682826113909190612e10565b11156113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c890612c90565b60405180910390fd5b81600d546113df9190612e97565b341015611421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141890612bd0565b60405180910390fd5b505b61142d3382611c7d565b3373ffffffffffffffffffffffffffffffffffffffff167f25b428dfde728ccfaddad7e29e4ac23c24ed7fd1a6e3e3f91894a9a073f5dfff8234604051611475929190612ce6565b60405180910390a250565b806007600061148d611994565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661153a611994565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161157f9190612b53565b60405180910390a35050565b611596848484610b78565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115f8576115c184848484611c8b565b6115f7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600b60019054906101000a900461ffff1681565b600b60039054906101000a900461ffff1681565b61162e61199c565b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b606061166582611935565b6116a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169b90612c50565b60405180910390fd5b60006116ae611deb565b905060008151116116ce57604051806020016040528060008152506116f9565b806116d884611e7d565b6040516020016116e9929190612ab3565b6040516020818303038152906040525b915050919050565b61170961199c565b6117138282611c7d565b5050565b61171f61199c565b80600b60036101000a81548161ffff021916908361ffff16021790555050565b600c5481565b600061175082611fde565b9050919050565b61175f61199c565b80600b60016101000a81548161ffff021916908361ffff16021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61181b61199c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561188b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188290612bb0565b60405180910390fd5b61189481611bb7565b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191e90612bf0565b60405180910390fd5b6119318282612035565b5050565b600081611940611a1a565b1115801561194f575060005482105b801561198d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6119a4612053565b73ffffffffffffffffffffffffffffffffffffffff166119c2611161565b73ffffffffffffffffffffffffffffffffffffffff1614611a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0f90612c30565b60405180910390fd5b565b600090565b60008082905080611a2e611a1a565b11611ab657600054811015611ab55760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611ab3575b6000811415611aa9576004600083600190039350838152602001908152602001600020549050611a7e565b8092505050611ae8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611b7586868461205b565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c878282612035565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cb1611994565b8786866040518563ffffffff1660e01b8152600401611cd39493929190612b07565b602060405180830381600087803b158015611ced57600080fd5b505af1925050508015611d1e57506040513d601f19601f82011682018060405250810190611d1b91906127a6565b60015b611d98573d8060008114611d4e576040519150601f19603f3d011682016040523d82523d6000602084013e611d53565b606091505b50600081511415611d90576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054611dfa90612fe9565b80601f0160208091040260200160405190810160405280929190818152602001828054611e2690612fe9565b8015611e735780601f10611e4857610100808354040283529160200191611e73565b820191906000526020600020905b815481529060010190602001808311611e5657829003601f168201915b5050505050905090565b60606000821415611ec5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fd9565b600082905060005b60008214611ef7578080611ee09061304c565b915050600a82611ef09190612e66565b9150611ecd565b60008167ffffffffffffffff811115611f1357611f12613182565b5b6040519080825280601f01601f191660200182016040528015611f455781602001600182028036833780820191505090505b5090505b60008514611fd257600182611f5e9190612ef1565b9150600a85611f6d9190613095565b6030611f799190612e10565b60f81b818381518110611f8f57611f8e613153565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611fcb9190612e66565b9450611f49565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b61204f828260405180602001604052806000815250612064565b5050565b600033905090565b60009392505050565b61206e8383612101565b60008373ffffffffffffffffffffffffffffffffffffffff163b146120fc57600080549050600083820390505b6120ae6000868380600101945086611c8b565b6120e4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061209b5781600054146120f957600080fd5b50505b505050565b6000805490506000821415612142576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61214f6000848385611b58565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506121c6836121b76000866000611b5e565b6121c0856122be565b17611b86565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461226757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061222c565b5060008214156122a3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506122b96000848385611bb1565b505050565b60006001821460e11b9050919050565b8280546122da90612fe9565b90600052602060002090601f0160209004810192826122fc5760008555612343565b82601f1061231557805160ff1916838001178555612343565b82800160010185558215612343579182015b82811115612342578251825591602001919060010190612327565b5b5090506123509190612354565b5090565b5b8082111561236d576000816000905550600101612355565b5090565b600061238461237f84612d34565b612d0f565b905080838252602082019050828560208602820111156123a7576123a66131b6565b5b60005b858110156123d757816123bd8882612465565b8452602084019350602083019250506001810190506123aa565b5050509392505050565b60006123f46123ef84612d60565b612d0f565b9050828152602081018484840111156124105761240f6131bb565b5b61241b848285612fa7565b509392505050565b600061243661243184612d91565b612d0f565b905082815260208101848484011115612452576124516131bb565b5b61245d848285612fa7565b509392505050565b6000813590506124748161340d565b92915050565b600082601f83011261248f5761248e6131b1565b5b813561249f848260208601612371565b91505092915050565b6000813590506124b781613424565b92915050565b6000813590506124cc8161343b565b92915050565b6000815190506124e18161343b565b92915050565b600082601f8301126124fc576124fb6131b1565b5b813561250c8482602086016123e1565b91505092915050565b600082601f83011261252a576125296131b1565b5b813561253a848260208601612423565b91505092915050565b60008135905061255281613452565b92915050565b60008135905061256781613469565b92915050565b600060208284031215612583576125826131c5565b5b600061259184828501612465565b91505092915050565b600080604083850312156125b1576125b06131c5565b5b60006125bf85828601612465565b92505060206125d085828601612465565b9150509250929050565b6000806000606084860312156125f3576125f26131c5565b5b600061260186828701612465565b935050602061261286828701612465565b925050604061262386828701612558565b9150509250925092565b60008060008060808587031215612647576126466131c5565b5b600061265587828801612465565b945050602061266687828801612465565b935050604061267787828801612558565b925050606085013567ffffffffffffffff811115612698576126976131c0565b5b6126a4878288016124e7565b91505092959194509250565b600080604083850312156126c7576126c66131c5565b5b60006126d585828601612465565b92505060206126e6858286016124a8565b9150509250929050565b60008060408385031215612707576127066131c5565b5b600061271585828601612465565b925050602061272685828601612558565b9150509250929050565b600060208284031215612746576127456131c5565b5b600082013567ffffffffffffffff811115612764576127636131c0565b5b6127708482850161247a565b91505092915050565b60006020828403121561278f5761278e6131c5565b5b600061279d848285016124bd565b91505092915050565b6000602082840312156127bc576127bb6131c5565b5b60006127ca848285016124d2565b91505092915050565b6000602082840312156127e9576127e86131c5565b5b600082013567ffffffffffffffff811115612807576128066131c0565b5b61281384828501612515565b91505092915050565b600060208284031215612832576128316131c5565b5b600061284084828501612543565b91505092915050565b60006020828403121561285f5761285e6131c5565b5b600061286d84828501612558565b91505092915050565b61287f81612f25565b82525050565b61288e81612f37565b82525050565b600061289f82612dc2565b6128a98185612dd8565b93506128b9818560208601612fb6565b6128c2816131ca565b840191505092915050565b60006128d882612dcd565b6128e28185612df4565b93506128f2818560208601612fb6565b6128fb816131ca565b840191505092915050565b600061291182612dcd565b61291b8185612e05565b935061292b818560208601612fb6565b80840191505092915050565b6000612944601283612df4565b915061294f826131db565b602082019050919050565b6000612967602683612df4565b915061297282613204565b604082019050919050565b600061298a601083612df4565b915061299582613253565b602082019050919050565b60006129ad602783612df4565b91506129b88261327c565b604082019050919050565b60006129d0602783612df4565b91506129db826132cb565b604082019050919050565b60006129f3602083612df4565b91506129fe8261331a565b602082019050919050565b6000612a16602f83612df4565b9150612a2182613343565b604082019050919050565b6000612a39600083612de9565b9150612a4482613392565b600082019050919050565b6000612a5c602483612df4565b9150612a6782613395565b604082019050919050565b6000612a7f601883612df4565b9150612a8a826133e4565b602082019050919050565b612a9e81612f6f565b82525050565b612aad81612f9d565b82525050565b6000612abf8285612906565b9150612acb8284612906565b91508190509392505050565b6000612ae282612a2c565b9150819050919050565b6000602082019050612b016000830184612876565b92915050565b6000608082019050612b1c6000830187612876565b612b296020830186612876565b612b366040830185612aa4565b8181036060830152612b488184612894565b905095945050505050565b6000602082019050612b686000830184612885565b92915050565b60006020820190508181036000830152612b8881846128cd565b905092915050565b60006020820190508181036000830152612ba981612937565b9050919050565b60006020820190508181036000830152612bc98161295a565b9050919050565b60006020820190508181036000830152612be98161297d565b9050919050565b60006020820190508181036000830152612c09816129a0565b9050919050565b60006020820190508181036000830152612c29816129c3565b9050919050565b60006020820190508181036000830152612c49816129e6565b9050919050565b60006020820190508181036000830152612c6981612a09565b9050919050565b60006020820190508181036000830152612c8981612a4f565b9050919050565b60006020820190508181036000830152612ca981612a72565b9050919050565b6000602082019050612cc56000830184612a95565b92915050565b6000602082019050612ce06000830184612aa4565b92915050565b6000604082019050612cfb6000830185612aa4565b612d086020830184612aa4565b9392505050565b6000612d19612d2a565b9050612d25828261301b565b919050565b6000604051905090565b600067ffffffffffffffff821115612d4f57612d4e613182565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612d7b57612d7a613182565b5b612d84826131ca565b9050602081019050919050565b600067ffffffffffffffff821115612dac57612dab613182565b5b612db5826131ca565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612e1b82612f9d565b9150612e2683612f9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e5b57612e5a6130c6565b5b828201905092915050565b6000612e7182612f9d565b9150612e7c83612f9d565b925082612e8c57612e8b6130f5565b5b828204905092915050565b6000612ea282612f9d565b9150612ead83612f9d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612ee657612ee56130c6565b5b828202905092915050565b6000612efc82612f9d565b9150612f0783612f9d565b925082821015612f1a57612f196130c6565b5b828203905092915050565b6000612f3082612f7d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612fd4578082015181840152602081019050612fb9565b83811115612fe3576000848401525b50505050565b6000600282049050600182168061300157607f821691505b6020821081141561301557613014613124565b5b50919050565b613024826131ca565b810181811067ffffffffffffffff8211171561304357613042613182565b5b80604052505050565b600061305782612f9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561308a576130896130c6565b5b600182019050919050565b60006130a082612f9d565b91506130ab83612f9d565b9250826130bb576130ba6130f5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45786365656473204d617820537570706c790000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e7375666669656e742066756e647300000000000000000000000000000000600082015250565b7f536f72727920796f7520646f6e27742068617665207065726d697373696f6e2060008201527f746f206d696e7400000000000000000000000000000000000000000000000000602082015250565b7f536f72727920796f752063616e74206d696e74207468697320616d6f756e742060008201527f6174206f6e636500000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f4d696e7420616d6f756e742073686f756c64206265206772656174657220746860008201527f616e203000000000000000000000000000000000000000000000000000000000602082015250565b7f536f72727920796f752063616e74206d696e74206d6f72650000000000000000600082015250565b61341681612f25565b811461342157600080fd5b50565b61342d81612f37565b811461343857600080fd5b50565b61344481612f43565b811461344f57600080fd5b50565b61345b81612f6f565b811461346657600080fd5b50565b61347281612f9d565b811461347d57600080fd5b5056fea26469706673582212205e6ab8086bc79751eba18f8a7c12a3b2b0b3c76446fe85b9971cdcfed16e04ff64736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f75732d63656e7472616c312d6d6f666f732d36396136322e636c6f756466756e6374696f6e732e6e65742f6170702f70697a7a612f746f6b656e2f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseUrl (string): https://us-central1-mofos-69a62.cloudfunctions.net/app/pizza/token/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [2] : 68747470733a2f2f75732d63656e7472616c312d6d6f666f732d36396136322e
Arg [3] : 636c6f756466756e6374696f6e732e6e65742f6170702f70697a7a612f746f6b
Arg [4] : 656e2f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

57200:4221:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24533:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25435:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31918:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31359:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57949:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57690:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21186:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35557:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61263:155;;;:::i;:::-;;57399:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38470:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60446:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60922:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57452:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26828:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60820:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22370:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5307:103;;;;;;;;;;;;;:::i;:::-;;59581:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4659:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25611:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58538:916;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32476:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39253:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57516:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57568:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61037:75;;;;;;;;;;;;;:::i;:::-;;59951:487;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59462:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60686:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57636:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58402:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60549:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32867:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5565:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58140:252;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24533:639;24618:4;24957:10;24942:25;;:11;:25;;;;:102;;;;25034:10;25019:25;;:11;:25;;;;24942:102;:179;;;;25111:10;25096:25;;:11;:25;;;;24942:179;24922:199;;24533:639;;;:::o;25435:100::-;25489:13;25522:5;25515:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25435:100;:::o;31918:218::-;31994:7;32019:16;32027:7;32019;:16::i;:::-;32014:64;;32044:34;;;;;;;;;;;;;;32014:64;32098:15;:24;32114:7;32098:24;;;;;;;;;;;:30;;;;;;;;;;;;32091:37;;31918:218;;;:::o;31359:400::-;31440:13;31456:16;31464:7;31456;:16::i;:::-;31440:32;;31512:5;31489:28;;:19;:17;:19::i;:::-;:28;;;31485:175;;31537:44;31554:5;31561:19;:17;:19::i;:::-;31537:16;:44::i;:::-;31532:128;;31609:35;;;;;;;;;;;;;;31532:128;31485:175;31705:2;31672:15;:24;31688:7;31672:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;31743:7;31739:2;31723:28;;31732:5;31723:28;;;;;;;;;;;;31429:330;31359:400;;:::o;57949:113::-;4545:13;:11;:13::i;:::-;58045:9:::1;58025:17;;:29;;;;;;;;;;;;;;;;;;57949:113:::0;:::o;57690:29::-;;;;:::o;21186:323::-;21247:7;21475:15;:13;:15::i;:::-;21460:12;;21444:13;;:28;:46;21437:53;;21186:323;:::o;35557:2817::-;35691:27;35721;35740:7;35721:18;:27::i;:::-;35691:57;;35806:4;35765:45;;35781:19;35765:45;;;35761:86;;35819:28;;;;;;;;;;;;;;35761:86;35861:27;35890:23;35917:35;35944:7;35917:26;:35::i;:::-;35860:92;;;;36052:68;36077:15;36094:4;36100:19;:17;:19::i;:::-;36052:24;:68::i;:::-;36047:180;;36140:43;36157:4;36163:19;:17;:19::i;:::-;36140:16;:43::i;:::-;36135:92;;36192:35;;;;;;;;;;;;;;36135:92;36047:180;36258:1;36244:16;;:2;:16;;;36240:52;;;36269:23;;;;;;;;;;;;;;36240:52;36305:43;36327:4;36333:2;36337:7;36346:1;36305:21;:43::i;:::-;36441:15;36438:160;;;36581:1;36560:19;36553:30;36438:160;36978:18;:24;36997:4;36978:24;;;;;;;;;;;;;;;;36976:26;;;;;;;;;;;;37047:18;:22;37066:2;37047:22;;;;;;;;;;;;;;;;37045:24;;;;;;;;;;;37369:146;37406:2;37455:45;37470:4;37476:2;37480:19;37455:14;:45::i;:::-;17585:8;37427:73;37369:18;:146::i;:::-;37340:17;:26;37358:7;37340:26;;;;;;;;;;;:175;;;;37686:1;17585:8;37635:19;:47;:52;37631:627;;;37708:19;37740:1;37730:7;:11;37708:33;;37897:1;37863:17;:30;37881:11;37863:30;;;;;;;;;;;;:35;37859:384;;;38001:13;;37986:11;:28;37982:242;;38181:19;38148:17;:30;38166:11;38148:30;;;;;;;;;;;:52;;;;37982:242;37859:384;37689:569;37631:627;38305:7;38301:2;38286:27;;38295:4;38286:27;;;;;;;;;;;;38324:42;38345:4;38351:2;38355:7;38364:1;38324:20;:42::i;:::-;35680:2694;;;35557:2817;;;:::o;61263:155::-;4545:13;:11;:13::i;:::-;61320:7:::1;61341;:5;:7::i;:::-;61333:21;;61362;61333:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61319:69;;;61407:2;61399:11;;;::::0;::::1;;61308:110;61263:155::o:0;57399:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38470:185::-;38608:39;38625:4;38631:2;38635:7;38608:39;;;;;;;;;;;;:16;:39::i;:::-;38470:185;;;:::o;60446:87::-;4545:13;:11;:13::i;:::-;60517:8:::1;60510:4;:15;;;;60446:87:::0;:::o;60922:107::-;4545:13;:11;:13::i;:::-;61010:11:::1;60997:10;:24;;;;;;;;;;;;:::i;:::-;;60922:107:::0;:::o;57452:26::-;;;;;;;;;;;;;:::o;26828:152::-;26900:7;26943:27;26962:7;26943:18;:27::i;:::-;26920:52;;26828:152;;;:::o;60820:94::-;4545:13;:11;:13::i;:::-;60899:7:::1;60887:9;:19;;;;60820:94:::0;:::o;22370:233::-;22442:7;22483:1;22466:19;;:5;:19;;;22462:60;;;22494:28;;;;;;;;;;;;;;22462:60;16529:13;22540:18;:25;22559:5;22540:25;;;;;;;;;;;;;;;;:55;22533:62;;22370:233;;;:::o;5307:103::-;4545:13;:11;:13::i;:::-;5372:30:::1;5399:1;5372:18;:30::i;:::-;5307:103::o:0;59581:243::-;4545:13;:11;:13::i;:::-;59676:9:::1;59671:146;59695:17;:24;59691:1;:28;59671:146;;;59741:10;59754:17;59772:1;59754:20;;;;;;;;:::i;:::-;;;;;;;;59741:33;;59789:16;59799:2;59803:1;59789:9;:16::i;:::-;59726:91;59721:3;;;;;:::i;:::-;;;;59671:146;;;;59581:243:::0;:::o;4659:87::-;4705:7;4732:6;;;;;;;;;;;4725:13;;4659:87;:::o;25611:104::-;25667:13;25700:7;25693:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25611:104;:::o;58538:916::-;58617:7;:5;:7::i;:::-;58603:21;;:10;:21;;;58599:741;;58641:23;58667:21;58677:10;58667:9;:21::i;:::-;58641:47;;58714:6;;;;;;;;;;;58713:7;58705:16;;;;;;58758:1;58744:11;:15;58736:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;58856:27;;;;;;;;;;;58841:42;;:11;:42;;58815:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;59030:9;;59015:11;58999:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;58973:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;59169:22;;;;;;;;;;;59134:57;;59153:11;59135:15;:29;;;;:::i;:::-;59134:57;;59108:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;59296:11;59289:4;;:18;;;;:::i;:::-;59276:9;:31;;59268:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;58626:714;58599:741;59352:34;59362:10;59374:11;59352:9;:34::i;:::-;59410:10;59403:43;;;59423:11;59436:9;59403:43;;;;;;;:::i;:::-;;;;;;;;58538:916;:::o;32476:234::-;32623:8;32571:18;:39;32590:19;:17;:19::i;:::-;32571:39;;;;;;;;;;;;;;;:49;32611:8;32571:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;32683:8;32647:55;;32662:19;:17;:19::i;:::-;32647:55;;;32693:8;32647:55;;;;;;:::i;:::-;;;;;;;;32476:234;;:::o;39253:399::-;39420:31;39433:4;39439:2;39443:7;39420:12;:31::i;:::-;39484:1;39466:2;:14;;;:19;39462:183;;39505:56;39536:4;39542:2;39546:7;39555:5;39505:30;:56::i;:::-;39500:145;;39589:40;;;;;;;;;;;;;;39500:145;39462:183;39253:399;;;;:::o;57516:45::-;;;;;;;;;;;;;:::o;57568:40::-;;;;;;;;;;;;;:::o;61037:75::-;4545:13;:11;:13::i;:::-;61098:6:::1;;;;;;;;;;;61097:7;61088:6;;:16;;;;;;;;;;;;;;;;;;61037:75::o:0;59951:487::-;60069:13;60122:16;60130:7;60122;:16::i;:::-;60100:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;60224:28;60255:10;:8;:10::i;:::-;60224:41;;60327:1;60302:14;60296:28;:32;:134;;;;;;;;;;;;;;;;;60372:14;60388:18;:7;:16;:18::i;:::-;60355:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60296:134;60276:154;;;59951:487;;;:::o;59462:111::-;4545:13;:11;:13::i;:::-;59538:27:::1;59548:3;59553:11;59538:9;:27::i;:::-;59462:111:::0;;:::o;60686:119::-;4545:13;:11;:13::i;:::-;60790:7:::1;60765:22;;:32;;;;;;;;;;;;;;;;;;60686:119:::0;:::o;57636:31::-;;;;:::o;58402:113::-;58460:7;58487:20;58501:5;58487:13;:20::i;:::-;58480:27;;58402:113;;;:::o;60549:129::-;4545:13;:11;:13::i;:::-;60663:7:::1;60633:27;;:37;;;;;;;;;;;;;;;;;;60549:129:::0;:::o;32867:164::-;32964:4;32988:18;:25;33007:5;32988:25;;;;;;;;;;;;;;;:35;33014:8;32988:35;;;;;;;;;;;;;;;;;;;;;;;;;32981:42;;32867:164;;;;:::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;58140:252::-;58257:17;;;;;;;;;;;58243:31;;:10;:31;;;58221:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;58352:32;58362:8;58372:11;58352:9;:32::i;:::-;58140:252;;:::o;33289:282::-;33354:4;33410:7;33391:15;:13;:15::i;:::-;:26;;:66;;;;;33444:13;;33434:7;:23;33391:66;:153;;;;;33543:1;17305:8;33495:17;:26;33513:7;33495:26;;;;;;;;;;;;:44;:49;33391:153;33371:173;;33289:282;;;:::o;55327:105::-;55387:7;55414:10;55407:17;;55327:105;:::o;4824:132::-;4899:12;:10;:12::i;:::-;4888:23;;:7;:5;:7::i;:::-;:23;;;4880:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4824:132::o;20702:92::-;20758:7;20702:92;:::o;27983:1275::-;28050:7;28070:12;28085:7;28070:22;;28153:4;28134:15;:13;:15::i;:::-;:23;28130:1061;;28187:13;;28180:4;:20;28176:1015;;;28225:14;28242:17;:23;28260:4;28242:23;;;;;;;;;;;;28225:40;;28359:1;17305:8;28331:6;:24;:29;28327:845;;;28996:113;29013:1;29003:6;:11;28996:113;;;29056:17;:25;29074:6;;;;;;;29056:25;;;;;;;;;;;;29047:34;;28996:113;;;29142:6;29135:13;;;;;;28327:845;28202:989;28176:1015;28130:1061;29219:31;;;;;;;;;;;;;;27983:1275;;;;:::o;34452:485::-;34554:27;34583:23;34624:38;34665:15;:24;34681:7;34665:24;;;;;;;;;;;34624:65;;34842:18;34819:41;;34899:19;34893:26;34874:45;;34804:126;34452:485;;;:::o;33680:659::-;33829:11;33994:16;33987:5;33983:28;33974:37;;34154:16;34143:9;34139:32;34126:45;;34304:15;34293:9;34290:30;34282:5;34271:9;34268:20;34265:56;34255:66;;33680:659;;;;;:::o;40314:159::-;;;;;:::o;54636:311::-;54771:7;54791:16;17709:3;54817:19;:41;;54791:68;;17709:3;54885:31;54896:4;54902:2;54906:9;54885:10;:31::i;:::-;54877:40;;:62;;54870:69;;;54636:311;;;;;:::o;29806:450::-;29886:14;30054:16;30047:5;30043:28;30034:37;;30231:5;30217:11;30192:23;30188:41;30185:52;30178:5;30175:63;30165:73;;29806:450;;;;:::o;41138: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;61128:120::-;61207:33;61217:9;61228:11;61207:9;:33::i;:::-;61128:120;;:::o;41736:716::-;41899:4;41945:2;41920:45;;;41966:19;:17;:19::i;:::-;41987:4;41993:7;42002:5;41920:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41916:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42220:1;42203:6;:13;:18;42199:235;;;42249:40;;;;;;;;;;;;;;42199:235;42392:6;42386:13;42377:6;42373:2;42369:15;42362:38;41916:529;42089:54;;;42079:64;;;:6;:64;;;;42072:71;;;41736:716;;;;;;:::o;59832:111::-;59892:13;59925:10;59918:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59832:111;:::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;22685:178::-;22746:7;16529:13;16667:2;22774:18;:25;22793:5;22774:25;;;;;;;;;;;;;;;;:50;;22773:82;22766:89;;22685:178;;;:::o;49159:112::-;49236:27;49246:2;49250:8;49236:27;;;;;;;;;;;;:9;:27::i;:::-;49159:112;;:::o;3210:98::-;3263:7;3290:10;3283:17;;3210:98;:::o;54337:147::-;54474:6;54337:147;;;;;:::o;48386:689::-;48517:19;48523:2;48527:8;48517:5;:19::i;:::-;48596:1;48578:2;:14;;;:19;48574:483;;48618:11;48632:13;;48618:27;;48664:13;48686:8;48680:3;:14;48664:30;;48713:233;48744:62;48783:1;48787:2;48791:7;;;;;;48800:5;48744:30;:62::i;:::-;48739:167;;48842:40;;;;;;;;;;;;;;48739:167;48941:3;48933:5;:11;48713:233;;49028:3;49011:13;;:20;49007:34;;49033:8;;;49007:34;48599:458;;48574:483;48386:689;;;:::o;42914:2720::-;42987:20;43010:13;;42987:36;;43050:1;43038:8;:13;43034:44;;;43060:18;;;;;;;;;;;;;;43034:44;43091:61;43121:1;43125:2;43129:12;43143:8;43091:21;:61::i;:::-;43635:1;16667:2;43605:1;:26;;43604:32;43592:8;:45;43566:18;:22;43585:2;43566:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;43914:139;43951:2;44005:33;44028:1;44032:2;44036:1;44005:14;:33::i;:::-;43972:30;43993:8;43972:20;:30::i;:::-;:66;43914:18;:139::i;:::-;43880:17;:31;43898:12;43880:31;;;;;;;;;;;:173;;;;44070:16;44101:11;44130:8;44115:12;:23;44101:37;;44651:16;44647:2;44643:25;44631:37;;45023:12;44983:8;44942:1;44880:25;44821:1;44760;44733:335;45148:1;45134:12;45130:20;45088:346;45189:3;45180:7;45177:16;45088:346;;45407:7;45397:8;45394:1;45367:25;45364:1;45361;45356:59;45242:1;45233:7;45229:15;45218:26;;45088:346;;;45092:77;45479:1;45467:8;:13;45463:45;;;45489:19;;;;;;;;;;;;;;45463:45;45541:3;45525:13;:19;;;;43340:2216;;45566:60;45595:1;45599:2;45603:12;45617:8;45566:20;:60::i;:::-;42976:2658;42914:2720;;:::o;30358:324::-;30428:14;30661:1;30651:8;30648:15;30622:24;30618:46;30608:56;;30358:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:122;;3037:79;;:::i;:::-;2996:122;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;2924:340;;;;:::o;3270:137::-;3315:5;3353:6;3340:20;3331:29;;3369:32;3395:5;3369:32;:::i;:::-;3270:137;;;;:::o;3413:139::-;3459:5;3497:6;3484:20;3475:29;;3513:33;3540:5;3513:33;:::i;:::-;3413:139;;;;:::o;3558:329::-;3617:6;3666:2;3654:9;3645:7;3641:23;3637:32;3634:119;;;3672:79;;:::i;:::-;3634:119;3792:1;3817:53;3862:7;3853:6;3842:9;3838:22;3817:53;:::i;:::-;3807:63;;3763:117;3558:329;;;;:::o;3893:474::-;3961:6;3969;4018:2;4006:9;3997:7;3993:23;3989:32;3986:119;;;4024:79;;:::i;:::-;3986:119;4144:1;4169:53;4214:7;4205:6;4194:9;4190:22;4169:53;:::i;:::-;4159:63;;4115:117;4271:2;4297:53;4342:7;4333:6;4322:9;4318:22;4297:53;:::i;:::-;4287:63;;4242:118;3893:474;;;;;:::o;4373:619::-;4450:6;4458;4466;4515:2;4503:9;4494:7;4490:23;4486:32;4483:119;;;4521:79;;:::i;:::-;4483:119;4641:1;4666:53;4711:7;4702:6;4691:9;4687:22;4666:53;:::i;:::-;4656:63;;4612:117;4768:2;4794:53;4839:7;4830:6;4819:9;4815:22;4794:53;:::i;:::-;4784:63;;4739:118;4896:2;4922:53;4967:7;4958:6;4947:9;4943:22;4922:53;:::i;:::-;4912:63;;4867:118;4373:619;;;;;:::o;4998:943::-;5093:6;5101;5109;5117;5166:3;5154:9;5145:7;5141:23;5137:33;5134:120;;;5173:79;;:::i;:::-;5134:120;5293:1;5318:53;5363:7;5354:6;5343:9;5339:22;5318:53;:::i;:::-;5308:63;;5264:117;5420:2;5446:53;5491:7;5482:6;5471:9;5467:22;5446:53;:::i;:::-;5436:63;;5391:118;5548:2;5574:53;5619:7;5610:6;5599:9;5595:22;5574:53;:::i;:::-;5564:63;;5519:118;5704:2;5693:9;5689:18;5676:32;5735:18;5727:6;5724:30;5721:117;;;5757:79;;:::i;:::-;5721:117;5862:62;5916:7;5907:6;5896:9;5892:22;5862:62;:::i;:::-;5852:72;;5647:287;4998:943;;;;;;;:::o;5947:468::-;6012:6;6020;6069:2;6057:9;6048:7;6044:23;6040:32;6037:119;;;6075:79;;:::i;:::-;6037:119;6195:1;6220:53;6265:7;6256:6;6245:9;6241:22;6220:53;:::i;:::-;6210:63;;6166:117;6322:2;6348:50;6390:7;6381:6;6370:9;6366:22;6348:50;:::i;:::-;6338:60;;6293:115;5947:468;;;;;:::o;6421:474::-;6489:6;6497;6546:2;6534:9;6525:7;6521:23;6517:32;6514:119;;;6552:79;;:::i;:::-;6514:119;6672:1;6697:53;6742:7;6733:6;6722:9;6718:22;6697:53;:::i;:::-;6687:63;;6643:117;6799:2;6825:53;6870:7;6861:6;6850:9;6846:22;6825:53;:::i;:::-;6815:63;;6770:118;6421:474;;;;;:::o;6901:539::-;6985:6;7034:2;7022:9;7013:7;7009:23;7005:32;7002:119;;;7040:79;;:::i;:::-;7002:119;7188:1;7177:9;7173:17;7160:31;7218:18;7210:6;7207:30;7204:117;;;7240:79;;:::i;:::-;7204:117;7345:78;7415:7;7406:6;7395:9;7391:22;7345:78;:::i;:::-;7335:88;;7131:302;6901:539;;;;:::o;7446:327::-;7504:6;7553:2;7541:9;7532:7;7528:23;7524:32;7521:119;;;7559:79;;:::i;:::-;7521:119;7679:1;7704:52;7748:7;7739:6;7728:9;7724:22;7704:52;:::i;:::-;7694:62;;7650:116;7446:327;;;;:::o;7779:349::-;7848:6;7897:2;7885:9;7876:7;7872:23;7868:32;7865:119;;;7903:79;;:::i;:::-;7865:119;8023:1;8048:63;8103:7;8094:6;8083:9;8079:22;8048:63;:::i;:::-;8038:73;;7994:127;7779:349;;;;:::o;8134:509::-;8203:6;8252:2;8240:9;8231:7;8227:23;8223:32;8220:119;;;8258:79;;:::i;:::-;8220:119;8406:1;8395:9;8391:17;8378:31;8436:18;8428:6;8425:30;8422:117;;;8458:79;;:::i;:::-;8422:117;8563:63;8618:7;8609:6;8598:9;8594:22;8563:63;:::i;:::-;8553:73;;8349:287;8134:509;;;;:::o;8649:327::-;8707:6;8756:2;8744:9;8735:7;8731:23;8727:32;8724:119;;;8762:79;;:::i;:::-;8724:119;8882:1;8907:52;8951:7;8942:6;8931:9;8927:22;8907:52;:::i;:::-;8897:62;;8853:116;8649:327;;;;:::o;8982:329::-;9041:6;9090:2;9078:9;9069:7;9065:23;9061:32;9058:119;;;9096:79;;:::i;:::-;9058:119;9216:1;9241:53;9286:7;9277:6;9266:9;9262:22;9241:53;:::i;:::-;9231:63;;9187:117;8982:329;;;;:::o;9317:118::-;9404:24;9422:5;9404:24;:::i;:::-;9399:3;9392:37;9317:118;;:::o;9441:109::-;9522:21;9537:5;9522:21;:::i;:::-;9517:3;9510:34;9441:109;;:::o;9556:360::-;9642:3;9670:38;9702:5;9670:38;:::i;:::-;9724:70;9787:6;9782:3;9724:70;:::i;:::-;9717:77;;9803:52;9848:6;9843:3;9836:4;9829:5;9825:16;9803:52;:::i;:::-;9880:29;9902:6;9880:29;:::i;:::-;9875:3;9871:39;9864:46;;9646:270;9556:360;;;;:::o;9922:364::-;10010:3;10038:39;10071:5;10038:39;:::i;:::-;10093:71;10157:6;10152:3;10093:71;:::i;:::-;10086:78;;10173:52;10218:6;10213:3;10206:4;10199:5;10195:16;10173:52;:::i;:::-;10250:29;10272:6;10250:29;:::i;:::-;10245:3;10241:39;10234:46;;10014:272;9922:364;;;;:::o;10292:377::-;10398:3;10426:39;10459:5;10426:39;:::i;:::-;10481:89;10563:6;10558:3;10481:89;:::i;:::-;10474:96;;10579:52;10624:6;10619:3;10612:4;10605:5;10601:16;10579:52;:::i;:::-;10656:6;10651:3;10647:16;10640:23;;10402:267;10292:377;;;;:::o;10675:366::-;10817:3;10838:67;10902:2;10897:3;10838:67;:::i;:::-;10831:74;;10914:93;11003:3;10914:93;:::i;:::-;11032:2;11027:3;11023:12;11016:19;;10675:366;;;:::o;11047:::-;11189:3;11210:67;11274:2;11269:3;11210:67;:::i;:::-;11203:74;;11286:93;11375:3;11286:93;:::i;:::-;11404:2;11399:3;11395:12;11388:19;;11047:366;;;:::o;11419:::-;11561:3;11582:67;11646:2;11641:3;11582:67;:::i;:::-;11575:74;;11658:93;11747:3;11658:93;:::i;:::-;11776:2;11771:3;11767:12;11760:19;;11419:366;;;:::o;11791:::-;11933:3;11954:67;12018:2;12013:3;11954:67;:::i;:::-;11947:74;;12030:93;12119:3;12030:93;:::i;:::-;12148:2;12143:3;12139:12;12132:19;;11791:366;;;:::o;12163:::-;12305:3;12326:67;12390:2;12385:3;12326:67;:::i;:::-;12319:74;;12402:93;12491:3;12402:93;:::i;:::-;12520:2;12515:3;12511:12;12504:19;;12163:366;;;:::o;12535:::-;12677:3;12698:67;12762:2;12757:3;12698:67;:::i;:::-;12691:74;;12774:93;12863:3;12774:93;:::i;:::-;12892:2;12887:3;12883:12;12876:19;;12535:366;;;:::o;12907:::-;13049:3;13070:67;13134:2;13129:3;13070:67;:::i;:::-;13063:74;;13146:93;13235:3;13146:93;:::i;:::-;13264:2;13259:3;13255:12;13248:19;;12907:366;;;:::o;13279:398::-;13438:3;13459:83;13540:1;13535:3;13459:83;:::i;:::-;13452:90;;13551:93;13640:3;13551:93;:::i;:::-;13669:1;13664:3;13660:11;13653:18;;13279:398;;;:::o;13683:366::-;13825:3;13846:67;13910:2;13905:3;13846:67;:::i;:::-;13839:74;;13922:93;14011:3;13922:93;:::i;:::-;14040:2;14035:3;14031:12;14024:19;;13683:366;;;:::o;14055:::-;14197:3;14218:67;14282:2;14277:3;14218:67;:::i;:::-;14211:74;;14294:93;14383:3;14294:93;:::i;:::-;14412:2;14407:3;14403:12;14396:19;;14055:366;;;:::o;14427:115::-;14512:23;14529:5;14512:23;:::i;:::-;14507:3;14500:36;14427:115;;:::o;14548:118::-;14635:24;14653:5;14635:24;:::i;:::-;14630:3;14623:37;14548:118;;:::o;14672:435::-;14852:3;14874:95;14965:3;14956:6;14874:95;:::i;:::-;14867:102;;14986:95;15077:3;15068:6;14986:95;:::i;:::-;14979:102;;15098:3;15091:10;;14672:435;;;;;:::o;15113:379::-;15297:3;15319:147;15462:3;15319:147;:::i;:::-;15312:154;;15483:3;15476:10;;15113:379;;;:::o;15498:222::-;15591:4;15629:2;15618:9;15614:18;15606:26;;15642:71;15710:1;15699:9;15695:17;15686:6;15642:71;:::i;:::-;15498:222;;;;:::o;15726:640::-;15921:4;15959:3;15948:9;15944:19;15936:27;;15973:71;16041:1;16030:9;16026:17;16017:6;15973:71;:::i;:::-;16054:72;16122:2;16111:9;16107:18;16098:6;16054:72;:::i;:::-;16136;16204:2;16193:9;16189:18;16180:6;16136:72;:::i;:::-;16255:9;16249:4;16245:20;16240:2;16229:9;16225:18;16218:48;16283:76;16354:4;16345:6;16283:76;:::i;:::-;16275:84;;15726:640;;;;;;;:::o;16372:210::-;16459:4;16497:2;16486:9;16482:18;16474:26;;16510:65;16572:1;16561:9;16557:17;16548:6;16510:65;:::i;:::-;16372:210;;;;:::o;16588:313::-;16701:4;16739:2;16728:9;16724:18;16716:26;;16788:9;16782:4;16778:20;16774:1;16763:9;16759:17;16752:47;16816:78;16889:4;16880:6;16816:78;:::i;:::-;16808:86;;16588:313;;;;:::o;16907:419::-;17073:4;17111:2;17100:9;17096:18;17088:26;;17160:9;17154:4;17150:20;17146:1;17135:9;17131:17;17124:47;17188:131;17314:4;17188:131;:::i;:::-;17180:139;;16907:419;;;:::o;17332:::-;17498:4;17536:2;17525:9;17521:18;17513:26;;17585:9;17579:4;17575:20;17571:1;17560:9;17556:17;17549:47;17613:131;17739:4;17613:131;:::i;:::-;17605:139;;17332:419;;;:::o;17757:::-;17923:4;17961:2;17950:9;17946:18;17938:26;;18010:9;18004:4;18000:20;17996:1;17985:9;17981:17;17974:47;18038:131;18164:4;18038:131;:::i;:::-;18030:139;;17757:419;;;:::o;18182:::-;18348:4;18386:2;18375:9;18371:18;18363:26;;18435:9;18429:4;18425:20;18421:1;18410:9;18406:17;18399:47;18463:131;18589:4;18463:131;:::i;:::-;18455:139;;18182:419;;;:::o;18607:::-;18773:4;18811:2;18800:9;18796:18;18788:26;;18860:9;18854:4;18850:20;18846:1;18835:9;18831:17;18824:47;18888:131;19014:4;18888:131;:::i;:::-;18880:139;;18607:419;;;:::o;19032:::-;19198:4;19236:2;19225:9;19221:18;19213:26;;19285:9;19279:4;19275:20;19271:1;19260:9;19256:17;19249:47;19313:131;19439:4;19313:131;:::i;:::-;19305:139;;19032:419;;;:::o;19457:::-;19623:4;19661:2;19650:9;19646:18;19638:26;;19710:9;19704:4;19700:20;19696:1;19685:9;19681:17;19674:47;19738:131;19864:4;19738:131;:::i;:::-;19730:139;;19457:419;;;:::o;19882:::-;20048:4;20086:2;20075:9;20071:18;20063:26;;20135:9;20129:4;20125:20;20121:1;20110:9;20106:17;20099:47;20163:131;20289:4;20163:131;:::i;:::-;20155:139;;19882:419;;;:::o;20307:::-;20473:4;20511:2;20500:9;20496:18;20488:26;;20560:9;20554:4;20550:20;20546:1;20535:9;20531:17;20524:47;20588:131;20714:4;20588:131;:::i;:::-;20580:139;;20307:419;;;:::o;20732:218::-;20823:4;20861:2;20850:9;20846:18;20838:26;;20874:69;20940:1;20929:9;20925:17;20916:6;20874:69;:::i;:::-;20732:218;;;;:::o;20956:222::-;21049:4;21087:2;21076:9;21072:18;21064:26;;21100:71;21168:1;21157:9;21153:17;21144:6;21100:71;:::i;:::-;20956:222;;;;:::o;21184:332::-;21305:4;21343:2;21332:9;21328:18;21320:26;;21356:71;21424:1;21413:9;21409:17;21400:6;21356:71;:::i;:::-;21437:72;21505:2;21494:9;21490:18;21481:6;21437:72;:::i;:::-;21184:332;;;;;:::o;21522:129::-;21556:6;21583:20;;:::i;:::-;21573:30;;21612:33;21640:4;21632:6;21612:33;:::i;:::-;21522:129;;;:::o;21657:75::-;21690:6;21723:2;21717:9;21707:19;;21657:75;:::o;21738:311::-;21815:4;21905:18;21897:6;21894:30;21891:56;;;21927:18;;:::i;:::-;21891:56;21977:4;21969:6;21965:17;21957:25;;22037:4;22031;22027:15;22019:23;;21738:311;;;:::o;22055:307::-;22116:4;22206:18;22198:6;22195:30;22192:56;;;22228:18;;:::i;:::-;22192:56;22266:29;22288:6;22266:29;:::i;:::-;22258:37;;22350:4;22344;22340:15;22332:23;;22055:307;;;:::o;22368:308::-;22430:4;22520:18;22512:6;22509:30;22506:56;;;22542:18;;:::i;:::-;22506:56;22580:29;22602:6;22580:29;:::i;:::-;22572:37;;22664:4;22658;22654:15;22646:23;;22368:308;;;:::o;22682:98::-;22733:6;22767:5;22761:12;22751:22;;22682:98;;;:::o;22786:99::-;22838:6;22872:5;22866:12;22856:22;;22786:99;;;:::o;22891:168::-;22974:11;23008:6;23003:3;22996:19;23048:4;23043:3;23039:14;23024:29;;22891:168;;;;:::o;23065:147::-;23166:11;23203:3;23188:18;;23065:147;;;;:::o;23218:169::-;23302:11;23336:6;23331:3;23324:19;23376:4;23371:3;23367:14;23352:29;;23218:169;;;;:::o;23393:148::-;23495:11;23532:3;23517:18;;23393:148;;;;:::o;23547:305::-;23587:3;23606:20;23624:1;23606:20;:::i;:::-;23601:25;;23640:20;23658:1;23640:20;:::i;:::-;23635:25;;23794:1;23726:66;23722:74;23719:1;23716:81;23713:107;;;23800:18;;:::i;:::-;23713:107;23844:1;23841;23837:9;23830:16;;23547:305;;;;:::o;23858:185::-;23898:1;23915:20;23933:1;23915:20;:::i;:::-;23910:25;;23949:20;23967:1;23949:20;:::i;:::-;23944:25;;23988:1;23978:35;;23993:18;;:::i;:::-;23978:35;24035:1;24032;24028:9;24023:14;;23858:185;;;;:::o;24049:348::-;24089:7;24112:20;24130:1;24112:20;:::i;:::-;24107:25;;24146:20;24164:1;24146:20;:::i;:::-;24141:25;;24334:1;24266:66;24262:74;24259:1;24256:81;24251:1;24244:9;24237:17;24233:105;24230:131;;;24341:18;;:::i;:::-;24230:131;24389:1;24386;24382:9;24371:20;;24049:348;;;;:::o;24403:191::-;24443:4;24463:20;24481:1;24463:20;:::i;:::-;24458:25;;24497:20;24515:1;24497:20;:::i;:::-;24492:25;;24536:1;24533;24530:8;24527:34;;;24541:18;;:::i;:::-;24527:34;24586:1;24583;24579:9;24571:17;;24403:191;;;;:::o;24600:96::-;24637:7;24666:24;24684:5;24666:24;:::i;:::-;24655:35;;24600:96;;;:::o;24702:90::-;24736:7;24779:5;24772:13;24765:21;24754:32;;24702:90;;;:::o;24798:149::-;24834:7;24874:66;24867:5;24863:78;24852:89;;24798:149;;;:::o;24953:89::-;24989:7;25029:6;25022:5;25018:18;25007:29;;24953:89;;;:::o;25048:126::-;25085:7;25125:42;25118:5;25114:54;25103:65;;25048:126;;;:::o;25180:77::-;25217:7;25246:5;25235:16;;25180:77;;;:::o;25263:154::-;25347:6;25342:3;25337;25324:30;25409:1;25400:6;25395:3;25391:16;25384:27;25263:154;;;:::o;25423:307::-;25491:1;25501:113;25515:6;25512:1;25509:13;25501:113;;;25600:1;25595:3;25591:11;25585:18;25581:1;25576:3;25572:11;25565:39;25537:2;25534:1;25530:10;25525:15;;25501:113;;;25632:6;25629:1;25626:13;25623:101;;;25712:1;25703:6;25698:3;25694:16;25687:27;25623:101;25472:258;25423:307;;;:::o;25736:320::-;25780:6;25817:1;25811:4;25807:12;25797:22;;25864:1;25858:4;25854:12;25885:18;25875:81;;25941:4;25933:6;25929:17;25919:27;;25875:81;26003:2;25995:6;25992:14;25972:18;25969:38;25966:84;;;26022:18;;:::i;:::-;25966:84;25787:269;25736:320;;;:::o;26062:281::-;26145:27;26167:4;26145:27;:::i;:::-;26137:6;26133:40;26275:6;26263:10;26260:22;26239:18;26227:10;26224:34;26221:62;26218:88;;;26286:18;;:::i;:::-;26218:88;26326:10;26322:2;26315:22;26105:238;26062:281;;:::o;26349:233::-;26388:3;26411:24;26429:5;26411:24;:::i;:::-;26402:33;;26457:66;26450:5;26447:77;26444:103;;;26527:18;;:::i;:::-;26444:103;26574:1;26567:5;26563:13;26556:20;;26349:233;;;:::o;26588:176::-;26620:1;26637:20;26655:1;26637:20;:::i;:::-;26632:25;;26671:20;26689:1;26671:20;:::i;:::-;26666:25;;26710:1;26700:35;;26715:18;;:::i;:::-;26700:35;26756:1;26753;26749:9;26744:14;;26588:176;;;;:::o;26770:180::-;26818:77;26815:1;26808:88;26915:4;26912:1;26905:15;26939:4;26936:1;26929:15;26956:180;27004:77;27001:1;26994:88;27101:4;27098:1;27091:15;27125:4;27122:1;27115:15;27142:180;27190:77;27187:1;27180:88;27287:4;27284:1;27277:15;27311:4;27308:1;27301:15;27328:180;27376:77;27373:1;27366:88;27473:4;27470:1;27463:15;27497:4;27494:1;27487:15;27514:180;27562:77;27559:1;27552:88;27659:4;27656:1;27649:15;27683:4;27680:1;27673:15;27700:117;27809:1;27806;27799:12;27823:117;27932:1;27929;27922:12;27946:117;28055:1;28052;28045:12;28069:117;28178:1;28175;28168:12;28192:117;28301:1;28298;28291:12;28315:102;28356:6;28407:2;28403:7;28398:2;28391:5;28387:14;28383:28;28373:38;;28315:102;;;:::o;28423:168::-;28563:20;28559:1;28551:6;28547:14;28540:44;28423:168;:::o;28597:225::-;28737:34;28733:1;28725:6;28721:14;28714:58;28806:8;28801:2;28793:6;28789:15;28782:33;28597:225;:::o;28828:166::-;28968:18;28964:1;28956:6;28952:14;28945:42;28828:166;:::o;29000:226::-;29140:34;29136:1;29128:6;29124:14;29117:58;29209:9;29204:2;29196:6;29192:15;29185:34;29000:226;:::o;29232:::-;29372:34;29368:1;29360:6;29356:14;29349:58;29441:9;29436:2;29428:6;29424:15;29417:34;29232:226;:::o;29464:182::-;29604:34;29600:1;29592:6;29588:14;29581:58;29464:182;:::o;29652:234::-;29792:34;29788:1;29780:6;29776:14;29769:58;29861:17;29856:2;29848:6;29844:15;29837:42;29652:234;:::o;29892:114::-;;:::o;30012:223::-;30152:34;30148:1;30140:6;30136:14;30129:58;30221:6;30216:2;30208:6;30204:15;30197:31;30012:223;:::o;30241:174::-;30381:26;30377:1;30369:6;30365:14;30358:50;30241:174;:::o;30421:122::-;30494:24;30512:5;30494:24;:::i;:::-;30487:5;30484:35;30474:63;;30533:1;30530;30523:12;30474:63;30421:122;:::o;30549:116::-;30619:21;30634:5;30619:21;:::i;:::-;30612:5;30609:32;30599:60;;30655:1;30652;30645:12;30599:60;30549:116;:::o;30671:120::-;30743:23;30760:5;30743:23;:::i;:::-;30736:5;30733:34;30723:62;;30781:1;30778;30771:12;30723:62;30671:120;:::o;30797:::-;30869:23;30886:5;30869:23;:::i;:::-;30862:5;30859:34;30849:62;;30907:1;30904;30897:12;30849:62;30797:120;:::o;30923:122::-;30996:24;31014:5;30996:24;:::i;:::-;30989:5;30986:35;30976:63;;31035:1;31032;31025:12;30976:63;30923:122;:::o

Swarm Source

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