ETH Price: $3,400.87 (+2.13%)

Token

Twisted Reality by Davbob (TR)
 

Overview

Max Total Supply

797 TR

Holders

630

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 TR
0x1cec903c732562e5ee955a5766657e2ef0fa2d72
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:
TwistedReality

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Twisted Reality by Davbob

// Twisted Papers will get burned.

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId].value;
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory 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.
                // The ASCII index of the '0' character is 48.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

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

// File: contracts/TwistedReality.sol



pragma solidity ^0.8.4;





contract TwistedReality is ERC721A, Ownable {

  using Strings for uint256;
  using ECDSA for bytes32;

  address signer;
  error InvalidSignarure();
  
  uint256 MAX_SUPPLY = 999;
  uint256 MAX_PER_TRANSACTION = 5;
  uint256 PAID_PRICE = 0.003 ether;
  uint256 MAX_FREE_PER_WALLET = 1;
  string tokenBaseUri = "ipfs://bafybeiachleot5ddzvzxxl6yzhweg6vod5oazgyagemlcutrt3zrhcmyvu/";

  bool public paused = false;
  mapping(address => uint256) private _freeMintedCount;
 
  constructor() ERC721A("Twisted Reality by Davbob", "TR") {}

  function freeMint(uint256 _quantity) external payable {
    
      require(!paused, "Minting paused");
      require(_freeMintedCount[msg.sender] < MAX_FREE_PER_WALLET);

      uint256 _totalSupply = totalSupply();

      require(_totalSupply + _quantity < MAX_SUPPLY + 1, "SOLD OUT");
      require(_quantity < 2, "Max per transaction is 1");


      _freeMintedCount[msg.sender] += 1;

      _mint(msg.sender, _quantity);
    
  }

  function paidMint(uint256 _quantity) external payable {
      require(!paused, "Minting paused");

      uint256 _totalSupply = totalSupply();

      require(_totalSupply + _quantity < MAX_SUPPLY + 1, "SOLD OUT");
      require(_quantity < MAX_PER_TRANSACTION + 1, "Max per transaction paid is 5");
      require(msg.value >= _quantity * PAID_PRICE);

      _mint(msg.sender, _quantity);
  }

  function freeMintedCount(address owner) external view returns (uint256) {
    return _freeMintedCount[owner];
  }

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

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

  function setBaseURI(string calldata _newBaseUri) external onlyOwner {
    tokenBaseUri = _newBaseUri;
  }

  function flipSale(bool _state) external onlyOwner {
    paused = _state;
  }

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

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


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

  function burn(
        uint256 tokenId,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        if (keccak256(abi.encodePacked(msg.sender, tokenId)).toEthSignedMessageHash().recover(v, r, s) != signer) {
            revert InvalidSignarure();
        }
        _burn(tokenId);
    }
  function batchBurn(uint256[] memory tokenids) external onlyOwner {
        uint256 len = tokenids.length;
        for (uint256 i; i < len; i++) {
            uint256 tokenid = tokenids[i];
            _burn(tokenid);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidSignarure","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenids","type":"uint256[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"flipSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"freeMintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"paidMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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"}]

60806040526103e7600a556005600b55660aa87bee538000600c556001600d5560405180608001604052806043815260200162003ce860439139600e9080519060200190620000509291906200022d565b506000600f60006101000a81548160ff0219169083151502179055503480156200007957600080fd5b506040518060400160405280601981526020017f54776973746564205265616c69747920627920446176626f62000000000000008152506040518060400160405280600281526020017f54520000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000fe9291906200022d565b508060039080519060200190620001179291906200022d565b50620001286200015660201b60201c565b600081905550505062000150620001446200015f60201b60201c565b6200016760201b60201c565b62000342565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200023b90620002dd565b90600052602060002090601f0160209004810192826200025f5760008555620002ab565b82601f106200027a57805160ff1916838001178555620002ab565b82800160010185558215620002ab579182015b82811115620002aa5782518255916020019190600101906200028d565b5b509050620002ba9190620002be565b5090565b5b80821115620002d9576000816000905550600101620002bf565b5090565b60006002820490506001821680620002f657607f821691505b602082108114156200030d576200030c62000313565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61399680620003526000396000f3fe6080604052600436106101815760003560e01c806370a08231116100d1578063a22cb4651161008a578063dc8e92ea11610064578063dc8e92ea14610550578063e985e9c514610579578063f2fde38b146105b6578063fcc82dc2146105df57610181565b8063a22cb465146104c1578063b88d4fde146104ea578063c87b56dd1461051357610181565b806370a08231146103be578063715018a6146103fb5780637c928fe9146104125780638da5cb5b1461042e57806395d89b4114610459578063981332351461048457610181565b80633031e7c71161013e57806355f804b31161011857806355f804b3146103115780635c975abb1461033a5780636352211e1461036557806365cde733146103a257610181565b80633031e7c7146102a85780633ccfd60b146102d157806342842e0e146102e857610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a891906129b7565b610608565b6040516101ba9190612f0c565b60405180910390f35b3480156101cf57600080fd5b506101d861069a565b6040516101e59190612f6c565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612a5e565b61072c565b6040516102229190612ea5565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d9190612901565b6107ab565b005b34801561026057600080fd5b506102696108ef565b60405161027691906130ee565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a191906127eb565b610906565b005b3480156102b457600080fd5b506102cf60048036038101906102ca919061298a565b610c2b565b005b3480156102dd57600080fd5b506102e6610c50565b005b3480156102f457600080fd5b5061030f600480360381019061030a91906127eb565b610cd8565b005b34801561031d57600080fd5b5061033860048036038101906103339190612a11565b610cf8565b005b34801561034657600080fd5b5061034f610d16565b60405161035c9190612f0c565b60405180910390f35b34801561037157600080fd5b5061038c60048036038101906103879190612a5e565b610d29565b6040516103999190612ea5565b60405180910390f35b6103bc60048036038101906103b79190612a5e565b610d3b565b005b3480156103ca57600080fd5b506103e560048036038101906103e0919061277e565b610e6a565b6040516103f291906130ee565b60405180910390f35b34801561040757600080fd5b50610410610f23565b005b61042c60048036038101906104279190612a5e565b610f37565b005b34801561043a57600080fd5b506104436110e3565b6040516104509190612ea5565b60405180910390f35b34801561046557600080fd5b5061046e61110d565b60405161047b9190612f6c565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a6919061277e565b61119f565b6040516104b891906130ee565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e391906128c1565b6111e8565b005b3480156104f657600080fd5b50610511600480360381019061050c919061283e565b611360565b005b34801561051f57600080fd5b5061053a60048036038101906105359190612a5e565b6113d3565b6040516105479190612f6c565b60405180910390f35b34801561055c57600080fd5b5061057760048036038101906105729190612941565b61147a565b005b34801561058557600080fd5b506105a0600480360381019061059b91906127ab565b6114d4565b6040516105ad9190612f0c565b60405180910390f35b3480156105c257600080fd5b506105dd60048036038101906105d8919061277e565b611568565b005b3480156105eb57600080fd5b5061060660048036038101906106019190612a8b565b6115ec565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061066357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106935750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546106a9906133bb565b80601f01602080910402602001604051908101604052809291908181526020018280546106d5906133bb565b80156107225780601f106106f757610100808354040283529160200191610722565b820191906000526020600020905b81548152906001019060200180831161070557829003601f168201915b5050505050905090565b6000610737826116c8565b61076d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107b682610d29565b90508073ffffffffffffffffffffffffffffffffffffffff166107d7611727565b73ffffffffffffffffffffffffffffffffffffffff161461083a57610803816107fe611727565b6114d4565b610839576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006108f961172f565b6001546000540303905090565b600061091182611738565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610978576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061098484611806565b9150915061099a8187610995611727565b61182d565b6109e6576109af866109aa611727565b6114d4565b6109e5576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610a4d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a5a8686866001611871565b8015610a6557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610b3385610b0f888887611877565b7c02000000000000000000000000000000000000000000000000000000001761189f565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610bbb576000600185019050600060046000838152602001908152602001600020541415610bb9576000548114610bb8578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610c2386868660016118ca565b505050505050565b610c336118d0565b80600f60006101000a81548160ff02191690831515021790555050565b610c586118d0565b6000610c626110e3565b73ffffffffffffffffffffffffffffffffffffffff1647604051610c8590612e90565b60006040518083038185875af1925050503d8060008114610cc2576040519150601f19603f3d011682016040523d82523d6000602084013e610cc7565b606091505b5050905080610cd557600080fd5b50565b610cf383838360405180602001604052806000815250611360565b505050565b610d006118d0565b8181600e9190610d119291906124e4565b505050565b600f60009054906101000a900460ff1681565b6000610d3482611738565b9050919050565b600f60009054906101000a900460ff1615610d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8290612fee565b60405180910390fd5b6000610d956108ef565b90506001600a54610da691906131d9565b8282610db291906131d9565b10610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de990612fae565b60405180910390fd5b6001600b54610e0191906131d9565b8210610e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e399061302e565b60405180910390fd5b600c5482610e509190613260565b341015610e5c57600080fd5b610e66338361194e565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ed2576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610f2b6118d0565b610f356000611b0b565b565b600f60009054906101000a900460ff1615610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e90612fee565b60405180910390fd5b600d54601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610fd457600080fd5b6000610fde6108ef565b90506001600a54610fef91906131d9565b8282610ffb91906131d9565b1061103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103290612fae565b60405180910390fd5b6002821061107e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611075906130ce565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110ce91906131d9565b925050819055506110df338361194e565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461111c906133bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611148906133bb565b80156111955780601f1061116a57610100808354040283529160200191611195565b820191906000526020600020905b81548152906001019060200180831161117857829003601f168201915b5050505050905090565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111f0611727565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611255576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611262611727565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661130f611727565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113549190612f0c565b60405180910390a35050565b61136b848484610906565b60008373ffffffffffffffffffffffffffffffffffffffff163b146113cd5761139684848484611bd1565b6113cc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606113de826116c8565b61141d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611414906130ae565b60405180910390fd5b6000611427611d31565b905060008151116114475760405180602001604052806000815250611472565b8061145184611dc3565b604051602001611462929190612e3b565b6040516020818303038152906040525b915050919050565b6114826118d0565b60008151905060005b818110156114cf5760008382815181106114a8576114a761358c565b5b602002602001015190506114bb81611f24565b5080806114c79061341e565b91505061148b565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115706118d0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d79061300e565b60405180910390fd5b6115e981611b0b565b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661166c84848461165c338a604051602001611641929190612e0f565b60405160208183030381529060405280519060200120611f32565b611f62909392919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16146116b9576040517f8aa9c9ac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116c284611f24565b50505050565b6000816116d361172f565b111580156116e2575060005482105b8015611720575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061174761172f565b116117cf576000548110156117ce5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156117cc575b60008114156117c2576004600083600190039350838152602001908152602001600020549050611797565b8092505050611801565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861188e868684611f8d565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6118d8611f96565b73ffffffffffffffffffffffffffffffffffffffff166118f66110e3565b73ffffffffffffffffffffffffffffffffffffffff161461194c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119439061308e565b60405180910390fd5b565b600080549050600082141561198f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61199c6000848385611871565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611a1383611a046000866000611877565b611a0d85611f9e565b1761189f565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611ab457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611a79565b506000821415611af0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611b0660008483856118ca565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bf7611727565b8786866040518563ffffffff1660e01b8152600401611c199493929190612ec0565b602060405180830381600087803b158015611c3357600080fd5b505af1925050508015611c6457506040513d601f19601f82011682018060405250810190611c6191906129e4565b60015b611cde573d8060008114611c94576040519150601f19603f3d011682016040523d82523d6000602084013e611c99565b606091505b50600081511415611cd6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e8054611d40906133bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611d6c906133bb565b8015611db95780601f10611d8e57610100808354040283529160200191611db9565b820191906000526020600020905b815481529060010190602001808311611d9c57829003601f168201915b5050505050905090565b60606000821415611e0b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f1f565b600082905060005b60008214611e3d578080611e269061341e565b915050600a82611e36919061322f565b9150611e13565b60008167ffffffffffffffff811115611e5957611e586135bb565b5b6040519080825280601f01601f191660200182016040528015611e8b5781602001600182028036833780820191505090505b5090505b60008514611f1857600182611ea491906132ba565b9150600a85611eb3919061349f565b6030611ebf91906131d9565b60f81b818381518110611ed557611ed461358c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f11919061322f565b9450611e8f565b8093505050505b919050565b611f2f816000611fae565b50565b600081604051602001611f459190612e6a565b604051602081830303815290604052805190602001209050919050565b6000806000611f7387878787612202565b91509150611f808161230f565b8192505050949350505050565b60009392505050565b600033905090565b60006001821460e11b9050919050565b6000611fb983611738565b90506000819050600080611fcc86611806565b91509150841561203557611fe88184611fe3611727565b61182d565b61203457611ffd83611ff8611727565b6114d4565b612033576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612043836000886001611871565b801561204e57600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506120f6836120b385600088611877565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761189f565b600460008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516141561217e57600060018701905060006004600083815260200190815260200160002054141561217c57600054811461217b578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121e88360008860016118ca565b600160008154809291906001019190505550505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561223d576000600391509150612306565b601b8560ff16141580156122555750601c8560ff1614155b15612267576000600491509150612306565b60006001878787876040516000815260200160405260405161228c9493929190612f27565b6020604051602081039080840390855afa1580156122ae573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122fd57600060019250925050612306565b80600092509250505b94509492505050565b600060048111156123235761232261352e565b5b8160048111156123365761233561352e565b5b1415612341576124e1565b600160048111156123555761235461352e565b5b8160048111156123685761236761352e565b5b14156123a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a090612f8e565b60405180910390fd5b600260048111156123bd576123bc61352e565b5b8160048111156123d0576123cf61352e565b5b1415612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240890612fce565b60405180910390fd5b600360048111156124255761242461352e565b5b8160048111156124385761243761352e565b5b1415612479576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124709061304e565b60405180910390fd5b60048081111561248c5761248b61352e565b5b81600481111561249f5761249e61352e565b5b14156124e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d79061306e565b60405180910390fd5b5b50565b8280546124f0906133bb565b90600052602060002090601f0160209004810192826125125760008555612559565b82601f1061252b57803560ff1916838001178555612559565b82800160010185558215612559579182015b8281111561255857823582559160200191906001019061253d565b5b509050612566919061256a565b5090565b5b8082111561258357600081600090555060010161256b565b5090565b600061259a6125958461312e565b613109565b905080838252602082019050828560208602820111156125bd576125bc6135f4565b5b60005b858110156125ed57816125d38882612754565b8452602084019350602083019250506001810190506125c0565b5050509392505050565b600061260a6126058461315a565b613109565b905082815260208101848484011115612626576126256135f9565b5b612631848285613379565b509392505050565b600081359050612648816138d6565b92915050565b600082601f830112612663576126626135ef565b5b8135612673848260208601612587565b91505092915050565b60008135905061268b816138ed565b92915050565b6000813590506126a081613904565b92915050565b6000813590506126b58161391b565b92915050565b6000815190506126ca8161391b565b92915050565b600082601f8301126126e5576126e46135ef565b5b81356126f58482602086016125f7565b91505092915050565b60008083601f840112612714576127136135ef565b5b8235905067ffffffffffffffff811115612731576127306135ea565b5b60208301915083600182028301111561274d5761274c6135f4565b5b9250929050565b60008135905061276381613932565b92915050565b60008135905061277881613949565b92915050565b60006020828403121561279457612793613603565b5b60006127a284828501612639565b91505092915050565b600080604083850312156127c2576127c1613603565b5b60006127d085828601612639565b92505060206127e185828601612639565b9150509250929050565b60008060006060848603121561280457612803613603565b5b600061281286828701612639565b935050602061282386828701612639565b925050604061283486828701612754565b9150509250925092565b6000806000806080858703121561285857612857613603565b5b600061286687828801612639565b945050602061287787828801612639565b935050604061288887828801612754565b925050606085013567ffffffffffffffff8111156128a9576128a86135fe565b5b6128b5878288016126d0565b91505092959194509250565b600080604083850312156128d8576128d7613603565b5b60006128e685828601612639565b92505060206128f78582860161267c565b9150509250929050565b6000806040838503121561291857612917613603565b5b600061292685828601612639565b925050602061293785828601612754565b9150509250929050565b60006020828403121561295757612956613603565b5b600082013567ffffffffffffffff811115612975576129746135fe565b5b6129818482850161264e565b91505092915050565b6000602082840312156129a05761299f613603565b5b60006129ae8482850161267c565b91505092915050565b6000602082840312156129cd576129cc613603565b5b60006129db848285016126a6565b91505092915050565b6000602082840312156129fa576129f9613603565b5b6000612a08848285016126bb565b91505092915050565b60008060208385031215612a2857612a27613603565b5b600083013567ffffffffffffffff811115612a4657612a456135fe565b5b612a52858286016126fe565b92509250509250929050565b600060208284031215612a7457612a73613603565b5b6000612a8284828501612754565b91505092915050565b60008060008060808587031215612aa557612aa4613603565b5b6000612ab387828801612754565b9450506020612ac487828801612769565b9350506040612ad587828801612691565b9250506060612ae687828801612691565b91505092959194509250565b612afb816132ee565b82525050565b612b12612b0d826132ee565b613467565b82525050565b612b2181613300565b82525050565b612b308161330c565b82525050565b612b47612b428261330c565b613479565b82525050565b6000612b588261318b565b612b6281856131a1565b9350612b72818560208601613388565b612b7b81613608565b840191505092915050565b6000612b9182613196565b612b9b81856131bd565b9350612bab818560208601613388565b612bb481613608565b840191505092915050565b6000612bca82613196565b612bd481856131ce565b9350612be4818560208601613388565b80840191505092915050565b6000612bfd6018836131bd565b9150612c0882613626565b602082019050919050565b6000612c206008836131bd565b9150612c2b8261364f565b602082019050919050565b6000612c43601f836131bd565b9150612c4e82613678565b602082019050919050565b6000612c66601c836131ce565b9150612c71826136a1565b601c82019050919050565b6000612c89600e836131bd565b9150612c94826136ca565b602082019050919050565b6000612cac6026836131bd565b9150612cb7826136f3565b604082019050919050565b6000612ccf601d836131bd565b9150612cda82613742565b602082019050919050565b6000612cf26022836131bd565b9150612cfd8261376b565b604082019050919050565b6000612d156022836131bd565b9150612d20826137ba565b604082019050919050565b6000612d386005836131ce565b9150612d4382613809565b600582019050919050565b6000612d5b6020836131bd565b9150612d6682613832565b602082019050919050565b6000612d7e602f836131bd565b9150612d898261385b565b604082019050919050565b6000612da16000836131b2565b9150612dac826138aa565b600082019050919050565b6000612dc46018836131bd565b9150612dcf826138ad565b602082019050919050565b612de381613362565b82525050565b612dfa612df582613362565b613495565b82525050565b612e098161336c565b82525050565b6000612e1b8285612b01565b601482019150612e2b8284612de9565b6020820191508190509392505050565b6000612e478285612bbf565b9150612e538284612bbf565b9150612e5e82612d2b565b91508190509392505050565b6000612e7582612c59565b9150612e818284612b36565b60208201915081905092915050565b6000612e9b82612d94565b9150819050919050565b6000602082019050612eba6000830184612af2565b92915050565b6000608082019050612ed56000830187612af2565b612ee26020830186612af2565b612eef6040830185612dda565b8181036060830152612f018184612b4d565b905095945050505050565b6000602082019050612f216000830184612b18565b92915050565b6000608082019050612f3c6000830187612b27565b612f496020830186612e00565b612f566040830185612b27565b612f636060830184612b27565b95945050505050565b60006020820190508181036000830152612f868184612b86565b905092915050565b60006020820190508181036000830152612fa781612bf0565b9050919050565b60006020820190508181036000830152612fc781612c13565b9050919050565b60006020820190508181036000830152612fe781612c36565b9050919050565b6000602082019050818103600083015261300781612c7c565b9050919050565b6000602082019050818103600083015261302781612c9f565b9050919050565b6000602082019050818103600083015261304781612cc2565b9050919050565b6000602082019050818103600083015261306781612ce5565b9050919050565b6000602082019050818103600083015261308781612d08565b9050919050565b600060208201905081810360008301526130a781612d4e565b9050919050565b600060208201905081810360008301526130c781612d71565b9050919050565b600060208201905081810360008301526130e781612db7565b9050919050565b60006020820190506131036000830184612dda565b92915050565b6000613113613124565b905061311f82826133ed565b919050565b6000604051905090565b600067ffffffffffffffff821115613149576131486135bb565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613175576131746135bb565b5b61317e82613608565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006131e482613362565b91506131ef83613362565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613224576132236134d0565b5b828201905092915050565b600061323a82613362565b915061324583613362565b925082613255576132546134ff565b5b828204905092915050565b600061326b82613362565b915061327683613362565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132af576132ae6134d0565b5b828202905092915050565b60006132c582613362565b91506132d083613362565b9250828210156132e3576132e26134d0565b5b828203905092915050565b60006132f982613342565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156133a657808201518184015260208101905061338b565b838111156133b5576000848401525b50505050565b600060028204905060018216806133d357607f821691505b602082108114156133e7576133e661355d565b5b50919050565b6133f682613608565b810181811067ffffffffffffffff82111715613415576134146135bb565b5b80604052505050565b600061342982613362565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561345c5761345b6134d0565b5b600182019050919050565b600061347282613483565b9050919050565b6000819050919050565b600061348e82613619565b9050919050565b6000819050919050565b60006134aa82613362565b91506134b583613362565b9250826134c5576134c46134ff565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f534f4c44204f5554000000000000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4d696e74696e6720706175736564000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d617820706572207472616e73616374696f6e20706169642069732035000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f4d617820706572207472616e73616374696f6e20697320310000000000000000600082015250565b6138df816132ee565b81146138ea57600080fd5b50565b6138f681613300565b811461390157600080fd5b50565b61390d8161330c565b811461391857600080fd5b50565b61392481613316565b811461392f57600080fd5b50565b61393b81613362565b811461394657600080fd5b50565b6139528161336c565b811461395d57600080fd5b5056fea26469706673582212206ac86492bda7e4d1c981fe7909d37cdda5db9f33e7a51e5bbe2cbe793748950764736f6c63430008070033697066733a2f2f626166796265696163686c656f743564647a767a78786c36797a6877656736766f64356f617a67796167656d6c6375747274337a7268636d7976752f

Deployed Bytecode

0x6080604052600436106101815760003560e01c806370a08231116100d1578063a22cb4651161008a578063dc8e92ea11610064578063dc8e92ea14610550578063e985e9c514610579578063f2fde38b146105b6578063fcc82dc2146105df57610181565b8063a22cb465146104c1578063b88d4fde146104ea578063c87b56dd1461051357610181565b806370a08231146103be578063715018a6146103fb5780637c928fe9146104125780638da5cb5b1461042e57806395d89b4114610459578063981332351461048457610181565b80633031e7c71161013e57806355f804b31161011857806355f804b3146103115780635c975abb1461033a5780636352211e1461036557806365cde733146103a257610181565b80633031e7c7146102a85780633ccfd60b146102d157806342842e0e146102e857610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a891906129b7565b610608565b6040516101ba9190612f0c565b60405180910390f35b3480156101cf57600080fd5b506101d861069a565b6040516101e59190612f6c565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612a5e565b61072c565b6040516102229190612ea5565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d9190612901565b6107ab565b005b34801561026057600080fd5b506102696108ef565b60405161027691906130ee565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a191906127eb565b610906565b005b3480156102b457600080fd5b506102cf60048036038101906102ca919061298a565b610c2b565b005b3480156102dd57600080fd5b506102e6610c50565b005b3480156102f457600080fd5b5061030f600480360381019061030a91906127eb565b610cd8565b005b34801561031d57600080fd5b5061033860048036038101906103339190612a11565b610cf8565b005b34801561034657600080fd5b5061034f610d16565b60405161035c9190612f0c565b60405180910390f35b34801561037157600080fd5b5061038c60048036038101906103879190612a5e565b610d29565b6040516103999190612ea5565b60405180910390f35b6103bc60048036038101906103b79190612a5e565b610d3b565b005b3480156103ca57600080fd5b506103e560048036038101906103e0919061277e565b610e6a565b6040516103f291906130ee565b60405180910390f35b34801561040757600080fd5b50610410610f23565b005b61042c60048036038101906104279190612a5e565b610f37565b005b34801561043a57600080fd5b506104436110e3565b6040516104509190612ea5565b60405180910390f35b34801561046557600080fd5b5061046e61110d565b60405161047b9190612f6c565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a6919061277e565b61119f565b6040516104b891906130ee565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e391906128c1565b6111e8565b005b3480156104f657600080fd5b50610511600480360381019061050c919061283e565b611360565b005b34801561051f57600080fd5b5061053a60048036038101906105359190612a5e565b6113d3565b6040516105479190612f6c565b60405180910390f35b34801561055c57600080fd5b5061057760048036038101906105729190612941565b61147a565b005b34801561058557600080fd5b506105a0600480360381019061059b91906127ab565b6114d4565b6040516105ad9190612f0c565b60405180910390f35b3480156105c257600080fd5b506105dd60048036038101906105d8919061277e565b611568565b005b3480156105eb57600080fd5b5061060660048036038101906106019190612a8b565b6115ec565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061066357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106935750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546106a9906133bb565b80601f01602080910402602001604051908101604052809291908181526020018280546106d5906133bb565b80156107225780601f106106f757610100808354040283529160200191610722565b820191906000526020600020905b81548152906001019060200180831161070557829003601f168201915b5050505050905090565b6000610737826116c8565b61076d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107b682610d29565b90508073ffffffffffffffffffffffffffffffffffffffff166107d7611727565b73ffffffffffffffffffffffffffffffffffffffff161461083a57610803816107fe611727565b6114d4565b610839576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006108f961172f565b6001546000540303905090565b600061091182611738565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610978576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061098484611806565b9150915061099a8187610995611727565b61182d565b6109e6576109af866109aa611727565b6114d4565b6109e5576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610a4d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a5a8686866001611871565b8015610a6557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610b3385610b0f888887611877565b7c02000000000000000000000000000000000000000000000000000000001761189f565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610bbb576000600185019050600060046000838152602001908152602001600020541415610bb9576000548114610bb8578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610c2386868660016118ca565b505050505050565b610c336118d0565b80600f60006101000a81548160ff02191690831515021790555050565b610c586118d0565b6000610c626110e3565b73ffffffffffffffffffffffffffffffffffffffff1647604051610c8590612e90565b60006040518083038185875af1925050503d8060008114610cc2576040519150601f19603f3d011682016040523d82523d6000602084013e610cc7565b606091505b5050905080610cd557600080fd5b50565b610cf383838360405180602001604052806000815250611360565b505050565b610d006118d0565b8181600e9190610d119291906124e4565b505050565b600f60009054906101000a900460ff1681565b6000610d3482611738565b9050919050565b600f60009054906101000a900460ff1615610d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8290612fee565b60405180910390fd5b6000610d956108ef565b90506001600a54610da691906131d9565b8282610db291906131d9565b10610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de990612fae565b60405180910390fd5b6001600b54610e0191906131d9565b8210610e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e399061302e565b60405180910390fd5b600c5482610e509190613260565b341015610e5c57600080fd5b610e66338361194e565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ed2576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610f2b6118d0565b610f356000611b0b565b565b600f60009054906101000a900460ff1615610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e90612fee565b60405180910390fd5b600d54601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610fd457600080fd5b6000610fde6108ef565b90506001600a54610fef91906131d9565b8282610ffb91906131d9565b1061103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103290612fae565b60405180910390fd5b6002821061107e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611075906130ce565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110ce91906131d9565b925050819055506110df338361194e565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461111c906133bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611148906133bb565b80156111955780601f1061116a57610100808354040283529160200191611195565b820191906000526020600020905b81548152906001019060200180831161117857829003601f168201915b5050505050905090565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111f0611727565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611255576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611262611727565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661130f611727565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113549190612f0c565b60405180910390a35050565b61136b848484610906565b60008373ffffffffffffffffffffffffffffffffffffffff163b146113cd5761139684848484611bd1565b6113cc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606113de826116c8565b61141d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611414906130ae565b60405180910390fd5b6000611427611d31565b905060008151116114475760405180602001604052806000815250611472565b8061145184611dc3565b604051602001611462929190612e3b565b6040516020818303038152906040525b915050919050565b6114826118d0565b60008151905060005b818110156114cf5760008382815181106114a8576114a761358c565b5b602002602001015190506114bb81611f24565b5080806114c79061341e565b91505061148b565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115706118d0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d79061300e565b60405180910390fd5b6115e981611b0b565b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661166c84848461165c338a604051602001611641929190612e0f565b60405160208183030381529060405280519060200120611f32565b611f62909392919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16146116b9576040517f8aa9c9ac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116c284611f24565b50505050565b6000816116d361172f565b111580156116e2575060005482105b8015611720575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061174761172f565b116117cf576000548110156117ce5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156117cc575b60008114156117c2576004600083600190039350838152602001908152602001600020549050611797565b8092505050611801565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861188e868684611f8d565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6118d8611f96565b73ffffffffffffffffffffffffffffffffffffffff166118f66110e3565b73ffffffffffffffffffffffffffffffffffffffff161461194c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119439061308e565b60405180910390fd5b565b600080549050600082141561198f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61199c6000848385611871565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611a1383611a046000866000611877565b611a0d85611f9e565b1761189f565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611ab457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611a79565b506000821415611af0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611b0660008483856118ca565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bf7611727565b8786866040518563ffffffff1660e01b8152600401611c199493929190612ec0565b602060405180830381600087803b158015611c3357600080fd5b505af1925050508015611c6457506040513d601f19601f82011682018060405250810190611c6191906129e4565b60015b611cde573d8060008114611c94576040519150601f19603f3d011682016040523d82523d6000602084013e611c99565b606091505b50600081511415611cd6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e8054611d40906133bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611d6c906133bb565b8015611db95780601f10611d8e57610100808354040283529160200191611db9565b820191906000526020600020905b815481529060010190602001808311611d9c57829003601f168201915b5050505050905090565b60606000821415611e0b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f1f565b600082905060005b60008214611e3d578080611e269061341e565b915050600a82611e36919061322f565b9150611e13565b60008167ffffffffffffffff811115611e5957611e586135bb565b5b6040519080825280601f01601f191660200182016040528015611e8b5781602001600182028036833780820191505090505b5090505b60008514611f1857600182611ea491906132ba565b9150600a85611eb3919061349f565b6030611ebf91906131d9565b60f81b818381518110611ed557611ed461358c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f11919061322f565b9450611e8f565b8093505050505b919050565b611f2f816000611fae565b50565b600081604051602001611f459190612e6a565b604051602081830303815290604052805190602001209050919050565b6000806000611f7387878787612202565b91509150611f808161230f565b8192505050949350505050565b60009392505050565b600033905090565b60006001821460e11b9050919050565b6000611fb983611738565b90506000819050600080611fcc86611806565b91509150841561203557611fe88184611fe3611727565b61182d565b61203457611ffd83611ff8611727565b6114d4565b612033576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612043836000886001611871565b801561204e57600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506120f6836120b385600088611877565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761189f565b600460008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516141561217e57600060018701905060006004600083815260200190815260200160002054141561217c57600054811461217b578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121e88360008860016118ca565b600160008154809291906001019190505550505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561223d576000600391509150612306565b601b8560ff16141580156122555750601c8560ff1614155b15612267576000600491509150612306565b60006001878787876040516000815260200160405260405161228c9493929190612f27565b6020604051602081039080840390855afa1580156122ae573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122fd57600060019250925050612306565b80600092509250505b94509492505050565b600060048111156123235761232261352e565b5b8160048111156123365761233561352e565b5b1415612341576124e1565b600160048111156123555761235461352e565b5b8160048111156123685761236761352e565b5b14156123a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a090612f8e565b60405180910390fd5b600260048111156123bd576123bc61352e565b5b8160048111156123d0576123cf61352e565b5b1415612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240890612fce565b60405180910390fd5b600360048111156124255761242461352e565b5b8160048111156124385761243761352e565b5b1415612479576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124709061304e565b60405180910390fd5b60048081111561248c5761248b61352e565b5b81600481111561249f5761249e61352e565b5b14156124e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d79061306e565b60405180910390fd5b5b50565b8280546124f0906133bb565b90600052602060002090601f0160209004810192826125125760008555612559565b82601f1061252b57803560ff1916838001178555612559565b82800160010185558215612559579182015b8281111561255857823582559160200191906001019061253d565b5b509050612566919061256a565b5090565b5b8082111561258357600081600090555060010161256b565b5090565b600061259a6125958461312e565b613109565b905080838252602082019050828560208602820111156125bd576125bc6135f4565b5b60005b858110156125ed57816125d38882612754565b8452602084019350602083019250506001810190506125c0565b5050509392505050565b600061260a6126058461315a565b613109565b905082815260208101848484011115612626576126256135f9565b5b612631848285613379565b509392505050565b600081359050612648816138d6565b92915050565b600082601f830112612663576126626135ef565b5b8135612673848260208601612587565b91505092915050565b60008135905061268b816138ed565b92915050565b6000813590506126a081613904565b92915050565b6000813590506126b58161391b565b92915050565b6000815190506126ca8161391b565b92915050565b600082601f8301126126e5576126e46135ef565b5b81356126f58482602086016125f7565b91505092915050565b60008083601f840112612714576127136135ef565b5b8235905067ffffffffffffffff811115612731576127306135ea565b5b60208301915083600182028301111561274d5761274c6135f4565b5b9250929050565b60008135905061276381613932565b92915050565b60008135905061277881613949565b92915050565b60006020828403121561279457612793613603565b5b60006127a284828501612639565b91505092915050565b600080604083850312156127c2576127c1613603565b5b60006127d085828601612639565b92505060206127e185828601612639565b9150509250929050565b60008060006060848603121561280457612803613603565b5b600061281286828701612639565b935050602061282386828701612639565b925050604061283486828701612754565b9150509250925092565b6000806000806080858703121561285857612857613603565b5b600061286687828801612639565b945050602061287787828801612639565b935050604061288887828801612754565b925050606085013567ffffffffffffffff8111156128a9576128a86135fe565b5b6128b5878288016126d0565b91505092959194509250565b600080604083850312156128d8576128d7613603565b5b60006128e685828601612639565b92505060206128f78582860161267c565b9150509250929050565b6000806040838503121561291857612917613603565b5b600061292685828601612639565b925050602061293785828601612754565b9150509250929050565b60006020828403121561295757612956613603565b5b600082013567ffffffffffffffff811115612975576129746135fe565b5b6129818482850161264e565b91505092915050565b6000602082840312156129a05761299f613603565b5b60006129ae8482850161267c565b91505092915050565b6000602082840312156129cd576129cc613603565b5b60006129db848285016126a6565b91505092915050565b6000602082840312156129fa576129f9613603565b5b6000612a08848285016126bb565b91505092915050565b60008060208385031215612a2857612a27613603565b5b600083013567ffffffffffffffff811115612a4657612a456135fe565b5b612a52858286016126fe565b92509250509250929050565b600060208284031215612a7457612a73613603565b5b6000612a8284828501612754565b91505092915050565b60008060008060808587031215612aa557612aa4613603565b5b6000612ab387828801612754565b9450506020612ac487828801612769565b9350506040612ad587828801612691565b9250506060612ae687828801612691565b91505092959194509250565b612afb816132ee565b82525050565b612b12612b0d826132ee565b613467565b82525050565b612b2181613300565b82525050565b612b308161330c565b82525050565b612b47612b428261330c565b613479565b82525050565b6000612b588261318b565b612b6281856131a1565b9350612b72818560208601613388565b612b7b81613608565b840191505092915050565b6000612b9182613196565b612b9b81856131bd565b9350612bab818560208601613388565b612bb481613608565b840191505092915050565b6000612bca82613196565b612bd481856131ce565b9350612be4818560208601613388565b80840191505092915050565b6000612bfd6018836131bd565b9150612c0882613626565b602082019050919050565b6000612c206008836131bd565b9150612c2b8261364f565b602082019050919050565b6000612c43601f836131bd565b9150612c4e82613678565b602082019050919050565b6000612c66601c836131ce565b9150612c71826136a1565b601c82019050919050565b6000612c89600e836131bd565b9150612c94826136ca565b602082019050919050565b6000612cac6026836131bd565b9150612cb7826136f3565b604082019050919050565b6000612ccf601d836131bd565b9150612cda82613742565b602082019050919050565b6000612cf26022836131bd565b9150612cfd8261376b565b604082019050919050565b6000612d156022836131bd565b9150612d20826137ba565b604082019050919050565b6000612d386005836131ce565b9150612d4382613809565b600582019050919050565b6000612d5b6020836131bd565b9150612d6682613832565b602082019050919050565b6000612d7e602f836131bd565b9150612d898261385b565b604082019050919050565b6000612da16000836131b2565b9150612dac826138aa565b600082019050919050565b6000612dc46018836131bd565b9150612dcf826138ad565b602082019050919050565b612de381613362565b82525050565b612dfa612df582613362565b613495565b82525050565b612e098161336c565b82525050565b6000612e1b8285612b01565b601482019150612e2b8284612de9565b6020820191508190509392505050565b6000612e478285612bbf565b9150612e538284612bbf565b9150612e5e82612d2b565b91508190509392505050565b6000612e7582612c59565b9150612e818284612b36565b60208201915081905092915050565b6000612e9b82612d94565b9150819050919050565b6000602082019050612eba6000830184612af2565b92915050565b6000608082019050612ed56000830187612af2565b612ee26020830186612af2565b612eef6040830185612dda565b8181036060830152612f018184612b4d565b905095945050505050565b6000602082019050612f216000830184612b18565b92915050565b6000608082019050612f3c6000830187612b27565b612f496020830186612e00565b612f566040830185612b27565b612f636060830184612b27565b95945050505050565b60006020820190508181036000830152612f868184612b86565b905092915050565b60006020820190508181036000830152612fa781612bf0565b9050919050565b60006020820190508181036000830152612fc781612c13565b9050919050565b60006020820190508181036000830152612fe781612c36565b9050919050565b6000602082019050818103600083015261300781612c7c565b9050919050565b6000602082019050818103600083015261302781612c9f565b9050919050565b6000602082019050818103600083015261304781612cc2565b9050919050565b6000602082019050818103600083015261306781612ce5565b9050919050565b6000602082019050818103600083015261308781612d08565b9050919050565b600060208201905081810360008301526130a781612d4e565b9050919050565b600060208201905081810360008301526130c781612d71565b9050919050565b600060208201905081810360008301526130e781612db7565b9050919050565b60006020820190506131036000830184612dda565b92915050565b6000613113613124565b905061311f82826133ed565b919050565b6000604051905090565b600067ffffffffffffffff821115613149576131486135bb565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613175576131746135bb565b5b61317e82613608565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006131e482613362565b91506131ef83613362565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613224576132236134d0565b5b828201905092915050565b600061323a82613362565b915061324583613362565b925082613255576132546134ff565b5b828204905092915050565b600061326b82613362565b915061327683613362565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132af576132ae6134d0565b5b828202905092915050565b60006132c582613362565b91506132d083613362565b9250828210156132e3576132e26134d0565b5b828203905092915050565b60006132f982613342565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156133a657808201518184015260208101905061338b565b838111156133b5576000848401525b50505050565b600060028204905060018216806133d357607f821691505b602082108114156133e7576133e661355d565b5b50919050565b6133f682613608565b810181811067ffffffffffffffff82111715613415576134146135bb565b5b80604052505050565b600061342982613362565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561345c5761345b6134d0565b5b600182019050919050565b600061347282613483565b9050919050565b6000819050919050565b600061348e82613619565b9050919050565b6000819050919050565b60006134aa82613362565b91506134b583613362565b9250826134c5576134c46134ff565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f534f4c44204f5554000000000000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4d696e74696e6720706175736564000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d617820706572207472616e73616374696f6e20706169642069732035000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f4d617820706572207472616e73616374696f6e20697320310000000000000000600082015250565b6138df816132ee565b81146138ea57600080fd5b50565b6138f681613300565b811461390157600080fd5b50565b61390d8161330c565b811461391857600080fd5b50565b61392481613316565b811461392f57600080fd5b50565b61393b81613362565b811461394657600080fd5b50565b6139528161336c565b811461395d57600080fd5b5056fea26469706673582212206ac86492bda7e4d1c981fe7909d37cdda5db9f33e7a51e5bbe2cbe793748950764736f6c63430008070033

Deployed Bytecode Sourcemap

67117:3013:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34225:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35127:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41610:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41051:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30878:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45317:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68964:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69427:137;;;;;;;;;;;;;:::i;:::-;;48230:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68851:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67516:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36520:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68125:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32062:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14973:103;;;;;;;;;;;;;:::i;:::-;;67672:447;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14325:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35303:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68532:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42168:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49013:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69048:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69889:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42633:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15231:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69570:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34225:639;34310:4;34649:10;34634:25;;:11;:25;;;;:102;;;;34726:10;34711:25;;:11;:25;;;;34634:102;:179;;;;34803:10;34788:25;;:11;:25;;;;34634:179;34614:199;;34225:639;;;:::o;35127:100::-;35181:13;35214:5;35207:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35127:100;:::o;41610:218::-;41686:7;41711:16;41719:7;41711;:16::i;:::-;41706:64;;41736:34;;;;;;;;;;;;;;41706:64;41790:15;:24;41806:7;41790:24;;;;;;;;;;;:30;;;;;;;;;;;;41783:37;;41610:218;;;:::o;41051:400::-;41132:13;41148:16;41156:7;41148;:16::i;:::-;41132:32;;41204:5;41181:28;;:19;:17;:19::i;:::-;:28;;;41177:175;;41229:44;41246:5;41253:19;:17;:19::i;:::-;41229:16;:44::i;:::-;41224:128;;41301:35;;;;;;;;;;;;;;41224:128;41177:175;41397:2;41364:15;:24;41380:7;41364:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;41435:7;41431:2;41415:28;;41424:5;41415:28;;;;;;;;;;;;41121:330;41051:400;;:::o;30878:323::-;30939:7;31167:15;:13;:15::i;:::-;31152:12;;31136:13;;:28;:46;31129:53;;30878:323;:::o;45317:2817::-;45451:27;45481;45500:7;45481:18;:27::i;:::-;45451:57;;45566:4;45525:45;;45541:19;45525:45;;;45521:86;;45579:28;;;;;;;;;;;;;;45521:86;45621:27;45650:23;45677:35;45704:7;45677:26;:35::i;:::-;45620:92;;;;45812:68;45837:15;45854:4;45860:19;:17;:19::i;:::-;45812:24;:68::i;:::-;45807:180;;45900:43;45917:4;45923:19;:17;:19::i;:::-;45900:16;:43::i;:::-;45895:92;;45952:35;;;;;;;;;;;;;;45895:92;45807:180;46018:1;46004:16;;:2;:16;;;46000:52;;;46029:23;;;;;;;;;;;;;;46000:52;46065:43;46087:4;46093:2;46097:7;46106:1;46065:21;:43::i;:::-;46201:15;46198:160;;;46341:1;46320:19;46313:30;46198:160;46738:18;:24;46757:4;46738:24;;;;;;;;;;;;;;;;46736:26;;;;;;;;;;;;46807:18;:22;46826:2;46807:22;;;;;;;;;;;;;;;;46805:24;;;;;;;;;;;47129:146;47166:2;47215:45;47230:4;47236:2;47240:19;47215:14;:45::i;:::-;27277:8;47187:73;47129:18;:146::i;:::-;47100:17;:26;47118:7;47100:26;;;;;;;;;;;:175;;;;47446:1;27277:8;47395:19;:47;:52;47391:627;;;47468:19;47500:1;47490:7;:11;47468:33;;47657:1;47623:17;:30;47641:11;47623:30;;;;;;;;;;;;:35;47619:384;;;47761:13;;47746:11;:28;47742:242;;47941:19;47908:17;:30;47926:11;47908:30;;;;;;;;;;;:52;;;;47742:242;47619:384;47449:569;47391:627;48065:7;48061:2;48046:27;;48055:4;48046:27;;;;;;;;;;;;48084:42;48105:4;48111:2;48115:7;48124:1;48084:20;:42::i;:::-;45440:2694;;;45317:2817;;;:::o;68964:78::-;14211:13;:11;:13::i;:::-;69030:6:::1;69021;;:15;;;;;;;;;;;;;;;;;;68964:78:::0;:::o;69427:137::-;14211:13;:11;:13::i;:::-;69472:7:::1;69493;:5;:7::i;:::-;69485:21;;69514;69485:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69471:69;;;69555:2;69547:11;;;::::0;::::1;;69464:100;69427:137::o:0;48230:185::-;48368:39;48385:4;48391:2;48395:7;48368:39;;;;;;;;;;;;:16;:39::i;:::-;48230:185;;;:::o;68851:107::-;14211:13;:11;:13::i;:::-;68941:11:::1;;68926:12;:26;;;;;;;:::i;:::-;;68851:107:::0;;:::o;67516:26::-;;;;;;;;;;;;;:::o;36520:152::-;36592:7;36635:27;36654:7;36635:18;:27::i;:::-;36612:52;;36520:152;;;:::o;68125:401::-;68197:6;;;;;;;;;;;68196:7;68188:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;68233:20;68256:13;:11;:13::i;:::-;68233:36;;68328:1;68315:10;;:14;;;;:::i;:::-;68303:9;68288:12;:24;;;;:::i;:::-;:41;68280:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;68393:1;68371:19;;:23;;;;:::i;:::-;68359:9;:35;68351:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;68470:10;;68458:9;:22;;;;:::i;:::-;68445:9;:35;;68437:44;;;;;;68492:28;68498:10;68510:9;68492:5;:28::i;:::-;68179:347;68125:401;:::o;32062:233::-;32134:7;32175:1;32158:19;;:5;:19;;;32154:60;;;32186:28;;;;;;;;;;;;;;32154:60;26221:13;32232:18;:25;32251:5;32232:25;;;;;;;;;;;;;;;;:55;32225:62;;32062:233;;;:::o;14973:103::-;14211:13;:11;:13::i;:::-;15038:30:::1;15065:1;15038:18;:30::i;:::-;14973:103::o:0;67672:447::-;67750:6;;;;;;;;;;;67749:7;67741:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;67823:19;;67792:16;:28;67809:10;67792:28;;;;;;;;;;;;;;;;:50;67784:59;;;;;;67854:20;67877:13;:11;:13::i;:::-;67854:36;;67949:1;67936:10;;:14;;;;:::i;:::-;67924:9;67909:12;:24;;;;:::i;:::-;:41;67901:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;67992:1;67980:9;:13;67972:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;68067:1;68035:16;:28;68052:10;68035:28;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;68079:28;68085:10;68097:9;68079:5;:28::i;:::-;67726:393;67672:447;:::o;14325:87::-;14371:7;14398:6;;;;;;;;;;;14391:13;;14325:87;:::o;35303:104::-;35359:13;35392:7;35385:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35303:104;:::o;68532:115::-;68595:7;68618:16;:23;68635:5;68618:23;;;;;;;;;;;;;;;;68611:30;;68532:115;;;:::o;42168:308::-;42279:19;:17;:19::i;:::-;42267:31;;:8;:31;;;42263:61;;;42307:17;;;;;;;;;;;;;;42263:61;42389:8;42337:18;:39;42356:19;:17;:19::i;:::-;42337:39;;;;;;;;;;;;;;;:49;42377:8;42337:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;42449:8;42413:55;;42428:19;:17;:19::i;:::-;42413:55;;;42459:8;42413:55;;;;;;:::i;:::-;;;;;;;;42168:308;;:::o;49013:399::-;49180:31;49193:4;49199:2;49203:7;49180:12;:31::i;:::-;49244:1;49226:2;:14;;;:19;49222:183;;49265:56;49296:4;49302:2;49306:7;49315:5;49265:30;:56::i;:::-;49260:145;;49349:40;;;;;;;;;;;;;;49260:145;49222:183;49013:399;;;;:::o;69048:371::-;69122:13;69152:17;69160:8;69152:7;:17::i;:::-;69144:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;69230:28;69261:10;:8;:10::i;:::-;69230:41;;69316:1;69291:14;69285:28;:32;:128;;;;;;;;;;;;;;;;;69353:14;69369:19;:8;:17;:19::i;:::-;69336:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69285:128;69278:135;;;69048:371;;;:::o;69889:238::-;14211:13;:11;:13::i;:::-;69965:11:::1;69979:8;:15;69965:29;;70010:9;70005:115;70025:3;70021:1;:7;70005:115;;;70050:15;70068:8;70077:1;70068:11;;;;;;;;:::i;:::-;;;;;;;;70050:29;;70094:14;70100:7;70094:5;:14::i;:::-;70035:85;70030:3;;;;;:::i;:::-;;;;70005:115;;;;69954:173;69889:238:::0;:::o;42633:164::-;42730:4;42754:18;:25;42773:5;42754:25;;;;;;;;;;;;;;;:35;42780:8;42754:35;;;;;;;;;;;;;;;;;;;;;;;;;42747:42;;42633:164;;;;:::o;15231:201::-;14211:13;:11;:13::i;:::-;15340:1:::1;15320:22;;:8;:22;;;;15312:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15396:28;15415:8;15396:18;:28::i;:::-;15231:201:::0;:::o;69570:315::-;69793:6;;;;;;;;;;;69699:100;;:90;69781:1;69784;69787;69699:73;69726:10;69738:7;69709:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69699:48;;;;;;:71;:73::i;:::-;:81;;:90;;;;;;:::i;:::-;:100;;;69695:158;;69823:18;;;;;;;;;;;;;;69695:158;69863:14;69869:7;69863:5;:14::i;:::-;69570:315;;;;:::o;43055:282::-;43120:4;43176:7;43157:15;:13;:15::i;:::-;:26;;:66;;;;;43210:13;;43200:7;:23;43157:66;:153;;;;;43309:1;26997:8;43261:17;:26;43279:7;43261:26;;;;;;;;;;;;:44;:49;43157:153;43137:173;;43055:282;;;:::o;64821:105::-;64881:7;64908:10;64901:17;;64821:105;:::o;68653:87::-;68710:7;68733:1;68726:8;;68653:87;:::o;37675:1275::-;37742:7;37762:12;37777:7;37762:22;;37845:4;37826:15;:13;:15::i;:::-;:23;37822:1061;;37879:13;;37872:4;:20;37868:1015;;;37917:14;37934:17;:23;37952:4;37934:23;;;;;;;;;;;;37917:40;;38051:1;26997:8;38023:6;:24;:29;38019:845;;;38688:113;38705:1;38695:6;:11;38688:113;;;38748:17;:25;38766:6;;;;;;;38748:25;;;;;;;;;;;;38739:34;;38688:113;;;38834:6;38827:13;;;;;;38019:845;37894:989;37868:1015;37822:1061;38911:31;;;;;;;;;;;;;;37675:1275;;;;:::o;44218:479::-;44320:27;44349:23;44390:38;44431:15;:24;44447:7;44431:24;;;;;;;;;;;44390:65;;44602:18;44579:41;;44659:19;44653:26;44634:45;;44564:126;44218:479;;;:::o;43446:659::-;43595:11;43760:16;43753:5;43749:28;43740:37;;43920:16;43909:9;43905:32;43892:45;;44070:15;44059:9;44056:30;44048:5;44037:9;44034:20;44031:56;44021:66;;43446:659;;;;;:::o;50074:159::-;;;;;:::o;64130:311::-;64265:7;64285:16;27401:3;64311:19;:41;;64285:68;;27401:3;64379:31;64390:4;64396:2;64400:9;64379:10;:31::i;:::-;64371:40;;:62;;64364:69;;;64130:311;;;;;:::o;39498:450::-;39578:14;39746:16;39739:5;39735:28;39726:37;;39923:5;39909:11;39884:23;39880:41;39877:52;39870:5;39867:63;39857:73;;39498:450;;;;:::o;50898:158::-;;;;;:::o;14490:132::-;14565:12;:10;:12::i;:::-;14554:23;;:7;:5;:7::i;:::-;:23;;;14546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14490:132::o;52674:2454::-;52747:20;52770:13;;52747:36;;52810:1;52798:8;:13;52794:44;;;52820:18;;;;;;;;;;;;;;52794:44;52851:61;52881:1;52885:2;52889:12;52903:8;52851:21;:61::i;:::-;53395:1;26359:2;53365:1;:26;;53364:32;53352:8;:45;53326:18;:22;53345:2;53326:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;53674:139;53711:2;53765:33;53788:1;53792:2;53796:1;53765:14;:33::i;:::-;53732:30;53753:8;53732:20;:30::i;:::-;:66;53674:18;:139::i;:::-;53640:17;:31;53658:12;53640:31;;;;;;;;;;;:173;;;;53830:16;53861:11;53890:8;53875:12;:23;53861:37;;54145:16;54141:2;54137:25;54125:37;;54517:12;54477:8;54436:1;54374:25;54315:1;54254;54227:335;54642:1;54628:12;54624:20;54582:346;54683:3;54674:7;54671:16;54582:346;;54901:7;54891:8;54888:1;54861:25;54858:1;54855;54850:59;54736:1;54727:7;54723:15;54712:26;;54582:346;;;54586:77;54973:1;54961:8;:13;54957:45;;;54983:19;;;;;;;;;;;;;;54957:45;55035:3;55019:13;:19;;;;53100:1950;;55060:60;55089:1;55093:2;55097:12;55111:8;55060:20;:60::i;:::-;52736:2392;52674:2454;;:::o;15592:191::-;15666:16;15685:6;;;;;;;;;;;15666:25;;15711:8;15702:6;;:17;;;;;;;;;;;;;;;;;;15766:8;15735:40;;15756:8;15735:40;;;;;;;;;;;;15655:128;15592:191;:::o;51496:716::-;51659:4;51705:2;51680:45;;;51726:19;:17;:19::i;:::-;51747:4;51753:7;51762:5;51680:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51676:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51980:1;51963:6;:13;:18;51959:235;;;52009:40;;;;;;;;;;;;;;51959:235;52152:6;52146:13;52137:6;52133:2;52129:15;52122:38;51676:529;51849:54;;;51839:64;;;:6;:64;;;;51832:71;;;51496:716;;;;;;:::o;68746:99::-;68798:13;68827:12;68820:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68746:99;:::o;500:723::-;556:13;786:1;777:5;:10;773:53;;;804:10;;;;;;;;;;;;;;;;;;;;;773:53;836:12;851:5;836:20;;867:14;892:78;907:1;899:4;:9;892:78;;925:8;;;;;:::i;:::-;;;;956:2;948:10;;;;;:::i;:::-;;;892:78;;;980:19;1012:6;1002:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;980:39;;1030:154;1046:1;1037:5;:10;1030:154;;1074:1;1064:11;;;;;:::i;:::-;;;1141:2;1133:5;:10;;;;:::i;:::-;1120:2;:24;;;;:::i;:::-;1107:39;;1090:6;1097;1090:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1170:2;1161:11;;;;;:::i;:::-;;;1030:154;;;1208:6;1194:21;;;;;500:723;;;;:::o;59032:89::-;59092:21;59098:7;59107:5;59092;:21::i;:::-;59032:89;:::o;10882:269::-;10951:7;11137:4;11084:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;11074:69;;;;;;11067:76;;10882:269;;;:::o;10303:279::-;10431:7;10452:17;10471:18;10493:25;10504:4;10510:1;10513;10516;10493:10;:25::i;:::-;10451:67;;;;10529:18;10541:5;10529:11;:18::i;:::-;10565:9;10558:16;;;;10303:279;;;;;;:::o;63831:147::-;63968:6;63831:147;;;;;:::o;12876:98::-;12929:7;12956:10;12949:17;;12876:98;:::o;40050:324::-;40120:14;40353:1;40343:8;40340:15;40314:24;40310:46;40300:56;;40050:324;;;:::o;59350:3081::-;59430:27;59460;59479:7;59460:18;:27::i;:::-;59430:57;;59500:12;59531:19;59500:52;;59566:27;59595:23;59622:35;59649:7;59622:26;:35::i;:::-;59565:92;;;;59674:13;59670:316;;;59795:68;59820:15;59837:4;59843:19;:17;:19::i;:::-;59795:24;:68::i;:::-;59790:184;;59887:43;59904:4;59910:19;:17;:19::i;:::-;59887:16;:43::i;:::-;59882:92;;59939:35;;;;;;;;;;;;;;59882:92;59790:184;59670:316;59998:51;60020:4;60034:1;60038:7;60047:1;59998:21;:51::i;:::-;60142:15;60139:160;;;60282:1;60261:19;60254:30;60139:160;60960:1;26486:3;60930:1;:26;;60929:32;60901:18;:24;60920:4;60901:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;61228:176;61265:4;61336:53;61351:4;61365:1;61369:19;61336:14;:53::i;:::-;27277:8;26997;61289:43;61288:101;61228:18;:176::i;:::-;61199:17;:26;61217:7;61199:26;;;;;;;;;;;:205;;;;61575:1;27277:8;61524:19;:47;:52;61520:627;;;61597:19;61629:1;61619:7;:11;61597:33;;61786:1;61752:17;:30;61770:11;61752:30;;;;;;;;;;;;:35;61748:384;;;61890:13;;61875:11;:28;61871:242;;62070:19;62037:17;:30;62055:11;62037:30;;;;;;;;;;;:52;;;;61871:242;61748:384;61578:569;61520:627;62202:7;62198:1;62175:35;;62184:4;62175:35;;;;;;;;;;;;62221:50;62242:4;62256:1;62260:7;62269:1;62221:20;:50::i;:::-;62398:12;;:14;;;;;;;;;;;;;59419:3012;;;;59350:3081;;:::o;8532:1632::-;8663:7;8672:12;9597:66;9592:1;9584:10;;:79;9580:163;;;9696:1;9700:30;9680:51;;;;;;9580:163;9762:2;9757:1;:7;;;;:18;;;;;9773:2;9768:1;:7;;;;9757:18;9753:102;;;9808:1;9812:30;9792:51;;;;;;9753:102;9952:14;9969:24;9979:4;9985:1;9988;9991;9969:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9952:41;;10026:1;10008:20;;:6;:20;;;10004:103;;;10061:1;10065:29;10045:50;;;;;;;10004:103;10127:6;10135:20;10119:37;;;;;8532:1632;;;;;;;;:::o;3145:643::-;3223:20;3214:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;3210:571;;;3260:7;;3210:571;3321:29;3312:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;3308:473;;;3367:34;;;;;;;;;;:::i;:::-;;;;;;;;3308:473;3432:35;3423:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;3419:362;;;3484:41;;;;;;;;;;:::i;:::-;;;;;;;;3419:362;3556:30;3547:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3543:238;;;3603:44;;;;;;;;;;:::i;:::-;;;;;;;;3543:238;3678:30;3669:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3665:116;;;3725:44;;;;;;;;;;:::i;:::-;;;;;;;;3665:116;3145:643;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1330:370::-;1401:5;1450:3;1443:4;1435:6;1431:17;1427:27;1417:122;;1458:79;;:::i;:::-;1417:122;1575:6;1562:20;1600:94;1690:3;1682:6;1675:4;1667:6;1663:17;1600:94;:::i;:::-;1591:103;;1407:293;1330:370;;;;:::o;1706:133::-;1749:5;1787:6;1774:20;1765:29;;1803:30;1827:5;1803:30;:::i;:::-;1706:133;;;;:::o;1845:139::-;1891:5;1929:6;1916:20;1907:29;;1945:33;1972:5;1945:33;:::i;:::-;1845:139;;;;:::o;1990:137::-;2035:5;2073:6;2060:20;2051:29;;2089:32;2115:5;2089:32;:::i;:::-;1990:137;;;;:::o;2133:141::-;2189:5;2220:6;2214:13;2205:22;;2236:32;2262:5;2236:32;:::i;:::-;2133:141;;;;:::o;2293:338::-;2348:5;2397:3;2390:4;2382:6;2378:17;2374:27;2364:122;;2405:79;;:::i;:::-;2364:122;2522:6;2509:20;2547:78;2621:3;2613:6;2606:4;2598:6;2594:17;2547:78;:::i;:::-;2538:87;;2354:277;2293:338;;;;:::o;2651:553::-;2709:8;2719:6;2769:3;2762:4;2754:6;2750:17;2746:27;2736:122;;2777:79;;:::i;:::-;2736:122;2890:6;2877:20;2867:30;;2920:18;2912:6;2909:30;2906:117;;;2942:79;;:::i;:::-;2906:117;3056:4;3048:6;3044:17;3032:29;;3110:3;3102:4;3094:6;3090:17;3080:8;3076:32;3073:41;3070:128;;;3117:79;;:::i;:::-;3070:128;2651:553;;;;;:::o;3210:139::-;3256:5;3294:6;3281:20;3272:29;;3310:33;3337:5;3310:33;:::i;:::-;3210:139;;;;:::o;3355:135::-;3399:5;3437:6;3424:20;3415:29;;3453:31;3478:5;3453:31;:::i;:::-;3355:135;;;;:::o;3496:329::-;3555:6;3604:2;3592:9;3583:7;3579:23;3575:32;3572:119;;;3610:79;;:::i;:::-;3572:119;3730:1;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3701:117;3496:329;;;;:::o;3831:474::-;3899:6;3907;3956:2;3944:9;3935:7;3931:23;3927:32;3924:119;;;3962:79;;:::i;:::-;3924:119;4082:1;4107:53;4152:7;4143:6;4132:9;4128:22;4107:53;:::i;:::-;4097:63;;4053:117;4209:2;4235:53;4280:7;4271:6;4260:9;4256:22;4235:53;:::i;:::-;4225:63;;4180:118;3831:474;;;;;:::o;4311:619::-;4388:6;4396;4404;4453:2;4441:9;4432:7;4428:23;4424:32;4421:119;;;4459:79;;:::i;:::-;4421:119;4579:1;4604:53;4649:7;4640:6;4629:9;4625:22;4604:53;:::i;:::-;4594:63;;4550:117;4706:2;4732:53;4777:7;4768:6;4757:9;4753:22;4732:53;:::i;:::-;4722:63;;4677:118;4834:2;4860:53;4905:7;4896:6;4885:9;4881:22;4860:53;:::i;:::-;4850:63;;4805:118;4311:619;;;;;:::o;4936:943::-;5031:6;5039;5047;5055;5104:3;5092:9;5083:7;5079:23;5075:33;5072:120;;;5111:79;;:::i;:::-;5072:120;5231:1;5256:53;5301:7;5292:6;5281:9;5277:22;5256:53;:::i;:::-;5246:63;;5202:117;5358:2;5384:53;5429:7;5420:6;5409:9;5405:22;5384:53;:::i;:::-;5374:63;;5329:118;5486:2;5512:53;5557:7;5548:6;5537:9;5533:22;5512:53;:::i;:::-;5502:63;;5457:118;5642:2;5631:9;5627:18;5614:32;5673:18;5665:6;5662:30;5659:117;;;5695:79;;:::i;:::-;5659:117;5800:62;5854:7;5845:6;5834:9;5830:22;5800:62;:::i;:::-;5790:72;;5585:287;4936:943;;;;;;;:::o;5885:468::-;5950:6;5958;6007:2;5995:9;5986:7;5982:23;5978:32;5975:119;;;6013:79;;:::i;:::-;5975:119;6133:1;6158:53;6203:7;6194:6;6183:9;6179:22;6158:53;:::i;:::-;6148:63;;6104:117;6260:2;6286:50;6328:7;6319:6;6308:9;6304:22;6286:50;:::i;:::-;6276:60;;6231:115;5885:468;;;;;:::o;6359:474::-;6427:6;6435;6484:2;6472:9;6463:7;6459:23;6455:32;6452:119;;;6490:79;;:::i;:::-;6452:119;6610:1;6635:53;6680:7;6671:6;6660:9;6656:22;6635:53;:::i;:::-;6625:63;;6581:117;6737:2;6763:53;6808:7;6799:6;6788:9;6784:22;6763:53;:::i;:::-;6753:63;;6708:118;6359:474;;;;;:::o;6839:539::-;6923:6;6972:2;6960:9;6951:7;6947:23;6943:32;6940:119;;;6978:79;;:::i;:::-;6940:119;7126:1;7115:9;7111:17;7098:31;7156:18;7148:6;7145:30;7142:117;;;7178:79;;:::i;:::-;7142:117;7283:78;7353:7;7344:6;7333:9;7329:22;7283:78;:::i;:::-;7273:88;;7069:302;6839:539;;;;:::o;7384:323::-;7440:6;7489:2;7477:9;7468:7;7464:23;7460:32;7457:119;;;7495:79;;:::i;:::-;7457:119;7615:1;7640:50;7682:7;7673:6;7662:9;7658:22;7640:50;:::i;:::-;7630:60;;7586:114;7384:323;;;;:::o;7713:327::-;7771:6;7820:2;7808:9;7799:7;7795:23;7791:32;7788:119;;;7826:79;;:::i;:::-;7788:119;7946:1;7971:52;8015:7;8006:6;7995:9;7991:22;7971:52;:::i;:::-;7961:62;;7917:116;7713:327;;;;:::o;8046:349::-;8115:6;8164:2;8152:9;8143:7;8139:23;8135:32;8132:119;;;8170:79;;:::i;:::-;8132:119;8290:1;8315:63;8370:7;8361:6;8350:9;8346:22;8315:63;:::i;:::-;8305:73;;8261:127;8046:349;;;;:::o;8401:529::-;8472:6;8480;8529:2;8517:9;8508:7;8504:23;8500:32;8497:119;;;8535:79;;:::i;:::-;8497:119;8683:1;8672:9;8668:17;8655:31;8713:18;8705:6;8702:30;8699:117;;;8735:79;;:::i;:::-;8699:117;8848:65;8905:7;8896:6;8885:9;8881:22;8848:65;:::i;:::-;8830:83;;;;8626:297;8401:529;;;;;:::o;8936:329::-;8995:6;9044:2;9032:9;9023:7;9019:23;9015:32;9012:119;;;9050:79;;:::i;:::-;9012:119;9170:1;9195:53;9240:7;9231:6;9220:9;9216:22;9195:53;:::i;:::-;9185:63;;9141:117;8936:329;;;;:::o;9271:761::-;9355:6;9363;9371;9379;9428:3;9416:9;9407:7;9403:23;9399:33;9396:120;;;9435:79;;:::i;:::-;9396:120;9555:1;9580:53;9625:7;9616:6;9605:9;9601:22;9580:53;:::i;:::-;9570:63;;9526:117;9682:2;9708:51;9751:7;9742:6;9731:9;9727:22;9708:51;:::i;:::-;9698:61;;9653:116;9808:2;9834:53;9879:7;9870:6;9859:9;9855:22;9834:53;:::i;:::-;9824:63;;9779:118;9936:2;9962:53;10007:7;9998:6;9987:9;9983:22;9962:53;:::i;:::-;9952:63;;9907:118;9271:761;;;;;;;:::o;10038:118::-;10125:24;10143:5;10125:24;:::i;:::-;10120:3;10113:37;10038:118;;:::o;10162:157::-;10267:45;10287:24;10305:5;10287:24;:::i;:::-;10267:45;:::i;:::-;10262:3;10255:58;10162:157;;:::o;10325:109::-;10406:21;10421:5;10406:21;:::i;:::-;10401:3;10394:34;10325:109;;:::o;10440:118::-;10527:24;10545:5;10527:24;:::i;:::-;10522:3;10515:37;10440:118;;:::o;10564:157::-;10669:45;10689:24;10707:5;10689:24;:::i;:::-;10669:45;:::i;:::-;10664:3;10657:58;10564:157;;:::o;10727:360::-;10813:3;10841:38;10873:5;10841:38;:::i;:::-;10895:70;10958:6;10953:3;10895:70;:::i;:::-;10888:77;;10974:52;11019:6;11014:3;11007:4;11000:5;10996:16;10974:52;:::i;:::-;11051:29;11073:6;11051:29;:::i;:::-;11046:3;11042:39;11035:46;;10817:270;10727:360;;;;:::o;11093:364::-;11181:3;11209:39;11242:5;11209:39;:::i;:::-;11264:71;11328:6;11323:3;11264:71;:::i;:::-;11257:78;;11344:52;11389:6;11384:3;11377:4;11370:5;11366:16;11344:52;:::i;:::-;11421:29;11443:6;11421:29;:::i;:::-;11416:3;11412:39;11405:46;;11185:272;11093:364;;;;:::o;11463:377::-;11569:3;11597:39;11630:5;11597:39;:::i;:::-;11652:89;11734:6;11729:3;11652:89;:::i;:::-;11645:96;;11750:52;11795:6;11790:3;11783:4;11776:5;11772:16;11750:52;:::i;:::-;11827:6;11822:3;11818:16;11811:23;;11573:267;11463:377;;;;:::o;11846:366::-;11988:3;12009:67;12073:2;12068:3;12009:67;:::i;:::-;12002:74;;12085:93;12174:3;12085:93;:::i;:::-;12203:2;12198:3;12194:12;12187:19;;11846:366;;;:::o;12218:365::-;12360:3;12381:66;12445:1;12440:3;12381:66;:::i;:::-;12374:73;;12456:93;12545:3;12456:93;:::i;:::-;12574:2;12569:3;12565:12;12558:19;;12218:365;;;:::o;12589:366::-;12731:3;12752:67;12816:2;12811:3;12752:67;:::i;:::-;12745:74;;12828:93;12917:3;12828:93;:::i;:::-;12946:2;12941:3;12937:12;12930:19;;12589:366;;;:::o;12961:402::-;13121:3;13142:85;13224:2;13219:3;13142:85;:::i;:::-;13135:92;;13236:93;13325:3;13236:93;:::i;:::-;13354:2;13349:3;13345:12;13338:19;;12961:402;;;:::o;13369:366::-;13511:3;13532:67;13596:2;13591:3;13532:67;:::i;:::-;13525:74;;13608:93;13697:3;13608:93;:::i;:::-;13726:2;13721:3;13717:12;13710:19;;13369:366;;;:::o;13741:::-;13883:3;13904:67;13968:2;13963:3;13904:67;:::i;:::-;13897:74;;13980:93;14069:3;13980:93;:::i;:::-;14098:2;14093:3;14089:12;14082:19;;13741:366;;;:::o;14113:::-;14255:3;14276:67;14340:2;14335:3;14276:67;:::i;:::-;14269:74;;14352:93;14441:3;14352:93;:::i;:::-;14470:2;14465:3;14461:12;14454:19;;14113:366;;;:::o;14485:::-;14627:3;14648:67;14712:2;14707:3;14648:67;:::i;:::-;14641:74;;14724:93;14813:3;14724:93;:::i;:::-;14842:2;14837:3;14833:12;14826:19;;14485:366;;;:::o;14857:::-;14999:3;15020:67;15084:2;15079:3;15020:67;:::i;:::-;15013:74;;15096:93;15185:3;15096:93;:::i;:::-;15214:2;15209:3;15205:12;15198:19;;14857:366;;;:::o;15229:400::-;15389:3;15410:84;15492:1;15487:3;15410:84;:::i;:::-;15403:91;;15503:93;15592:3;15503:93;:::i;:::-;15621:1;15616:3;15612:11;15605:18;;15229:400;;;:::o;15635:366::-;15777:3;15798:67;15862:2;15857:3;15798:67;:::i;:::-;15791:74;;15874:93;15963:3;15874:93;:::i;:::-;15992:2;15987:3;15983:12;15976:19;;15635:366;;;:::o;16007:::-;16149:3;16170:67;16234:2;16229:3;16170:67;:::i;:::-;16163:74;;16246:93;16335:3;16246:93;:::i;:::-;16364:2;16359:3;16355:12;16348:19;;16007:366;;;:::o;16379:398::-;16538:3;16559:83;16640:1;16635:3;16559:83;:::i;:::-;16552:90;;16651:93;16740:3;16651:93;:::i;:::-;16769:1;16764:3;16760:11;16753:18;;16379:398;;;:::o;16783:366::-;16925:3;16946:67;17010:2;17005:3;16946:67;:::i;:::-;16939:74;;17022:93;17111:3;17022:93;:::i;:::-;17140:2;17135:3;17131:12;17124:19;;16783:366;;;:::o;17155:118::-;17242:24;17260:5;17242:24;:::i;:::-;17237:3;17230:37;17155:118;;:::o;17279:157::-;17384:45;17404:24;17422:5;17404:24;:::i;:::-;17384:45;:::i;:::-;17379:3;17372:58;17279:157;;:::o;17442:112::-;17525:22;17541:5;17525:22;:::i;:::-;17520:3;17513:35;17442:112;;:::o;17560:397::-;17700:3;17715:75;17786:3;17777:6;17715:75;:::i;:::-;17815:2;17810:3;17806:12;17799:19;;17828:75;17899:3;17890:6;17828:75;:::i;:::-;17928:2;17923:3;17919:12;17912:19;;17948:3;17941:10;;17560:397;;;;;:::o;17963:701::-;18244:3;18266:95;18357:3;18348:6;18266:95;:::i;:::-;18259:102;;18378:95;18469:3;18460:6;18378:95;:::i;:::-;18371:102;;18490:148;18634:3;18490:148;:::i;:::-;18483:155;;18655:3;18648:10;;17963:701;;;;;:::o;18670:522::-;18883:3;18905:148;19049:3;18905:148;:::i;:::-;18898:155;;19063:75;19134:3;19125:6;19063:75;:::i;:::-;19163:2;19158:3;19154:12;19147:19;;19183:3;19176:10;;18670:522;;;;:::o;19198:379::-;19382:3;19404:147;19547:3;19404:147;:::i;:::-;19397:154;;19568:3;19561:10;;19198:379;;;:::o;19583:222::-;19676:4;19714:2;19703:9;19699:18;19691:26;;19727:71;19795:1;19784:9;19780:17;19771:6;19727:71;:::i;:::-;19583:222;;;;:::o;19811:640::-;20006:4;20044:3;20033:9;20029:19;20021:27;;20058:71;20126:1;20115:9;20111:17;20102:6;20058:71;:::i;:::-;20139:72;20207:2;20196:9;20192:18;20183:6;20139:72;:::i;:::-;20221;20289:2;20278:9;20274:18;20265:6;20221:72;:::i;:::-;20340:9;20334:4;20330:20;20325:2;20314:9;20310:18;20303:48;20368:76;20439:4;20430:6;20368:76;:::i;:::-;20360:84;;19811:640;;;;;;;:::o;20457:210::-;20544:4;20582:2;20571:9;20567:18;20559:26;;20595:65;20657:1;20646:9;20642:17;20633:6;20595:65;:::i;:::-;20457:210;;;;:::o;20673:545::-;20846:4;20884:3;20873:9;20869:19;20861:27;;20898:71;20966:1;20955:9;20951:17;20942:6;20898:71;:::i;:::-;20979:68;21043:2;21032:9;21028:18;21019:6;20979:68;:::i;:::-;21057:72;21125:2;21114:9;21110:18;21101:6;21057:72;:::i;:::-;21139;21207:2;21196:9;21192:18;21183:6;21139:72;:::i;:::-;20673:545;;;;;;;:::o;21224:313::-;21337:4;21375:2;21364:9;21360:18;21352:26;;21424:9;21418:4;21414:20;21410:1;21399:9;21395:17;21388:47;21452:78;21525:4;21516:6;21452:78;:::i;:::-;21444:86;;21224:313;;;;:::o;21543:419::-;21709:4;21747:2;21736:9;21732:18;21724:26;;21796:9;21790:4;21786:20;21782:1;21771:9;21767:17;21760:47;21824:131;21950:4;21824:131;:::i;:::-;21816:139;;21543:419;;;:::o;21968:::-;22134:4;22172:2;22161:9;22157:18;22149:26;;22221:9;22215:4;22211:20;22207:1;22196:9;22192:17;22185:47;22249:131;22375:4;22249:131;:::i;:::-;22241:139;;21968:419;;;:::o;22393:::-;22559:4;22597:2;22586:9;22582:18;22574:26;;22646:9;22640:4;22636:20;22632:1;22621:9;22617:17;22610:47;22674:131;22800:4;22674:131;:::i;:::-;22666:139;;22393:419;;;:::o;22818:::-;22984:4;23022:2;23011:9;23007:18;22999:26;;23071:9;23065:4;23061:20;23057:1;23046:9;23042:17;23035:47;23099:131;23225:4;23099:131;:::i;:::-;23091:139;;22818:419;;;:::o;23243:::-;23409:4;23447:2;23436:9;23432:18;23424:26;;23496:9;23490:4;23486:20;23482:1;23471:9;23467:17;23460:47;23524:131;23650:4;23524:131;:::i;:::-;23516:139;;23243:419;;;:::o;23668:::-;23834:4;23872:2;23861:9;23857:18;23849:26;;23921:9;23915:4;23911:20;23907:1;23896:9;23892:17;23885:47;23949:131;24075:4;23949:131;:::i;:::-;23941:139;;23668:419;;;:::o;24093:::-;24259:4;24297:2;24286:9;24282:18;24274:26;;24346:9;24340:4;24336:20;24332:1;24321:9;24317:17;24310:47;24374:131;24500:4;24374:131;:::i;:::-;24366:139;;24093:419;;;:::o;24518:::-;24684:4;24722:2;24711:9;24707:18;24699:26;;24771:9;24765:4;24761:20;24757:1;24746:9;24742:17;24735:47;24799:131;24925:4;24799:131;:::i;:::-;24791:139;;24518:419;;;:::o;24943:::-;25109:4;25147:2;25136:9;25132:18;25124:26;;25196:9;25190:4;25186:20;25182:1;25171:9;25167:17;25160:47;25224:131;25350:4;25224:131;:::i;:::-;25216:139;;24943:419;;;:::o;25368:::-;25534:4;25572:2;25561:9;25557:18;25549:26;;25621:9;25615:4;25611:20;25607:1;25596:9;25592:17;25585:47;25649:131;25775:4;25649:131;:::i;:::-;25641:139;;25368:419;;;:::o;25793:::-;25959:4;25997:2;25986:9;25982:18;25974:26;;26046:9;26040:4;26036:20;26032:1;26021:9;26017:17;26010:47;26074:131;26200:4;26074:131;:::i;:::-;26066:139;;25793:419;;;:::o;26218:222::-;26311:4;26349:2;26338:9;26334:18;26326:26;;26362:71;26430:1;26419:9;26415:17;26406:6;26362:71;:::i;:::-;26218:222;;;;:::o;26446:129::-;26480:6;26507:20;;:::i;:::-;26497:30;;26536:33;26564:4;26556:6;26536:33;:::i;:::-;26446:129;;;:::o;26581:75::-;26614:6;26647:2;26641:9;26631:19;;26581:75;:::o;26662:311::-;26739:4;26829:18;26821:6;26818:30;26815:56;;;26851:18;;:::i;:::-;26815:56;26901:4;26893:6;26889:17;26881:25;;26961:4;26955;26951:15;26943:23;;26662:311;;;:::o;26979:307::-;27040:4;27130:18;27122:6;27119:30;27116:56;;;27152:18;;:::i;:::-;27116:56;27190:29;27212:6;27190:29;:::i;:::-;27182:37;;27274:4;27268;27264:15;27256:23;;26979:307;;;:::o;27292:98::-;27343:6;27377:5;27371:12;27361:22;;27292:98;;;:::o;27396:99::-;27448:6;27482:5;27476:12;27466:22;;27396:99;;;:::o;27501:168::-;27584:11;27618:6;27613:3;27606:19;27658:4;27653:3;27649:14;27634:29;;27501:168;;;;:::o;27675:147::-;27776:11;27813:3;27798:18;;27675:147;;;;:::o;27828:169::-;27912:11;27946:6;27941:3;27934:19;27986:4;27981:3;27977:14;27962:29;;27828:169;;;;:::o;28003:148::-;28105:11;28142:3;28127:18;;28003:148;;;;:::o;28157:305::-;28197:3;28216:20;28234:1;28216:20;:::i;:::-;28211:25;;28250:20;28268:1;28250:20;:::i;:::-;28245:25;;28404:1;28336:66;28332:74;28329:1;28326:81;28323:107;;;28410:18;;:::i;:::-;28323:107;28454:1;28451;28447:9;28440:16;;28157:305;;;;:::o;28468:185::-;28508:1;28525:20;28543:1;28525:20;:::i;:::-;28520:25;;28559:20;28577:1;28559:20;:::i;:::-;28554:25;;28598:1;28588:35;;28603:18;;:::i;:::-;28588:35;28645:1;28642;28638:9;28633:14;;28468:185;;;;:::o;28659:348::-;28699:7;28722:20;28740:1;28722:20;:::i;:::-;28717:25;;28756:20;28774:1;28756:20;:::i;:::-;28751:25;;28944:1;28876:66;28872:74;28869:1;28866:81;28861:1;28854:9;28847:17;28843:105;28840:131;;;28951:18;;:::i;:::-;28840:131;28999:1;28996;28992:9;28981:20;;28659:348;;;;:::o;29013:191::-;29053:4;29073:20;29091:1;29073:20;:::i;:::-;29068:25;;29107:20;29125:1;29107:20;:::i;:::-;29102:25;;29146:1;29143;29140:8;29137:34;;;29151:18;;:::i;:::-;29137:34;29196:1;29193;29189:9;29181:17;;29013:191;;;;:::o;29210:96::-;29247:7;29276:24;29294:5;29276:24;:::i;:::-;29265:35;;29210:96;;;:::o;29312:90::-;29346:7;29389:5;29382:13;29375:21;29364:32;;29312:90;;;:::o;29408:77::-;29445:7;29474:5;29463:16;;29408:77;;;:::o;29491:149::-;29527:7;29567:66;29560:5;29556:78;29545:89;;29491:149;;;:::o;29646:126::-;29683:7;29723:42;29716:5;29712:54;29701:65;;29646:126;;;:::o;29778:77::-;29815:7;29844:5;29833:16;;29778:77;;;:::o;29861:86::-;29896:7;29936:4;29929:5;29925:16;29914:27;;29861:86;;;:::o;29953:154::-;30037:6;30032:3;30027;30014:30;30099:1;30090:6;30085:3;30081:16;30074:27;29953:154;;;:::o;30113:307::-;30181:1;30191:113;30205:6;30202:1;30199:13;30191:113;;;30290:1;30285:3;30281:11;30275:18;30271:1;30266:3;30262:11;30255:39;30227:2;30224:1;30220:10;30215:15;;30191:113;;;30322:6;30319:1;30316:13;30313:101;;;30402:1;30393:6;30388:3;30384:16;30377:27;30313:101;30162:258;30113:307;;;:::o;30426:320::-;30470:6;30507:1;30501:4;30497:12;30487:22;;30554:1;30548:4;30544:12;30575:18;30565:81;;30631:4;30623:6;30619:17;30609:27;;30565:81;30693:2;30685:6;30682:14;30662:18;30659:38;30656:84;;;30712:18;;:::i;:::-;30656:84;30477:269;30426:320;;;:::o;30752:281::-;30835:27;30857:4;30835:27;:::i;:::-;30827:6;30823:40;30965:6;30953:10;30950:22;30929:18;30917:10;30914:34;30911:62;30908:88;;;30976:18;;:::i;:::-;30908:88;31016:10;31012:2;31005:22;30795:238;30752:281;;:::o;31039:233::-;31078:3;31101:24;31119:5;31101:24;:::i;:::-;31092:33;;31147:66;31140:5;31137:77;31134:103;;;31217:18;;:::i;:::-;31134:103;31264:1;31257:5;31253:13;31246:20;;31039:233;;;:::o;31278:100::-;31317:7;31346:26;31366:5;31346:26;:::i;:::-;31335:37;;31278:100;;;:::o;31384:79::-;31423:7;31452:5;31441:16;;31384:79;;;:::o;31469:94::-;31508:7;31537:20;31551:5;31537:20;:::i;:::-;31526:31;;31469:94;;;:::o;31569:79::-;31608:7;31637:5;31626:16;;31569:79;;;:::o;31654:176::-;31686:1;31703:20;31721:1;31703:20;:::i;:::-;31698:25;;31737:20;31755:1;31737:20;:::i;:::-;31732:25;;31776:1;31766:35;;31781:18;;:::i;:::-;31766:35;31822:1;31819;31815:9;31810:14;;31654:176;;;;:::o;31836:180::-;31884:77;31881:1;31874:88;31981:4;31978:1;31971:15;32005:4;32002:1;31995:15;32022:180;32070:77;32067:1;32060:88;32167:4;32164:1;32157:15;32191:4;32188:1;32181:15;32208:180;32256:77;32253:1;32246:88;32353:4;32350:1;32343:15;32377:4;32374:1;32367:15;32394:180;32442:77;32439:1;32432:88;32539:4;32536:1;32529:15;32563:4;32560:1;32553:15;32580:180;32628:77;32625:1;32618:88;32725:4;32722:1;32715:15;32749:4;32746:1;32739:15;32766:180;32814:77;32811:1;32804:88;32911:4;32908:1;32901:15;32935:4;32932:1;32925:15;32952:117;33061:1;33058;33051:12;33075:117;33184:1;33181;33174:12;33198:117;33307:1;33304;33297:12;33321:117;33430:1;33427;33420:12;33444:117;33553:1;33550;33543:12;33567:117;33676:1;33673;33666:12;33690:102;33731:6;33782:2;33778:7;33773:2;33766:5;33762:14;33758:28;33748:38;;33690:102;;;:::o;33798:94::-;33831:8;33879:5;33875:2;33871:14;33850:35;;33798:94;;;:::o;33898:174::-;34038:26;34034:1;34026:6;34022:14;34015:50;33898:174;:::o;34078:158::-;34218:10;34214:1;34206:6;34202:14;34195:34;34078:158;:::o;34242:181::-;34382:33;34378:1;34370:6;34366:14;34359:57;34242:181;:::o;34429:214::-;34569:66;34565:1;34557:6;34553:14;34546:90;34429:214;:::o;34649:164::-;34789:16;34785:1;34777:6;34773:14;34766:40;34649:164;:::o;34819:225::-;34959:34;34955:1;34947:6;34943:14;34936:58;35028:8;35023:2;35015:6;35011:15;35004:33;34819:225;:::o;35050:179::-;35190:31;35186:1;35178:6;35174:14;35167:55;35050:179;:::o;35235:221::-;35375:34;35371:1;35363:6;35359:14;35352:58;35444:4;35439:2;35431:6;35427:15;35420:29;35235:221;:::o;35462:::-;35602:34;35598:1;35590:6;35586:14;35579:58;35671:4;35666:2;35658:6;35654:15;35647:29;35462:221;:::o;35689:155::-;35829:7;35825:1;35817:6;35813:14;35806:31;35689:155;:::o;35850:182::-;35990:34;35986:1;35978:6;35974:14;35967:58;35850:182;:::o;36038:234::-;36178:34;36174:1;36166:6;36162:14;36155:58;36247:17;36242:2;36234:6;36230:15;36223:42;36038:234;:::o;36278:114::-;;:::o;36398:174::-;36538:26;36534:1;36526:6;36522:14;36515:50;36398:174;:::o;36578:122::-;36651:24;36669:5;36651:24;:::i;:::-;36644:5;36641:35;36631:63;;36690:1;36687;36680:12;36631:63;36578:122;:::o;36706:116::-;36776:21;36791:5;36776:21;:::i;:::-;36769:5;36766:32;36756:60;;36812:1;36809;36802:12;36756:60;36706:116;:::o;36828:122::-;36901:24;36919:5;36901:24;:::i;:::-;36894:5;36891:35;36881:63;;36940:1;36937;36930:12;36881:63;36828:122;:::o;36956:120::-;37028:23;37045:5;37028:23;:::i;:::-;37021:5;37018:34;37008:62;;37066:1;37063;37056:12;37008:62;36956:120;:::o;37082:122::-;37155:24;37173:5;37155:24;:::i;:::-;37148:5;37145:35;37135:63;;37194:1;37191;37184:12;37135:63;37082:122;:::o;37210:118::-;37281:22;37297:5;37281:22;:::i;:::-;37274:5;37271:33;37261:61;;37318:1;37315;37308:12;37261:61;37210:118;:::o

Swarm Source

ipfs://6ac86492bda7e4d1c981fe7909d37cdda5db9f33e7a51e5bbe2cbe7937489507
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.