ETH Price: $3,411.38 (+1.59%)
Gas: 8 Gwei

Token

ImmutableIncas (IMMUTABLEINCAS)
 

Overview

Max Total Supply

166 IMMUTABLEINCAS

Holders

16

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

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:
ImmutableIncas

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.19.1 https://hardhat.org

// SPDX-License-Identifier: GPL-3.0 AND MIT

// File @openzeppelin/contracts/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// 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/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.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. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


// File @openzeppelin/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(
        uint256 tokenId,
        uint256 salePrice
    ) external view returns (address receiver, uint256 royaltyAmount);
}


// File @openzeppelin/contracts/utils/introspection/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/common/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}


// File @openzeppelin/contracts/token/ERC721/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/math/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}


// File @openzeppelin/contracts/utils/math/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _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) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _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);
    }

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return keccak256(bytes(a)) == keccak256(bytes(b));
    }
}


// File @openzeppelin/contracts/token/ERC721/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}


// File contracts/ERC721R.sol

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.19;
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension. This does random batch minting.
 */
abstract contract ERC721r is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    mapping(uint => uint) private _availableTokens;
    uint256 private _numAvailableTokens;
    uint256 immutable _maxSupply;
    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

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

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

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

    // Mapping to track reserved tokens 
    mapping(uint256 => bool) private _reservedTokens;


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

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

    function totalSupply() public view virtual returns (uint256) {
        return _maxSupply - _numAvailableTokens;
    }

    function maxSupply() public view virtual returns (uint256) {
        return _maxSupply;
    }

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

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

    function _mintIdWithoutBalanceUpdate(address to, uint256 tokenId) private {
        _beforeTokenTransfer(address(0), to, tokenId);

        _owners[tokenId] = to;

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

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

    function _mintRandom(address to, uint _numToMint) internal virtual {
        require(_msgSender() == tx.origin, "Contracts cannot mint");
        require(to != address(0), "ERC721: mint to the zero address");
        require(_numToMint > 0, "ERC721r: need to mint at least one token");

        require(_numAvailableTokens >= _numToMint, "ERC721r: minting more tokens than available");

        uint updatedNumAvailableTokens = _numAvailableTokens;
        for (uint256 i; i < _numToMint; ++i) {
            uint256 tokenId = getRandomAvailableTokenId(to, updatedNumAvailableTokens);
            
            _mintIdWithoutBalanceUpdate(to, tokenId);

            --updatedNumAvailableTokens;
        }

        _numAvailableTokens = updatedNumAvailableTokens;
        _balances[to] += _numToMint;
    }

    function getRandomAvailableTokenId(address to, uint updatedNumAvailableTokens)
    internal
    returns (uint256)
    {
        uint256 randomNum = uint256(
            keccak256(
                abi.encode(
                    to,
                    tx.gasprice,
                    block.number,
                    block.timestamp,
                    blockhash(block.number - 1),
                    address(this),
                    updatedNumAvailableTokens
                )
            )
        );
        uint256 randomIndex = randomNum % updatedNumAvailableTokens;
        // return getAvailableTokenAtIndex(randomIndex, updatedNumAvailableTokens);
        uint256 tokenId = getAvailableTokenAtIndex(randomIndex, updatedNumAvailableTokens);
        while(_reservedTokens[tokenId]) {
            tokenId = getRandomAvailableTokenId(to, updatedNumAvailableTokens);
        }
        return tokenId;

    }

    // Implements https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle. Code taken from CryptoPhunksV2
    function getAvailableTokenAtIndex(uint256 indexToUse, uint updatedNumAvailableTokens)
    internal
    returns (uint256)
    {
        uint256 valAtIndex = _availableTokens[indexToUse];
        uint256 result;
        if (valAtIndex == 0) {
            // This means the index itself is still an available token
            result = indexToUse;
        } else {
            // This means the index itself is not an available token, but the val at that index is.
            result = valAtIndex;
        }

        uint256 lastIndex = updatedNumAvailableTokens - 1;
        uint256 lastValInArray = _availableTokens[lastIndex];
        if (indexToUse != lastIndex) {
            // Replace the value at indexToUse, now that it's been used.
            // Replace it with the data from the last index in the array, since we are going to decrease the array size afterwards.
            if (lastValInArray == 0) {
                // This means the index itself is still an available token
                _availableTokens[indexToUse] = lastIndex;
            } else {
                // This means the index itself is not an available token, but the val at that index is.
                _availableTokens[indexToUse] = lastValInArray;
            }
        }
        if (lastValInArray != 0) {
            // Gas refund courtsey of @dievardump
            delete _availableTokens[lastIndex];
        }

        return result;
    }

    function _mintAtIndex(address to, uint index) internal virtual {
        require(_msgSender() == tx.origin, "Contracts cannot mint");
        require(to != address(0), "ERC721: mint to the zero address");
        require(_numAvailableTokens >= 1, "ERC721r: minting more tokens than available");

        uint tokenId = getAvailableTokenAtIndex(index, _numAvailableTokens);
        --_numAvailableTokens;

        _mintIdWithoutBalanceUpdate(to, tokenId);

        _balances[to] += 1;
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

    function _burn(uint256 tokenId) internal virtual {
        address owner = _ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        _balances[owner] -= 1;

        delete _owners[tokenId];

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

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


// File @openzeppelin/contracts/security/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}


// File @openzeppelin/contracts/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


// File operator-filter-registry/src/lib/[email protected]

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.13;

address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;


// File operator-filter-registry/src/[email protected]

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    /**
     * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns
     *         true if supplied registrant address is not registered.
     */
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);

    /**
     * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner.
     */
    function register(address registrant) external;

    /**
     * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes.
     */
    function registerAndSubscribe(address registrant, address subscription) external;

    /**
     * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another
     *         address without subscribing.
     */
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;

    /**
     * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner.
     *         Note that this does not remove any filtered addresses or codeHashes.
     *         Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes.
     */
    function unregister(address addr) external;

    /**
     * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered.
     */
    function updateOperator(address registrant, address operator, bool filtered) external;

    /**
     * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates.
     */
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;

    /**
     * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered.
     */
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;

    /**
     * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates.
     */
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;

    /**
     * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous
     *         subscription if present.
     *         Note that accounts with subscriptions may go on to subscribe to other accounts - in this case,
     *         subscriptions will not be forwarded. Instead the former subscription's existing entries will still be
     *         used.
     */
    function subscribe(address registrant, address registrantToSubscribe) external;

    /**
     * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes.
     */
    function unsubscribe(address registrant, bool copyExistingEntries) external;

    /**
     * @notice Get the subscription address of a given registrant, if any.
     */
    function subscriptionOf(address addr) external returns (address registrant);

    /**
     * @notice Get the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscribers(address registrant) external returns (address[] memory);

    /**
     * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscriberAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr.
     */
    function copyEntriesOf(address registrant, address registrantToCopy) external;

    /**
     * @notice Returns true if operator is filtered by a given address or its subscription.
     */
    function isOperatorFiltered(address registrant, address operator) external returns (bool);

    /**
     * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription.
     */
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);

    /**
     * @notice Returns true if a codeHash is filtered by a given address or its subscription.
     */
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);

    /**
     * @notice Returns a list of filtered operators for a given address or its subscription.
     */
    function filteredOperators(address addr) external returns (address[] memory);

    /**
     * @notice Returns the set of filtered codeHashes for a given address or its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);

    /**
     * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);

    /**
     * @notice Returns true if an address has registered
     */
    function isRegistered(address addr) external returns (bool);

    /**
     * @dev Convenience method to compute the code hash of an arbitrary contract
     */
    function codeHashOf(address addr) external returns (bytes32);
}


// File operator-filter-registry/src/[email protected]

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.13;

