ETH Price: $3,248.82 (-0.31%)
Gas: 2 Gwei

Token

Stayhuman (SA)
 

Overview

Max Total Supply

500 SA

Holders

270

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SA
0x31c0fe5ed07714cb1f40c619a55f58dd99a6fe42
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:
StayHuman

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 2: stayhuman.sol

// SPDX-License-Identifier: MIT


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

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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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




pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] +=
                quantity *
                ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] +=
                quantity *
                ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED |
                BITMASK_NEXT_INITIALIZED;

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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";
    uint8 private constant _ADDRESS_LENGTH = 20;

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

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

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

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

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



// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)



//7599910339349013

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @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 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);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            owner != address(0),
            "ERC721: address zero is not a valid owner"
        );
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        address owner = _owners[tokenId];
        require(
            owner != address(0),
            "ERC721: owner query for nonexistent token"
        );
        return owner;
    }

    /**
     * @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)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @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.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        virtual
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner ||
            isApprovedForAll(owner, spender) ||
            getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(
            ERC721.ownerOf(tokenId) == from,
            "ERC721: transfer from incorrect owner"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    //7599910339349013
    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a 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 _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

pragma solidity ^0.8.0;


import "./Istayhuman1155.sol";

contract StayHuman is
    ERC721A,
    Ownable,
    ReentrancyGuard,
    DefaultOperatorFilterer
{
    using Strings for uint256;

    string private baseURI;

    uint256 public maxPerWallet = 1;
    uint256 public price = 0.0666 ether;

    uint256 public maxSupply = 666;
    bool public phaseOneEnabled = false;
    bool public phaseTwoEnabled = false;
    bool public publicEnabled = false;
    bool public burnEnabled=false;
    bool public revealed = false;
    address private founderWallet = 0x86c4A74e1283AA79504183A8DAF1B4F4D424b9F7;
    address private wallet2 = 0x3BdC8d36c45b2eD12B6038fDFEd63cA9F8D5C70e; //Dev Wallet
    bytes32 phaseOneRoot;
    bytes32 phaseTwoRoot;
    mapping(address => uint256) public _burnedAmount;
    string public hiddenURI = "ipfs://QmaUCRTqpJEpUxS2x6igrdBXQcioQne6HbmW4Lopn2XCTT";

    StayhumanGenesis genesis;

    constructor(StayhumanGenesis _genesis) ERC721A("Stayhuman", "SA") {
        genesis=_genesis;
    }


    function burnMint() external nonReentrant {
        require(burnEnabled, "Burning period is not active yet");
        require(genesis.balanceOf(msg.sender,1) > 0, "Not enough Genesis Tokens");
        require(totalSupply() + 1 <= maxSupply, "Total Supply Exceeded");
         _burnedAmount[msg.sender] += 1;
        genesis.safeTransferFrom(msg.sender,address(0x000000000000000000000000000000000000dEaD),1, 1,"");
        _safeMint(msg.sender, 1);
    }
    function burnAllMint(uint256 count) external nonReentrant {
        require(burnEnabled, "Burning period is not active yet");
        require(count>0,"Count must be greater than zero");
        require(totalSupply() + count <= maxSupply, "Total Supply Exceeded");
        require(genesis.balanceOf(msg.sender,1) == count, "Incorrect amount of Genesis Tokens");
         _burnedAmount[msg.sender] += count;

        genesis.safeTransferFrom(msg.sender,address(0x000000000000000000000000000000000000dEaD),1, count,"");
        _safeMint(msg.sender, count);
    }

    function phaseOneMint(bytes32[] calldata _merkleProof)
        external
        payable
    {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        require(
            MerkleProof.verify(_merkleProof, phaseOneRoot, leaf),
            "Incorrect Whitelist Proof"
        );
        require(msg.value >= price , "Please send the exact amount.");
        require(
            _numberMinted(msg.sender) + 1 - _burnedAmount[msg.sender] <= maxPerWallet,
            "Can not mint more than 1"
        );
        require(totalSupply() + 1 <= maxSupply, "Total Supply Exceeded");
        require(phaseOneEnabled, "Phase One Mint is not live yet");

        _safeMint(msg.sender, 1);
    }

    function phaseTwoMint(bytes32[] calldata _merkleProof, uint256 count)
        external
        payable
    {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        require(
            MerkleProof.verify(_merkleProof, phaseTwoRoot, leaf),
            "Incorrect Whitelist Proof"
        );
        require(count > 0, "Please enter a number");

        require(msg.value >= price * count, "Please send the exact amount.");
        require(
            _numberMinted(msg.sender) + count - _burnedAmount[msg.sender] <= maxPerWallet,
            "Can not exceed the max mint per wallet"
        );
        require(totalSupply() + count <= maxSupply, "Total Supply Exceeded");
        require(phaseTwoEnabled, "Phase Two Mint is not live yet");

        _safeMint(msg.sender, count);
    }

    function publicMint(uint256 count) external payable {
        require(msg.value >= count * price, "Please send the exact amount.");
        require(totalSupply() + count <= maxSupply, "Total Supply Exceeded");
        require(
            _numberMinted(msg.sender) + count <= maxPerWallet,
            "Can not mint more than 1"
        );
        require(count > 0, "Please enter a number");
        require(publicEnabled, "Public Mint is not live yet");

        _safeMint(msg.sender, count);
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }
  
    function _mintedAmount(address account) external view returns (uint256) {
        return _numberMinted(account);
    }
    function _genesisMintedAmount(address account) external view returns (uint256) {
        return genesis.balanceOf(account,1);
    }

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

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

    function setPreSaleRoot(bytes32 _presaleRoot_1, bytes32 _presaleRoot_2)
        external
        onlyOwner
    {
        phaseOneRoot = _presaleRoot_1;
        phaseTwoRoot = _presaleRoot_2;
    }

    function setBaseURI(string memory uri) public onlyOwner {
        baseURI = uri;
    }
    function setHiddenURI(string memory uri) public onlyOwner {
        hiddenURI = uri;
    }

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

    function setMaxPerWallet(uint256 amount) external onlyOwner {
        maxPerWallet = amount;
    }

    function setPrice(uint256 _newPrice) external onlyOwner {
        price = _newPrice;
    }

    function setMaxSupply(uint256 _newSupply) external onlyOwner {
        maxSupply = _newSupply;
    }

    function flipPhaseOne(bool status) external onlyOwner {
        phaseOneEnabled = status;
    }

    function flipPhaseTwo(bool status) external onlyOwner {
        phaseOneEnabled=!phaseOneEnabled;
        phaseTwoEnabled = status;
    }
    function flipBurn(bool status) external onlyOwner {
        burnEnabled = status;
    }

    function flipPublic(bool status) external onlyOwner {
        publicEnabled = status;
    }

    function reveal() external onlyOwner {
        revealed = !revealed;
    }

    function batchMint(uint256 _mintAmount, address destination)
        public
        onlyOwner
    {
        require(_mintAmount > 0, "need to mint at least 1 NFT");
        uint256 supply = totalSupply();
        require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");

        _safeMint(destination, _mintAmount);
    }
    
    function airdrop(address[] calldata receivers) public onlyOwner {
        require(receivers.length > 0, "Need at least one address");
        for (uint256 i; i < receivers.length; ++i) {
             _safeMint(receivers[i], 1);
        }
    }
  function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        uint256 balance2 = (balance * 90) / 100;
        uint256 balance3 = (balance * 10) / 100;

        payable(founderWallet).transfer(balance2);
        payable(wallet2).transfer(balance3);
    }

    function setApprovalForAll(address operator, bool approved)
        public
        override
        onlyAllowedOperatorApproval(operator)
    {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId)
        public
        override
        onlyAllowedOperatorApproval(operator)
    {
        super.approve(operator, tokenId);
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

File 1 of 2: Istayhuman1155.sol

// SPDX-License-Identifier: MIT

// File: operator-filter-registry/src/IOperatorFilterRegistry.sol

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator)
        external
        view
        returns (bool);

    function register(address registrant) external;

    function registerAndSubscribe(address registrant, address subscription)
        external;

    function registerAndCopyEntries(
        address registrant,
        address registrantToCopy
    ) external;

    function unregister(address addr) external;

    function updateOperator(
        address registrant,
        address operator,
        bool filtered
    ) external;

    function updateOperators(
        address registrant,
        address[] calldata operators,
        bool filtered
    ) external;

    function updateCodeHash(
        address registrant,
        bytes32 codehash,
        bool filtered
    ) external;

    function updateCodeHashes(
        address registrant,
        bytes32[] calldata codeHashes,
        bool filtered
    ) external;

    function subscribe(address registrant, address registrantToSubscribe)
        external;

    function unsubscribe(address registrant, bool copyExistingEntries) external;

    function subscriptionOf(address addr) external returns (address registrant);

    function subscribers(address registrant)
        external
        returns (address[] memory);

    function subscriberAt(address registrant, uint256 index)
        external
        returns (address);

    function copyEntriesOf(address registrant, address registrantToCopy)
        external;

    function isOperatorFiltered(address registrant, address operator)
        external
        returns (bool);

    function isCodeHashOfFiltered(address registrant, address operatorWithCode)
        external
        returns (bool);

    function isCodeHashFiltered(address registrant, bytes32 codeHash)
        external
        returns (bool);

    function filteredOperators(address addr)
        external
        returns (address[] memory);

    function filteredCodeHashes(address addr)
        external
        returns (bytes32[] memory);

    function filteredOperatorAt(address registrant, uint256 index)
        external
        returns (address);

    function filteredCodeHashAt(address registrant, uint256 index)
        external
        returns (bytes32);

    function isRegistered(address addr) external returns (bool);

    function codeHashOf(address addr) external returns (bytes32);
}

// File: operator-filter-registry/src/OperatorFilterer.sol

pragma solidity ^0.8.13;

abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(
                    address(this),
                    subscriptionOrRegistrantToCopy
                );
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(
                        address(this),
                        subscriptionOrRegistrantToCopy
                    );
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !OPERATOR_FILTER_REGISTRY.isOperatorAllowed(
                    address(this),
                    msg.sender
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (
                !OPERATOR_FILTER_REGISTRY.isOperatorAllowed(
                    address(this),
                    operator
                )
            ) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}
// File: operator-filter-registry/src/DefaultOperatorFilterer.sol

pragma solidity ^0.8.13;

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION =
        address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol

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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf)
        internal
        pure
        returns (bytes32)
    {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf)
        internal
        pure
        returns (bytes32)
    {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(
            leavesLen + proof.length - 1 == totalHashes,
            "MerkleProof: invalid multiproof"
        );

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen
                ? leaves[leafPos++]
                : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(
            leavesLen + proof.length - 1 == totalHashes,
            "MerkleProof: invalid multiproof"
        );

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen
                ? leaves[leafPos++]
                : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b)
        private
        pure
        returns (bytes32 value)
    {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface 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);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol

// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 id,
        uint256 value
    );

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(
        address indexed account,
        address indexed operator,
        bool approved
    );

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id)
        external
        view
        returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator)
        external
        view
        returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol
//7599910339349013
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            account != address(0),
            "ERC1155: address zero is not a valid owner"
        );
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(
            accounts.length == ids.length,
            "ERC1155: accounts and ids length mismatch"
        );

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(
            fromBalance >= amount,
            "ERC1155: insufficient balance for transfer"
        );
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(
                fromBalance >= amount,
                "ERC1155: insufficient balance for transfer"
            );
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            from,
            to,
            ids,
            amounts,
            data
        );
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(
            operator,
            address(0),
            to,
            id,
            amount,
            data
        );
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            address(0),
            to,
            ids,
            amounts,
            data
        );
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(
                fromBalance >= amount,
                "ERC1155: burn amount exceeds balance"
            );
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155Received(
                    operator,
                    from,
                    id,
                    amount,
                    data
                )
            returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155BatchReceived(
                    operator,
                    from,
                    ids,
                    amounts,
                    data
                )
            returns (bytes4 response) {
                if (
                    response != IERC1155Receiver.onERC1155BatchReceived.selector
                ) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element)
        private
        pure
        returns (uint256[] memory)
    {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;

/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(
                    supply >= amount,
                    "ERC1155: burn amount exceeds totalSupply"
                );
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

// File: contracts/stayhuman.sol

pragma solidity ^0.8.2;

contract StayhumanGenesis is
    ERC1155,
    Ownable,
    ERC1155Supply,
    DefaultOperatorFilterer
{
    uint256 public price = 0.08 ether;
    uint256 public maxSupply = 333;
    bool public presaleActive = false;
    bool public phaseTwoActive = false;
    bool public saleActive = false;
    uint256 public maxPublicPerWallet = 1;
    uint256 public activeTokenID = 1;
    bytes32 public whitelistRoot;
    address private founderWallet = 0x86c4A74e1283AA79504183A8DAF1B4F4D424b9F7;
    address private wallet2 = 0x3BdC8d36c45b2eD12B6038fDFEd63cA9F8D5C70e; //Dev Wallet
    bytes32 public raffleRoot;
    string public name = "StayHuman Genesis";

    mapping(address => bool) public whitelistMinted;
    mapping(address => uint256) public numberMinted;

    constructor() ERC1155("ipfs://QmXW9pnARLHFegbWH8ue611j7PYV2KuL6NaVK965ummxRb") {}

    function mintWhitelist(bytes32[] calldata _merkleProof) public payable {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        require(msg.value >= price, "Send correct amount");
        require(presaleActive, "Sale is not active");
        require(
            totalSupply(activeTokenID) + 1 <= maxSupply,
            "Purchase would exceed max supply"
        );
        require(!whitelistMinted[msg.sender], "Whitelist has already claimed");

        require(
            MerkleProof.verify(_merkleProof, whitelistRoot, leaf),
            "Invalid proof"
        );

        whitelistMinted[msg.sender] = true;
        _mint(msg.sender, activeTokenID, 1, "");
    }

    function mintSecondPhase(bytes32[] calldata _merkleProof) public payable {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        require(msg.value >= price, "Send correct amount");
        require(phaseTwoActive, "Sale is not active");
        require(
            totalSupply(activeTokenID) + 1 <= maxSupply,
            "Purchase would exceed max supply"
        );
        require(!whitelistMinted[msg.sender], "Whitelist has already claimed");

        require(
            MerkleProof.verify(_merkleProof, raffleRoot, leaf),
            "Invalid proof"
        );

        whitelistMinted[msg.sender] = true;
        _mint(msg.sender, activeTokenID, 1, "");
    }

    // If necessary
    function publicMint(uint256 amount) public payable {
        require(msg.value >= amount * price, "Send correct amount");
        require(saleActive, "Sale is not active");
        require(amount > 0, "Amount must be positive integer");
        require(
            totalSupply(activeTokenID) + amount <= maxSupply,
            "Purchase would exceed max supply"
        );
        require(
            numberMinted[msg.sender] + amount <= maxPublicPerWallet,
            "Max per wallet reached"
        );
        numberMinted[msg.sender] += amount;

        _mint(msg.sender, activeTokenID, amount, "");
    }

    function isWhitelistMinted(address minter) external view returns (bool) {
        return whitelistMinted[minter];
    }

    function getNumberMintedPublic(address minter)
        external
        view
        returns (uint256)
    {
        return numberMinted[minter];
    }

    function setPresaleStatus(bool _presaleActive) public onlyOwner {
        presaleActive = _presaleActive;
    }

    function setSecondPhase(bool _secondPhase) public onlyOwner {
        presaleActive = !presaleActive;
        phaseTwoActive = _secondPhase;
    }

    function setMaxPublic(uint256 _amount) public onlyOwner {
        maxPublicPerWallet = _amount;
    }

    function setSaleStatus(bool _saleActive) public onlyOwner {
        saleActive = _saleActive;
    }

    function setPrice(uint256 _price) public onlyOwner {
        price = _price;
    }

    function setWhitelistRoot(bytes32 _presaleRoot, bytes32 _raffleRoot)
        external
        onlyOwner
    {
        whitelistRoot = _presaleRoot;
        raffleRoot = _raffleRoot;
    }

    function setURI(string memory newuri) public onlyOwner {
        _setURI(newuri);
    }

    function airdrop(address[] calldata receivers) public onlyOwner {
        require(receivers.length > 0, "Need at least one address");
        for (uint256 i; i < receivers.length; ++i) {
            _mint(receivers[i], activeTokenID, 1, "");
        }
    }

 function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        uint256 balance2 = (balance * 934) / 1000;
        uint256 balance3 = (balance * 66) / 1000;

        payable(founderWallet).transfer(balance2);
        payable(wallet2).transfer(balance3);
    }

    // Required overwrite function by solidity
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal override(ERC1155, ERC1155Supply) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }

    // Opensea Filtering things
    function setApprovalForAll(address operator, bool approved)
        public
        override
        onlyAllowedOperatorApproval(operator)
    {
        super.setApprovalForAll(operator, approved);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        uint256 amount,
        bytes memory data
    ) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId, amount, data);
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override onlyAllowedOperator(from) {
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract StayhumanGenesis","name":"_genesis","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_burnedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"_genesisMintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"_mintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"burnAllMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"flipBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"flipPhaseOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"flipPhaseTwo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"flipPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phaseOneEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"phaseOneMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"phaseTwoEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"phaseTwoMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setHiddenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_presaleRoot_1","type":"bytes32"},{"internalType":"bytes32","name":"_presaleRoot_2","type":"bytes32"}],"name":"setPreSaleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","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":"nonpayable","type":"function"}]

60806040526001600b5566ec9c58de0a8000600c5561029a600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055506000600e60026101000a81548160ff0219169083151502179055506000600e60036101000a81548160ff0219169083151502179055506000600e60046101000a81548160ff0219169083151502179055507386c4a74e1283aa79504183a8daf1b4f4d424b9f7600e60056101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550733bdc8d36c45b2ed12b6038fdfed63ca9f8d5c70e600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180606001604052806035815260200162005fd9603591396013908162000175919062000820565b503480156200018357600080fd5b506040516200600e3803806200600e8339818101604052810190620001a9919062000985565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600981526020017f5374617968756d616e00000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f534100000000000000000000000000000000000000000000000000000000000081525081600290816200023d919062000820565b5080600390816200024f919062000820565b5062000260620004cf60201b60201c565b6000819055505050620002886200027c620004d860201b60201c565b620004e060201b60201c565b600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620004855780156200034b576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b815260040162000311929190620009c8565b600060405180830381600087803b1580156200032c57600080fd5b505af115801562000341573d6000803e3d6000fd5b5050505062000484565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000405576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620003cb929190620009c8565b600060405180830381600087803b158015620003e657600080fd5b505af1158015620003fb573d6000803e3d6000fd5b5050505062000483565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200044e9190620009f5565b600060405180830381600087803b1580156200046957600080fd5b505af11580156200047e573d6000803e3d6000fd5b505050505b5b5b505080601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000a12565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200062857607f821691505b6020821081036200063e576200063d620005e0565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006a87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000669565b620006b4868362000669565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000701620006fb620006f584620006cc565b620006d6565b620006cc565b9050919050565b6000819050919050565b6200071d83620006e0565b620007356200072c8262000708565b84845462000676565b825550505050565b600090565b6200074c6200073d565b6200075981848462000712565b505050565b5b8181101562000781576200077560008262000742565b6001810190506200075f565b5050565b601f821115620007d0576200079a8162000644565b620007a58462000659565b81016020851015620007b5578190505b620007cd620007c48562000659565b8301826200075e565b50505b505050565b600082821c905092915050565b6000620007f560001984600802620007d5565b1980831691505092915050565b6000620008108383620007e2565b9150826002028217905092915050565b6200082b82620005a6565b67ffffffffffffffff811115620008475762000846620005b1565b5b6200085382546200060f565b6200086082828562000785565b600060209050601f83116001811462000898576000841562000883578287015190505b6200088f858262000802565b865550620008ff565b601f198416620008a88662000644565b60005b82811015620008d257848901518255600182019150602085019450602081019050620008ab565b86831015620008f25784890151620008ee601f891682620007e2565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000939826200090c565b9050919050565b60006200094d826200092c565b9050919050565b6200095f8162000940565b81146200096b57600080fd5b50565b6000815190506200097f8162000954565b92915050565b6000602082840312156200099e576200099d62000907565b5b6000620009ae848285016200096e565b91505092915050565b620009c2816200092c565b82525050565b6000604082019050620009df6000830185620009b7565b620009ee6020830184620009b7565b9392505050565b600060208201905062000a0c6000830184620009b7565b92915050565b6155b78062000a226000396000f3fe6080604052600436106102ae5760003560e01c8063802ebfa311610175578063c2f637dc116100dc578063daa2a85911610095578063ed64892b1161006f578063ed64892b14610a42578063f2fde38b14610a7f578063f55e7fc714610aa8578063fe996f0114610ad1576102ae565b8063daa2a859146109b3578063e268e4d3146109dc578063e985e9c514610a05576102ae565b8063c2f637dc146108b7578063c6fe62b0146108e0578063c87b56dd146108f7578063c90f723914610934578063d45530431461095d578063d5abeb0114610988576102ae565b8063a035b1fe1161012e578063a035b1fe146107bd578063a22cb465146107e8578063a475b5dd14610811578063a75193c714610828578063b88d4fde14610865578063bbaac02f1461088e576102ae565b8063802ebfa3146106bd5780638cc54e7f146106e85780638da5cb5b1461071357806391b7f5ed1461073e57806395d89b41146107675780639b001f4514610792576102ae565b806341f43434116102195780636352211e116101d25780636352211e146105b15780636f8b44b0146105ee57806370a0823114610617578063715018a614610654578063729ad39e1461066b57806377aeead914610694576102ae565b806341f43434146104b357806342842e0e146104de578063453c231014610507578063518302271461053257806355f804b31461055d5780635dc96d1614610586576102ae565b806318160ddd1161026b57806318160ddd146103c65780631fd2ff85146103f15780632131d45c1461042e57806323b872dd146104575780632db11544146104805780633ccfd60b1461049c576102ae565b806301ffc9a7146102b357806303fd03ea146102f057806305cefb9b1461030c57806306fdde0314610335578063081812fc14610360578063095ea7b31461039d575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190613a9b565b610aed565b6040516102e79190613ae3565b60405180910390f35b61030a60048036038101906103059190613b99565b610b7f565b005b34801561031857600080fd5b50610333600480360381019061032e9190613bf9565b610e22565b005b34801561034157600080fd5b5061034a611138565b6040516103579190613cb6565b60405180910390f35b34801561036c57600080fd5b5061038760048036038101906103829190613bf9565b6111ca565b6040516103949190613d19565b60405180910390f35b3480156103a957600080fd5b506103c460048036038101906103bf9190613d60565b611246565b005b3480156103d257600080fd5b506103db611350565b6040516103e89190613daf565b60405180910390f35b3480156103fd57600080fd5b5061041860048036038101906104139190613dca565b611367565b6040516104259190613daf565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190613e23565b61137f565b005b34801561046357600080fd5b5061047e60048036038101906104799190613e50565b6113a4565b005b61049a60048036038101906104959190613bf9565b6114f4565b005b3480156104a857600080fd5b506104b1611692565b005b3480156104bf57600080fd5b506104c86117b0565b6040516104d59190613f02565b60405180910390f35b3480156104ea57600080fd5b5061050560048036038101906105009190613e50565b6117c2565b005b34801561051357600080fd5b5061051c611912565b6040516105299190613daf565b60405180910390f35b34801561053e57600080fd5b50610547611918565b6040516105549190613ae3565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f919061404d565b61192b565b005b34801561059257600080fd5b5061059b611946565b6040516105a89190613ae3565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d39190613bf9565b611959565b6040516105e59190613d19565b60405180910390f35b3480156105fa57600080fd5b5061061560048036038101906106109190613bf9565b61196b565b005b34801561062357600080fd5b5061063e60048036038101906106399190613dca565b61197d565b60405161064b9190613daf565b60405180910390f35b34801561066057600080fd5b50610669611a35565b005b34801561067757600080fd5b50610692600480360381019061068d91906140ec565b611a49565b005b3480156106a057600080fd5b506106bb60048036038101906106b6919061416f565b611aed565b005b3480156106c957600080fd5b506106d2611b07565b6040516106df9190613ae3565b60405180910390f35b3480156106f457600080fd5b506106fd611b1a565b60405161070a9190613cb6565b60405180910390f35b34801561071f57600080fd5b50610728611ba8565b6040516107359190613d19565b60405180910390f35b34801561074a57600080fd5b5061076560048036038101906107609190613bf9565b611bd2565b005b34801561077357600080fd5b5061077c611be4565b6040516107899190613cb6565b60405180910390f35b34801561079e57600080fd5b506107a7611c76565b6040516107b49190613ae3565b60405180910390f35b3480156107c957600080fd5b506107d2611c89565b6040516107df9190613daf565b60405180910390f35b3480156107f457600080fd5b5061080f600480360381019061080a91906141af565b611c8f565b005b34801561081d57600080fd5b50610826611d99565b005b34801561083457600080fd5b5061084f600480360381019061084a9190613dca565b611dcd565b60405161085c9190613daf565b60405180910390f35b34801561087157600080fd5b5061088c60048036038101906108879190614290565b611e74565b005b34801561089a57600080fd5b506108b560048036038101906108b0919061404d565b611fc7565b005b3480156108c357600080fd5b506108de60048036038101906108d99190614313565b611fe2565b005b3480156108ec57600080fd5b506108f5612098565b005b34801561090357600080fd5b5061091e60048036038101906109199190613bf9565b61236e565b60405161092b9190613cb6565b60405180910390f35b34801561094057600080fd5b5061095b60048036038101906109569190613e23565b6124c3565b005b34801561096957600080fd5b50610972612512565b60405161097f9190613ae3565b60405180910390f35b34801561099457600080fd5b5061099d612525565b6040516109aa9190613daf565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d59190613e23565b61252b565b005b3480156109e857600080fd5b50610a0360048036038101906109fe9190613bf9565b612550565b005b348015610a1157600080fd5b50610a2c6004803603810190610a279190614353565b612562565b604051610a399190613ae3565b60405180910390f35b348015610a4e57600080fd5b50610a696004803603810190610a649190613dca565b6125f6565b604051610a769190613daf565b60405180910390f35b348015610a8b57600080fd5b50610aa66004803603810190610aa19190613dca565b612608565b005b348015610ab457600080fd5b50610acf6004803603810190610aca9190613e23565b61268b565b005b610aeb6004803603810190610ae69190614393565b6126b0565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b4857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b785750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600033604051602001610b929190614428565b604051602081830303815290604052805190602001209050610bf8848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060115483612907565b610c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2e9061448f565b60405180910390fd5b60008211610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c71906144fb565b60405180910390fd5b81600c54610c88919061454a565b341015610cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc1906145d8565b60405180910390fd5b600b54601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483610d173361291e565b610d2191906145f8565b610d2b919061462c565b1115610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d63906146d2565b60405180910390fd5b600d5482610d78611350565b610d8291906145f8565b1115610dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba9061473e565b60405180910390fd5b600e60019054906101000a900460ff16610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e09906147aa565b60405180910390fd5b610e1c3383612975565b50505050565b600260095403610e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5e90614816565b60405180910390fd5b6002600981905550600e60039054906101000a900460ff16610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb590614882565b60405180910390fd5b60008111610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef8906148ee565b60405180910390fd5b600d5481610f0d611350565b610f1791906145f8565b1115610f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4f9061473e565b60405180910390fd5b80601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e3360016040518363ffffffff1660e01b8152600401610fb6929190614949565b602060405180830381865afa158015610fd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff79190614987565b14611037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e90614a26565b60405180910390fd5b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461108691906145f8565b92505081905550601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a3361dead6001856040518563ffffffff1660e01b81526004016110f19493929190614a7d565b600060405180830381600087803b15801561110b57600080fd5b505af115801561111f573d6000803e3d6000fd5b5050505061112d3382612975565b600160098190555050565b60606002805461114790614b04565b80601f016020809104026020016040519081016040528092919081815260200182805461117390614b04565b80156111c05780601f10611195576101008083540402835291602001916111c0565b820191906000526020600020905b8154815290600101906020018083116111a357829003601f168201915b5050505050905090565b60006111d582612993565b61120b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611341576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016112be929190614b35565b602060405180830381865afa1580156112db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ff9190614b73565b61134057806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016113379190613d19565b60405180910390fd5b5b61134b83836129f2565b505050565b600061135a612b98565b6001546000540303905090565b60126020528060005260406000206000915090505481565b611387612ba1565b80600e60006101000a81548160ff02191690831515021790555050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156114e2573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361141657611411848484612c1f565b6114ee565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161145f929190614b35565b602060405180830381865afa15801561147c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a09190614b73565b6114e157336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016114d89190613d19565b60405180910390fd5b5b6114ed848484612c1f565b5b50505050565b600c5481611502919061454a565b341015611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153b906145d8565b60405180910390fd5b600d5481611550611350565b61155a91906145f8565b111561159b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115929061473e565b60405180910390fd5b600b54816115a83361291e565b6115b291906145f8565b11156115f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ea90614bec565b60405180910390fd5b60008111611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d906144fb565b60405180910390fd5b600e60029054906101000a900460ff16611685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167c90614c58565b60405180910390fd5b61168f3382612975565b50565b61169a612ba1565b600047905060006064605a836116b0919061454a565b6116ba9190614ca7565b905060006064600a846116cd919061454a565b6116d79190614ca7565b9050600e60059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611741573d6000803e3d6000fd5b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156117aa573d6000803e3d6000fd5b50505050565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611900573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118345761182f848484612c2f565b61190c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161187d929190614b35565b602060405180830381865afa15801561189a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118be9190614b73565b6118ff57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016118f69190613d19565b60405180910390fd5b5b61190b848484612c2f565b5b50505050565b600b5481565b600e60049054906101000a900460ff1681565b611933612ba1565b80600a90816119429190614e7a565b5050565b600e60039054906101000a900460ff1681565b600061196482612c4f565b9050919050565b611973612ba1565b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119e4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611a3d612ba1565b611a476000612d1b565b565b611a51612ba1565b60008282905011611a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8e90614f98565b60405180910390fd5b60005b82829050811015611ae857611ad7838383818110611abb57611aba614fb8565b5b9050602002016020810190611ad09190613dca565b6001612975565b80611ae190614fe7565b9050611a9a565b505050565b611af5612ba1565b81601081905550806011819055505050565b600e60019054906101000a900460ff1681565b60138054611b2790614b04565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5390614b04565b8015611ba05780601f10611b7557610100808354040283529160200191611ba0565b820191906000526020600020905b815481529060010190602001808311611b8357829003601f168201915b505050505081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611bda612ba1565b80600c8190555050565b606060038054611bf390614b04565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1f90614b04565b8015611c6c5780601f10611c4157610100808354040283529160200191611c6c565b820191906000526020600020905b815481529060010190602001808311611c4f57829003601f168201915b5050505050905090565b600e60029054906101000a900460ff1681565b600c5481565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611d8a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611d07929190614b35565b602060405180830381865afa158015611d24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d489190614b73565b611d8957806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611d809190613d19565b60405180910390fd5b5b611d948383612de1565b505050565b611da1612ba1565b600e60049054906101000a900460ff1615600e60046101000a81548160ff021916908315150217905550565b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e8360016040518363ffffffff1660e01b8152600401611e2c929190614949565b602060405180830381865afa158015611e49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6d9190614987565b9050919050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611fb3573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ee757611ee285858585612f58565b611fc0565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611f30929190614b35565b602060405180830381865afa158015611f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f719190614b73565b611fb257336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611fa99190613d19565b60405180910390fd5b5b611fbf85858585612f58565b5b5050505050565b611fcf612ba1565b8060139081611fde9190614e7a565b5050565b611fea612ba1565b6000821161202d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120249061507b565b60405180910390fd5b6000612037611350565b9050600d54838261204891906145f8565b1115612089576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612080906150e7565b60405180910390fd5b6120938284612975565b505050565b6002600954036120dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d490614816565b60405180910390fd5b6002600981905550600e60039054906101000a900460ff16612134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212b90614882565b60405180910390fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e3360016040518363ffffffff1660e01b8152600401612193929190614949565b602060405180830381865afa1580156121b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d49190614987565b11612214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220b90615153565b60405180910390fd5b600d546001612221611350565b61222b91906145f8565b111561226c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122639061473e565b60405180910390fd5b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122bc91906145f8565b92505081905550601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a3361dead6001806040518563ffffffff1660e01b81526004016123279493929190615173565b600060405180830381600087803b15801561234157600080fd5b505af1158015612355573d6000803e3d6000fd5b50505050612364336001612975565b6001600981905550565b606061237982612993565b6123b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123af9061523d565b60405180910390fd5b60001515600e60049054906101000a900460ff1615150361246557601380546123e090614b04565b80601f016020809104026020016040519081016040528092919081815260200182805461240c90614b04565b80156124595780601f1061242e57610100808354040283529160200191612459565b820191906000526020600020905b81548152906001019060200180831161243c57829003601f168201915b505050505090506124be565b600061246f612fcb565b9050600081511161248f57604051806020016040528060008152506124ba565b806124998461305d565b6040516020016124aa9291906152e5565b6040516020818303038152906040525b9150505b919050565b6124cb612ba1565b600e60009054906101000a900460ff1615600e60006101000a81548160ff02191690831515021790555080600e60016101000a81548160ff02191690831515021790555050565b600e60009054906101000a900460ff1681565b600d5481565b612533612ba1565b80600e60036101000a81548160ff02191690831515021790555050565b612558612ba1565b80600b8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006126018261291e565b9050919050565b612610612ba1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361267f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267690615386565b60405180910390fd5b61268881612d1b565b50565b612693612ba1565b80600e60026101000a81548160ff02191690831515021790555050565b6000336040516020016126c39190614428565b604051602081830303815290604052805190602001209050612729838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060105483612907565b612768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275f9061448f565b60405180910390fd5b600c543410156127ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a4906145d8565b60405180910390fd5b600b54601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460016127fb3361291e565b61280591906145f8565b61280f919061462c565b1115612850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284790614bec565b60405180910390fd5b600d54600161285d611350565b61286791906145f8565b11156128a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289f9061473e565b60405180910390fd5b600e60009054906101000a900460ff166128f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ee906153f2565b60405180910390fd5b612902336001612975565b505050565b60008261291485846131bd565b1490509392505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b61298f828260405180602001604052806000815250613213565b5050565b60008161299e612b98565b111580156129ad575060005482105b80156129eb575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006129fd82612c4f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a64576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16612a836134c6565b73ffffffffffffffffffffffffffffffffffffffff1614612ae657612aaf81612aaa6134c6565b612562565b612ae5576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b612ba96134ce565b73ffffffffffffffffffffffffffffffffffffffff16612bc7611ba8565b73ffffffffffffffffffffffffffffffffffffffff1614612c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c149061545e565b60405180910390fd5b565b612c2a8383836134d6565b505050565b612c4a83838360405180602001604052806000815250611e74565b505050565b60008082905080612c5e612b98565b11612ce457600054811015612ce35760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612ce1575b60008103612cd7576004600083600190039350838152602001908152602001600020549050612cad565b8092505050612d16565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612de96134c6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e4d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612e5a6134c6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612f076134c6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612f4c9190613ae3565b60405180910390a35050565b612f638484846134d6565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612fc557612f8e8484848461387d565b612fc4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a8054612fda90614b04565b80601f016020809104026020016040519081016040528092919081815260200182805461300690614b04565b80156130535780601f1061302857610100808354040283529160200191613053565b820191906000526020600020905b81548152906001019060200180831161303657829003601f168201915b5050505050905090565b6060600082036130a4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131b8565b600082905060005b600082146130d65780806130bf90614fe7565b915050600a826130cf9190614ca7565b91506130ac565b60008167ffffffffffffffff8111156130f2576130f1613f22565b5b6040519080825280601f01601f1916602001820160405280156131245781602001600182028036833780820191505090505b5090505b600085146131b15760018261313d919061462c565b9150600a8561314c919061547e565b603061315891906145f8565b60f81b81838151811061316e5761316d614fb8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131aa9190614ca7565b9450613128565b8093505050505b919050565b60008082905060005b8451811015613208576131f3828683815181106131e6576131e5614fb8565b5b60200260200101516139cd565b9150808061320090614fe7565b9150506131c6565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361327f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083036132b9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132c660008583866139f8565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161332b600185146139fe565b901b60a042901b61333b86613a08565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b1461343f575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133ef600087848060010195508761387d565b613425576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061338057826000541461343a57600080fd5b6134aa565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613440575b8160008190555050506134c06000858386613a12565b50505050565b600033905090565b600033905090565b60006134e182612c4f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613548576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166135696134c6565b73ffffffffffffffffffffffffffffffffffffffff1614806135985750613597856135926134c6565b612562565b5b806135dd57506135a66134c6565b73ffffffffffffffffffffffffffffffffffffffff166135c5846111ca565b73ffffffffffffffffffffffffffffffffffffffff16145b905080613616576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361367c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61368985858560016139f8565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61378686613a08565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083160361380e576000600184019050600060046000838152602001908152602001600020540361380c57600054811461380b578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138768585856001613a12565b5050505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026138a36134c6565b8786866040518563ffffffff1660e01b81526004016138c594939291906154f3565b6020604051808303816000875af192505050801561390157506040513d601f19601f820116820180604052508101906138fe9190615554565b60015b61397a573d8060008114613931576040519150601f19603f3d011682016040523d82523d6000602084013e613936565b606091505b506000815103613972576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008183106139e5576139e08284613a18565b6139f0565b6139ef8383613a18565b5b905092915050565b50505050565b6000819050919050565b6000819050919050565b50505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a7881613a43565b8114613a8357600080fd5b50565b600081359050613a9581613a6f565b92915050565b600060208284031215613ab157613ab0613a39565b5b6000613abf84828501613a86565b91505092915050565b60008115159050919050565b613add81613ac8565b82525050565b6000602082019050613af86000830184613ad4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613b2357613b22613afe565b5b8235905067ffffffffffffffff811115613b4057613b3f613b03565b5b602083019150836020820283011115613b5c57613b5b613b08565b5b9250929050565b6000819050919050565b613b7681613b63565b8114613b8157600080fd5b50565b600081359050613b9381613b6d565b92915050565b600080600060408486031215613bb257613bb1613a39565b5b600084013567ffffffffffffffff811115613bd057613bcf613a3e565b5b613bdc86828701613b0d565b93509350506020613bef86828701613b84565b9150509250925092565b600060208284031215613c0f57613c0e613a39565b5b6000613c1d84828501613b84565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613c60578082015181840152602081019050613c45565b60008484015250505050565b6000601f19601f8301169050919050565b6000613c8882613c26565b613c928185613c31565b9350613ca2818560208601613c42565b613cab81613c6c565b840191505092915050565b60006020820190508181036000830152613cd08184613c7d565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d0382613cd8565b9050919050565b613d1381613cf8565b82525050565b6000602082019050613d2e6000830184613d0a565b92915050565b613d3d81613cf8565b8114613d4857600080fd5b50565b600081359050613d5a81613d34565b92915050565b60008060408385031215613d7757613d76613a39565b5b6000613d8585828601613d4b565b9250506020613d9685828601613b84565b9150509250929050565b613da981613b63565b82525050565b6000602082019050613dc46000830184613da0565b92915050565b600060208284031215613de057613ddf613a39565b5b6000613dee84828501613d4b565b91505092915050565b613e0081613ac8565b8114613e0b57600080fd5b50565b600081359050613e1d81613df7565b92915050565b600060208284031215613e3957613e38613a39565b5b6000613e4784828501613e0e565b91505092915050565b600080600060608486031215613e6957613e68613a39565b5b6000613e7786828701613d4b565b9350506020613e8886828701613d4b565b9250506040613e9986828701613b84565b9150509250925092565b6000819050919050565b6000613ec8613ec3613ebe84613cd8565b613ea3565b613cd8565b9050919050565b6000613eda82613ead565b9050919050565b6000613eec82613ecf565b9050919050565b613efc81613ee1565b82525050565b6000602082019050613f176000830184613ef3565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f5a82613c6c565b810181811067ffffffffffffffff82111715613f7957613f78613f22565b5b80604052505050565b6000613f8c613a2f565b9050613f988282613f51565b919050565b600067ffffffffffffffff821115613fb857613fb7613f22565b5b613fc182613c6c565b9050602081019050919050565b82818337600083830152505050565b6000613ff0613feb84613f9d565b613f82565b90508281526020810184848401111561400c5761400b613f1d565b5b614017848285613fce565b509392505050565b600082601f83011261403457614033613afe565b5b8135614044848260208601613fdd565b91505092915050565b60006020828403121561406357614062613a39565b5b600082013567ffffffffffffffff81111561408157614080613a3e565b5b61408d8482850161401f565b91505092915050565b60008083601f8401126140ac576140ab613afe565b5b8235905067ffffffffffffffff8111156140c9576140c8613b03565b5b6020830191508360208202830111156140e5576140e4613b08565b5b9250929050565b6000806020838503121561410357614102613a39565b5b600083013567ffffffffffffffff81111561412157614120613a3e565b5b61412d85828601614096565b92509250509250929050565b6000819050919050565b61414c81614139565b811461415757600080fd5b50565b60008135905061416981614143565b92915050565b6000806040838503121561418657614185613a39565b5b60006141948582860161415a565b92505060206141a58582860161415a565b9150509250929050565b600080604083850312156141c6576141c5613a39565b5b60006141d485828601613d4b565b92505060206141e585828601613e0e565b9150509250929050565b600067ffffffffffffffff82111561420a57614209613f22565b5b61421382613c6c565b9050602081019050919050565b600061423361422e846141ef565b613f82565b90508281526020810184848401111561424f5761424e613f1d565b5b61425a848285613fce565b509392505050565b600082601f83011261427757614276613afe565b5b8135614287848260208601614220565b91505092915050565b600080600080608085870312156142aa576142a9613a39565b5b60006142b887828801613d4b565b94505060206142c987828801613d4b565b93505060406142da87828801613b84565b925050606085013567ffffffffffffffff8111156142fb576142fa613a3e565b5b61430787828801614262565b91505092959194509250565b6000806040838503121561432a57614329613a39565b5b600061433885828601613b84565b925050602061434985828601613d4b565b9150509250929050565b6000806040838503121561436a57614369613a39565b5b600061437885828601613d4b565b925050602061438985828601613d4b565b9150509250929050565b600080602083850312156143aa576143a9613a39565b5b600083013567ffffffffffffffff8111156143c8576143c7613a3e565b5b6143d485828601613b0d565b92509250509250929050565b60008160601b9050919050565b60006143f8826143e0565b9050919050565b600061440a826143ed565b9050919050565b61442261441d82613cf8565b6143ff565b82525050565b60006144348284614411565b60148201915081905092915050565b7f496e636f72726563742057686974656c6973742050726f6f6600000000000000600082015250565b6000614479601983613c31565b915061448482614443565b602082019050919050565b600060208201905081810360008301526144a88161446c565b9050919050565b7f506c6561736520656e7465722061206e756d6265720000000000000000000000600082015250565b60006144e5601583613c31565b91506144f0826144af565b602082019050919050565b60006020820190508181036000830152614514816144d8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061455582613b63565b915061456083613b63565b925082820261456e81613b63565b915082820484148315176145855761458461451b565b5b5092915050565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b60006145c2601d83613c31565b91506145cd8261458c565b602082019050919050565b600060208201905081810360008301526145f1816145b5565b9050919050565b600061460382613b63565b915061460e83613b63565b92508282019050808211156146265761462561451b565b5b92915050565b600061463782613b63565b915061464283613b63565b925082820390508181111561465a5761465961451b565b5b92915050565b7f43616e206e6f742065786365656420746865206d6178206d696e74207065722060008201527f77616c6c65740000000000000000000000000000000000000000000000000000602082015250565b60006146bc602683613c31565b91506146c782614660565b604082019050919050565b600060208201905081810360008301526146eb816146af565b9050919050565b7f546f74616c20537570706c792045786365656465640000000000000000000000600082015250565b6000614728601583613c31565b9150614733826146f2565b602082019050919050565b600060208201905081810360008301526147578161471b565b9050919050565b7f50686173652054776f204d696e74206973206e6f74206c697665207965740000600082015250565b6000614794601e83613c31565b915061479f8261475e565b602082019050919050565b600060208201905081810360008301526147c381614787565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614800601f83613c31565b915061480b826147ca565b602082019050919050565b6000602082019050818103600083015261482f816147f3565b9050919050565b7f4275726e696e6720706572696f64206973206e6f742061637469766520796574600082015250565b600061486c602083613c31565b915061487782614836565b602082019050919050565b6000602082019050818103600083015261489b8161485f565b9050919050565b7f436f756e74206d7573742062652067726561746572207468616e207a65726f00600082015250565b60006148d8601f83613c31565b91506148e3826148a2565b602082019050919050565b60006020820190508181036000830152614907816148cb565b9050919050565b6000819050919050565b600061493361492e6149298461490e565b613ea3565b613b63565b9050919050565b61494381614918565b82525050565b600060408201905061495e6000830185613d0a565b61496b602083018461493a565b9392505050565b60008151905061498181613b6d565b92915050565b60006020828403121561499d5761499c613a39565b5b60006149ab84828501614972565b91505092915050565b7f496e636f727265637420616d6f756e74206f662047656e6573697320546f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a10602283613c31565b9150614a1b826149b4565b604082019050919050565b60006020820190508181036000830152614a3f81614a03565b9050919050565b600082825260208201905092915050565b50565b6000614a67600083614a46565b9150614a7282614a57565b600082019050919050565b600060a082019050614a926000830187613d0a565b614a9f6020830186613d0a565b614aac604083018561493a565b614ab96060830184613da0565b8181036080830152614aca81614a5a565b905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614b1c57607f821691505b602082108103614b2f57614b2e614ad5565b5b50919050565b6000604082019050614b4a6000830185613d0a565b614b576020830184613d0a565b9392505050565b600081519050614b6d81613df7565b92915050565b600060208284031215614b8957614b88613a39565b5b6000614b9784828501614b5e565b91505092915050565b7f43616e206e6f74206d696e74206d6f7265207468616e20310000000000000000600082015250565b6000614bd6601883613c31565b9150614be182614ba0565b602082019050919050565b60006020820190508181036000830152614c0581614bc9565b9050919050565b7f5075626c6963204d696e74206973206e6f74206c697665207965740000000000600082015250565b6000614c42601b83613c31565b9150614c4d82614c0c565b602082019050919050565b60006020820190508181036000830152614c7181614c35565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614cb282613b63565b9150614cbd83613b63565b925082614ccd57614ccc614c78565b5b828204905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614d3a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614cfd565b614d448683614cfd565b95508019841693508086168417925050509392505050565b6000614d77614d72614d6d84613b63565b613ea3565b613b63565b9050919050565b6000819050919050565b614d9183614d5c565b614da5614d9d82614d7e565b848454614d0a565b825550505050565b600090565b614dba614dad565b614dc5818484614d88565b505050565b5b81811015614de957614dde600082614db2565b600181019050614dcb565b5050565b601f821115614e2e57614dff81614cd8565b614e0884614ced565b81016020851015614e17578190505b614e2b614e2385614ced565b830182614dca565b50505b505050565b600082821c905092915050565b6000614e5160001984600802614e33565b1980831691505092915050565b6000614e6a8383614e40565b9150826002028217905092915050565b614e8382613c26565b67ffffffffffffffff811115614e9c57614e9b613f22565b5b614ea68254614b04565b614eb1828285614ded565b600060209050601f831160018114614ee45760008415614ed2578287015190505b614edc8582614e5e565b865550614f44565b601f198416614ef286614cd8565b60005b82811015614f1a57848901518255600182019150602085019450602081019050614ef5565b86831015614f375784890151614f33601f891682614e40565b8355505b6001600288020188555050505b505050505050565b7f4e656564206174206c65617374206f6e65206164647265737300000000000000600082015250565b6000614f82601983613c31565b9150614f8d82614f4c565b602082019050919050565b60006020820190508181036000830152614fb181614f75565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614ff282613b63565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036150245761502361451b565b5b600182019050919050565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b6000615065601b83613c31565b91506150708261502f565b602082019050919050565b6000602082019050818103600083015261509481615058565b9050919050565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b60006150d1601683613c31565b91506150dc8261509b565b602082019050919050565b60006020820190508181036000830152615100816150c4565b9050919050565b7f4e6f7420656e6f7567682047656e6573697320546f6b656e7300000000000000600082015250565b600061513d601983613c31565b915061514882615107565b602082019050919050565b6000602082019050818103600083015261516c81615130565b9050919050565b600060a0820190506151886000830187613d0a565b6151956020830186613d0a565b6151a2604083018561493a565b6151af606083018461493a565b81810360808301526151c081614a5a565b905095945050505050565b7f455243373231414d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b6000615227603083613c31565b9150615232826151cb565b604082019050919050565b600060208201905081810360008301526152568161521a565b9050919050565b600081905092915050565b600061527382613c26565b61527d818561525d565b935061528d818560208601613c42565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006152cf60058361525d565b91506152da82615299565b600582019050919050565b60006152f18285615268565b91506152fd8284615268565b9150615308826152c2565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615370602683613c31565b915061537b82615314565b604082019050919050565b6000602082019050818103600083015261539f81615363565b9050919050565b7f5068617365204f6e65204d696e74206973206e6f74206c697665207965740000600082015250565b60006153dc601e83613c31565b91506153e7826153a6565b602082019050919050565b6000602082019050818103600083015261540b816153cf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615448602083613c31565b915061545382615412565b602082019050919050565b600060208201905081810360008301526154778161543b565b9050919050565b600061548982613b63565b915061549483613b63565b9250826154a4576154a3614c78565b5b828206905092915050565b600081519050919050565b60006154c5826154af565b6154cf8185614a46565b93506154df818560208601613c42565b6154e881613c6c565b840191505092915050565b60006080820190506155086000830187613d0a565b6155156020830186613d0a565b6155226040830185613da0565b818103606083015261553481846154ba565b905095945050505050565b60008151905061554e81613a6f565b92915050565b60006020828403121561556a57615569613a39565b5b60006155788482850161553f565b9150509291505056fea26469706673582212203e5806925d67c253f41a7b305f0722fa41dcf9a5207e3b05f8ae79f3790af6af64736f6c63430008110033697066733a2f2f516d615543525471704a45705578533278366967726442585163696f516e653648626d57344c6f706e32584354540000000000000000000000002e0d4945d949aba5a99d24ee95a9d9c60942a926

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c8063802ebfa311610175578063c2f637dc116100dc578063daa2a85911610095578063ed64892b1161006f578063ed64892b14610a42578063f2fde38b14610a7f578063f55e7fc714610aa8578063fe996f0114610ad1576102ae565b8063daa2a859146109b3578063e268e4d3146109dc578063e985e9c514610a05576102ae565b8063c2f637dc146108b7578063c6fe62b0146108e0578063c87b56dd146108f7578063c90f723914610934578063d45530431461095d578063d5abeb0114610988576102ae565b8063a035b1fe1161012e578063a035b1fe146107bd578063a22cb465146107e8578063a475b5dd14610811578063a75193c714610828578063b88d4fde14610865578063bbaac02f1461088e576102ae565b8063802ebfa3146106bd5780638cc54e7f146106e85780638da5cb5b1461071357806391b7f5ed1461073e57806395d89b41146107675780639b001f4514610792576102ae565b806341f43434116102195780636352211e116101d25780636352211e146105b15780636f8b44b0146105ee57806370a0823114610617578063715018a614610654578063729ad39e1461066b57806377aeead914610694576102ae565b806341f43434146104b357806342842e0e146104de578063453c231014610507578063518302271461053257806355f804b31461055d5780635dc96d1614610586576102ae565b806318160ddd1161026b57806318160ddd146103c65780631fd2ff85146103f15780632131d45c1461042e57806323b872dd146104575780632db11544146104805780633ccfd60b1461049c576102ae565b806301ffc9a7146102b357806303fd03ea146102f057806305cefb9b1461030c57806306fdde0314610335578063081812fc14610360578063095ea7b31461039d575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190613a9b565b610aed565b6040516102e79190613ae3565b60405180910390f35b61030a60048036038101906103059190613b99565b610b7f565b005b34801561031857600080fd5b50610333600480360381019061032e9190613bf9565b610e22565b005b34801561034157600080fd5b5061034a611138565b6040516103579190613cb6565b60405180910390f35b34801561036c57600080fd5b5061038760048036038101906103829190613bf9565b6111ca565b6040516103949190613d19565b60405180910390f35b3480156103a957600080fd5b506103c460048036038101906103bf9190613d60565b611246565b005b3480156103d257600080fd5b506103db611350565b6040516103e89190613daf565b60405180910390f35b3480156103fd57600080fd5b5061041860048036038101906104139190613dca565b611367565b6040516104259190613daf565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190613e23565b61137f565b005b34801561046357600080fd5b5061047e60048036038101906104799190613e50565b6113a4565b005b61049a60048036038101906104959190613bf9565b6114f4565b005b3480156104a857600080fd5b506104b1611692565b005b3480156104bf57600080fd5b506104c86117b0565b6040516104d59190613f02565b60405180910390f35b3480156104ea57600080fd5b5061050560048036038101906105009190613e50565b6117c2565b005b34801561051357600080fd5b5061051c611912565b6040516105299190613daf565b60405180910390f35b34801561053e57600080fd5b50610547611918565b6040516105549190613ae3565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f919061404d565b61192b565b005b34801561059257600080fd5b5061059b611946565b6040516105a89190613ae3565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d39190613bf9565b611959565b6040516105e59190613d19565b60405180910390f35b3480156105fa57600080fd5b5061061560048036038101906106109190613bf9565b61196b565b005b34801561062357600080fd5b5061063e60048036038101906106399190613dca565b61197d565b60405161064b9190613daf565b60405180910390f35b34801561066057600080fd5b50610669611a35565b005b34801561067757600080fd5b50610692600480360381019061068d91906140ec565b611a49565b005b3480156106a057600080fd5b506106bb60048036038101906106b6919061416f565b611aed565b005b3480156106c957600080fd5b506106d2611b07565b6040516106df9190613ae3565b60405180910390f35b3480156106f457600080fd5b506106fd611b1a565b60405161070a9190613cb6565b60405180910390f35b34801561071f57600080fd5b50610728611ba8565b6040516107359190613d19565b60405180910390f35b34801561074a57600080fd5b5061076560048036038101906107609190613bf9565b611bd2565b005b34801561077357600080fd5b5061077c611be4565b6040516107899190613cb6565b60405180910390f35b34801561079e57600080fd5b506107a7611c76565b6040516107b49190613ae3565b60405180910390f35b3480156107c957600080fd5b506107d2611c89565b6040516107df9190613daf565b60405180910390f35b3480156107f457600080fd5b5061080f600480360381019061080a91906141af565b611c8f565b005b34801561081d57600080fd5b50610826611d99565b005b34801561083457600080fd5b5061084f600480360381019061084a9190613dca565b611dcd565b60405161085c9190613daf565b60405180910390f35b34801561087157600080fd5b5061088c60048036038101906108879190614290565b611e74565b005b34801561089a57600080fd5b506108b560048036038101906108b0919061404d565b611fc7565b005b3480156108c357600080fd5b506108de60048036038101906108d99190614313565b611fe2565b005b3480156108ec57600080fd5b506108f5612098565b005b34801561090357600080fd5b5061091e60048036038101906109199190613bf9565b61236e565b60405161092b9190613cb6565b60405180910390f35b34801561094057600080fd5b5061095b60048036038101906109569190613e23565b6124c3565b005b34801561096957600080fd5b50610972612512565b60405161097f9190613ae3565b60405180910390f35b34801561099457600080fd5b5061099d612525565b6040516109aa9190613daf565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d59190613e23565b61252b565b005b3480156109e857600080fd5b50610a0360048036038101906109fe9190613bf9565b612550565b005b348015610a1157600080fd5b50610a2c6004803603810190610a279190614353565b612562565b604051610a399190613ae3565b60405180910390f35b348015610a4e57600080fd5b50610a696004803603810190610a649190613dca565b6125f6565b604051610a769190613daf565b60405180910390f35b348015610a8b57600080fd5b50610aa66004803603810190610aa19190613dca565b612608565b005b348015610ab457600080fd5b50610acf6004803603810190610aca9190613e23565b61268b565b005b610aeb6004803603810190610ae69190614393565b6126b0565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b4857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b785750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600033604051602001610b929190614428565b604051602081830303815290604052805190602001209050610bf8848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060115483612907565b610c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2e9061448f565b60405180910390fd5b60008211610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c71906144fb565b60405180910390fd5b81600c54610c88919061454a565b341015610cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc1906145d8565b60405180910390fd5b600b54601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483610d173361291e565b610d2191906145f8565b610d2b919061462c565b1115610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d63906146d2565b60405180910390fd5b600d5482610d78611350565b610d8291906145f8565b1115610dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba9061473e565b60405180910390fd5b600e60019054906101000a900460ff16610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e09906147aa565b60405180910390fd5b610e1c3383612975565b50505050565b600260095403610e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5e90614816565b60405180910390fd5b6002600981905550600e60039054906101000a900460ff16610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb590614882565b60405180910390fd5b60008111610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef8906148ee565b60405180910390fd5b600d5481610f0d611350565b610f1791906145f8565b1115610f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4f9061473e565b60405180910390fd5b80601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e3360016040518363ffffffff1660e01b8152600401610fb6929190614949565b602060405180830381865afa158015610fd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff79190614987565b14611037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e90614a26565b60405180910390fd5b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461108691906145f8565b92505081905550601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a3361dead6001856040518563ffffffff1660e01b81526004016110f19493929190614a7d565b600060405180830381600087803b15801561110b57600080fd5b505af115801561111f573d6000803e3d6000fd5b5050505061112d3382612975565b600160098190555050565b60606002805461114790614b04565b80601f016020809104026020016040519081016040528092919081815260200182805461117390614b04565b80156111c05780601f10611195576101008083540402835291602001916111c0565b820191906000526020600020905b8154815290600101906020018083116111a357829003601f168201915b5050505050905090565b60006111d582612993565b61120b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611341576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016112be929190614b35565b602060405180830381865afa1580156112db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ff9190614b73565b61134057806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016113379190613d19565b60405180910390fd5b5b61134b83836129f2565b505050565b600061135a612b98565b6001546000540303905090565b60126020528060005260406000206000915090505481565b611387612ba1565b80600e60006101000a81548160ff02191690831515021790555050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156114e2573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361141657611411848484612c1f565b6114ee565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161145f929190614b35565b602060405180830381865afa15801561147c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a09190614b73565b6114e157336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016114d89190613d19565b60405180910390fd5b5b6114ed848484612c1f565b5b50505050565b600c5481611502919061454a565b341015611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153b906145d8565b60405180910390fd5b600d5481611550611350565b61155a91906145f8565b111561159b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115929061473e565b60405180910390fd5b600b54816115a83361291e565b6115b291906145f8565b11156115f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ea90614bec565b60405180910390fd5b60008111611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d906144fb565b60405180910390fd5b600e60029054906101000a900460ff16611685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167c90614c58565b60405180910390fd5b61168f3382612975565b50565b61169a612ba1565b600047905060006064605a836116b0919061454a565b6116ba9190614ca7565b905060006064600a846116cd919061454a565b6116d79190614ca7565b9050600e60059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611741573d6000803e3d6000fd5b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156117aa573d6000803e3d6000fd5b50505050565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611900573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118345761182f848484612c2f565b61190c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161187d929190614b35565b602060405180830381865afa15801561189a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118be9190614b73565b6118ff57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016118f69190613d19565b60405180910390fd5b5b61190b848484612c2f565b5b50505050565b600b5481565b600e60049054906101000a900460ff1681565b611933612ba1565b80600a90816119429190614e7a565b5050565b600e60039054906101000a900460ff1681565b600061196482612c4f565b9050919050565b611973612ba1565b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119e4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611a3d612ba1565b611a476000612d1b565b565b611a51612ba1565b60008282905011611a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8e90614f98565b60405180910390fd5b60005b82829050811015611ae857611ad7838383818110611abb57611aba614fb8565b5b9050602002016020810190611ad09190613dca565b6001612975565b80611ae190614fe7565b9050611a9a565b505050565b611af5612ba1565b81601081905550806011819055505050565b600e60019054906101000a900460ff1681565b60138054611b2790614b04565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5390614b04565b8015611ba05780601f10611b7557610100808354040283529160200191611ba0565b820191906000526020600020905b815481529060010190602001808311611b8357829003601f168201915b505050505081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611bda612ba1565b80600c8190555050565b606060038054611bf390614b04565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1f90614b04565b8015611c6c5780601f10611c4157610100808354040283529160200191611c6c565b820191906000526020600020905b815481529060010190602001808311611c4f57829003601f168201915b5050505050905090565b600e60029054906101000a900460ff1681565b600c5481565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611d8a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611d07929190614b35565b602060405180830381865afa158015611d24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d489190614b73565b611d8957806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611d809190613d19565b60405180910390fd5b5b611d948383612de1565b505050565b611da1612ba1565b600e60049054906101000a900460ff1615600e60046101000a81548160ff021916908315150217905550565b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e8360016040518363ffffffff1660e01b8152600401611e2c929190614949565b602060405180830381865afa158015611e49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6d9190614987565b9050919050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611fb3573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ee757611ee285858585612f58565b611fc0565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611f30929190614b35565b602060405180830381865afa158015611f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f719190614b73565b611fb257336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611fa99190613d19565b60405180910390fd5b5b611fbf85858585612f58565b5b5050505050565b611fcf612ba1565b8060139081611fde9190614e7a565b5050565b611fea612ba1565b6000821161202d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120249061507b565b60405180910390fd5b6000612037611350565b9050600d54838261204891906145f8565b1115612089576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612080906150e7565b60405180910390fd5b6120938284612975565b505050565b6002600954036120dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d490614816565b60405180910390fd5b6002600981905550600e60039054906101000a900460ff16612134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212b90614882565b60405180910390fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e3360016040518363ffffffff1660e01b8152600401612193929190614949565b602060405180830381865afa1580156121b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d49190614987565b11612214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220b90615153565b60405180910390fd5b600d546001612221611350565b61222b91906145f8565b111561226c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122639061473e565b60405180910390fd5b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122bc91906145f8565b92505081905550601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a3361dead6001806040518563ffffffff1660e01b81526004016123279493929190615173565b600060405180830381600087803b15801561234157600080fd5b505af1158015612355573d6000803e3d6000fd5b50505050612364336001612975565b6001600981905550565b606061237982612993565b6123b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123af9061523d565b60405180910390fd5b60001515600e60049054906101000a900460ff1615150361246557601380546123e090614b04565b80601f016020809104026020016040519081016040528092919081815260200182805461240c90614b04565b80156124595780601f1061242e57610100808354040283529160200191612459565b820191906000526020600020905b81548152906001019060200180831161243c57829003601f168201915b505050505090506124be565b600061246f612fcb565b9050600081511161248f57604051806020016040528060008152506124ba565b806124998461305d565b6040516020016124aa9291906152e5565b6040516020818303038152906040525b9150505b919050565b6124cb612ba1565b600e60009054906101000a900460ff1615600e60006101000a81548160ff02191690831515021790555080600e60016101000a81548160ff02191690831515021790555050565b600e60009054906101000a900460ff1681565b600d5481565b612533612ba1565b80600e60036101000a81548160ff02191690831515021790555050565b612558612ba1565b80600b8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006126018261291e565b9050919050565b612610612ba1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361267f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267690615386565b60405180910390fd5b61268881612d1b565b50565b612693612ba1565b80600e60026101000a81548160ff02191690831515021790555050565b6000336040516020016126c39190614428565b604051602081830303815290604052805190602001209050612729838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060105483612907565b612768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275f9061448f565b60405180910390fd5b600c543410156127ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a4906145d8565b60405180910390fd5b600b54601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460016127fb3361291e565b61280591906145f8565b61280f919061462c565b1115612850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284790614bec565b60405180910390fd5b600d54600161285d611350565b61286791906145f8565b11156128a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289f9061473e565b60405180910390fd5b600e60009054906101000a900460ff166128f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ee906153f2565b60405180910390fd5b612902336001612975565b505050565b60008261291485846131bd565b1490509392505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b61298f828260405180602001604052806000815250613213565b5050565b60008161299e612b98565b111580156129ad575060005482105b80156129eb575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006129fd82612c4f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a64576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16612a836134c6565b73ffffffffffffffffffffffffffffffffffffffff1614612ae657612aaf81612aaa6134c6565b612562565b612ae5576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b612ba96134ce565b73ffffffffffffffffffffffffffffffffffffffff16612bc7611ba8565b73ffffffffffffffffffffffffffffffffffffffff1614612c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c149061545e565b60405180910390fd5b565b612c2a8383836134d6565b505050565b612c4a83838360405180602001604052806000815250611e74565b505050565b60008082905080612c5e612b98565b11612ce457600054811015612ce35760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612ce1575b60008103612cd7576004600083600190039350838152602001908152602001600020549050612cad565b8092505050612d16565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612de96134c6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e4d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612e5a6134c6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612f076134c6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612f4c9190613ae3565b60405180910390a35050565b612f638484846134d6565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612fc557612f8e8484848461387d565b612fc4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a8054612fda90614b04565b80601f016020809104026020016040519081016040528092919081815260200182805461300690614b04565b80156130535780601f1061302857610100808354040283529160200191613053565b820191906000526020600020905b81548152906001019060200180831161303657829003601f168201915b5050505050905090565b6060600082036130a4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131b8565b600082905060005b600082146130d65780806130bf90614fe7565b915050600a826130cf9190614ca7565b91506130ac565b60008167ffffffffffffffff8111156130f2576130f1613f22565b5b6040519080825280601f01601f1916602001820160405280156131245781602001600182028036833780820191505090505b5090505b600085146131b15760018261313d919061462c565b9150600a8561314c919061547e565b603061315891906145f8565b60f81b81838151811061316e5761316d614fb8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131aa9190614ca7565b9450613128565b8093505050505b919050565b60008082905060005b8451811015613208576131f3828683815181106131e6576131e5614fb8565b5b60200260200101516139cd565b9150808061320090614fe7565b9150506131c6565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361327f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083036132b9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132c660008583866139f8565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161332b600185146139fe565b901b60a042901b61333b86613a08565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b1461343f575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133ef600087848060010195508761387d565b613425576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061338057826000541461343a57600080fd5b6134aa565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613440575b8160008190555050506134c06000858386613a12565b50505050565b600033905090565b600033905090565b60006134e182612c4f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613548576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166135696134c6565b73ffffffffffffffffffffffffffffffffffffffff1614806135985750613597856135926134c6565b612562565b5b806135dd57506135a66134c6565b73ffffffffffffffffffffffffffffffffffffffff166135c5846111ca565b73ffffffffffffffffffffffffffffffffffffffff16145b905080613616576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361367c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61368985858560016139f8565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61378686613a08565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083160361380e576000600184019050600060046000838152602001908152602001600020540361380c57600054811461380b578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138768585856001613a12565b5050505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026138a36134c6565b8786866040518563ffffffff1660e01b81526004016138c594939291906154f3565b6020604051808303816000875af192505050801561390157506040513d601f19601f820116820180604052508101906138fe9190615554565b60015b61397a573d8060008114613931576040519150601f19603f3d011682016040523d82523d6000602084013e613936565b606091505b506000815103613972576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008183106139e5576139e08284613a18565b6139f0565b6139ef8383613a18565b5b905092915050565b50505050565b6000819050919050565b6000819050919050565b50505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a7881613a43565b8114613a8357600080fd5b50565b600081359050613a9581613a6f565b92915050565b600060208284031215613ab157613ab0613a39565b5b6000613abf84828501613a86565b91505092915050565b60008115159050919050565b613add81613ac8565b82525050565b6000602082019050613af86000830184613ad4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613b2357613b22613afe565b5b8235905067ffffffffffffffff811115613b4057613b3f613b03565b5b602083019150836020820283011115613b5c57613b5b613b08565b5b9250929050565b6000819050919050565b613b7681613b63565b8114613b8157600080fd5b50565b600081359050613b9381613b6d565b92915050565b600080600060408486031215613bb257613bb1613a39565b5b600084013567ffffffffffffffff811115613bd057613bcf613a3e565b5b613bdc86828701613b0d565b93509350506020613bef86828701613b84565b9150509250925092565b600060208284031215613c0f57613c0e613a39565b5b6000613c1d84828501613b84565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613c60578082015181840152602081019050613c45565b60008484015250505050565b6000601f19601f8301169050919050565b6000613c8882613c26565b613c928185613c31565b9350613ca2818560208601613c42565b613cab81613c6c565b840191505092915050565b60006020820190508181036000830152613cd08184613c7d565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d0382613cd8565b9050919050565b613d1381613cf8565b82525050565b6000602082019050613d2e6000830184613d0a565b92915050565b613d3d81613cf8565b8114613d4857600080fd5b50565b600081359050613d5a81613d34565b92915050565b60008060408385031215613d7757613d76613a39565b5b6000613d8585828601613d4b565b9250506020613d9685828601613b84565b9150509250929050565b613da981613b63565b82525050565b6000602082019050613dc46000830184613da0565b92915050565b600060208284031215613de057613ddf613a39565b5b6000613dee84828501613d4b565b91505092915050565b613e0081613ac8565b8114613e0b57600080fd5b50565b600081359050613e1d81613df7565b92915050565b600060208284031215613e3957613e38613a39565b5b6000613e4784828501613e0e565b91505092915050565b600080600060608486031215613e6957613e68613a39565b5b6000613e7786828701613d4b565b9350506020613e8886828701613d4b565b9250506040613e9986828701613b84565b9150509250925092565b6000819050919050565b6000613ec8613ec3613ebe84613cd8565b613ea3565b613cd8565b9050919050565b6000613eda82613ead565b9050919050565b6000613eec82613ecf565b9050919050565b613efc81613ee1565b82525050565b6000602082019050613f176000830184613ef3565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f5a82613c6c565b810181811067ffffffffffffffff82111715613f7957613f78613f22565b5b80604052505050565b6000613f8c613a2f565b9050613f988282613f51565b919050565b600067ffffffffffffffff821115613fb857613fb7613f22565b5b613fc182613c6c565b9050602081019050919050565b82818337600083830152505050565b6000613ff0613feb84613f9d565b613f82565b90508281526020810184848401111561400c5761400b613f1d565b5b614017848285613fce565b509392505050565b600082601f83011261403457614033613afe565b5b8135614044848260208601613fdd565b91505092915050565b60006020828403121561406357614062613a39565b5b600082013567ffffffffffffffff81111561408157614080613a3e565b5b61408d8482850161401f565b91505092915050565b60008083601f8401126140ac576140ab613afe565b5b8235905067ffffffffffffffff8111156140c9576140c8613b03565b5b6020830191508360208202830111156140e5576140e4613b08565b5b9250929050565b6000806020838503121561410357614102613a39565b5b600083013567ffffffffffffffff81111561412157614120613a3e565b5b61412d85828601614096565b92509250509250929050565b6000819050919050565b61414c81614139565b811461415757600080fd5b50565b60008135905061416981614143565b92915050565b6000806040838503121561418657614185613a39565b5b60006141948582860161415a565b92505060206141a58582860161415a565b9150509250929050565b600080604083850312156141c6576141c5613a39565b5b60006141d485828601613d4b565b92505060206141e585828601613e0e565b9150509250929050565b600067ffffffffffffffff82111561420a57614209613f22565b5b61421382613c6c565b9050602081019050919050565b600061423361422e846141ef565b613f82565b90508281526020810184848401111561424f5761424e613f1d565b5b61425a848285613fce565b509392505050565b600082601f83011261427757614276613afe565b5b8135614287848260208601614220565b91505092915050565b600080600080608085870312156142aa576142a9613a39565b5b60006142b887828801613d4b565b94505060206142c987828801613d4b565b93505060406142da87828801613b84565b925050606085013567ffffffffffffffff8111156142fb576142fa613a3e565b5b61430787828801614262565b91505092959194509250565b6000806040838503121561432a57614329613a39565b5b600061433885828601613b84565b925050602061434985828601613d4b565b9150509250929050565b6000806040838503121561436a57614369613a39565b5b600061437885828601613d4b565b925050602061438985828601613d4b565b9150509250929050565b600080602083850312156143aa576143a9613a39565b5b600083013567ffffffffffffffff8111156143c8576143c7613a3e565b5b6143d485828601613b0d565b92509250509250929050565b60008160601b9050919050565b60006143f8826143e0565b9050919050565b600061440a826143ed565b9050919050565b61442261441d82613cf8565b6143ff565b82525050565b60006144348284614411565b60148201915081905092915050565b7f496e636f72726563742057686974656c6973742050726f6f6600000000000000600082015250565b6000614479601983613c31565b915061448482614443565b602082019050919050565b600060208201905081810360008301526144a88161446c565b9050919050565b7f506c6561736520656e7465722061206e756d6265720000000000000000000000600082015250565b60006144e5601583613c31565b91506144f0826144af565b602082019050919050565b60006020820190508181036000830152614514816144d8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061455582613b63565b915061456083613b63565b925082820261456e81613b63565b915082820484148315176145855761458461451b565b5b5092915050565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b60006145c2601d83613c31565b91506145cd8261458c565b602082019050919050565b600060208201905081810360008301526145f1816145b5565b9050919050565b600061460382613b63565b915061460e83613b63565b92508282019050808211156146265761462561451b565b5b92915050565b600061463782613b63565b915061464283613b63565b925082820390508181111561465a5761465961451b565b5b92915050565b7f43616e206e6f742065786365656420746865206d6178206d696e74207065722060008201527f77616c6c65740000000000000000000000000000000000000000000000000000602082015250565b60006146bc602683613c31565b91506146c782614660565b604082019050919050565b600060208201905081810360008301526146eb816146af565b9050919050565b7f546f74616c20537570706c792045786365656465640000000000000000000000600082015250565b6000614728601583613c31565b9150614733826146f2565b602082019050919050565b600060208201905081810360008301526147578161471b565b9050919050565b7f50686173652054776f204d696e74206973206e6f74206c697665207965740000600082015250565b6000614794601e83613c31565b915061479f8261475e565b602082019050919050565b600060208201905081810360008301526147c381614787565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614800601f83613c31565b915061480b826147ca565b602082019050919050565b6000602082019050818103600083015261482f816147f3565b9050919050565b7f4275726e696e6720706572696f64206973206e6f742061637469766520796574600082015250565b600061486c602083613c31565b915061487782614836565b602082019050919050565b6000602082019050818103600083015261489b8161485f565b9050919050565b7f436f756e74206d7573742062652067726561746572207468616e207a65726f00600082015250565b60006148d8601f83613c31565b91506148e3826148a2565b602082019050919050565b60006020820190508181036000830152614907816148cb565b9050919050565b6000819050919050565b600061493361492e6149298461490e565b613ea3565b613b63565b9050919050565b61494381614918565b82525050565b600060408201905061495e6000830185613d0a565b61496b602083018461493a565b9392505050565b60008151905061498181613b6d565b92915050565b60006020828403121561499d5761499c613a39565b5b60006149ab84828501614972565b91505092915050565b7f496e636f727265637420616d6f756e74206f662047656e6573697320546f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a10602283613c31565b9150614a1b826149b4565b604082019050919050565b60006020820190508181036000830152614a3f81614a03565b9050919050565b600082825260208201905092915050565b50565b6000614a67600083614a46565b9150614a7282614a57565b600082019050919050565b600060a082019050614a926000830187613d0a565b614a9f6020830186613d0a565b614aac604083018561493a565b614ab96060830184613da0565b8181036080830152614aca81614a5a565b905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614b1c57607f821691505b602082108103614b2f57614b2e614ad5565b5b50919050565b6000604082019050614b4a6000830185613d0a565b614b576020830184613d0a565b9392505050565b600081519050614b6d81613df7565b92915050565b600060208284031215614b8957614b88613a39565b5b6000614b9784828501614b5e565b91505092915050565b7f43616e206e6f74206d696e74206d6f7265207468616e20310000000000000000600082015250565b6000614bd6601883613c31565b9150614be182614ba0565b602082019050919050565b60006020820190508181036000830152614c0581614bc9565b9050919050565b7f5075626c6963204d696e74206973206e6f74206c697665207965740000000000600082015250565b6000614c42601b83613c31565b9150614c4d82614c0c565b602082019050919050565b60006020820190508181036000830152614c7181614c35565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614cb282613b63565b9150614cbd83613b63565b925082614ccd57614ccc614c78565b5b828204905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614d3a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614cfd565b614d448683614cfd565b95508019841693508086168417925050509392505050565b6000614d77614d72614d6d84613b63565b613ea3565b613b63565b9050919050565b6000819050919050565b614d9183614d5c565b614da5614d9d82614d7e565b848454614d0a565b825550505050565b600090565b614dba614dad565b614dc5818484614d88565b505050565b5b81811015614de957614dde600082614db2565b600181019050614dcb565b5050565b601f821115614e2e57614dff81614cd8565b614e0884614ced565b81016020851015614e17578190505b614e2b614e2385614ced565b830182614dca565b50505b505050565b600082821c905092915050565b6000614e5160001984600802614e33565b1980831691505092915050565b6000614e6a8383614e40565b9150826002028217905092915050565b614e8382613c26565b67ffffffffffffffff811115614e9c57614e9b613f22565b5b614ea68254614b04565b614eb1828285614ded565b600060209050601f831160018114614ee45760008415614ed2578287015190505b614edc8582614e5e565b865550614f44565b601f198416614ef286614cd8565b60005b82811015614f1a57848901518255600182019150602085019450602081019050614ef5565b86831015614f375784890151614f33601f891682614e40565b8355505b6001600288020188555050505b505050505050565b7f4e656564206174206c65617374206f6e65206164647265737300000000000000600082015250565b6000614f82601983613c31565b9150614f8d82614f4c565b602082019050919050565b60006020820190508181036000830152614fb181614f75565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614ff282613b63565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036150245761502361451b565b5b600182019050919050565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b6000615065601b83613c31565b91506150708261502f565b602082019050919050565b6000602082019050818103600083015261509481615058565b9050919050565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b60006150d1601683613c31565b91506150dc8261509b565b602082019050919050565b60006020820190508181036000830152615100816150c4565b9050919050565b7f4e6f7420656e6f7567682047656e6573697320546f6b656e7300000000000000600082015250565b600061513d601983613c31565b915061514882615107565b602082019050919050565b6000602082019050818103600083015261516c81615130565b9050919050565b600060a0820190506151886000830187613d0a565b6151956020830186613d0a565b6151a2604083018561493a565b6151af606083018461493a565b81810360808301526151c081614a5a565b905095945050505050565b7f455243373231414d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b6000615227603083613c31565b9150615232826151cb565b604082019050919050565b600060208201905081810360008301526152568161521a565b9050919050565b600081905092915050565b600061527382613c26565b61527d818561525d565b935061528d818560208601613c42565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006152cf60058361525d565b91506152da82615299565b600582019050919050565b60006152f18285615268565b91506152fd8284615268565b9150615308826152c2565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615370602683613c31565b915061537b82615314565b604082019050919050565b6000602082019050818103600083015261539f81615363565b9050919050565b7f5068617365204f6e65204d696e74206973206e6f74206c697665207965740000600082015250565b60006153dc601e83613c31565b91506153e7826153a6565b602082019050919050565b6000602082019050818103600083015261540b816153cf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615448602083613c31565b915061545382615412565b602082019050919050565b600060208201905081810360008301526154778161543b565b9050919050565b600061548982613b63565b915061549483613b63565b9250826154a4576154a3614c78565b5b828206905092915050565b600081519050919050565b60006154c5826154af565b6154cf8185614a46565b93506154df818560208601613c42565b6154e881613c6c565b840191505092915050565b60006080820190506155086000830187613d0a565b6155156020830186613d0a565b6155226040830185613da0565b818103606083015261553481846154ba565b905095945050505050565b60008151905061554e81613a6f565b92915050565b60006020828403121561556a57615569613a39565b5b60006155788482850161553f565b9150509291505056fea26469706673582212203e5806925d67c253f41a7b305f0722fa41dcf9a5207e3b05f8ae79f3790af6af64736f6c63430008110033

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

0000000000000000000000002e0d4945d949aba5a99d24ee95a9d9c60942a926

-----Decoded View---------------
Arg [0] : _genesis (address): 0x2E0D4945D949AbA5A99D24ee95a9d9C60942a926

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000002e0d4945d949aba5a99d24ee95a9d9c60942a926


Deployed Bytecode Sourcemap

67588:8575:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15963:665;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70358:823;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69054:569;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21219:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23424:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75306:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15017:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68299:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73645:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75503:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71189:511;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74785:297;;;;;;;;;;;;;:::i;:::-;;2858:143:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75708:205:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67762:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68041:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73024:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68005:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21008:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73535:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16692:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17584:103:0;;;;;;;;;;;;;:::i;:::-;;74533:248:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72814:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67923:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68354:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16936:87:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73435:92:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21388:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67965:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67800:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75090:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74094:76;;;;;;;;;;;;;:::i;:::-;;71952:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75921:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73118:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74178:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68588:460;;;;;;;;;;;;;:::i;:::-;;72093:713;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73750:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67881:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67844:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73896:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73327:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24152:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71826:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17842:238:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73993:93:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69631:719;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15963:665;16093:4;16413:10;16398:25;;:11;:25;;;;:102;;;;16490:10;16475:25;;:11;:25;;;;16398:102;:179;;;;16567:10;16552:25;;:11;:25;;;;16398:179;16378:199;;15963:665;;;:::o;70358:823::-;70479:12;70521:10;70504:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;70494:39;;;;;;70479:54;;70568:52;70587:12;;70568:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70601:12;;70615:4;70568:18;:52::i;:::-;70546:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;70700:1;70692:5;:9;70684:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;70769:5;70761;;:13;;;;:::i;:::-;70748:9;:26;;70740:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70906:12;;70877:13;:25;70891:10;70877:25;;;;;;;;;;;;;;;;70869:5;70841:25;70855:10;70841:13;:25::i;:::-;:33;;;;:::i;:::-;:61;;;;:::i;:::-;:77;;70819:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;71028:9;;71019:5;71003:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:34;;70995:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71082:15;;;;;;;;;;;71074:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;71145:28;71155:10;71167:5;71145:9;:28::i;:::-;70468:713;70358:823;;;:::o;69054:569::-;1851:1;2449:7;;:19;2441:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1851:1;2582:7;:18;;;;69131:11:::1;;;;;;;;;;;69123:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;69204:1;69198:5;:7;69190:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;69284:9;;69275:5;69259:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:34;;69251:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69373:5;69338:7;;;;;;;;;;;:17;;;69356:10;69367:1;69338:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;69330:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;69458:5;69429:13;:25;69443:10;69429:25;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;69476:7;;;;;;;;;;;:24;;;69501:10;69520:42;69564:1;69567:5;69476:100;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;69587:28;69597:10;69609:5;69587:9;:28::i;:::-;1807:1:::0;2761:7;:22;;;;69054:569;:::o;21219:100::-;21273:13;21306:5;21299:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21219:100;:::o;23424:245::-;23528:7;23558:16;23566:7;23558;:16::i;:::-;23553:64;;23583:34;;;;;;;;;;;;;;23553:64;23637:15;:24;23653:7;23637:24;;;;;;;;;;;;;;;;;;;;;23630:31;;23424:245;;;:::o;75306:189::-;75429:8;5127:1:0;2958:42;5079:45;;;:49;5075:318;;;2958:42;5168;;;5241:4;5269:8;5168:128;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5145:237;;5357:8;5338:28;;;;;;;;;;;:::i;:::-;;;;;;;;5145:237;5075:318;75455:32:1::1;75469:8;75479:7;75455:13;:32::i;:::-;75306:189:::0;;;:::o;15017:315::-;15070:7;15298:15;:13;:15::i;:::-;15283:12;;15267:13;;:28;:46;15260:53;;15017:315;:::o;68299:48::-;;;;;;;;;;;;;;;;;:::o;73645:97::-;16822:13:0;:11;:13::i;:::-;73728:6:1::1;73710:15;;:24;;;;;;;;;;;;;;;;;;73645:97:::0;:::o;75503:197::-;75638:4;4288:1:0;2958:42;4240:45;;;:49;4236:632;;;4529:10;4521:18;;:4;:18;;;4517:85;;75655:37:1::1;75674:4;75680:2;75684:7;75655:18;:37::i;:::-;4580:7:0::0;;4517:85;2958:42;4639;;;4712:4;4740:10;4639:130;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4616:241;;4830:10;4811:30;;;;;;;;;;;:::i;:::-;;;;;;;;4616:241;4236:632;75655:37:1::1;75674:4;75680:2;75684:7;75655:18;:37::i;:::-;75503:197:::0;;;;;:::o;71189:511::-;71281:5;;71273;:13;;;;:::i;:::-;71260:9;:26;;71252:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71364:9;;71355:5;71339:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:34;;71331:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71469:12;;71460:5;71432:25;71446:10;71432:13;:25::i;:::-;:33;;;;:::i;:::-;:49;;71410:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;71560:1;71552:5;:9;71544:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;71606:13;;;;;;;;;;;71598:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;71664:28;71674:10;71686:5;71664:9;:28::i;:::-;71189:511;:::o;74785:297::-;16822:13:0;:11;:13::i;:::-;74835:15:1::1;74853:21;74835:39;;74885:16;74921:3;74915:2;74905:7;:12;;;;:::i;:::-;74904:20;;;;:::i;:::-;74885:39;;74935:16;74971:3;74965:2;74955:7;:12;;;;:::i;:::-;74954:20;;;;:::i;:::-;74935:39;;74995:13;;;;;;;;;;;74987:31;;:41;75019:8;74987:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;75047:7;;;;;;;;;;;75039:25;;:35;75065:8;75039:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;74824:258;;;74785:297::o:0;2858:143:0:-;2958:42;2858:143;:::o;75708:205:1:-;75847:4;4288:1:0;2958:42;4240:45;;;:49;4236:632;;;4529:10;4521:18;;:4;:18;;;4517:85;;75864:41:1::1;75887:4;75893:2;75897:7;75864:22;:41::i;:::-;4580:7:0::0;;4517:85;2958:42;4639;;;4712:4;4740:10;4639:130;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4616:241;;4830:10;4811:30;;;;;;;;;;;:::i;:::-;;;;;;;;4616:241;4236:632;75864:41:1::1;75887:4;75893:2;75897:7;75864:22;:41::i;:::-;75708:205:::0;;;;;:::o;67762:31::-;;;;:::o;68041:28::-;;;;;;;;;;;;;:::o;73024:88::-;16822:13:0;:11;:13::i;:::-;73101:3:1::1;73091:7;:13;;;;;;:::i;:::-;;73024:88:::0;:::o;68005:29::-;;;;;;;;;;;;;:::o;21008:144::-;21072:7;21115:27;21134:7;21115:18;:27::i;:::-;21092:52;;21008:144;;;:::o;73535:102::-;16822:13:0;:11;:13::i;:::-;73619:10:1::1;73607:9;:22;;;;73535:102:::0;:::o;16692:224::-;16756:7;16797:1;16780:19;;:5;:19;;;16776:60;;16808:28;;;;;;;;;;;;;;16776:60;11987:13;16854:18;:25;16873:5;16854:25;;;;;;;;;;;;;;;;:54;16847:61;;16692:224;;;:::o;17584:103:0:-;16822:13;:11;:13::i;:::-;17649:30:::1;17676:1;17649:18;:30::i;:::-;17584:103::o:0;74533:248:1:-;16822:13:0;:11;:13::i;:::-;74635:1:1::1;74616:9;;:16;;:20;74608:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;74682:9;74677:97;74697:9;;:16;;74693:1;:20;74677:97;;;74736:26;74746:9;;74756:1;74746:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;74760:1;74736:9;:26::i;:::-;74715:3;;;;:::i;:::-;;;74677:97;;;;74533:248:::0;;:::o;72814:202::-;16822:13:0;:11;:13::i;:::-;72954:14:1::1;72939:12;:29;;;;72994:14;72979:12;:29;;;;72814:202:::0;;:::o;67923:35::-;;;;;;;;;;;;;:::o;68354:81::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16936:87:0:-;16982:7;17009:6;;;;;;;;;;;17002:13;;16936:87;:::o;73435:92:1:-;16822:13:0;:11;:13::i;:::-;73510:9:1::1;73502:5;:17;;;;73435:92:::0;:::o;21388:104::-;21444:13;21477:7;21470:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21388:104;:::o;67965:33::-;;;;;;;;;;;;;:::o;67800:35::-;;;;:::o;75090:208::-;75221:8;5127:1:0;2958:42;5079:45;;;:49;5075:318;;;2958:42;5168;;;5241:4;5269:8;5168:128;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5145:237;;5357:8;5338:28;;;;;;;;;;;:::i;:::-;;;;;;;;5145:237;5075:318;75247:43:1::1;75271:8;75281;75247:23;:43::i;:::-;75090:208:::0;;;:::o;74094:76::-;16822:13:0;:11;:13::i;:::-;74154:8:1::1;;;;;;;;;;;74153:9;74142:8;;:20;;;;;;;;;;;;;;;;;;74094:76::o:0;71952:133::-;72022:7;72049;;;;;;;;;;;:17;;;72067:7;72075:1;72049:28;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72042:35;;71952:133;;;:::o;75921:239::-;76088:4;4288:1:0;2958:42;4240:45;;;:49;4236:632;;;4529:10;4521:18;;:4;:18;;;4517:85;;76105:47:1::1;76128:4;76134:2;76138:7;76147:4;76105:22;:47::i;:::-;4580:7:0::0;;4517:85;2958:42;4639;;;4712:4;4740:10;4639:130;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4616:241;;4830:10;4811:30;;;;;;;;;;;:::i;:::-;;;;;;;;4616:241;4236:632;76105:47:1::1;76128:4;76134:2;76138:7;76147:4;76105:22;:47::i;:::-;75921:239:::0;;;;;;:::o;73118:92::-;16822:13:0;:11;:13::i;:::-;73199:3:1::1;73187:9;:15;;;;;;:::i;:::-;;73118:92:::0;:::o;74178:343::-;16822:13:0;:11;:13::i;:::-;74312:1:1::1;74298:11;:15;74290:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;74356:14;74373:13;:11;:13::i;:::-;74356:30;;74429:9;;74414:11;74405:6;:20;;;;:::i;:::-;:33;;74397:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74478:35;74488:11;74501;74478:9;:35::i;:::-;74279:242;74178:343:::0;;:::o;68588:460::-;1851:1;2449:7;;:19;2441:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1851:1;2582:7;:18;;;;68649:11:::1;;;;;;;;;;;68641:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;68750:1;68716:7;;;;;;;;;;;:17;;;68734:10;68745:1;68716:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;68708:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;68821:9;;68816:1;68800:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:30;;68792:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;68897:1;68868:13;:25;68882:10;68868:25;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;68909:7;;;;;;;;;;;:24;;;68934:10;68953:42;68997:1;69000::::0;68909:96:::1;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;69016:24;69026:10;69038:1;69016:9;:24::i;:::-;1807:1:::0;2761:7;:22;;;;68588:460::o;72093:713::-;72211:13;72264:16;72272:7;72264;:16::i;:::-;72242:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;72383:5;72371:17;;:8;;;;;;;;;;;:17;;;72367:66;;72412:9;72405:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72367:66;72445:28;72476:10;:8;:10::i;:::-;72445:41;;72548:1;72523:14;72517:28;:32;:281;;;;;;;;;;;;;;;;;72641:14;72682:18;:7;:16;:18::i;:::-;72598:159;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72517:281;72497:301;;;72093:713;;;;:::o;73750:140::-;16822:13:0;:11;:13::i;:::-;73832:15:1::1;;;;;;;;;;;73831:16;73815:15;;:32;;;;;;;;;;;;;;;;;;73876:6;73858:15;;:24;;;;;;;;;;;;;;;;;;73750:140:::0;:::o;67881:35::-;;;;;;;;;;;;;:::o;67844:30::-;;;;:::o;73896:89::-;16822:13:0;:11;:13::i;:::-;73971:6:1::1;73957:11;;:20;;;;;;;;;;;;;;;;;;73896:89:::0;:::o;73327:100::-;16822:13:0;:11;:13::i;:::-;73413:6:1::1;73398:12;:21;;;;73327:100:::0;:::o;24152:214::-;24294:4;24323:18;:25;24342:5;24323:25;;;;;;;;;;;;;;;:35;24349:8;24323:35;;;;;;;;;;;;;;;;;;;;;;;;;24316:42;;24152:214;;;;:::o;71826:120::-;71889:7;71916:22;71930:7;71916:13;:22::i;:::-;71909:29;;71826:120;;;:::o;17842:238:0:-;16822:13;:11;:13::i;:::-;17965:1:::1;17945:22;;:8;:22;;::::0;17923:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;18044:28;18063:8;18044:18;:28::i;:::-;17842:238:::0;:::o;73993:93:1:-;16822:13:0;:11;:13::i;:::-;74072:6:1::1;74056:13;;:22;;;;;;;;;;;;;;;;;;73993:93:::0;:::o;69631:719::-;69737:12;69779:10;69762:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;69752:39;;;;;;69737:54;;69826:52;69845:12;;69826:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69859:12;;69873:4;69826:18;:52::i;:::-;69804:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;69963:5;;69950:9;:18;;69942:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;70097:12;;70068:13;:25;70082:10;70068:25;;;;;;;;;;;;;;;;70064:1;70036:25;70050:10;70036:13;:25::i;:::-;:29;;;;:::i;:::-;:57;;;;:::i;:::-;:73;;70014:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;70201:9;;70196:1;70180:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:30;;70172:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;70255:15;;;;;;;;;;;70247:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;70318:24;70328:10;70340:1;70318:9;:24::i;:::-;69726:624;69631:719;;:::o;6977:190:0:-;7102:4;7155;7126:25;7139:5;7146:4;7126:12;:25::i;:::-;:33;7119:40;;6977:190;;;;;:::o;16998:202:1:-;17059:7;11987:13;12124:2;17100:18;:25;17119:5;17100:25;;;;;;;;;;;;;;;;:49;;17099:93;17079:113;;16998:202;;;:::o;25938:104::-;26007:27;26017:2;26021:8;26007:27;;;;;;;;;;;;:9;:27::i;:::-;25938:104;;:::o;25581:273::-;25638:4;25694:7;25675:15;:13;:15::i;:::-;:26;;:66;;;;;25728:13;;25718:7;:23;25675:66;:152;;;;;25826:1;12757:8;25779:17;:26;25797:7;25779:26;;;;;;;;;;;;:43;:48;25675:152;25655:172;;25581:273;;;:::o;22876:482::-;22957:13;22989:27;23008:7;22989:18;:27::i;:::-;22957:61;;23039:5;23033:11;;:2;:11;;;23029:48;;23053:24;;;;;;;;;;;;;;23029:48;23117:5;23094:28;;:19;:17;:19::i;:::-;:28;;;23090:175;;23142:44;23159:5;23166:19;:17;:19::i;:::-;23142:16;:44::i;:::-;23137:128;;23214:35;;;;;;;;;;;;;;23137:128;23090:175;23304:2;23277:15;:24;23293:7;23277:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;23342:7;23338:2;23322:28;;23331:5;23322:28;;;;;;;;;;;;22946:412;22876:482;;:::o;73218:101::-;73283:7;73310:1;73303:8;;73218:101;:::o;17101:132:0:-;17176:12;:10;:12::i;:::-;17165:23;;:7;:5;:7::i;:::-;:23;;;17157:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17101:132::o;24433:170:1:-;24567:28;24577:4;24583:2;24587:7;24567:9;:28::i;:::-;24433:170;;;:::o;24674:185::-;24812:39;24829:4;24835:2;24839:7;24812:39;;;;;;;;;;;;:16;:39::i;:::-;24674:185;;;:::o;18395:1161::-;18489:7;18514:12;18529:7;18514:22;;18597:4;18578:15;:13;:15::i;:::-;:23;18574:915;;18631:13;;18624:4;:20;18620:869;;;18669:14;18686:17;:23;18704:4;18686:23;;;;;;;;;;;;18669:40;;18802:1;12757:8;18775:6;:23;:28;18771:699;;19294:113;19311:1;19301:6;:11;19294:113;;19354:17;:25;19372:6;;;;;;;19354:25;;;;;;;;;;;;19345:34;;19294:113;;;19440:6;19433:13;;;;;;18771:699;18646:843;18620:869;18574:915;19517:31;;;;;;;;;;;;;;18395:1161;;;;:::o;18240:191:0:-;18314:16;18333:6;;;;;;;;;;;18314:25;;18359:8;18350:6;;:17;;;;;;;;;;;;;;;;;;18414:8;18383:40;;18404:8;18383:40;;;;;;;;;;;;18303:128;18240:191;:::o;23741:340:1:-;23884:19;:17;:19::i;:::-;23872:31;;:8;:31;;;23868:61;;23912:17;;;;;;;;;;;;;;23868:61;23994:8;23942:18;:39;23961:19;:17;:19::i;:::-;23942:39;;;;;;;;;;;;;;;:49;23982:8;23942:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;24054:8;24018:55;;24033:19;:17;:19::i;:::-;24018:55;;;24064:8;24018:55;;;;;;:::i;:::-;;;;;;;;23741:340;;:::o;24930:396::-;25097:28;25107:4;25113:2;25117:7;25097:9;:28::i;:::-;25158:1;25140:2;:14;;;:19;25136:183;;25179:56;25210:4;25216:2;25220:7;25229:5;25179:30;:56::i;:::-;25174:145;;25263:40;;;;;;;;;;;;;;25174:145;25136:183;24930:396;;;;:::o;71708:108::-;71768:13;71801:7;71794:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71708:108;:::o;42625:723::-;42681:13;42911:1;42902:5;:10;42898:53;;42929:10;;;;;;;;;;;;;;;;;;;;;42898:53;42961:12;42976:5;42961:20;;42992:14;43017:78;43032:1;43024:4;:9;43017:78;;43050:8;;;;;:::i;:::-;;;;43081:2;43073:10;;;;;:::i;:::-;;;43017:78;;;43105:19;43137:6;43127:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43105:39;;43155:154;43171:1;43162:5;:10;43155:154;;43199:1;43189:11;;;;;:::i;:::-;;;43266:2;43258:5;:10;;;;:::i;:::-;43245:2;:24;;;;:::i;:::-;43232:39;;43215:6;43222;43215:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;43295:2;43286:11;;;;;:::i;:::-;;;43155:154;;;43333:6;43319:21;;;;;42625:723;;;;:::o;7844:328:0:-;7954:7;7979:20;8002:4;7979:27;;8022:9;8017:118;8041:5;:12;8037:1;:16;8017:118;;;8090:33;8100:12;8114:5;8120:1;8114:8;;;;;;;;:::i;:::-;;;;;;;;8090:9;:33::i;:::-;8075:48;;8055:3;;;;;:::i;:::-;;;;8017:118;;;;8152:12;8145:19;;;7844:328;;;;:::o;26415:2461:1:-;26538:20;26561:13;;26538:36;;26603:1;26589:16;;:2;:16;;;26585:48;;26614:19;;;;;;;;;;;;;;26585:48;26660:1;26648:8;:13;26644:44;;26670:18;;;;;;;;;;;;;;26644:44;26701:61;26731:1;26735:2;26739:12;26753:8;26701:21;:61::i;:::-;27339:1;12124:2;27310:1;:25;;27309:31;27280:8;:61;27237:18;:22;27256:2;27237:22;;;;;;;;;;;;;;;;:104;;;;;;;;;;;12900:3;27740:29;27767:1;27755:8;:13;27740:14;:29::i;:::-;:56;;12641:3;27677:15;:41;;27635:21;27653:2;27635:17;:21::i;:::-;:84;:162;27584:17;:31;27602:12;27584:31;;;;;;;;;;;:213;;;;27814:20;27837:12;27814:35;;27864:11;27893:8;27878:12;:23;27864:37;;27940:1;27922:2;:14;;;:19;27918:826;;27962:504;28018:12;28014:2;27993:38;;28010:1;27993:38;;;;;;;;;;;;28085:212;28154:1;28187:2;28220:14;;;;;;28265:5;28085:30;:212::i;:::-;28054:365;;28355:40;;;;;;;;;;;;;;28054:365;28461:3;28446:12;:18;27962:504;;28547:12;28530:13;;:29;28526:43;;28561:8;;;28526:43;27918:826;;;28610:119;28666:14;;;;;;28662:2;28641:40;;28658:1;28641:40;;;;;;;;;;;;28724:3;28709:12;:18;28610:119;;27918:826;28774:12;28758:13;:28;;;;27014:1784;;28808:60;28837:1;28841:2;28845:12;28859:8;28808:20;:60::i;:::-;26527:2349;26415:2461;;;:::o;39949:105::-;40009:7;40036:10;40029:17;;39949:105;:::o;15466:98:0:-;15519:7;15546:10;15539:17;;15466:98;:::o;31079:2528:1:-;31194:27;31224;31243:7;31224:18;:27::i;:::-;31194:57;;31309:4;31268:45;;31284:19;31268:45;;;31264:99;;31335:28;;;;;;;;;;;;;;31264:99;31376:22;31425:4;31402:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;31446:43;31463:4;31469:19;:17;:19::i;:::-;31446:16;:43::i;:::-;31402:87;:147;;;;31530:19;:17;:19::i;:::-;31506:43;;:20;31518:7;31506:11;:20::i;:::-;:43;;;31402:147;31376:174;;31568:17;31563:66;;31594:35;;;;;;;;;;;;;;31563:66;31658:1;31644:16;;:2;:16;;;31640:52;;31669:23;;;;;;;;;;;;;;31640:52;31705:43;31727:4;31733:2;31737:7;31746:1;31705:21;:43::i;:::-;31821:15;:24;31837:7;31821:24;;;;;;;;;;;;31814:31;;;;;;;;;;;32213:18;:24;32232:4;32213:24;;;;;;;;;;;;;;;;32211:26;;;;;;;;;;;;32282:18;:22;32301:2;32282:22;;;;;;;;;;;;;;;;32280:24;;;;;;;;;;;13035:8;12641:3;32663:15;:41;;32621:21;32639:2;32621:17;:21::i;:::-;:84;:128;32575:17;:26;32593:7;32575:26;;;;;;;;;;;:174;;;;32919:1;13035:8;32869:19;:46;:51;32865:626;;32941:19;32973:1;32963:7;:11;32941:33;;33130:1;33096:17;:30;33114:11;33096:30;;;;;;;;;;;;:35;33092:384;;33234:13;;33219:11;:28;33215:242;;33414:19;33381:17;:30;33399:11;33381:30;;;;;;;;;;;:52;;;;33215:242;33092:384;32922:569;32865:626;33538:7;33534:2;33519:27;;33528:4;33519:27;;;;;;;;;;;;33557:42;33578:4;33584:2;33588:7;33597:1;33557:20;:42::i;:::-;31183:2424;;31079:2528;;;:::o;37303:831::-;37466:4;37525:2;37500:45;;;37564:19;:17;:19::i;:::-;37602:4;37625:7;37651:5;37500:171;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37483:644;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37902:1;37885:6;:13;:18;37881:235;;37931:40;;;;;;;;;;;;;;37881:235;38074:6;38068:13;38059:6;38055:2;38051:15;38044:38;37483:644;37771:54;;;37744:81;;;:6;:81;;;;37720:105;;;37303:831;;;;;;:::o;14325:149:0:-;14388:7;14419:1;14415;:5;:51;;14446:20;14461:1;14464;14446:14;:20::i;:::-;14415:51;;;14423:20;14438:1;14441;14423:14;:20::i;:::-;14415:51;14408:58;;14325:149;;;;:::o;38782:159:1:-;;;;;:::o;22672:142::-;22730:14;22791:5;22781:15;;22672:142;;;:::o;22405:180::-;22496:14;22562:5;22552:15;;22405:180;;;:::o;39600:158::-;;;;;:::o;14482:300:0:-;14577:13;14689:1;14683:4;14676:15;14718:1;14712:4;14705:15;14759:4;14753;14743:21;14734:30;;14482:300;;;;:::o;7:75:2:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:117;1873:1;1870;1863:12;1904:568;1977:8;1987:6;2037:3;2030:4;2022:6;2018:17;2014:27;2004:122;;2045:79;;:::i;:::-;2004:122;2158:6;2145:20;2135:30;;2188:18;2180:6;2177:30;2174:117;;;2210:79;;:::i;:::-;2174:117;2324:4;2316:6;2312:17;2300:29;;2378:3;2370:4;2362:6;2358:17;2348:8;2344:32;2341:41;2338:128;;;2385:79;;:::i;:::-;2338:128;1904:568;;;;;:::o;2478:77::-;2515:7;2544:5;2533:16;;2478:77;;;:::o;2561:122::-;2634:24;2652:5;2634:24;:::i;:::-;2627:5;2624:35;2614:63;;2673:1;2670;2663:12;2614:63;2561:122;:::o;2689:139::-;2735:5;2773:6;2760:20;2751:29;;2789:33;2816:5;2789:33;:::i;:::-;2689:139;;;;:::o;2834:704::-;2929:6;2937;2945;2994:2;2982:9;2973:7;2969:23;2965:32;2962:119;;;3000:79;;:::i;:::-;2962:119;3148:1;3137:9;3133:17;3120:31;3178:18;3170:6;3167:30;3164:117;;;3200:79;;:::i;:::-;3164:117;3313:80;3385:7;3376:6;3365:9;3361:22;3313:80;:::i;:::-;3295:98;;;;3091:312;3442:2;3468:53;3513:7;3504:6;3493:9;3489:22;3468:53;:::i;:::-;3458:63;;3413:118;2834:704;;;;;:::o;3544:329::-;3603:6;3652:2;3640:9;3631:7;3627:23;3623:32;3620:119;;;3658:79;;:::i;:::-;3620:119;3778:1;3803:53;3848:7;3839:6;3828:9;3824:22;3803:53;:::i;:::-;3793:63;;3749:117;3544:329;;;;:::o;3879:99::-;3931:6;3965:5;3959:12;3949:22;;3879:99;;;:::o;3984:169::-;4068:11;4102:6;4097:3;4090:19;4142:4;4137:3;4133:14;4118:29;;3984:169;;;;:::o;4159:246::-;4240:1;4250:113;4264:6;4261:1;4258:13;4250:113;;;4349:1;4344:3;4340:11;4334:18;4330:1;4325:3;4321:11;4314:39;4286:2;4283:1;4279:10;4274:15;;4250:113;;;4397:1;4388:6;4383:3;4379:16;4372:27;4221:184;4159:246;;;:::o;4411:102::-;4452:6;4503:2;4499:7;4494:2;4487:5;4483:14;4479:28;4469:38;;4411:102;;;:::o;4519:377::-;4607:3;4635:39;4668:5;4635:39;:::i;:::-;4690:71;4754:6;4749:3;4690:71;:::i;:::-;4683:78;;4770:65;4828:6;4823:3;4816:4;4809:5;4805:16;4770:65;:::i;:::-;4860:29;4882:6;4860:29;:::i;:::-;4855:3;4851:39;4844:46;;4611:285;4519:377;;;;:::o;4902:313::-;5015:4;5053:2;5042:9;5038:18;5030:26;;5102:9;5096:4;5092:20;5088:1;5077:9;5073:17;5066:47;5130:78;5203:4;5194:6;5130:78;:::i;:::-;5122:86;;4902:313;;;;:::o;5221:126::-;5258:7;5298:42;5291:5;5287:54;5276:65;;5221:126;;;:::o;5353:96::-;5390:7;5419:24;5437:5;5419:24;:::i;:::-;5408:35;;5353:96;;;:::o;5455:118::-;5542:24;5560:5;5542:24;:::i;:::-;5537:3;5530:37;5455:118;;:::o;5579:222::-;5672:4;5710:2;5699:9;5695:18;5687:26;;5723:71;5791:1;5780:9;5776:17;5767:6;5723:71;:::i;:::-;5579:222;;;;:::o;5807:122::-;5880:24;5898:5;5880:24;:::i;:::-;5873:5;5870:35;5860:63;;5919:1;5916;5909:12;5860:63;5807:122;:::o;5935:139::-;5981:5;6019:6;6006:20;5997:29;;6035:33;6062:5;6035:33;:::i;:::-;5935:139;;;;:::o;6080:474::-;6148:6;6156;6205:2;6193:9;6184:7;6180:23;6176:32;6173:119;;;6211:79;;:::i;:::-;6173:119;6331:1;6356:53;6401:7;6392:6;6381:9;6377:22;6356:53;:::i;:::-;6346:63;;6302:117;6458:2;6484:53;6529:7;6520:6;6509:9;6505:22;6484:53;:::i;:::-;6474:63;;6429:118;6080:474;;;;;:::o;6560:118::-;6647:24;6665:5;6647:24;:::i;:::-;6642:3;6635:37;6560:118;;:::o;6684:222::-;6777:4;6815:2;6804:9;6800:18;6792:26;;6828:71;6896:1;6885:9;6881:17;6872:6;6828:71;:::i;:::-;6684:222;;;;:::o;6912:329::-;6971:6;7020:2;7008:9;6999:7;6995:23;6991:32;6988:119;;;7026:79;;:::i;:::-;6988:119;7146:1;7171:53;7216:7;7207:6;7196:9;7192:22;7171:53;:::i;:::-;7161:63;;7117:117;6912:329;;;;:::o;7247:116::-;7317:21;7332:5;7317:21;:::i;:::-;7310:5;7307:32;7297:60;;7353:1;7350;7343:12;7297:60;7247:116;:::o;7369:133::-;7412:5;7450:6;7437:20;7428:29;;7466:30;7490:5;7466:30;:::i;:::-;7369:133;;;;:::o;7508:323::-;7564:6;7613:2;7601:9;7592:7;7588:23;7584:32;7581:119;;;7619:79;;:::i;:::-;7581:119;7739:1;7764:50;7806:7;7797:6;7786:9;7782:22;7764:50;:::i;:::-;7754:60;;7710:114;7508:323;;;;:::o;7837:619::-;7914:6;7922;7930;7979:2;7967:9;7958:7;7954:23;7950:32;7947:119;;;7985:79;;:::i;:::-;7947:119;8105:1;8130:53;8175:7;8166:6;8155:9;8151:22;8130:53;:::i;:::-;8120:63;;8076:117;8232:2;8258:53;8303:7;8294:6;8283:9;8279:22;8258:53;:::i;:::-;8248:63;;8203:118;8360:2;8386:53;8431:7;8422:6;8411:9;8407:22;8386:53;:::i;:::-;8376:63;;8331:118;7837:619;;;;;:::o;8462:60::-;8490:3;8511:5;8504:12;;8462:60;;;:::o;8528:142::-;8578:9;8611:53;8629:34;8638:24;8656:5;8638:24;:::i;:::-;8629:34;:::i;:::-;8611:53;:::i;:::-;8598:66;;8528:142;;;:::o;8676:126::-;8726:9;8759:37;8790:5;8759:37;:::i;:::-;8746:50;;8676:126;;;:::o;8808:157::-;8889:9;8922:37;8953:5;8922:37;:::i;:::-;8909:50;;8808:157;;;:::o;8971:193::-;9089:68;9151:5;9089:68;:::i;:::-;9084:3;9077:81;8971:193;;:::o;9170:284::-;9294:4;9332:2;9321:9;9317:18;9309:26;;9345:102;9444:1;9433:9;9429:17;9420:6;9345:102;:::i;:::-;9170:284;;;;:::o;9460:117::-;9569:1;9566;9559:12;9583:180;9631:77;9628:1;9621:88;9728:4;9725:1;9718:15;9752:4;9749:1;9742:15;9769:281;9852:27;9874:4;9852:27;:::i;:::-;9844:6;9840:40;9982:6;9970:10;9967:22;9946:18;9934:10;9931:34;9928:62;9925:88;;;9993:18;;:::i;:::-;9925:88;10033:10;10029:2;10022:22;9812:238;9769:281;;:::o;10056:129::-;10090:6;10117:20;;:::i;:::-;10107:30;;10146:33;10174:4;10166:6;10146:33;:::i;:::-;10056:129;;;:::o;10191:308::-;10253:4;10343:18;10335:6;10332:30;10329:56;;;10365:18;;:::i;:::-;10329:56;10403:29;10425:6;10403:29;:::i;:::-;10395:37;;10487:4;10481;10477:15;10469:23;;10191:308;;;:::o;10505:146::-;10602:6;10597:3;10592;10579:30;10643:1;10634:6;10629:3;10625:16;10618:27;10505:146;;;:::o;10657:425::-;10735:5;10760:66;10776:49;10818:6;10776:49;:::i;:::-;10760:66;:::i;:::-;10751:75;;10849:6;10842:5;10835:21;10887:4;10880:5;10876:16;10925:3;10916:6;10911:3;10907:16;10904:25;10901:112;;;10932:79;;:::i;:::-;10901:112;11022:54;11069:6;11064:3;11059;11022:54;:::i;:::-;10741:341;10657:425;;;;;:::o;11102:340::-;11158:5;11207:3;11200:4;11192:6;11188:17;11184:27;11174:122;;11215:79;;:::i;:::-;11174:122;11332:6;11319:20;11357:79;11432:3;11424:6;11417:4;11409:6;11405:17;11357:79;:::i;:::-;11348:88;;11164:278;11102:340;;;;:::o;11448:509::-;11517:6;11566:2;11554:9;11545:7;11541:23;11537:32;11534:119;;;11572:79;;:::i;:::-;11534:119;11720:1;11709:9;11705:17;11692:31;11750:18;11742:6;11739:30;11736:117;;;11772:79;;:::i;:::-;11736:117;11877:63;11932:7;11923:6;11912:9;11908:22;11877:63;:::i;:::-;11867:73;;11663:287;11448:509;;;;:::o;11980:568::-;12053:8;12063:6;12113:3;12106:4;12098:6;12094:17;12090:27;12080:122;;12121:79;;:::i;:::-;12080:122;12234:6;12221:20;12211:30;;12264:18;12256:6;12253:30;12250:117;;;12286:79;;:::i;:::-;12250:117;12400:4;12392:6;12388:17;12376:29;;12454:3;12446:4;12438:6;12434:17;12424:8;12420:32;12417:41;12414:128;;;12461:79;;:::i;:::-;12414:128;11980:568;;;;;:::o;12554:559::-;12640:6;12648;12697:2;12685:9;12676:7;12672:23;12668:32;12665:119;;;12703:79;;:::i;:::-;12665:119;12851:1;12840:9;12836:17;12823:31;12881:18;12873:6;12870:30;12867:117;;;12903:79;;:::i;:::-;12867:117;13016:80;13088:7;13079:6;13068:9;13064:22;13016:80;:::i;:::-;12998:98;;;;12794:312;12554:559;;;;;:::o;13119:77::-;13156:7;13185:5;13174:16;;13119:77;;;:::o;13202:122::-;13275:24;13293:5;13275:24;:::i;:::-;13268:5;13265:35;13255:63;;13314:1;13311;13304:12;13255:63;13202:122;:::o;13330:139::-;13376:5;13414:6;13401:20;13392:29;;13430:33;13457:5;13430:33;:::i;:::-;13330:139;;;;:::o;13475:474::-;13543:6;13551;13600:2;13588:9;13579:7;13575:23;13571:32;13568:119;;;13606:79;;:::i;:::-;13568:119;13726:1;13751:53;13796:7;13787:6;13776:9;13772:22;13751:53;:::i;:::-;13741:63;;13697:117;13853:2;13879:53;13924:7;13915:6;13904:9;13900:22;13879:53;:::i;:::-;13869:63;;13824:118;13475:474;;;;;:::o;13955:468::-;14020:6;14028;14077:2;14065:9;14056:7;14052:23;14048:32;14045:119;;;14083:79;;:::i;:::-;14045:119;14203:1;14228:53;14273:7;14264:6;14253:9;14249:22;14228:53;:::i;:::-;14218:63;;14174:117;14330:2;14356:50;14398:7;14389:6;14378:9;14374:22;14356:50;:::i;:::-;14346:60;;14301:115;13955:468;;;;;:::o;14429:307::-;14490:4;14580:18;14572:6;14569:30;14566:56;;;14602:18;;:::i;:::-;14566:56;14640:29;14662:6;14640:29;:::i;:::-;14632:37;;14724:4;14718;14714:15;14706:23;;14429:307;;;:::o;14742:423::-;14819:5;14844:65;14860:48;14901:6;14860:48;:::i;:::-;14844:65;:::i;:::-;14835:74;;14932:6;14925:5;14918:21;14970:4;14963:5;14959:16;15008:3;14999:6;14994:3;14990:16;14987:25;14984:112;;;15015:79;;:::i;:::-;14984:112;15105:54;15152:6;15147:3;15142;15105:54;:::i;:::-;14825:340;14742:423;;;;;:::o;15184:338::-;15239:5;15288:3;15281:4;15273:6;15269:17;15265:27;15255:122;;15296:79;;:::i;:::-;15255:122;15413:6;15400:20;15438:78;15512:3;15504:6;15497:4;15489:6;15485:17;15438:78;:::i;:::-;15429:87;;15245:277;15184:338;;;;:::o;15528:943::-;15623:6;15631;15639;15647;15696:3;15684:9;15675:7;15671:23;15667:33;15664:120;;;15703:79;;:::i;:::-;15664:120;15823:1;15848:53;15893:7;15884:6;15873:9;15869:22;15848:53;:::i;:::-;15838:63;;15794:117;15950:2;15976:53;16021:7;16012:6;16001:9;15997:22;15976:53;:::i;:::-;15966:63;;15921:118;16078:2;16104:53;16149:7;16140:6;16129:9;16125:22;16104:53;:::i;:::-;16094:63;;16049:118;16234:2;16223:9;16219:18;16206:32;16265:18;16257:6;16254:30;16251:117;;;16287:79;;:::i;:::-;16251:117;16392:62;16446:7;16437:6;16426:9;16422:22;16392:62;:::i;:::-;16382:72;;16177:287;15528:943;;;;;;;:::o;16477:474::-;16545:6;16553;16602:2;16590:9;16581:7;16577:23;16573:32;16570:119;;;16608:79;;:::i;:::-;16570:119;16728:1;16753:53;16798:7;16789:6;16778:9;16774:22;16753:53;:::i;:::-;16743:63;;16699:117;16855:2;16881:53;16926:7;16917:6;16906:9;16902:22;16881:53;:::i;:::-;16871:63;;16826:118;16477:474;;;;;:::o;16957:::-;17025:6;17033;17082:2;17070:9;17061:7;17057:23;17053:32;17050:119;;;17088:79;;:::i;:::-;17050:119;17208:1;17233:53;17278:7;17269:6;17258:9;17254:22;17233:53;:::i;:::-;17223:63;;17179:117;17335:2;17361:53;17406:7;17397:6;17386:9;17382:22;17361:53;:::i;:::-;17351:63;;17306:118;16957:474;;;;;:::o;17437:559::-;17523:6;17531;17580:2;17568:9;17559:7;17555:23;17551:32;17548:119;;;17586:79;;:::i;:::-;17548:119;17734:1;17723:9;17719:17;17706:31;17764:18;17756:6;17753:30;17750:117;;;17786:79;;:::i;:::-;17750:117;17899:80;17971:7;17962:6;17951:9;17947:22;17899:80;:::i;:::-;17881:98;;;;17677:312;17437:559;;;;;:::o;18002:94::-;18035:8;18083:5;18079:2;18075:14;18054:35;;18002:94;;;:::o;18102:::-;18141:7;18170:20;18184:5;18170:20;:::i;:::-;18159:31;;18102:94;;;:::o;18202:100::-;18241:7;18270:26;18290:5;18270:26;:::i;:::-;18259:37;;18202:100;;;:::o;18308:157::-;18413:45;18433:24;18451:5;18433:24;:::i;:::-;18413:45;:::i;:::-;18408:3;18401:58;18308:157;;:::o;18471:256::-;18583:3;18598:75;18669:3;18660:6;18598:75;:::i;:::-;18698:2;18693:3;18689:12;18682:19;;18718:3;18711:10;;18471:256;;;;:::o;18733:175::-;18873:27;18869:1;18861:6;18857:14;18850:51;18733:175;:::o;18914:366::-;19056:3;19077:67;19141:2;19136:3;19077:67;:::i;:::-;19070:74;;19153:93;19242:3;19153:93;:::i;:::-;19271:2;19266:3;19262:12;19255:19;;18914:366;;;:::o;19286:419::-;19452:4;19490:2;19479:9;19475:18;19467:26;;19539:9;19533:4;19529:20;19525:1;19514:9;19510:17;19503:47;19567:131;19693:4;19567:131;:::i;:::-;19559:139;;19286:419;;;:::o;19711:171::-;19851:23;19847:1;19839:6;19835:14;19828:47;19711:171;:::o;19888:366::-;20030:3;20051:67;20115:2;20110:3;20051:67;:::i;:::-;20044:74;;20127:93;20216:3;20127:93;:::i;:::-;20245:2;20240:3;20236:12;20229:19;;19888:366;;;:::o;20260:419::-;20426:4;20464:2;20453:9;20449:18;20441:26;;20513:9;20507:4;20503:20;20499:1;20488:9;20484:17;20477:47;20541:131;20667:4;20541:131;:::i;:::-;20533:139;;20260:419;;;:::o;20685:180::-;20733:77;20730:1;20723:88;20830:4;20827:1;20820:15;20854:4;20851:1;20844:15;20871:410;20911:7;20934:20;20952:1;20934:20;:::i;:::-;20929:25;;20968:20;20986:1;20968:20;:::i;:::-;20963:25;;21023:1;21020;21016:9;21045:30;21063:11;21045:30;:::i;:::-;21034:41;;21224:1;21215:7;21211:15;21208:1;21205:22;21185:1;21178:9;21158:83;21135:139;;21254:18;;:::i;:::-;21135:139;20919:362;20871:410;;;;:::o;21287:179::-;21427:31;21423:1;21415:6;21411:14;21404:55;21287:179;:::o;21472:366::-;21614:3;21635:67;21699:2;21694:3;21635:67;:::i;:::-;21628:74;;21711:93;21800:3;21711:93;:::i;:::-;21829:2;21824:3;21820:12;21813:19;;21472:366;;;:::o;21844:419::-;22010:4;22048:2;22037:9;22033:18;22025:26;;22097:9;22091:4;22087:20;22083:1;22072:9;22068:17;22061:47;22125:131;22251:4;22125:131;:::i;:::-;22117:139;;21844:419;;;:::o;22269:191::-;22309:3;22328:20;22346:1;22328:20;:::i;:::-;22323:25;;22362:20;22380:1;22362:20;:::i;:::-;22357:25;;22405:1;22402;22398:9;22391:16;;22426:3;22423:1;22420:10;22417:36;;;22433:18;;:::i;:::-;22417:36;22269:191;;;;:::o;22466:194::-;22506:4;22526:20;22544:1;22526:20;:::i;:::-;22521:25;;22560:20;22578:1;22560:20;:::i;:::-;22555:25;;22604:1;22601;22597:9;22589:17;;22628:1;22622:4;22619:11;22616:37;;;22633:18;;:::i;:::-;22616:37;22466:194;;;;:::o;22666:225::-;22806:34;22802:1;22794:6;22790:14;22783:58;22875:8;22870:2;22862:6;22858:15;22851:33;22666:225;:::o;22897:366::-;23039:3;23060:67;23124:2;23119:3;23060:67;:::i;:::-;23053:74;;23136:93;23225:3;23136:93;:::i;:::-;23254:2;23249:3;23245:12;23238:19;;22897:366;;;:::o;23269:419::-;23435:4;23473:2;23462:9;23458:18;23450:26;;23522:9;23516:4;23512:20;23508:1;23497:9;23493:17;23486:47;23550:131;23676:4;23550:131;:::i;:::-;23542:139;;23269:419;;;:::o;23694:171::-;23834:23;23830:1;23822:6;23818:14;23811:47;23694:171;:::o;23871:366::-;24013:3;24034:67;24098:2;24093:3;24034:67;:::i;:::-;24027:74;;24110:93;24199:3;24110:93;:::i;:::-;24228:2;24223:3;24219:12;24212:19;;23871:366;;;:::o;24243:419::-;24409:4;24447:2;24436:9;24432:18;24424:26;;24496:9;24490:4;24486:20;24482:1;24471:9;24467:17;24460:47;24524:131;24650:4;24524:131;:::i;:::-;24516:139;;24243:419;;;:::o;24668:180::-;24808:32;24804:1;24796:6;24792:14;24785:56;24668:180;:::o;24854:366::-;24996:3;25017:67;25081:2;25076:3;25017:67;:::i;:::-;25010:74;;25093:93;25182:3;25093:93;:::i;:::-;25211:2;25206:3;25202:12;25195:19;;24854:366;;;:::o;25226:419::-;25392:4;25430:2;25419:9;25415:18;25407:26;;25479:9;25473:4;25469:20;25465:1;25454:9;25450:17;25443:47;25507:131;25633:4;25507:131;:::i;:::-;25499:139;;25226:419;;;:::o;25651:181::-;25791:33;25787:1;25779:6;25775:14;25768:57;25651:181;:::o;25838:366::-;25980:3;26001:67;26065:2;26060:3;26001:67;:::i;:::-;25994:74;;26077:93;26166:3;26077:93;:::i;:::-;26195:2;26190:3;26186:12;26179:19;;25838:366;;;:::o;26210:419::-;26376:4;26414:2;26403:9;26399:18;26391:26;;26463:9;26457:4;26453:20;26449:1;26438:9;26434:17;26427:47;26491:131;26617:4;26491:131;:::i;:::-;26483:139;;26210:419;;;:::o;26635:182::-;26775:34;26771:1;26763:6;26759:14;26752:58;26635:182;:::o;26823:366::-;26965:3;26986:67;27050:2;27045:3;26986:67;:::i;:::-;26979:74;;27062:93;27151:3;27062:93;:::i;:::-;27180:2;27175:3;27171:12;27164:19;;26823:366;;;:::o;27195:419::-;27361:4;27399:2;27388:9;27384:18;27376:26;;27448:9;27442:4;27438:20;27434:1;27423:9;27419:17;27412:47;27476:131;27602:4;27476:131;:::i;:::-;27468:139;;27195:419;;;:::o;27620:181::-;27760:33;27756:1;27748:6;27744:14;27737:57;27620:181;:::o;27807:366::-;27949:3;27970:67;28034:2;28029:3;27970:67;:::i;:::-;27963:74;;28046:93;28135:3;28046:93;:::i;:::-;28164:2;28159:3;28155:12;28148:19;;27807:366;;;:::o;28179:419::-;28345:4;28383:2;28372:9;28368:18;28360:26;;28432:9;28426:4;28422:20;28418:1;28407:9;28403:17;28396:47;28460:131;28586:4;28460:131;:::i;:::-;28452:139;;28179:419;;;:::o;28604:85::-;28649:7;28678:5;28667:16;;28604:85;;;:::o;28695:158::-;28753:9;28786:61;28804:42;28813:32;28839:5;28813:32;:::i;:::-;28804:42;:::i;:::-;28786:61;:::i;:::-;28773:74;;28695:158;;;:::o;28859:147::-;28954:45;28993:5;28954:45;:::i;:::-;28949:3;28942:58;28859:147;;:::o;29012:348::-;29141:4;29179:2;29168:9;29164:18;29156:26;;29192:71;29260:1;29249:9;29245:17;29236:6;29192:71;:::i;:::-;29273:80;29349:2;29338:9;29334:18;29325:6;29273:80;:::i;:::-;29012:348;;;;;:::o;29366:143::-;29423:5;29454:6;29448:13;29439:22;;29470:33;29497:5;29470:33;:::i;:::-;29366:143;;;;:::o;29515:351::-;29585:6;29634:2;29622:9;29613:7;29609:23;29605:32;29602:119;;;29640:79;;:::i;:::-;29602:119;29760:1;29785:64;29841:7;29832:6;29821:9;29817:22;29785:64;:::i;:::-;29775:74;;29731:128;29515:351;;;;:::o;29872:221::-;30012:34;30008:1;30000:6;29996:14;29989:58;30081:4;30076:2;30068:6;30064:15;30057:29;29872:221;:::o;30099:366::-;30241:3;30262:67;30326:2;30321:3;30262:67;:::i;:::-;30255:74;;30338:93;30427:3;30338:93;:::i;:::-;30456:2;30451:3;30447:12;30440:19;;30099:366;;;:::o;30471:419::-;30637:4;30675:2;30664:9;30660:18;30652:26;;30724:9;30718:4;30714:20;30710:1;30699:9;30695:17;30688:47;30752:131;30878:4;30752:131;:::i;:::-;30744:139;;30471:419;;;:::o;30896:168::-;30979:11;31013:6;31008:3;31001:19;31053:4;31048:3;31044:14;31029:29;;30896:168;;;;:::o;31070:114::-;;:::o;31190:362::-;31331:3;31352:65;31415:1;31410:3;31352:65;:::i;:::-;31345:72;;31426:93;31515:3;31426:93;:::i;:::-;31544:1;31539:3;31535:11;31528:18;;31190:362;;;:::o;31558:875::-;31843:4;31881:3;31870:9;31866:19;31858:27;;31895:71;31963:1;31952:9;31948:17;31939:6;31895:71;:::i;:::-;31976:72;32044:2;32033:9;32029:18;32020:6;31976:72;:::i;:::-;32058:80;32134:2;32123:9;32119:18;32110:6;32058:80;:::i;:::-;32148:72;32216:2;32205:9;32201:18;32192:6;32148:72;:::i;:::-;32268:9;32262:4;32258:20;32252:3;32241:9;32237:19;32230:49;32296:130;32421:4;32296:130;:::i;:::-;32288:138;;31558:875;;;;;;;:::o;32439:180::-;32487:77;32484:1;32477:88;32584:4;32581:1;32574:15;32608:4;32605:1;32598:15;32625:320;32669:6;32706:1;32700:4;32696:12;32686:22;;32753:1;32747:4;32743:12;32774:18;32764:81;;32830:4;32822:6;32818:17;32808:27;;32764:81;32892:2;32884:6;32881:14;32861:18;32858:38;32855:84;;32911:18;;:::i;:::-;32855:84;32676:269;32625:320;;;:::o;32951:332::-;33072:4;33110:2;33099:9;33095:18;33087:26;;33123:71;33191:1;33180:9;33176:17;33167:6;33123:71;:::i;:::-;33204:72;33272:2;33261:9;33257:18;33248:6;33204:72;:::i;:::-;32951:332;;;;;:::o;33289:137::-;33343:5;33374:6;33368:13;33359:22;;33390:30;33414:5;33390:30;:::i;:::-;33289:137;;;;:::o;33432:345::-;33499:6;33548:2;33536:9;33527:7;33523:23;33519:32;33516:119;;;33554:79;;:::i;:::-;33516:119;33674:1;33699:61;33752:7;33743:6;33732:9;33728:22;33699:61;:::i;:::-;33689:71;;33645:125;33432:345;;;;:::o;33783:174::-;33923:26;33919:1;33911:6;33907:14;33900:50;33783:174;:::o;33963:366::-;34105:3;34126:67;34190:2;34185:3;34126:67;:::i;:::-;34119:74;;34202:93;34291:3;34202:93;:::i;:::-;34320:2;34315:3;34311:12;34304:19;;33963:366;;;:::o;34335:419::-;34501:4;34539:2;34528:9;34524:18;34516:26;;34588:9;34582:4;34578:20;34574:1;34563:9;34559:17;34552:47;34616:131;34742:4;34616:131;:::i;:::-;34608:139;;34335:419;;;:::o;34760:177::-;34900:29;34896:1;34888:6;34884:14;34877:53;34760:177;:::o;34943:366::-;35085:3;35106:67;35170:2;35165:3;35106:67;:::i;:::-;35099:74;;35182:93;35271:3;35182:93;:::i;:::-;35300:2;35295:3;35291:12;35284:19;;34943:366;;;:::o;35315:419::-;35481:4;35519:2;35508:9;35504:18;35496:26;;35568:9;35562:4;35558:20;35554:1;35543:9;35539:17;35532:47;35596:131;35722:4;35596:131;:::i;:::-;35588:139;;35315:419;;;:::o;35740:180::-;35788:77;35785:1;35778:88;35885:4;35882:1;35875:15;35909:4;35906:1;35899:15;35926:185;35966:1;35983:20;36001:1;35983:20;:::i;:::-;35978:25;;36017:20;36035:1;36017:20;:::i;:::-;36012:25;;36056:1;36046:35;;36061:18;;:::i;:::-;36046:35;36103:1;36100;36096:9;36091:14;;35926:185;;;;:::o;36117:141::-;36166:4;36189:3;36181:11;;36212:3;36209:1;36202:14;36246:4;36243:1;36233:18;36225:26;;36117:141;;;:::o;36264:93::-;36301:6;36348:2;36343;36336:5;36332:14;36328:23;36318:33;;36264:93;;;:::o;36363:107::-;36407:8;36457:5;36451:4;36447:16;36426:37;;36363:107;;;;:::o;36476:393::-;36545:6;36595:1;36583:10;36579:18;36618:97;36648:66;36637:9;36618:97;:::i;:::-;36736:39;36766:8;36755:9;36736:39;:::i;:::-;36724:51;;36808:4;36804:9;36797:5;36793:21;36784:30;;36857:4;36847:8;36843:19;36836:5;36833:30;36823:40;;36552:317;;36476:393;;;;;:::o;36875:142::-;36925:9;36958:53;36976:34;36985:24;37003:5;36985:24;:::i;:::-;36976:34;:::i;:::-;36958:53;:::i;:::-;36945:66;;36875:142;;;:::o;37023:75::-;37066:3;37087:5;37080:12;;37023:75;;;:::o;37104:269::-;37214:39;37245:7;37214:39;:::i;:::-;37275:91;37324:41;37348:16;37324:41;:::i;:::-;37316:6;37309:4;37303:11;37275:91;:::i;:::-;37269:4;37262:105;37180:193;37104:269;;;:::o;37379:73::-;37424:3;37379:73;:::o;37458:189::-;37535:32;;:::i;:::-;37576:65;37634:6;37626;37620:4;37576:65;:::i;:::-;37511:136;37458:189;;:::o;37653:186::-;37713:120;37730:3;37723:5;37720:14;37713:120;;;37784:39;37821:1;37814:5;37784:39;:::i;:::-;37757:1;37750:5;37746:13;37737:22;;37713:120;;;37653:186;;:::o;37845:543::-;37946:2;37941:3;37938:11;37935:446;;;37980:38;38012:5;37980:38;:::i;:::-;38064:29;38082:10;38064:29;:::i;:::-;38054:8;38050:44;38247:2;38235:10;38232:18;38229:49;;;38268:8;38253:23;;38229:49;38291:80;38347:22;38365:3;38347:22;:::i;:::-;38337:8;38333:37;38320:11;38291:80;:::i;:::-;37950:431;;37935:446;37845:543;;;:::o;38394:117::-;38448:8;38498:5;38492:4;38488:16;38467:37;;38394:117;;;;:::o;38517:169::-;38561:6;38594:51;38642:1;38638:6;38630:5;38627:1;38623:13;38594:51;:::i;:::-;38590:56;38675:4;38669;38665:15;38655:25;;38568:118;38517:169;;;;:::o;38691:295::-;38767:4;38913:29;38938:3;38932:4;38913:29;:::i;:::-;38905:37;;38975:3;38972:1;38968:11;38962:4;38959:21;38951:29;;38691:295;;;;:::o;38991:1395::-;39108:37;39141:3;39108:37;:::i;:::-;39210:18;39202:6;39199:30;39196:56;;;39232:18;;:::i;:::-;39196:56;39276:38;39308:4;39302:11;39276:38;:::i;:::-;39361:67;39421:6;39413;39407:4;39361:67;:::i;:::-;39455:1;39479:4;39466:17;;39511:2;39503:6;39500:14;39528:1;39523:618;;;;40185:1;40202:6;40199:77;;;40251:9;40246:3;40242:19;40236:26;40227:35;;40199:77;40302:67;40362:6;40355:5;40302:67;:::i;:::-;40296:4;40289:81;40158:222;39493:887;;39523:618;39575:4;39571:9;39563:6;39559:22;39609:37;39641:4;39609:37;:::i;:::-;39668:1;39682:208;39696:7;39693:1;39690:14;39682:208;;;39775:9;39770:3;39766:19;39760:26;39752:6;39745:42;39826:1;39818:6;39814:14;39804:24;;39873:2;39862:9;39858:18;39845:31;;39719:4;39716:1;39712:12;39707:17;;39682:208;;;39918:6;39909:7;39906:19;39903:179;;;39976:9;39971:3;39967:19;39961:26;40019:48;40061:4;40053:6;40049:17;40038:9;40019:48;:::i;:::-;40011:6;40004:64;39926:156;39903:179;40128:1;40124;40116:6;40112:14;40108:22;40102:4;40095:36;39530:611;;;39493:887;;39083:1303;;;38991:1395;;:::o;40392:175::-;40532:27;40528:1;40520:6;40516:14;40509:51;40392:175;:::o;40573:366::-;40715:3;40736:67;40800:2;40795:3;40736:67;:::i;:::-;40729:74;;40812:93;40901:3;40812:93;:::i;:::-;40930:2;40925:3;40921:12;40914:19;;40573:366;;;:::o;40945:419::-;41111:4;41149:2;41138:9;41134:18;41126:26;;41198:9;41192:4;41188:20;41184:1;41173:9;41169:17;41162:47;41226:131;41352:4;41226:131;:::i;:::-;41218:139;;40945:419;;;:::o;41370:180::-;41418:77;41415:1;41408:88;41515:4;41512:1;41505:15;41539:4;41536:1;41529:15;41556:233;41595:3;41618:24;41636:5;41618:24;:::i;:::-;41609:33;;41664:66;41657:5;41654:77;41651:103;;41734:18;;:::i;:::-;41651:103;41781:1;41774:5;41770:13;41763:20;;41556:233;;;:::o;41795:177::-;41935:29;41931:1;41923:6;41919:14;41912:53;41795:177;:::o;41978:366::-;42120:3;42141:67;42205:2;42200:3;42141:67;:::i;:::-;42134:74;;42217:93;42306:3;42217:93;:::i;:::-;42335:2;42330:3;42326:12;42319:19;;41978:366;;;:::o;42350:419::-;42516:4;42554:2;42543:9;42539:18;42531:26;;42603:9;42597:4;42593:20;42589:1;42578:9;42574:17;42567:47;42631:131;42757:4;42631:131;:::i;:::-;42623:139;;42350:419;;;:::o;42775:172::-;42915:24;42911:1;42903:6;42899:14;42892:48;42775:172;:::o;42953:366::-;43095:3;43116:67;43180:2;43175:3;43116:67;:::i;:::-;43109:74;;43192:93;43281:3;43192:93;:::i;:::-;43310:2;43305:3;43301:12;43294:19;;42953:366;;;:::o;43325:419::-;43491:4;43529:2;43518:9;43514:18;43506:26;;43578:9;43572:4;43568:20;43564:1;43553:9;43549:17;43542:47;43606:131;43732:4;43606:131;:::i;:::-;43598:139;;43325:419;;;:::o;43750:175::-;43890:27;43886:1;43878:6;43874:14;43867:51;43750:175;:::o;43931:366::-;44073:3;44094:67;44158:2;44153:3;44094:67;:::i;:::-;44087:74;;44170:93;44259:3;44170:93;:::i;:::-;44288:2;44283:3;44279:12;44272:19;;43931:366;;;:::o;44303:419::-;44469:4;44507:2;44496:9;44492:18;44484:26;;44556:9;44550:4;44546:20;44542:1;44531:9;44527:17;44520:47;44584:131;44710:4;44584:131;:::i;:::-;44576:139;;44303:419;;;:::o;44728:891::-;45021:4;45059:3;45048:9;45044:19;45036:27;;45073:71;45141:1;45130:9;45126:17;45117:6;45073:71;:::i;:::-;45154:72;45222:2;45211:9;45207:18;45198:6;45154:72;:::i;:::-;45236:80;45312:2;45301:9;45297:18;45288:6;45236:80;:::i;:::-;45326;45402:2;45391:9;45387:18;45378:6;45326:80;:::i;:::-;45454:9;45448:4;45444:20;45438:3;45427:9;45423:19;45416:49;45482:130;45607:4;45482:130;:::i;:::-;45474:138;;44728:891;;;;;;;:::o;45625:235::-;45765:34;45761:1;45753:6;45749:14;45742:58;45834:18;45829:2;45821:6;45817:15;45810:43;45625:235;:::o;45866:366::-;46008:3;46029:67;46093:2;46088:3;46029:67;:::i;:::-;46022:74;;46105:93;46194:3;46105:93;:::i;:::-;46223:2;46218:3;46214:12;46207:19;;45866:366;;;:::o;46238:419::-;46404:4;46442:2;46431:9;46427:18;46419:26;;46491:9;46485:4;46481:20;46477:1;46466:9;46462:17;46455:47;46519:131;46645:4;46519:131;:::i;:::-;46511:139;;46238:419;;;:::o;46663:148::-;46765:11;46802:3;46787:18;;46663:148;;;;:::o;46817:390::-;46923:3;46951:39;46984:5;46951:39;:::i;:::-;47006:89;47088:6;47083:3;47006:89;:::i;:::-;46999:96;;47104:65;47162:6;47157:3;47150:4;47143:5;47139:16;47104:65;:::i;:::-;47194:6;47189:3;47185:16;47178:23;;46927:280;46817:390;;;;:::o;47213:155::-;47353:7;47349:1;47341:6;47337:14;47330:31;47213:155;:::o;47374:400::-;47534:3;47555:84;47637:1;47632:3;47555:84;:::i;:::-;47548:91;;47648:93;47737:3;47648:93;:::i;:::-;47766:1;47761:3;47757:11;47750:18;;47374:400;;;:::o;47780:701::-;48061:3;48083:95;48174:3;48165:6;48083:95;:::i;:::-;48076:102;;48195:95;48286:3;48277:6;48195:95;:::i;:::-;48188:102;;48307:148;48451:3;48307:148;:::i;:::-;48300:155;;48472:3;48465:10;;47780:701;;;;;:::o;48487:225::-;48627:34;48623:1;48615:6;48611:14;48604:58;48696:8;48691:2;48683:6;48679:15;48672:33;48487:225;:::o;48718:366::-;48860:3;48881:67;48945:2;48940:3;48881:67;:::i;:::-;48874:74;;48957:93;49046:3;48957:93;:::i;:::-;49075:2;49070:3;49066:12;49059:19;;48718:366;;;:::o;49090:419::-;49256:4;49294:2;49283:9;49279:18;49271:26;;49343:9;49337:4;49333:20;49329:1;49318:9;49314:17;49307:47;49371:131;49497:4;49371:131;:::i;:::-;49363:139;;49090:419;;;:::o;49515:180::-;49655:32;49651:1;49643:6;49639:14;49632:56;49515:180;:::o;49701:366::-;49843:3;49864:67;49928:2;49923:3;49864:67;:::i;:::-;49857:74;;49940:93;50029:3;49940:93;:::i;:::-;50058:2;50053:3;50049:12;50042:19;;49701:366;;;:::o;50073:419::-;50239:4;50277:2;50266:9;50262:18;50254:26;;50326:9;50320:4;50316:20;50312:1;50301:9;50297:17;50290:47;50354:131;50480:4;50354:131;:::i;:::-;50346:139;;50073:419;;;:::o;50498:182::-;50638:34;50634:1;50626:6;50622:14;50615:58;50498:182;:::o;50686:366::-;50828:3;50849:67;50913:2;50908:3;50849:67;:::i;:::-;50842:74;;50925:93;51014:3;50925:93;:::i;:::-;51043:2;51038:3;51034:12;51027:19;;50686:366;;;:::o;51058:419::-;51224:4;51262:2;51251:9;51247:18;51239:26;;51311:9;51305:4;51301:20;51297:1;51286:9;51282:17;51275:47;51339:131;51465:4;51339:131;:::i;:::-;51331:139;;51058:419;;;:::o;51483:176::-;51515:1;51532:20;51550:1;51532:20;:::i;:::-;51527:25;;51566:20;51584:1;51566:20;:::i;:::-;51561:25;;51605:1;51595:35;;51610:18;;:::i;:::-;51595:35;51651:1;51648;51644:9;51639:14;;51483:176;;;;:::o;51665:98::-;51716:6;51750:5;51744:12;51734:22;;51665:98;;;:::o;51769:373::-;51855:3;51883:38;51915:5;51883:38;:::i;:::-;51937:70;52000:6;51995:3;51937:70;:::i;:::-;51930:77;;52016:65;52074:6;52069:3;52062:4;52055:5;52051:16;52016:65;:::i;:::-;52106:29;52128:6;52106:29;:::i;:::-;52101:3;52097:39;52090:46;;51859:283;51769:373;;;;:::o;52148:640::-;52343:4;52381:3;52370:9;52366:19;52358:27;;52395:71;52463:1;52452:9;52448:17;52439:6;52395:71;:::i;:::-;52476:72;52544:2;52533:9;52529:18;52520:6;52476:72;:::i;:::-;52558;52626:2;52615:9;52611:18;52602:6;52558:72;:::i;:::-;52677:9;52671:4;52667:20;52662:2;52651:9;52647:18;52640:48;52705:76;52776:4;52767:6;52705:76;:::i;:::-;52697:84;;52148:640;;;;;;;:::o;52794:141::-;52850:5;52881:6;52875:13;52866:22;;52897:32;52923:5;52897:32;:::i;:::-;52794:141;;;;:::o;52941:349::-;53010:6;53059:2;53047:9;53038:7;53034:23;53030:32;53027:119;;;53065:79;;:::i;:::-;53027:119;53185:1;53210:63;53265:7;53256:6;53245:9;53241:22;53210:63;:::i;:::-;53200:73;;53156:127;52941:349;;;;:::o

Swarm Source

ipfs://3e5806925d67c253f41a7b305f0722fa41dcf9a5207e3b05f8ae79f3790af6af
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.