ETH Price: $3,249.27 (+2.34%)
Gas: 3 Gwei

Token

Hot Box (XHB)
 

Overview

Max Total Supply

697 XHB

Holders

104

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
handlefi.eth
Balance
1 XHB
0xB02aC8d081489395f9f224D6ad1d26FbF7c82F8A
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:
XHB

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: 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: contracts/tt.sol


pragma solidity ^0.8.4;





contract XHB is ERC721A, Ownable{
    using Strings for uint256;
    using SafeMath for uint256;

    string baseURI;
    string public baseExtension = "";
    uint256 public cost = 0.001 ether;
    uint256 public maxSupply = 11110;
    uint256 public maxMintAmount = 10;
    uint256 public maxMintPerAccount = 10;
    bool public paused = false;
    uint256 public revealedTokenId = 0;
    string public notRevealedUri;

    address public creator = 0x44914b4c70247bffecc74a6E1F6A4d98510C06B2;
    address public digitone = 0x6dD5Be03610D26a085D855F6d65e945F2FD7A6ef;
    address public expenseAddress = 0x72AD909ceC36842Cab5538d16d8C9DCE10C600b2;
    address public feeAddress = 0x43734869D8Aa314caa591bE475e6F357f9f4204f;

    constructor() ERC721A("Hot Box", "XHB") {
    }

    function mint(uint256 _count) external payable {
        _mintTo(msg.sender, _count);
    }

    function mintTo(address to, uint _count) external payable {
        _mintTo(to, _count);
    }

    function _mintTo(address _to, uint _count) internal {
        uint256 supply = totalSupply();
        uint256 _balance = balanceOf(_to);
        require(!paused, "mint paused");
        require(_count > 0, "mint amount error");
        require(_count <= maxMintAmount, "out of max mint amount");
        require(supply + _count <= maxSupply, "out of max supply");
        require(_balance + _count <= maxMintPerAccount, "out of max mint per account");

        if (msg.sender != owner()) {
            require(msg.value >= cost * _count, "out of balance");
        }

        _safeMint(_to, _count);
        withdrawFee(msg.value);
    }

    function withdrawFee(uint256 _value) internal {
        uint256 pay = SafeMath.mul(2000, _value);
        pay = SafeMath.div(pay, 10000);
        (bool os, ) = payable(creator).call{value: pay}("");
        require(os, "pay creator fee failed");

        uint256 _left = SafeMath.sub(_value, pay);
        uint256 pay2 = SafeMath.mul(7000, _value);
        pay2 = SafeMath.div(pay2, 10000);
        (bool os1, ) = payable(digitone).call{value: pay2}("");
        require(os1, "pay min fee failed");

        _left = SafeMath.sub(_left, pay2);
        uint256 pay3 = SafeMath.mul(750, _value);
        pay3 = SafeMath.div(pay3, 10000);
        (bool os2, ) = payable(expenseAddress).call{value: pay3}("");
        require(os2, "pay expense failed ");

        _left = SafeMath.sub(_left, pay3);
        (bool os3, ) = payable(feeAddress).call{value: _left}("");
        require(os3, "pay fee failed" );

    }

    function airdrop(address to, uint _count) external payable onlyOwner {
        _safeMint(to, _count);
    }

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

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

        if(tokenId > revealedTokenId) {
            return notRevealedUri;
        }

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

    //only owner
    function setRevealedTokenId(uint256 tokenId) public onlyOwner {
        revealedTokenId = tokenId;
    }

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

    function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
        maxMintAmount = _newmaxMintAmount;
    }

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

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

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

    function setMaxMintPerAccount(uint256 _newMaxMintPerAccount) public onlyOwner {
        maxMintPerAccount = _newMaxMintPerAccount;
    }

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

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

    function balance() public view onlyOwner virtual returns (uint256 ) {
        return address(this).balance;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"digitone","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expenseAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealedTokenId","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintPerAccount","type":"uint256"}],"name":"setMaxMintPerAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"setRevealedTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405260405180602001604052806000815250600a90805190602001906200002b92919062000378565b5066038d7ea4c68000600b55612b66600c55600a600d55600a600e556000600f60006101000a81548160ff02191690831515021790555060006010557344914b4c70247bffecc74a6e1f6a4d98510c06b2601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550736dd5be03610d26a085d855f6d65e945f2fd7a6ef601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507372ad909cec36842cab5538d16d8c9dce10c600b2601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507343734869d8aa314caa591be475e6f357f9f4204f601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620001c857600080fd5b506040518060400160405280600781526020017f486f7420426f78000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f584842000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200024d92919062000378565b5080600390805190602001906200026692919062000378565b5062000277620002a560201b60201c565b60008190555050506200029f62000293620002aa60201b60201c565b620002b260201b60201c565b6200048d565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003869062000428565b90600052602060002090601f016020900481019282620003aa5760008555620003f6565b82601f10620003c557805160ff1916838001178555620003f6565b82800160010185558215620003f6579182015b82811115620003f5578251825591602001919060010190620003d8565b5b50905062000405919062000409565b5090565b5b80821115620004245760008160009055506001016200040a565b5090565b600060028204905060018216806200044157607f821691505b602082108114156200045857620004576200045e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613ffd806200049d6000396000f3fe6080604052600436106102515760003560e01c806355f804b311610139578063a22cb465116100b6578063d5abeb011161007a578063d5abeb0114610846578063da3ef23f14610871578063de788c1d1461089a578063e985e9c5146108c3578063f2c4ce1e14610900578063f2fde38b1461092957610251565b8063a22cb46514610761578063b69ef8a81461078a578063b88d4fde146107b5578063c6682862146107de578063c87b56dd1461080957610251565b80637f00c7a6116100fd5780637f00c7a6146106aa5780638ba4cc3c146106d35780638da5cb5b146106ef57806395d89b411461071a578063a0712d681461074557610251565b806355f804b3146105c55780635c975abb146105ee5780636352211e1461061957806370a0823114610656578063715018a61461069357610251565b8063239c70ae116101d2578063412753581161019657806341275358146104d857806342842e0e14610503578063449a52f81461052c57806344a0d68a1461054857806348c5bdaa146105715780634a90d7b31461059a57610251565b8063239c70ae1461042457806323b872dd1461044f5780633a1c5834146104785780633b53a2a7146104a35780633ccfd60b146104ce57610251565b8063081c8c4411610219578063081c8c441461034f578063095ea7b31461037a57806313faede6146103a357806318160ddd146103ce5780631fad3c27146103f957610251565b806301ffc9a71461025657806302329a291461029357806302d05d3f146102bc57806306fdde03146102e7578063081812fc14610312575b600080fd5b34801561026257600080fd5b5061027d600480360381019061027891906131b7565b610952565b60405161028a919061366d565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b5919061318a565b6109e4565b005b3480156102c857600080fd5b506102d1610a7d565b6040516102de9190613606565b60405180910390f35b3480156102f357600080fd5b506102fc610aa3565b6040516103099190613688565b60405180910390f35b34801561031e57600080fd5b506103396004803603810190610334919061325a565b610b35565b6040516103469190613606565b60405180910390f35b34801561035b57600080fd5b50610364610bb1565b6040516103719190613688565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c919061314a565b610c3f565b005b3480156103af57600080fd5b506103b8610d80565b6040516103c5919061384a565b60405180910390f35b3480156103da57600080fd5b506103e3610d86565b6040516103f0919061384a565b60405180910390f35b34801561040557600080fd5b5061040e610d9d565b60405161041b919061384a565b60405180910390f35b34801561043057600080fd5b50610439610da3565b604051610446919061384a565b60405180910390f35b34801561045b57600080fd5b5061047660048036038101906104719190613034565b610da9565b005b34801561048457600080fd5b5061048d6110ce565b60405161049a919061384a565b60405180910390f35b3480156104af57600080fd5b506104b86110d4565b6040516104c59190613606565b60405180910390f35b6104d66110fa565b005b3480156104e457600080fd5b506104ed6111f6565b6040516104fa9190613606565b60405180910390f35b34801561050f57600080fd5b5061052a60048036038101906105259190613034565b61121c565b005b6105466004803603810190610541919061314a565b61123c565b005b34801561055457600080fd5b5061056f600480360381019061056a919061325a565b61124a565b005b34801561057d57600080fd5b506105986004803603810190610593919061325a565b6112d0565b005b3480156105a657600080fd5b506105af611356565b6040516105bc9190613606565b60405180910390f35b3480156105d157600080fd5b506105ec60048036038101906105e79190613211565b61137c565b005b3480156105fa57600080fd5b50610603611412565b604051610610919061366d565b60405180910390f35b34801561062557600080fd5b50610640600480360381019061063b919061325a565b611425565b60405161064d9190613606565b60405180910390f35b34801561066257600080fd5b5061067d60048036038101906106789190612fc7565b611437565b60405161068a919061384a565b60405180910390f35b34801561069f57600080fd5b506106a86114f0565b005b3480156106b657600080fd5b506106d160048036038101906106cc919061325a565b611578565b005b6106ed60048036038101906106e8919061314a565b6115fe565b005b3480156106fb57600080fd5b50610704611688565b6040516107119190613606565b60405180910390f35b34801561072657600080fd5b5061072f6116b2565b60405161073c9190613688565b60405180910390f35b61075f600480360381019061075a919061325a565b611744565b005b34801561076d57600080fd5b506107886004803603810190610783919061310a565b611751565b005b34801561079657600080fd5b5061079f6118c9565b6040516107ac919061384a565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d79190613087565b61194d565b005b3480156107ea57600080fd5b506107f36119c0565b6040516108009190613688565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b919061325a565b611a4e565b60405161083d9190613688565b60405180910390f35b34801561085257600080fd5b5061085b611b95565b604051610868919061384a565b60405180910390f35b34801561087d57600080fd5b5061089860048036038101906108939190613211565b611b9b565b005b3480156108a657600080fd5b506108c160048036038101906108bc919061325a565b611c31565b005b3480156108cf57600080fd5b506108ea60048036038101906108e59190612ff4565b611cb7565b6040516108f7919061366d565b60405180910390f35b34801561090c57600080fd5b5061092760048036038101906109229190613211565b611d4b565b005b34801561093557600080fd5b50610950600480360381019061094b9190612fc7565b611de1565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ad57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109dd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6109ec611ed9565b73ffffffffffffffffffffffffffffffffffffffff16610a0a611688565b73ffffffffffffffffffffffffffffffffffffffff1614610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a579061378a565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060028054610ab290613b1a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ade90613b1a565b8015610b2b5780601f10610b0057610100808354040283529160200191610b2b565b820191906000526020600020905b815481529060010190602001808311610b0e57829003601f168201915b5050505050905090565b6000610b4082611ee1565b610b76576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60118054610bbe90613b1a565b80601f0160208091040260200160405190810160405280929190818152602001828054610bea90613b1a565b8015610c375780601f10610c0c57610100808354040283529160200191610c37565b820191906000526020600020905b815481529060010190602001808311610c1a57829003601f168201915b505050505081565b6000610c4a82611425565b90508073ffffffffffffffffffffffffffffffffffffffff16610c6b611f40565b73ffffffffffffffffffffffffffffffffffffffff1614610cce57610c9781610c92611f40565b611cb7565b610ccd576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b5481565b6000610d90611f48565b6001546000540303905090565b60105481565b600d5481565b6000610db482611f4d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e1b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610e278461201b565b91509150610e3d8187610e38611f40565b61203d565b610e8957610e5286610e4d611f40565b611cb7565b610e88576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610ef0576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610efd8686866001612081565b8015610f0857600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610fd685610fb2888887612087565b7c0200000000000000000000000000000000000000000000000000000000176120af565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561105e57600060018501905060006004600083815260200190815260200160002054141561105c57600054811461105b578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110c686868660016120da565b505050505050565b600e5481565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611102611ed9565b73ffffffffffffffffffffffffffffffffffffffff16611120611688565b73ffffffffffffffffffffffffffffffffffffffff1614611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d9061378a565b60405180910390fd5b6000611180611688565b73ffffffffffffffffffffffffffffffffffffffff16476040516111a3906135f1565b60006040518083038185875af1925050503d80600081146111e0576040519150601f19603f3d011682016040523d82523d6000602084013e6111e5565b606091505b50509050806111f357600080fd5b50565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6112378383836040518060200160405280600081525061194d565b505050565b61124682826120e0565b5050565b611252611ed9565b73ffffffffffffffffffffffffffffffffffffffff16611270611688565b73ffffffffffffffffffffffffffffffffffffffff16146112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd9061378a565b60405180910390fd5b80600b8190555050565b6112d8611ed9565b73ffffffffffffffffffffffffffffffffffffffff166112f6611688565b73ffffffffffffffffffffffffffffffffffffffff161461134c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113439061378a565b60405180910390fd5b80600e8190555050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611384611ed9565b73ffffffffffffffffffffffffffffffffffffffff166113a2611688565b73ffffffffffffffffffffffffffffffffffffffff16146113f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ef9061378a565b60405180910390fd5b806009908051906020019061140e929190612ddb565b5050565b600f60009054906101000a900460ff1681565b600061143082611f4d565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561149f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6114f8611ed9565b73ffffffffffffffffffffffffffffffffffffffff16611516611688565b73ffffffffffffffffffffffffffffffffffffffff161461156c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115639061378a565b60405180910390fd5b6115766000612315565b565b611580611ed9565b73ffffffffffffffffffffffffffffffffffffffff1661159e611688565b73ffffffffffffffffffffffffffffffffffffffff16146115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb9061378a565b60405180910390fd5b80600d8190555050565b611606611ed9565b73ffffffffffffffffffffffffffffffffffffffff16611624611688565b73ffffffffffffffffffffffffffffffffffffffff161461167a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116719061378a565b60405180910390fd5b61168482826123db565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546116c190613b1a565b80601f01602080910402602001604051908101604052809291908181526020018280546116ed90613b1a565b801561173a5780601f1061170f5761010080835404028352916020019161173a565b820191906000526020600020905b81548152906001019060200180831161171d57829003601f168201915b5050505050905090565b61174e33826120e0565b50565b611759611f40565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117be576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117cb611f40565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611878611f40565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118bd919061366d565b60405180910390a35050565b60006118d3611ed9565b73ffffffffffffffffffffffffffffffffffffffff166118f1611688565b73ffffffffffffffffffffffffffffffffffffffff1614611947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193e9061378a565b60405180910390fd5b47905090565b611958848484610da9565b60008373ffffffffffffffffffffffffffffffffffffffff163b146119ba57611983848484846123f9565b6119b9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a80546119cd90613b1a565b80601f01602080910402602001604051908101604052809291908181526020018280546119f990613b1a565b8015611a465780601f10611a1b57610100808354040283529160200191611a46565b820191906000526020600020905b815481529060010190602001808311611a2957829003601f168201915b505050505081565b6060611a5982611ee1565b611a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8f906137ea565b60405180910390fd5b601054821115611b345760118054611aaf90613b1a565b80601f0160208091040260200160405190810160405280929190818152602001828054611adb90613b1a565b8015611b285780601f10611afd57610100808354040283529160200191611b28565b820191906000526020600020905b815481529060010190602001808311611b0b57829003601f168201915b50505050509050611b90565b6000611b3e612559565b90506000815111611b5e5760405180602001604052806000815250611b8c565b80611b68846125eb565b600a604051602001611b7c939291906135c0565b6040516020818303038152906040525b9150505b919050565b600c5481565b611ba3611ed9565b73ffffffffffffffffffffffffffffffffffffffff16611bc1611688565b73ffffffffffffffffffffffffffffffffffffffff1614611c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0e9061378a565b60405180910390fd5b80600a9080519060200190611c2d929190612ddb565b5050565b611c39611ed9565b73ffffffffffffffffffffffffffffffffffffffff16611c57611688565b73ffffffffffffffffffffffffffffffffffffffff1614611cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca49061378a565b60405180910390fd5b8060108190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d53611ed9565b73ffffffffffffffffffffffffffffffffffffffff16611d71611688565b73ffffffffffffffffffffffffffffffffffffffff1614611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe9061378a565b60405180910390fd5b8060119080519060200190611ddd929190612ddb565b5050565b611de9611ed9565b73ffffffffffffffffffffffffffffffffffffffff16611e07611688565b73ffffffffffffffffffffffffffffffffffffffff1614611e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e549061378a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec4906136ea565b60405180910390fd5b611ed681612315565b50565b600033905090565b600081611eec611f48565b11158015611efb575060005482105b8015611f39575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611f5c611f48565b11611fe457600054811015611fe35760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611fe1575b6000811415611fd7576004600083600190039350838152602001908152602001600020549050611fac565b8092505050612016565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861209e86868461274c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006120ea610d86565b905060006120f784611437565b9050600f60009054906101000a900460ff1615612149576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121409061370a565b60405180910390fd5b6000831161218c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121839061380a565b60405180910390fd5b600d548311156121d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c89061382a565b60405180910390fd5b600c5483836121e0919061394f565b1115612221576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612218906137ca565b60405180910390fd5b600e548382612230919061394f565b1115612271576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612268906136ca565b60405180910390fd5b612279611688565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122fc5782600b546122b991906139d6565b3410156122fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f2906136aa565b60405180910390fd5b5b61230684846123db565b61230f34612755565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123f5828260405180602001604052806000815250612b18565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261241f611f40565b8786866040518563ffffffff1660e01b81526004016124419493929190613621565b602060405180830381600087803b15801561245b57600080fd5b505af192505050801561248c57506040513d601f19601f8201168201806040525081019061248991906131e4565b60015b612506573d80600081146124bc576040519150601f19603f3d011682016040523d82523d6000602084013e6124c1565b606091505b506000815114156124fe576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606009805461256890613b1a565b80601f016020809104026020016040519081016040528092919081815260200182805461259490613b1a565b80156125e15780601f106125b6576101008083540402835291602001916125e1565b820191906000526020600020905b8154815290600101906020018083116125c457829003601f168201915b5050505050905090565b60606000821415612633576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612747565b600082905060005b6000821461266557808061264e90613b7d565b915050600a8261265e91906139a5565b915061263b565b60008167ffffffffffffffff81111561268157612680613cb3565b5b6040519080825280601f01601f1916602001820160405280156126b35781602001600182028036833780820191505090505b5090505b60008514612740576001826126cc9190613a30565b9150600a856126db9190613bc6565b60306126e7919061394f565b60f81b8183815181106126fd576126fc613c84565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561273991906139a5565b94506126b7565b8093505050505b919050565b60009392505050565b60006127636107d083612bb5565b905061277181612710612bcb565b90506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516127bb906135f1565b60006040518083038185875af1925050503d80600081146127f8576040519150601f19603f3d011682016040523d82523d6000602084013e6127fd565b606091505b5050905080612841576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128389061374a565b60405180910390fd5b600061284d8484612be1565b9050600061285d611b5886612bb5565b905061286b81612710612bcb565b90506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516128b5906135f1565b60006040518083038185875af1925050503d80600081146128f2576040519150601f19603f3d011682016040523d82523d6000602084013e6128f7565b606091505b505090508061293b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612932906137aa565b60405180910390fd5b6129458383612be1565b925060006129556102ee88612bb5565b905061296381612710612bcb565b90506000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516129ad906135f1565b60006040518083038185875af1925050503d80600081146129ea576040519150601f19603f3d011682016040523d82523d6000602084013e6129ef565b606091505b5050905080612a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2a9061376a565b60405180910390fd5b612a3d8583612be1565b94506000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1686604051612a87906135f1565b60006040518083038185875af1925050503d8060008114612ac4576040519150601f19603f3d011682016040523d82523d6000602084013e612ac9565b606091505b5050905080612b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b049061372a565b60405180910390fd5b505050505050505050565b612b228383612bf7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612bb057600080549050600083820390505b612b6260008683806001019450866123f9565b612b98576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612b4f578160005414612bad57600080fd5b50505b505050565b60008183612bc391906139d6565b905092915050565b60008183612bd991906139a5565b905092915050565b60008183612bef9190613a30565b905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c64576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612c9f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cac6000848385612081565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612d2383612d146000866000612087565b612d1d85612dcb565b176120af565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612d4757806000819055505050612dc660008483856120da565b505050565b60006001821460e11b9050919050565b828054612de790613b1a565b90600052602060002090601f016020900481019282612e095760008555612e50565b82601f10612e2257805160ff1916838001178555612e50565b82800160010185558215612e50579182015b82811115612e4f578251825591602001919060010190612e34565b5b509050612e5d9190612e61565b5090565b5b80821115612e7a576000816000905550600101612e62565b5090565b6000612e91612e8c8461388a565b613865565b905082815260208101848484011115612ead57612eac613ce7565b5b612eb8848285613ad8565b509392505050565b6000612ed3612ece846138bb565b613865565b905082815260208101848484011115612eef57612eee613ce7565b5b612efa848285613ad8565b509392505050565b600081359050612f1181613f6b565b92915050565b600081359050612f2681613f82565b92915050565b600081359050612f3b81613f99565b92915050565b600081519050612f5081613f99565b92915050565b600082601f830112612f6b57612f6a613ce2565b5b8135612f7b848260208601612e7e565b91505092915050565b600082601f830112612f9957612f98613ce2565b5b8135612fa9848260208601612ec0565b91505092915050565b600081359050612fc181613fb0565b92915050565b600060208284031215612fdd57612fdc613cf1565b5b6000612feb84828501612f02565b91505092915050565b6000806040838503121561300b5761300a613cf1565b5b600061301985828601612f02565b925050602061302a85828601612f02565b9150509250929050565b60008060006060848603121561304d5761304c613cf1565b5b600061305b86828701612f02565b935050602061306c86828701612f02565b925050604061307d86828701612fb2565b9150509250925092565b600080600080608085870312156130a1576130a0613cf1565b5b60006130af87828801612f02565b94505060206130c087828801612f02565b93505060406130d187828801612fb2565b925050606085013567ffffffffffffffff8111156130f2576130f1613cec565b5b6130fe87828801612f56565b91505092959194509250565b6000806040838503121561312157613120613cf1565b5b600061312f85828601612f02565b925050602061314085828601612f17565b9150509250929050565b6000806040838503121561316157613160613cf1565b5b600061316f85828601612f02565b925050602061318085828601612fb2565b9150509250929050565b6000602082840312156131a05761319f613cf1565b5b60006131ae84828501612f17565b91505092915050565b6000602082840312156131cd576131cc613cf1565b5b60006131db84828501612f2c565b91505092915050565b6000602082840312156131fa576131f9613cf1565b5b600061320884828501612f41565b91505092915050565b60006020828403121561322757613226613cf1565b5b600082013567ffffffffffffffff81111561324557613244613cec565b5b61325184828501612f84565b91505092915050565b6000602082840312156132705761326f613cf1565b5b600061327e84828501612fb2565b91505092915050565b61329081613a64565b82525050565b61329f81613a76565b82525050565b60006132b082613901565b6132ba8185613917565b93506132ca818560208601613ae7565b6132d381613cf6565b840191505092915050565b60006132e98261390c565b6132f38185613933565b9350613303818560208601613ae7565b61330c81613cf6565b840191505092915050565b60006133228261390c565b61332c8185613944565b935061333c818560208601613ae7565b80840191505092915050565b6000815461335581613b1a565b61335f8186613944565b9450600182166000811461337a576001811461338b576133be565b60ff198316865281860193506133be565b613394856138ec565b60005b838110156133b657815481890152600182019150602081019050613397565b838801955050505b50505092915050565b60006133d4600e83613933565b91506133df82613d07565b602082019050919050565b60006133f7601b83613933565b915061340282613d30565b602082019050919050565b600061341a602683613933565b915061342582613d59565b604082019050919050565b600061343d600b83613933565b915061344882613da8565b602082019050919050565b6000613460600e83613933565b915061346b82613dd1565b602082019050919050565b6000613483601683613933565b915061348e82613dfa565b602082019050919050565b60006134a6601383613933565b91506134b182613e23565b602082019050919050565b60006134c9602083613933565b91506134d482613e4c565b602082019050919050565b60006134ec601283613933565b91506134f782613e75565b602082019050919050565b600061350f601183613933565b915061351a82613e9e565b602082019050919050565b6000613532602f83613933565b915061353d82613ec7565b604082019050919050565b6000613555601183613933565b915061356082613f16565b602082019050919050565b6000613578600083613928565b915061358382613f3f565b600082019050919050565b600061359b601683613933565b91506135a682613f42565b602082019050919050565b6135ba81613ace565b82525050565b60006135cc8286613317565b91506135d88285613317565b91506135e48284613348565b9150819050949350505050565b60006135fc8261356b565b9150819050919050565b600060208201905061361b6000830184613287565b92915050565b60006080820190506136366000830187613287565b6136436020830186613287565b61365060408301856135b1565b818103606083015261366281846132a5565b905095945050505050565b60006020820190506136826000830184613296565b92915050565b600060208201905081810360008301526136a281846132de565b905092915050565b600060208201905081810360008301526136c3816133c7565b9050919050565b600060208201905081810360008301526136e3816133ea565b9050919050565b600060208201905081810360008301526137038161340d565b9050919050565b6000602082019050818103600083015261372381613430565b9050919050565b6000602082019050818103600083015261374381613453565b9050919050565b6000602082019050818103600083015261376381613476565b9050919050565b6000602082019050818103600083015261378381613499565b9050919050565b600060208201905081810360008301526137a3816134bc565b9050919050565b600060208201905081810360008301526137c3816134df565b9050919050565b600060208201905081810360008301526137e381613502565b9050919050565b6000602082019050818103600083015261380381613525565b9050919050565b6000602082019050818103600083015261382381613548565b9050919050565b600060208201905081810360008301526138438161358e565b9050919050565b600060208201905061385f60008301846135b1565b92915050565b600061386f613880565b905061387b8282613b4c565b919050565b6000604051905090565b600067ffffffffffffffff8211156138a5576138a4613cb3565b5b6138ae82613cf6565b9050602081019050919050565b600067ffffffffffffffff8211156138d6576138d5613cb3565b5b6138df82613cf6565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061395a82613ace565b915061396583613ace565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561399a57613999613bf7565b5b828201905092915050565b60006139b082613ace565b91506139bb83613ace565b9250826139cb576139ca613c26565b5b828204905092915050565b60006139e182613ace565b91506139ec83613ace565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2557613a24613bf7565b5b828202905092915050565b6000613a3b82613ace565b9150613a4683613ace565b925082821015613a5957613a58613bf7565b5b828203905092915050565b6000613a6f82613aae565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b05578082015181840152602081019050613aea565b83811115613b14576000848401525b50505050565b60006002820490506001821680613b3257607f821691505b60208210811415613b4657613b45613c55565b5b50919050565b613b5582613cf6565b810181811067ffffffffffffffff82111715613b7457613b73613cb3565b5b80604052505050565b6000613b8882613ace565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bbb57613bba613bf7565b5b600182019050919050565b6000613bd182613ace565b9150613bdc83613ace565b925082613bec57613beb613c26565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f6f7574206f662062616c616e6365000000000000000000000000000000000000600082015250565b7f6f7574206f66206d6178206d696e7420706572206163636f756e740000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6d696e7420706175736564000000000000000000000000000000000000000000600082015250565b7f70617920666565206661696c6564000000000000000000000000000000000000600082015250565b7f7061792063726561746f7220666565206661696c656400000000000000000000600082015250565b7f70617920657870656e7365206661696c65642000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f706179206d696e20666565206661696c65640000000000000000000000000000600082015250565b7f6f7574206f66206d617820737570706c79000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f6d696e7420616d6f756e74206572726f72000000000000000000000000000000600082015250565b50565b7f6f7574206f66206d6178206d696e7420616d6f756e7400000000000000000000600082015250565b613f7481613a64565b8114613f7f57600080fd5b50565b613f8b81613a76565b8114613f9657600080fd5b50565b613fa281613a82565b8114613fad57600080fd5b50565b613fb981613ace565b8114613fc457600080fd5b5056fea264697066735822122033ab8477962e2755ceb31e498c89c74db9b7c9694e8cbb5ee5c39967a013c7aa64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102515760003560e01c806355f804b311610139578063a22cb465116100b6578063d5abeb011161007a578063d5abeb0114610846578063da3ef23f14610871578063de788c1d1461089a578063e985e9c5146108c3578063f2c4ce1e14610900578063f2fde38b1461092957610251565b8063a22cb46514610761578063b69ef8a81461078a578063b88d4fde146107b5578063c6682862146107de578063c87b56dd1461080957610251565b80637f00c7a6116100fd5780637f00c7a6146106aa5780638ba4cc3c146106d35780638da5cb5b146106ef57806395d89b411461071a578063a0712d681461074557610251565b806355f804b3146105c55780635c975abb146105ee5780636352211e1461061957806370a0823114610656578063715018a61461069357610251565b8063239c70ae116101d2578063412753581161019657806341275358146104d857806342842e0e14610503578063449a52f81461052c57806344a0d68a1461054857806348c5bdaa146105715780634a90d7b31461059a57610251565b8063239c70ae1461042457806323b872dd1461044f5780633a1c5834146104785780633b53a2a7146104a35780633ccfd60b146104ce57610251565b8063081c8c4411610219578063081c8c441461034f578063095ea7b31461037a57806313faede6146103a357806318160ddd146103ce5780631fad3c27146103f957610251565b806301ffc9a71461025657806302329a291461029357806302d05d3f146102bc57806306fdde03146102e7578063081812fc14610312575b600080fd5b34801561026257600080fd5b5061027d600480360381019061027891906131b7565b610952565b60405161028a919061366d565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b5919061318a565b6109e4565b005b3480156102c857600080fd5b506102d1610a7d565b6040516102de9190613606565b60405180910390f35b3480156102f357600080fd5b506102fc610aa3565b6040516103099190613688565b60405180910390f35b34801561031e57600080fd5b506103396004803603810190610334919061325a565b610b35565b6040516103469190613606565b60405180910390f35b34801561035b57600080fd5b50610364610bb1565b6040516103719190613688565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c919061314a565b610c3f565b005b3480156103af57600080fd5b506103b8610d80565b6040516103c5919061384a565b60405180910390f35b3480156103da57600080fd5b506103e3610d86565b6040516103f0919061384a565b60405180910390f35b34801561040557600080fd5b5061040e610d9d565b60405161041b919061384a565b60405180910390f35b34801561043057600080fd5b50610439610da3565b604051610446919061384a565b60405180910390f35b34801561045b57600080fd5b5061047660048036038101906104719190613034565b610da9565b005b34801561048457600080fd5b5061048d6110ce565b60405161049a919061384a565b60405180910390f35b3480156104af57600080fd5b506104b86110d4565b6040516104c59190613606565b60405180910390f35b6104d66110fa565b005b3480156104e457600080fd5b506104ed6111f6565b6040516104fa9190613606565b60405180910390f35b34801561050f57600080fd5b5061052a60048036038101906105259190613034565b61121c565b005b6105466004803603810190610541919061314a565b61123c565b005b34801561055457600080fd5b5061056f600480360381019061056a919061325a565b61124a565b005b34801561057d57600080fd5b506105986004803603810190610593919061325a565b6112d0565b005b3480156105a657600080fd5b506105af611356565b6040516105bc9190613606565b60405180910390f35b3480156105d157600080fd5b506105ec60048036038101906105e79190613211565b61137c565b005b3480156105fa57600080fd5b50610603611412565b604051610610919061366d565b60405180910390f35b34801561062557600080fd5b50610640600480360381019061063b919061325a565b611425565b60405161064d9190613606565b60405180910390f35b34801561066257600080fd5b5061067d60048036038101906106789190612fc7565b611437565b60405161068a919061384a565b60405180910390f35b34801561069f57600080fd5b506106a86114f0565b005b3480156106b657600080fd5b506106d160048036038101906106cc919061325a565b611578565b005b6106ed60048036038101906106e8919061314a565b6115fe565b005b3480156106fb57600080fd5b50610704611688565b6040516107119190613606565b60405180910390f35b34801561072657600080fd5b5061072f6116b2565b60405161073c9190613688565b60405180910390f35b61075f600480360381019061075a919061325a565b611744565b005b34801561076d57600080fd5b506107886004803603810190610783919061310a565b611751565b005b34801561079657600080fd5b5061079f6118c9565b6040516107ac919061384a565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d79190613087565b61194d565b005b3480156107ea57600080fd5b506107f36119c0565b6040516108009190613688565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b919061325a565b611a4e565b60405161083d9190613688565b60405180910390f35b34801561085257600080fd5b5061085b611b95565b604051610868919061384a565b60405180910390f35b34801561087d57600080fd5b5061089860048036038101906108939190613211565b611b9b565b005b3480156108a657600080fd5b506108c160048036038101906108bc919061325a565b611c31565b005b3480156108cf57600080fd5b506108ea60048036038101906108e59190612ff4565b611cb7565b6040516108f7919061366d565b60405180910390f35b34801561090c57600080fd5b5061092760048036038101906109229190613211565b611d4b565b005b34801561093557600080fd5b50610950600480360381019061094b9190612fc7565b611de1565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ad57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109dd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6109ec611ed9565b73ffffffffffffffffffffffffffffffffffffffff16610a0a611688565b73ffffffffffffffffffffffffffffffffffffffff1614610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a579061378a565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060028054610ab290613b1a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ade90613b1a565b8015610b2b5780601f10610b0057610100808354040283529160200191610b2b565b820191906000526020600020905b815481529060010190602001808311610b0e57829003601f168201915b5050505050905090565b6000610b4082611ee1565b610b76576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60118054610bbe90613b1a565b80601f0160208091040260200160405190810160405280929190818152602001828054610bea90613b1a565b8015610c375780601f10610c0c57610100808354040283529160200191610c37565b820191906000526020600020905b815481529060010190602001808311610c1a57829003601f168201915b505050505081565b6000610c4a82611425565b90508073ffffffffffffffffffffffffffffffffffffffff16610c6b611f40565b73ffffffffffffffffffffffffffffffffffffffff1614610cce57610c9781610c92611f40565b611cb7565b610ccd576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b5481565b6000610d90611f48565b6001546000540303905090565b60105481565b600d5481565b6000610db482611f4d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e1b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610e278461201b565b91509150610e3d8187610e38611f40565b61203d565b610e8957610e5286610e4d611f40565b611cb7565b610e88576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610ef0576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610efd8686866001612081565b8015610f0857600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610fd685610fb2888887612087565b7c0200000000000000000000000000000000000000000000000000000000176120af565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561105e57600060018501905060006004600083815260200190815260200160002054141561105c57600054811461105b578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110c686868660016120da565b505050505050565b600e5481565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611102611ed9565b73ffffffffffffffffffffffffffffffffffffffff16611120611688565b73ffffffffffffffffffffffffffffffffffffffff1614611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d9061378a565b60405180910390fd5b6000611180611688565b73ffffffffffffffffffffffffffffffffffffffff16476040516111a3906135f1565b60006040518083038185875af1925050503d80600081146111e0576040519150601f19603f3d011682016040523d82523d6000602084013e6111e5565b606091505b50509050806111f357600080fd5b50565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6112378383836040518060200160405280600081525061194d565b505050565b61124682826120e0565b5050565b611252611ed9565b73ffffffffffffffffffffffffffffffffffffffff16611270611688565b73ffffffffffffffffffffffffffffffffffffffff16146112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd9061378a565b60405180910390fd5b80600b8190555050565b6112d8611ed9565b73ffffffffffffffffffffffffffffffffffffffff166112f6611688565b73ffffffffffffffffffffffffffffffffffffffff161461134c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113439061378a565b60405180910390fd5b80600e8190555050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611384611ed9565b73ffffffffffffffffffffffffffffffffffffffff166113a2611688565b73ffffffffffffffffffffffffffffffffffffffff16146113f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ef9061378a565b60405180910390fd5b806009908051906020019061140e929190612ddb565b5050565b600f60009054906101000a900460ff1681565b600061143082611f4d565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561149f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6114f8611ed9565b73ffffffffffffffffffffffffffffffffffffffff16611516611688565b73ffffffffffffffffffffffffffffffffffffffff161461156c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115639061378a565b60405180910390fd5b6115766000612315565b565b611580611ed9565b73ffffffffffffffffffffffffffffffffffffffff1661159e611688565b73ffffffffffffffffffffffffffffffffffffffff16146115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb9061378a565b60405180910390fd5b80600d8190555050565b611606611ed9565b73ffffffffffffffffffffffffffffffffffffffff16611624611688565b73ffffffffffffffffffffffffffffffffffffffff161461167a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116719061378a565b60405180910390fd5b61168482826123db565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546116c190613b1a565b80601f01602080910402602001604051908101604052809291908181526020018280546116ed90613b1a565b801561173a5780601f1061170f5761010080835404028352916020019161173a565b820191906000526020600020905b81548152906001019060200180831161171d57829003601f168201915b5050505050905090565b61174e33826120e0565b50565b611759611f40565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117be576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117cb611f40565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611878611f40565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118bd919061366d565b60405180910390a35050565b60006118d3611ed9565b73ffffffffffffffffffffffffffffffffffffffff166118f1611688565b73ffffffffffffffffffffffffffffffffffffffff1614611947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193e9061378a565b60405180910390fd5b47905090565b611958848484610da9565b60008373ffffffffffffffffffffffffffffffffffffffff163b146119ba57611983848484846123f9565b6119b9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a80546119cd90613b1a565b80601f01602080910402602001604051908101604052809291908181526020018280546119f990613b1a565b8015611a465780601f10611a1b57610100808354040283529160200191611a46565b820191906000526020600020905b815481529060010190602001808311611a2957829003601f168201915b505050505081565b6060611a5982611ee1565b611a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8f906137ea565b60405180910390fd5b601054821115611b345760118054611aaf90613b1a565b80601f0160208091040260200160405190810160405280929190818152602001828054611adb90613b1a565b8015611b285780601f10611afd57610100808354040283529160200191611b28565b820191906000526020600020905b815481529060010190602001808311611b0b57829003601f168201915b50505050509050611b90565b6000611b3e612559565b90506000815111611b5e5760405180602001604052806000815250611b8c565b80611b68846125eb565b600a604051602001611b7c939291906135c0565b6040516020818303038152906040525b9150505b919050565b600c5481565b611ba3611ed9565b73ffffffffffffffffffffffffffffffffffffffff16611bc1611688565b73ffffffffffffffffffffffffffffffffffffffff1614611c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0e9061378a565b60405180910390fd5b80600a9080519060200190611c2d929190612ddb565b5050565b611c39611ed9565b73ffffffffffffffffffffffffffffffffffffffff16611c57611688565b73ffffffffffffffffffffffffffffffffffffffff1614611cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca49061378a565b60405180910390fd5b8060108190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d53611ed9565b73ffffffffffffffffffffffffffffffffffffffff16611d71611688565b73ffffffffffffffffffffffffffffffffffffffff1614611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe9061378a565b60405180910390fd5b8060119080519060200190611ddd929190612ddb565b5050565b611de9611ed9565b73ffffffffffffffffffffffffffffffffffffffff16611e07611688565b73ffffffffffffffffffffffffffffffffffffffff1614611e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e549061378a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec4906136ea565b60405180910390fd5b611ed681612315565b50565b600033905090565b600081611eec611f48565b11158015611efb575060005482105b8015611f39575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611f5c611f48565b11611fe457600054811015611fe35760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611fe1575b6000811415611fd7576004600083600190039350838152602001908152602001600020549050611fac565b8092505050612016565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861209e86868461274c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006120ea610d86565b905060006120f784611437565b9050600f60009054906101000a900460ff1615612149576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121409061370a565b60405180910390fd5b6000831161218c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121839061380a565b60405180910390fd5b600d548311156121d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c89061382a565b60405180910390fd5b600c5483836121e0919061394f565b1115612221576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612218906137ca565b60405180910390fd5b600e548382612230919061394f565b1115612271576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612268906136ca565b60405180910390fd5b612279611688565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122fc5782600b546122b991906139d6565b3410156122fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f2906136aa565b60405180910390fd5b5b61230684846123db565b61230f34612755565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123f5828260405180602001604052806000815250612b18565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261241f611f40565b8786866040518563ffffffff1660e01b81526004016124419493929190613621565b602060405180830381600087803b15801561245b57600080fd5b505af192505050801561248c57506040513d601f19601f8201168201806040525081019061248991906131e4565b60015b612506573d80600081146124bc576040519150601f19603f3d011682016040523d82523d6000602084013e6124c1565b606091505b506000815114156124fe576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606009805461256890613b1a565b80601f016020809104026020016040519081016040528092919081815260200182805461259490613b1a565b80156125e15780601f106125b6576101008083540402835291602001916125e1565b820191906000526020600020905b8154815290600101906020018083116125c457829003601f168201915b5050505050905090565b60606000821415612633576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612747565b600082905060005b6000821461266557808061264e90613b7d565b915050600a8261265e91906139a5565b915061263b565b60008167ffffffffffffffff81111561268157612680613cb3565b5b6040519080825280601f01601f1916602001820160405280156126b35781602001600182028036833780820191505090505b5090505b60008514612740576001826126cc9190613a30565b9150600a856126db9190613bc6565b60306126e7919061394f565b60f81b8183815181106126fd576126fc613c84565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561273991906139a5565b94506126b7565b8093505050505b919050565b60009392505050565b60006127636107d083612bb5565b905061277181612710612bcb565b90506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516127bb906135f1565b60006040518083038185875af1925050503d80600081146127f8576040519150601f19603f3d011682016040523d82523d6000602084013e6127fd565b606091505b5050905080612841576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128389061374a565b60405180910390fd5b600061284d8484612be1565b9050600061285d611b5886612bb5565b905061286b81612710612bcb565b90506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516128b5906135f1565b60006040518083038185875af1925050503d80600081146128f2576040519150601f19603f3d011682016040523d82523d6000602084013e6128f7565b606091505b505090508061293b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612932906137aa565b60405180910390fd5b6129458383612be1565b925060006129556102ee88612bb5565b905061296381612710612bcb565b90506000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516129ad906135f1565b60006040518083038185875af1925050503d80600081146129ea576040519150601f19603f3d011682016040523d82523d6000602084013e6129ef565b606091505b5050905080612a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2a9061376a565b60405180910390fd5b612a3d8583612be1565b94506000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1686604051612a87906135f1565b60006040518083038185875af1925050503d8060008114612ac4576040519150601f19603f3d011682016040523d82523d6000602084013e612ac9565b606091505b5050905080612b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b049061372a565b60405180910390fd5b505050505050505050565b612b228383612bf7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612bb057600080549050600083820390505b612b6260008683806001019450866123f9565b612b98576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612b4f578160005414612bad57600080fd5b50505b505050565b60008183612bc391906139d6565b905092915050565b60008183612bd991906139a5565b905092915050565b60008183612bef9190613a30565b905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c64576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612c9f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cac6000848385612081565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612d2383612d146000866000612087565b612d1d85612dcb565b176120af565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612d4757806000819055505050612dc660008483856120da565b505050565b60006001821460e11b9050919050565b828054612de790613b1a565b90600052602060002090601f016020900481019282612e095760008555612e50565b82601f10612e2257805160ff1916838001178555612e50565b82800160010185558215612e50579182015b82811115612e4f578251825591602001919060010190612e34565b5b509050612e5d9190612e61565b5090565b5b80821115612e7a576000816000905550600101612e62565b5090565b6000612e91612e8c8461388a565b613865565b905082815260208101848484011115612ead57612eac613ce7565b5b612eb8848285613ad8565b509392505050565b6000612ed3612ece846138bb565b613865565b905082815260208101848484011115612eef57612eee613ce7565b5b612efa848285613ad8565b509392505050565b600081359050612f1181613f6b565b92915050565b600081359050612f2681613f82565b92915050565b600081359050612f3b81613f99565b92915050565b600081519050612f5081613f99565b92915050565b600082601f830112612f6b57612f6a613ce2565b5b8135612f7b848260208601612e7e565b91505092915050565b600082601f830112612f9957612f98613ce2565b5b8135612fa9848260208601612ec0565b91505092915050565b600081359050612fc181613fb0565b92915050565b600060208284031215612fdd57612fdc613cf1565b5b6000612feb84828501612f02565b91505092915050565b6000806040838503121561300b5761300a613cf1565b5b600061301985828601612f02565b925050602061302a85828601612f02565b9150509250929050565b60008060006060848603121561304d5761304c613cf1565b5b600061305b86828701612f02565b935050602061306c86828701612f02565b925050604061307d86828701612fb2565b9150509250925092565b600080600080608085870312156130a1576130a0613cf1565b5b60006130af87828801612f02565b94505060206130c087828801612f02565b93505060406130d187828801612fb2565b925050606085013567ffffffffffffffff8111156130f2576130f1613cec565b5b6130fe87828801612f56565b91505092959194509250565b6000806040838503121561312157613120613cf1565b5b600061312f85828601612f02565b925050602061314085828601612f17565b9150509250929050565b6000806040838503121561316157613160613cf1565b5b600061316f85828601612f02565b925050602061318085828601612fb2565b9150509250929050565b6000602082840312156131a05761319f613cf1565b5b60006131ae84828501612f17565b91505092915050565b6000602082840312156131cd576131cc613cf1565b5b60006131db84828501612f2c565b91505092915050565b6000602082840312156131fa576131f9613cf1565b5b600061320884828501612f41565b91505092915050565b60006020828403121561322757613226613cf1565b5b600082013567ffffffffffffffff81111561324557613244613cec565b5b61325184828501612f84565b91505092915050565b6000602082840312156132705761326f613cf1565b5b600061327e84828501612fb2565b91505092915050565b61329081613a64565b82525050565b61329f81613a76565b82525050565b60006132b082613901565b6132ba8185613917565b93506132ca818560208601613ae7565b6132d381613cf6565b840191505092915050565b60006132e98261390c565b6132f38185613933565b9350613303818560208601613ae7565b61330c81613cf6565b840191505092915050565b60006133228261390c565b61332c8185613944565b935061333c818560208601613ae7565b80840191505092915050565b6000815461335581613b1a565b61335f8186613944565b9450600182166000811461337a576001811461338b576133be565b60ff198316865281860193506133be565b613394856138ec565b60005b838110156133b657815481890152600182019150602081019050613397565b838801955050505b50505092915050565b60006133d4600e83613933565b91506133df82613d07565b602082019050919050565b60006133f7601b83613933565b915061340282613d30565b602082019050919050565b600061341a602683613933565b915061342582613d59565b604082019050919050565b600061343d600b83613933565b915061344882613da8565b602082019050919050565b6000613460600e83613933565b915061346b82613dd1565b602082019050919050565b6000613483601683613933565b915061348e82613dfa565b602082019050919050565b60006134a6601383613933565b91506134b182613e23565b602082019050919050565b60006134c9602083613933565b91506134d482613e4c565b602082019050919050565b60006134ec601283613933565b91506134f782613e75565b602082019050919050565b600061350f601183613933565b915061351a82613e9e565b602082019050919050565b6000613532602f83613933565b915061353d82613ec7565b604082019050919050565b6000613555601183613933565b915061356082613f16565b602082019050919050565b6000613578600083613928565b915061358382613f3f565b600082019050919050565b600061359b601683613933565b91506135a682613f42565b602082019050919050565b6135ba81613ace565b82525050565b60006135cc8286613317565b91506135d88285613317565b91506135e48284613348565b9150819050949350505050565b60006135fc8261356b565b9150819050919050565b600060208201905061361b6000830184613287565b92915050565b60006080820190506136366000830187613287565b6136436020830186613287565b61365060408301856135b1565b818103606083015261366281846132a5565b905095945050505050565b60006020820190506136826000830184613296565b92915050565b600060208201905081810360008301526136a281846132de565b905092915050565b600060208201905081810360008301526136c3816133c7565b9050919050565b600060208201905081810360008301526136e3816133ea565b9050919050565b600060208201905081810360008301526137038161340d565b9050919050565b6000602082019050818103600083015261372381613430565b9050919050565b6000602082019050818103600083015261374381613453565b9050919050565b6000602082019050818103600083015261376381613476565b9050919050565b6000602082019050818103600083015261378381613499565b9050919050565b600060208201905081810360008301526137a3816134bc565b9050919050565b600060208201905081810360008301526137c3816134df565b9050919050565b600060208201905081810360008301526137e381613502565b9050919050565b6000602082019050818103600083015261380381613525565b9050919050565b6000602082019050818103600083015261382381613548565b9050919050565b600060208201905081810360008301526138438161358e565b9050919050565b600060208201905061385f60008301846135b1565b92915050565b600061386f613880565b905061387b8282613b4c565b919050565b6000604051905090565b600067ffffffffffffffff8211156138a5576138a4613cb3565b5b6138ae82613cf6565b9050602081019050919050565b600067ffffffffffffffff8211156138d6576138d5613cb3565b5b6138df82613cf6565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061395a82613ace565b915061396583613ace565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561399a57613999613bf7565b5b828201905092915050565b60006139b082613ace565b91506139bb83613ace565b9250826139cb576139ca613c26565b5b828204905092915050565b60006139e182613ace565b91506139ec83613ace565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2557613a24613bf7565b5b828202905092915050565b6000613a3b82613ace565b9150613a4683613ace565b925082821015613a5957613a58613bf7565b5b828203905092915050565b6000613a6f82613aae565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b05578082015181840152602081019050613aea565b83811115613b14576000848401525b50505050565b60006002820490506001821680613b3257607f821691505b60208210811415613b4657613b45613c55565b5b50919050565b613b5582613cf6565b810181811067ffffffffffffffff82111715613b7457613b73613cb3565b5b80604052505050565b6000613b8882613ace565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bbb57613bba613bf7565b5b600182019050919050565b6000613bd182613ace565b9150613bdc83613ace565b925082613bec57613beb613c26565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f6f7574206f662062616c616e6365000000000000000000000000000000000000600082015250565b7f6f7574206f66206d6178206d696e7420706572206163636f756e740000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6d696e7420706175736564000000000000000000000000000000000000000000600082015250565b7f70617920666565206661696c6564000000000000000000000000000000000000600082015250565b7f7061792063726561746f7220666565206661696c656400000000000000000000600082015250565b7f70617920657870656e7365206661696c65642000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f706179206d696e20666565206661696c65640000000000000000000000000000600082015250565b7f6f7574206f66206d617820737570706c79000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f6d696e7420616d6f756e74206572726f72000000000000000000000000000000600082015250565b50565b7f6f7574206f66206d6178206d696e7420616d6f756e7400000000000000000000600082015250565b613f7481613a64565b8114613f7f57600080fd5b50565b613f8b81613a76565b8114613f9657600080fd5b50565b613fa281613a82565b8114613fad57600080fd5b50565b613fb981613ace565b8114613fc457600080fd5b5056fea264697066735822122033ab8477962e2755ceb31e498c89c74db9b7c9694e8cbb5ee5c39967a013c7aa64736f6c63430008070033