/**
 * @title  UpdatableOperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry. This contract allows the Owner to update the
 *         OperatorFilterRegistry address via updateOperatorFilterRegistryAddress, including to the zero address,
 *         which will bypass registry checks.
 *         Note that OpenSea will still disable creator earnings enforcement if filtered operators begin fulfilling orders
 *         on-chain, eg, if the registry is revoked or bypassed.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract UpdatableOperatorFilterer {
    /// @dev Emitted when an operator is not allowed.
    error OperatorNotAllowed(address operator);
    /// @dev Emitted when someone other than the owner is trying to call an only owner function.
    error OnlyOwner();

    event OperatorFilterRegistryAddressUpdated(address newRegistry);

    IOperatorFilterRegistry public operatorFilterRegistry;

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

    /**
     * @dev A helper function to check if the operator is allowed.
     */
    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    /**
     * @dev A helper function to check if the operator approval is allowed.
     */
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    /**
     * @notice Update the address that the contract will make OperatorFilter checks against. When set to the zero
     *         address, checks will be bypassed. OnlyOwner.
     */
    function updateOperatorFilterRegistryAddress(address newRegistry) public virtual {
        if (msg.sender != owner()) {
            revert OnlyOwner();
        }
        operatorFilterRegistry = IOperatorFilterRegistry(newRegistry);
        emit OperatorFilterRegistryAddressUpdated(newRegistry);
    }

    /**
     * @dev Assume the contract has an owner, but leave specific Ownable implementation up to inheriting contract.
     */
    function owner() public view virtual returns (address);

    /**
     * @dev A helper function to check if the operator is allowed.
     */
    function _checkFilterOperator(address operator) internal view virtual {
        IOperatorFilterRegistry registry = operatorFilterRegistry;
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(registry) != address(0) && address(registry).code.length > 0) {
            // under normal circumstances, this function will revert rather than return false, but inheriting contracts
            // may specify their own OperatorFilterRegistry implementations, which may behave differently
            if (!registry.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}


// File operator-filter-registry/src/[email protected]

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.13;


/**
 * @title  RevokableOperatorFilterer
 * @notice This contract is meant to allow contracts to permanently skip OperatorFilterRegistry checks if desired. The
 *         Registry itself has an "unregister" function, but if the contract is ownable, the owner can re-register at
 *         any point. As implemented, this abstract contract allows the contract owner to permanently skip the
 *         OperatorFilterRegistry checks by calling revokeOperatorFilterRegistry. Once done, the registry
 *         address cannot be further updated.
 *         Note that OpenSea will still disable creator earnings enforcement if filtered operators begin fulfilling orders
 *         on-chain, eg, if the registry is revoked or bypassed.
 */
abstract contract RevokableOperatorFilterer is UpdatableOperatorFilterer {
    /// @dev Emitted when the registry has already been revoked.
    error RegistryHasBeenRevoked();
    /// @dev Emitted when the initial registry address is attempted to be set to the zero address.
    error InitialRegistryAddressCannotBeZeroAddress();

    event OperatorFilterRegistryRevoked();

    bool public isOperatorFilterRegistryRevoked;

    /// @dev The constructor that is called when the contract is being deployed.
    constructor(address _registry, address subscriptionOrRegistrantToCopy, bool subscribe)
        UpdatableOperatorFilterer(_registry, subscriptionOrRegistrantToCopy, subscribe)
    {
        // don't allow creating a contract with a permanently revoked registry
        if (_registry == address(0)) {
            revert InitialRegistryAddressCannotBeZeroAddress();
        }
    }

    /**
     * @notice Update the address that the contract will make OperatorFilter checks against. When set to the zero
     *         address, checks will be permanently bypassed, and the address cannot be updated again. OnlyOwner.
     */
    function updateOperatorFilterRegistryAddress(address newRegistry) public override {
        if (msg.sender != owner()) {
            revert OnlyOwner();
        }
        // if registry has been revoked, do not allow further updates
        if (isOperatorFilterRegistryRevoked) {
            revert RegistryHasBeenRevoked();
        }

        operatorFilterRegistry = IOperatorFilterRegistry(newRegistry);
        emit OperatorFilterRegistryAddressUpdated(newRegistry);
    }

    /**
     * @notice Revoke the OperatorFilterRegistry address, permanently bypassing checks. OnlyOwner.
     */
    function revokeOperatorFilterRegistry() public {
        if (msg.sender != owner()) {
            revert OnlyOwner();
        }
        // if registry has been revoked, do not allow further updates
        if (isOperatorFilterRegistryRevoked) {
            revert RegistryHasBeenRevoked();
        }

        // set to zero address to bypass checks
        operatorFilterRegistry = IOperatorFilterRegistry(address(0));
        isOperatorFilterRegistryRevoked = true;
        emit OperatorFilterRegistryRevoked();
    }
}


// File operator-filter-registry/src/[email protected]

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.13;


/**
 * @title  RevokableDefaultOperatorFilterer
 * @notice Inherits from RevokableOperatorFilterer and automatically subscribes to the default OpenSea subscription.
 *         Note that OpenSea will disable creator earnings enforcement if filtered operators begin fulfilling orders
 *         on-chain, eg, if the registry is revoked or bypassed.
 */

abstract contract RevokableDefaultOperatorFilterer is RevokableOperatorFilterer {
    /// @dev The constructor that is called when the contract is being deployed.
    constructor()
        RevokableOperatorFilterer(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS, CANONICAL_CORI_SUBSCRIPTION, true)
    {}
}


// File contracts/ImmutableIncas.sol

// Original license: SPDX_License_Identifier: GPL-3.0
pragma solidity ^0.8.19;
contract ImmutableIncas is ERC721r, ERC2981, Ownable, ReentrancyGuard, RevokableDefaultOperatorFilterer {
    using Counters for Counters.Counter;
    using Strings for uint256;

    uint256 public MAX_MINT_PER_WALLET_SALE = 40;
    uint256 public MAX_MINT_PER_TX = 5;
    uint256 public price = 0.046 ether;

    string private baseURI;
    bool public mintEnabled = false;

    mapping(address => uint256) public users;

    mapping(uint256 => bool) private _reservedTokens;

    constructor() ERC721r("ImmutableIncas", "IMMUTABLEINCAS", 10000) {
        _setDefaultRoyalty(0x78d93C2dC20ac5cAB6329Cb334c64ECb88c2eE61, 750);
    }

    function mintSale(uint256 _amount) public payable {
        require(mintEnabled, "Sale is not yet enabled");
        require(price * _amount <= msg.value, "Not enough ETH");
        require(_amount <= MAX_MINT_PER_TX, "Too many per TX");
        require(
            users[msg.sender] + _amount <= MAX_MINT_PER_WALLET_SALE,
            "Exceeds max mint limit per wallet");
        users[msg.sender] += _amount;
        _mintRandomly(msg.sender, _amount);
    }

    
    /// ============ INTERNAL ============
    function _mintRandomly(address to, uint256 amount) internal {
        _mintRandom(to, amount);
    }

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

    /// ============ ONLY OWNER ============
    function setBaseURI(string calldata _newBaseURI) external onlyOwner {
        baseURI = _newBaseURI;
    }

    function toggleSale() external onlyOwner {
        mintEnabled = !mintEnabled;
    }

    function setMaxMintPerWalletSale(uint256 _limit) external onlyOwner {
        require(MAX_MINT_PER_WALLET_SALE != _limit, "New limit is the same as the existing one");
        MAX_MINT_PER_WALLET_SALE = _limit;
    }

    function setMaxMintPerTx(uint256 _limit) external onlyOwner {
        require(MAX_MINT_PER_TX != _limit, "New limit is the same as the existing one");
        MAX_MINT_PER_TX = _limit;
    }

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

    function setRoyalty(address wallet, uint96 perc) external onlyOwner {
        _setDefaultRoyalty(wallet, perc);
    }

    function reserve(address to, uint256 tokenId) external onlyOwner {
        require(_ownerOf(tokenId) == address(0), "Token has been minted.");
        _mintAtIndex(to, tokenId);
    }

    function reserveIncas(address to, uint256 startTokenId, uint256 endTokenId) external onlyOwner {
    require(startTokenId <= endTokenId, "Invalid range.");
    for(uint256 i = startTokenId; i <= endTokenId; i++) {
        require(_ownerOf(i) == address(0), "One or more tokens in the range have been minted.");
        _reservedTokens[i] = true;  
        _mintAtIndex(to, i);
    }
    }


    function withdraw() external onlyOwner {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    

    /// ============ ERC2981 ============
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721r, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token.
     */
    function _burn(uint256 tokenId) internal virtual override {
        ERC721r._burn(tokenId);
        _resetTokenRoyalty(tokenId);
    }

    /// ============ OPERATOR FILTER REGISTRY ============
    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

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

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

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

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

    function owner() public view override(UpdatableOperatorFilterer, Ownable) returns (address) {
        return Ownable.owner();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InitialRegistryAddressCannotBeZeroAddress","type":"error"},{"inputs":[],"name":"OnlyOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"RegistryHasBeenRevoked","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":false,"internalType":"address","name":"newRegistry","type":"address"}],"name":"OperatorFilterRegistryAddressUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"OperatorFilterRegistryRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINT_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PER_WALLET_SALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"isOperatorFilterRegistryRevoked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"startTokenId","type":"uint256"},{"internalType":"uint256","name":"endTokenId","type":"uint256"}],"name":"reserveIncas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revokeOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setMaxMintPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setMaxMintPerWalletSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint96","name":"perc","type":"uint96"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistry","type":"address"}],"name":"updateOperatorFilterRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526028600e556005600f5566a36cc19bab00006010556000601260006101000a81548160ff0219169083151502179055503480156200004157600080fd5b506daaeb6d7670e522a718067333cd4e733cc6cdda760b79bafa08df41ecfa224f810dceb660018282826040518060400160405280600e81526020017f496d6d757461626c65496e6361730000000000000000000000000000000000008152506040518060400160405280600e81526020017f494d4d555441424c45494e4341530000000000000000000000000000000000008152506127108260009081620000eb9190620008cc565b508160019081620000fd9190620008cc565b508060808181525050806003819055505050506200013062000124620003d760201b60201c565b620003df60201b60201c565b6001600c81905550600083905080600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008173ffffffffffffffffffffffffffffffffffffffff163b11156200033b5781156200021d578073ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30856040518363ffffffff1660e01b8152600401620001e3929190620009f8565b600060405180830381600087803b158015620001fe57600080fd5b505af115801562000213573d6000803e3d6000fd5b505050506200033a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614620002c9578073ffffffffffffffffffffffffffffffffffffffff1663a0af290330856040518363ffffffff1660e01b81526004016200028f929190620009f8565b600060405180830381600087803b158015620002aa57600080fd5b505af1158015620002bf573d6000803e3d6000fd5b5050505062000339565b8073ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000304919062000a25565b600060405180830381600087803b1580156200031f57600080fd5b505af115801562000334573d6000803e3d6000fd5b505050505b5b5b50505050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620003a6576040517fc49d17ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050620003d17378d93c2dc20ac5cab6329cb334c64ecb88c2ee616102ee620004a560201b60201c565b62000b5d565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004b56200064860201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000516576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200050d9062000ac9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000588576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200057f9062000b3b565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006d457607f821691505b602082108103620006ea57620006e96200068c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000715565b62000760868362000715565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620007ad620007a7620007a18462000778565b62000782565b62000778565b9050919050565b6000819050919050565b620007c9836200078c565b620007e1620007d882620007b4565b84845462000722565b825550505050565b600090565b620007f8620007e9565b62000805818484620007be565b505050565b5b818110156200082d5762000821600082620007ee565b6001810190506200080b565b5050565b601f8211156200087c576200084681620006f0565b620008518462000705565b8101602085101562000861578190505b62000879620008708562000705565b8301826200080a565b50505b505050565b600082821c905092915050565b6000620008a16000198460080262000881565b1980831691505092915050565b6000620008bc83836200088e565b9150826002028217905092915050565b620008d78262000652565b67ffffffffffffffff811115620008f357620008f26200065d565b5b620008ff8254620006bb565b6200090c82828562000831565b600060209050601f8311600181146200094457600084156200092f578287015190505b6200093b8582620008ae565b865550620009ab565b601f1984166200095486620006f0565b60005b828110156200097e5784890151825560018201915060208501945060208101905062000957565b868310156200099e57848901516200099a601f8916826200088e565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009e082620009b3565b9050919050565b620009f281620009d3565b82525050565b600060408201905062000a0f6000830185620009e7565b62000a1e6020830184620009e7565b9392505050565b600060208201905062000a3c6000830184620009e7565b92915050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000ab1602a8362000a42565b915062000abe8262000a53565b604082019050919050565b6000602082019050818103600083015262000ae48162000aa2565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000b2360198362000a42565b915062000b308262000aeb565b602082019050919050565b6000602082019050818103600083015262000b568162000b14565b9050919050565b60805161510762000b80600039600081816109eb01526117d501526151076000f3fe6080604052600436106102255760003560e01c80638da5cb5b11610123578063b0ccc31e116100ab578063d12397301161006f578063d1239730146107bb578063d5abeb01146107e6578063e985e9c514610811578063ecba222a1461084e578063f2fde38b1461087957610225565b8063b0ccc31e146106d8578063b88d4fde14610703578063b8d1e5321461072c578063c87b56dd14610755578063cc47a40b1461079257610225565b806391b7f5ed116100f257806391b7f5ed146105f357806395d89b411461061c578063a035b1fe14610647578063a22cb46514610672578063a87430ba1461069b57610225565b80638da5cb5b1461054b5780638ecad721146105765780638f2fc60b146105a1578063900f187a146105ca57610225565b806342842e0e116101b1578063616cdb1e11610175578063616cdb1e1461047a5780636352211e146104a357806370a08231146104e0578063715018a61461051d5780637d8966e41461053457610225565b806342842e0e146103cc5780634875bccb146103f557806355f804b31461041157806357c3397a1461043a5780635ef9432a1461046357610225565b806318160ddd116101f857806318160ddd146102f85780631ae100821461032357806323b872dd1461034e5780632a55205a146103775780633ccfd60b146103b557610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906132a9565b6108a2565b60405161025e91906132f1565b60405180910390f35b34801561027357600080fd5b5061027c6108b4565b604051610289919061339c565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b491906133f4565b610946565b6040516102c69190613462565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906134a9565b6109cb565b005b34801561030457600080fd5b5061030d6109e4565b60405161031a91906134f8565b60405180910390f35b34801561032f57600080fd5b50610338610a19565b60405161034591906134f8565b60405180910390f35b34801561035a57600080fd5b5061037560048036038101906103709190613513565b610a1f565b005b34801561038357600080fd5b5061039e60048036038101906103999190613566565b610a6e565b6040516103ac9291906135a6565b60405180910390f35b3480156103c157600080fd5b506103ca610c58565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190613513565b610d0f565b005b61040f600480360381019061040a91906133f4565b610d5e565b005b34801561041d57600080fd5b5061043860048036038101906104339190613634565b610f34565b005b34801561044657600080fd5b50610461600480360381019061045c9190613681565b610f52565b005b34801561046f57600080fd5b50610478611070565b005b34801561048657600080fd5b506104a1600480360381019061049c91906133f4565b6111ae565b005b3480156104af57600080fd5b506104ca60048036038101906104c591906133f4565b611204565b6040516104d79190613462565b60405180910390f35b3480156104ec57600080fd5b50610507600480360381019061050291906136d4565b61128a565b60405161051491906134f8565b60405180910390f35b34801561052957600080fd5b50610532611341565b005b34801561054057600080fd5b50610549611355565b005b34801561055757600080fd5b50610560611389565b60405161056d9190613462565b60405180910390f35b34801561058257600080fd5b5061058b611398565b60405161059891906134f8565b60405180910390f35b3480156105ad57600080fd5b506105c860048036038101906105c39190613745565b61139e565b005b3480156105d657600080fd5b506105f160048036038101906105ec91906133f4565b6113b4565b005b3480156105ff57600080fd5b5061061a600480360381019061061591906133f4565b61140a565b005b34801561062857600080fd5b5061063161141c565b60405161063e919061339c565b60405180910390f35b34801561065357600080fd5b5061065c6114ae565b60405161066991906134f8565b60405180910390f35b34801561067e57600080fd5b50610699600480360381019061069491906137b1565b6114b4565b005b3480156106a757600080fd5b506106c260048036038101906106bd91906136d4565b6114cd565b6040516106cf91906134f8565b60405180910390f35b3480156106e457600080fd5b506106ed6114e5565b6040516106fa9190613850565b60405180910390f35b34801561070f57600080fd5b5061072a6004803603810190610725919061399b565b61150b565b005b34801561073857600080fd5b50610753600480360381019061074e91906136d4565b61155c565b005b34801561076157600080fd5b5061077c600480360381019061077791906133f4565b61168a565b604051610789919061339c565b60405180910390f35b34801561079e57600080fd5b506107b960048036038101906107b491906134a9565b611731565b005b3480156107c757600080fd5b506107d06117be565b6040516107dd91906132f1565b60405180910390f35b3480156107f257600080fd5b506107fb6117d1565b60405161080891906134f8565b60405180910390f35b34801561081d57600080fd5b5061083860048036038101906108339190613a1e565b6117f9565b60405161084591906132f1565b60405180910390f35b34801561085a57600080fd5b5061086361188d565b60405161087091906132f1565b60405180910390f35b34801561088557600080fd5b506108a0600480360381019061089b91906136d4565b6118a0565b005b60006108ad82611923565b9050919050565b6060600080546108c390613a8d565b80601f01602080910402602001604051908101604052809291908181526020018280546108ef90613a8d565b801561093c5780601f106109115761010080835404028352916020019161093c565b820191906000526020600020905b81548152906001019060200180831161091f57829003601f168201915b5050505050905090565b60006109518261199d565b610990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098790613b30565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b816109d581611a09565b6109df8383611b4b565b505050565b60006003547f0000000000000000000000000000000000000000000000000000000000000000610a149190613b7f565b905090565b600e5481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a5d57610a5c33611a09565b5b610a68848484611c62565b50505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610c035760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610c0d611cc2565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610c399190613bb3565b610c439190613c24565b90508160000151819350935050509250929050565b610c60611ccc565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610c8690613c86565b60006040518083038185875af1925050503d8060008114610cc3576040519150601f19603f3d011682016040523d82523d6000602084013e610cc8565b606091505b5050905080610d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0390613ce7565b60405180910390fd5b50565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d4d57610d4c33611a09565b5b610d58848484611d4a565b50505050565b601260009054906101000a900460ff16610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da490613d53565b60405180910390fd5b3481601054610dbc9190613bb3565b1115610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df490613dbf565b60405180910390fd5b600f54811115610e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3990613e2b565b60405180910390fd5b600e5481601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e909190613e4b565b1115610ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec890613ef1565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f209190613e4b565b92505081905550610f313382611d6a565b50565b610f3c611ccc565b818160119182610f4d9291906140be565b505050565b610f5a611ccc565b80821115610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f94906141da565b60405180910390fd5b60008290505b81811161106a57600073ffffffffffffffffffffffffffffffffffffffff16610fcb82611d78565b73ffffffffffffffffffffffffffffffffffffffff1614611021576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110189061426c565b60405180910390fd5b60016014600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506110578482611db5565b80806110629061428c565b915050610fa3565b50505050565b611078611389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110dc576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d60149054906101000a900460ff1615611123576040517f2aa3491e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600d60146101000a81548160ff0219169083151502179055507f51e2d870cc2e10853e38dc06fcdae46ad3c3f588f326608803dac6204541ad1660405160405180910390a1565b6111b6611ccc565b80600f54036111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f190614346565b60405180910390fd5b80600f8190555050565b60008061121083611d78565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611281576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611278906143d8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f19061446a565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611349611ccc565b6113536000611f6b565b565b61135d611ccc565b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550565b6000611393612031565b905090565b600f5481565b6113a6611ccc565b6113b0828261205b565b5050565b6113bc611ccc565b80600e5403611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f790614346565b60405180910390fd5b80600e8190555050565b611412611ccc565b8060108190555050565b60606001805461142b90613a8d565b80601f016020809104026020016040519081016040528092919081815260200182805461145790613a8d565b80156114a45780601f10611479576101008083540402835291602001916114a4565b820191906000526020600020905b81548152906001019060200180831161148757829003601f168201915b5050505050905090565b60105481565b816114be81611a09565b6114c883836121f0565b505050565b60136020528060005260406000206000915090505481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115495761154833611a09565b5b61155585858585612206565b5050505050565b611564611389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115c8576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d60149054906101000a900460ff161561160f576040517f2aa3491e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f9f513fe86dc42fdbac355fa4d9b1d5be7b5e6cd2df67e30db8003766568de4768160405161167f9190613462565b60405180910390a150565b60606116958261199d565b6116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb906144fc565b60405180910390fd5b60006116de612268565b905060008151116116fe5760405180602001604052806000815250611729565b80611708846122fa565b6040516020016117199291906145a4565b6040516020818303038152906040525b915050919050565b611739611ccc565b600073ffffffffffffffffffffffffffffffffffffffff1661175a82611d78565b73ffffffffffffffffffffffffffffffffffffffff16146117b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a79061461f565b60405180910390fd5b6117ba8282611db5565b5050565b601260009054906101000a900460ff1681565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60149054906101000a900460ff1681565b6118a8611ccc565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190e906146b1565b60405180910390fd5b61192081611f6b565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119965750611995826123c8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015611a84575060008173ffffffffffffffffffffffffffffffffffffffff163b115b15611b47578073ffffffffffffffffffffffffffffffffffffffff1663c617113430846040518363ffffffff1660e01b8152600401611ac49291906146d1565b602060405180830381865afa158015611ae1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b05919061470f565b611b4657816040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611b3d9190613462565b60405180910390fd5b5b5050565b6000611b5682611204565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbd906147ae565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611be56124aa565b73ffffffffffffffffffffffffffffffffffffffff161480611c145750611c1381611c0e6124aa565b6117f9565b5b611c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4a90614840565b60405180910390fd5b611c5d83836124b2565b505050565b611c73611c6d6124aa565b8261256b565b611cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca9906148d2565b60405180910390fd5b611cbd838383612649565b505050565b6000612710905090565b611cd46124aa565b73ffffffffffffffffffffffffffffffffffffffff16611cf2611389565b73ffffffffffffffffffffffffffffffffffffffff1614611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f9061493e565b60405180910390fd5b565b611d658383836040518060200160405280600081525061150b565b505050565b611d7482826128af565b5050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b3273ffffffffffffffffffffffffffffffffffffffff16611dd46124aa565b73ffffffffffffffffffffffffffffffffffffffff1614611e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e21906149aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9090614a16565b60405180910390fd5b60016003541015611edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed690614aa8565b60405180910390fd5b6000611eed82600354612ac6565b9050600360008154611efe90614ac8565b91905081905550611f0f8382612b90565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f5f9190613e4b565b92505081905550505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612063611cc2565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b890614b63565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212790614bcf565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6122026121fb6124aa565b8383612c5a565b5050565b6122176122116124aa565b8361256b565b612256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224d906148d2565b60405180910390fd5b61226284848484612dc6565b50505050565b60606011805461227790613a8d565b80601f01602080910402602001604051908101604052809291908181526020018280546122a390613a8d565b80156122f05780601f106122c5576101008083540402835291602001916122f0565b820191906000526020600020905b8154815290600101906020018083116122d357829003601f168201915b5050505050905090565b60606000600161230984612e22565b01905060008167ffffffffffffffff81111561232857612327613870565b5b6040519080825280601f01601f19166020018201604052801561235a5781602001600182028036833780820191505090505b509050600082602001820190505b6001156123bd578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816123b1576123b0613bf5565b5b04945060008503612368575b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061249357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124a357506124a282612f75565b5b9050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661252583611204565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006125768261199d565b6125b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ac90614c61565b60405180910390fd5b60006125c083611204565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061262f57508373ffffffffffffffffffffffffffffffffffffffff1661261784610946565b73ffffffffffffffffffffffffffffffffffffffff16145b80612640575061263f81856117f9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661266982611204565b73ffffffffffffffffffffffffffffffffffffffff16146126bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b690614cf3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361272e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272590614d85565b60405180910390fd5b612739838383612fdf565b6127446000826124b2565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127949190613b7f565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127eb9190613e4b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128aa838383612fe4565b505050565b3273ffffffffffffffffffffffffffffffffffffffff166128ce6124aa565b73ffffffffffffffffffffffffffffffffffffffff1614612924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291b906149aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298a90614a16565b60405180910390fd5b600081116129d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cd90614e17565b60405180910390fd5b806003541015612a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1290614aa8565b60405180910390fd5b6000600354905060005b82811015612a63576000612a398584612fe9565b9050612a458582612b90565b82612a4f90614ac8565b92505080612a5c9061428c565b9050612a25565b508060038190555081600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aba9190613e4b565b92505081905550505050565b600080600260008581526020019081526020016000205490506000808203612af057849050612af4565b8190505b6000600185612b039190613b7f565b9050600060026000838152602001908152602001600020549050818714612b635760008103612b4957816002600089815260200190815260200160002081905550612b62565b8060026000898152602001908152602001600020819055505b5b60008114612b835760026000838152602001908152602001600020600090555b8294505050505092915050565b612b9c60008383612fdf565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c5660008383612fe4565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cbf90614e83565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612db991906132f1565b60405180910390a3505050565b612dd1848484612649565b612ddd84848484613093565b612e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1390614f15565b60405180910390fd5b50505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612e80577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612e7657612e75613bf5565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612ebd576d04ee2d6d415b85acef81000000008381612eb357612eb2613bf5565b5b0492506020810190505b662386f26fc100008310612eec57662386f26fc100008381612ee257612ee1613bf5565b5b0492506010810190505b6305f5e1008310612f15576305f5e1008381612f0b57612f0a613bf5565b5b0492506008810190505b6127108310612f3a576127108381612f3057612f2f613bf5565b5b0492506004810190505b60648310612f5d5760648381612f5357612f52613bf5565b5b0492506002810190505b600a8310612f6c576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b505050565b600080833a4342600143612ffd9190613b7f565b4030886040516020016130169796959493929190614f4e565b6040516020818303038152906040528051906020012060001c90506000838261303f9190614fbd565b9050600061304d8286612ac6565b90505b6008600082815260200190815260200160002060009054906101000a900460ff1615613087576130808686612fe9565b9050613050565b80935050505092915050565b60006130b48473ffffffffffffffffffffffffffffffffffffffff1661321a565b1561320d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130dd6124aa565b8786866040518563ffffffff1660e01b81526004016130ff9493929190615043565b6020604051808303816000875af192505050801561313b57506040513d601f19601f8201168201806040525081019061313891906150a4565b60015b6131bd573d806000811461316b576040519150601f19603f3d011682016040523d82523d6000602084013e613170565b606091505b5060008151036131b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ac90614f15565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613212565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61328681613251565b811461329157600080fd5b50565b6000813590506132a38161327d565b92915050565b6000602082840312156132bf576132be613247565b5b60006132cd84828501613294565b91505092915050565b60008115159050919050565b6132eb816132d6565b82525050565b600060208201905061330660008301846132e2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561334657808201518184015260208101905061332b565b60008484015250505050565b6000601f19601f8301169050919050565b600061336e8261330c565b6133788185613317565b9350613388818560208601613328565b61339181613352565b840191505092915050565b600060208201905081810360008301526133b68184613363565b905092915050565b6000819050919050565b6133d1816133be565b81146133dc57600080fd5b50565b6000813590506133ee816133c8565b92915050565b60006020828403121561340a57613409613247565b5b6000613418848285016133df565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061344c82613421565b9050919050565b61345c81613441565b82525050565b60006020820190506134776000830184613453565b92915050565b61348681613441565b811461349157600080fd5b50565b6000813590506134a38161347d565b92915050565b600080604083850312156134c0576134bf613247565b5b60006134ce85828601613494565b92505060206134df858286016133df565b9150509250929050565b6134f2816133be565b82525050565b600060208201905061350d60008301846134e9565b92915050565b60008060006060848603121561352c5761352b613247565b5b600061353a86828701613494565b935050602061354b86828701613494565b925050604061355c868287016133df565b9150509250925092565b6000806040838503121561357d5761357c613247565b5b600061358b858286016133df565b925050602061359c858286016133df565b9150509250929050565b60006040820190506135bb6000830185613453565b6135c860208301846134e9565b9392505050565b600080fd5b600080fd5b600080fd5b60008083601f8401126135f4576135f36135cf565b5b8235905067ffffffffffffffff811115613611576136106135d4565b5b60208301915083600182028301111561362d5761362c6135d9565b5b9250929050565b6000806020838503121561364b5761364a613247565b5b600083013567ffffffffffffffff8111156136695761366861324c565b5b613675858286016135de565b92509250509250929050565b60008060006060848603121561369a57613699613247565b5b60006136a886828701613494565b93505060206136b9868287016133df565b92505060406136ca868287016133df565b9150509250925092565b6000602082840312156136ea576136e9613247565b5b60006136f884828501613494565b91505092915050565b60006bffffffffffffffffffffffff82169050919050565b61372281613701565b811461372d57600080fd5b50565b60008135905061373f81613719565b92915050565b6000806040838503121561375c5761375b613247565b5b600061376a85828601613494565b925050602061377b85828601613730565b9150509250929050565b61378e816132d6565b811461379957600080fd5b50565b6000813590506137ab81613785565b92915050565b600080604083850312156137c8576137c7613247565b5b60006137d685828601613494565b92505060206137e78582860161379c565b9150509250929050565b6000819050919050565b600061381661381161380c84613421565b6137f1565b613421565b9050919050565b6000613828826137fb565b9050919050565b600061383a8261381d565b9050919050565b61384a8161382f565b82525050565b60006020820190506138656000830184613841565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6138a882613352565b810181811067ffffffffffffffff821117156138c7576138c6613870565b5b80604052505050565b60006138da61323d565b90506138e6828261389f565b919050565b600067ffffffffffffffff82111561390657613905613870565b5b61390f82613352565b9050602081019050919050565b82818337600083830152505050565b600061393e613939846138eb565b6138d0565b90508281526020810184848401111561395a5761395961386b565b5b61396584828561391c565b509392505050565b600082601f830112613982576139816135cf565b5b813561399284826020860161392b565b91505092915050565b600080600080608085870312156139b5576139b4613247565b5b60006139c387828801613494565b94505060206139d487828801613494565b93505060406139e5878288016133df565b925050606085013567ffffffffffffffff811115613a0657613a0561324c565b5b613a128782880161396d565b91505092959194509250565b60008060408385031215613a3557613a34613247565b5b6000613a4385828601613494565b9250506020613a5485828601613494565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613aa557607f821691505b602082108103613ab857613ab7613a5e565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613b1a602c83613317565b9150613b2582613abe565b604082019050919050565b60006020820190508181036000830152613b4981613b0d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b8a826133be565b9150613b95836133be565b9250828203905081811115613bad57613bac613b50565b5b92915050565b6000613bbe826133be565b9150613bc9836133be565b9250828202613bd7816133be565b91508282048414831517613bee57613bed613b50565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c2f826133be565b9150613c3a836133be565b925082613c4a57613c49613bf5565b5b828204905092915050565b600081905092915050565b50565b6000613c70600083613c55565b9150613c7b82613c60565b600082019050919050565b6000613c9182613c63565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000613cd1601083613317565b9150613cdc82613c9b565b602082019050919050565b60006020820190508181036000830152613d0081613cc4565b9050919050565b7f53616c65206973206e6f742079657420656e61626c6564000000000000000000600082015250565b6000613d3d601783613317565b9150613d4882613d07565b602082019050919050565b60006020820190508181036000830152613d6c81613d30565b9050919050565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b6000613da9600e83613317565b9150613db482613d73565b602082019050919050565b60006020820190508181036000830152613dd881613d9c565b9050919050565b7f546f6f206d616e79207065722054580000000000000000000000000000000000600082015250565b6000613e15600f83613317565b9150613e2082613ddf565b602082019050919050565b60006020820190508181036000830152613e4481613e08565b9050919050565b6000613e56826133be565b9150613e61836133be565b9250828201905080821115613e7957613e78613b50565b5b92915050565b7f45786365656473206d6178206d696e74206c696d6974207065722077616c6c6560008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6000613edb602183613317565b9150613ee682613e7f565b604082019050919050565b60006020820190508181036000830152613f0a81613ece565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613f7e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613f41565b613f888683613f41565b95508019841693508086168417925050509392505050565b6000613fbb613fb6613fb1846133be565b6137f1565b6133be565b9050919050565b6000819050919050565b613fd583613fa0565b613fe9613fe182613fc2565b848454613f4e565b825550505050565b600090565b613ffe613ff1565b614009818484613fcc565b505050565b5b8181101561402d57614022600082613ff6565b60018101905061400f565b5050565b601f8211156140725761404381613f1c565b61404c84613f31565b8101602085101561405b578190505b61406f61406785613f31565b83018261400e565b50505b505050565b600082821c905092915050565b600061409560001984600802614077565b1980831691505092915050565b60006140ae8383614084565b9150826002028217905092915050565b6140c88383613f11565b67ffffffffffffffff8111156140e1576140e0613870565b5b6140eb8254613a8d565b6140f6828285614031565b6000601f8311600181146141255760008415614113578287013590505b61411d85826140a2565b865550614185565b601f19841661413386613f1c565b60005b8281101561415b57848901358255600182019150602085019450602081019050614136565b868310156141785784890135614174601f891682614084565b8355505b6001600288020188555050505b50505050505050565b7f496e76616c69642072616e67652e000000000000000000000000000000000000600082015250565b60006141c4600e83613317565b91506141cf8261418e565b602082019050919050565b600060208201905081810360008301526141f3816141b7565b9050919050565b7f4f6e65206f72206d6f726520746f6b656e7320696e207468652072616e67652060008201527f68617665206265656e206d696e7465642e000000000000000000000000000000602082015250565b6000614256603183613317565b9150614261826141fa565b604082019050919050565b6000602082019050818103600083015261428581614249565b9050919050565b6000614297826133be565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036142c9576142c8613b50565b5b600182019050919050565b7f4e6577206c696d6974206973207468652073616d65206173207468652065786960008201527f7374696e67206f6e650000000000000000000000000000000000000000000000602082015250565b6000614330602983613317565b915061433b826142d4565b604082019050919050565b6000602082019050818103600083015261435f81614323565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006143c2602983613317565b91506143cd82614366565b604082019050919050565b600060208201905081810360008301526143f1816143b5565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614454602a83613317565b915061445f826143f8565b604082019050919050565b6000602082019050818103600083015261448381614447565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006144e6602f83613317565b91506144f18261448a565b604082019050919050565b60006020820190508181036000830152614515816144d9565b9050919050565b600081905092915050565b60006145328261330c565b61453c818561451c565b935061454c818560208601613328565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061458e60058361451c565b915061459982614558565b600582019050919050565b60006145b08285614527565b91506145bc8284614527565b91506145c782614581565b91508190509392505050565b7f546f6b656e20686173206265656e206d696e7465642e00000000000000000000600082015250565b6000614609601683613317565b9150614614826145d3565b602082019050919050565b60006020820190508181036000830152614638816145fc565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061469b602683613317565b91506146a68261463f565b604082019050919050565b600060208201905081810360008301526146ca8161468e565b9050919050565b60006040820190506146e66000830185613453565b6146f36020830184613453565b9392505050565b60008151905061470981613785565b92915050565b60006020828403121561472557614724613247565b5b6000614733848285016146fa565b91505092915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614798602183613317565b91506147a38261473c565b604082019050919050565b600060208201905081810360008301526147c78161478b565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061482a603883613317565b9150614835826147ce565b604082019050919050565b600060208201905081810360008301526148598161481d565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006148bc603183613317565b91506148c782614860565b604082019050919050565b600060208201905081810360008301526148eb816148af565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614928602083613317565b9150614933826148f2565b602082019050919050565b600060208201905081810360008301526149578161491b565b9050919050565b7f436f6e7472616374732063616e6e6f74206d696e740000000000000000000000600082015250565b6000614994601583613317565b915061499f8261495e565b602082019050919050565b600060208201905081810360008301526149c381614987565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a00602083613317565b9150614a0b826149ca565b602082019050919050565b60006020820190508181036000830152614a2f816149f3565b9050919050565b7f455243373231723a206d696e74696e67206d6f726520746f6b656e732074686160008201527f6e20617661696c61626c65000000000000000000000000000000000000000000602082015250565b6000614a92602b83613317565b9150614a9d82614a36565b604082019050919050565b60006020820190508181036000830152614ac181614a85565b9050919050565b6000614ad3826133be565b915060008203614ae657614ae5613b50565b5b600182039050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000614b4d602a83613317565b9150614b5882614af1565b604082019050919050565b60006020820190508181036000830152614b7c81614b40565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614bb9601983613317565b9150614bc482614b83565b602082019050919050565b60006020820190508181036000830152614be881614bac565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614c4b602c83613317565b9150614c5682614bef565b604082019050919050565b60006020820190508181036000830152614c7a81614c3e565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614cdd602583613317565b9150614ce882614c81565b604082019050919050565b60006020820190508181036000830152614d0c81614cd0565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614d6f602483613317565b9150614d7a82614d13565b604082019050919050565b60006020820190508181036000830152614d9e81614d62565b9050919050565b7f455243373231723a206e65656420746f206d696e74206174206c65617374206f60008201527f6e6520746f6b656e000000000000000000000000000000000000000000000000602082015250565b6000614e01602883613317565b9150614e0c82614da5565b604082019050919050565b60006020820190508181036000830152614e3081614df4565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614e6d601983613317565b9150614e7882614e37565b602082019050919050565b60006020820190508181036000830152614e9c81614e60565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614eff603283613317565b9150614f0a82614ea3565b604082019050919050565b60006020820190508181036000830152614f2e81614ef2565b9050919050565b6000819050919050565b614f4881614f35565b82525050565b600060e082019050614f63600083018a613453565b614f7060208301896134e9565b614f7d60408301886134e9565b614f8a60608301876134e9565b614f976080830186614f3f565b614fa460a0830185613453565b614fb160c08301846134e9565b98975050505050505050565b6000614fc8826133be565b9150614fd3836133be565b925082614fe357614fe2613bf5565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061501582614fee565b61501f8185614ff9565b935061502f818560208601613328565b61503881613352565b840191505092915050565b60006080820190506150586000830187613453565b6150656020830186613453565b61507260408301856134e9565b8181036060830152615084818461500a565b905095945050505050565b60008151905061509e8161327d565b92915050565b6000602082840312156150ba576150b9613247565b5b60006150c88482850161508f565b9150509291505056fea2646970667358221220fce474cee0b6845f1645bd538ec66d210479a22d6a0370745edcf4c19d03d31164736f6c63430008130033

