ETH Price: $3,351.32 (-3.35%)

Token

Nasciimigos (NASCI)
 

Overview

Max Total Supply

10,166 NASCI

Holders

913

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
webfi.eth
Balance
10 NASCI
0xe1a2cdd4fb58eee09da78db898adbadcfe5f1780
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:
Nasciimigos

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

    // The 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 tokenId of the next token to be minted.
    uint256 private _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [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 => address) private _tokenApprovals;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

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

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

    /**
     * @dev 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 See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // `balance` 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 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

            _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 {
        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 Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function 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) = _getApprovedAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(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 `_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) = _getApprovedAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(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++;
        }
    }

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

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        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 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;
    }

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.4;


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

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

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

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

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

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


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

pragma solidity ^0.8.4;



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

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

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

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

pragma solidity >=0.8.9 <0.9.0;

contract Nasciimigos is ERC721AQueryable, Ownable, ReentrancyGuard {
    using Strings for uint256;

    uint256 public maxSupply = 20000;
    uint256 private constant OwnerMint = 50;
    uint256 public maxPerAddress = 200;
    uint256 public maxPerTX = 10;
    uint256 public cost = 0.0069 ether;
    uint256 public freeMintsAvailable = 1000;

    bool public paused = true;

    string public uriPrefix = "";
    string public uriSuffix = ".json";

    constructor(string memory baseURI) ERC721A("Nasciimigos", "NASCI") {
      setUriPrefix(baseURI); 
      _safeMint(_msgSender(), OwnerMint);

    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    function mint(uint256 _mintAmount) public payable nonReentrant callerIsUser {
        require(!paused, "The contract is paused!");
        require(balanceOf(msg.sender) + _mintAmount <= maxPerAddress, "PER_WALLET_LIMIT_REACHED");
        require(_mintAmount > 0 && _mintAmount <= maxPerTX, "Invalid mint amount!");
        require(totalSupply() + _mintAmount <= (maxSupply), "Max supply exceeded!");
        require(msg.value >= cost * _mintAmount, "Insufficient funds!");
        _safeMint(_msgSender(), _mintAmount);
    }

    function freeMint(uint256 _mintAmount) public nonReentrant callerIsUser {
        require(!paused, "The contract is paused!");
        require(totalSupply() + _mintAmount <= freeMintsAvailable, "Free mints exhausted!");
        require(balanceOf(msg.sender) + _mintAmount <= maxPerAddress, "PER_WALLET_LIMIT_REACHED");
        require(_mintAmount > 0 && _mintAmount <= maxPerTX, "Invalid mint amount!");
        _safeMint(_msgSender(), _mintAmount);
    }

    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(), uriSuffix))
            : "";
    }

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

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

    function setMaxPerTX(uint256 _maxPerTX) public onlyOwner {
        maxPerTX = _maxPerTX;
    }

    function setUriPrefix(string memory _uriPrefix) public onlyOwner {
        uriPrefix = _uriPrefix;
    }
    
    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }
    
    function setFreeMintsAvailable(uint256 _freeMintsAvailable) public onlyOwner {
        freeMintsAvailable = _freeMintsAvailable;
    }
    
    function withdraw() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }
    
    function _baseURI() internal view virtual override returns (string memory) {
        return uriPrefix;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintsAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_freeMintsAvailable","type":"uint256"}],"name":"setFreeMintsAvailable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerTX","type":"uint256"}],"name":"setMaxPerTX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052614e20600a5560c8600b55600a600c556618838370f34000600d556103e8600e556001600f60006101000a81548160ff0219169083151502179055506040518060200160405280600081525060109080519060200190620000679291906200088b565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060119080519060200190620000b59291906200088b565b50348015620000c357600080fd5b5060405162004d4738038062004d478339818101604052810190620000e9919062000ad8565b6040518060400160405280600b81526020017f4e61736369696d69676f730000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4e4153434900000000000000000000000000000000000000000000000000000081525081600290805190602001906200016d9291906200088b565b508060039080519060200190620001869291906200088b565b50620001976200020160201b60201c565b6000819055505050620001bf620001b36200020660201b60201c565b6200020e60201b60201c565b6001600981905550620001d881620002d460201b60201c565b620001fa620001ec6200020660201b60201c565b60326200030060201b60201c565b5062000db1565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002e46200032660201b60201c565b8060109080519060200190620002fc9291906200088b565b5050565b62000322828260405180602001604052806000815250620003b760201b60201c565b5050565b620003366200020660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200035c6200046860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003ac9062000b8a565b60405180910390fd5b565b620003c983836200049260201b60201c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146200046357600080549050600083820390505b6200041260008683806001019450866200069160201b60201c565b62000449576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110620003f75781600054146200046057600080fd5b50505b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000500576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156200053c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200055160008483856200080360201b60201c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550620005e083620005c260008660006200080960201b60201c565b620005d3856200083960201b60201c565b176200084960201b60201c565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821062000604578060008190555050506200068c60008483856200087460201b60201c565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006bf6200087a60201b60201c565b8786866040518563ffffffff1660e01b8152600401620006e3949392919062000c69565b602060405180830381600087803b158015620006fe57600080fd5b505af19250505080156200073257506040513d601f19601f820116820180604052508101906200072f919062000d1a565b60015b620007b0573d806000811462000765576040519150601f19603f3d011682016040523d82523d6000602084013e6200076a565b606091505b50600081511415620007a8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b60008060e883901c905060e8620008288686846200088260201b60201c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60009392505050565b828054620008999062000d7b565b90600052602060002090601f016020900481019282620008bd576000855562000909565b82601f10620008d857805160ff191683800117855562000909565b8280016001018555821562000909579182015b8281111562000908578251825591602001919060010190620008eb565b5b5090506200091891906200091c565b5090565b5b80821115620009375760008160009055506001016200091d565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009a48262000959565b810181811067ffffffffffffffff82111715620009c657620009c56200096a565b5b80604052505050565b6000620009db6200093b565b9050620009e9828262000999565b919050565b600067ffffffffffffffff82111562000a0c5762000a0b6200096a565b5b62000a178262000959565b9050602081019050919050565b60005b8381101562000a4457808201518184015260208101905062000a27565b8381111562000a54576000848401525b50505050565b600062000a7162000a6b84620009ee565b620009cf565b90508281526020810184848401111562000a905762000a8f62000954565b5b62000a9d84828562000a24565b509392505050565b600082601f83011262000abd5762000abc6200094f565b5b815162000acf84826020860162000a5a565b91505092915050565b60006020828403121562000af15762000af062000945565b5b600082015167ffffffffffffffff81111562000b125762000b116200094a565b5b62000b208482850162000aa5565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000b7260208362000b29565b915062000b7f8262000b3a565b602082019050919050565b6000602082019050818103600083015262000ba58162000b63565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000bd98262000bac565b9050919050565b62000beb8162000bcc565b82525050565b6000819050919050565b62000c068162000bf1565b82525050565b600081519050919050565b600082825260208201905092915050565b600062000c358262000c0c565b62000c41818562000c17565b935062000c5381856020860162000a24565b62000c5e8162000959565b840191505092915050565b600060808201905062000c80600083018762000be0565b62000c8f602083018662000be0565b62000c9e604083018562000bfb565b818103606083015262000cb2818462000c28565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000cf48162000cbd565b811462000d0057600080fd5b50565b60008151905062000d148162000ce9565b92915050565b60006020828403121562000d335762000d3262000945565b5b600062000d438482850162000d03565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d9457607f821691505b6020821081141562000dab5762000daa62000d4c565b5b50919050565b613f868062000dc16000396000f3fe6080604052600436106102255760003560e01c806370a0823111610123578063a1165f5d116100ab578063c87b56dd1161006f578063c87b56dd146107e6578063d5abeb0114610823578063e5a4756c1461084e578063e985e9c514610877578063f2fde38b146108b457610225565b8063a1165f5d14610701578063a22cb4651461072c578063a40d36cd14610755578063b88d4fde14610780578063c23dc68f146107a957610225565b80638462151c116100f25780638462151c146106155780638da5cb5b1461065257806395d89b411461067d57806399a2557a146106a8578063a0712d68146106e557610225565b806370a082311461056f578063715018a6146105ac5780637c928fe9146105c35780637ec4a659146105ec57610225565b806337a66d85116101b15780635bbb2177116101755780635bbb2177146104745780635c975abb146104b157806362b99ad4146104dc5780636352211e14610507578063639814e01461054457610225565b806337a66d85146103c95780633ccfd60b146103e057806342842e0e146103f757806344a0d68a146104205780635503a0e81461044957610225565b80630964617e116101f85780630964617e146102f857806313faede61461032157806316ba10e01461034c57806318160ddd1461037557806323b872dd146103a057610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612b85565b6108dd565b60405161025e9190612bcd565b60405180910390f35b34801561027357600080fd5b5061027c61096f565b6040516102899190612c81565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612cd9565b610a01565b6040516102c69190612d47565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190612d8e565b610a7d565b005b34801561030457600080fd5b5061031f600480360381019061031a9190612cd9565b610bbe565b005b34801561032d57600080fd5b50610336610bd0565b6040516103439190612ddd565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e9190612f2d565b610bd6565b005b34801561038157600080fd5b5061038a610bf8565b6040516103979190612ddd565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c29190612f76565b610c0f565b005b3480156103d557600080fd5b506103de610f34565b005b3480156103ec57600080fd5b506103f5610f68565b005b34801561040357600080fd5b5061041e60048036038101906104199190612f76565b610fb9565b005b34801561042c57600080fd5b5061044760048036038101906104429190612cd9565b610fd9565b005b34801561045557600080fd5b5061045e610feb565b60405161046b9190612c81565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190613091565b611079565b6040516104a8919061323d565b60405180910390f35b3480156104bd57600080fd5b506104c661113a565b6040516104d39190612bcd565b60405180910390f35b3480156104e857600080fd5b506104f161114d565b6040516104fe9190612c81565b60405180910390f35b34801561051357600080fd5b5061052e60048036038101906105299190612cd9565b6111db565b60405161053b9190612d47565b60405180910390f35b34801561055057600080fd5b506105596111ed565b6040516105669190612ddd565b60405180910390f35b34801561057b57600080fd5b506105966004803603810190610591919061325f565b6111f3565b6040516105a39190612ddd565b60405180910390f35b3480156105b857600080fd5b506105c16112ac565b005b3480156105cf57600080fd5b506105ea60048036038101906105e59190612cd9565b6112c0565b005b3480156105f857600080fd5b50610613600480360381019061060e9190612f2d565b6114e8565b005b34801561062157600080fd5b5061063c6004803603810190610637919061325f565b61150a565b604051610649919061334a565b60405180910390f35b34801561065e57600080fd5b50610667611654565b6040516106749190612d47565b60405180910390f35b34801561068957600080fd5b5061069261167e565b60405161069f9190612c81565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca919061336c565b611710565b6040516106dc919061334a565b60405180910390f35b6106ff60048036038101906106fa9190612cd9565b611924565b005b34801561070d57600080fd5b50610716611b9c565b6040516107239190612ddd565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e91906133eb565b611ba2565b005b34801561076157600080fd5b5061076a611d1a565b6040516107779190612ddd565b60405180910390f35b34801561078c57600080fd5b506107a760048036038101906107a291906134cc565b611d20565b005b3480156107b557600080fd5b506107d060048036038101906107cb9190612cd9565b611d93565b6040516107dd91906135a4565b60405180910390f35b3480156107f257600080fd5b5061080d60048036038101906108089190612cd9565b611dfd565b60405161081a9190612c81565b60405180910390f35b34801561082f57600080fd5b50610838611ea7565b6040516108459190612ddd565b60405180910390f35b34801561085a57600080fd5b5061087560048036038101906108709190612cd9565b611ead565b005b34801561088357600080fd5b5061089e600480360381019061089991906135bf565b611ebf565b6040516108ab9190612bcd565b60405180910390f35b3480156108c057600080fd5b506108db60048036038101906108d6919061325f565b611f53565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061093857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109685750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461097e9061362e565b80601f01602080910402602001604051908101604052809291908181526020018280546109aa9061362e565b80156109f75780601f106109cc576101008083540402835291602001916109f7565b820191906000526020600020905b8154815290600101906020018083116109da57829003601f168201915b5050505050905090565b6000610a0c82611fd7565b610a42576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a88826111db565b90508073ffffffffffffffffffffffffffffffffffffffff16610aa9612036565b73ffffffffffffffffffffffffffffffffffffffff1614610b0c57610ad581610ad0612036565b611ebf565b610b0b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610bc661203e565b80600e8190555050565b600d5481565b610bde61203e565b8060119080519060200190610bf4929190612a27565b5050565b6000610c026120bc565b6001546000540303905090565b6000610c1a826120c1565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c81576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610c8d8461218f565b91509150610ca38187610c9e612036565b6121b1565b610cef57610cb886610cb3612036565b611ebf565b610cee576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610d56576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d6386868660016121f5565b8015610d6e57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e3c85610e188888876121fb565b7c020000000000000000000000000000000000000000000000000000000017612223565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610ec4576000600185019050600060046000838152602001908152602001600020541415610ec2576000548114610ec1578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f2c868686600161224e565b505050505050565b610f3c61203e565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b610f7061203e565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610fb6573d6000803e3d6000fd5b50565b610fd483838360405180602001604052806000815250611d20565b505050565b610fe161203e565b80600d8190555050565b60118054610ff89061362e565b80601f01602080910402602001604051908101604052809291908181526020018280546110249061362e565b80156110715780601f1061104657610100808354040283529160200191611071565b820191906000526020600020905b81548152906001019060200180831161105457829003601f168201915b505050505081565b606060008251905060008167ffffffffffffffff81111561109d5761109c612e02565b5b6040519080825280602002602001820160405280156110d657816020015b6110c3612aad565b8152602001906001900390816110bb5790505b50905060005b82811461112f576111068582815181106110f9576110f8613660565b5b6020026020010151611d93565b82828151811061111957611118613660565b5b60200260200101819052508060010190506110dc565b508092505050919050565b600f60009054906101000a900460ff1681565b6010805461115a9061362e565b80601f01602080910402602001604051908101604052809291908181526020018280546111869061362e565b80156111d35780601f106111a8576101008083540402835291602001916111d3565b820191906000526020600020905b8154815290600101906020018083116111b657829003601f168201915b505050505081565b60006111e6826120c1565b9050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561125b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112b461203e565b6112be6000612254565b565b60026009541415611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd906136db565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461137c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137390613747565b60405180910390fd5b600f60009054906101000a900460ff16156113cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c3906137b3565b60405180910390fd5b600e54816113d8610bf8565b6113e29190613802565b1115611423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141a906138a4565b60405180910390fd5b600b5481611430336111f3565b61143a9190613802565b111561147b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147290613910565b60405180910390fd5b60008111801561148d5750600c548111155b6114cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c39061397c565b60405180910390fd5b6114dd6114d761231a565b82612322565b600160098190555050565b6114f061203e565b8060109080519060200190611506929190612a27565b5050565b6060600080600061151a856111f3565b905060008167ffffffffffffffff81111561153857611537612e02565b5b6040519080825280602002602001820160405280156115665781602001602082028036833780820191505090505b509050611571612aad565b600061157b6120bc565b90505b8386146116465761158e81612340565b915081604001511561159f5761163b565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146115df57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561163a578083878060010198508151811061162d5761162c613660565b5b6020026020010181815250505b5b80600101905061157e565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461168d9061362e565b80601f01602080910402602001604051908101604052809291908181526020018280546116b99061362e565b80156117065780601f106116db57610100808354040283529160200191611706565b820191906000526020600020905b8154815290600101906020018083116116e957829003601f168201915b5050505050905090565b606081831061174b576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061175661236b565b90506117606120bc565b8510156117725761176f6120bc565b94505b8084111561177e578093505b6000611789876111f3565b9050848610156117ac5760008686039050818110156117a6578091505b506117b1565b600090505b60008167ffffffffffffffff8111156117cd576117cc612e02565b5b6040519080825280602002602001820160405280156117fb5781602001602082028036833780820191505090505b5090506000821415611813578094505050505061191d565b600061181e88611d93565b90506000816040015161183357816000015190505b60008990505b8881141580156118495750848714155b1561190f5761185781612340565b925082604001511561186857611904565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146118a857826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561190357808488806001019950815181106118f6576118f5613660565b5b6020026020010181815250505b5b806001019050611839565b508583528296505050505050505b9392505050565b6002600954141561196a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611961906136db565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d790613747565b60405180910390fd5b600f60009054906101000a900460ff1615611a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a27906137b3565b60405180910390fd5b600b5481611a3d336111f3565b611a479190613802565b1115611a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7f90613910565b60405180910390fd5b600081118015611a9a5750600c548111155b611ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad09061397c565b60405180910390fd5b600a5481611ae5610bf8565b611aef9190613802565b1115611b30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b27906139e8565b60405180910390fd5b80600d54611b3e9190613a08565b341015611b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7790613aae565b60405180910390fd5b611b91611b8b61231a565b82612322565b600160098190555050565b600e5481565b611baa612036565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c0f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611c1c612036565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611cc9612036565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d0e9190612bcd565b60405180910390a35050565b600c5481565b611d2b848484610c0f565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d8d57611d5684848484612374565b611d8c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611d9b612aad565b611da3612aad565b611dab6120bc565b831080611dbf5750611dbb61236b565b8310155b15611dcd5780915050611df8565b611dd683612340565b9050806040015115611deb5780915050611df8565b611df4836124d4565b9150505b919050565b6060611e0882611fd7565b611e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3e90613b40565b60405180910390fd5b6000611e516124f4565b90506000815111611e715760405180602001604052806000815250611e9f565b80611e7b84612586565b6011604051602001611e8f93929190613c30565b6040516020818303038152906040525b915050919050565b600a5481565b611eb561203e565b80600c8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f5b61203e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc290613cd3565b60405180910390fd5b611fd481612254565b50565b600081611fe26120bc565b11158015611ff1575060005482105b801561202f575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b61204661231a565b73ffffffffffffffffffffffffffffffffffffffff16612064611654565b73ffffffffffffffffffffffffffffffffffffffff16146120ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b190613d3f565b60405180910390fd5b565b600090565b600080829050806120d06120bc565b11612158576000548110156121575760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612155575b600081141561214b576004600083600190039350838152602001908152602001600020549050612120565b809250505061218a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86122128686846126e7565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b61233c8282604051806020016040528060008152506126f0565b5050565b612348612aad565b612364600460008481526020019081526020016000205461278d565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261239a612036565b8786866040518563ffffffff1660e01b81526004016123bc9493929190613db4565b602060405180830381600087803b1580156123d657600080fd5b505af192505050801561240757506040513d601f19601f820116820180604052508101906124049190613e15565b60015b612481573d8060008114612437576040519150601f19603f3d011682016040523d82523d6000602084013e61243c565b606091505b50600081511415612479576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6124dc612aad565b6124ed6124e8836120c1565b61278d565b9050919050565b6060601080546125039061362e565b80601f016020809104026020016040519081016040528092919081815260200182805461252f9061362e565b801561257c5780601f106125515761010080835404028352916020019161257c565b820191906000526020600020905b81548152906001019060200180831161255f57829003601f168201915b5050505050905090565b606060008214156125ce576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126e2565b600082905060005b600082146126005780806125e990613e42565b915050600a826125f99190613eba565b91506125d6565b60008167ffffffffffffffff81111561261c5761261b612e02565b5b6040519080825280601f01601f19166020018201604052801561264e5781602001600182028036833780820191505090505b5090505b600085146126db576001826126679190613eeb565b9150600a856126769190613f1f565b60306126829190613802565b60f81b81838151811061269857612697613660565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126d49190613eba565b9450612652565b8093505050505b919050565b60009392505050565b6126fa8383612843565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461278857600080549050600083820390505b61273a6000868380600101945086612374565b612770576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061272757816000541461278557600080fd5b50505b505050565b612795612aad565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128b0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156128eb576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128f860008483856121f5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061296f8361296060008660006121fb565b61296985612a17565b17612223565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061299357806000819055505050612a12600084838561224e565b505050565b60006001821460e11b9050919050565b828054612a339061362e565b90600052602060002090601f016020900481019282612a555760008555612a9c565b82601f10612a6e57805160ff1916838001178555612a9c565b82800160010185558215612a9c579182015b82811115612a9b578251825591602001919060010190612a80565b5b509050612aa99190612afc565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612b15576000816000905550600101612afd565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b6281612b2d565b8114612b6d57600080fd5b50565b600081359050612b7f81612b59565b92915050565b600060208284031215612b9b57612b9a612b23565b5b6000612ba984828501612b70565b91505092915050565b60008115159050919050565b612bc781612bb2565b82525050565b6000602082019050612be26000830184612bbe565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c22578082015181840152602081019050612c07565b83811115612c31576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c5382612be8565b612c5d8185612bf3565b9350612c6d818560208601612c04565b612c7681612c37565b840191505092915050565b60006020820190508181036000830152612c9b8184612c48565b905092915050565b6000819050919050565b612cb681612ca3565b8114612cc157600080fd5b50565b600081359050612cd381612cad565b92915050565b600060208284031215612cef57612cee612b23565b5b6000612cfd84828501612cc4565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d3182612d06565b9050919050565b612d4181612d26565b82525050565b6000602082019050612d5c6000830184612d38565b92915050565b612d6b81612d26565b8114612d7657600080fd5b50565b600081359050612d8881612d62565b92915050565b60008060408385031215612da557612da4612b23565b5b6000612db385828601612d79565b9250506020612dc485828601612cc4565b9150509250929050565b612dd781612ca3565b82525050565b6000602082019050612df26000830184612dce565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612e3a82612c37565b810181811067ffffffffffffffff82111715612e5957612e58612e02565b5b80604052505050565b6000612e6c612b19565b9050612e788282612e31565b919050565b600067ffffffffffffffff821115612e9857612e97612e02565b5b612ea182612c37565b9050602081019050919050565b82818337600083830152505050565b6000612ed0612ecb84612e7d565b612e62565b905082815260208101848484011115612eec57612eeb612dfd565b5b612ef7848285612eae565b509392505050565b600082601f830112612f1457612f13612df8565b5b8135612f24848260208601612ebd565b91505092915050565b600060208284031215612f4357612f42612b23565b5b600082013567ffffffffffffffff811115612f6157612f60612b28565b5b612f6d84828501612eff565b91505092915050565b600080600060608486031215612f8f57612f8e612b23565b5b6000612f9d86828701612d79565b9350506020612fae86828701612d79565b9250506040612fbf86828701612cc4565b9150509250925092565b600067ffffffffffffffff821115612fe457612fe3612e02565b5b602082029050602081019050919050565b600080fd5b600061300d61300884612fc9565b612e62565b905080838252602082019050602084028301858111156130305761302f612ff5565b5b835b8181101561305957806130458882612cc4565b845260208401935050602081019050613032565b5050509392505050565b600082601f83011261307857613077612df8565b5b8135613088848260208601612ffa565b91505092915050565b6000602082840312156130a7576130a6612b23565b5b600082013567ffffffffffffffff8111156130c5576130c4612b28565b5b6130d184828501613063565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61310f81612d26565b82525050565b600067ffffffffffffffff82169050919050565b61313281613115565b82525050565b61314181612bb2565b82525050565b600062ffffff82169050919050565b61315f81613147565b82525050565b60808201600082015161317b6000850182613106565b50602082015161318e6020850182613129565b5060408201516131a16040850182613138565b5060608201516131b46060850182613156565b50505050565b60006131c68383613165565b60808301905092915050565b6000602082019050919050565b60006131ea826130da565b6131f481856130e5565b93506131ff836130f6565b8060005b8381101561323057815161321788826131ba565b9750613222836131d2565b925050600181019050613203565b5085935050505092915050565b6000602082019050818103600083015261325781846131df565b905092915050565b60006020828403121561327557613274612b23565b5b600061328384828501612d79565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6132c181612ca3565b82525050565b60006132d383836132b8565b60208301905092915050565b6000602082019050919050565b60006132f78261328c565b6133018185613297565b935061330c836132a8565b8060005b8381101561333d57815161332488826132c7565b975061332f836132df565b925050600181019050613310565b5085935050505092915050565b6000602082019050818103600083015261336481846132ec565b905092915050565b60008060006060848603121561338557613384612b23565b5b600061339386828701612d79565b93505060206133a486828701612cc4565b92505060406133b586828701612cc4565b9150509250925092565b6133c881612bb2565b81146133d357600080fd5b50565b6000813590506133e5816133bf565b92915050565b6000806040838503121561340257613401612b23565b5b600061341085828601612d79565b9250506020613421858286016133d6565b9150509250929050565b600067ffffffffffffffff82111561344657613445612e02565b5b61344f82612c37565b9050602081019050919050565b600061346f61346a8461342b565b612e62565b90508281526020810184848401111561348b5761348a612dfd565b5b613496848285612eae565b509392505050565b600082601f8301126134b3576134b2612df8565b5b81356134c384826020860161345c565b91505092915050565b600080600080608085870312156134e6576134e5612b23565b5b60006134f487828801612d79565b945050602061350587828801612d79565b935050604061351687828801612cc4565b925050606085013567ffffffffffffffff81111561353757613536612b28565b5b6135438782880161349e565b91505092959194509250565b6080820160008201516135656000850182613106565b5060208201516135786020850182613129565b50604082015161358b6040850182613138565b50606082015161359e6060850182613156565b50505050565b60006080820190506135b9600083018461354f565b92915050565b600080604083850312156135d6576135d5612b23565b5b60006135e485828601612d79565b92505060206135f585828601612d79565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061364657607f821691505b6020821081141561365a576136596135ff565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006136c5601f83612bf3565b91506136d08261368f565b602082019050919050565b600060208201905081810360008301526136f4816136b8565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613731601e83612bf3565b915061373c826136fb565b602082019050919050565b6000602082019050818103600083015261376081613724565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b600061379d601783612bf3565b91506137a882613767565b602082019050919050565b600060208201905081810360008301526137cc81613790565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061380d82612ca3565b915061381883612ca3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561384d5761384c6137d3565b5b828201905092915050565b7f46726565206d696e747320657868617573746564210000000000000000000000600082015250565b600061388e601583612bf3565b915061389982613858565b602082019050919050565b600060208201905081810360008301526138bd81613881565b9050919050565b7f5045525f57414c4c45545f4c494d49545f524541434845440000000000000000600082015250565b60006138fa601883612bf3565b9150613905826138c4565b602082019050919050565b60006020820190508181036000830152613929816138ed565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000613966601483612bf3565b915061397182613930565b602082019050919050565b6000602082019050818103600083015261399581613959565b9050919050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006139d2601483612bf3565b91506139dd8261399c565b602082019050919050565b60006020820190508181036000830152613a01816139c5565b9050919050565b6000613a1382612ca3565b9150613a1e83612ca3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a5757613a566137d3565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000613a98601383612bf3565b9150613aa382613a62565b602082019050919050565b60006020820190508181036000830152613ac781613a8b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613b2a602f83612bf3565b9150613b3582613ace565b604082019050919050565b60006020820190508181036000830152613b5981613b1d565b9050919050565b600081905092915050565b6000613b7682612be8565b613b808185613b60565b9350613b90818560208601612c04565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613bbe8161362e565b613bc88186613b60565b94506001821660008114613be35760018114613bf457613c27565b60ff19831686528186019350613c27565b613bfd85613b9c565b60005b83811015613c1f57815481890152600182019150602081019050613c00565b838801955050505b50505092915050565b6000613c3c8286613b6b565b9150613c488285613b6b565b9150613c548284613bb1565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613cbd602683612bf3565b9150613cc882613c61565b604082019050919050565b60006020820190508181036000830152613cec81613cb0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d29602083612bf3565b9150613d3482613cf3565b602082019050919050565b60006020820190508181036000830152613d5881613d1c565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613d8682613d5f565b613d908185613d6a565b9350613da0818560208601612c04565b613da981612c37565b840191505092915050565b6000608082019050613dc96000830187612d38565b613dd66020830186612d38565b613de36040830185612dce565b8181036060830152613df58184613d7b565b905095945050505050565b600081519050613e0f81612b59565b92915050565b600060208284031215613e2b57613e2a612b23565b5b6000613e3984828501613e00565b91505092915050565b6000613e4d82612ca3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e8057613e7f6137d3565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ec582612ca3565b9150613ed083612ca3565b925082613ee057613edf613e8b565b5b828204905092915050565b6000613ef682612ca3565b9150613f0183612ca3565b925082821015613f1457613f136137d3565b5b828203905092915050565b6000613f2a82612ca3565b9150613f3583612ca3565b925082613f4557613f44613e8b565b5b82820690509291505056fea26469706673582212208ba6d29835b39dad1825f217f9dbebb309bd8301b3cd91711b493e9c590ff10264736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569617835616d3734366a7664726668737378326d3766676a356877636a6378656c6f67737a796d62657867616464367573666635342f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102255760003560e01c806370a0823111610123578063a1165f5d116100ab578063c87b56dd1161006f578063c87b56dd146107e6578063d5abeb0114610823578063e5a4756c1461084e578063e985e9c514610877578063f2fde38b146108b457610225565b8063a1165f5d14610701578063a22cb4651461072c578063a40d36cd14610755578063b88d4fde14610780578063c23dc68f146107a957610225565b80638462151c116100f25780638462151c146106155780638da5cb5b1461065257806395d89b411461067d57806399a2557a146106a8578063a0712d68146106e557610225565b806370a082311461056f578063715018a6146105ac5780637c928fe9146105c35780637ec4a659146105ec57610225565b806337a66d85116101b15780635bbb2177116101755780635bbb2177146104745780635c975abb146104b157806362b99ad4146104dc5780636352211e14610507578063639814e01461054457610225565b806337a66d85146103c95780633ccfd60b146103e057806342842e0e146103f757806344a0d68a146104205780635503a0e81461044957610225565b80630964617e116101f85780630964617e146102f857806313faede61461032157806316ba10e01461034c57806318160ddd1461037557806323b872dd146103a057610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612b85565b6108dd565b60405161025e9190612bcd565b60405180910390f35b34801561027357600080fd5b5061027c61096f565b6040516102899190612c81565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612cd9565b610a01565b6040516102c69190612d47565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190612d8e565b610a7d565b005b34801561030457600080fd5b5061031f600480360381019061031a9190612cd9565b610bbe565b005b34801561032d57600080fd5b50610336610bd0565b6040516103439190612ddd565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e9190612f2d565b610bd6565b005b34801561038157600080fd5b5061038a610bf8565b6040516103979190612ddd565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c29190612f76565b610c0f565b005b3480156103d557600080fd5b506103de610f34565b005b3480156103ec57600080fd5b506103f5610f68565b005b34801561040357600080fd5b5061041e60048036038101906104199190612f76565b610fb9565b005b34801561042c57600080fd5b5061044760048036038101906104429190612cd9565b610fd9565b005b34801561045557600080fd5b5061045e610feb565b60405161046b9190612c81565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190613091565b611079565b6040516104a8919061323d565b60405180910390f35b3480156104bd57600080fd5b506104c661113a565b6040516104d39190612bcd565b60405180910390f35b3480156104e857600080fd5b506104f161114d565b6040516104fe9190612c81565b60405180910390f35b34801561051357600080fd5b5061052e60048036038101906105299190612cd9565b6111db565b60405161053b9190612d47565b60405180910390f35b34801561055057600080fd5b506105596111ed565b6040516105669190612ddd565b60405180910390f35b34801561057b57600080fd5b506105966004803603810190610591919061325f565b6111f3565b6040516105a39190612ddd565b60405180910390f35b3480156105b857600080fd5b506105c16112ac565b005b3480156105cf57600080fd5b506105ea60048036038101906105e59190612cd9565b6112c0565b005b3480156105f857600080fd5b50610613600480360381019061060e9190612f2d565b6114e8565b005b34801561062157600080fd5b5061063c6004803603810190610637919061325f565b61150a565b604051610649919061334a565b60405180910390f35b34801561065e57600080fd5b50610667611654565b6040516106749190612d47565b60405180910390f35b34801561068957600080fd5b5061069261167e565b60405161069f9190612c81565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca919061336c565b611710565b6040516106dc919061334a565b60405180910390f35b6106ff60048036038101906106fa9190612cd9565b611924565b005b34801561070d57600080fd5b50610716611b9c565b6040516107239190612ddd565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e91906133eb565b611ba2565b005b34801561076157600080fd5b5061076a611d1a565b6040516107779190612ddd565b60405180910390f35b34801561078c57600080fd5b506107a760048036038101906107a291906134cc565b611d20565b005b3480156107b557600080fd5b506107d060048036038101906107cb9190612cd9565b611d93565b6040516107dd91906135a4565b60405180910390f35b3480156107f257600080fd5b5061080d60048036038101906108089190612cd9565b611dfd565b60405161081a9190612c81565b60405180910390f35b34801561082f57600080fd5b50610838611ea7565b6040516108459190612ddd565b60405180910390f35b34801561085a57600080fd5b5061087560048036038101906108709190612cd9565b611ead565b005b34801561088357600080fd5b5061089e600480360381019061089991906135bf565b611ebf565b6040516108ab9190612bcd565b60405180910390f35b3480156108c057600080fd5b506108db60048036038101906108d6919061325f565b611f53565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061093857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109685750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461097e9061362e565b80601f01602080910402602001604051908101604052809291908181526020018280546109aa9061362e565b80156109f75780601f106109cc576101008083540402835291602001916109f7565b820191906000526020600020905b8154815290600101906020018083116109da57829003601f168201915b5050505050905090565b6000610a0c82611fd7565b610a42576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a88826111db565b90508073ffffffffffffffffffffffffffffffffffffffff16610aa9612036565b73ffffffffffffffffffffffffffffffffffffffff1614610b0c57610ad581610ad0612036565b611ebf565b610b0b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610bc661203e565b80600e8190555050565b600d5481565b610bde61203e565b8060119080519060200190610bf4929190612a27565b5050565b6000610c026120bc565b6001546000540303905090565b6000610c1a826120c1565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c81576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610c8d8461218f565b91509150610ca38187610c9e612036565b6121b1565b610cef57610cb886610cb3612036565b611ebf565b610cee576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610d56576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d6386868660016121f5565b8015610d6e57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e3c85610e188888876121fb565b7c020000000000000000000000000000000000000000000000000000000017612223565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610ec4576000600185019050600060046000838152602001908152602001600020541415610ec2576000548114610ec1578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f2c868686600161224e565b505050505050565b610f3c61203e565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b610f7061203e565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610fb6573d6000803e3d6000fd5b50565b610fd483838360405180602001604052806000815250611d20565b505050565b610fe161203e565b80600d8190555050565b60118054610ff89061362e565b80601f01602080910402602001604051908101604052809291908181526020018280546110249061362e565b80156110715780601f1061104657610100808354040283529160200191611071565b820191906000526020600020905b81548152906001019060200180831161105457829003601f168201915b505050505081565b606060008251905060008167ffffffffffffffff81111561109d5761109c612e02565b5b6040519080825280602002602001820160405280156110d657816020015b6110c3612aad565b8152602001906001900390816110bb5790505b50905060005b82811461112f576111068582815181106110f9576110f8613660565b5b6020026020010151611d93565b82828151811061111957611118613660565b5b60200260200101819052508060010190506110dc565b508092505050919050565b600f60009054906101000a900460ff1681565b6010805461115a9061362e565b80601f01602080910402602001604051908101604052809291908181526020018280546111869061362e565b80156111d35780601f106111a8576101008083540402835291602001916111d3565b820191906000526020600020905b8154815290600101906020018083116111b657829003601f168201915b505050505081565b60006111e6826120c1565b9050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561125b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112b461203e565b6112be6000612254565b565b60026009541415611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd906136db565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461137c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137390613747565b60405180910390fd5b600f60009054906101000a900460ff16156113cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c3906137b3565b60405180910390fd5b600e54816113d8610bf8565b6113e29190613802565b1115611423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141a906138a4565b60405180910390fd5b600b5481611430336111f3565b61143a9190613802565b111561147b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147290613910565b60405180910390fd5b60008111801561148d5750600c548111155b6114cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c39061397c565b60405180910390fd5b6114dd6114d761231a565b82612322565b600160098190555050565b6114f061203e565b8060109080519060200190611506929190612a27565b5050565b6060600080600061151a856111f3565b905060008167ffffffffffffffff81111561153857611537612e02565b5b6040519080825280602002602001820160405280156115665781602001602082028036833780820191505090505b509050611571612aad565b600061157b6120bc565b90505b8386146116465761158e81612340565b915081604001511561159f5761163b565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146115df57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561163a578083878060010198508151811061162d5761162c613660565b5b6020026020010181815250505b5b80600101905061157e565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461168d9061362e565b80601f01602080910402602001604051908101604052809291908181526020018280546116b99061362e565b80156117065780601f106116db57610100808354040283529160200191611706565b820191906000526020600020905b8154815290600101906020018083116116e957829003601f168201915b5050505050905090565b606081831061174b576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061175661236b565b90506117606120bc565b8510156117725761176f6120bc565b94505b8084111561177e578093505b6000611789876111f3565b9050848610156117ac5760008686039050818110156117a6578091505b506117b1565b600090505b60008167ffffffffffffffff8111156117cd576117cc612e02565b5b6040519080825280602002602001820160405280156117fb5781602001602082028036833780820191505090505b5090506000821415611813578094505050505061191d565b600061181e88611d93565b90506000816040015161183357816000015190505b60008990505b8881141580156118495750848714155b1561190f5761185781612340565b925082604001511561186857611904565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146118a857826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561190357808488806001019950815181106118f6576118f5613660565b5b6020026020010181815250505b5b806001019050611839565b508583528296505050505050505b9392505050565b6002600954141561196a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611961906136db565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d790613747565b60405180910390fd5b600f60009054906101000a900460ff1615611a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a27906137b3565b60405180910390fd5b600b5481611a3d336111f3565b611a479190613802565b1115611a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7f90613910565b60405180910390fd5b600081118015611a9a5750600c548111155b611ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad09061397c565b60405180910390fd5b600a5481611ae5610bf8565b611aef9190613802565b1115611b30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b27906139e8565b60405180910390fd5b80600d54611b3e9190613a08565b341015611b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7790613aae565b60405180910390fd5b611b91611b8b61231a565b82612322565b600160098190555050565b600e5481565b611baa612036565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c0f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611c1c612036565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611cc9612036565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d0e9190612bcd565b60405180910390a35050565b600c5481565b611d2b848484610c0f565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d8d57611d5684848484612374565b611d8c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611d9b612aad565b611da3612aad565b611dab6120bc565b831080611dbf5750611dbb61236b565b8310155b15611dcd5780915050611df8565b611dd683612340565b9050806040015115611deb5780915050611df8565b611df4836124d4565b9150505b919050565b6060611e0882611fd7565b611e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3e90613b40565b60405180910390fd5b6000611e516124f4565b90506000815111611e715760405180602001604052806000815250611e9f565b80611e7b84612586565b6011604051602001611e8f93929190613c30565b6040516020818303038152906040525b915050919050565b600a5481565b611eb561203e565b80600c8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f5b61203e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc290613cd3565b60405180910390fd5b611fd481612254565b50565b600081611fe26120bc565b11158015611ff1575060005482105b801561202f575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b61204661231a565b73ffffffffffffffffffffffffffffffffffffffff16612064611654565b73ffffffffffffffffffffffffffffffffffffffff16146120ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b190613d3f565b60405180910390fd5b565b600090565b600080829050806120d06120bc565b11612158576000548110156121575760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612155575b600081141561214b576004600083600190039350838152602001908152602001600020549050612120565b809250505061218a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86122128686846126e7565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b61233c8282604051806020016040528060008152506126f0565b5050565b612348612aad565b612364600460008481526020019081526020016000205461278d565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261239a612036565b8786866040518563ffffffff1660e01b81526004016123bc9493929190613db4565b602060405180830381600087803b1580156123d657600080fd5b505af192505050801561240757506040513d601f19601f820116820180604052508101906124049190613e15565b60015b612481573d8060008114612437576040519150601f19603f3d011682016040523d82523d6000602084013e61243c565b606091505b50600081511415612479576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6124dc612aad565b6124ed6124e8836120c1565b61278d565b9050919050565b6060601080546125039061362e565b80601f016020809104026020016040519081016040528092919081815260200182805461252f9061362e565b801561257c5780601f106125515761010080835404028352916020019161257c565b820191906000526020600020905b81548152906001019060200180831161255f57829003601f168201915b5050505050905090565b606060008214156125ce576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126e2565b600082905060005b600082146126005780806125e990613e42565b915050600a826125f99190613eba565b91506125d6565b60008167ffffffffffffffff81111561261c5761261b612e02565b5b6040519080825280601f01601f19166020018201604052801561264e5781602001600182028036833780820191505090505b5090505b600085146126db576001826126679190613eeb565b9150600a856126769190613f1f565b60306126829190613802565b60f81b81838151811061269857612697613660565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126d49190613eba565b9450612652565b8093505050505b919050565b60009392505050565b6126fa8383612843565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461278857600080549050600083820390505b61273a6000868380600101945086612374565b612770576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061272757816000541461278557600080fd5b50505b505050565b612795612aad565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128b0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156128eb576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128f860008483856121f5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061296f8361296060008660006121fb565b61296985612a17565b17612223565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061299357806000819055505050612a12600084838561224e565b505050565b60006001821460e11b9050919050565b828054612a339061362e565b90600052602060002090601f016020900481019282612a555760008555612a9c565b82601f10612a6e57805160ff1916838001178555612a9c565b82800160010185558215612a9c579182015b82811115612a9b578251825591602001919060010190612a80565b5b509050612aa99190612afc565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612b15576000816000905550600101612afd565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b6281612b2d565b8114612b6d57600080fd5b50565b600081359050612b7f81612b59565b92915050565b600060208284031215612b9b57612b9a612b23565b5b6000612ba984828501612b70565b91505092915050565b60008115159050919050565b612bc781612bb2565b82525050565b6000602082019050612be26000830184612bbe565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c22578082015181840152602081019050612c07565b83811115612c31576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c5382612be8565b612c5d8185612bf3565b9350612c6d818560208601612c04565b612c7681612c37565b840191505092915050565b60006020820190508181036000830152612c9b8184612c48565b905092915050565b6000819050919050565b612cb681612ca3565b8114612cc157600080fd5b50565b600081359050612cd381612cad565b92915050565b600060208284031215612cef57612cee612b23565b5b6000612cfd84828501612cc4565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d3182612d06565b9050919050565b612d4181612d26565b82525050565b6000602082019050612d5c6000830184612d38565b92915050565b612d6b81612d26565b8114612d7657600080fd5b50565b600081359050612d8881612d62565b92915050565b60008060408385031215612da557612da4612b23565b5b6000612db385828601612d79565b9250506020612dc485828601612cc4565b9150509250929050565b612dd781612ca3565b82525050565b6000602082019050612df26000830184612dce565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612e3a82612c37565b810181811067ffffffffffffffff82111715612e5957612e58612e02565b5b80604052505050565b6000612e6c612b19565b9050612e788282612e31565b919050565b600067ffffffffffffffff821115612e9857612e97612e02565b5b612ea182612c37565b9050602081019050919050565b82818337600083830152505050565b6000612ed0612ecb84612e7d565b612e62565b905082815260208101848484011115612eec57612eeb612dfd565b5b612ef7848285612eae565b509392505050565b600082601f830112612f1457612f13612df8565b5b8135612f24848260208601612ebd565b91505092915050565b600060208284031215612f4357612f42612b23565b5b600082013567ffffffffffffffff811115612f6157612f60612b28565b5b612f6d84828501612eff565b91505092915050565b600080600060608486031215612f8f57612f8e612b23565b5b6000612f9d86828701612d79565b9350506020612fae86828701612d79565b9250506040612fbf86828701612cc4565b9150509250925092565b600067ffffffffffffffff821115612fe457612fe3612e02565b5b602082029050602081019050919050565b600080fd5b600061300d61300884612fc9565b612e62565b905080838252602082019050602084028301858111156130305761302f612ff5565b5b835b8181101561305957806130458882612cc4565b845260208401935050602081019050613032565b5050509392505050565b600082601f83011261307857613077612df8565b5b8135613088848260208601612ffa565b91505092915050565b6000602082840312156130a7576130a6612b23565b5b600082013567ffffffffffffffff8111156130c5576130c4612b28565b5b6130d184828501613063565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61310f81612d26565b82525050565b600067ffffffffffffffff82169050919050565b61313281613115565b82525050565b61314181612bb2565b82525050565b600062ffffff82169050919050565b61315f81613147565b82525050565b60808201600082015161317b6000850182613106565b50602082015161318e6020850182613129565b5060408201516131a16040850182613138565b5060608201516131b46060850182613156565b50505050565b60006131c68383613165565b60808301905092915050565b6000602082019050919050565b60006131ea826130da565b6131f481856130e5565b93506131ff836130f6565b8060005b8381101561323057815161321788826131ba565b9750613222836131d2565b925050600181019050613203565b5085935050505092915050565b6000602082019050818103600083015261325781846131df565b905092915050565b60006020828403121561327557613274612b23565b5b600061328384828501612d79565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6132c181612ca3565b82525050565b60006132d383836132b8565b60208301905092915050565b6000602082019050919050565b60006132f78261328c565b6133018185613297565b935061330c836132a8565b8060005b8381101561333d57815161332488826132c7565b975061332f836132df565b925050600181019050613310565b5085935050505092915050565b6000602082019050818103600083015261336481846132ec565b905092915050565b60008060006060848603121561338557613384612b23565b5b600061339386828701612d79565b93505060206133a486828701612cc4565b92505060406133b586828701612cc4565b9150509250925092565b6133c881612bb2565b81146133d357600080fd5b50565b6000813590506133e5816133bf565b92915050565b6000806040838503121561340257613401612b23565b5b600061341085828601612d79565b9250506020613421858286016133d6565b9150509250929050565b600067ffffffffffffffff82111561344657613445612e02565b5b61344f82612c37565b9050602081019050919050565b600061346f61346a8461342b565b612e62565b90508281526020810184848401111561348b5761348a612dfd565b5b613496848285612eae565b509392505050565b600082601f8301126134b3576134b2612df8565b5b81356134c384826020860161345c565b91505092915050565b600080600080608085870312156134e6576134e5612b23565b5b60006134f487828801612d79565b945050602061350587828801612d79565b935050604061351687828801612cc4565b925050606085013567ffffffffffffffff81111561353757613536612b28565b5b6135438782880161349e565b91505092959194509250565b6080820160008201516135656000850182613106565b5060208201516135786020850182613129565b50604082015161358b6040850182613138565b50606082015161359e6060850182613156565b50505050565b60006080820190506135b9600083018461354f565b92915050565b600080604083850312156135d6576135d5612b23565b5b60006135e485828601612d79565b92505060206135f585828601612d79565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061364657607f821691505b6020821081141561365a576136596135ff565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006136c5601f83612bf3565b91506136d08261368f565b602082019050919050565b600060208201905081810360008301526136f4816136b8565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613731601e83612bf3565b915061373c826136fb565b602082019050919050565b6000602082019050818103600083015261376081613724565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b600061379d601783612bf3565b91506137a882613767565b602082019050919050565b600060208201905081810360008301526137cc81613790565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061380d82612ca3565b915061381883612ca3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561384d5761384c6137d3565b5b828201905092915050565b7f46726565206d696e747320657868617573746564210000000000000000000000600082015250565b600061388e601583612bf3565b915061389982613858565b602082019050919050565b600060208201905081810360008301526138bd81613881565b9050919050565b7f5045525f57414c4c45545f4c494d49545f524541434845440000000000000000600082015250565b60006138fa601883612bf3565b9150613905826138c4565b602082019050919050565b60006020820190508181036000830152613929816138ed565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000613966601483612bf3565b915061397182613930565b602082019050919050565b6000602082019050818103600083015261399581613959565b9050919050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006139d2601483612bf3565b91506139dd8261399c565b602082019050919050565b60006020820190508181036000830152613a01816139c5565b9050919050565b6000613a1382612ca3565b9150613a1e83612ca3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a5757613a566137d3565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000613a98601383612bf3565b9150613aa382613a62565b602082019050919050565b60006020820190508181036000830152613ac781613a8b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613b2a602f83612bf3565b9150613b3582613ace565b604082019050919050565b60006020820190508181036000830152613b5981613b1d565b9050919050565b600081905092915050565b6000613b7682612be8565b613b808185613b60565b9350613b90818560208601612c04565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613bbe8161362e565b613bc88186613b60565b94506001821660008114613be35760018114613bf457613c27565b60ff19831686528186019350613c27565b613bfd85613b9c565b60005b83811015613c1f57815481890152600182019150602081019050613c00565b838801955050505b50505092915050565b6000613c3c8286613b6b565b9150613c488285613b6b565b9150613c548284613bb1565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613cbd602683612bf3565b9150613cc882613c61565b604082019050919050565b60006020820190508181036000830152613cec81613cb0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d29602083612bf3565b9150613d3482613cf3565b602082019050919050565b60006020820190508181036000830152613d5881613d1c565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613d8682613d5f565b613d908185613d6a565b9350613da0818560208601612c04565b613da981612c37565b840191505092915050565b6000608082019050613dc96000830187612d38565b613dd66020830186612d38565b613de36040830185612dce565b8181036060830152613df58184613d7b565b905095945050505050565b600081519050613e0f81612b59565b92915050565b600060208284031215613e2b57613e2a612b23565b5b6000613e3984828501613e00565b91505092915050565b6000613e4d82612ca3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e8057613e7f6137d3565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ec582612ca3565b9150613ed083612ca3565b925082613ee057613edf613e8b565b5b828204905092915050565b6000613ef682612ca3565b9150613f0183612ca3565b925082821015613f1457613f136137d3565b5b828203905092915050565b6000613f2a82612ca3565b9150613f3583612ca3565b925082613f4557613f44613e8b565b5b82820690509291505056fea26469706673582212208ba6d29835b39dad1825f217f9dbebb309bd8301b3cd91711b493e9c590ff10264736f6c63430008090033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569617835616d3734366a7664726668737378326d3766676a356877636a6378656c6f67737a796d62657867616464367573666635342f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): ipfs://bafybeiax5am746jvdrfhssx2m7fgj5hwcjcxelogszymbexgadd6usff54/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [2] : 697066733a2f2f62616679626569617835616d3734366a766472666873737832
Arg [3] : 6d3766676a356877636a6378656c6f67737a796d626578676164643675736666
Arg [4] : 35342f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

62446:3058:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23474:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29121:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31067:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30615:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65122:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62715:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65004:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22528:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40332:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64613:73;;;;;;;;;;;;;:::i;:::-;;65270:109;;;;;;;;;;;;;:::i;:::-;;31957:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64694:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62874:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57700:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62805:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62839:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28910:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62639:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24153:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8065:103;;;;;;;;;;;;;:::i;:::-;;63743:461;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64886:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61512:892;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7417:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29290:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58558:2505;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63204:531;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62756:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31343:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62680:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32213:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57121:420;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64212:393;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62554:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64782:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31722:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8323:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23474:615;23559:4;23874:10;23859:25;;:11;:25;;;;:102;;;;23951:10;23936:25;;:11;:25;;;;23859:102;:179;;;;24028:10;24013:25;;:11;:25;;;;23859:179;23839:199;;23474:615;;;:::o;29121:100::-;29175:13;29208:5;29201:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29121:100;:::o;31067:204::-;31135:7;31160:16;31168:7;31160;:16::i;:::-;31155:64;;31185:34;;;;;;;;;;;;;;31155:64;31239:15;:24;31255:7;31239:24;;;;;;;;;;;;;;;;;;;;;31232:31;;31067:204;;;:::o;30615:386::-;30688:13;30704:16;30712:7;30704;:16::i;:::-;30688:32;;30760:5;30737:28;;:19;:17;:19::i;:::-;:28;;;30733:175;;30785:44;30802:5;30809:19;:17;:19::i;:::-;30785:16;:44::i;:::-;30780:128;;30857:35;;;;;;;;;;;;;;30780:128;30733:175;30947:2;30920:15;:24;30936:7;30920:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30985:7;30981:2;30965:28;;30974:5;30965:28;;;;;;;;;;;;30677:324;30615:386;;:::o;65122:136::-;7303:13;:11;:13::i;:::-;65231:19:::1;65210:18;:40;;;;65122:136:::0;:::o;62715:34::-;;;;:::o;65004:106::-;7303:13;:11;:13::i;:::-;65092:10:::1;65080:9;:22;;;;;;;;;;;;:::i;:::-;;65004:106:::0;:::o;22528:315::-;22581:7;22809:15;:13;:15::i;:::-;22794:12;;22778:13;;:28;:46;22771:53;;22528:315;:::o;40332:2800::-;40466:27;40496;40515:7;40496:18;:27::i;:::-;40466:57;;40581:4;40540:45;;40556:19;40540:45;;;40536:86;;40594:28;;;;;;;;;;;;;;40536:86;40636:27;40665:23;40692:28;40712:7;40692:19;:28::i;:::-;40635:85;;;;40820:62;40839:15;40856:4;40862:19;:17;:19::i;:::-;40820:18;:62::i;:::-;40815:174;;40902:43;40919:4;40925:19;:17;:19::i;:::-;40902:16;:43::i;:::-;40897:92;;40954:35;;;;;;;;;;;;;;40897:92;40815:174;41020:1;41006:16;;:2;:16;;;41002:52;;;41031:23;;;;;;;;;;;;;;41002:52;41067:43;41089:4;41095:2;41099:7;41108:1;41067:21;:43::i;:::-;41203:15;41200:160;;;41343:1;41322:19;41315:30;41200:160;41738:18;:24;41757:4;41738:24;;;;;;;;;;;;;;;;41736:26;;;;;;;;;;;;41807:18;:22;41826:2;41807:22;;;;;;;;;;;;;;;;41805:24;;;;;;;;;;;42129:145;42166:2;42214:45;42229:4;42235:2;42239:19;42214:14;:45::i;:::-;19756:8;42187:72;42129:18;:145::i;:::-;42100:17;:26;42118:7;42100:26;;;;;;;;;;;:174;;;;42444:1;19756:8;42394:19;:46;:51;42390:626;;;42466:19;42498:1;42488:7;:11;42466:33;;42655:1;42621:17;:30;42639:11;42621:30;;;;;;;;;;;;:35;42617:384;;;42759:13;;42744:11;:28;42740:242;;42939:19;42906:17;:30;42924:11;42906:30;;;;;;;;;;;:52;;;;42740:242;42617:384;42447:569;42390:626;43063:7;43059:2;43044:27;;43053:4;43044:27;;;;;;;;;;;;43082:42;43103:4;43109:2;43113:7;43122:1;43082:20;:42::i;:::-;40455:2677;;;40332:2800;;;:::o;64613:73::-;7303:13;:11;:13::i;:::-;64672:6:::1;;;;;;;;;;;64671:7;64662:6;;:16;;;;;;;;;;;;;;;;;;64613:73::o:0;65270:109::-;7303:13;:11;:13::i;:::-;65328:10:::1;65320:28;;:51;65349:21;65320:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;65270:109::o:0;31957:185::-;32095:39;32112:4;32118:2;32122:7;32095:39;;;;;;;;;;;;:16;:39::i;:::-;31957:185;;;:::o;64694:80::-;7303:13;:11;:13::i;:::-;64761:5:::1;64754:4;:12;;;;64694:80:::0;:::o;62874:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57700:468::-;57789:23;57850:22;57875:8;:15;57850:40;;57905:34;57963:14;57942:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;57905:73;;57998:9;57993:125;58014:14;58009:1;:19;57993:125;;58070:32;58090:8;58099:1;58090:11;;;;;;;;:::i;:::-;;;;;;;;58070:19;:32::i;:::-;58054:10;58065:1;58054:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;58030:3;;;;;57993:125;;;;58139:10;58132:17;;;;57700:468;;;:::o;62805:25::-;;;;;;;;;;;;;:::o;62839:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28910:144::-;28974:7;29017:27;29036:7;29017:18;:27::i;:::-;28994:52;;28910:144;;;:::o;62639:34::-;;;;:::o;24153:224::-;24217:7;24258:1;24241:19;;:5;:19;;;24237:60;;;24269:28;;;;;;;;;;;;;;24237:60;18708:13;24315:18;:25;24334:5;24315:25;;;;;;;;;;;;;;;;:54;24308:61;;24153:224;;;:::o;8065:103::-;7303:13;:11;:13::i;:::-;8130:30:::1;8157:1;8130:18;:30::i;:::-;8065:103::o:0;63743:461::-;1843:1;2441:7;;:19;;2433:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1843:1;2574:7;:18;;;;63131:10:::1;63118:23;;:9;:23;;;63110:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;63835:6:::2;;;;;;;;;;;63834:7;63826:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;63919:18;;63904:11;63888:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:49;;63880:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;64021:13;;64006:11;63982:21;63992:10;63982:9;:21::i;:::-;:35;;;;:::i;:::-;:52;;63974:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;64096:1;64082:11;:15;:42;;;;;64116:8;;64101:11;:23;;64082:42;64074:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;64160:36;64170:12;:10;:12::i;:::-;64184:11;64160:9;:36::i;:::-;1799:1:::0;2753:7;:22;;;;63743:461;:::o;64886:106::-;7303:13;:11;:13::i;:::-;64974:10:::1;64962:9;:22;;;;;;;;;;;;:::i;:::-;;64886:106:::0;:::o;61512:892::-;61582:16;61636:19;61670:25;61710:22;61735:16;61745:5;61735:9;:16::i;:::-;61710:41;;61766:25;61808:14;61794:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61766:57;;61838:31;;:::i;:::-;61889:9;61901:15;:13;:15::i;:::-;61889:27;;61884:472;61933:14;61918:11;:29;61884:472;;61985:15;61998:1;61985:12;:15::i;:::-;61973:27;;62023:9;:16;;;62019:73;;;62064:8;;62019:73;62140:1;62114:28;;:9;:14;;;:28;;;62110:111;;62187:9;:14;;;62167:34;;62110:111;62264:5;62243:26;;:17;:26;;;62239:102;;;62320:1;62294:8;62303:13;;;;;;62294:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;62239:102;61884:472;61949:3;;;;;61884:472;;;;62377:8;62370:15;;;;;;;61512:892;;;:::o;7417:87::-;7463:7;7490:6;;;;;;;;;;;7483:13;;7417:87;:::o;29290:104::-;29346:13;29379:7;29372:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29290:104;:::o;58558:2505::-;58693:16;58760:4;58751:5;:13;58747:45;;58773:19;;;;;;;;;;;;;;58747:45;58807:19;58841:17;58861:14;:12;:14::i;:::-;58841:34;;58961:15;:13;:15::i;:::-;58953:5;:23;58949:87;;;59005:15;:13;:15::i;:::-;58997:23;;58949:87;59112:9;59105:4;:16;59101:73;;;59149:9;59142:16;;59101:73;59188:25;59216:16;59226:5;59216:9;:16::i;:::-;59188:44;;59410:4;59402:5;:12;59398:278;;;59435:19;59464:5;59457:4;:12;59435:34;;59506:17;59492:11;:31;59488:111;;;59568:11;59548:31;;59488:111;59416:198;59398:278;;;59659:1;59639:21;;59398:278;59690:25;59732:17;59718:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59690:60;;59790:1;59769:17;:22;59765:78;;;59819:8;59812:15;;;;;;;;59765:78;59987:31;60021:26;60041:5;60021:19;:26::i;:::-;59987:60;;60062:25;60307:9;:16;;;60302:92;;60364:9;:14;;;60344:34;;60302:92;60413:9;60425:5;60413:17;;60408:478;60437:4;60432:1;:9;;:45;;;;;60460:17;60445:11;:32;;60432:45;60408:478;;;60515:15;60528:1;60515:12;:15::i;:::-;60503:27;;60553:9;:16;;;60549:73;;;60594:8;;60549:73;60670:1;60644:28;;:9;:14;;;:28;;;60640:111;;60717:9;:14;;;60697:34;;60640:111;60794:5;60773:26;;:17;:26;;;60769:102;;;60850:1;60824:8;60833:13;;;;;;60824:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;60769:102;60408:478;60479:3;;;;;60408:478;;;;60988:11;60978:8;60971:29;61036:8;61029:15;;;;;;;;58558:2505;;;;;;:::o;63204:531::-;1843:1;2441:7;;:19;;2433:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1843:1;2574:7;:18;;;;63131:10:::1;63118:23;;:9;:23;;;63110:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;63300:6:::2;;;;;;;;;;;63299:7;63291:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;63392:13;;63377:11;63353:21;63363:10;63353:9;:21::i;:::-;:35;;;;:::i;:::-;:52;;63345:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;63467:1;63453:11;:15;:42;;;;;63487:8;;63472:11;:23;;63453:42;63445:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;63571:9;;63555:11;63539:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;63531:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;63645:11;63638:4;;:18;;;;:::i;:::-;63625:9;:31;;63617:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;63691:36;63701:12;:10;:12::i;:::-;63715:11;63691:9;:36::i;:::-;1799:1:::0;2753:7;:22;;;;63204:531;:::o;62756:40::-;;;;:::o;31343:308::-;31454:19;:17;:19::i;:::-;31442:31;;:8;:31;;;31438:61;;;31482:17;;;;;;;;;;;;;;31438:61;31564:8;31512:18;:39;31531:19;:17;:19::i;:::-;31512:39;;;;;;;;;;;;;;;:49;31552:8;31512:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;31624:8;31588:55;;31603:19;:17;:19::i;:::-;31588:55;;;31634:8;31588:55;;;;;;:::i;:::-;;;;;;;;31343:308;;:::o;62680:28::-;;;;:::o;32213:399::-;32380:31;32393:4;32399:2;32403:7;32380:12;:31::i;:::-;32444:1;32426:2;:14;;;:19;32422:183;;32465:56;32496:4;32502:2;32506:7;32515:5;32465:30;:56::i;:::-;32460:145;;32549:40;;;;;;;;;;;;;;32460:145;32422:183;32213:399;;;;:::o;57121:420::-;57197:21;;:::i;:::-;57231:31;;:::i;:::-;57287:15;:13;:15::i;:::-;57277:7;:25;:54;;;;57317:14;:12;:14::i;:::-;57306:7;:25;;57277:54;57273:103;;;57355:9;57348:16;;;;;57273:103;57398:21;57411:7;57398:12;:21::i;:::-;57386:33;;57434:9;:16;;;57430:65;;;57474:9;57467:16;;;;;57430:65;57512:21;57525:7;57512:12;:21::i;:::-;57505:28;;;57121:420;;;;:::o;64212:393::-;64286:13;64320:17;64328:8;64320:7;:17::i;:::-;64312:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;64400:28;64431:10;:8;:10::i;:::-;64400:41;;64490:1;64465:14;64459:28;:32;:138;;;;;;;;;;;;;;;;;64531:14;64547:19;:8;:17;:19::i;:::-;64568:9;64514:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64459:138;64452:145;;;64212:393;;;:::o;62554:32::-;;;;:::o;64782:96::-;7303:13;:11;:13::i;:::-;64861:9:::1;64850:8;:20;;;;64782:96:::0;:::o;31722:164::-;31819:4;31843:18;:25;31862:5;31843:25;;;;;;;;;;;;;;;:35;31869:8;31843:35;;;;;;;;;;;;;;;;;;;;;;;;;31836:42;;31722:164;;;;:::o;8323:201::-;7303:13;:11;:13::i;:::-;8432:1:::1;8412:22;;:8;:22;;;;8404:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8488:28;8507:8;8488:18;:28::i;:::-;8323:201:::0;:::o;32867:273::-;32924:4;32980:7;32961:15;:13;:15::i;:::-;:26;;:66;;;;;33014:13;;33004:7;:23;32961:66;:152;;;;;33112:1;19478:8;33065:17;:26;33083:7;33065:26;;;;;;;;;;;;:43;:48;32961:152;32941:172;;32867:273;;;:::o;51428:105::-;51488:7;51515:10;51508:17;;51428:105;:::o;7582:132::-;7657:12;:10;:12::i;:::-;7646:23;;:7;:5;:7::i;:::-;:23;;;7638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7582:132::o;22052:92::-;22108:7;22052:92;:::o;25827:1129::-;25894:7;25914:12;25929:7;25914:22;;25997:4;25978:15;:13;:15::i;:::-;:23;25974:915;;26031:13;;26024:4;:20;26020:869;;;26069:14;26086:17;:23;26104:4;26086:23;;;;;;;;;;;;26069:40;;26202:1;19478:8;26175:6;:23;:28;26171:699;;;26694:113;26711:1;26701:6;:11;26694:113;;;26754:17;:25;26772:6;;;;;;;26754:25;;;;;;;;;;;;26745:34;;26694:113;;;26840:6;26833:13;;;;;;26171:699;26046:843;26020:869;25974:915;26917:31;;;;;;;;;;;;;;25827:1129;;;;:::o;38668:652::-;38763:27;38792:23;38833:53;38889:15;38833:71;;39075:7;39069:4;39062:21;39110:22;39104:4;39097:36;39186:4;39180;39170:21;39147:44;;39282:19;39276:26;39257:45;;39013:300;38668:652;;;:::o;39433:645::-;39575:11;39737:15;39731:4;39727:26;39719:34;;39896:15;39885:9;39881:31;39868:44;;40043:15;40032:9;40029:30;40022:4;40011:9;40008:19;40005:55;39995:65;;39433:645;;;;;:::o;50261:159::-;;;;;:::o;48573:309::-;48708:7;48728:16;19879:3;48754:19;:40;;48728:67;;19879:3;48821:31;48832:4;48838:2;48842:9;48821:10;:31::i;:::-;48813:40;;:61;;48806:68;;;48573:309;;;;;:::o;28401:447::-;28481:14;28649:15;28642:5;28638:27;28629:36;;28823:5;28809:11;28785:22;28781:40;28778:51;28771:5;28768:62;28758:72;;28401:447;;;;:::o;51079:158::-;;;;;:::o;8684:191::-;8758:16;8777:6;;;;;;;;;;;8758:25;;8803:8;8794:6;;:17;;;;;;;;;;;;;;;;;;8858:8;8827:40;;8848:8;8827:40;;;;;;;;;;;;8747:128;8684:191;:::o;5968:98::-;6021:7;6048:10;6041:17;;5968:98;:::o;33224:104::-;33293:27;33303:2;33307:8;33293:27;;;;;;;;;;;;:9;:27::i;:::-;33224:104;;:::o;27504:153::-;27564:21;;:::i;:::-;27605:44;27624:17;:24;27642:5;27624:24;;;;;;;;;;;;27605:18;:44::i;:::-;27598:51;;27504:153;;;:::o;22223:95::-;22270:7;22297:13;;22290:20;;22223:95;:::o;47083:716::-;47246:4;47292:2;47267:45;;;47313:19;:17;:19::i;:::-;47334:4;47340:7;47349:5;47267:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47263:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47567:1;47550:6;:13;:18;47546:235;;;47596:40;;;;;;;;;;;;;;47546:235;47739:6;47733:13;47724:6;47720:2;47716:15;47709:38;47263:529;47436:54;;;47426:64;;;:6;:64;;;;47419:71;;;47083:716;;;;;;:::o;28160:158::-;28222:21;;:::i;:::-;28263:47;28282:27;28301:7;28282:18;:27::i;:::-;28263:18;:47::i;:::-;28256:54;;28160:158;;;:::o;65391:110::-;65451:13;65484:9;65477:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65391:110;:::o;3220:723::-;3276:13;3506:1;3497:5;:10;3493:53;;;3524:10;;;;;;;;;;;;;;;;;;;;;3493:53;3556:12;3571:5;3556:20;;3587:14;3612:78;3627:1;3619:4;:9;3612:78;;3645:8;;;;;:::i;:::-;;;;3676:2;3668:10;;;;;:::i;:::-;;;3612:78;;;3700:19;3732:6;3722:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3700:39;;3750:154;3766:1;3757:5;:10;3750:154;;3794:1;3784:11;;;;;:::i;:::-;;;3861:2;3853:5;:10;;;;:::i;:::-;3840:2;:24;;;;:::i;:::-;3827:39;;3810:6;3817;3810:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3890:2;3881:11;;;;;:::i;:::-;;;3750:154;;;3928:6;3914:21;;;;;3220:723;;;;:::o;49458:147::-;49595:6;49458:147;;;;;:::o;33744:681::-;33867:19;33873:2;33877:8;33867:5;:19::i;:::-;33946:1;33928:2;:14;;;:19;33924:483;;33968:11;33982:13;;33968:27;;34014:13;34036:8;34030:3;:14;34014:30;;34063:233;34094:62;34133:1;34137:2;34141:7;;;;;;34150:5;34094:30;:62::i;:::-;34089:167;;34192:40;;;;;;;;;;;;;;34089:167;34291:3;34283:5;:11;34063:233;;34378:3;34361:13;;:20;34357:34;;34383:8;;;34357:34;33949:458;;33924:483;33744:681;;;:::o;27050:363::-;27116:31;;:::i;:::-;27193:6;27160:9;:14;;:41;;;;;;;;;;;19362:3;27246:6;:32;;27212:9;:24;;:67;;;;;;;;;;;27336:1;19478:8;27309:6;:23;:28;;27290:9;:16;;:47;;;;;;;;;;;19879:3;27377:6;:27;;27348:9;:19;;:57;;;;;;;;;;;27050:363;;;:::o;34698:1529::-;34763:20;34786:13;;34763:36;;34828:1;34814:16;;:2;:16;;;34810:48;;;34839:19;;;;;;;;;;;;;;34810:48;34885:1;34873:8;:13;34869:44;;;34895:18;;;;;;;;;;;;;;34869:44;34926:61;34956:1;34960:2;34964:12;34978:8;34926:21;:61::i;:::-;35469:1;18845:2;35440:1;:25;;35439:31;35427:8;:44;35401:18;:22;35420:2;35401:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;35748:139;35785:2;35839:33;35862:1;35866:2;35870:1;35839:14;:33::i;:::-;35806:30;35827:8;35806:20;:30::i;:::-;:66;35748:18;:139::i;:::-;35714:17;:31;35732:12;35714:31;;;;;;;;;;;:173;;;;35904:15;35922:12;35904:30;;35949:11;35978:8;35963:12;:23;35949:37;;36001:101;36053:9;;;;;;36049:2;36028:35;;36045:1;36028:35;;;;;;;;;;;;36097:3;36087:7;:13;36001:101;;36134:3;36118:13;:19;;;;35175:974;;36159:60;36188:1;36192:2;36196:12;36210:8;36159:20;:60::i;:::-;34752:1475;34698:1529;;:::o;30231:322::-;30301:14;30532:1;30522:8;30519:15;30494:23;30490:45;30480:55;;30231:322;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:117::-;5399:1;5396;5389:12;5413:117;5522:1;5519;5512:12;5536:180;5584:77;5581:1;5574:88;5681:4;5678:1;5671:15;5705:4;5702:1;5695:15;5722:281;5805:27;5827:4;5805:27;:::i;:::-;5797:6;5793:40;5935:6;5923:10;5920:22;5899:18;5887:10;5884:34;5881:62;5878:88;;;5946:18;;:::i;:::-;5878:88;5986:10;5982:2;5975:22;5765:238;5722:281;;:::o;6009:129::-;6043:6;6070:20;;:::i;:::-;6060:30;;6099:33;6127:4;6119:6;6099:33;:::i;:::-;6009:129;;;:::o;6144:308::-;6206:4;6296:18;6288:6;6285:30;6282:56;;;6318:18;;:::i;:::-;6282:56;6356:29;6378:6;6356:29;:::i;:::-;6348:37;;6440:4;6434;6430:15;6422:23;;6144:308;;;:::o;6458:154::-;6542:6;6537:3;6532;6519:30;6604:1;6595:6;6590:3;6586:16;6579:27;6458:154;;;:::o;6618:412::-;6696:5;6721:66;6737:49;6779:6;6737:49;:::i;:::-;6721:66;:::i;:::-;6712:75;;6810:6;6803:5;6796:21;6848:4;6841:5;6837:16;6886:3;6877:6;6872:3;6868:16;6865:25;6862:112;;;6893:79;;:::i;:::-;6862:112;6983:41;7017:6;7012:3;7007;6983:41;:::i;:::-;6702:328;6618:412;;;;;:::o;7050:340::-;7106:5;7155:3;7148:4;7140:6;7136:17;7132:27;7122:122;;7163:79;;:::i;:::-;7122:122;7280:6;7267:20;7305:79;7380:3;7372:6;7365:4;7357:6;7353:17;7305:79;:::i;:::-;7296:88;;7112:278;7050:340;;;;:::o;7396:509::-;7465:6;7514:2;7502:9;7493:7;7489:23;7485:32;7482:119;;;7520:79;;:::i;:::-;7482:119;7668:1;7657:9;7653:17;7640:31;7698:18;7690:6;7687:30;7684:117;;;7720:79;;:::i;:::-;7684:117;7825:63;7880:7;7871:6;7860:9;7856:22;7825:63;:::i;:::-;7815:73;;7611:287;7396:509;;;;:::o;7911:619::-;7988:6;7996;8004;8053:2;8041:9;8032:7;8028:23;8024:32;8021:119;;;8059:79;;:::i;:::-;8021:119;8179:1;8204:53;8249:7;8240:6;8229:9;8225:22;8204:53;:::i;:::-;8194:63;;8150:117;8306:2;8332:53;8377:7;8368:6;8357:9;8353:22;8332:53;:::i;:::-;8322:63;;8277:118;8434:2;8460:53;8505:7;8496:6;8485:9;8481:22;8460:53;:::i;:::-;8450:63;;8405:118;7911:619;;;;;:::o;8536:311::-;8613:4;8703:18;8695:6;8692:30;8689:56;;;8725:18;;:::i;:::-;8689:56;8775:4;8767:6;8763:17;8755:25;;8835:4;8829;8825:15;8817:23;;8536:311;;;:::o;8853:117::-;8962:1;8959;8952:12;8993:710;9089:5;9114:81;9130:64;9187:6;9130:64;:::i;:::-;9114:81;:::i;:::-;9105:90;;9215:5;9244:6;9237:5;9230:21;9278:4;9271:5;9267:16;9260:23;;9331:4;9323:6;9319:17;9311:6;9307:30;9360:3;9352:6;9349:15;9346:122;;;9379:79;;:::i;:::-;9346:122;9494:6;9477:220;9511:6;9506:3;9503:15;9477:220;;;9586:3;9615:37;9648:3;9636:10;9615:37;:::i;:::-;9610:3;9603:50;9682:4;9677:3;9673:14;9666:21;;9553:144;9537:4;9532:3;9528:14;9521:21;;9477:220;;;9481:21;9095:608;;8993:710;;;;;:::o;9726:370::-;9797:5;9846:3;9839:4;9831:6;9827:17;9823:27;9813:122;;9854:79;;:::i;:::-;9813:122;9971:6;9958:20;9996:94;10086:3;10078:6;10071:4;10063:6;10059:17;9996:94;:::i;:::-;9987:103;;9803:293;9726:370;;;;:::o;10102:539::-;10186:6;10235:2;10223:9;10214:7;10210:23;10206:32;10203:119;;;10241:79;;:::i;:::-;10203:119;10389:1;10378:9;10374:17;10361:31;10419:18;10411:6;10408:30;10405:117;;;10441:79;;:::i;:::-;10405:117;10546:78;10616:7;10607:6;10596:9;10592:22;10546:78;:::i;:::-;10536:88;;10332:302;10102:539;;;;:::o;10647:145::-;10745:6;10779:5;10773:12;10763:22;;10647:145;;;:::o;10798:215::-;10928:11;10962:6;10957:3;10950:19;11002:4;10997:3;10993:14;10978:29;;10798:215;;;;:::o;11019:163::-;11117:4;11140:3;11132:11;;11170:4;11165:3;11161:14;11153:22;;11019:163;;;:::o;11188:108::-;11265:24;11283:5;11265:24;:::i;:::-;11260:3;11253:37;11188:108;;:::o;11302:101::-;11338:7;11378:18;11371:5;11367:30;11356:41;;11302:101;;;:::o;11409:105::-;11484:23;11501:5;11484:23;:::i;:::-;11479:3;11472:36;11409:105;;:::o;11520:99::-;11591:21;11606:5;11591:21;:::i;:::-;11586:3;11579:34;11520:99;;:::o;11625:91::-;11661:7;11701:8;11694:5;11690:20;11679:31;;11625:91;;;:::o;11722:105::-;11797:23;11814:5;11797:23;:::i;:::-;11792:3;11785:36;11722:105;;:::o;11905:864::-;12054:4;12049:3;12045:14;12141:4;12134:5;12130:16;12124:23;12160:63;12217:4;12212:3;12208:14;12194:12;12160:63;:::i;:::-;12069:164;12325:4;12318:5;12314:16;12308:23;12344:61;12399:4;12394:3;12390:14;12376:12;12344:61;:::i;:::-;12243:172;12499:4;12492:5;12488:16;12482:23;12518:57;12569:4;12564:3;12560:14;12546:12;12518:57;:::i;:::-;12425:160;12672:4;12665:5;12661:16;12655:23;12691:61;12746:4;12741:3;12737:14;12723:12;12691:61;:::i;:::-;12595:167;12023:746;11905:864;;:::o;12775:303::-;12906:10;12927:108;13031:3;13023:6;12927:108;:::i;:::-;13067:4;13062:3;13058:14;13044:28;;12775:303;;;;:::o;13084:144::-;13185:4;13217;13212:3;13208:14;13200:22;;13084:144;;;:::o;13310:980::-;13491:3;13520:85;13599:5;13520:85;:::i;:::-;13621:117;13731:6;13726:3;13621:117;:::i;:::-;13614:124;;13762:87;13843:5;13762:87;:::i;:::-;13872:7;13903:1;13888:377;13913:6;13910:1;13907:13;13888:377;;;13989:6;13983:13;14016:125;14137:3;14122:13;14016:125;:::i;:::-;14009:132;;14164:91;14248:6;14164:91;:::i;:::-;14154:101;;13948:317;13935:1;13932;13928:9;13923:14;;13888:377;;;13892:14;14281:3;14274:10;;13496:794;;;13310:980;;;;:::o;14296:497::-;14501:4;14539:2;14528:9;14524:18;14516:26;;14588:9;14582:4;14578:20;14574:1;14563:9;14559:17;14552:47;14616:170;14781:4;14772:6;14616:170;:::i;:::-;14608:178;;14296:497;;;;:::o;14799:329::-;14858:6;14907:2;14895:9;14886:7;14882:23;14878:32;14875:119;;;14913:79;;:::i;:::-;14875:119;15033:1;15058:53;15103:7;15094:6;15083:9;15079:22;15058:53;:::i;:::-;15048:63;;15004:117;14799:329;;;;:::o;15134:114::-;15201:6;15235:5;15229:12;15219:22;;15134:114;;;:::o;15254:184::-;15353:11;15387:6;15382:3;15375:19;15427:4;15422:3;15418:14;15403:29;;15254:184;;;;:::o;15444:132::-;15511:4;15534:3;15526:11;;15564:4;15559:3;15555:14;15547:22;;15444:132;;;:::o;15582:108::-;15659:24;15677:5;15659:24;:::i;:::-;15654:3;15647:37;15582:108;;:::o;15696:179::-;15765:10;15786:46;15828:3;15820:6;15786:46;:::i;:::-;15864:4;15859:3;15855:14;15841:28;;15696:179;;;;:::o;15881:113::-;15951:4;15983;15978:3;15974:14;15966:22;;15881:113;;;:::o;16030:732::-;16149:3;16178:54;16226:5;16178:54;:::i;:::-;16248:86;16327:6;16322:3;16248:86;:::i;:::-;16241:93;;16358:56;16408:5;16358:56;:::i;:::-;16437:7;16468:1;16453:284;16478:6;16475:1;16472:13;16453:284;;;16554:6;16548:13;16581:63;16640:3;16625:13;16581:63;:::i;:::-;16574:70;;16667:60;16720:6;16667:60;:::i;:::-;16657:70;;16513:224;16500:1;16497;16493:9;16488:14;;16453:284;;;16457:14;16753:3;16746:10;;16154:608;;;16030:732;;;;:::o;16768:373::-;16911:4;16949:2;16938:9;16934:18;16926:26;;16998:9;16992:4;16988:20;16984:1;16973:9;16969:17;16962:47;17026:108;17129:4;17120:6;17026:108;:::i;:::-;17018:116;;16768:373;;;;:::o;17147:619::-;17224:6;17232;17240;17289:2;17277:9;17268:7;17264:23;17260:32;17257:119;;;17295:79;;:::i;:::-;17257:119;17415:1;17440:53;17485:7;17476:6;17465:9;17461:22;17440:53;:::i;:::-;17430:63;;17386:117;17542:2;17568:53;17613:7;17604:6;17593:9;17589:22;17568:53;:::i;:::-;17558:63;;17513:118;17670:2;17696:53;17741:7;17732:6;17721:9;17717:22;17696:53;:::i;:::-;17686:63;;17641:118;17147:619;;;;;:::o;17772:116::-;17842:21;17857:5;17842:21;:::i;:::-;17835:5;17832:32;17822:60;;17878:1;17875;17868:12;17822:60;17772:116;:::o;17894:133::-;17937:5;17975:6;17962:20;17953:29;;17991:30;18015:5;17991:30;:::i;:::-;17894:133;;;;:::o;18033:468::-;18098:6;18106;18155:2;18143:9;18134:7;18130:23;18126:32;18123:119;;;18161:79;;:::i;:::-;18123:119;18281:1;18306:53;18351:7;18342:6;18331:9;18327:22;18306:53;:::i;:::-;18296:63;;18252:117;18408:2;18434:50;18476:7;18467:6;18456:9;18452:22;18434:50;:::i;:::-;18424:60;;18379:115;18033:468;;;;;:::o;18507:307::-;18568:4;18658:18;18650:6;18647:30;18644:56;;;18680:18;;:::i;:::-;18644:56;18718:29;18740:6;18718:29;:::i;:::-;18710:37;;18802:4;18796;18792:15;18784:23;;18507:307;;;:::o;18820:410::-;18897:5;18922:65;18938:48;18979:6;18938:48;:::i;:::-;18922:65;:::i;:::-;18913:74;;19010:6;19003:5;18996:21;19048:4;19041:5;19037:16;19086:3;19077:6;19072:3;19068:16;19065:25;19062:112;;;19093:79;;:::i;:::-;19062:112;19183:41;19217:6;19212:3;19207;19183:41;:::i;:::-;18903:327;18820:410;;;;;:::o;19249:338::-;19304:5;19353:3;19346:4;19338:6;19334:17;19330:27;19320:122;;19361:79;;:::i;:::-;19320:122;19478:6;19465:20;19503:78;19577:3;19569:6;19562:4;19554:6;19550:17;19503:78;:::i;:::-;19494:87;;19310:277;19249:338;;;;:::o;19593:943::-;19688:6;19696;19704;19712;19761:3;19749:9;19740:7;19736:23;19732:33;19729:120;;;19768:79;;:::i;:::-;19729:120;19888:1;19913:53;19958:7;19949:6;19938:9;19934:22;19913:53;:::i;:::-;19903:63;;19859:117;20015:2;20041:53;20086:7;20077:6;20066:9;20062:22;20041:53;:::i;:::-;20031:63;;19986:118;20143:2;20169:53;20214:7;20205:6;20194:9;20190:22;20169:53;:::i;:::-;20159:63;;20114:118;20299:2;20288:9;20284:18;20271:32;20330:18;20322:6;20319:30;20316:117;;;20352:79;;:::i;:::-;20316:117;20457:62;20511:7;20502:6;20491:9;20487:22;20457:62;:::i;:::-;20447:72;;20242:287;19593:943;;;;;;;:::o;20614:874::-;20773:4;20768:3;20764:14;20860:4;20853:5;20849:16;20843:23;20879:63;20936:4;20931:3;20927:14;20913:12;20879:63;:::i;:::-;20788:164;21044:4;21037:5;21033:16;21027:23;21063:61;21118:4;21113:3;21109:14;21095:12;21063:61;:::i;:::-;20962:172;21218:4;21211:5;21207:16;21201:23;21237:57;21288:4;21283:3;21279:14;21265:12;21237:57;:::i;:::-;21144:160;21391:4;21384:5;21380:16;21374:23;21410:61;21465:4;21460:3;21456:14;21442:12;21410:61;:::i;:::-;21314:167;20742:746;20614:874;;:::o;21494:347::-;21649:4;21687:3;21676:9;21672:19;21664:27;;21701:133;21831:1;21820:9;21816:17;21807:6;21701:133;:::i;:::-;21494:347;;;;:::o;21847:474::-;21915:6;21923;21972:2;21960:9;21951:7;21947:23;21943:32;21940:119;;;21978:79;;:::i;:::-;21940:119;22098:1;22123:53;22168:7;22159:6;22148:9;22144:22;22123:53;:::i;:::-;22113:63;;22069:117;22225:2;22251:53;22296:7;22287:6;22276:9;22272:22;22251:53;:::i;:::-;22241:63;;22196:118;21847:474;;;;;:::o;22327:180::-;22375:77;22372:1;22365:88;22472:4;22469:1;22462:15;22496:4;22493:1;22486:15;22513:320;22557:6;22594:1;22588:4;22584:12;22574:22;;22641:1;22635:4;22631:12;22662:18;22652:81;;22718:4;22710:6;22706:17;22696:27;;22652:81;22780:2;22772:6;22769:14;22749:18;22746:38;22743:84;;;22799:18;;:::i;:::-;22743:84;22564:269;22513:320;;;:::o;22839:180::-;22887:77;22884:1;22877:88;22984:4;22981:1;22974:15;23008:4;23005:1;22998:15;23025:181;23165:33;23161:1;23153:6;23149:14;23142:57;23025:181;:::o;23212:366::-;23354:3;23375:67;23439:2;23434:3;23375:67;:::i;:::-;23368:74;;23451:93;23540:3;23451:93;:::i;:::-;23569:2;23564:3;23560:12;23553:19;;23212:366;;;:::o;23584:419::-;23750:4;23788:2;23777:9;23773:18;23765:26;;23837:9;23831:4;23827:20;23823:1;23812:9;23808:17;23801:47;23865:131;23991:4;23865:131;:::i;:::-;23857:139;;23584:419;;;:::o;24009:180::-;24149:32;24145:1;24137:6;24133:14;24126:56;24009:180;:::o;24195:366::-;24337:3;24358:67;24422:2;24417:3;24358:67;:::i;:::-;24351:74;;24434:93;24523:3;24434:93;:::i;:::-;24552:2;24547:3;24543:12;24536:19;;24195:366;;;:::o;24567:419::-;24733:4;24771:2;24760:9;24756:18;24748:26;;24820:9;24814:4;24810:20;24806:1;24795:9;24791:17;24784:47;24848:131;24974:4;24848:131;:::i;:::-;24840:139;;24567:419;;;:::o;24992:173::-;25132:25;25128:1;25120:6;25116:14;25109:49;24992:173;:::o;25171:366::-;25313:3;25334:67;25398:2;25393:3;25334:67;:::i;:::-;25327:74;;25410:93;25499:3;25410:93;:::i;:::-;25528:2;25523:3;25519:12;25512:19;;25171:366;;;:::o;25543:419::-;25709:4;25747:2;25736:9;25732:18;25724:26;;25796:9;25790:4;25786:20;25782:1;25771:9;25767:17;25760:47;25824:131;25950:4;25824:131;:::i;:::-;25816:139;;25543:419;;;:::o;25968:180::-;26016:77;26013:1;26006:88;26113:4;26110:1;26103:15;26137:4;26134:1;26127:15;26154:305;26194:3;26213:20;26231:1;26213:20;:::i;:::-;26208:25;;26247:20;26265:1;26247:20;:::i;:::-;26242:25;;26401:1;26333:66;26329:74;26326:1;26323:81;26320:107;;;26407:18;;:::i;:::-;26320:107;26451:1;26448;26444:9;26437:16;;26154:305;;;;:::o;26465:171::-;26605:23;26601:1;26593:6;26589:14;26582:47;26465:171;:::o;26642:366::-;26784:3;26805:67;26869:2;26864:3;26805:67;:::i;:::-;26798:74;;26881:93;26970:3;26881:93;:::i;:::-;26999:2;26994:3;26990:12;26983:19;;26642:366;;;:::o;27014:419::-;27180:4;27218:2;27207:9;27203:18;27195:26;;27267:9;27261:4;27257:20;27253:1;27242:9;27238:17;27231:47;27295:131;27421:4;27295:131;:::i;:::-;27287:139;;27014:419;;;:::o;27439:174::-;27579:26;27575:1;27567:6;27563:14;27556:50;27439:174;:::o;27619:366::-;27761:3;27782:67;27846:2;27841:3;27782:67;:::i;:::-;27775:74;;27858:93;27947:3;27858:93;:::i;:::-;27976:2;27971:3;27967:12;27960:19;;27619:366;;;:::o;27991:419::-;28157:4;28195:2;28184:9;28180:18;28172:26;;28244:9;28238:4;28234:20;28230:1;28219:9;28215:17;28208:47;28272:131;28398:4;28272:131;:::i;:::-;28264:139;;27991:419;;;:::o;28416:170::-;28556:22;28552:1;28544:6;28540:14;28533:46;28416:170;:::o;28592:366::-;28734:3;28755:67;28819:2;28814:3;28755:67;:::i;:::-;28748:74;;28831:93;28920:3;28831:93;:::i;:::-;28949:2;28944:3;28940:12;28933:19;;28592:366;;;:::o;28964:419::-;29130:4;29168:2;29157:9;29153:18;29145:26;;29217:9;29211:4;29207:20;29203:1;29192:9;29188:17;29181:47;29245:131;29371:4;29245:131;:::i;:::-;29237:139;;28964:419;;;:::o;29389:170::-;29529:22;29525:1;29517:6;29513:14;29506:46;29389:170;:::o;29565:366::-;29707:3;29728:67;29792:2;29787:3;29728:67;:::i;:::-;29721:74;;29804:93;29893:3;29804:93;:::i;:::-;29922:2;29917:3;29913:12;29906:19;;29565:366;;;:::o;29937:419::-;30103:4;30141:2;30130:9;30126:18;30118:26;;30190:9;30184:4;30180:20;30176:1;30165:9;30161:17;30154:47;30218:131;30344:4;30218:131;:::i;:::-;30210:139;;29937:419;;;:::o;30362:348::-;30402:7;30425:20;30443:1;30425:20;:::i;:::-;30420:25;;30459:20;30477:1;30459:20;:::i;:::-;30454:25;;30647:1;30579:66;30575:74;30572:1;30569:81;30564:1;30557:9;30550:17;30546:105;30543:131;;;30654:18;;:::i;:::-;30543:131;30702:1;30699;30695:9;30684:20;;30362:348;;;;:::o;30716:169::-;30856:21;30852:1;30844:6;30840:14;30833:45;30716:169;:::o;30891:366::-;31033:3;31054:67;31118:2;31113:3;31054:67;:::i;:::-;31047:74;;31130:93;31219:3;31130:93;:::i;:::-;31248:2;31243:3;31239:12;31232:19;;30891:366;;;:::o;31263:419::-;31429:4;31467:2;31456:9;31452:18;31444:26;;31516:9;31510:4;31506:20;31502:1;31491:9;31487:17;31480:47;31544:131;31670:4;31544:131;:::i;:::-;31536:139;;31263:419;;;:::o;31688:234::-;31828:34;31824:1;31816:6;31812:14;31805:58;31897:17;31892:2;31884:6;31880:15;31873:42;31688:234;:::o;31928:366::-;32070:3;32091:67;32155:2;32150:3;32091:67;:::i;:::-;32084:74;;32167:93;32256:3;32167:93;:::i;:::-;32285:2;32280:3;32276:12;32269:19;;31928:366;;;:::o;32300:419::-;32466:4;32504:2;32493:9;32489:18;32481:26;;32553:9;32547:4;32543:20;32539:1;32528:9;32524:17;32517:47;32581:131;32707:4;32581:131;:::i;:::-;32573:139;;32300:419;;;:::o;32725:148::-;32827:11;32864:3;32849:18;;32725:148;;;;:::o;32879:377::-;32985:3;33013:39;33046:5;33013:39;:::i;:::-;33068:89;33150:6;33145:3;33068:89;:::i;:::-;33061:96;;33166:52;33211:6;33206:3;33199:4;33192:5;33188:16;33166:52;:::i;:::-;33243:6;33238:3;33234:16;33227:23;;32989:267;32879:377;;;;:::o;33262:141::-;33311:4;33334:3;33326:11;;33357:3;33354:1;33347:14;33391:4;33388:1;33378:18;33370:26;;33262:141;;;:::o;33433:845::-;33536:3;33573:5;33567:12;33602:36;33628:9;33602:36;:::i;:::-;33654:89;33736:6;33731:3;33654:89;:::i;:::-;33647:96;;33774:1;33763:9;33759:17;33790:1;33785:137;;;;33936:1;33931:341;;;;33752:520;;33785:137;33869:4;33865:9;33854;33850:25;33845:3;33838:38;33905:6;33900:3;33896:16;33889:23;;33785:137;;33931:341;33998:38;34030:5;33998:38;:::i;:::-;34058:1;34072:154;34086:6;34083:1;34080:13;34072:154;;;34160:7;34154:14;34150:1;34145:3;34141:11;34134:35;34210:1;34201:7;34197:15;34186:26;;34108:4;34105:1;34101:12;34096:17;;34072:154;;;34255:6;34250:3;34246:16;34239:23;;33938:334;;33752:520;;33540:738;;33433:845;;;;:::o;34284:589::-;34509:3;34531:95;34622:3;34613:6;34531:95;:::i;:::-;34524:102;;34643:95;34734:3;34725:6;34643:95;:::i;:::-;34636:102;;34755:92;34843:3;34834:6;34755:92;:::i;:::-;34748:99;;34864:3;34857:10;;34284:589;;;;;;:::o;34879:225::-;35019:34;35015:1;35007:6;35003:14;34996:58;35088:8;35083:2;35075:6;35071:15;35064:33;34879:225;:::o;35110:366::-;35252:3;35273:67;35337:2;35332:3;35273:67;:::i;:::-;35266:74;;35349:93;35438:3;35349:93;:::i;:::-;35467:2;35462:3;35458:12;35451:19;;35110:366;;;:::o;35482:419::-;35648:4;35686:2;35675:9;35671:18;35663:26;;35735:9;35729:4;35725:20;35721:1;35710:9;35706:17;35699:47;35763:131;35889:4;35763:131;:::i;:::-;35755:139;;35482:419;;;:::o;35907:182::-;36047:34;36043:1;36035:6;36031:14;36024:58;35907:182;:::o;36095:366::-;36237:3;36258:67;36322:2;36317:3;36258:67;:::i;:::-;36251:74;;36334:93;36423:3;36334:93;:::i;:::-;36452:2;36447:3;36443:12;36436:19;;36095:366;;;:::o;36467:419::-;36633:4;36671:2;36660:9;36656:18;36648:26;;36720:9;36714:4;36710:20;36706:1;36695:9;36691:17;36684:47;36748:131;36874:4;36748:131;:::i;:::-;36740:139;;36467:419;;;:::o;36892:98::-;36943:6;36977:5;36971:12;36961:22;;36892:98;;;:::o;36996:168::-;37079:11;37113:6;37108:3;37101:19;37153:4;37148:3;37144:14;37129:29;;36996:168;;;;:::o;37170:360::-;37256:3;37284:38;37316:5;37284:38;:::i;:::-;37338:70;37401:6;37396:3;37338:70;:::i;:::-;37331:77;;37417:52;37462:6;37457:3;37450:4;37443:5;37439:16;37417:52;:::i;:::-;37494:29;37516:6;37494:29;:::i;:::-;37489:3;37485:39;37478:46;;37260:270;37170:360;;;;:::o;37536:640::-;37731:4;37769:3;37758:9;37754:19;37746:27;;37783:71;37851:1;37840:9;37836:17;37827:6;37783:71;:::i;:::-;37864:72;37932:2;37921:9;37917:18;37908:6;37864:72;:::i;:::-;37946;38014:2;38003:9;37999:18;37990:6;37946:72;:::i;:::-;38065:9;38059:4;38055:20;38050:2;38039:9;38035:18;38028:48;38093:76;38164:4;38155:6;38093:76;:::i;:::-;38085:84;;37536:640;;;;;;;:::o;38182:141::-;38238:5;38269:6;38263:13;38254:22;;38285:32;38311:5;38285:32;:::i;:::-;38182:141;;;;:::o;38329:349::-;38398:6;38447:2;38435:9;38426:7;38422:23;38418:32;38415:119;;;38453:79;;:::i;:::-;38415:119;38573:1;38598:63;38653:7;38644:6;38633:9;38629:22;38598:63;:::i;:::-;38588:73;;38544:127;38329:349;;;;:::o;38684:233::-;38723:3;38746:24;38764:5;38746:24;:::i;:::-;38737:33;;38792:66;38785:5;38782:77;38779:103;;;38862:18;;:::i;:::-;38779:103;38909:1;38902:5;38898:13;38891:20;;38684:233;;;:::o;38923:180::-;38971:77;38968:1;38961:88;39068:4;39065:1;39058:15;39092:4;39089:1;39082:15;39109:185;39149:1;39166:20;39184:1;39166:20;:::i;:::-;39161:25;;39200:20;39218:1;39200:20;:::i;:::-;39195:25;;39239:1;39229:35;;39244:18;;:::i;:::-;39229:35;39286:1;39283;39279:9;39274:14;;39109:185;;;;:::o;39300:191::-;39340:4;39360:20;39378:1;39360:20;:::i;:::-;39355:25;;39394:20;39412:1;39394:20;:::i;:::-;39389:25;;39433:1;39430;39427:8;39424:34;;;39438:18;;:::i;:::-;39424:34;39483:1;39480;39476:9;39468:17;;39300:191;;;;:::o;39497:176::-;39529:1;39546:20;39564:1;39546:20;:::i;:::-;39541:25;;39580:20;39598:1;39580:20;:::i;:::-;39575:25;;39619:1;39609:35;;39624:18;;:::i;:::-;39609:35;39665:1;39662;39658:9;39653:14;;39497:176;;;;:::o

Swarm Source

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