Deployed Bytecode Sourcemap

57411:4663:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27213:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61706:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57851:67;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32860:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34806:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57814:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34354:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57577:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26267:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57773:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57656:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44071:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57696:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57925:68;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61793:155;;;:::i;:::-;;58081:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35696:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58317:96;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60954:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61560:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58000:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61312:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57740:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32649:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27892:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11804:103;;;;;;;;;;;;;:::i;:::-;;61048:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60019:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11153:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33029:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58216:93;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35082:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61956:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35952:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57538:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60269:545;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57617:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61424:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60840:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35461:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61178:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12062:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27213:615;27298:4;27613:10;27598:25;;:11;:25;;;;:102;;;;27690:10;27675:25;;:11;:25;;;;27598:102;:179;;;;27767:10;27752:25;;:11;:25;;;;27598:179;27578:199;;27213:615;;;:::o;61706:79::-;11384:12;:10;:12::i;:::-;11373:23;;:7;:5;:7::i;:::-;:23;;;11365:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61771:6:::1;61762;;:15;;;;;;;;;;;;;;;;;;61706:79:::0;:::o;57851:67::-;;;;;;;;;;;;;:::o;32860:100::-;32914:13;32947:5;32940:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32860:100;:::o;34806:204::-;34874:7;34899:16;34907:7;34899;:16::i;:::-;34894:64;;34924:34;;;;;;;;;;;;;;34894:64;34978:15;:24;34994:7;34978:24;;;;;;;;;;;;;;;;;;;;;34971:31;;34806:204;;;:::o;57814:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34354:386::-;34427:13;34443:16;34451:7;34443;:16::i;:::-;34427:32;;34499:5;34476:28;;:19;:17;:19::i;:::-;:28;;;34472:175;;34524:44;34541:5;34548:19;:17;:19::i;:::-;34524:16;:44::i;:::-;34519:128;;34596:35;;;;;;;;;;;;;;34519:128;34472:175;34686:2;34659:15;:24;34675:7;34659:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34724:7;34720:2;34704:28;;34713:5;34704:28;;;;;;;;;;;;34416:324;34354:386;;:::o;57577:33::-;;;;:::o;26267:315::-;26320:7;26548:15;:13;:15::i;:::-;26533:12;;26517:13;;:28;:46;26510:53;;26267:315;:::o;57773:34::-;;;;:::o;57656:33::-;;;;:::o;44071:2800::-;44205:27;44235;44254:7;44235:18;:27::i;:::-;44205:57;;44320:4;44279:45;;44295:19;44279:45;;;44275:86;;44333:28;;;;;;;;;;;;;;44275:86;44375:27;44404:23;44431:28;44451:7;44431:19;:28::i;:::-;44374:85;;;;44559:62;44578:15;44595:4;44601:19;:17;:19::i;:::-;44559:18;:62::i;:::-;44554:174;;44641:43;44658:4;44664:19;:17;:19::i;:::-;44641:16;:43::i;:::-;44636:92;;44693:35;;;;;;;;;;;;;;44636:92;44554:174;44759:1;44745:16;;:2;:16;;;44741:52;;;44770:23;;;;;;;;;;;;;;44741:52;44806:43;44828:4;44834:2;44838:7;44847:1;44806:21;:43::i;:::-;44942:15;44939:160;;;45082:1;45061:19;45054:30;44939:160;45477:18;:24;45496:4;45477:24;;;;;;;;;;;;;;;;45475:26;;;;;;;;;;;;45546:18;:22;45565:2;45546:22;;;;;;;;;;;;;;;;45544:24;;;;;;;;;;;45868:145;45905:2;45953:45;45968:4;45974:2;45978:19;45953:14;:45::i;:::-;23495:8;45926:72;45868:18;:145::i;:::-;45839:17;:26;45857:7;45839:26;;;;;;;;;;;:174;;;;46183:1;23495:8;46133:19;:46;:51;46129:626;;;46205:19;46237:1;46227:7;:11;46205:33;;46394:1;46360:17;:30;46378:11;46360:30;;;;;;;;;;;;:35;46356:384;;;46498:13;;46483:11;:28;46479:242;;46678:19;46645:17;:30;46663:11;46645:30;;;;;;;;;;;:52;;;;46479:242;46356:384;46186:569;46129:626;46802:7;46798:2;46783:27;;46792:4;46783:27;;;;;;;;;;;;46821:42;46842:4;46848:2;46852:7;46861:1;46821:20;:42::i;:::-;44194:2677;;;44071:2800;;;:::o;57696:37::-;;;;:::o;57925:68::-;;;;;;;;;;;;;:::o;61793:155::-;11384:12;:10;:12::i;:::-;11373:23;;:7;:5;:7::i;:::-;:23;;;11365:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61850:7:::1;61871;:5;:7::i;:::-;61863:21;;61892;61863:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61849:69;;;61937:2;61929:11;;;::::0;::::1;;61838:110;61793:155::o:0;58081:70::-;;;;;;;;;;;;;:::o;35696:185::-;35834:39;35851:4;35857:2;35861:7;35834:39;;;;;;;;;;;;:16;:39::i;:::-;35696:185;;;:::o;58317:96::-;58386:19;58394:2;58398:6;58386:7;:19::i;:::-;58317:96;;:::o;60954:86::-;11384:12;:10;:12::i;:::-;11373:23;;:7;:5;:7::i;:::-;:23;;;11365:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61024:8:::1;61017:4;:15;;;;60954:86:::0;:::o;61560:138::-;11384:12;:10;:12::i;:::-;11373:23;;:7;:5;:7::i;:::-;:23;;;11365:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61669:21:::1;61649:17;:41;;;;61560:138:::0;:::o;58000:74::-;;;;;;;;;;;;;:::o;61312:104::-;11384:12;:10;:12::i;:::-;11373:23;;:7;:5;:7::i;:::-;:23;;;11365:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61397:11:::1;61387:7;:21;;;;;;;;;;;;:::i;:::-;;61312:104:::0;:::o;57740:26::-;;;;;;;;;;;;;:::o;32649:144::-;32713:7;32756:27;32775:7;32756:18;:27::i;:::-;32733:52;;32649:144;;;:::o;27892:224::-;27956:7;27997:1;27980:19;;:5;:19;;;27976:60;;;28008:28;;;;;;;;;;;;;;27976:60;22447:13;28054:18;:25;28073:5;28054:25;;;;;;;;;;;;;;;;:54;28047:61;;27892:224;;;:::o;11804:103::-;11384:12;:10;:12::i;:::-;11373:23;;:7;:5;:7::i;:::-;:23;;;11365:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11869:30:::1;11896:1;11869:18;:30::i;:::-;11804:103::o:0;61048:122::-;11384:12;:10;:12::i;:::-;11373:23;;:7;:5;:7::i;:::-;:23;;;11365:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61145:17:::1;61129:13;:33;;;;61048:122:::0;:::o;60019:109::-;11384:12;:10;:12::i;:::-;11373:23;;:7;:5;:7::i;:::-;:23;;;11365:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60099:21:::1;60109:2;60113:6;60099:9;:21::i;:::-;60019:109:::0;;:::o;11153:87::-;11199:7;11226:6;;;;;;;;;;;11219:13;;11153:87;:::o;33029:104::-;33085:13;33118:7;33111:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33029:104;:::o;58216:93::-;58274:27;58282:10;58294:6;58274:7;:27::i;:::-;58216:93;:::o;35082:308::-;35193:19;:17;:19::i;:::-;35181:31;;:8;:31;;;35177:61;;;35221:17;;;;;;;;;;;;;;35177:61;35303:8;35251:18;:39;35270:19;:17;:19::i;:::-;35251:39;;;;;;;;;;;;;;;:49;35291:8;35251:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;35363:8;35327:55;;35342:19;:17;:19::i;:::-;35327:55;;;35373:8;35327:55;;;;;;:::i;:::-;;;;;;;;35082:308;;:::o;61956:115::-;62014:7;11384:12;:10;:12::i;:::-;11373:23;;:7;:5;:7::i;:::-;:23;;;11365:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62042:21:::1;62035:28;;61956:115:::0;:::o;35952:399::-;36119:31;36132:4;36138:2;36142:7;36119:12;:31::i;:::-;36183:1;36165:2;:14;;;:19;36161:183;;36204:56;36235:4;36241:2;36245:7;36254:5;36204:30;:56::i;:::-;36199:145;;36288:40;;;;;;;;;;;;;;36199:145;36161:183;35952:399;;;;:::o;57538:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60269:545::-;60367:13;60420:16;60428:7;60420;:16::i;:::-;60398:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;60537:15;;60527:7;:25;60524:78;;;60576:14;60569:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60524:78;60614:28;60645:10;:8;:10::i;:::-;60614:41;;60704:1;60679:14;60673:28;:32;:133;;;;;;;;;;;;;;;;;60741:14;60757:18;:7;:16;:18::i;:::-;60777:13;60724:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60673:133;60666:140;;;60269:545;;;;:::o;57617:32::-;;;;:::o;61424:128::-;11384:12;:10;:12::i;:::-;11373:23;;:7;:5;:7::i;:::-;:23;;;11365:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61527:17:::1;61511:13;:33;;;;;;;;;;;;:::i;:::-;;61424:128:::0;:::o;60840:106::-;11384:12;:10;:12::i;:::-;11373:23;;:7;:5;:7::i;:::-;:23;;;11365:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60931:7:::1;60913:15;:25;;;;60840:106:::0;:::o;35461:164::-;35558:4;35582:18;:25;35601:5;35582:25;;;;;;;;;;;;;;;:35;35608:8;35582:35;;;;;;;;;;;;;;;;;;;;;;;;;35575:42;;35461:164;;;;:::o;61178:126::-;11384:12;:10;:12::i;:::-;11373:23;;:7;:5;:7::i;:::-;:23;;;11365:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61281:15:::1;61264:14;:32;;;;;;;;;;;;:::i;:::-;;61178:126:::0;:::o;12062:201::-;11384:12;:10;:12::i;:::-;11373:23;;:7;:5;:7::i;:::-;:23;;;11365:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12171:1:::1;12151:22;;:8;:22;;;;12143:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12227:28;12246:8;12227:18;:28::i;:::-;12062:201:::0;:::o;9877:98::-;9930:7;9957:10;9950:17;;9877:98;:::o;36606:273::-;36663:4;36719:7;36700:15;:13;:15::i;:::-;:26;;:66;;;;;36753:13;;36743:7;:23;36700:66;:152;;;;;36851:1;23217:8;36804:17;:26;36822:7;36804:26;;;;;;;;;;;;:43;:48;36700:152;36680:172;;36606:273;;;:::o;55167:105::-;55227:7;55254:10;55247:17;;55167:105;:::o;25791:92::-;25847:7;25791:92;:::o;29566:1129::-;29633:7;29653:12;29668:7;29653:22;;29736:4;29717:15;:13;:15::i;:::-;:23;29713:915;;29770:13;;29763:4;:20;29759:869;;;29808:14;29825:17;:23;29843:4;29825:23;;;;;;;;;;;;29808:40;;29941:1;23217:8;29914:6;:23;:28;29910:699;;;30433:113;30450:1;30440:6;:11;30433:113;;;30493:17;:25;30511:6;;;;;;;30493:25;;;;;;;;;;;;30484:34;;30433:113;;;30579:6;30572:13;;;;;;29910:699;29785:843;29759:869;29713:915;30656:31;;;;;;;;;;;;;;29566:1129;;;;:::o;42407:652::-;42502:27;42531:23;42572:53;42628:15;42572:71;;42814:7;42808:4;42801:21;42849:22;42843:4;42836:36;42925:4;42919;42909:21;42886:44;;43021:19;43015:26;42996:45;;42752:300;42407:652;;;:::o;43172:645::-;43314:11;43476:15;43470:4;43466:26;43458:34;;43635:15;43624:9;43620:31;43607:44;;43782:15;43771:9;43768:30;43761:4;43750:9;43747:19;43744:55;43734:65;;43172:645;;;;;:::o;54000:159::-;;;;;:::o;52312:309::-;52447:7;52467:16;23618:3;52493:19;:40;;52467:67;;23618:3;52560:31;52571:4;52577:2;52581:9;52560:10;:31::i;:::-;52552:40;;:61;;52545:68;;;52312:309;;;;;:::o;32140:447::-;32220:14;32388:15;32381:5;32377:27;32368:36;;32562:5;32548:11;32524:22;32520:40;32517:51;32510:5;32507:62;32497:72;;32140:447;;;;:::o;54818:158::-;;;;;:::o;58421:652::-;58484:14;58501:13;:11;:13::i;:::-;58484:30;;58525:16;58544:14;58554:3;58544:9;:14::i;:::-;58525:33;;58578:6;;;;;;;;;;;58577:7;58569:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;58628:1;58619:6;:10;58611:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;58680:13;;58670:6;:23;;58662:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;58758:9;;58748:6;58739;:15;;;;:::i;:::-;:28;;58731:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;58829:17;;58819:6;58808:8;:17;;;;:::i;:::-;:38;;58800:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;58909:7;:5;:7::i;:::-;58895:21;;:10;:21;;;58891:107;;58961:6;58954:4;;:13;;;;:::i;:::-;58941:9;:26;;58933:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;58891:107;59010:22;59020:3;59025:6;59010:9;:22::i;:::-;59043;59055:9;59043:11;:22::i;:::-;58473:600;;58421:652;;:::o;12423:191::-;12497:16;12516:6;;;;;;;;;;;12497:25;;12542:8;12533:6;;:17;;;;;;;;;;;;;;;;;;12597:8;12566:40;;12587:8;12566:40;;;;;;;;;;;;12486:128;12423:191;:::o;36963:104::-;37032:27;37042:2;37046:8;37032:27;;;;;;;;;;;;:9;:27::i;:::-;36963:104;;:::o;50822:716::-;50985:4;51031:2;51006:45;;;51052:19;:17;:19::i;:::-;51073:4;51079:7;51088:5;51006:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51002:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51306:1;51289:6;:13;:18;51285:235;;;51335:40;;;;;;;;;;;;;;51285:235;51478:6;51472:13;51463:6;51459:2;51455:15;51448:38;51002:529;51175:54;;;51165:64;;;:6;:64;;;;51158:71;;;50822:716;;;;;;:::o;60153:108::-;60213:13;60246:7;60239:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60153:108;:::o;398:723::-;454:13;684:1;675:5;:10;671:53;;;702:10;;;;;;;;;;;;;;;;;;;;;671:53;734:12;749:5;734:20;;765:14;790:78;805:1;797:4;:9;790:78;;823:8;;;;;:::i;:::-;;;;854:2;846:10;;;;;:::i;:::-;;;790:78;;;878:19;910:6;900:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;878:39;;928:154;944:1;935:5;:10;928:154;;972:1;962:11;;;;;:::i;:::-;;;1039:2;1031:5;:10;;;;:::i;:::-;1018:2;:24;;;;:::i;:::-;1005:39;;988:6;995;988:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1068:2;1059:11;;;;;:::i;:::-;;;928:154;;;1106:6;1092:21;;;;;398:723;;;;:::o;53197:147::-;53334:6;53197:147;;;;;:::o;59081:930::-;59138:11;59152:26;59165:4;59171:6;59152:12;:26::i;:::-;59138:40;;59195:24;59208:3;59213:5;59195:12;:24::i;:::-;59189:30;;59231:7;59252;;;;;;;;;;;59244:21;;59273:3;59244:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59230:51;;;59300:2;59292:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;59342:13;59358:25;59371:6;59379:3;59358:12;:25::i;:::-;59342:41;;59394:12;59409:26;59422:4;59428:6;59409:12;:26::i;:::-;59394:41;;59453:25;59466:4;59472:5;59453:12;:25::i;:::-;59446:32;;59490:8;59512;;;;;;;;;;;59504:22;;59534:4;59504:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59489:54;;;59562:3;59554:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;59609:25;59622:5;59629:4;59609:12;:25::i;:::-;59601:33;;59645:12;59660:25;59673:3;59678:6;59660:12;:25::i;:::-;59645:40;;59703:25;59716:4;59722:5;59703:12;:25::i;:::-;59696:32;;59740:8;59762:14;;;;;;;;;;;59754:28;;59790:4;59754:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59739:60;;;59818:3;59810:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;59866:25;59879:5;59886:4;59866:12;:25::i;:::-;59858:33;;59903:8;59925:10;;;;;;;;;;;59917:24;;59949:5;59917:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59902:57;;;59978:3;59970:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;59127:884;;;;;;;;59081:930;:::o;37483:681::-;37606:19;37612:2;37616:8;37606:5;:19::i;:::-;37685:1;37667:2;:14;;;:19;37663:483;;37707:11;37721:13;;37707:27;;37753:13;37775:8;37769:3;:14;37753:30;;37802:233;37833:62;37872:1;37876:2;37880:7;;;;;;37889:5;37833:30;:62::i;:::-;37828:167;;37931:40;;;;;;;;;;;;;;37828:167;38030:3;38022:5;:11;37802:233;;38117:3;38100:13;;:20;38096:34;;38122:8;;;38096:34;37688:458;;37663:483;37483:681;;;:::o;5771:98::-;5829:7;5860:1;5856;:5;;;;:::i;:::-;5849:12;;5771:98;;;;:::o;6170:::-;6228:7;6259:1;6255;:5;;;;:::i;:::-;6248:12;;6170:98;;;;:::o;5414:::-;5472:7;5503:1;5499;:5;;;;:::i;:::-;5492:12;;5414:98;;;;:::o;38437:1529::-;38502:20;38525:13;;38502:36;;38567:1;38553:16;;:2;:16;;;38549:48;;;38578:19;;;;;;;;;;;;;;38549:48;38624:1;38612:8;:13;38608:44;;;38634:18;;;;;;;;;;;;;;38608:44;38665:61;38695:1;38699:2;38703:12;38717:8;38665:21;:61::i;:::-;39208:1;22584:2;39179:1;:25;;39178:31;39166:8;:44;39140:18;:22;39159:2;39140:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;39487:139;39524:2;39578:33;39601:1;39605:2;39609:1;39578:14;:33::i;:::-;39545:30;39566:8;39545:20;:30::i;:::-;:66;39487:18;:139::i;:::-;39453:17;:31;39471:12;39453:31;;;;;;;;;;;:173;;;;39643:15;39661:12;39643:30;;39688:11;39717:8;39702:12;:23;39688:37;;39740:101;39792:9;;;;;;39788:2;39767:35;;39784:1;39767:35;;;;;;;;;;;;39836:3;39826:7;:13;39740:101;;39873:3;39857:13;:19;;;;38914:974;;39898:60;39927:1;39931:2;39935:12;39949:8;39898:20;:60::i;:::-;38491:1475;38437:1529;;:::o;33970:322::-;34040:14;34271:1;34261:8;34258:15;34233:23;34229:45;34219:55;;33970:322;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:118::-;7574:24;7592:5;7574:24;:::i;:::-;7569:3;7562:37;7487:118;;:::o;7611:109::-;7692:21;7707:5;7692:21;:::i;:::-;7687:3;7680:34;7611:109;;:::o;7726:360::-;7812:3;7840:38;7872:5;7840:38;:::i;:::-;7894:70;7957:6;7952:3;7894:70;:::i;:::-;7887:77;;7973:52;8018:6;8013:3;8006:4;7999:5;7995:16;7973:52;:::i;:::-;8050:29;8072:6;8050:29;:::i;:::-;8045:3;8041:39;8034:46;;7816:270;7726:360;;;;:::o;8092:364::-;8180:3;8208:39;8241:5;8208:39;:::i;:::-;8263:71;8327:6;8322:3;8263:71;:::i;:::-;8256:78;;8343:52;8388:6;8383:3;8376:4;8369:5;8365:16;8343:52;:::i;:::-;8420:29;8442:6;8420:29;:::i;:::-;8415:3;8411:39;8404:46;;8184:272;8092:364;;;;:::o;8462:377::-;8568:3;8596:39;8629:5;8596:39;:::i;:::-;8651:89;8733:6;8728:3;8651:89;:::i;:::-;8644:96;;8749:52;8794:6;8789:3;8782:4;8775:5;8771:16;8749:52;:::i;:::-;8826:6;8821:3;8817:16;8810:23;;8572:267;8462:377;;;;:::o;8869:845::-;8972:3;9009:5;9003:12;9038:36;9064:9;9038:36;:::i;:::-;9090:89;9172:6;9167:3;9090:89;:::i;:::-;9083:96;;9210:1;9199:9;9195:17;9226:1;9221:137;;;;9372:1;9367:341;;;;9188:520;;9221:137;9305:4;9301:9;9290;9286:25;9281:3;9274:38;9341:6;9336:3;9332:16;9325:23;;9221:137;;9367:341;9434:38;9466:5;9434:38;:::i;:::-;9494:1;9508:154;9522:6;9519:1;9516:13;9508:154;;;9596:7;9590:14;9586:1;9581:3;9577:11;9570:35;9646:1;9637:7;9633:15;9622:26;;9544:4;9541:1;9537:12;9532:17;;9508:154;;;9691:6;9686:3;9682:16;9675:23;;9374:334;;9188:520;;8976:738;;8869:845;;;;:::o;9720:366::-;9862:3;9883:67;9947:2;9942:3;9883:67;:::i;:::-;9876:74;;9959:93;10048:3;9959:93;:::i;:::-;10077:2;10072:3;10068:12;10061:19;;9720:366;;;:::o;10092:::-;10234:3;10255:67;10319:2;10314:3;10255:67;:::i;:::-;10248:74;;10331:93;10420:3;10331:93;:::i;:::-;10449:2;10444:3;10440:12;10433:19;;10092:366;;;:::o;10464:::-;10606:3;10627:67;10691:2;10686:3;10627:67;:::i;:::-;10620:74;;10703:93;10792:3;10703:93;:::i;:::-;10821:2;10816:3;10812:12;10805:19;;10464:366;;;:::o;10836:::-;10978:3;10999:67;11063:2;11058:3;10999:67;:::i;:::-;10992:74;;11075:93;11164:3;11075:93;:::i;:::-;11193:2;11188:3;11184:12;11177:19;;10836:366;;;:::o;11208:::-;11350:3;11371:67;11435:2;11430:3;11371:67;:::i;:::-;11364:74;;11447:93;11536:3;11447:93;:::i;:::-;11565:2;11560:3;11556:12;11549:19;;11208:366;;;:::o;11580:::-;11722:3;11743:67;11807:2;11802:3;11743:67;:::i;:::-;11736:74;;11819:93;11908:3;11819:93;:::i;:::-;11937:2;11932:3;11928:12;11921:19;;11580:366;;;:::o;11952:::-;12094:3;12115:67;12179:2;12174:3;12115:67;:::i;:::-;12108:74;;12191:93;12280:3;12191:93;:::i;:::-;12309:2;12304:3;12300:12;12293:19;;11952:366;;;:::o;12324:::-;12466:3;12487:67;12551:2;12546:3;12487:67;:::i;:::-;12480:74;;12563:93;12652:3;12563:93;:::i;:::-;12681:2;12676:3;12672:12;12665:19;;12324:366;;;:::o;12696:::-;12838:3;12859:67;12923:2;12918:3;12859:67;:::i;:::-;12852:74;;12935:93;13024:3;12935:93;:::i;:::-;13053:2;13048:3;13044:12;13037:19;;12696:366;;;:::o;13068:::-;13210:3;13231:67;13295:2;13290:3;13231:67;:::i;:::-;13224:74;;13307:93;13396:3;13307:93;:::i;:::-;13425:2;13420:3;13416:12;13409:19;;13068:366;;;:::o;13440:::-;13582:3;13603:67;13667:2;13662:3;13603:67;:::i;:::-;13596:74;;13679:93;13768:3;13679:93;:::i;:::-;13797:2;13792:3;13788:12;13781:19;;13440:366;;;:::o;13812:::-;13954:3;13975:67;14039:2;14034:3;13975:67;:::i;:::-;13968:74;;14051:93;14140:3;14051:93;:::i;:::-;14169:2;14164:3;14160:12;14153:19;;13812:366;;;:::o;14184:398::-;14343:3;14364:83;14445:1;14440:3;14364:83;:::i;:::-;14357:90;;14456:93;14545:3;14456:93;:::i;:::-;14574:1;14569:3;14565:11;14558:18;;14184:398;;;:::o;14588:366::-;14730:3;14751:67;14815:2;14810:3;14751:67;:::i;:::-;14744:74;;14827:93;14916:3;14827:93;:::i;:::-;14945:2;14940:3;14936:12;14929:19;;14588:366;;;:::o;14960:118::-;15047:24;15065:5;15047:24;:::i;:::-;15042:3;15035:37;14960:118;;:::o;15084:589::-;15309:3;15331:95;15422:3;15413:6;15331:95;:::i;:::-;15324:102;;15443:95;15534:3;15525:6;15443:95;:::i;:::-;15436:102;;15555:92;15643:3;15634:6;15555:92;:::i;:::-;15548:99;;15664:3;15657:10;;15084:589;;;;;;:::o;15679:379::-;15863:3;15885:147;16028:3;15885:147;:::i;:::-;15878:154;;16049:3;16042:10;;15679:379;;;:::o;16064:222::-;16157:4;16195:2;16184:9;16180:18;16172:26;;16208:71;16276:1;16265:9;16261:17;16252:6;16208:71;:::i;:::-;16064:222;;;;:::o;16292:640::-;16487:4;16525:3;16514:9;16510:19;16502:27;;16539:71;16607:1;16596:9;16592:17;16583:6;16539:71;:::i;:::-;16620:72;16688:2;16677:9;16673:18;16664:6;16620:72;:::i;:::-;16702;16770:2;16759:9;16755:18;16746:6;16702:72;:::i;:::-;16821:9;16815:4;16811:20;16806:2;16795:9;16791:18;16784:48;16849:76;16920:4;16911:6;16849:76;:::i;:::-;16841:84;;16292:640;;;;;;;:::o;16938:210::-;17025:4;17063:2;17052:9;17048:18;17040:26;;17076:65;17138:1;17127:9;17123:17;17114:6;17076:65;:::i;:::-;16938:210;;;;:::o;17154:313::-;17267:4;17305:2;17294:9;17290:18;17282:26;;17354:9;17348:4;17344:20;17340:1;17329:9;17325:17;17318:47;17382:78;17455:4;17446:6;17382:78;:::i;:::-;17374:86;;17154:313;;;;:::o;17473:419::-;17639:4;17677:2;17666:9;17662:18;17654:26;;17726:9;17720:4;17716:20;17712:1;17701:9;17697:17;17690:47;17754:131;17880:4;17754:131;:::i;:::-;17746:139;;17473:419;;;:::o;17898:::-;18064:4;18102:2;18091:9;18087:18;18079:26;;18151:9;18145:4;18141:20;18137:1;18126:9;18122:17;18115:47;18179:131;18305:4;18179:131;:::i;:::-;18171:139;;17898:419;;;:::o;18323:::-;18489:4;18527:2;18516:9;18512:18;18504:26;;18576:9;18570:4;18566:20;18562:1;18551:9;18547:17;18540:47;18604:131;18730:4;18604:131;:::i;:::-;18596:139;;18323:419;;;:::o;18748:::-;18914:4;18952:2;18941:9;18937:18;18929:26;;19001:9;18995:4;18991:20;18987:1;18976:9;18972:17;18965:47;19029:131;19155:4;19029:131;:::i;:::-;19021:139;;18748:419;;;:::o;19173:::-;19339:4;19377:2;19366:9;19362:18;19354:26;;19426:9;19420:4;19416:20;19412:1;19401:9;19397:17;19390:47;19454:131;19580:4;19454:131;:::i;:::-;19446:139;;19173:419;;;:::o;19598:::-;19764:4;19802:2;19791:9;19787:18;19779:26;;19851:9;19845:4;19841:20;19837:1;19826:9;19822:17;19815:47;19879:131;20005:4;19879:131;:::i;:::-;19871:139;;19598:419;;;:::o;20023:::-;20189:4;20227:2;20216:9;20212:18;20204:26;;20276:9;20270:4;20266:20;20262:1;20251:9;20247:17;20240:47;20304:131;20430:4;20304:131;:::i;:::-;20296:139;;20023:419;;;:::o;20448:::-;20614:4;20652:2;20641:9;20637:18;20629:26;;20701:9;20695:4;20691:20;20687:1;20676:9;20672:17;20665:47;20729:131;20855:4;20729:131;:::i;:::-;20721:139;;20448:419;;;:::o;20873:::-;21039:4;21077:2;21066:9;21062:18;21054:26;;21126:9;21120:4;21116:20;21112:1;21101:9;21097:17;21090:47;21154:131;21280:4;21154:131;:::i;:::-;21146:139;;20873:419;;;:::o;21298:::-;21464:4;21502:2;21491:9;21487:18;21479:26;;21551:9;21545:4;21541:20;21537:1;21526:9;21522:17;21515:47;21579:131;21705:4;21579:131;:::i;:::-;21571:139;;21298:419;;;:::o;21723:::-;21889:4;21927:2;21916:9;21912:18;21904:26;;21976:9;21970:4;21966:20;21962:1;21951:9;21947:17;21940:47;22004:131;22130:4;22004:131;:::i;:::-;21996:139;;21723:419;;;:::o;22148:::-;22314:4;22352:2;22341:9;22337:18;22329:26;;22401:9;22395:4;22391:20;22387:1;22376:9;22372:17;22365:47;22429:131;22555:4;22429:131;:::i;:::-;22421:139;;22148:419;;;:::o;22573:::-;22739:4;22777:2;22766:9;22762:18;22754:26;;22826:9;22820:4;22816:20;22812:1;22801:9;22797:17;22790:47;22854:131;22980:4;22854:131;:::i;:::-;22846:139;;22573:419;;;:::o;22998:222::-;23091:4;23129:2;23118:9;23114:18;23106:26;;23142:71;23210:1;23199:9;23195:17;23186:6;23142:71;:::i;:::-;22998:222;;;;:::o;23226:129::-;23260:6;23287:20;;:::i;:::-;23277:30;;23316:33;23344:4;23336:6;23316:33;:::i;:::-;23226:129;;;:::o;23361:75::-;23394:6;23427:2;23421:9;23411:19;;23361:75;:::o;23442:307::-;23503:4;23593:18;23585:6;23582:30;23579:56;;;23615:18;;:::i;:::-;23579:56;23653:29;23675:6;23653:29;:::i;:::-;23645:37;;23737:4;23731;23727:15;23719:23;;23442:307;;;:::o;23755:308::-;23817:4;23907:18;23899:6;23896:30;23893:56;;;23929:18;;:::i;:::-;23893:56;23967:29;23989:6;23967:29;:::i;:::-;23959:37;;24051:4;24045;24041:15;24033:23;;23755:308;;;:::o;24069:141::-;24118:4;24141:3;24133:11;;24164:3;24161:1;24154:14;24198:4;24195:1;24185:18;24177:26;;24069:141;;;:::o;24216:98::-;24267:6;24301:5;24295:12;24285:22;;24216:98;;;:::o;24320:99::-;24372:6;24406:5;24400:12;24390:22;;24320:99;;;:::o;24425:168::-;24508:11;24542:6;24537:3;24530:19;24582:4;24577:3;24573:14;24558:29;;24425:168;;;;:::o;24599:147::-;24700:11;24737:3;24722:18;;24599:147;;;;:::o;24752:169::-;24836:11;24870:6;24865:3;24858:19;24910:4;24905:3;24901:14;24886:29;;24752:169;;;;:::o;24927:148::-;25029:11;25066:3;25051:18;;24927:148;;;;:::o;25081:305::-;25121:3;25140:20;25158:1;25140:20;:::i;:::-;25135:25;;25174:20;25192:1;25174:20;:::i;:::-;25169:25;;25328:1;25260:66;25256:74;25253:1;25250:81;25247:107;;;25334:18;;:::i;:::-;25247:107;25378:1;25375;25371:9;25364:16;;25081:305;;;;:::o;25392:185::-;25432:1;25449:20;25467:1;25449:20;:::i;:::-;25444:25;;25483:20;25501:1;25483:20;:::i;:::-;25478:25;;25522:1;25512:35;;25527:18;;:::i;:::-;25512:35;25569:1;25566;25562:9;25557:14;;25392:185;;;;:::o;25583:348::-;25623:7;25646:20;25664:1;25646:20;:::i;:::-;25641:25;;25680:20;25698:1;25680:20;:::i;:::-;25675:25;;25868:1;25800:66;25796:74;25793:1;25790:81;25785:1;25778:9;25771:17;25767:105;25764:131;;;25875:18;;:::i;:::-;25764:131;25923:1;25920;25916:9;25905:20;;25583:348;;;;:::o;25937:191::-;25977:4;25997:20;26015:1;25997:20;:::i;:::-;25992:25;;26031:20;26049:1;26031:20;:::i;:::-;26026:25;;26070:1;26067;26064:8;26061:34;;;26075:18;;:::i;:::-;26061:34;26120:1;26117;26113:9;26105:17;;25937:191;;;;:::o;26134:96::-;26171:7;26200:24;26218:5;26200:24;:::i;:::-;26189:35;;26134:96;;;:::o;26236:90::-;26270:7;26313:5;26306:13;26299:21;26288:32;;26236:90;;;:::o;26332:149::-;26368:7;26408:66;26401:5;26397:78;26386:89;;26332:149;;;:::o;26487:126::-;26524:7;26564:42;26557:5;26553:54;26542:65;;26487:126;;;:::o;26619:77::-;26656:7;26685:5;26674:16;;26619:77;;;:::o;26702:154::-;26786:6;26781:3;26776;26763:30;26848:1;26839:6;26834:3;26830:16;26823:27;26702:154;;;:::o;26862:307::-;26930:1;26940:113;26954:6;26951:1;26948:13;26940:113;;;27039:1;27034:3;27030:11;27024:18;27020:1;27015:3;27011:11;27004:39;26976:2;26973:1;26969:10;26964:15;;26940:113;;;27071:6;27068:1;27065:13;27062:101;;;27151:1;27142:6;27137:3;27133:16;27126:27;27062:101;26911:258;26862:307;;;:::o;27175:320::-;27219:6;27256:1;27250:4;27246:12;27236:22;;27303:1;27297:4;27293:12;27324:18;27314:81;;27380:4;27372:6;27368:17;27358:27;;27314:81;27442:2;27434:6;27431:14;27411:18;27408:38;27405:84;;;27461:18;;:::i;:::-;27405:84;27226:269;27175:320;;;:::o;27501:281::-;27584:27;27606:4;27584:27;:::i;:::-;27576:6;27572:40;27714:6;27702:10;27699:22;27678:18;27666:10;27663:34;27660:62;27657:88;;;27725:18;;:::i;:::-;27657:88;27765:10;27761:2;27754:22;27544:238;27501:281;;:::o;27788:233::-;27827:3;27850:24;27868:5;27850:24;:::i;:::-;27841:33;;27896:66;27889:5;27886:77;27883:103;;;27966:18;;:::i;:::-;27883:103;28013:1;28006:5;28002:13;27995:20;;27788:233;;;:::o;28027:176::-;28059:1;28076:20;28094:1;28076:20;:::i;:::-;28071:25;;28110:20;28128:1;28110:20;:::i;:::-;28105:25;;28149:1;28139:35;;28154:18;;:::i;:::-;28139:35;28195:1;28192;28188:9;28183:14;;28027:176;;;;:::o;28209:180::-;28257:77;28254:1;28247:88;28354:4;28351:1;28344:15;28378:4;28375:1;28368:15;28395:180;28443:77;28440:1;28433:88;28540:4;28537:1;28530:15;28564:4;28561:1;28554:15;28581:180;28629:77;28626:1;28619:88;28726:4;28723:1;28716:15;28750:4;28747:1;28740:15;28767:180;28815:77;28812:1;28805:88;28912:4;28909:1;28902:15;28936:4;28933:1;28926:15;28953:180;29001:77;28998:1;28991:88;29098:4;29095:1;29088:15;29122:4;29119:1;29112:15;29139:117;29248:1;29245;29238:12;29262:117;29371:1;29368;29361:12;29385:117;29494:1;29491;29484:12;29508:117;29617:1;29614;29607:12;29631:102;29672:6;29723:2;29719:7;29714:2;29707:5;29703:14;29699:28;29689:38;;29631:102;;;:::o;29739:164::-;29879:16;29875:1;29867:6;29863:14;29856:40;29739:164;:::o;29909:177::-;30049:29;30045:1;30037:6;30033:14;30026:53;29909:177;:::o;30092:225::-;30232:34;30228:1;30220:6;30216:14;30209:58;30301:8;30296:2;30288:6;30284:15;30277:33;30092:225;:::o;30323:161::-;30463:13;30459:1;30451:6;30447:14;30440:37;30323:161;:::o;30490:164::-;30630:16;30626:1;30618:6;30614:14;30607:40;30490:164;:::o;30660:172::-;30800:24;30796:1;30788:6;30784:14;30777:48;30660:172;:::o;30838:169::-;30978:21;30974:1;30966:6;30962:14;30955:45;30838:169;:::o;31013:182::-;31153:34;31149:1;31141:6;31137:14;31130:58;31013:182;:::o;31201:168::-;31341:20;31337:1;31329:6;31325:14;31318:44;31201:168;:::o;31375:167::-;31515:19;31511:1;31503:6;31499:14;31492:43;31375:167;:::o;31548:234::-;31688:34;31684:1;31676:6;31672:14;31665:58;31757:17;31752:2;31744:6;31740:15;31733:42;31548:234;:::o;31788:167::-;31928:19;31924:1;31916:6;31912:14;31905:43;31788:167;:::o;31961:114::-;;:::o;32081:172::-;32221:24;32217:1;32209:6;32205:14;32198:48;32081:172;:::o;32259:122::-;32332:24;32350:5;32332:24;:::i;:::-;32325:5;32322:35;32312:63;;32371:1;32368;32361:12;32312:63;32259:122;:::o;32387:116::-;32457:21;32472:5;32457:21;:::i;:::-;32450:5;32447:32;32437:60;;32493:1;32490;32483:12;32437:60;32387:116;:::o;32509:120::-;32581:23;32598:5;32581:23;:::i;:::-;32574:5;32571:34;32561:62;;32619:1;32616;32609:12;32561:62;32509:120;:::o;32635:122::-;32708:24;32726:5;32708:24;:::i;:::-;32701:5;32698:35;32688:63;;32747:1;32744;32737:12;32688:63;32635:122;:::o

Swarm Source

ipfs://33ab8477962e2755ceb31e498c89c74db9b7c9694e8cbb5ee5c39967a013c7aa
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.