Deployed Bytecode

0x6080604052600436106102255760003560e01c80638da5cb5b11610123578063b0ccc31e116100ab578063d12397301161006f578063d1239730146107bb578063d5abeb01146107e6578063e985e9c514610811578063ecba222a1461084e578063f2fde38b1461087957610225565b8063b0ccc31e146106d8578063b88d4fde14610703578063b8d1e5321461072c578063c87b56dd14610755578063cc47a40b1461079257610225565b806391b7f5ed116100f257806391b7f5ed146105f357806395d89b411461061c578063a035b1fe14610647578063a22cb46514610672578063a87430ba1461069b57610225565b80638da5cb5b1461054b5780638ecad721146105765780638f2fc60b146105a1578063900f187a146105ca57610225565b806342842e0e116101b1578063616cdb1e11610175578063616cdb1e1461047a5780636352211e146104a357806370a08231146104e0578063715018a61461051d5780637d8966e41461053457610225565b806342842e0e146103cc5780634875bccb146103f557806355f804b31461041157806357c3397a1461043a5780635ef9432a1461046357610225565b806318160ddd116101f857806318160ddd146102f85780631ae100821461032357806323b872dd1461034e5780632a55205a146103775780633ccfd60b146103b557610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906132a9565b6108a2565b60405161025e91906132f1565b60405180910390f35b34801561027357600080fd5b5061027c6108b4565b604051610289919061339c565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b491906133f4565b610946565b6040516102c69190613462565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906134a9565b6109cb565b005b34801561030457600080fd5b5061030d6109e4565b60405161031a91906134f8565b60405180910390f35b34801561032f57600080fd5b50610338610a19565b60405161034591906134f8565b60405180910390f35b34801561035a57600080fd5b5061037560048036038101906103709190613513565b610a1f565b005b34801561038357600080fd5b5061039e60048036038101906103999190613566565b610a6e565b6040516103ac9291906135a6565b60405180910390f35b3480156103c157600080fd5b506103ca610c58565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190613513565b610d0f565b005b61040f600480360381019061040a91906133f4565b610d5e565b005b34801561041d57600080fd5b5061043860048036038101906104339190613634565b610f34565b005b34801561044657600080fd5b50610461600480360381019061045c9190613681565b610f52565b005b34801561046f57600080fd5b50610478611070565b005b34801561048657600080fd5b506104a1600480360381019061049c91906133f4565b6111ae565b005b3480156104af57600080fd5b506104ca60048036038101906104c591906133f4565b611204565b6040516104d79190613462565b60405180910390f35b3480156104ec57600080fd5b50610507600480360381019061050291906136d4565b61128a565b60405161051491906134f8565b60405180910390f35b34801561052957600080fd5b50610532611341565b005b34801561054057600080fd5b50610549611355565b005b34801561055757600080fd5b50610560611389565b60405161056d9190613462565b60405180910390f35b34801561058257600080fd5b5061058b611398565b60405161059891906134f8565b60405180910390f35b3480156105ad57600080fd5b506105c860048036038101906105c39190613745565b61139e565b005b3480156105d657600080fd5b506105f160048036038101906105ec91906133f4565b6113b4565b005b3480156105ff57600080fd5b5061061a600480360381019061061591906133f4565b61140a565b005b34801561062857600080fd5b5061063161141c565b60405161063e919061339c565b60405180910390f35b34801561065357600080fd5b5061065c6114ae565b60405161066991906134f8565b60405180910390f35b34801561067e57600080fd5b50610699600480360381019061069491906137b1565b6114b4565b005b3480156106a757600080fd5b506106c260048036038101906106bd91906136d4565b6114cd565b6040516106cf91906134f8565b60405180910390f35b3480156106e457600080fd5b506106ed6114e5565b6040516106fa9190613850565b60405180910390f35b34801561070f57600080fd5b5061072a6004803603810190610725919061399b565b61150b565b005b34801561073857600080fd5b50610753600480360381019061074e91906136d4565b61155c565b005b34801561076157600080fd5b5061077c600480360381019061077791906133f4565b61168a565b604051610789919061339c565b60405180910390f35b34801561079e57600080fd5b506107b960048036038101906107b491906134a9565b611731565b005b3480156107c757600080fd5b506107d06117be565b6040516107dd91906132f1565b60405180910390f35b3480156107f257600080fd5b506107fb6117d1565b60405161080891906134f8565b60405180910390f35b34801561081d57600080fd5b5061083860048036038101906108339190613a1e565b6117f9565b60405161084591906132f1565b60405180910390f35b34801561085a57600080fd5b5061086361188d565b60405161087091906132f1565b60405180910390f35b34801561088557600080fd5b506108a0600480360381019061089b91906136d4565b6118a0565b005b60006108ad82611923565b9050919050565b6060600080546108c390613a8d565b80601f01602080910402602001604051908101604052809291908181526020018280546108ef90613a8d565b801561093c5780601f106109115761010080835404028352916020019161093c565b820191906000526020600020905b81548152906001019060200180831161091f57829003601f168201915b5050505050905090565b60006109518261199d565b610990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098790613b30565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b816109d581611a09565b6109df8383611b4b565b505050565b60006003547f0000000000000000000000000000000000000000000000000000000000002710610a149190613b7f565b905090565b600e5481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a5d57610a5c33611a09565b5b610a68848484611c62565b50505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610c035760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610c0d611cc2565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610c399190613bb3565b610c439190613c24565b90508160000151819350935050509250929050565b610c60611ccc565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610c8690613c86565b60006040518083038185875af1925050503d8060008114610cc3576040519150601f19603f3d011682016040523d82523d6000602084013e610cc8565b606091505b5050905080610d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0390613ce7565b60405180910390fd5b50565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d4d57610d4c33611a09565b5b610d58848484611d4a565b50505050565b601260009054906101000a900460ff16610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da490613d53565b60405180910390fd5b3481601054610dbc9190613bb3565b1115610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df490613dbf565b60405180910390fd5b600f54811115610e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3990613e2b565b60405180910390fd5b600e5481601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e909190613e4b565b1115610ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec890613ef1565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f209190613e4b565b92505081905550610f313382611d6a565b50565b610f3c611ccc565b818160119182610f4d9291906140be565b505050565b610f5a611ccc565b80821115610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f94906141da565b60405180910390fd5b60008290505b81811161106a57600073ffffffffffffffffffffffffffffffffffffffff16610fcb82611d78565b73ffffffffffffffffffffffffffffffffffffffff1614611021576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110189061426c565b60405180910390fd5b60016014600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506110578482611db5565b80806110629061428c565b915050610fa3565b50505050565b611078611389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110dc576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d60149054906101000a900460ff1615611123576040517f2aa3491e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600d60146101000a81548160ff0219169083151502179055507f51e2d870cc2e10853e38dc06fcdae46ad3c3f588f326608803dac6204541ad1660405160405180910390a1565b6111b6611ccc565b80600f54036111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f190614346565b60405180910390fd5b80600f8190555050565b60008061121083611d78565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611281576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611278906143d8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f19061446a565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611349611ccc565b6113536000611f6b565b565b61135d611ccc565b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550565b6000611393612031565b905090565b600f5481565b6113a6611ccc565b6113b0828261205b565b5050565b6113bc611ccc565b80600e5403611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f790614346565b60405180910390fd5b80600e8190555050565b611412611ccc565b8060108190555050565b60606001805461142b90613a8d565b80601f016020809104026020016040519081016040528092919081815260200182805461145790613a8d565b80156114a45780601f10611479576101008083540402835291602001916114a4565b820191906000526020600020905b81548152906001019060200180831161148757829003601f168201915b5050505050905090565b60105481565b816114be81611a09565b6114c883836121f0565b505050565b60136020528060005260406000206000915090505481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115495761154833611a09565b5b61155585858585612206565b5050505050565b611564611389565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115c8576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d60149054906101000a900460ff161561160f576040517f2aa3491e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f9f513fe86dc42fdbac355fa4d9b1d5be7b5e6cd2df67e30db8003766568de4768160405161167f9190613462565b60405180910390a150565b60606116958261199d565b6116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb906144fc565b60405180910390fd5b60006116de612268565b905060008151116116fe5760405180602001604052806000815250611729565b80611708846122fa565b6040516020016117199291906145a4565b6040516020818303038152906040525b915050919050565b611739611ccc565b600073ffffffffffffffffffffffffffffffffffffffff1661175a82611d78565b73ffffffffffffffffffffffffffffffffffffffff16146117b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a79061461f565b60405180910390fd5b6117ba8282611db5565b5050565b601260009054906101000a900460ff1681565b60007f0000000000000000000000000000000000000000000000000000000000002710905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60149054906101000a900460ff1681565b6118a8611ccc565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190e906146b1565b60405180910390fd5b61192081611f6b565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119965750611995826123c8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015611a84575060008173ffffffffffffffffffffffffffffffffffffffff163b115b15611b47578073ffffffffffffffffffffffffffffffffffffffff1663c617113430846040518363ffffffff1660e01b8152600401611ac49291906146d1565b602060405180830381865afa158015611ae1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b05919061470f565b611b4657816040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611b3d9190613462565b60405180910390fd5b5b5050565b6000611b5682611204565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbd906147ae565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611be56124aa565b73ffffffffffffffffffffffffffffffffffffffff161480611c145750611c1381611c0e6124aa565b6117f9565b5b611c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4a90614840565b60405180910390fd5b611c5d83836124b2565b505050565b611c73611c6d6124aa565b8261256b565b611cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca9906148d2565b60405180910390fd5b611cbd838383612649565b505050565b6000612710905090565b611cd46124aa565b73ffffffffffffffffffffffffffffffffffffffff16611cf2611389565b73ffffffffffffffffffffffffffffffffffffffff1614611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f9061493e565b60405180910390fd5b565b611d658383836040518060200160405280600081525061150b565b505050565b611d7482826128af565b5050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b3273ffffffffffffffffffffffffffffffffffffffff16611dd46124aa565b73ffffffffffffffffffffffffffffffffffffffff1614611e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e21906149aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9090614a16565b60405180910390fd5b60016003541015611edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed690614aa8565b60405180910390fd5b6000611eed82600354612ac6565b9050600360008154611efe90614ac8565b91905081905550611f0f8382612b90565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f5f9190613e4b565b92505081905550505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612063611cc2565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b890614b63565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212790614bcf565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6122026121fb6124aa565b8383612c5a565b5050565b6122176122116124aa565b8361256b565b612256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224d906148d2565b60405180910390fd5b61226284848484612dc6565b50505050565b60606011805461227790613a8d565b80601f01602080910402602001604051908101604052809291908181526020018280546122a390613a8d565b80156122f05780601f106122c5576101008083540402835291602001916122f0565b820191906000526020600020905b8154815290600101906020018083116122d357829003601f168201915b5050505050905090565b60606000600161230984612e22565b01905060008167ffffffffffffffff81111561232857612327613870565b5b6040519080825280601f01601f19166020018201604052801561235a5781602001600182028036833780820191505090505b509050600082602001820190505b6001156123bd578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816123b1576123b0613bf5565b5b04945060008503612368575b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061249357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124a357506124a282612f75565b5b9050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661252583611204565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006125768261199d565b6125b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ac90614c61565b60405180910390fd5b60006125c083611204565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061262f57508373ffffffffffffffffffffffffffffffffffffffff1661261784610946565b73ffffffffffffffffffffffffffffffffffffffff16145b80612640575061263f81856117f9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661266982611204565b73ffffffffffffffffffffffffffffffffffffffff16146126bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b690614cf3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361272e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272590614d85565b60405180910390fd5b612739838383612fdf565b6127446000826124b2565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127949190613b7f565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127eb9190613e4b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128aa838383612fe4565b505050565b3273ffffffffffffffffffffffffffffffffffffffff166128ce6124aa565b73ffffffffffffffffffffffffffffffffffffffff1614612924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291b906149aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298a90614a16565b60405180910390fd5b600081116129d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cd90614e17565b60405180910390fd5b806003541015612a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1290614aa8565b60405180910390fd5b6000600354905060005b82811015612a63576000612a398584612fe9565b9050612a458582612b90565b82612a4f90614ac8565b92505080612a5c9061428c565b9050612a25565b508060038190555081600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aba9190613e4b565b92505081905550505050565b600080600260008581526020019081526020016000205490506000808203612af057849050612af4565b8190505b6000600185612b039190613b7f565b9050600060026000838152602001908152602001600020549050818714612b635760008103612b4957816002600089815260200190815260200160002081905550612b62565b8060026000898152602001908152602001600020819055505b5b60008114612b835760026000838152602001908152602001600020600090555b8294505050505092915050565b612b9c60008383612fdf565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c5660008383612fe4565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cbf90614e83565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612db991906132f1565b60405180910390a3505050565b612dd1848484612649565b612ddd84848484613093565b612e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1390614f15565b60405180910390fd5b50505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612e80577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612e7657612e75613bf5565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612ebd576d04ee2d6d415b85acef81000000008381612eb357612eb2613bf5565b5b0492506020810190505b662386f26fc100008310612eec57662386f26fc100008381612ee257612ee1613bf5565b5b0492506010810190505b6305f5e1008310612f15576305f5e1008381612f0b57612f0a613bf5565b5b0492506008810190505b6127108310612f3a576127108381612f3057612f2f613bf5565b5b0492506004810190505b60648310612f5d5760648381612f5357612f52613bf5565b5b0492506002810190505b600a8310612f6c576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b505050565b600080833a4342600143612ffd9190613b7f565b4030886040516020016130169796959493929190614f4e565b6040516020818303038152906040528051906020012060001c90506000838261303f9190614fbd565b9050600061304d8286612ac6565b90505b6008600082815260200190815260200160002060009054906101000a900460ff1615613087576130808686612fe9565b9050613050565b80935050505092915050565b60006130b48473ffffffffffffffffffffffffffffffffffffffff1661321a565b1561320d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130dd6124aa565b8786866040518563ffffffff1660e01b81526004016130ff9493929190615043565b6020604051808303816000875af192505050801561313b57506040513d601f19601f8201168201806040525081019061313891906150a4565b60015b6131bd573d806000811461316b576040519150601f19603f3d011682016040523d82523d6000602084013e613170565b606091505b5060008151036131b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ac90614f15565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613212565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61328681613251565b811461329157600080fd5b50565b6000813590506132a38161327d565b92915050565b6000602082840312156132bf576132be613247565b5b60006132cd84828501613294565b91505092915050565b60008115159050919050565b6132eb816132d6565b82525050565b600060208201905061330660008301846132e2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561334657808201518184015260208101905061332b565b60008484015250505050565b6000601f19601f8301169050919050565b600061336e8261330c565b6133788185613317565b9350613388818560208601613328565b61339181613352565b840191505092915050565b600060208201905081810360008301526133b68184613363565b905092915050565b6000819050919050565b6133d1816133be565b81146133dc57600080fd5b50565b6000813590506133ee816133c8565b92915050565b60006020828403121561340a57613409613247565b5b6000613418848285016133df565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061344c82613421565b9050919050565b61345c81613441565b82525050565b60006020820190506134776000830184613453565b92915050565b61348681613441565b811461349157600080fd5b50565b6000813590506134a38161347d565b92915050565b600080604083850312156134c0576134bf613247565b5b60006134ce85828601613494565b92505060206134df858286016133df565b9150509250929050565b6134f2816133be565b82525050565b600060208201905061350d60008301846134e9565b92915050565b60008060006060848603121561352c5761352b613247565b5b600061353a86828701613494565b935050602061354b86828701613494565b925050604061355c868287016133df565b9150509250925092565b6000806040838503121561357d5761357c613247565b5b600061358b858286016133df565b925050602061359c858286016133df565b9150509250929050565b60006040820190506135bb6000830185613453565b6135c860208301846134e9565b9392505050565b600080fd5b600080fd5b600080fd5b60008083601f8401126135f4576135f36135cf565b5b8235905067ffffffffffffffff811115613611576136106135d4565b5b60208301915083600182028301111561362d5761362c6135d9565b5b9250929050565b6000806020838503121561364b5761364a613247565b5b600083013567ffffffffffffffff8111156136695761366861324c565b5b613675858286016135de565b92509250509250929050565b60008060006060848603121561369a57613699613247565b5b60006136a886828701613494565b93505060206136b9868287016133df565b92505060406136ca868287016133df565b9150509250925092565b6000602082840312156136ea576136e9613247565b5b60006136f884828501613494565b91505092915050565b60006bffffffffffffffffffffffff82169050919050565b61372281613701565b811461372d57600080fd5b50565b60008135905061373f81613719565b92915050565b6000806040838503121561375c5761375b613247565b5b600061376a85828601613494565b925050602061377b85828601613730565b9150509250929050565b61378e816132d6565b811461379957600080fd5b50565b6000813590506137ab81613785565b92915050565b600080604083850312156137c8576137c7613247565b5b60006137d685828601613494565b92505060206137e78582860161379c565b9150509250929050565b6000819050919050565b600061381661381161380c84613421565b6137f1565b613421565b9050919050565b6000613828826137fb565b9050919050565b600061383a8261381d565b9050919050565b61384a8161382f565b82525050565b60006020820190506138656000830184613841565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6138a882613352565b810181811067ffffffffffffffff821117156138c7576138c6613870565b5b80604052505050565b60006138da61323d565b90506138e6828261389f565b919050565b600067ffffffffffffffff82111561390657613905613870565b5b61390f82613352565b9050602081019050919050565b82818337600083830152505050565b600061393e613939846138eb565b6138d0565b90508281526020810184848401111561395a5761395961386b565b5b61396584828561391c565b509392505050565b600082601f830112613982576139816135cf565b5b813561399284826020860161392b565b91505092915050565b600080600080608085870312156139b5576139b4613247565b5b60006139c387828801613494565b94505060206139d487828801613494565b93505060406139e5878288016133df565b925050606085013567ffffffffffffffff811115613a0657613a0561324c565b5b613a128782880161396d565b91505092959194509250565b60008060408385031215613a3557613a34613247565b5b6000613a4385828601613494565b9250506020613a5485828601613494565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613aa557607f821691505b602082108103613ab857613ab7613a5e565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613b1a602c83613317565b9150613b2582613abe565b604082019050919050565b60006020820190508181036000830152613b4981613b0d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b8a826133be565b9150613b95836133be565b9250828203905081811115613bad57613bac613b50565b5b92915050565b6000613bbe826133be565b9150613bc9836133be565b9250828202613bd7816133be565b91508282048414831517613bee57613bed613b50565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c2f826133be565b9150613c3a836133be565b925082613c4a57613c49613bf5565b5b828204905092915050565b600081905092915050565b50565b6000613c70600083613c55565b9150613c7b82613c60565b600082019050919050565b6000613c9182613c63565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000613cd1601083613317565b9150613cdc82613c9b565b602082019050919050565b60006020820190508181036000830152613d0081613cc4565b9050919050565b7f53616c65206973206e6f742079657420656e61626c6564000000000000000000600082015250565b6000613d3d601783613317565b9150613d4882613d07565b602082019050919050565b60006020820190508181036000830152613d6c81613d30565b9050919050565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b6000613da9600e83613317565b9150613db482613d73565b602082019050919050565b60006020820190508181036000830152613dd881613d9c565b9050919050565b7f546f6f206d616e79207065722054580000000000000000000000000000000000600082015250565b6000613e15600f83613317565b9150613e2082613ddf565b602082019050919050565b60006020820190508181036000830152613e4481613e08565b9050919050565b6000613e56826133be565b9150613e61836133be565b9250828201905080821115613e7957613e78613b50565b5b92915050565b7f45786365656473206d6178206d696e74206c696d6974207065722077616c6c6560008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6000613edb602183613317565b9150613ee682613e7f565b604082019050919050565b60006020820190508181036000830152613f0a81613ece565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613f7e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613f41565b613f888683613f41565b95508019841693508086168417925050509392505050565b6000613fbb613fb6613fb1846133be565b6137f1565b6133be565b9050919050565b6000819050919050565b613fd583613fa0565b613fe9613fe182613fc2565b848454613f4e565b825550505050565b600090565b613ffe613ff1565b614009818484613fcc565b505050565b5b8181101561402d57614022600082613ff6565b60018101905061400f565b5050565b601f8211156140725761404381613f1c565b61404c84613f31565b8101602085101561405b578190505b61406f61406785613f31565b83018261400e565b50505b505050565b600082821c905092915050565b600061409560001984600802614077565b1980831691505092915050565b60006140ae8383614084565b9150826002028217905092915050565b6140c88383613f11565b67ffffffffffffffff8111156140e1576140e0613870565b5b6140eb8254613a8d565b6140f6828285614031565b6000601f8311600181146141255760008415614113578287013590505b61411d85826140a2565b865550614185565b601f19841661413386613f1c565b60005b8281101561415b57848901358255600182019150602085019450602081019050614136565b868310156141785784890135614174601f891682614084565b8355505b6001600288020188555050505b50505050505050565b7f496e76616c69642072616e67652e000000000000000000000000000000000000600082015250565b60006141c4600e83613317565b91506141cf8261418e565b602082019050919050565b600060208201905081810360008301526141f3816141b7565b9050919050565b7f4f6e65206f72206d6f726520746f6b656e7320696e207468652072616e67652060008201527f68617665206265656e206d696e7465642e000000000000000000000000000000602082015250565b6000614256603183613317565b9150614261826141fa565b604082019050919050565b6000602082019050818103600083015261428581614249565b9050919050565b6000614297826133be565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036142c9576142c8613b50565b5b600182019050919050565b7f4e6577206c696d6974206973207468652073616d65206173207468652065786960008201527f7374696e67206f6e650000000000000000000000000000000000000000000000602082015250565b6000614330602983613317565b915061433b826142d4565b604082019050919050565b6000602082019050818103600083015261435f81614323565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006143c2602983613317565b91506143cd82614366565b604082019050919050565b600060208201905081810360008301526143f1816143b5565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614454602a83613317565b915061445f826143f8565b604082019050919050565b6000602082019050818103600083015261448381614447565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006144e6602f83613317565b91506144f18261448a565b604082019050919050565b60006020820190508181036000830152614515816144d9565b9050919050565b600081905092915050565b60006145328261330c565b61453c818561451c565b935061454c818560208601613328565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061458e60058361451c565b915061459982614558565b600582019050919050565b60006145b08285614527565b91506145bc8284614527565b91506145c782614581565b91508190509392505050565b7f546f6b656e20686173206265656e206d696e7465642e00000000000000000000600082015250565b6000614609601683613317565b9150614614826145d3565b602082019050919050565b60006020820190508181036000830152614638816145fc565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061469b602683613317565b91506146a68261463f565b604082019050919050565b600060208201905081810360008301526146ca8161468e565b9050919050565b60006040820190506146e66000830185613453565b6146f36020830184613453565b9392505050565b60008151905061470981613785565b92915050565b60006020828403121561472557614724613247565b5b6000614733848285016146fa565b91505092915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614798602183613317565b91506147a38261473c565b604082019050919050565b600060208201905081810360008301526147c78161478b565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061482a603883613317565b9150614835826147ce565b604082019050919050565b600060208201905081810360008301526148598161481d565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006148bc603183613317565b91506148c782614860565b604082019050919050565b600060208201905081810360008301526148eb816148af565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614928602083613317565b9150614933826148f2565b602082019050919050565b600060208201905081810360008301526149578161491b565b9050919050565b7f436f6e7472616374732063616e6e6f74206d696e740000000000000000000000600082015250565b6000614994601583613317565b915061499f8261495e565b602082019050919050565b600060208201905081810360008301526149c381614987565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a00602083613317565b9150614a0b826149ca565b602082019050919050565b60006020820190508181036000830152614a2f816149f3565b9050919050565b7f455243373231723a206d696e74696e67206d6f726520746f6b656e732074686160008201527f6e20617661696c61626c65000000000000000000000000000000000000000000602082015250565b6000614a92602b83613317565b9150614a9d82614a36565b604082019050919050565b60006020820190508181036000830152614ac181614a85565b9050919050565b6000614ad3826133be565b915060008203614ae657614ae5613b50565b5b600182039050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000614b4d602a83613317565b9150614b5882614af1565b604082019050919050565b60006020820190508181036000830152614b7c81614b40565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614bb9601983613317565b9150614bc482614b83565b602082019050919050565b60006020820190508181036000830152614be881614bac565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614c4b602c83613317565b9150614c5682614bef565b604082019050919050565b60006020820190508181036000830152614c7a81614c3e565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614cdd602583613317565b9150614ce882614c81565b604082019050919050565b60006020820190508181036000830152614d0c81614cd0565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614d6f602483613317565b9150614d7a82614d13565b604082019050919050565b60006020820190508181036000830152614d9e81614d62565b9050919050565b7f455243373231723a206e65656420746f206d696e74206174206c65617374206f60008201527f6e6520746f6b656e000000000000000000000000000000000000000000000000602082015250565b6000614e01602883613317565b9150614e0c82614da5565b604082019050919050565b60006020820190508181036000830152614e3081614df4565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614e6d601983613317565b9150614e7882614e37565b602082019050919050565b60006020820190508181036000830152614e9c81614e60565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614eff603283613317565b9150614f0a82614ea3565b604082019050919050565b60006020820190508181036000830152614f2e81614ef2565b9050919050565b6000819050919050565b614f4881614f35565b82525050565b600060e082019050614f63600083018a613453565b614f7060208301896134e9565b614f7d60408301886134e9565b614f8a60608301876134e9565b614f976080830186614f3f565b614fa460a0830185613453565b614fb160c08301846134e9565b98975050505050505050565b6000614fc8826133be565b9150614fd3836133be565b925082614fe357614fe2613bf5565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061501582614fee565b61501f8185614ff9565b935061502f818560208601613328565b61503881613352565b840191505092915050565b60006080820190506150586000830187613453565b6150656020830186613453565b61507260408301856134e9565b8181036060830152615084818461500a565b905095945050505050565b60008151905061509e8161327d565b92915050565b6000602082840312156150ba576150b9613247565b5b60006150c88482850161508f565b9150509291505056fea2646970667358221220fce474cee0b6845f1645bd538ec66d210479a22d6a0370745edcf4c19d03d31164736f6c63430008130033

Deployed Bytecode Sourcemap

83171:4777:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86381:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48007:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49577:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87073:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47144:119;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83358:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87238:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8528:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;86085:173;;;;;;;;;;;;;:::i;:::-;;87409:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83827:470;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84627:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85680:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81673:531;;;;;;;;;;;;;:::i;:::-;;85064:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47700:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47430:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2991:103;;;;;;;;;;;;;:::i;:::-;;84743:86;;;;;;;;;;;;;:::i;:::-;;87812:133;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83409:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85359:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84837:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85265:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48176:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83450:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86889:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83562:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75647:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87588:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81060:487;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48351:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85486:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83522:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47271:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50096:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80286:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3249:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86381:171;86484:4;86508:36;86532:11;86508:23;:36::i;:::-;86501:43;;86381:171;;;:::o;48007:100::-;48061:13;48094:5;48087:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48007:100;:::o;49577:221::-;49653:7;49681:16;49689:7;49681;:16::i;:::-;49673:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49766:15;:24;49782:7;49766:24;;;;;;;;;;;;;;;;;;;;;49759:31;;49577:221;;;:::o;87073:157::-;87169:8;77420:30;77441:8;77420:20;:30::i;:::-;87190:32:::1;87204:8;87214:7;87190:13;:32::i;:::-;87073:157:::0;;;:::o;47144:119::-;47196:7;47236:19;;47223:10;:32;;;;:::i;:::-;47216:39;;47144:119;:::o;83358:44::-;;;;:::o;87238:163::-;87339:4;77153:10;77145:18;;:4;:18;;;77141:83;;77180:32;77201:10;77180:20;:32::i;:::-;77141:83;87356:37:::1;87375:4;87381:2;87385:7;87356:18;:37::i;:::-;87238:163:::0;;;;:::o;8528:438::-;8623:7;8632;8652:26;8681:17;:26;8699:7;8681:26;;;;;;;;;;;8652:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8752:1;8724:30;;:7;:16;;;:30;;;8720:92;;8781:19;8771:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8720:92;8824:21;8888:17;:15;:17::i;:::-;8848:57;;8861:7;:23;;;8849:35;;:9;:35;;;;:::i;:::-;8848:57;;;;:::i;:::-;8824:81;;8926:7;:16;;;8944:13;8918:40;;;;;;8528:438;;;;;:::o;86085:173::-;2236:13;:11;:13::i;:::-;86136:12:::1;86154:10;:15;;86177:21;86154:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86135:68;;;86222:7;86214:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;86124:134;86085:173::o:0;87409:171::-;87514:4;77153:10;77145:18;;:4;:18;;;77141:83;;77180:32;77201:10;77180:20;:32::i;:::-;77141:83;87531:41:::1;87554:4;87560:2;87564:7;87531:22;:41::i;:::-;87409:171:::0;;;;:::o;83827:470::-;83896:11;;;;;;;;;;;83888:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;83973:9;83962:7;83954:5;;:15;;;;:::i;:::-;:28;;83946:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;84031:15;;84020:7;:26;;84012:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;84130:24;;84119:7;84099:5;:17;84105:10;84099:17;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;:55;;84077:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;84237:7;84216:5;:17;84222:10;84216:17;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;84255:34;84269:10;84281:7;84255:13;:34::i;:::-;83827:470;:::o;84627:108::-;2236:13;:11;:13::i;:::-;84716:11:::1;;84706:7;:21;;;;;;;:::i;:::-;;84627:108:::0;;:::o;85680:395::-;2236:13;:11;:13::i;:::-;85806:10:::1;85790:12;:26;;85782:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;85846:9;85858:12;85846:24;;85842:226;85877:10;85872:1;:15;85842:226;;85936:1;85913:25;;:11;85922:1;85913:8;:11::i;:::-;:25;;;85905:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;86024:4;86003:15;:18;86019:1;86003:18;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;86041:19;86054:2;86058:1;86041:12;:19::i;:::-;85889:3;;;;;:::i;:::-;;;;85842:226;;;;85680:395:::0;;;:::o;81673:531::-;81749:7;:5;:7::i;:::-;81735:21;;:10;:21;;;81731:72;;81780:11;;;;;;;;;;;;;;81731:72;81888:31;;;;;;;;;;;81884:95;;;81943:24;;;;;;;;;;;;;;81884:95;82097:1;82040:22;;:60;;;;;;;;;;;;;;;;;;82145:4;82111:31;;:38;;;;;;;;;;;;;;;;;;82165:31;;;;;;;;;;81673:531::o;85064:193::-;2236:13;:11;:13::i;:::-;85162:6:::1;85143:15;;:25:::0;85135:79:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;85243:6;85225:15;:24;;;;85064:193:::0;:::o;47700:240::-;47772:7;47792:13;47808:17;47817:7;47808:8;:17::i;:::-;47792:33;;47861:1;47844:19;;:5;:19;;;47836:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47927:5;47920:12;;;47700:240;;;:::o;47430:208::-;47502:7;47547:1;47530:19;;:5;:19;;;47522:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;47614:9;:16;47624:5;47614:16;;;;;;;;;;;;;;;;47607:23;;47430:208;;;:::o;2991:103::-;2236:13;:11;:13::i;:::-;3056:30:::1;3083:1;3056:18;:30::i;:::-;2991:103::o:0;84743:86::-;2236:13;:11;:13::i;:::-;84810:11:::1;;;;;;;;;;;84809:12;84795:11;;:26;;;;;;;;;;;;;;;;;;84743:86::o:0;87812:133::-;87895:7;87922:15;:13;:15::i;:::-;87915:22;;87812:133;:::o;83409:34::-;;;;:::o;85359:119::-;2236:13;:11;:13::i;:::-;85438:32:::1;85457:6;85465:4;85438:18;:32::i;:::-;85359:119:::0;;:::o;84837:219::-;2236:13;:11;:13::i;:::-;84952:6:::1;84924:24;;:34:::0;84916:88:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;85042:6;85015:24;:33;;;;84837:219:::0;:::o;85265:86::-;2236:13;:11;:13::i;:::-;85337:6:::1;85329:5;:14;;;;85265:86:::0;:::o;48176:104::-;48232:13;48265:7;48258:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48176:104;:::o;83450:34::-;;;;:::o;86889:176::-;86993:8;77420:30;77441:8;77420:20;:30::i;:::-;87014:43:::1;87038:8;87048;87014:23;:43::i;:::-;86889:176:::0;;;:::o;83562:40::-;;;;;;;;;;;;;;;;;:::o;75647:53::-;;;;;;;;;;;;;:::o;87588:216::-;87727:4;77153:10;77145:18;;:4;:18;;;77141:83;;77180:32;77201:10;77180:20;:32::i;:::-;77141:83;87749:47:::1;87772:4;87778:2;87782:7;87791:4;87749:22;:47::i;:::-;87588:216:::0;;;;;:::o;81060:487::-;81171:7;:5;:7::i;:::-;81157:21;;:10;:21;;;81153:72;;81202:11;;;;;;;;;;;;;;81153:72;81310:31;;;;;;;;;;;81306:95;;;81365:24;;;;;;;;;;;;;;81306:95;81462:11;81413:22;;:61;;;;;;;;;;;;;;;;;;81490:49;81527:11;81490:49;;;;;;:::i;:::-;;;;;;;;81060:487;:::o;48351:343::-;48424:13;48458:16;48466:7;48458;:16::i;:::-;48450:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;48539:21;48563:10;:8;:10::i;:::-;48539:34;;48615:1;48597:7;48591:21;:25;:95;;;;;;;;;;;;;;;;;48643:7;48652:18;:7;:16;:18::i;:::-;48626:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48591:95;48584:102;;;48351:343;;;:::o;85486:186::-;2236:13;:11;:13::i;:::-;85599:1:::1;85570:31;;:17;85579:7;85570:8;:17::i;:::-;:31;;;85562:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;85639:25;85652:2;85656:7;85639:12;:25::i;:::-;85486:186:::0;;:::o;83522:31::-;;;;;;;;;;;;;:::o;47271:95::-;47321:7;47348:10;47341:17;;47271:95;:::o;50096:164::-;50193:4;50217:18;:25;50236:5;50217:25;;;;;;;;;;;;;;;:35;50243:8;50217:35;;;;;;;;;;;;;;;;;;;;;;;;;50210:42;;50096:164;;;;:::o;80286:43::-;;;;;;;;;;;;;:::o;3249:201::-;2236:13;:11;:13::i;:::-;3358:1:::1;3338:22;;:8;:22;;::::0;3330:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3414:28;3433:8;3414:18;:28::i;:::-;3249:201:::0;:::o;8258:215::-;8360:4;8399:26;8384:41;;;:11;:41;;;;:81;;;;8429:36;8453:11;8429:23;:36::i;:::-;8384:81;8377:88;;8258:215;;;:::o;52956:127::-;53021:4;53073:1;53045:30;;:7;:16;53053:7;53045:16;;;;;;;;;;;;;;;;;;;;;:30;;;;53038:37;;52956:127;;;:::o;78271:718::-;78352:32;78387:22;;;;;;;;;;;78352:57;;78559:1;78530:31;;78538:8;78530:31;;;;:68;;;;;78597:1;78573:8;78565:29;;;:33;78530:68;78526:456;;;78848:8;:26;;;78883:4;78890:8;78848:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78843:128;;78946:8;78927:28;;;;;;;;;;;:::i;:::-;;;;;;;;78843:128;78526:456;78341:648;78271:718;:::o;49099:412::-;49180:13;49196:24;49212:7;49196:15;:24::i;:::-;49180:40;;49245:5;49239:11;;:2;:11;;;49231:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49339:5;49323:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;49348:37;49365:5;49372:12;:10;:12::i;:::-;49348:16;:37::i;:::-;49323:62;49301:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;49482:21;49491:2;49495:7;49482:8;:21::i;:::-;49169:342;49099:412;;:::o;50327:339::-;50522:41;50541:12;:10;:12::i;:::-;50555:7;50522:18;:41::i;:::-;50514:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;50630:28;50640:4;50646:2;50650:7;50630:9;:28::i;:::-;50327:339;;;:::o;9248:97::-;9306:6;9332:5;9325:12;;9248:97;:::o;2515:132::-;2590:12;:10;:12::i;:::-;2579:23;;:7;:5;:7::i;:::-;:23;;;2571:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2515:132::o;50737:185::-;50875:39;50892:4;50898:2;50902:7;50875:39;;;;;;;;;;;;:16;:39::i;:::-;50737:185;;;:::o;84355:102::-;84426:23;84438:2;84442:6;84426:11;:23::i;:::-;84355:102;;:::o;51329:117::-;51395:7;51422;:16;51430:7;51422:16;;;;;;;;;;;;;;;;;;;;;51415:23;;51329:117;;;:::o;57251:500::-;57349:9;57333:25;;:12;:10;:12::i;:::-;:25;;;57325:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;57417:1;57403:16;;:2;:16;;;57395:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;57498:1;57475:19;;:24;;57467:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;57560:12;57575:52;57600:5;57607:19;;57575:24;:52::i;:::-;57560:67;;57640:19;;57638:21;;;;;:::i;:::-;;;;;;;;57672:40;57700:2;57704:7;57672:27;:40::i;:::-;57742:1;57725:9;:13;57735:2;57725:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;57314:437;57251:500;;:::o;3610:191::-;3684:16;3703:6;;;;;;;;;;;3684:25;;3729:8;3720:6;;:17;;;;;;;;;;;;;;;;;;3784:8;3753:40;;3774:8;3753:40;;;;;;;;;;;;3673:128;3610:191;:::o;2350:87::-;2396:7;2423:6;;;;;;;;;;;2416:13;;2350:87;:::o;9616:332::-;9735:17;:15;:17::i;:::-;9719:33;;:12;:33;;;;9711:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;9838:1;9818:22;;:8;:22;;;9810:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;9905:35;;;;;;;;9917:8;9905:35;;;;;;9927:12;9905:35;;;;;9883:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9616:332;;:::o;49870:155::-;49965:52;49984:12;:10;:12::i;:::-;49998:8;50008;49965:18;:52::i;:::-;49870:155;;:::o;50993:328::-;51168:41;51187:12;:10;:12::i;:::-;51201:7;51168:18;:41::i;:::-;51160:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;51274:39;51288:4;51294:2;51298:7;51307:5;51274:13;:39::i;:::-;50993:328;;;;:::o;84465:108::-;84525:13;84558:7;84551:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84465:108;:::o;31991:716::-;32047:13;32098:14;32135:1;32115:17;32126:5;32115:10;:17::i;:::-;:21;32098:38;;32151:20;32185:6;32174:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32151:41;;32207:11;32336:6;32332:2;32328:15;32320:6;32316:28;32309:35;;32373:288;32380:4;32373:288;;;32405:5;;;;;;;;32547:8;32542:2;32535:5;32531:14;32526:30;32521:3;32513:44;32603:2;32594:11;;;;;;:::i;:::-;;;;;32637:1;32628:5;:10;32373:288;32624:21;32373:288;32682:6;32675:13;;;;;31991:716;;;:::o;46843:293::-;46945:4;46993:25;46978:40;;;:11;:40;;;;:101;;;;47046:33;47031:48;;;:11;:48;;;;46978:101;:150;;;;47092:36;47116:11;47092:23;:36::i;:::-;46978:150;46962:166;;46843:293;;;:::o;846:98::-;899:7;926:10;919:17;;846:98;:::o;58832:175::-;58934:2;58907:15;:24;58923:7;58907:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;58991:7;58987:2;58952:47;;58961:24;58977:7;58961:15;:24::i;:::-;58952:47;;;;;;;;;;;;58832:175;;:::o;53250:349::-;53343:4;53368:16;53376:7;53368;:16::i;:::-;53360:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53444:13;53460:24;53476:7;53460:15;:24::i;:::-;53444:40;;53514:5;53503:16;;:7;:16;;;:51;;;;53547:7;53523:31;;:20;53535:7;53523:11;:20::i;:::-;:31;;;53503:51;:87;;;;53558:32;53575:5;53582:7;53558:16;:32::i;:::-;53503:87;53495:96;;;53250:349;;;;:::o;58088:626::-;58248:4;58220:32;;:24;58236:7;58220:15;:24::i;:::-;:32;;;58212:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;58327:1;58313:16;;:2;:16;;;58305:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;58383:39;58404:4;58410:2;58414:7;58383:20;:39::i;:::-;58487:29;58504:1;58508:7;58487:8;:29::i;:::-;58548:1;58529:9;:15;58539:4;58529:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;58577:1;58560:9;:13;58570:2;58560:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;58608:2;58589:7;:16;58597:7;58589:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;58647:7;58643:2;58628:27;;58637:4;58628:27;;;;;;;;;;;;58668:38;58688:4;58694:2;58698:7;58668:19;:38::i;:::-;58088:626;;;:::o;53895:821::-;53997:9;53981:25;;:12;:10;:12::i;:::-;:25;;;53973:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;54065:1;54051:16;;:2;:16;;;54043:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54136:1;54123:10;:14;54115:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;54226:10;54203:19;;:33;;54195:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;54297:30;54330:19;;54297:52;;54365:9;54360:251;54380:10;54376:1;:14;54360:251;;;54412:15;54430:56;54456:2;54460:25;54430;:56::i;:::-;54412:74;;54515:40;54543:2;54547:7;54515:27;:40::i;:::-;54572:27;;;;:::i;:::-;;;54397:214;54392:3;;;;:::i;:::-;;;54360:251;;;;54645:25;54623:19;:47;;;;54698:10;54681:9;:13;54691:2;54681:13;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;53962:754;53895:821;;:::o;55783:1460::-;55897:7;55922:18;55943:16;:28;55960:10;55943:28;;;;;;;;;;;;55922:49;;55982:14;56025:1;56011:10;:15;56007:292;;56124:10;56115:19;;56007:292;;;56277:10;56268:19;;56007:292;56311:17;56359:1;56331:25;:29;;;;:::i;:::-;56311:49;;56371:22;56396:16;:27;56413:9;56396:27;;;;;;;;;;;;56371:52;;56452:9;56438:10;:23;56434:629;;56707:1;56689:14;:19;56685:367;;56836:9;56805:16;:28;56822:10;56805:28;;;;;;;;;;;:40;;;;56685:367;;;57022:14;56991:16;:28;57008:10;56991:28;;;;;;;;;;;:45;;;;56685:367;56434:629;57095:1;57077:14;:19;57073:137;;57171:16;:27;57188:9;57171:27;;;;;;;;;;;57164:34;;;57073:137;57229:6;57222:13;;;;;;55783:1460;;;;:::o;53607:280::-;53692:45;53721:1;53725:2;53729:7;53692:20;:45::i;:::-;53769:2;53750:7;:16;53758:7;53750:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;53814:7;53810:2;53789:33;;53806:1;53789:33;;;;;;;;;;;;53835:44;53863:1;53867:2;53871:7;53835:19;:44::i;:::-;53607:280;;:::o;59149:315::-;59304:8;59295:17;;:5;:17;;;59287:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;59391:8;59353:18;:25;59372:5;59353:25;;;;;;;;;;;;;;;:35;59379:8;59353:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;59437:8;59415:41;;59430:5;59415:41;;;59447:8;59415:41;;;;;;:::i;:::-;;;;;;;;59149:315;;;:::o;52328:::-;52485:28;52495:4;52501:2;52505:7;52485:9;:28::i;:::-;52532:48;52555:4;52561:2;52565:7;52574:5;52532:22;:48::i;:::-;52524:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;52328:315;;;;:::o;27374:948::-;27427:7;27447:14;27464:1;27447:18;;27514:8;27505:5;:17;27501:106;;27552:8;27543:17;;;;;;:::i;:::-;;;;;27589:2;27579:12;;;;27501:106;27634:8;27625:5;:17;27621:106;;27672:8;27663:17;;;;;;:::i;:::-;;;;;27709:2;27699:12;;;;27621:106;27754:8;27745:5;:17;27741:106;;27792:8;27783:17;;;;;;:::i;:::-;;;;;27829:2;27819:12;;;;27741:106;27874:7;27865:5;:16;27861:103;;27911:7;27902:16;;;;;;:::i;:::-;;;;;27947:1;27937:11;;;;27861:103;27991:7;27982:5;:16;27978:103;;28028:7;28019:16;;;;;;:::i;:::-;;;;;28064:1;28054:11;;;;27978:103;28108:7;28099:5;:16;28095:103;;28145:7;28136:16;;;;;;:::i;:::-;;;;;28181:1;28171:11;;;;28095:103;28225:7;28216:5;:16;28212:68;;28263:1;28253:11;;;;28212:68;28308:6;28301:13;;;27374:948;;;:::o;6653:157::-;6738:4;6777:25;6762:40;;;:11;:40;;;;6755:47;;6653:157;;;:::o;61400:126::-;;;;:::o;61911:125::-;;;;:::o;54724:941::-;54831:7;54856:17;54959:2;54984:11;55018:12;55053:15;55116:1;55101:12;:16;;;;:::i;:::-;55091:27;55149:4;55177:25;54926:295;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54898:338;;;;;;54876:371;;54856:391;;55258:19;55292:25;55280:9;:37;;;;:::i;:::-;55258:59;;55413:15;55431:64;55456:11;55469:25;55431:24;:64::i;:::-;55413:82;;55506:125;55512:15;:24;55528:7;55512:24;;;;;;;;;;;;;;;;;;;;;55506:125;;;55563:56;55589:2;55593:25;55563;:56::i;:::-;55553:66;;55506:125;;;55648:7;55641:14;;;;;54724:941;;;;:::o;60029:799::-;60184:4;60205:15;:2;:13;;;:15::i;:::-;60201:620;;;60257:2;60241:36;;;60278:12;:10;:12::i;:::-;60292:4;60298:7;60307:5;60241:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;60237:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60500:1;60483:6;:13;:18;60479:272;;60526:60;;;;;;;;;;:::i;:::-;;;;;;;;60479:272;60701:6;60695:13;60686:6;60682:2;60678:15;60671:38;60237:529;60374:41;;;60364:51;;;:6;:51;;;;60357:58;;;;;60201:620;60805:4;60798:11;;60029:799;;;;;;;:::o;37035:326::-;37095:4;37352:1;37330:7;:19;;;:23;37323:30;;37035:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:474::-;5935:6;5943;5992:2;5980:9;5971:7;5967:23;5963:32;5960:119;;;5998:79;;:::i;:::-;5960:119;6118:1;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6089:117;6245:2;6271:53;6316:7;6307:6;6296:9;6292:22;6271:53;:::i;:::-;6261:63;;6216:118;5867:474;;;;;:::o;6347:332::-;6468:4;6506:2;6495:9;6491:18;6483:26;;6519:71;6587:1;6576:9;6572:17;6563:6;6519:71;:::i;:::-;6600:72;6668:2;6657:9;6653:18;6644:6;6600:72;:::i;:::-;6347:332;;;;;:::o;6685:117::-;6794:1;6791;6784:12;6808:117;6917:1;6914;6907:12;6931:117;7040:1;7037;7030:12;7068:553;7126:8;7136:6;7186:3;7179:4;7171:6;7167:17;7163:27;7153:122;;7194:79;;:::i;:::-;7153:122;7307:6;7294:20;7284:30;;7337:18;7329:6;7326:30;7323:117;;;7359:79;;:::i;:::-;7323:117;7473:4;7465:6;7461:17;7449:29;;7527:3;7519:4;7511:6;7507:17;7497:8;7493:32;7490:41;7487:128;;;7534:79;;:::i;:::-;7487:128;7068:553;;;;;:::o;7627:529::-;7698:6;7706;7755:2;7743:9;7734:7;7730:23;7726:32;7723:119;;;7761:79;;:::i;:::-;7723:119;7909:1;7898:9;7894:17;7881:31;7939:18;7931:6;7928:30;7925:117;;;7961:79;;:::i;:::-;7925:117;8074:65;8131:7;8122:6;8111:9;8107:22;8074:65;:::i;:::-;8056:83;;;;7852:297;7627:529;;;;;:::o;8162:619::-;8239:6;8247;8255;8304:2;8292:9;8283:7;8279:23;8275:32;8272:119;;;8310:79;;:::i;:::-;8272:119;8430:1;8455:53;8500:7;8491:6;8480:9;8476:22;8455:53;:::i;:::-;8445:63;;8401:117;8557:2;8583:53;8628:7;8619:6;8608:9;8604:22;8583:53;:::i;:::-;8573:63;;8528:118;8685:2;8711:53;8756:7;8747:6;8736:9;8732:22;8711:53;:::i;:::-;8701:63;;8656:118;8162:619;;;;;:::o;8787:329::-;8846:6;8895:2;8883:9;8874:7;8870:23;8866:32;8863:119;;;8901:79;;:::i;:::-;8863:119;9021:1;9046:53;9091:7;9082:6;9071:9;9067:22;9046:53;:::i;:::-;9036:63;;8992:117;8787:329;;;;:::o;9122:109::-;9158:7;9198:26;9191:5;9187:38;9176:49;;9122:109;;;:::o;9237:120::-;9309:23;9326:5;9309:23;:::i;:::-;9302:5;9299:34;9289:62;;9347:1;9344;9337:12;9289:62;9237:120;:::o;9363:137::-;9408:5;9446:6;9433:20;9424:29;;9462:32;9488:5;9462:32;:::i;:::-;9363:137;;;;:::o;9506:472::-;9573:6;9581;9630:2;9618:9;9609:7;9605:23;9601:32;9598:119;;;9636:79;;:::i;:::-;9598:119;9756:1;9781:53;9826:7;9817:6;9806:9;9802:22;9781:53;:::i;:::-;9771:63;;9727:117;9883:2;9909:52;9953:7;9944:6;9933:9;9929:22;9909:52;:::i;:::-;9899:62;;9854:117;9506:472;;;;;:::o;9984:116::-;10054:21;10069:5;10054:21;:::i;:::-;10047:5;10044:32;10034:60;;10090:1;10087;10080:12;10034:60;9984:116;:::o;10106:133::-;10149:5;10187:6;10174:20;10165:29;;10203:30;10227:5;10203:30;:::i;:::-;10106:133;;;;:::o;10245:468::-;10310:6;10318;10367:2;10355:9;10346:7;10342:23;10338:32;10335:119;;;10373:79;;:::i;:::-;10335:119;10493:1;10518:53;10563:7;10554:6;10543:9;10539:22;10518:53;:::i;:::-;10508:63;;10464:117;10620:2;10646:50;10688:7;10679:6;10668:9;10664:22;10646:50;:::i;:::-;10636:60;;10591:115;10245:468;;;;;:::o;10719:60::-;10747:3;10768:5;10761:12;;10719:60;;;:::o;10785:142::-;10835:9;10868:53;10886:34;10895:24;10913:5;10895:24;:::i;:::-;10886:34;:::i;:::-;10868:53;:::i;:::-;10855:66;;10785:142;;;:::o;10933:126::-;10983:9;11016:37;11047:5;11016:37;:::i;:::-;11003:50;;10933:126;;;:::o;11065:158::-;11147:9;11180:37;11211:5;11180:37;:::i;:::-;11167:50;;11065:158;;;:::o;11229:195::-;11348:69;11411:5;11348:69;:::i;:::-;11343:3;11336:82;11229:195;;:::o;11430:286::-;11555:4;11593:2;11582:9;11578:18;11570:26;;11606:103;11706:1;11695:9;11691:17;11682:6;11606:103;:::i;:::-;11430:286;;;;:::o;11722:117::-;11831:1;11828;11821:12;11845:180;11893:77;11890:1;11883:88;11990:4;11987:1;11980:15;12014:4;12011:1;12004:15;12031:281;12114:27;12136:4;12114:27;:::i;:::-;12106:6;12102:40;12244:6;12232:10;12229:22;12208:18;12196:10;12193:34;12190:62;12187:88;;;12255:18;;:::i;:::-;12187:88;12295:10;12291:2;12284:22;12074:238;12031:281;;:::o;12318:129::-;12352:6;12379:20;;:::i;:::-;12369:30;;12408:33;12436:4;12428:6;12408:33;:::i;:::-;12318:129;;;:::o;12453:307::-;12514:4;12604:18;12596:6;12593:30;12590:56;;;12626:18;;:::i;:::-;12590:56;12664:29;12686:6;12664:29;:::i;:::-;12656:37;;12748:4;12742;12738:15;12730:23;;12453:307;;;:::o;12766:146::-;12863:6;12858:3;12853;12840:30;12904:1;12895:6;12890:3;12886:16;12879:27;12766:146;;;:::o;12918:423::-;12995:5;13020:65;13036:48;13077:6;13036:48;:::i;:::-;13020:65;:::i;:::-;13011:74;;13108:6;13101:5;13094:21;13146:4;13139:5;13135:16;13184:3;13175:6;13170:3;13166:16;13163:25;13160:112;;;13191:79;;:::i;:::-;13160:112;13281:54;13328:6;13323:3;13318;13281:54;:::i;:::-;13001:340;12918:423;;;;;:::o;13360:338::-;13415:5;13464:3;13457:4;13449:6;13445:17;13441:27;13431:122;;13472:79;;:::i;:::-;13431:122;13589:6;13576:20;13614:78;13688:3;13680:6;13673:4;13665:6;13661:17;13614:78;:::i;:::-;13605:87;;13421:277;13360:338;;;;:::o;13704:943::-;13799:6;13807;13815;13823;13872:3;13860:9;13851:7;13847:23;13843:33;13840:120;;;13879:79;;:::i;:::-;13840:120;13999:1;14024:53;14069:7;14060:6;14049:9;14045:22;14024:53;:::i;:::-;14014:63;;13970:117;14126:2;14152:53;14197:7;14188:6;14177:9;14173:22;14152:53;:::i;:::-;14142:63;;14097:118;14254:2;14280:53;14325:7;14316:6;14305:9;14301:22;14280:53;:::i;:::-;14270:63;;14225:118;14410:2;14399:9;14395:18;14382:32;14441:18;14433:6;14430:30;14427:117;;;14463:79;;:::i;:::-;14427:117;14568:62;14622:7;14613:6;14602:9;14598:22;14568:62;:::i;:::-;14558:72;;14353:287;13704:943;;;;;;;:::o;14653:474::-;14721:6;14729;14778:2;14766:9;14757:7;14753:23;14749:32;14746:119;;;14784:79;;:::i;:::-;14746:119;14904:1;14929:53;14974:7;14965:6;14954:9;14950:22;14929:53;:::i;:::-;14919:63;;14875:117;15031:2;15057:53;15102:7;15093:6;15082:9;15078:22;15057:53;:::i;:::-;15047:63;;15002:118;14653:474;;;;;:::o;15133:180::-;15181:77;15178:1;15171:88;15278:4;15275:1;15268:15;15302:4;15299:1;15292:15;15319:320;15363:6;15400:1;15394:4;15390:12;15380:22;;15447:1;15441:4;15437:12;15468:18;15458:81;;15524:4;15516:6;15512:17;15502:27;;15458:81;15586:2;15578:6;15575:14;15555:18;15552:38;15549:84;;15605:18;;:::i;:::-;15549:84;15370:269;15319:320;;;:::o;15645:231::-;15785:34;15781:1;15773:6;15769:14;15762:58;15854:14;15849:2;15841:6;15837:15;15830:39;15645:231;:::o;15882:366::-;16024:3;16045:67;16109:2;16104:3;16045:67;:::i;:::-;16038:74;;16121:93;16210:3;16121:93;:::i;:::-;16239:2;16234:3;16230:12;16223:19;;15882:366;;;:::o;16254:419::-;16420:4;16458:2;16447:9;16443:18;16435:26;;16507:9;16501:4;16497:20;16493:1;16482:9;16478:17;16471:47;16535:131;16661:4;16535:131;:::i;:::-;16527:139;;16254:419;;;:::o;16679:180::-;16727:77;16724:1;16717:88;16824:4;16821:1;16814:15;16848:4;16845:1;16838:15;16865:194;16905:4;16925:20;16943:1;16925:20;:::i;:::-;16920:25;;16959:20;16977:1;16959:20;:::i;:::-;16954:25;;17003:1;17000;16996:9;16988:17;;17027:1;17021:4;17018:11;17015:37;;;17032:18;;:::i;:::-;17015:37;16865:194;;;;:::o;17065:410::-;17105:7;17128:20;17146:1;17128:20;:::i;:::-;17123:25;;17162:20;17180:1;17162:20;:::i;:::-;17157:25;;17217:1;17214;17210:9;17239:30;17257:11;17239:30;:::i;:::-;17228:41;;17418:1;17409:7;17405:15;17402:1;17399:22;17379:1;17372:9;17352:83;17329:139;;17448:18;;:::i;:::-;17329:139;17113:362;17065:410;;;;:::o;17481:180::-;17529:77;17526:1;17519:88;17626:4;17623:1;17616:15;17650:4;17647:1;17640:15;17667:185;17707:1;17724:20;17742:1;17724:20;:::i;:::-;17719:25;;17758:20;17776:1;17758:20;:::i;:::-;17753:25;;17797:1;17787:35;;17802:18;;:::i;:::-;17787:35;17844:1;17841;17837:9;17832:14;;17667:185;;;;:::o;17858:147::-;17959:11;17996:3;17981:18;;17858:147;;;;:::o;18011:114::-;;:::o;18131:398::-;18290:3;18311:83;18392:1;18387:3;18311:83;:::i;:::-;18304:90;;18403:93;18492:3;18403:93;:::i;:::-;18521:1;18516:3;18512:11;18505:18;;18131:398;;;:::o;18535:379::-;18719:3;18741:147;18884:3;18741:147;:::i;:::-;18734:154;;18905:3;18898:10;;18535:379;;;:::o;18920:166::-;19060:18;19056:1;19048:6;19044:14;19037:42;18920:166;:::o;19092:366::-;19234:3;19255:67;19319:2;19314:3;19255:67;:::i;:::-;19248:74;;19331:93;19420:3;19331:93;:::i;:::-;19449:2;19444:3;19440:12;19433:19;;19092:366;;;:::o;19464:419::-;19630:4;19668:2;19657:9;19653:18;19645:26;;19717:9;19711:4;19707:20;19703:1;19692:9;19688:17;19681:47;19745:131;19871:4;19745:131;:::i;:::-;19737:139;;19464:419;;;:::o;19889:173::-;20029:25;20025:1;20017:6;20013:14;20006:49;19889:173;:::o;20068:366::-;20210:3;20231:67;20295:2;20290:3;20231:67;:::i;:::-;20224:74;;20307:93;20396:3;20307:93;:::i;:::-;20425:2;20420:3;20416:12;20409:19;;20068:366;;;:::o;20440:419::-;20606:4;20644:2;20633:9;20629:18;20621:26;;20693:9;20687:4;20683:20;20679:1;20668:9;20664:17;20657:47;20721:131;20847:4;20721:131;:::i;:::-;20713:139;;20440:419;;;:::o;20865:164::-;21005:16;21001:1;20993:6;20989:14;20982:40;20865:164;:::o;21035:366::-;21177:3;21198:67;21262:2;21257:3;21198:67;:::i;:::-;21191:74;;21274:93;21363:3;21274:93;:::i;:::-;21392:2;21387:3;21383:12;21376:19;;21035:366;;;:::o;21407:419::-;21573:4;21611:2;21600:9;21596:18;21588:26;;21660:9;21654:4;21650:20;21646:1;21635:9;21631:17;21624:47;21688:131;21814:4;21688:131;:::i;:::-;21680:139;;21407:419;;;:::o;21832:165::-;21972:17;21968:1;21960:6;21956:14;21949:41;21832:165;:::o;22003:366::-;22145:3;22166:67;22230:2;22225:3;22166:67;:::i;:::-;22159:74;;22242:93;22331:3;22242:93;:::i;:::-;22360:2;22355:3;22351:12;22344:19;;22003:366;;;:::o;22375:419::-;22541:4;22579:2;22568:9;22564:18;22556:26;;22628:9;22622:4;22618:20;22614:1;22603:9;22599:17;22592:47;22656:131;22782:4;22656:131;:::i;:::-;22648:139;;22375:419;;;:::o;22800:191::-;22840:3;22859:20;22877:1;22859:20;:::i;:::-;22854:25;;22893:20;22911:1;22893:20;:::i;:::-;22888:25;;22936:1;22933;22929:9;22922:16;;22957:3;22954:1;22951:10;22948:36;;;22964:18;;:::i;:::-;22948:36;22800:191;;;;:::o;22997:220::-;23137:34;23133:1;23125:6;23121:14;23114:58;23206:3;23201:2;23193:6;23189:15;23182:28;22997:220;:::o;23223:366::-;23365:3;23386:67;23450:2;23445:3;23386:67;:::i;:::-;23379:74;;23462:93;23551:3;23462:93;:::i;:::-;23580:2;23575:3;23571:12;23564:19;;23223:366;;;:::o;23595:419::-;23761:4;23799:2;23788:9;23784:18;23776:26;;23848:9;23842:4;23838:20;23834:1;23823:9;23819:17;23812:47;23876:131;24002:4;23876:131;:::i;:::-;23868:139;;23595:419;;;:::o;24020:97::-;24079:6;24107:3;24097:13;;24020:97;;;;:::o;24123:141::-;24172:4;24195:3;24187:11;;24218:3;24215:1;24208:14;24252:4;24249:1;24239:18;24231:26;;24123:141;;;:::o;24270:93::-;24307:6;24354:2;24349;24342:5;24338:14;24334:23;24324:33;;24270:93;;;:::o;24369:107::-;24413:8;24463:5;24457:4;24453:16;24432:37;;24369:107;;;;:::o;24482:393::-;24551:6;24601:1;24589:10;24585:18;24624:97;24654:66;24643:9;24624:97;:::i;:::-;24742:39;24772:8;24761:9;24742:39;:::i;:::-;24730:51;;24814:4;24810:9;24803:5;24799:21;24790:30;;24863:4;24853:8;24849:19;24842:5;24839:30;24829:40;;24558:317;;24482:393;;;;;:::o;24881:142::-;24931:9;24964:53;24982:34;24991:24;25009:5;24991:24;:::i;:::-;24982:34;:::i;:::-;24964:53;:::i;:::-;24951:66;;24881:142;;;:::o;25029:75::-;25072:3;25093:5;25086:12;;25029:75;;;:::o;25110:269::-;25220:39;25251:7;25220:39;:::i;:::-;25281:91;25330:41;25354:16;25330:41;:::i;:::-;25322:6;25315:4;25309:11;25281:91;:::i;:::-;25275:4;25268:105;25186:193;25110:269;;;:::o;25385:73::-;25430:3;25385:73;:::o;25464:189::-;25541:32;;:::i;:::-;25582:65;25640:6;25632;25626:4;25582:65;:::i;:::-;25517:136;25464:189;;:::o;25659:186::-;25719:120;25736:3;25729:5;25726:14;25719:120;;;25790:39;25827:1;25820:5;25790:39;:::i;:::-;25763:1;25756:5;25752:13;25743:22;;25719:120;;;25659:186;;:::o;25851:543::-;25952:2;25947:3;25944:11;25941:446;;;25986:38;26018:5;25986:38;:::i;:::-;26070:29;26088:10;26070:29;:::i;:::-;26060:8;26056:44;26253:2;26241:10;26238:18;26235:49;;;26274:8;26259:23;;26235:49;26297:80;26353:22;26371:3;26353:22;:::i;:::-;26343:8;26339:37;26326:11;26297:80;:::i;:::-;25956:431;;25941:446;25851:543;;;:::o;26400:117::-;26454:8;26504:5;26498:4;26494:16;26473:37;;26400:117;;;;:::o;26523:169::-;26567:6;26600:51;26648:1;26644:6;26636:5;26633:1;26629:13;26600:51;:::i;:::-;26596:56;26681:4;26675;26671:15;26661:25;;26574:118;26523:169;;;;:::o;26697:295::-;26773:4;26919:29;26944:3;26938:4;26919:29;:::i;:::-;26911:37;;26981:3;26978:1;26974:11;26968:4;26965:21;26957:29;;26697:295;;;;:::o;26997:1403::-;27121:44;27161:3;27156;27121:44;:::i;:::-;27230:18;27222:6;27219:30;27216:56;;;27252:18;;:::i;:::-;27216:56;27296:38;27328:4;27322:11;27296:38;:::i;:::-;27381:67;27441:6;27433;27427:4;27381:67;:::i;:::-;27475:1;27504:2;27496:6;27493:14;27521:1;27516:632;;;;28192:1;28209:6;28206:84;;;28265:9;28260:3;28256:19;28243:33;28234:42;;28206:84;28316:67;28376:6;28369:5;28316:67;:::i;:::-;28310:4;28303:81;28165:229;27486:908;;27516:632;27568:4;27564:9;27556:6;27552:22;27602:37;27634:4;27602:37;:::i;:::-;27661:1;27675:215;27689:7;27686:1;27683:14;27675:215;;;27775:9;27770:3;27766:19;27753:33;27745:6;27738:49;27826:1;27818:6;27814:14;27804:24;;27873:2;27862:9;27858:18;27845:31;;27712:4;27709:1;27705:12;27700:17;;27675:215;;;27918:6;27909:7;27906:19;27903:186;;;27983:9;27978:3;27974:19;27961:33;28026:48;28068:4;28060:6;28056:17;28045:9;28026:48;:::i;:::-;28018:6;28011:64;27926:163;27903:186;28135:1;28131;28123:6;28119:14;28115:22;28109:4;28102:36;27523:625;;;27486:908;;27096:1304;;;26997:1403;;;:::o;28406:164::-;28546:16;28542:1;28534:6;28530:14;28523:40;28406:164;:::o;28576:366::-;28718:3;28739:67;28803:2;28798:3;28739:67;:::i;:::-;28732:74;;28815:93;28904:3;28815:93;:::i;:::-;28933:2;28928:3;28924:12;28917:19;;28576:366;;;:::o;28948:419::-;29114:4;29152:2;29141:9;29137:18;29129:26;;29201:9;29195:4;29191:20;29187:1;29176:9;29172:17;29165:47;29229:131;29355:4;29229:131;:::i;:::-;29221:139;;28948:419;;;:::o;29373:236::-;29513:34;29509:1;29501:6;29497:14;29490:58;29582:19;29577:2;29569:6;29565:15;29558:44;29373:236;:::o;29615:366::-;29757:3;29778:67;29842:2;29837:3;29778:67;:::i;:::-;29771:74;;29854:93;29943:3;29854:93;:::i;:::-;29972:2;29967:3;29963:12;29956:19;;29615:366;;;:::o;29987:419::-;30153:4;30191:2;30180:9;30176:18;30168:26;;30240:9;30234:4;30230:20;30226:1;30215:9;30211:17;30204:47;30268:131;30394:4;30268:131;:::i;:::-;30260:139;;29987:419;;;:::o;30412:233::-;30451:3;30474:24;30492:5;30474:24;:::i;:::-;30465:33;;30520:66;30513:5;30510:77;30507:103;;30590:18;;:::i;:::-;30507:103;30637:1;30630:5;30626:13;30619:20;;30412:233;;;:::o;30651:228::-;30791:34;30787:1;30779:6;30775:14;30768:58;30860:11;30855:2;30847:6;30843:15;30836:36;30651:228;:::o;30885:366::-;31027:3;31048:67;31112:2;31107:3;31048:67;:::i;:::-;31041:74;;31124:93;31213:3;31124:93;:::i;:::-;31242:2;31237:3;31233:12;31226:19;;30885:366;;;:::o;31257:419::-;31423:4;31461:2;31450:9;31446:18;31438:26;;31510:9;31504:4;31500:20;31496:1;31485:9;31481:17;31474:47;31538:131;31664:4;31538:131;:::i;:::-;31530:139;;31257:419;;;:::o;31682:228::-;31822:34;31818:1;31810:6;31806:14;31799:58;31891:11;31886:2;31878:6;31874:15;31867:36;31682:228;:::o;31916:366::-;32058:3;32079:67;32143:2;32138:3;32079:67;:::i;:::-;32072:74;;32155:93;32244:3;32155:93;:::i;:::-;32273:2;32268:3;32264:12;32257:19;;31916:366;;;:::o;32288:419::-;32454:4;32492:2;32481:9;32477:18;32469:26;;32541:9;32535:4;32531:20;32527:1;32516:9;32512:17;32505:47;32569:131;32695:4;32569:131;:::i;:::-;32561:139;;32288:419;;;:::o;32713:229::-;32853:34;32849:1;32841:6;32837:14;32830:58;32922:12;32917:2;32909:6;32905:15;32898:37;32713:229;:::o;32948:366::-;33090:3;33111:67;33175:2;33170:3;33111:67;:::i;:::-;33104:74;;33187:93;33276:3;33187:93;:::i;:::-;33305:2;33300:3;33296:12;33289:19;;32948:366;;;:::o;33320:419::-;33486:4;33524:2;33513:9;33509:18;33501:26;;33573:9;33567:4;33563:20;33559:1;33548:9;33544:17;33537:47;33601:131;33727:4;33601:131;:::i;:::-;33593:139;;33320:419;;;:::o;33745:234::-;33885:34;33881:1;33873:6;33869:14;33862:58;33954:17;33949:2;33941:6;33937:15;33930:42;33745:234;:::o;33985:366::-;34127:3;34148:67;34212:2;34207:3;34148:67;:::i;:::-;34141:74;;34224:93;34313:3;34224:93;:::i;:::-;34342:2;34337:3;34333:12;34326:19;;33985:366;;;:::o;34357:419::-;34523:4;34561:2;34550:9;34546:18;34538:26;;34610:9;34604:4;34600:20;34596:1;34585:9;34581:17;34574:47;34638:131;34764:4;34638:131;:::i;:::-;34630:139;;34357:419;;;:::o;34782:148::-;34884:11;34921:3;34906:18;;34782:148;;;;:::o;34936:390::-;35042:3;35070:39;35103:5;35070:39;:::i;:::-;35125:89;35207:6;35202:3;35125:89;:::i;:::-;35118:96;;35223:65;35281:6;35276:3;35269:4;35262:5;35258:16;35223:65;:::i;:::-;35313:6;35308:3;35304:16;35297:23;;35046:280;34936:390;;;;:::o;35332:155::-;35472:7;35468:1;35460:6;35456:14;35449:31;35332:155;:::o;35493:400::-;35653:3;35674:84;35756:1;35751:3;35674:84;:::i;:::-;35667:91;;35767:93;35856:3;35767:93;:::i;:::-;35885:1;35880:3;35876:11;35869:18;;35493:400;;;:::o;35899:701::-;36180:3;36202:95;36293:3;36284:6;36202:95;:::i;:::-;36195:102;;36314:95;36405:3;36396:6;36314:95;:::i;:::-;36307:102;;36426:148;36570:3;36426:148;:::i;:::-;36419:155;;36591:3;36584:10;;35899:701;;;;;:::o;36606:172::-;36746:24;36742:1;36734:6;36730:14;36723:48;36606:172;:::o;36784:366::-;36926:3;36947:67;37011:2;37006:3;36947:67;:::i;:::-;36940:74;;37023:93;37112:3;37023:93;:::i;:::-;37141:2;37136:3;37132:12;37125:19;;36784:366;;;:::o;37156:419::-;37322:4;37360:2;37349:9;37345:18;37337:26;;37409:9;37403:4;37399:20;37395:1;37384:9;37380:17;37373:47;37437:131;37563:4;37437:131;:::i;:::-;37429:139;;37156:419;;;:::o;37581:225::-;37721:34;37717:1;37709:6;37705:14;37698:58;37790:8;37785:2;37777:6;37773:15;37766:33;37581:225;:::o;37812:366::-;37954:3;37975:67;38039:2;38034:3;37975:67;:::i;:::-;37968:74;;38051:93;38140:3;38051:93;:::i;:::-;38169:2;38164:3;38160:12;38153:19;;37812:366;;;:::o;38184:419::-;38350:4;38388:2;38377:9;38373:18;38365:26;;38437:9;38431:4;38427:20;38423:1;38412:9;38408:17;38401:47;38465:131;38591:4;38465:131;:::i;:::-;38457:139;;38184:419;;;:::o;38609:332::-;38730:4;38768:2;38757:9;38753:18;38745:26;;38781:71;38849:1;38838:9;38834:17;38825:6;38781:71;:::i;:::-;38862:72;38930:2;38919:9;38915:18;38906:6;38862:72;:::i;:::-;38609:332;;;;;:::o;38947:137::-;39001:5;39032:6;39026:13;39017:22;;39048:30;39072:5;39048:30;:::i;:::-;38947:137;;;;:::o;39090:345::-;39157:6;39206:2;39194:9;39185:7;39181:23;39177:32;39174:119;;;39212:79;;:::i;:::-;39174:119;39332:1;39357:61;39410:7;39401:6;39390:9;39386:22;39357:61;:::i;:::-;39347:71;;39303:125;39090:345;;;;:::o;39441:220::-;39581:34;39577:1;39569:6;39565:14;39558:58;39650:3;39645:2;39637:6;39633:15;39626:28;39441:220;:::o;39667:366::-;39809:3;39830:67;39894:2;39889:3;39830:67;:::i;:::-;39823:74;;39906:93;39995:3;39906:93;:::i;:::-;40024:2;40019:3;40015:12;40008:19;;39667:366;;;:::o;40039:419::-;40205:4;40243:2;40232:9;40228:18;40220:26;;40292:9;40286:4;40282:20;40278:1;40267:9;40263:17;40256:47;40320:131;40446:4;40320:131;:::i;:::-;40312:139;;40039:419;;;:::o;40464:243::-;40604:34;40600:1;40592:6;40588:14;40581:58;40673:26;40668:2;40660:6;40656:15;40649:51;40464:243;:::o;40713:366::-;40855:3;40876:67;40940:2;40935:3;40876:67;:::i;:::-;40869:74;;40952:93;41041:3;40952:93;:::i;:::-;41070:2;41065:3;41061:12;41054:19;;40713:366;;;:::o;41085:419::-;41251:4;41289:2;41278:9;41274:18;41266:26;;41338:9;41332:4;41328:20;41324:1;41313:9;41309:17;41302:47;41366:131;41492:4;41366:131;:::i;:::-;41358:139;;41085:419;;;:::o;41510:236::-;41650:34;41646:1;41638:6;41634:14;41627:58;41719:19;41714:2;41706:6;41702:15;41695:44;41510:236;:::o;41752:366::-;41894:3;41915:67;41979:2;41974:3;41915:67;:::i;:::-;41908:74;;41991:93;42080:3;41991:93;:::i;:::-;42109:2;42104:3;42100:12;42093:19;;41752:366;;;:::o;42124:419::-;42290:4;42328:2;42317:9;42313:18;42305:26;;42377:9;42371:4;42367:20;42363:1;42352:9;42348:17;42341:47;42405:131;42531:4;42405:131;:::i;:::-;42397:139;;42124:419;;;:::o;42549:182::-;42689:34;42685:1;42677:6;42673:14;42666:58;42549:182;:::o;42737:366::-;42879:3;42900:67;42964:2;42959:3;42900:67;:::i;:::-;42893:74;;42976:93;43065:3;42976:93;:::i;:::-;43094:2;43089:3;43085:12;43078:19;;42737:366;;;:::o;43109:419::-;43275:4;43313:2;43302:9;43298:18;43290:26;;43362:9;43356:4;43352:20;43348:1;43337:9;43333:17;43326:47;43390:131;43516:4;43390:131;:::i;:::-;43382:139;;43109:419;;;:::o;43534:171::-;43674:23;43670:1;43662:6;43658:14;43651:47;43534:171;:::o;43711:366::-;43853:3;43874:67;43938:2;43933:3;43874:67;:::i;:::-;43867:74;;43950:93;44039:3;43950:93;:::i;:::-;44068:2;44063:3;44059:12;44052:19;;43711:366;;;:::o;44083:419::-;44249:4;44287:2;44276:9;44272:18;44264:26;;44336:9;44330:4;44326:20;44322:1;44311:9;44307:17;44300:47;44364:131;44490:4;44364:131;:::i;:::-;44356:139;;44083:419;;;:::o;44508:182::-;44648:34;44644:1;44636:6;44632:14;44625:58;44508:182;:::o;44696:366::-;44838:3;44859:67;44923:2;44918:3;44859:67;:::i;:::-;44852:74;;44935:93;45024:3;44935:93;:::i;:::-;45053:2;45048:3;45044:12;45037:19;;44696:366;;;:::o;45068:419::-;45234:4;45272:2;45261:9;45257:18;45249:26;;45321:9;45315:4;45311:20;45307:1;45296:9;45292:17;45285:47;45349:131;45475:4;45349:131;:::i;:::-;45341:139;;45068:419;;;:::o;45493:230::-;45633:34;45629:1;45621:6;45617:14;45610:58;45702:13;45697:2;45689:6;45685:15;45678:38;45493:230;:::o;45729:366::-;45871:3;45892:67;45956:2;45951:3;45892:67;:::i;:::-;45885:74;;45968:93;46057:3;45968:93;:::i;:::-;46086:2;46081:3;46077:12;46070:19;;45729:366;;;:::o;46101:419::-;46267:4;46305:2;46294:9;46290:18;46282:26;;46354:9;46348:4;46344:20;46340:1;46329:9;46325:17;46318:47;46382:131;46508:4;46382:131;:::i;:::-;46374:139;;46101:419;;;:::o;46526:171::-;46565:3;46588:24;46606:5;46588:24;:::i;:::-;46579:33;;46634:4;46627:5;46624:15;46621:41;;46642:18;;:::i;:::-;46621:41;46689:1;46682:5;46678:13;46671:20;;46526:171;;;:::o;46703:229::-;46843:34;46839:1;46831:6;46827:14;46820:58;46912:12;46907:2;46899:6;46895:15;46888:37;46703:229;:::o;46938:366::-;47080:3;47101:67;47165:2;47160:3;47101:67;:::i;:::-;47094:74;;47177:93;47266:3;47177:93;:::i;:::-;47295:2;47290:3;47286:12;47279:19;;46938:366;;;:::o;47310:419::-;47476:4;47514:2;47503:9;47499:18;47491:26;;47563:9;47557:4;47553:20;47549:1;47538:9;47534:17;47527:47;47591:131;47717:4;47591:131;:::i;:::-;47583:139;;47310:419;;;:::o;47735:175::-;47875:27;47871:1;47863:6;47859:14;47852:51;47735:175;:::o;47916:366::-;48058:3;48079:67;48143:2;48138:3;48079:67;:::i;:::-;48072:74;;48155:93;48244:3;48155:93;:::i;:::-;48273:2;48268:3;48264:12;48257:19;;47916:366;;;:::o;48288:419::-;48454:4;48492:2;48481:9;48477:18;48469:26;;48541:9;48535:4;48531:20;48527:1;48516:9;48512:17;48505:47;48569:131;48695:4;48569:131;:::i;:::-;48561:139;;48288:419;;;:::o;48713:231::-;48853:34;48849:1;48841:6;48837:14;48830:58;48922:14;48917:2;48909:6;48905:15;48898:39;48713:231;:::o;48950:366::-;49092:3;49113:67;49177:2;49172:3;49113:67;:::i;:::-;49106:74;;49189:93;49278:3;49189:93;:::i;:::-;49307:2;49302:3;49298:12;49291:19;;48950:366;;;:::o;49322:419::-;49488:4;49526:2;49515:9;49511:18;49503:26;;49575:9;49569:4;49565:20;49561:1;49550:9;49546:17;49539:47;49603:131;49729:4;49603:131;:::i;:::-;49595:139;;49322:419;;;:::o;49747:224::-;49887:34;49883:1;49875:6;49871:14;49864:58;49956:7;49951:2;49943:6;49939:15;49932:32;49747:224;:::o;49977:366::-;50119:3;50140:67;50204:2;50199:3;50140:67;:::i;:::-;50133:74;;50216:93;50305:3;50216:93;:::i;:::-;50334:2;50329:3;50325:12;50318:19;;49977:366;;;:::o;50349:419::-;50515:4;50553:2;50542:9;50538:18;50530:26;;50602:9;50596:4;50592:20;50588:1;50577:9;50573:17;50566:47;50630:131;50756:4;50630:131;:::i;:::-;50622:139;;50349:419;;;:::o;50774:223::-;50914:34;50910:1;50902:6;50898:14;50891:58;50983:6;50978:2;50970:6;50966:15;50959:31;50774:223;:::o;51003:366::-;51145:3;51166:67;51230:2;51225:3;51166:67;:::i;:::-;51159:74;;51242:93;51331:3;51242:93;:::i;:::-;51360:2;51355:3;51351:12;51344:19;;51003:366;;;:::o;51375:419::-;51541:4;51579:2;51568:9;51564:18;51556:26;;51628:9;51622:4;51618:20;51614:1;51603:9;51599:17;51592:47;51656:131;51782:4;51656:131;:::i;:::-;51648:139;;51375:419;;;:::o;51800:227::-;51940:34;51936:1;51928:6;51924:14;51917:58;52009:10;52004:2;51996:6;51992:15;51985:35;51800:227;:::o;52033:366::-;52175:3;52196:67;52260:2;52255:3;52196:67;:::i;:::-;52189:74;;52272:93;52361:3;52272:93;:::i;:::-;52390:2;52385:3;52381:12;52374:19;;52033:366;;;:::o;52405:419::-;52571:4;52609:2;52598:9;52594:18;52586:26;;52658:9;52652:4;52648:20;52644:1;52633:9;52629:17;52622:47;52686:131;52812:4;52686:131;:::i;:::-;52678:139;;52405:419;;;:::o;52830:175::-;52970:27;52966:1;52958:6;52954:14;52947:51;52830:175;:::o;53011:366::-;53153:3;53174:67;53238:2;53233:3;53174:67;:::i;:::-;53167:74;;53250:93;53339:3;53250:93;:::i;:::-;53368:2;53363:3;53359:12;53352:19;;53011:366;;;:::o;53383:419::-;53549:4;53587:2;53576:9;53572:18;53564:26;;53636:9;53630:4;53626:20;53622:1;53611:9;53607:17;53600:47;53664:131;53790:4;53664:131;:::i;:::-;53656:139;;53383:419;;;:::o;53808:237::-;53948:34;53944:1;53936:6;53932:14;53925:58;54017:20;54012:2;54004:6;54000:15;53993:45;53808:237;:::o;54051:366::-;54193:3;54214:67;54278:2;54273:3;54214:67;:::i;:::-;54207:74;;54290:93;54379:3;54290:93;:::i;:::-;54408:2;54403:3;54399:12;54392:19;;54051:366;;;:::o;54423:419::-;54589:4;54627:2;54616:9;54612:18;54604:26;;54676:9;54670:4;54666:20;54662:1;54651:9;54647:17;54640:47;54704:131;54830:4;54704:131;:::i;:::-;54696:139;;54423:419;;;:::o;54848:77::-;54885:7;54914:5;54903:16;;54848:77;;;:::o;54931:118::-;55018:24;55036:5;55018:24;:::i;:::-;55013:3;55006:37;54931:118;;:::o;55055:886::-;55316:4;55354:3;55343:9;55339:19;55331:27;;55368:71;55436:1;55425:9;55421:17;55412:6;55368:71;:::i;:::-;55449:72;55517:2;55506:9;55502:18;55493:6;55449:72;:::i;:::-;55531;55599:2;55588:9;55584:18;55575:6;55531:72;:::i;:::-;55613;55681:2;55670:9;55666:18;55657:6;55613:72;:::i;:::-;55695:73;55763:3;55752:9;55748:19;55739:6;55695:73;:::i;:::-;55778;55846:3;55835:9;55831:19;55822:6;55778:73;:::i;:::-;55861;55929:3;55918:9;55914:19;55905:6;55861:73;:::i;:::-;55055:886;;;;;;;;;;:::o;55947:176::-;55979:1;55996:20;56014:1;55996:20;:::i;:::-;55991:25;;56030:20;56048:1;56030:20;:::i;:::-;56025:25;;56069:1;56059:35;;56074:18;;:::i;:::-;56059:35;56115:1;56112;56108:9;56103:14;;55947:176;;;;:::o;56129:98::-;56180:6;56214:5;56208:12;56198:22;;56129:98;;;:::o;56233:168::-;56316:11;56350:6;56345:3;56338:19;56390:4;56385:3;56381:14;56366:29;;56233:168;;;;:::o;56407:373::-;56493:3;56521:38;56553:5;56521:38;:::i;:::-;56575:70;56638:6;56633:3;56575:70;:::i;:::-;56568:77;;56654:65;56712:6;56707:3;56700:4;56693:5;56689:16;56654:65;:::i;:::-;56744:29;56766:6;56744:29;:::i;:::-;56739:3;56735:39;56728:46;;56497:283;56407:373;;;;:::o;56786:640::-;56981:4;57019:3;57008:9;57004:19;56996:27;;57033:71;57101:1;57090:9;57086:17;57077:6;57033:71;:::i;:::-;57114:72;57182:2;57171:9;57167:18;57158:6;57114:72;:::i;:::-;57196;57264:2;57253:9;57249:18;57240:6;57196:72;:::i;:::-;57315:9;57309:4;57305:20;57300:2;57289:9;57285:18;57278:48;57343:76;57414:4;57405:6;57343:76;:::i;:::-;57335:84;;56786:640;;;;;;;:::o;57432:141::-;57488:5;57519:6;57513:13;57504:22;;57535:32;57561:5;57535:32;:::i;:::-;57432:141;;;;:::o;57579:349::-;57648:6;57697:2;57685:9;57676:7;57672:23;57668:32;57665:119;;;57703:79;;:::i;:::-;57665:119;57823:1;57848:63;57903:7;57894:6;57883:9;57879:22;57848:63;:::i;:::-;57838:73;;57794:127;57579:349;;;;:::o

Swarm Source

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