ETH Price: $1,974.25 (+0.29%)
 

Overview

Max Total Supply

0 NEMO

Holders

591

Transfers

-
2 ( -77.78%)

Market

Volume (24H)

0.7019 ETH

Min Price (24H)

$58.24 @ 0.029499 ETH

Max Price (24H)

$78.97 @ 0.040000 ETH

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

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2025-05-16
*/

/**
 *Cryptofish Version 3
 *Vitalik, remove contract size limit pls
*/

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


// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)


pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[ERC].
 *
 * 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[ERC 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/IERC2981.sol


// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.20;


/**
 * @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.
 */
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.
     *
     * NOTE: ERC-2981 allows setting the royalty to 100% of the price. In that case all the price would be sent to the
     * royalty receiver and 0 tokens to the seller. Contracts dealing with royalty should consider empty transfers.
     */
    function royaltyInfo(
        uint256 tokenId,
        uint256 salePrice
    ) external view returns (address receiver, uint256 royaltyAmount);
}

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


// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)

pragma solidity ^0.8.20;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC-165 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);
 * }
 * ```
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v5.3.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.20;



/**
 * @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 ERC. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

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

    /**
     * @dev The default royalty set is invalid (eg. (numerator / denominator) >= 1).
     */
    error ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator);

    /**
     * @dev The default royalty receiver is invalid.
     */
    error ERC2981InvalidDefaultRoyaltyReceiver(address receiver);

    /**
     * @dev The royalty set for a specific `tokenId` is invalid (eg. (numerator / denominator) >= 1).
     */
    error ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator);

    /**
     * @dev The royalty receiver for `tokenId` is invalid.
     */
    error ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver);

    /**
     * @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 returns (address receiver, uint256 amount) {
        RoyaltyInfo storage _royaltyInfo = _tokenRoyaltyInfo[tokenId];
        address royaltyReceiver = _royaltyInfo.receiver;
        uint96 royaltyFraction = _royaltyInfo.royaltyFraction;

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

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

        return (royaltyReceiver, 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 {
        uint256 denominator = _feeDenominator();
        if (feeNumerator > denominator) {
            // Royalty fee will exceed the sale price
            revert ERC2981InvalidDefaultRoyalty(feeNumerator, denominator);
        }
        if (receiver == address(0)) {
            revert ERC2981InvalidDefaultRoyaltyReceiver(address(0));
        }

        _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 {
        uint256 denominator = _feeDenominator();
        if (feeNumerator > denominator) {
            // Royalty fee will exceed the sale price
            revert ERC2981InvalidTokenRoyalty(tokenId, feeNumerator, denominator);
        }
        if (receiver == address(0)) {
            revert ERC2981InvalidTokenRoyaltyReceiver(tokenId, address(0));
        }

        _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: cryptofish.sol

/**
 *Submitted for verification at Etherscan.io on 2025-04-09
*/

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



// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.26;

/**
 * @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: cryptoFish_user.sol

/**
 *Submitted for verification at Etherscan.io on 2022-11-28
*/

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.

// pragma solidity ^0.8.26;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
 * unusable.
 * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
 * array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

// File: artifacts/IOperatorFilterRegistry.sol


//pragma solidity ^0.8.13;


interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}
// File: artifacts/OperatorFilterer.sol


//pragma solidity ^0.8.13;


contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

    modifier onlyAllowedOperator() virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}
// File: artifacts/DefaultOperatorFilterer.sol


//pragma solidity ^0.8.13;


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

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
// File: CryptoFish.sol



// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

//pragma solidity ^0.8.17;

/**
 * @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) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 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 10, 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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.8.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 `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);
    }
}

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


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

//pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://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.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

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


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

//pragma solidity ^0.8.0;

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


//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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

//pragma solidity ^0.8.0;


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

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

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

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


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

//pragma solidity ^0.8.0;

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

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

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


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

//pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        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) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token owner or 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: caller is not token owner or approved");
        _safeTransfer(from, to, tokenId, data);
    }

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

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

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

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

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

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

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

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

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

        _afterTokenTransfer(owner, address(0), tokenId, 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(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

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

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol


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

//pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

abstract contract Functional {
    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
    
}
// File: CryptoFish.sol


// ******************************************************************************************************************************
// **************************************************  Start of Main Contract ***************************************************
// ******************************************************************************************************************************

//pragma solidity ^0.8.17;

contract CryptoFish is ERC721, Ownable, Functional, DefaultOperatorFilterer, ReentrancyGuard, ERC2981 {

    // URI Root Location for Json Files
    string private baseURI;

    // Specific Functionality
    bool public publicMintActive;
    bool private _hideTokens;  //for URI redirects
    uint256 public pricePublic;
    uint256 public maxSupply;
    uint256 public tokenMinted;
    uint256 public maxMintPerTx;
    uint256 public maxPerWallet;
    uint256 public reservedTokens;
    bool private isPaused = false;
    bool private isInitialized = false;
    mapping(address => uint256) public tokenMintedby;
    event TokenMinted(address indexed user, uint256 tokenId);
    event RoyaltyUpdated(address indexed receiver, uint256 royaltyFraction);
    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor() ERC721("CryptoFish","NEMO"){
        
    }

    function initialize()external onlyOwner{
        require(isInitialized == false,"Already initialized.");
        baseURI = "https://cryptofish.us/metadata/";
        _hideTokens = true;
        
        maxSupply = 10000; // 0-9999
        pricePublic = 30 * (10 ** 15); // Replace leading value with price 
        maxMintPerTx = 100;       
        maxPerWallet = 100;
        reservedTokens = 100; // reserved for giveaways and such
        tokenMinted = 0;

        _setDefaultRoyalty(msg.sender, 400); // 4% royalty to given address
        isInitialized = true; 
    }

    // Override supportsInterface to include ERC2981
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721, ERC2981)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    // Standard Withdraw function for the owner to pull the contract
    function withdraw() external onlyOwner nonReentrant{
        uint256 sendAmount = address(this).balance;
        require(sendAmount > 0, "No funds available");

        address PT1 = payable(0xa4D4FeA9799cd5015955f248994D445C6bEB9436);
        address TRNT = payable(0xb3a05B0feCC927e32ab448415C7D0EFC694fD5E4);
        address CFB = payable(0x4FA0f099b015aefD70d9A12ba96a311Abf0Cbde6);

        uint256 pt1Amount = (sendAmount * 15) / 100;  // 15%
        uint256 trntAmount = (sendAmount * 15) / 100;  // 15%
        uint256 cfbAmount = sendAmount - pt1Amount - trntAmount; // Remainder to CFB

        (bool success1,) = PT1.call{value: pt1Amount}("");
        (bool success2,) = TRNT.call{value: trntAmount}("");
        (bool success3,) = CFB.call{value: cfbAmount}("");
        require(success1 && success2 && success3, "Transaction Unsuccessful");
                            
     }

    function ownerMint(address _to, uint256 qty) external onlyOwner {
    require(isInitialized, "Token not initialized");
    require(_to != address(0), "Cannot mint to zero address");
    require(qty > 0, "Quantity must be greater than 0");
    require(reservedTokens >= qty, "Insufficient reserved tokens");
    require(tokenMinted + qty  <= maxSupply, "Exceeds max supply including reserved tokens");

    uint256 mintSeedValue = tokenMinted;
    reservedTokens -= qty;
    tokenMinted += qty;

    unchecked {
        for (uint256 i = 0; i < qty; i++) {
            _safeMint(_to, mintSeedValue + i);
            emit TokenMinted(_to, mintSeedValue + i);
        }
    }
}

    function bulkOwnerMint(address [] memory _to, uint256 [] memory _token) external onlyOwner {
        require(isInitialized,"Token not initializ.");
        require(isPaused == false,"This function has been disabled permanently.");
        require(_to.length == _token.length, "BulkOwnerMint: Length mismatch error");
        require(tokenMinted + _token.length <= maxSupply, "Bulk mint exceeds max supply");
        require(_to.length == 522,"Required value is 522 tokens");
        for (uint256 i = 0; i < _to.length; i++){ // check that the array length is not zero to avoid an overflow while adding
            require(!_exists(_token[i]), "Token already minted");
            require(_token[i] < maxSupply, "Token ID exceeds max supply");
            _safeMint(_to[i], _token[i]);
            tokenMinted ++;  //reservedTokens can be reset, tokenMinted can not
            emit TokenMinted(_to[i], _token[i]);
        }
        isPaused = true;
    }

    function publicMint(uint256 qty) external payable nonReentrant {
        require(isInitialized,"Token not initializ.");
        require(publicMintActive, "Mint: Public Mint is not active.");
        require(msg.value >= qty*pricePublic, "Mint: Insufficient Funds.");
        require((qty + reservedTokens + tokenMinted) <= maxSupply, 
            "Mint: Not enough avaialability");      
        require(qty <= maxMintPerTx,"Mint: Max Mint tokens per transaction exceeded");
        require((tokenMintedby[msg.sender] + qty) <= maxPerWallet, 
            "Mint: Max tokens per wallet exceeded");
        require(qty> 0,"Quantity must be greater than 0");
        require(tokenMinted + qty <= maxSupply, "Mint exceeds max supply");
        uint256 mintSeedValue = tokenMinted;        
        for(uint256 i = 0; i < qty; i++) {
            _safeMint(msg.sender, mintSeedValue + i);
            emit TokenMinted(msg.sender, mintSeedValue + i);
            tokenMinted ++;
        }
        tokenMintedby[msg.sender] += qty;
    }  


    //////////////////////////////////////////////////////////////
    //////////////////// Setters and Getters /////////////////////
    //////////////////////////////////////////////////////////////
    
    function setRoyaltyInfo(address receiver, uint96 feeNumerator) external onlyOwner {
        require(receiver != address(0), "Invalid royalty receiver");
        require(feeNumerator <= 10000, "Royalty fee too high");
        _setDefaultRoyalty(receiver, feeNumerator);
        emit RoyaltyUpdated(receiver, feeNumerator);
    }


    function publicMintEnable() public onlyOwner{
        publicMintActive = true;
    }

    function publicMintDisable() public onlyOwner{
        publicMintActive = false;
    }

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

    function hideTokens() external onlyOwner {
        _hideTokens = true;
    }
    
    function revealTokens() external onlyOwner {
        _hideTokens = false;
    }

    function setMaxSupply(uint256 newTokenLimit) public onlyOwner{
        require( newTokenLimit > tokenMinted + reservedTokens, 
            "Increase the limit of total tokens.");
        maxSupply = newTokenLimit;
    }

    function setMaxMintPerWallet(uint newMaxMintValue) public onlyOwner {
        maxPerWallet = newMaxMintValue;
    }

    function setPricePublic(uint256 newPrice) public onlyOwner {
        pricePublic = newPrice;
    }

    function setReservedTokens(uint256 newReservedTokens) public onlyOwner {  
        require(newReservedTokens <= maxSupply , "Max supply overflow");
        require(newReservedTokens <= maxSupply - tokenMinted,"Reserved tokens exceed available supply");
        reservedTokens = newReservedTokens;
    }

    function setMaxMintPerTx(uint256 newMintTx) public onlyOwner {
        maxMintPerTx = newMintTx;
    }

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

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

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }
 
    
    //@dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
    function tokenURI(uint256 tokenId) public virtual override view returns (string memory){
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        
        string memory tokenuri;
        
        if (_hideTokens) {
            //redirect to mystery box
            tokenuri = string(abi.encodePacked(baseURI, "mystery2.json"));
        } else {
            //Input flag data here to send to reveal URI
            tokenuri = string(abi.encodePacked(baseURI, toString(tokenId), ".json")); /// 0.json 135.json
        }
        
        return tokenuri;
    }

    function contractURI() public view returns (string memory) {
            return string(abi.encodePacked(baseURI,"contract.json"));
    }

    // *******************************************************************************

    receive() external payable {}
    
    fallback() external payable {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidDefaultRoyalty","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidDefaultRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidTokenRoyalty","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidTokenRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"royaltyFraction","type":"uint256"}],"name":"RoyaltyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenMinted","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_token","type":"uint256[]"}],"name":"bulkOwnerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hideTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":"maxMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintDisable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicMintEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","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":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintTx","type":"uint256"}],"name":"setMaxMintPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxMintValue","type":"uint256"}],"name":"setMaxMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTokenLimit","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPricePublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newReservedTokens","type":"uint256"}],"name":"setReservedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setRoyaltyInfo","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":"tokenMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenMintedby","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040525f60125f6101000a81548160ff0219169083151502179055505f601260016101000a81548160ff021916908315150217905550348015610042575f80fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600a81526020017f43727970746f46697368000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4e454d4f00000000000000000000000000000000000000000000000000000000815250815f90816100d491906105e9565b5080600190816100e491906105e9565b5050506101036100f86102e560201b60201c565b6102ec60201b60201c565b5f6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156102d65780156101b1576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b815260040161017f9291906106f7565b5f604051808303815f87803b158015610196575f80fd5b505af11580156101a8573d5f803e3d5ffd5b505050506102d5565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461025f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b815260040161022d9291906106f7565b5f604051808303815f87803b158015610244575f80fd5b505af1158015610256573d5f803e3d5ffd5b505050506102d4565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016102a6919061071e565b5f604051808303815f87803b1580156102bd575f80fd5b505af11580156102cf573d5f803e3d5ffd5b505050505b5b5b50506001600781905550610737565b5f33905090565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061042a57607f821691505b60208210810361043d5761043c6103e6565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261049f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610464565b6104a98683610464565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6104ed6104e86104e3846104c1565b6104ca565b6104c1565b9050919050565b5f819050919050565b610506836104d3565b61051a610512826104f4565b848454610470565b825550505050565b5f90565b61052e610522565b6105398184846104fd565b505050565b5b8181101561055c576105515f82610526565b60018101905061053f565b5050565b601f8211156105a15761057281610443565b61057b84610455565b8101602085101561058a578190505b61059e61059685610455565b83018261053e565b50505b505050565b5f82821c905092915050565b5f6105c15f19846008026105a6565b1980831691505092915050565b5f6105d983836105b2565b9150826002028217905092915050565b6105f2826103af565b67ffffffffffffffff81111561060b5761060a6103b9565b5b6106158254610413565b610620828285610560565b5f60209050601f831160018114610651575f841561063f578287015190505b61064985826105ce565b8655506106b0565b601f19841661065f86610443565b5f5b8281101561068657848901518255600182019150602085019450602081019050610661565b868310156106a3578489015161069f601f8916826105b2565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6106e1826106b8565b9050919050565b6106f1816106d7565b82525050565b5f60408201905061070a5f8301856106e8565b61071760208301846106e8565b9392505050565b5f6020820190506107315f8301846106e8565b92915050565b615c16806107445f395ff3fe608060405260043610610254575f3560e01c80636352211e11610138578063a7707854116100b5578063c87b56dd11610079578063c87b56dd146107fc578063d5abeb0114610838578063de7fcb1d14610862578063e8a3d4851461088c578063e985e9c5146108b6578063f2fde38b146108f25761025b565b8063a770785414610730578063afdf61341461076c578063b5b3e21414610794578063b67c25a3146107aa578063b88d4fde146107d45761025b565b80638da5cb5b116100fc5780638da5cb5b1461067457806395d89b411461069e57806396356355146106c85780639f3e2f1d146106f2578063a22cb465146107085761025b565b80636352211e146105a85780636f8b44b0146105e457806370a082311461060c578063715018a6146106485780638129fc1c1461065e5761025b565b80632a89e240116101d157806342842e0e1161019557806342842e0e146104b65780634530a832146104de578063453c231014610506578063484b973c1461053057806355f804b314610558578063616cdb1e146105805761025b565b80632a89e240146104305780632db11544146104585780632e8f7931146104745780633ba5939d1461048a5780633ccfd60b146104a05761025b565b8063095ea7b311610218578063095ea7b31461034f578063102e766d1461037757806315a55347146103a157806323b872dd146103cb5780632a55205a146103f35761025b565b806301ffc9a71461025d578063027903ef1461029957806302fa7c47146102c157806306fdde03146102e9578063081812fc146103135761025b565b3661025b57005b005b348015610268575f80fd5b50610283600480360381019061027e919061377c565b61091a565b60405161029091906137c1565b60405180910390f35b3480156102a4575f80fd5b506102bf60048036038101906102ba919061380d565b61092b565b005b3480156102cc575f80fd5b506102e760048036038101906102e291906138d3565b6109d4565b005b3480156102f4575f80fd5b506102fd610af9565b60405161030a9190613981565b60405180910390f35b34801561031e575f80fd5b506103396004803603810190610334919061380d565b610b88565b60405161034691906139b0565b60405180910390f35b34801561035a575f80fd5b50610375600480360381019061037091906139c9565b610bca565b005b348015610382575f80fd5b5061038b610ce0565b6040516103989190613a16565b60405180910390f35b3480156103ac575f80fd5b506103b5610ce6565b6040516103c29190613a16565b60405180910390f35b3480156103d6575f80fd5b506103f160048036038101906103ec9190613a2f565b610cec565b005b3480156103fe575f80fd5b5061041960048036038101906104149190613a7f565b610df4565b604051610427929190613abd565b60405180910390f35b34801561043b575f80fd5b5061045660048036038101906104519190613ce4565b610f16565b005b610472600480360381019061046d919061380d565b61126c565b005b34801561047f575f80fd5b50610488611628565b005b348015610495575f80fd5b5061049e61164c565b005b3480156104ab575f80fd5b506104b4611670565b005b3480156104c1575f80fd5b506104dc60048036038101906104d79190613a2f565b6118fe565b005b3480156104e9575f80fd5b5061050460048036038101906104ff919061380d565b611a06565b005b348015610511575f80fd5b5061051a611a18565b6040516105279190613a16565b60405180910390f35b34801561053b575f80fd5b50610556600480360381019061055191906139c9565b611a1e565b005b348015610563575f80fd5b5061057e60048036038101906105799190613e0a565b611c6b565b005b34801561058b575f80fd5b506105a660048036038101906105a1919061380d565b611c86565b005b3480156105b3575f80fd5b506105ce60048036038101906105c9919061380d565b611c98565b6040516105db91906139b0565b60405180910390f35b3480156105ef575f80fd5b5061060a6004803603810190610605919061380d565b611d1c565b005b348015610617575f80fd5b50610632600480360381019061062d9190613e51565b611d7f565b60405161063f9190613a16565b60405180910390f35b348015610653575f80fd5b5061065c611e33565b005b348015610669575f80fd5b50610672611e46565b005b34801561067f575f80fd5b50610688611f62565b60405161069591906139b0565b60405180910390f35b3480156106a9575f80fd5b506106b2611f8a565b6040516106bf9190613981565b60405180910390f35b3480156106d3575f80fd5b506106dc61201a565b6040516106e99190613a16565b60405180910390f35b3480156106fd575f80fd5b50610706612020565b005b348015610713575f80fd5b5061072e60048036038101906107299190613ea6565b612043565b005b34801561073b575f80fd5b5061075660048036038101906107519190613e51565b612059565b6040516107639190613a16565b60405180910390f35b348015610777575f80fd5b50610792600480360381019061078d919061380d565b61206e565b005b34801561079f575f80fd5b506107a8612080565b005b3480156107b5575f80fd5b506107be6120a5565b6040516107cb91906137c1565b60405180910390f35b3480156107df575f80fd5b506107fa60048036038101906107f59190613f82565b6120b7565b005b348015610807575f80fd5b50610822600480360381019061081d919061380d565b6121c1565b60405161082f9190613981565b60405180910390f35b348015610843575f80fd5b5061084c612281565b6040516108599190613a16565b60405180910390f35b34801561086d575f80fd5b50610876612287565b6040516108839190613a16565b60405180910390f35b348015610897575f80fd5b506108a061228d565b6040516108ad9190613981565b60405180910390f35b3480156108c1575f80fd5b506108dc60048036038101906108d79190614002565b6122b5565b6040516108e991906137c1565b60405180910390f35b3480156108fd575f80fd5b5061091860048036038101906109139190613e51565b612343565b005b5f610924826123c5565b9050919050565b61093361243e565b600d54811115610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f9061408a565b60405180910390fd5b600e54600d5461098891906140d5565b8111156109ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c190614178565b60405180910390fd5b8060118190555050565b6109dc61243e565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a41906141e0565b60405180910390fd5b612710816bffffffffffffffffffffffff161115610a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9490614248565b60405180910390fd5b610aa782826124bc565b8173ffffffffffffffffffffffffffffffffffffffff167faf1c0be9124aef2948fc934d6013ed3f705d2869bc4955cb4f655b0bc2952f6582604051610aed919061429f565b60405180910390a25050565b60605f8054610b07906142e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610b33906142e5565b8015610b7e5780601f10610b5557610100808354040283529160200191610b7e565b820191905f5260205f20905b815481529060010190602001808311610b6157829003601f168201915b5050505050905090565b5f610b9282612657565b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610bd482611c98565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3b90614385565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c636126a2565b73ffffffffffffffffffffffffffffffffffffffff161480610c925750610c9181610c8c6126a2565b6122b5565b5b610cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc890614413565b60405180910390fd5b610cdb83836126a9565b505050565b600c5481565b60115481565b5f6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610de4576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d62929190614431565b6020604051808303815f875af1158015610d7e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da2919061446c565b610de357336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610dda91906139b0565b60405180910390fd5b5b610def83838361275f565b505050565b5f805f60095f8681526020019081526020015f2090505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f825f0160149054906101000a90046bffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ec85760085f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060085f0160149054906101000a90046bffffffffffffffffffffffff1690505b5f610ed16127bf565b6bffffffffffffffffffffffff16826bffffffffffffffffffffffff1688610ef99190614497565b610f039190614505565b9050828195509550505050509250929050565b610f1e61243e565b601260019054906101000a900460ff16610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f649061457f565b60405180910390fd5b5f151560125f9054906101000a900460ff16151514610fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb89061460d565b60405180910390fd5b8051825114611005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffc9061469b565b60405180910390fd5b600d548151600e5461101791906146b9565b1115611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f90614736565b60405180910390fd5b61020a82511461109d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110949061479e565b60405180910390fd5b5f5b825181101561124d576110cb8282815181106110be576110bd6147bc565b5b60200260200101516127c8565b1561110b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110290614833565b60405180910390fd5b600d54828281518110611121576111206147bc565b5b602002602001015110611169576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111609061489b565b60405180910390fd5b6111a783828151811061117f5761117e6147bc565b5b602002602001015183838151811061119a576111996147bc565b5b6020026020010151612808565b600e5f8154809291906111b9906148b9565b91905055508281815181106111d1576111d06147bc565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fb9144c96c86541f6fa89c9f2f02495cccf4b08cd6643e26d34ee00aa586558a8838381518110611223576112226147bc565b5b60200260200101516040516112389190613a16565b60405180910390a2808060010191505061109f565b50600160125f6101000a81548160ff0219169083151502179055505050565b611274612825565b601260019054906101000a900460ff166112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba9061457f565b60405180910390fd5b600b5f9054906101000a900460ff16611311576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113089061494a565b60405180910390fd5b600c548161131f9190614497565b341015611361576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611358906149b2565b60405180910390fd5b600d54600e546011548361137591906146b9565b61137f91906146b9565b11156113c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b790614a1a565b60405180910390fd5b600f54811115611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc90614aa8565b60405180910390fd5b6010548160135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461145191906146b9565b1115611492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148990614b36565b60405180910390fd5b5f81116114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb90614b9e565b60405180910390fd5b600d5481600e546114e591906146b9565b1115611526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151d90614c06565b60405180910390fd5b5f600e5490505f5b828110156115c85761154b33828461154691906146b9565b612808565b3373ffffffffffffffffffffffffffffffffffffffff167fb9144c96c86541f6fa89c9f2f02495cccf4b08cd6643e26d34ee00aa586558a8828461158f91906146b9565b60405161159c9190613a16565b60405180910390a2600e5f8154809291906115b6906148b9565b9190505550808060010191505061152e565b508160135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461161591906146b9565b9250508190555050611625612874565b50565b61163061243e565b6001600b5f6101000a81548160ff021916908315150217905550565b61165461243e565b5f600b60016101000a81548160ff021916908315150217905550565b61167861243e565b611680612825565b5f4790505f81116116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd90614c6e565b60405180910390fd5b5f73a4d4fea9799cd5015955f248994d445c6beb943690505f73b3a05b0fecc927e32ab448415c7d0efc694fd5e490505f734fa0f099b015aefd70d9a12ba96a311abf0cbde690505f6064600f8661171e9190614497565b6117289190614505565b90505f6064600f8761173a9190614497565b6117449190614505565b90505f81838861175491906140d5565b61175e91906140d5565b90505f8673ffffffffffffffffffffffffffffffffffffffff168460405161178590614cb9565b5f6040518083038185875af1925050503d805f81146117bf576040519150601f19603f3d011682016040523d82523d5f602084013e6117c4565b606091505b505090505f8673ffffffffffffffffffffffffffffffffffffffff16846040516117ed90614cb9565b5f6040518083038185875af1925050503d805f8114611827576040519150601f19603f3d011682016040523d82523d5f602084013e61182c565b606091505b505090505f8673ffffffffffffffffffffffffffffffffffffffff168460405161185590614cb9565b5f6040518083038185875af1925050503d805f811461188f576040519150601f19603f3d011682016040523d82523d5f602084013e611894565b606091505b505090508280156118a25750815b80156118ab5750805b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e190614d17565b60405180910390fd5b505050505050505050506118fc612874565b565b5f6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156119f6576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611974929190614431565b6020604051808303815f875af1158015611990573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119b4919061446c565b6119f557336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016119ec91906139b0565b60405180910390fd5b5b611a0183838361287e565b505050565b611a0e61243e565b80600c8190555050565b60105481565b611a2661243e565b601260019054906101000a900460ff16611a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6c90614d7f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ada90614de7565b60405180910390fd5b5f8111611b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1c90614b9e565b60405180910390fd5b806011541015611b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6190614e4f565b60405180910390fd5b600d5481600e54611b7b91906146b9565b1115611bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb390614edd565b60405180910390fd5b5f600e5490508160115f828254611bd391906140d5565b9250508190555081600e5f828254611beb91906146b9565b925050819055505f5b82811015611c6557611c0884828401612808565b8373ffffffffffffffffffffffffffffffffffffffff167fb9144c96c86541f6fa89c9f2f02495cccf4b08cd6643e26d34ee00aa586558a8828401604051611c509190613a16565b60405180910390a28080600101915050611bf4565b50505050565b611c7361243e565b80600a9081611c82919061508f565b5050565b611c8e61243e565b80600f8190555050565b5f80611ca38361289d565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0a906151a8565b60405180910390fd5b80915050919050565b611d2461243e565b601154600e54611d3491906146b9565b8111611d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6c90615236565b60405180910390fd5b80600d8190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de5906152c4565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611e3b61243e565b611e445f6128d6565b565b611e4e61243e565b5f1515601260019054906101000a900460ff16151514611ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9a9061532c565b60405180910390fd5b6040518060400160405280601f81526020017f68747470733a2f2f63727970746f666973682e75732f6d657461646174612f00815250600a9081611ee7919061508f565b506001600b60016101000a81548160ff021916908315150217905550612710600d81905550666a94d74f430000600c819055506064600f81905550606460108190555060646011819055505f600e81905550611f45336101906124bc565b6001601260016101000a81548160ff021916908315150217905550565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611f99906142e5565b80601f0160208091040260200160405190810160405280929190818152602001828054611fc5906142e5565b80156120105780601f10611fe757610100808354040283529160200191612010565b820191905f5260205f20905b815481529060010190602001808311611ff357829003601f168201915b5050505050905090565b600e5481565b61202861243e565b5f600b5f6101000a81548160ff021916908315150217905550565b61205561204e6126a2565b8383612999565b5050565b6013602052805f5260405f205f915090505481565b61207661243e565b8060108190555050565b61208861243e565b6001600b60016101000a81548160ff021916908315150217905550565b600b5f9054906101000a900460ff1681565b5f6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156121af576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161212d929190614431565b6020604051808303815f875af1158015612149573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061216d919061446c565b6121ae57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016121a591906139b0565b60405180910390fd5b5b6121bb84848484612b00565b50505050565b60606121cc826127c8565b61220b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612202906153ba565b60405180910390fd5b6060600b60019054906101000a900460ff161561224a57600a60405160200161223491906154ac565b6040516020818303038152906040529050612278565b600a61225584612b62565b604051602001612266929190615547565b60405160208183030381529060405290505b80915050919050565b600d5481565b600f5481565b6060600a6040516020016122a191906155bf565b604051602081830303815290604052905090565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b61234b61243e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b090615650565b60405180910390fd5b6123c2816128d6565b50565b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612437575061243682612cbb565b5b9050919050565b6124466126a2565b73ffffffffffffffffffffffffffffffffffffffff16612464611f62565b73ffffffffffffffffffffffffffffffffffffffff16146124ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b1906156b8565b60405180910390fd5b565b5f6124c56127bf565b6bffffffffffffffffffffffff16905080826bffffffffffffffffffffffff16111561252a5781816040517f6f483d090000000000000000000000000000000000000000000000000000000081526004016125219291906156d6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361259a575f6040517fb6d9900a00000000000000000000000000000000000000000000000000000000815260040161259191906139b0565b60405180910390fd5b60405180604001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff1681525060085f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b612660816127c8565b61269f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612696906151a8565b60405180910390fd5b50565b5f33905090565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661271983611c98565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61277061276a6126a2565b82612d9c565b6127af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a69061576d565b60405180910390fd5b6127ba838383612e30565b505050565b5f612710905090565b5f8073ffffffffffffffffffffffffffffffffffffffff166127e98361289d565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612821828260405180602001604052805f81525061311c565b5050565b60026007540361286a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612861906157d5565b60405180910390fd5b6002600781905550565b6001600781905550565b61289883838360405180602001604052805f8152506120b7565b505050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe9061583d565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612af391906137c1565b60405180910390a3505050565b612b11612b0b6126a2565b83612d9c565b612b50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b479061576d565b60405180910390fd5b612b5c84848484613176565b50505050565b60605f8203612ba8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cb6565b5f8290505f5b5f8214612bd7578080612bc0906148b9565b915050600a82612bd09190614505565b9150612bae565b5f8167ffffffffffffffff811115612bf257612bf1613ae8565b5b6040519080825280601f01601f191660200182016040528015612c245781602001600182028036833780820191505090505b5090505b5f8514612caf57600182612c3c91906140d5565b9150600a85612c4b919061585b565b6030612c5791906146b9565b60f81b818381518110612c6d57612c6c6147bc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612ca89190614505565b9450612c28565b8093505050505b919050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d8557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d955750612d94826131d2565b5b9050919050565b5f80612da783611c98565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612de95750612de881856122b5565b5b80612e2757508373ffffffffffffffffffffffffffffffffffffffff16612e0f84610b88565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612e5082611c98565b73ffffffffffffffffffffffffffffffffffffffff1614612ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9d906158fb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0b90615989565b60405180910390fd5b612f21838383600161323b565b8273ffffffffffffffffffffffffffffffffffffffff16612f4182611c98565b73ffffffffffffffffffffffffffffffffffffffff1614612f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8e906158fb565b60405180910390fd5b60045f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540392505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131178383836001613359565b505050565b613126838361335f565b6131325f848484613572565b613171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316890615a17565b60405180910390fd5b505050565b613181848484612e30565b61318d84848484613572565b6131cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c390615a17565b60405180910390fd5b50505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6001811115613353575f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146132cb578060035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546132c391906140d5565b925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613352578060035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461334a91906146b9565b925050819055505b5b50505050565b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036133cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c490615a7f565b60405180910390fd5b6133d6816127c8565b15613416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340d90615ae7565b60405180910390fd5b6134235f8383600161323b565b61342c816127c8565b1561346c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346390615ae7565b60405180910390fd5b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461356e5f83836001613359565b5050565b5f6135928473ffffffffffffffffffffffffffffffffffffffff166136f4565b156136e7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135bb6126a2565b8786866040518563ffffffff1660e01b81526004016135dd9493929190615b57565b6020604051808303815f875af192505050801561361857506040513d601f19601f820116820180604052508101906136159190615bb5565b60015b613697573d805f8114613646576040519150601f19603f3d011682016040523d82523d5f602084013e61364b565b606091505b505f81510361368f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161368690615a17565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136ec565b600190505b949350505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61375b81613727565b8114613765575f80fd5b50565b5f8135905061377681613752565b92915050565b5f602082840312156137915761379061371f565b5b5f61379e84828501613768565b91505092915050565b5f8115159050919050565b6137bb816137a7565b82525050565b5f6020820190506137d45f8301846137b2565b92915050565b5f819050919050565b6137ec816137da565b81146137f6575f80fd5b50565b5f81359050613807816137e3565b92915050565b5f602082840312156138225761382161371f565b5b5f61382f848285016137f9565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61386182613838565b9050919050565b61387181613857565b811461387b575f80fd5b50565b5f8135905061388c81613868565b92915050565b5f6bffffffffffffffffffffffff82169050919050565b6138b281613892565b81146138bc575f80fd5b50565b5f813590506138cd816138a9565b92915050565b5f80604083850312156138e9576138e861371f565b5b5f6138f68582860161387e565b9250506020613907858286016138bf565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61395382613911565b61395d818561391b565b935061396d81856020860161392b565b61397681613939565b840191505092915050565b5f6020820190508181035f8301526139998184613949565b905092915050565b6139aa81613857565b82525050565b5f6020820190506139c35f8301846139a1565b92915050565b5f80604083850312156139df576139de61371f565b5b5f6139ec8582860161387e565b92505060206139fd858286016137f9565b9150509250929050565b613a10816137da565b82525050565b5f602082019050613a295f830184613a07565b92915050565b5f805f60608486031215613a4657613a4561371f565b5b5f613a538682870161387e565b9350506020613a648682870161387e565b9250506040613a75868287016137f9565b9150509250925092565b5f8060408385031215613a9557613a9461371f565b5b5f613aa2858286016137f9565b9250506020613ab3858286016137f9565b9150509250929050565b5f604082019050613ad05f8301856139a1565b613add6020830184613a07565b9392505050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613b1e82613939565b810181811067ffffffffffffffff82111715613b3d57613b3c613ae8565b5b80604052505050565b5f613b4f613716565b9050613b5b8282613b15565b919050565b5f67ffffffffffffffff821115613b7a57613b79613ae8565b5b602082029050602081019050919050565b5f80fd5b5f613ba1613b9c84613b60565b613b46565b90508083825260208201905060208402830185811115613bc457613bc3613b8b565b5b835b81811015613bed5780613bd9888261387e565b845260208401935050602081019050613bc6565b5050509392505050565b5f82601f830112613c0b57613c0a613ae4565b5b8135613c1b848260208601613b8f565b91505092915050565b5f67ffffffffffffffff821115613c3e57613c3d613ae8565b5b602082029050602081019050919050565b5f613c61613c5c84613c24565b613b46565b90508083825260208201905060208402830185811115613c8457613c83613b8b565b5b835b81811015613cad5780613c9988826137f9565b845260208401935050602081019050613c86565b5050509392505050565b5f82601f830112613ccb57613cca613ae4565b5b8135613cdb848260208601613c4f565b91505092915050565b5f8060408385031215613cfa57613cf961371f565b5b5f83013567ffffffffffffffff811115613d1757613d16613723565b5b613d2385828601613bf7565b925050602083013567ffffffffffffffff811115613d4457613d43613723565b5b613d5085828601613cb7565b9150509250929050565b5f80fd5b5f67ffffffffffffffff821115613d7857613d77613ae8565b5b613d8182613939565b9050602081019050919050565b828183375f83830152505050565b5f613dae613da984613d5e565b613b46565b905082815260208101848484011115613dca57613dc9613d5a565b5b613dd5848285613d8e565b509392505050565b5f82601f830112613df157613df0613ae4565b5b8135613e01848260208601613d9c565b91505092915050565b5f60208284031215613e1f57613e1e61371f565b5b5f82013567ffffffffffffffff811115613e3c57613e3b613723565b5b613e4884828501613ddd565b91505092915050565b5f60208284031215613e6657613e6561371f565b5b5f613e738482850161387e565b91505092915050565b613e85816137a7565b8114613e8f575f80fd5b50565b5f81359050613ea081613e7c565b92915050565b5f8060408385031215613ebc57613ebb61371f565b5b5f613ec98582860161387e565b9250506020613eda85828601613e92565b9150509250929050565b5f67ffffffffffffffff821115613efe57613efd613ae8565b5b613f0782613939565b9050602081019050919050565b5f613f26613f2184613ee4565b613b46565b905082815260208101848484011115613f4257613f41613d5a565b5b613f4d848285613d8e565b509392505050565b5f82601f830112613f6957613f68613ae4565b5b8135613f79848260208601613f14565b91505092915050565b5f805f8060808587031215613f9a57613f9961371f565b5b5f613fa78782880161387e565b9450506020613fb88782880161387e565b9350506040613fc9878288016137f9565b925050606085013567ffffffffffffffff811115613fea57613fe9613723565b5b613ff687828801613f55565b91505092959194509250565b5f80604083850312156140185761401761371f565b5b5f6140258582860161387e565b92505060206140368582860161387e565b9150509250929050565b7f4d617820737570706c79206f766572666c6f77000000000000000000000000005f82015250565b5f61407460138361391b565b915061407f82614040565b602082019050919050565b5f6020820190508181035f8301526140a181614068565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6140df826137da565b91506140ea836137da565b9250828203905081811115614102576141016140a8565b5b92915050565b7f526573657276656420746f6b656e732065786365656420617661696c61626c655f8201527f20737570706c7900000000000000000000000000000000000000000000000000602082015250565b5f61416260278361391b565b915061416d82614108565b604082019050919050565b5f6020820190508181035f83015261418f81614156565b9050919050565b7f496e76616c696420726f79616c747920726563656976657200000000000000005f82015250565b5f6141ca60188361391b565b91506141d582614196565b602082019050919050565b5f6020820190508181035f8301526141f7816141be565b9050919050565b7f526f79616c74792066656520746f6f20686967680000000000000000000000005f82015250565b5f61423260148361391b565b915061423d826141fe565b602082019050919050565b5f6020820190508181035f83015261425f81614226565b9050919050565b5f819050919050565b5f61428961428461427f84613892565b614266565b6137da565b9050919050565b6142998161426f565b82525050565b5f6020820190506142b25f830184614290565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806142fc57607f821691505b60208210810361430f5761430e6142b8565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f61436f60218361391b565b915061437a82614315565b604082019050919050565b5f6020820190508181035f83015261439c81614363565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f5f8201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b5f6143fd603d8361391b565b9150614408826143a3565b604082019050919050565b5f6020820190508181035f83015261442a816143f1565b9050919050565b5f6040820190506144445f8301856139a1565b61445160208301846139a1565b9392505050565b5f8151905061446681613e7c565b92915050565b5f602082840312156144815761448061371f565b5b5f61448e84828501614458565b91505092915050565b5f6144a1826137da565b91506144ac836137da565b92508282026144ba816137da565b915082820484148315176144d1576144d06140a8565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61450f826137da565b915061451a836137da565b92508261452a576145296144d8565b5b828204905092915050565b7f546f6b656e206e6f7420696e697469616c697a2e0000000000000000000000005f82015250565b5f61456960148361391b565b915061457482614535565b602082019050919050565b5f6020820190508181035f8301526145968161455d565b9050919050565b7f546869732066756e6374696f6e20686173206265656e2064697361626c6564205f8201527f7065726d616e656e746c792e0000000000000000000000000000000000000000602082015250565b5f6145f7602c8361391b565b91506146028261459d565b604082019050919050565b5f6020820190508181035f830152614624816145eb565b9050919050565b7f42756c6b4f776e65724d696e743a204c656e677468206d69736d6174636820655f8201527f72726f7200000000000000000000000000000000000000000000000000000000602082015250565b5f61468560248361391b565b91506146908261462b565b604082019050919050565b5f6020820190508181035f8301526146b281614679565b9050919050565b5f6146c3826137da565b91506146ce836137da565b92508282019050808211156146e6576146e56140a8565b5b92915050565b7f42756c6b206d696e742065786365656473206d617820737570706c79000000005f82015250565b5f614720601c8361391b565b915061472b826146ec565b602082019050919050565b5f6020820190508181035f83015261474d81614714565b9050919050565b7f52657175697265642076616c75652069732035323220746f6b656e73000000005f82015250565b5f614788601c8361391b565b915061479382614754565b602082019050919050565b5f6020820190508181035f8301526147b58161477c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f546f6b656e20616c7265616479206d696e7465640000000000000000000000005f82015250565b5f61481d60148361391b565b9150614828826147e9565b602082019050919050565b5f6020820190508181035f83015261484a81614811565b9050919050565b7f546f6b656e2049442065786365656473206d617820737570706c7900000000005f82015250565b5f614885601b8361391b565b915061489082614851565b602082019050919050565b5f6020820190508181035f8301526148b281614879565b9050919050565b5f6148c3826137da565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148f5576148f46140a8565b5b600182019050919050565b7f4d696e743a205075626c6963204d696e74206973206e6f74206163746976652e5f82015250565b5f61493460208361391b565b915061493f82614900565b602082019050919050565b5f6020820190508181035f83015261496181614928565b9050919050565b7f4d696e743a20496e73756666696369656e742046756e64732e000000000000005f82015250565b5f61499c60198361391b565b91506149a782614968565b602082019050919050565b5f6020820190508181035f8301526149c981614990565b9050919050565b7f4d696e743a204e6f7420656e6f7567682061766169616c6162696c69747900005f82015250565b5f614a04601e8361391b565b9150614a0f826149d0565b602082019050919050565b5f6020820190508181035f830152614a31816149f8565b9050919050565b7f4d696e743a204d6178204d696e7420746f6b656e7320706572207472616e73615f8201527f6374696f6e206578636565646564000000000000000000000000000000000000602082015250565b5f614a92602e8361391b565b9150614a9d82614a38565b604082019050919050565b5f6020820190508181035f830152614abf81614a86565b9050919050565b7f4d696e743a204d617820746f6b656e73207065722077616c6c657420657863655f8201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b5f614b2060248361391b565b9150614b2b82614ac6565b604082019050919050565b5f6020820190508181035f830152614b4d81614b14565b9050919050565b7f5175616e74697479206d7573742062652067726561746572207468616e2030005f82015250565b5f614b88601f8361391b565b9150614b9382614b54565b602082019050919050565b5f6020820190508181035f830152614bb581614b7c565b9050919050565b7f4d696e742065786365656473206d617820737570706c790000000000000000005f82015250565b5f614bf060178361391b565b9150614bfb82614bbc565b602082019050919050565b5f6020820190508181035f830152614c1d81614be4565b9050919050565b7f4e6f2066756e647320617661696c61626c6500000000000000000000000000005f82015250565b5f614c5860128361391b565b9150614c6382614c24565b602082019050919050565b5f6020820190508181035f830152614c8581614c4c565b9050919050565b5f81905092915050565b50565b5f614ca45f83614c8c565b9150614caf82614c96565b5f82019050919050565b5f614cc382614c99565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c00000000000000005f82015250565b5f614d0160188361391b565b9150614d0c82614ccd565b602082019050919050565b5f6020820190508181035f830152614d2e81614cf5565b9050919050565b7f546f6b656e206e6f7420696e697469616c697a656400000000000000000000005f82015250565b5f614d6960158361391b565b9150614d7482614d35565b602082019050919050565b5f6020820190508181035f830152614d9681614d5d565b9050919050565b7f43616e6e6f74206d696e7420746f207a65726f206164647265737300000000005f82015250565b5f614dd1601b8361391b565b9150614ddc82614d9d565b602082019050919050565b5f6020820190508181035f830152614dfe81614dc5565b9050919050565b7f496e73756666696369656e7420726573657276656420746f6b656e73000000005f82015250565b5f614e39601c8361391b565b9150614e4482614e05565b602082019050919050565b5f6020820190508181035f830152614e6681614e2d565b9050919050565b7f45786365656473206d617820737570706c7920696e636c7564696e67207265735f8201527f657276656420746f6b656e730000000000000000000000000000000000000000602082015250565b5f614ec7602c8361391b565b9150614ed282614e6d565b604082019050919050565b5f6020820190508181035f830152614ef481614ebb565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614f1c565b614f618683614f1c565b95508019841693508086168417925050509392505050565b5f614f93614f8e614f89846137da565b614266565b6137da565b9050919050565b5f819050919050565b614fac83614f79565b614fc0614fb882614f9a565b848454614f28565b825550505050565b5f90565b614fd4614fc8565b614fdf818484614fa3565b505050565b5b8181101561500257614ff75f82614fcc565b600181019050614fe5565b5050565b601f8211156150475761501881614efb565b61502184614f0d565b81016020851015615030578190505b61504461503c85614f0d565b830182614fe4565b50505b505050565b5f82821c905092915050565b5f6150675f198460080261504c565b1980831691505092915050565b5f61507f8383615058565b9150826002028217905092915050565b61509882613911565b67ffffffffffffffff8111156150b1576150b0613ae8565b5b6150bb82546142e5565b6150c6828285615006565b5f60209050601f8311600181146150f7575f84156150e5578287015190505b6150ef8582615074565b865550615156565b601f19841661510586614efb565b5f5b8281101561512c57848901518255600182019150602085019450602081019050615107565b868310156151495784890151615145601f891682615058565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e20494400000000000000005f82015250565b5f61519260188361391b565b915061519d8261515e565b602082019050919050565b5f6020820190508181035f8301526151bf81615186565b9050919050565b7f496e63726561736520746865206c696d6974206f6620746f74616c20746f6b655f8201527f6e732e0000000000000000000000000000000000000000000000000000000000602082015250565b5f61522060238361391b565b915061522b826151c6565b604082019050919050565b5f6020820190508181035f83015261524d81615214565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f7420612076615f8201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b5f6152ae60298361391b565b91506152b982615254565b604082019050919050565b5f6020820190508181035f8301526152db816152a2565b9050919050565b7f416c726561647920696e697469616c697a65642e0000000000000000000000005f82015250565b5f61531660148361391b565b9150615321826152e2565b602082019050919050565b5f6020820190508181035f8301526153438161530a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f6153a4602f8361391b565b91506153af8261534a565b604082019050919050565b5f6020820190508181035f8301526153d181615398565b9050919050565b5f81905092915050565b5f81546153ee816142e5565b6153f881866153d8565b9450600182165f8114615412576001811461542757615459565b60ff1983168652811515820286019350615459565b61543085614efb565b5f5b8381101561545157815481890152600182019150602081019050615432565b838801955050505b50505092915050565b7f6d797374657279322e6a736f6e000000000000000000000000000000000000005f82015250565b5f615496600d836153d8565b91506154a182615462565b600d82019050919050565b5f6154b782846153e2565b91506154c28261548a565b915081905092915050565b5f6154d782613911565b6154e181856153d8565b93506154f181856020860161392b565b80840191505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f6155316005836153d8565b915061553c826154fd565b600582019050919050565b5f61555282856153e2565b915061555e82846154cd565b915061556982615525565b91508190509392505050565b7f636f6e74726163742e6a736f6e000000000000000000000000000000000000005f82015250565b5f6155a9600d836153d8565b91506155b482615575565b600d82019050919050565b5f6155ca82846153e2565b91506155d58261559d565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61563a60268361391b565b9150615645826155e0565b604082019050919050565b5f6020820190508181035f8301526156678161562e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6156a260208361391b565b91506156ad8261566e565b602082019050919050565b5f6020820190508181035f8301526156cf81615696565b9050919050565b5f6040820190506156e95f830185614290565b6156f66020830184613a07565b9392505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e655f8201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b5f615757602d8361391b565b9150615762826156fd565b604082019050919050565b5f6020820190508181035f8301526157848161574b565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6157bf601f8361391b565b91506157ca8261578b565b602082019050919050565b5f6020820190508181035f8301526157ec816157b3565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f61582760198361391b565b9150615832826157f3565b602082019050919050565b5f6020820190508181035f8301526158548161581b565b9050919050565b5f615865826137da565b9150615870836137da565b9250826158805761587f6144d8565b5b828206905092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f7272656374205f8201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b5f6158e560258361391b565b91506158f08261588b565b604082019050919050565b5f6020820190508181035f830152615912816158d9565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61597360248361391b565b915061597e82615919565b604082019050919050565b5f6020820190508181035f8301526159a081615967565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f615a0160328361391b565b9150615a0c826159a7565b604082019050919050565b5f6020820190508181035f830152615a2e816159f5565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f615a6960208361391b565b9150615a7482615a35565b602082019050919050565b5f6020820190508181035f830152615a9681615a5d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f615ad1601c8361391b565b9150615adc82615a9d565b602082019050919050565b5f6020820190508181035f830152615afe81615ac5565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f615b2982615b05565b615b338185615b0f565b9350615b4381856020860161392b565b615b4c81613939565b840191505092915050565b5f608082019050615b6a5f8301876139a1565b615b7760208301866139a1565b615b846040830185613a07565b8181036060830152615b968184615b1f565b905095945050505050565b5f81519050615baf81613752565b92915050565b5f60208284031215615bca57615bc961371f565b5b5f615bd784828501615ba1565b9150509291505056fea264697066735822122039181e4d19384d03a1dfe4614ac59988ea9db13d05350fb98a1d87082e86aba764736f6c634300081a0033

Deployed Bytecode

0x608060405260043610610254575f3560e01c80636352211e11610138578063a7707854116100b5578063c87b56dd11610079578063c87b56dd146107fc578063d5abeb0114610838578063de7fcb1d14610862578063e8a3d4851461088c578063e985e9c5146108b6578063f2fde38b146108f25761025b565b8063a770785414610730578063afdf61341461076c578063b5b3e21414610794578063b67c25a3146107aa578063b88d4fde146107d45761025b565b80638da5cb5b116100fc5780638da5cb5b1461067457806395d89b411461069e57806396356355146106c85780639f3e2f1d146106f2578063a22cb465146107085761025b565b80636352211e146105a85780636f8b44b0146105e457806370a082311461060c578063715018a6146106485780638129fc1c1461065e5761025b565b80632a89e240116101d157806342842e0e1161019557806342842e0e146104b65780634530a832146104de578063453c231014610506578063484b973c1461053057806355f804b314610558578063616cdb1e146105805761025b565b80632a89e240146104305780632db11544146104585780632e8f7931146104745780633ba5939d1461048a5780633ccfd60b146104a05761025b565b8063095ea7b311610218578063095ea7b31461034f578063102e766d1461037757806315a55347146103a157806323b872dd146103cb5780632a55205a146103f35761025b565b806301ffc9a71461025d578063027903ef1461029957806302fa7c47146102c157806306fdde03146102e9578063081812fc146103135761025b565b3661025b57005b005b348015610268575f80fd5b50610283600480360381019061027e919061377c565b61091a565b60405161029091906137c1565b60405180910390f35b3480156102a4575f80fd5b506102bf60048036038101906102ba919061380d565b61092b565b005b3480156102cc575f80fd5b506102e760048036038101906102e291906138d3565b6109d4565b005b3480156102f4575f80fd5b506102fd610af9565b60405161030a9190613981565b60405180910390f35b34801561031e575f80fd5b506103396004803603810190610334919061380d565b610b88565b60405161034691906139b0565b60405180910390f35b34801561035a575f80fd5b50610375600480360381019061037091906139c9565b610bca565b005b348015610382575f80fd5b5061038b610ce0565b6040516103989190613a16565b60405180910390f35b3480156103ac575f80fd5b506103b5610ce6565b6040516103c29190613a16565b60405180910390f35b3480156103d6575f80fd5b506103f160048036038101906103ec9190613a2f565b610cec565b005b3480156103fe575f80fd5b5061041960048036038101906104149190613a7f565b610df4565b604051610427929190613abd565b60405180910390f35b34801561043b575f80fd5b5061045660048036038101906104519190613ce4565b610f16565b005b610472600480360381019061046d919061380d565b61126c565b005b34801561047f575f80fd5b50610488611628565b005b348015610495575f80fd5b5061049e61164c565b005b3480156104ab575f80fd5b506104b4611670565b005b3480156104c1575f80fd5b506104dc60048036038101906104d79190613a2f565b6118fe565b005b3480156104e9575f80fd5b5061050460048036038101906104ff919061380d565b611a06565b005b348015610511575f80fd5b5061051a611a18565b6040516105279190613a16565b60405180910390f35b34801561053b575f80fd5b50610556600480360381019061055191906139c9565b611a1e565b005b348015610563575f80fd5b5061057e60048036038101906105799190613e0a565b611c6b565b005b34801561058b575f80fd5b506105a660048036038101906105a1919061380d565b611c86565b005b3480156105b3575f80fd5b506105ce60048036038101906105c9919061380d565b611c98565b6040516105db91906139b0565b60405180910390f35b3480156105ef575f80fd5b5061060a6004803603810190610605919061380d565b611d1c565b005b348015610617575f80fd5b50610632600480360381019061062d9190613e51565b611d7f565b60405161063f9190613a16565b60405180910390f35b348015610653575f80fd5b5061065c611e33565b005b348015610669575f80fd5b50610672611e46565b005b34801561067f575f80fd5b50610688611f62565b60405161069591906139b0565b60405180910390f35b3480156106a9575f80fd5b506106b2611f8a565b6040516106bf9190613981565b60405180910390f35b3480156106d3575f80fd5b506106dc61201a565b6040516106e99190613a16565b60405180910390f35b3480156106fd575f80fd5b50610706612020565b005b348015610713575f80fd5b5061072e60048036038101906107299190613ea6565b612043565b005b34801561073b575f80fd5b5061075660048036038101906107519190613e51565b612059565b6040516107639190613a16565b60405180910390f35b348015610777575f80fd5b50610792600480360381019061078d919061380d565b61206e565b005b34801561079f575f80fd5b506107a8612080565b005b3480156107b5575f80fd5b506107be6120a5565b6040516107cb91906137c1565b60405180910390f35b3480156107df575f80fd5b506107fa60048036038101906107f59190613f82565b6120b7565b005b348015610807575f80fd5b50610822600480360381019061081d919061380d565b6121c1565b60405161082f9190613981565b60405180910390f35b348015610843575f80fd5b5061084c612281565b6040516108599190613a16565b60405180910390f35b34801561086d575f80fd5b50610876612287565b6040516108839190613a16565b60405180910390f35b348015610897575f80fd5b506108a061228d565b6040516108ad9190613981565b60405180910390f35b3480156108c1575f80fd5b506108dc60048036038101906108d79190614002565b6122b5565b6040516108e991906137c1565b60405180910390f35b3480156108fd575f80fd5b5061091860048036038101906109139190613e51565b612343565b005b5f610924826123c5565b9050919050565b61093361243e565b600d54811115610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f9061408a565b60405180910390fd5b600e54600d5461098891906140d5565b8111156109ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c190614178565b60405180910390fd5b8060118190555050565b6109dc61243e565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a41906141e0565b60405180910390fd5b612710816bffffffffffffffffffffffff161115610a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9490614248565b60405180910390fd5b610aa782826124bc565b8173ffffffffffffffffffffffffffffffffffffffff167faf1c0be9124aef2948fc934d6013ed3f705d2869bc4955cb4f655b0bc2952f6582604051610aed919061429f565b60405180910390a25050565b60605f8054610b07906142e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610b33906142e5565b8015610b7e5780601f10610b5557610100808354040283529160200191610b7e565b820191905f5260205f20905b815481529060010190602001808311610b6157829003601f168201915b5050505050905090565b5f610b9282612657565b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610bd482611c98565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3b90614385565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c636126a2565b73ffffffffffffffffffffffffffffffffffffffff161480610c925750610c9181610c8c6126a2565b6122b5565b5b610cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc890614413565b60405180910390fd5b610cdb83836126a9565b505050565b600c5481565b60115481565b5f6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610de4576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d62929190614431565b6020604051808303815f875af1158015610d7e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da2919061446c565b610de357336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610dda91906139b0565b60405180910390fd5b5b610def83838361275f565b505050565b5f805f60095f8681526020019081526020015f2090505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f825f0160149054906101000a90046bffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ec85760085f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060085f0160149054906101000a90046bffffffffffffffffffffffff1690505b5f610ed16127bf565b6bffffffffffffffffffffffff16826bffffffffffffffffffffffff1688610ef99190614497565b610f039190614505565b9050828195509550505050509250929050565b610f1e61243e565b601260019054906101000a900460ff16610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f649061457f565b60405180910390fd5b5f151560125f9054906101000a900460ff16151514610fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb89061460d565b60405180910390fd5b8051825114611005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffc9061469b565b60405180910390fd5b600d548151600e5461101791906146b9565b1115611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f90614736565b60405180910390fd5b61020a82511461109d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110949061479e565b60405180910390fd5b5f5b825181101561124d576110cb8282815181106110be576110bd6147bc565b5b60200260200101516127c8565b1561110b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110290614833565b60405180910390fd5b600d54828281518110611121576111206147bc565b5b602002602001015110611169576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111609061489b565b60405180910390fd5b6111a783828151811061117f5761117e6147bc565b5b602002602001015183838151811061119a576111996147bc565b5b6020026020010151612808565b600e5f8154809291906111b9906148b9565b91905055508281815181106111d1576111d06147bc565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fb9144c96c86541f6fa89c9f2f02495cccf4b08cd6643e26d34ee00aa586558a8838381518110611223576112226147bc565b5b60200260200101516040516112389190613a16565b60405180910390a2808060010191505061109f565b50600160125f6101000a81548160ff0219169083151502179055505050565b611274612825565b601260019054906101000a900460ff166112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba9061457f565b60405180910390fd5b600b5f9054906101000a900460ff16611311576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113089061494a565b60405180910390fd5b600c548161131f9190614497565b341015611361576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611358906149b2565b60405180910390fd5b600d54600e546011548361137591906146b9565b61137f91906146b9565b11156113c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b790614a1a565b60405180910390fd5b600f54811115611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc90614aa8565b60405180910390fd5b6010548160135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461145191906146b9565b1115611492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148990614b36565b60405180910390fd5b5f81116114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb90614b9e565b60405180910390fd5b600d5481600e546114e591906146b9565b1115611526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151d90614c06565b60405180910390fd5b5f600e5490505f5b828110156115c85761154b33828461154691906146b9565b612808565b3373ffffffffffffffffffffffffffffffffffffffff167fb9144c96c86541f6fa89c9f2f02495cccf4b08cd6643e26d34ee00aa586558a8828461158f91906146b9565b60405161159c9190613a16565b60405180910390a2600e5f8154809291906115b6906148b9565b9190505550808060010191505061152e565b508160135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461161591906146b9565b9250508190555050611625612874565b50565b61163061243e565b6001600b5f6101000a81548160ff021916908315150217905550565b61165461243e565b5f600b60016101000a81548160ff021916908315150217905550565b61167861243e565b611680612825565b5f4790505f81116116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd90614c6e565b60405180910390fd5b5f73a4d4fea9799cd5015955f248994d445c6beb943690505f73b3a05b0fecc927e32ab448415c7d0efc694fd5e490505f734fa0f099b015aefd70d9a12ba96a311abf0cbde690505f6064600f8661171e9190614497565b6117289190614505565b90505f6064600f8761173a9190614497565b6117449190614505565b90505f81838861175491906140d5565b61175e91906140d5565b90505f8673ffffffffffffffffffffffffffffffffffffffff168460405161178590614cb9565b5f6040518083038185875af1925050503d805f81146117bf576040519150601f19603f3d011682016040523d82523d5f602084013e6117c4565b606091505b505090505f8673ffffffffffffffffffffffffffffffffffffffff16846040516117ed90614cb9565b5f6040518083038185875af1925050503d805f8114611827576040519150601f19603f3d011682016040523d82523d5f602084013e61182c565b606091505b505090505f8673ffffffffffffffffffffffffffffffffffffffff168460405161185590614cb9565b5f6040518083038185875af1925050503d805f811461188f576040519150601f19603f3d011682016040523d82523d5f602084013e611894565b606091505b505090508280156118a25750815b80156118ab5750805b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e190614d17565b60405180910390fd5b505050505050505050506118fc612874565b565b5f6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156119f6576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611974929190614431565b6020604051808303815f875af1158015611990573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119b4919061446c565b6119f557336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016119ec91906139b0565b60405180910390fd5b5b611a0183838361287e565b505050565b611a0e61243e565b80600c8190555050565b60105481565b611a2661243e565b601260019054906101000a900460ff16611a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6c90614d7f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ada90614de7565b60405180910390fd5b5f8111611b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1c90614b9e565b60405180910390fd5b806011541015611b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6190614e4f565b60405180910390fd5b600d5481600e54611b7b91906146b9565b1115611bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb390614edd565b60405180910390fd5b5f600e5490508160115f828254611bd391906140d5565b9250508190555081600e5f828254611beb91906146b9565b925050819055505f5b82811015611c6557611c0884828401612808565b8373ffffffffffffffffffffffffffffffffffffffff167fb9144c96c86541f6fa89c9f2f02495cccf4b08cd6643e26d34ee00aa586558a8828401604051611c509190613a16565b60405180910390a28080600101915050611bf4565b50505050565b611c7361243e565b80600a9081611c82919061508f565b5050565b611c8e61243e565b80600f8190555050565b5f80611ca38361289d565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0a906151a8565b60405180910390fd5b80915050919050565b611d2461243e565b601154600e54611d3491906146b9565b8111611d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6c90615236565b60405180910390fd5b80600d8190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de5906152c4565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611e3b61243e565b611e445f6128d6565b565b611e4e61243e565b5f1515601260019054906101000a900460ff16151514611ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9a9061532c565b60405180910390fd5b6040518060400160405280601f81526020017f68747470733a2f2f63727970746f666973682e75732f6d657461646174612f00815250600a9081611ee7919061508f565b506001600b60016101000a81548160ff021916908315150217905550612710600d81905550666a94d74f430000600c819055506064600f81905550606460108190555060646011819055505f600e81905550611f45336101906124bc565b6001601260016101000a81548160ff021916908315150217905550565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611f99906142e5565b80601f0160208091040260200160405190810160405280929190818152602001828054611fc5906142e5565b80156120105780601f10611fe757610100808354040283529160200191612010565b820191905f5260205f20905b815481529060010190602001808311611ff357829003601f168201915b5050505050905090565b600e5481565b61202861243e565b5f600b5f6101000a81548160ff021916908315150217905550565b61205561204e6126a2565b8383612999565b5050565b6013602052805f5260405f205f915090505481565b61207661243e565b8060108190555050565b61208861243e565b6001600b60016101000a81548160ff021916908315150217905550565b600b5f9054906101000a900460ff1681565b5f6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156121af576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161212d929190614431565b6020604051808303815f875af1158015612149573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061216d919061446c565b6121ae57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016121a591906139b0565b60405180910390fd5b5b6121bb84848484612b00565b50505050565b60606121cc826127c8565b61220b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612202906153ba565b60405180910390fd5b6060600b60019054906101000a900460ff161561224a57600a60405160200161223491906154ac565b6040516020818303038152906040529050612278565b600a61225584612b62565b604051602001612266929190615547565b60405160208183030381529060405290505b80915050919050565b600d5481565b600f5481565b6060600a6040516020016122a191906155bf565b604051602081830303815290604052905090565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b61234b61243e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b090615650565b60405180910390fd5b6123c2816128d6565b50565b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612437575061243682612cbb565b5b9050919050565b6124466126a2565b73ffffffffffffffffffffffffffffffffffffffff16612464611f62565b73ffffffffffffffffffffffffffffffffffffffff16146124ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b1906156b8565b60405180910390fd5b565b5f6124c56127bf565b6bffffffffffffffffffffffff16905080826bffffffffffffffffffffffff16111561252a5781816040517f6f483d090000000000000000000000000000000000000000000000000000000081526004016125219291906156d6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361259a575f6040517fb6d9900a00000000000000000000000000000000000000000000000000000000815260040161259191906139b0565b60405180910390fd5b60405180604001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff1681525060085f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b612660816127c8565b61269f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612696906151a8565b60405180910390fd5b50565b5f33905090565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661271983611c98565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61277061276a6126a2565b82612d9c565b6127af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a69061576d565b60405180910390fd5b6127ba838383612e30565b505050565b5f612710905090565b5f8073ffffffffffffffffffffffffffffffffffffffff166127e98361289d565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612821828260405180602001604052805f81525061311c565b5050565b60026007540361286a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612861906157d5565b60405180910390fd5b6002600781905550565b6001600781905550565b61289883838360405180602001604052805f8152506120b7565b505050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe9061583d565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612af391906137c1565b60405180910390a3505050565b612b11612b0b6126a2565b83612d9c565b612b50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b479061576d565b60405180910390fd5b612b5c84848484613176565b50505050565b60605f8203612ba8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cb6565b5f8290505f5b5f8214612bd7578080612bc0906148b9565b915050600a82612bd09190614505565b9150612bae565b5f8167ffffffffffffffff811115612bf257612bf1613ae8565b5b6040519080825280601f01601f191660200182016040528015612c245781602001600182028036833780820191505090505b5090505b5f8514612caf57600182612c3c91906140d5565b9150600a85612c4b919061585b565b6030612c5791906146b9565b60f81b818381518110612c6d57612c6c6147bc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612ca89190614505565b9450612c28565b8093505050505b919050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d8557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d955750612d94826131d2565b5b9050919050565b5f80612da783611c98565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612de95750612de881856122b5565b5b80612e2757508373ffffffffffffffffffffffffffffffffffffffff16612e0f84610b88565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612e5082611c98565b73ffffffffffffffffffffffffffffffffffffffff1614612ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9d906158fb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0b90615989565b60405180910390fd5b612f21838383600161323b565b8273ffffffffffffffffffffffffffffffffffffffff16612f4182611c98565b73ffffffffffffffffffffffffffffffffffffffff1614612f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8e906158fb565b60405180910390fd5b60045f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540392505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131178383836001613359565b505050565b613126838361335f565b6131325f848484613572565b613171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316890615a17565b60405180910390fd5b505050565b613181848484612e30565b61318d84848484613572565b6131cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c390615a17565b60405180910390fd5b50505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6001811115613353575f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146132cb578060035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546132c391906140d5565b925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613352578060035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461334a91906146b9565b925050819055505b5b50505050565b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036133cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c490615a7f565b60405180910390fd5b6133d6816127c8565b15613416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340d90615ae7565b60405180910390fd5b6134235f8383600161323b565b61342c816127c8565b1561346c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346390615ae7565b60405180910390fd5b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461356e5f83836001613359565b5050565b5f6135928473ffffffffffffffffffffffffffffffffffffffff166136f4565b156136e7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135bb6126a2565b8786866040518563ffffffff1660e01b81526004016135dd9493929190615b57565b6020604051808303815f875af192505050801561361857506040513d601f19601f820116820180604052508101906136159190615bb5565b60015b613697573d805f8114613646576040519150601f19603f3d011682016040523d82523d5f602084013e61364b565b606091505b505f81510361368f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161368690615a17565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136ec565b600190505b949350505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61375b81613727565b8114613765575f80fd5b50565b5f8135905061377681613752565b92915050565b5f602082840312156137915761379061371f565b5b5f61379e84828501613768565b91505092915050565b5f8115159050919050565b6137bb816137a7565b82525050565b5f6020820190506137d45f8301846137b2565b92915050565b5f819050919050565b6137ec816137da565b81146137f6575f80fd5b50565b5f81359050613807816137e3565b92915050565b5f602082840312156138225761382161371f565b5b5f61382f848285016137f9565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61386182613838565b9050919050565b61387181613857565b811461387b575f80fd5b50565b5f8135905061388c81613868565b92915050565b5f6bffffffffffffffffffffffff82169050919050565b6138b281613892565b81146138bc575f80fd5b50565b5f813590506138cd816138a9565b92915050565b5f80604083850312156138e9576138e861371f565b5b5f6138f68582860161387e565b9250506020613907858286016138bf565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61395382613911565b61395d818561391b565b935061396d81856020860161392b565b61397681613939565b840191505092915050565b5f6020820190508181035f8301526139998184613949565b905092915050565b6139aa81613857565b82525050565b5f6020820190506139c35f8301846139a1565b92915050565b5f80604083850312156139df576139de61371f565b5b5f6139ec8582860161387e565b92505060206139fd858286016137f9565b9150509250929050565b613a10816137da565b82525050565b5f602082019050613a295f830184613a07565b92915050565b5f805f60608486031215613a4657613a4561371f565b5b5f613a538682870161387e565b9350506020613a648682870161387e565b9250506040613a75868287016137f9565b9150509250925092565b5f8060408385031215613a9557613a9461371f565b5b5f613aa2858286016137f9565b9250506020613ab3858286016137f9565b9150509250929050565b5f604082019050613ad05f8301856139a1565b613add6020830184613a07565b9392505050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613b1e82613939565b810181811067ffffffffffffffff82111715613b3d57613b3c613ae8565b5b80604052505050565b5f613b4f613716565b9050613b5b8282613b15565b919050565b5f67ffffffffffffffff821115613b7a57613b79613ae8565b5b602082029050602081019050919050565b5f80fd5b5f613ba1613b9c84613b60565b613b46565b90508083825260208201905060208402830185811115613bc457613bc3613b8b565b5b835b81811015613bed5780613bd9888261387e565b845260208401935050602081019050613bc6565b5050509392505050565b5f82601f830112613c0b57613c0a613ae4565b5b8135613c1b848260208601613b8f565b91505092915050565b5f67ffffffffffffffff821115613c3e57613c3d613ae8565b5b602082029050602081019050919050565b5f613c61613c5c84613c24565b613b46565b90508083825260208201905060208402830185811115613c8457613c83613b8b565b5b835b81811015613cad5780613c9988826137f9565b845260208401935050602081019050613c86565b5050509392505050565b5f82601f830112613ccb57613cca613ae4565b5b8135613cdb848260208601613c4f565b91505092915050565b5f8060408385031215613cfa57613cf961371f565b5b5f83013567ffffffffffffffff811115613d1757613d16613723565b5b613d2385828601613bf7565b925050602083013567ffffffffffffffff811115613d4457613d43613723565b5b613d5085828601613cb7565b9150509250929050565b5f80fd5b5f67ffffffffffffffff821115613d7857613d77613ae8565b5b613d8182613939565b9050602081019050919050565b828183375f83830152505050565b5f613dae613da984613d5e565b613b46565b905082815260208101848484011115613dca57613dc9613d5a565b5b613dd5848285613d8e565b509392505050565b5f82601f830112613df157613df0613ae4565b5b8135613e01848260208601613d9c565b91505092915050565b5f60208284031215613e1f57613e1e61371f565b5b5f82013567ffffffffffffffff811115613e3c57613e3b613723565b5b613e4884828501613ddd565b91505092915050565b5f60208284031215613e6657613e6561371f565b5b5f613e738482850161387e565b91505092915050565b613e85816137a7565b8114613e8f575f80fd5b50565b5f81359050613ea081613e7c565b92915050565b5f8060408385031215613ebc57613ebb61371f565b5b5f613ec98582860161387e565b9250506020613eda85828601613e92565b9150509250929050565b5f67ffffffffffffffff821115613efe57613efd613ae8565b5b613f0782613939565b9050602081019050919050565b5f613f26613f2184613ee4565b613b46565b905082815260208101848484011115613f4257613f41613d5a565b5b613f4d848285613d8e565b509392505050565b5f82601f830112613f6957613f68613ae4565b5b8135613f79848260208601613f14565b91505092915050565b5f805f8060808587031215613f9a57613f9961371f565b5b5f613fa78782880161387e565b9450506020613fb88782880161387e565b9350506040613fc9878288016137f9565b925050606085013567ffffffffffffffff811115613fea57613fe9613723565b5b613ff687828801613f55565b91505092959194509250565b5f80604083850312156140185761401761371f565b5b5f6140258582860161387e565b92505060206140368582860161387e565b9150509250929050565b7f4d617820737570706c79206f766572666c6f77000000000000000000000000005f82015250565b5f61407460138361391b565b915061407f82614040565b602082019050919050565b5f6020820190508181035f8301526140a181614068565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6140df826137da565b91506140ea836137da565b9250828203905081811115614102576141016140a8565b5b92915050565b7f526573657276656420746f6b656e732065786365656420617661696c61626c655f8201527f20737570706c7900000000000000000000000000000000000000000000000000602082015250565b5f61416260278361391b565b915061416d82614108565b604082019050919050565b5f6020820190508181035f83015261418f81614156565b9050919050565b7f496e76616c696420726f79616c747920726563656976657200000000000000005f82015250565b5f6141ca60188361391b565b91506141d582614196565b602082019050919050565b5f6020820190508181035f8301526141f7816141be565b9050919050565b7f526f79616c74792066656520746f6f20686967680000000000000000000000005f82015250565b5f61423260148361391b565b915061423d826141fe565b602082019050919050565b5f6020820190508181035f83015261425f81614226565b9050919050565b5f819050919050565b5f61428961428461427f84613892565b614266565b6137da565b9050919050565b6142998161426f565b82525050565b5f6020820190506142b25f830184614290565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806142fc57607f821691505b60208210810361430f5761430e6142b8565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f61436f60218361391b565b915061437a82614315565b604082019050919050565b5f6020820190508181035f83015261439c81614363565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f5f8201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b5f6143fd603d8361391b565b9150614408826143a3565b604082019050919050565b5f6020820190508181035f83015261442a816143f1565b9050919050565b5f6040820190506144445f8301856139a1565b61445160208301846139a1565b9392505050565b5f8151905061446681613e7c565b92915050565b5f602082840312156144815761448061371f565b5b5f61448e84828501614458565b91505092915050565b5f6144a1826137da565b91506144ac836137da565b92508282026144ba816137da565b915082820484148315176144d1576144d06140a8565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61450f826137da565b915061451a836137da565b92508261452a576145296144d8565b5b828204905092915050565b7f546f6b656e206e6f7420696e697469616c697a2e0000000000000000000000005f82015250565b5f61456960148361391b565b915061457482614535565b602082019050919050565b5f6020820190508181035f8301526145968161455d565b9050919050565b7f546869732066756e6374696f6e20686173206265656e2064697361626c6564205f8201527f7065726d616e656e746c792e0000000000000000000000000000000000000000602082015250565b5f6145f7602c8361391b565b91506146028261459d565b604082019050919050565b5f6020820190508181035f830152614624816145eb565b9050919050565b7f42756c6b4f776e65724d696e743a204c656e677468206d69736d6174636820655f8201527f72726f7200000000000000000000000000000000000000000000000000000000602082015250565b5f61468560248361391b565b91506146908261462b565b604082019050919050565b5f6020820190508181035f8301526146b281614679565b9050919050565b5f6146c3826137da565b91506146ce836137da565b92508282019050808211156146e6576146e56140a8565b5b92915050565b7f42756c6b206d696e742065786365656473206d617820737570706c79000000005f82015250565b5f614720601c8361391b565b915061472b826146ec565b602082019050919050565b5f6020820190508181035f83015261474d81614714565b9050919050565b7f52657175697265642076616c75652069732035323220746f6b656e73000000005f82015250565b5f614788601c8361391b565b915061479382614754565b602082019050919050565b5f6020820190508181035f8301526147b58161477c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f546f6b656e20616c7265616479206d696e7465640000000000000000000000005f82015250565b5f61481d60148361391b565b9150614828826147e9565b602082019050919050565b5f6020820190508181035f83015261484a81614811565b9050919050565b7f546f6b656e2049442065786365656473206d617820737570706c7900000000005f82015250565b5f614885601b8361391b565b915061489082614851565b602082019050919050565b5f6020820190508181035f8301526148b281614879565b9050919050565b5f6148c3826137da565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148f5576148f46140a8565b5b600182019050919050565b7f4d696e743a205075626c6963204d696e74206973206e6f74206163746976652e5f82015250565b5f61493460208361391b565b915061493f82614900565b602082019050919050565b5f6020820190508181035f83015261496181614928565b9050919050565b7f4d696e743a20496e73756666696369656e742046756e64732e000000000000005f82015250565b5f61499c60198361391b565b91506149a782614968565b602082019050919050565b5f6020820190508181035f8301526149c981614990565b9050919050565b7f4d696e743a204e6f7420656e6f7567682061766169616c6162696c69747900005f82015250565b5f614a04601e8361391b565b9150614a0f826149d0565b602082019050919050565b5f6020820190508181035f830152614a31816149f8565b9050919050565b7f4d696e743a204d6178204d696e7420746f6b656e7320706572207472616e73615f8201527f6374696f6e206578636565646564000000000000000000000000000000000000602082015250565b5f614a92602e8361391b565b9150614a9d82614a38565b604082019050919050565b5f6020820190508181035f830152614abf81614a86565b9050919050565b7f4d696e743a204d617820746f6b656e73207065722077616c6c657420657863655f8201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b5f614b2060248361391b565b9150614b2b82614ac6565b604082019050919050565b5f6020820190508181035f830152614b4d81614b14565b9050919050565b7f5175616e74697479206d7573742062652067726561746572207468616e2030005f82015250565b5f614b88601f8361391b565b9150614b9382614b54565b602082019050919050565b5f6020820190508181035f830152614bb581614b7c565b9050919050565b7f4d696e742065786365656473206d617820737570706c790000000000000000005f82015250565b5f614bf060178361391b565b9150614bfb82614bbc565b602082019050919050565b5f6020820190508181035f830152614c1d81614be4565b9050919050565b7f4e6f2066756e647320617661696c61626c6500000000000000000000000000005f82015250565b5f614c5860128361391b565b9150614c6382614c24565b602082019050919050565b5f6020820190508181035f830152614c8581614c4c565b9050919050565b5f81905092915050565b50565b5f614ca45f83614c8c565b9150614caf82614c96565b5f82019050919050565b5f614cc382614c99565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c00000000000000005f82015250565b5f614d0160188361391b565b9150614d0c82614ccd565b602082019050919050565b5f6020820190508181035f830152614d2e81614cf5565b9050919050565b7f546f6b656e206e6f7420696e697469616c697a656400000000000000000000005f82015250565b5f614d6960158361391b565b9150614d7482614d35565b602082019050919050565b5f6020820190508181035f830152614d9681614d5d565b9050919050565b7f43616e6e6f74206d696e7420746f207a65726f206164647265737300000000005f82015250565b5f614dd1601b8361391b565b9150614ddc82614d9d565b602082019050919050565b5f6020820190508181035f830152614dfe81614dc5565b9050919050565b7f496e73756666696369656e7420726573657276656420746f6b656e73000000005f82015250565b5f614e39601c8361391b565b9150614e4482614e05565b602082019050919050565b5f6020820190508181035f830152614e6681614e2d565b9050919050565b7f45786365656473206d617820737570706c7920696e636c7564696e67207265735f8201527f657276656420746f6b656e730000000000000000000000000000000000000000602082015250565b5f614ec7602c8361391b565b9150614ed282614e6d565b604082019050919050565b5f6020820190508181035f830152614ef481614ebb565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614f1c565b614f618683614f1c565b95508019841693508086168417925050509392505050565b5f614f93614f8e614f89846137da565b614266565b6137da565b9050919050565b5f819050919050565b614fac83614f79565b614fc0614fb882614f9a565b848454614f28565b825550505050565b5f90565b614fd4614fc8565b614fdf818484614fa3565b505050565b5b8181101561500257614ff75f82614fcc565b600181019050614fe5565b5050565b601f8211156150475761501881614efb565b61502184614f0d565b81016020851015615030578190505b61504461503c85614f0d565b830182614fe4565b50505b505050565b5f82821c905092915050565b5f6150675f198460080261504c565b1980831691505092915050565b5f61507f8383615058565b9150826002028217905092915050565b61509882613911565b67ffffffffffffffff8111156150b1576150b0613ae8565b5b6150bb82546142e5565b6150c6828285615006565b5f60209050601f8311600181146150f7575f84156150e5578287015190505b6150ef8582615074565b865550615156565b601f19841661510586614efb565b5f5b8281101561512c57848901518255600182019150602085019450602081019050615107565b868310156151495784890151615145601f891682615058565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e20494400000000000000005f82015250565b5f61519260188361391b565b915061519d8261515e565b602082019050919050565b5f6020820190508181035f8301526151bf81615186565b9050919050565b7f496e63726561736520746865206c696d6974206f6620746f74616c20746f6b655f8201527f6e732e0000000000000000000000000000000000000000000000000000000000602082015250565b5f61522060238361391b565b915061522b826151c6565b604082019050919050565b5f6020820190508181035f83015261524d81615214565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f7420612076615f8201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b5f6152ae60298361391b565b91506152b982615254565b604082019050919050565b5f6020820190508181035f8301526152db816152a2565b9050919050565b7f416c726561647920696e697469616c697a65642e0000000000000000000000005f82015250565b5f61531660148361391b565b9150615321826152e2565b602082019050919050565b5f6020820190508181035f8301526153438161530a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f6153a4602f8361391b565b91506153af8261534a565b604082019050919050565b5f6020820190508181035f8301526153d181615398565b9050919050565b5f81905092915050565b5f81546153ee816142e5565b6153f881866153d8565b9450600182165f8114615412576001811461542757615459565b60ff1983168652811515820286019350615459565b61543085614efb565b5f5b8381101561545157815481890152600182019150602081019050615432565b838801955050505b50505092915050565b7f6d797374657279322e6a736f6e000000000000000000000000000000000000005f82015250565b5f615496600d836153d8565b91506154a182615462565b600d82019050919050565b5f6154b782846153e2565b91506154c28261548a565b915081905092915050565b5f6154d782613911565b6154e181856153d8565b93506154f181856020860161392b565b80840191505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f6155316005836153d8565b915061553c826154fd565b600582019050919050565b5f61555282856153e2565b915061555e82846154cd565b915061556982615525565b91508190509392505050565b7f636f6e74726163742e6a736f6e000000000000000000000000000000000000005f82015250565b5f6155a9600d836153d8565b91506155b482615575565b600d82019050919050565b5f6155ca82846153e2565b91506155d58261559d565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61563a60268361391b565b9150615645826155e0565b604082019050919050565b5f6020820190508181035f8301526156678161562e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6156a260208361391b565b91506156ad8261566e565b602082019050919050565b5f6020820190508181035f8301526156cf81615696565b9050919050565b5f6040820190506156e95f830185614290565b6156f66020830184613a07565b9392505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e655f8201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b5f615757602d8361391b565b9150615762826156fd565b604082019050919050565b5f6020820190508181035f8301526157848161574b565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6157bf601f8361391b565b91506157ca8261578b565b602082019050919050565b5f6020820190508181035f8301526157ec816157b3565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f61582760198361391b565b9150615832826157f3565b602082019050919050565b5f6020820190508181035f8301526158548161581b565b9050919050565b5f615865826137da565b9150615870836137da565b9250826158805761587f6144d8565b5b828206905092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f7272656374205f8201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b5f6158e560258361391b565b91506158f08261588b565b604082019050919050565b5f6020820190508181035f830152615912816158d9565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61597360248361391b565b915061597e82615919565b604082019050919050565b5f6020820190508181035f8301526159a081615967565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f615a0160328361391b565b9150615a0c826159a7565b604082019050919050565b5f6020820190508181035f830152615a2e816159f5565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f615a6960208361391b565b9150615a7482615a35565b602082019050919050565b5f6020820190508181035f830152615a9681615a5d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f615ad1601c8361391b565b9150615adc82615a9d565b602082019050919050565b5f6020820190508181035f830152615afe81615ac5565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f615b2982615b05565b615b338185615b0f565b9350615b4381856020860161392b565b615b4c81613939565b840191505092915050565b5f608082019050615b6a5f8301876139a1565b615b7760208301866139a1565b615b846040830185613a07565b8181036060830152615b968184615b1f565b905095945050505050565b5f81519050615baf81613752565b92915050565b5f60208284031215615bca57615bc961371f565b5b5f615bd784828501615ba1565b9150509291505056fea264697066735822122039181e4d19384d03a1dfe4614ac59988ea9db13d05350fb98a1d87082e86aba764736f6c634300081a0033

Deployed Bytecode Sourcemap

83217:9051:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84825:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90262:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88979:332;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64517:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66029:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65547:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83518:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83683:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90688:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5403:673;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;86736:968;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87712:1045;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89321:86;;;;;;;;;;;;;:::i;:::-;;89709:81;;;;;;;;;;;;;:::i;:::-;;85123:907;;;;;;;;;;;;;:::i;:::-;;90853:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90154:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83649:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86038:690;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89517:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90576:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64227:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89798;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63958:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81367:103;;;;;;;;;;;;;:::i;:::-;;84175:588;;;;;;;;;;;;;:::i;:::-;;80719:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64686:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83582:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89415:88;;;;;;;;;;;;;:::i;:::-;;66272:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83796:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90029:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89619:78;;;;;;;;;;;;;:::i;:::-;;83431:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91026:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91342:608;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83551:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83615:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91958:138;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66498:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81625:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84825:220;84972:4;85001:36;85025:11;85001:23;:36::i;:::-;84994:43;;84825:220;;;:::o;90262:306::-;80605:13;:11;:13::i;:::-;90375:9:::1;;90354:17;:30;;90346:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;90461:11;;90449:9;;:23;;;;:::i;:::-;90428:17;:44;;90420:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;90543:17;90526:14;:34;;;;90262:306:::0;:::o;88979:332::-;80605:13;:11;:13::i;:::-;89100:1:::1;89080:22;;:8;:22;;::::0;89072:59:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;89166:5;89150:12;:21;;;;89142:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;89207:42;89226:8;89236:12;89207:18;:42::i;:::-;89280:8;89265:38;;;89290:12;89265:38;;;;;;:::i;:::-;;;;;;;;88979:332:::0;;:::o;64517:100::-;64571:13;64604:5;64597:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64517:100;:::o;66029:171::-;66105:7;66125:23;66140:7;66125:14;:23::i;:::-;66168:15;:24;66184:7;66168:24;;;;;;;;;;;;;;;;;;;;;66161:31;;66029:171;;;:::o;65547:416::-;65628:13;65644:23;65659:7;65644:14;:23::i;:::-;65628:39;;65692:5;65686:11;;:2;:11;;;65678:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;65786:5;65770:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;65795:37;65812:5;65819:12;:10;:12::i;:::-;65795:16;:37::i;:::-;65770:62;65748:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;65934:21;65943:2;65947:7;65934:8;:21::i;:::-;65617:346;65547:416;;:::o;83518:26::-;;;;:::o;83683:29::-;;;;:::o;90688:157::-;28902:1;27728:42;28856:43;;;:47;28852:225;;;27728:42;28925:40;;;28974:4;28981:10;28925:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28920:146;;29039:10;29020:30;;;;;;;;;;;:::i;:::-;;;;;;;;28920:146;28852:225;90800:37:::1;90819:4;90825:2;90829:7;90800:18;:37::i;:::-;90688:157:::0;;;:::o;5403:673::-;5514:16;5532:14;5559:32;5594:17;:26;5612:7;5594:26;;;;;;;;;;;5559:61;;5631:23;5657:12;:21;;;;;;;;;;;;5631:47;;5689:22;5714:12;:28;;;;;;;;;;;;5689:53;;5786:1;5759:29;;:15;:29;;;5755:176;;5823:19;:28;;;;;;;;;;;;5805:46;;5884:19;:35;;;;;;;;;;;;5866:53;;5755:176;5943:21;5999:17;:15;:17::i;:::-;5967:49;;5980:15;5968:27;;:9;:27;;;;:::i;:::-;5967:49;;;;:::i;:::-;5943:73;;6037:15;6054:13;6029:39;;;;;;;;5403:673;;;;;:::o;86736:968::-;80605:13;:11;:13::i;:::-;86846::::1;;;;;;;;;;;86838:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;86914:5;86902:17;;:8;;;;;;;;;;;:17;;;86894:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;87000:6;:13;86986:3;:10;:27;86978:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;87104:9;;87087:6;:13;87073:11;;:27;;;;:::i;:::-;:40;;87065:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;87179:3;87165;:10;:17;87157:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;87230:9;87225:446;87249:3;:10;87245:1;:14;87225:446;;;87366:18;87374:6;87381:1;87374:9;;;;;;;;:::i;:::-;;;;;;;;87366:7;:18::i;:::-;87365:19;87357:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;87444:9;;87432:6;87439:1;87432:9;;;;;;;;:::i;:::-;;;;;;;;:21;87424:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;87500:28;87510:3;87514:1;87510:6;;;;;;;;:::i;:::-;;;;;;;;87518;87525:1;87518:9;;;;;;;;:::i;:::-;;;;;;;;87500;:28::i;:::-;87543:11;;:14;;;;;;;;;:::i;:::-;;;;;;87641:3;87645:1;87641:6;;;;;;;;:::i;:::-;;;;;;;;87629:30;;;87649:6;87656:1;87649:9;;;;;;;;:::i;:::-;;;;;;;;87629:30;;;;;;:::i;:::-;;;;;;;;87261:3;;;;;;;87225:446;;;;87692:4;87681:8;;:15;;;;;;;;;;;;;;;;;;86736:968:::0;;:::o;87712:1045::-;10927:21;:19;:21::i;:::-;87794:13:::1;;;;;;;;;;;87786:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;87850:16;;;;;;;;;;;87842:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;87939:11;;87935:3;:15;;;;:::i;:::-;87922:9;:28;;87914:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;88039:9;;88023:11;;88006:14;;88000:3;:20;;;;:::i;:::-;:34;;;;:::i;:::-;87999:49;;87991:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;88129:12;;88122:3;:19;;88114:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;88247:12;;88239:3;88211:13;:25;88225:10;88211:25;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;88210:49;;88202:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;88338:1;88333:3;:6;88325:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;88414:9;;88407:3;88393:11;;:17;;;;:::i;:::-;:30;;88385:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;88462:21;88486:11;;88462:35;;88520:9;88516:191;88539:3;88535:1;:7;88516:191;;;88564:40;88574:10;88602:1;88586:13;:17;;;;:::i;:::-;88564:9;:40::i;:::-;88636:10;88624:42;;;88664:1;88648:13;:17;;;;:::i;:::-;88624:42;;;;;;:::i;:::-;;;;;;;;88681:11;;:14;;;;;;;;;:::i;:::-;;;;;;88544:3;;;;;;;88516:191;;;;88746:3;88717:13;:25;88731:10;88717:25;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;87775:982;10971:20:::0;:18;:20::i;:::-;87712:1045;:::o;89321:86::-;80605:13;:11;:13::i;:::-;89395:4:::1;89376:16;;:23;;;;;;;;;;;;;;;;;;89321:86::o:0;89709:81::-;80605:13;:11;:13::i;:::-;89777:5:::1;89763:11;;:19;;;;;;;;;;;;;;;;;;89709:81::o:0;85123:907::-;80605:13;:11;:13::i;:::-;10927:21:::1;:19;:21::i;:::-;85185:18:::2;85206:21;85185:42;;85259:1;85246:10;:14;85238:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;85296:11;85318:42;85296:65;;85372:12;85395:42;85372:66;;85449:11;85471:42;85449:65;;85527:17;85567:3;85561:2;85548:10;:15;;;;:::i;:::-;85547:23;;;;:::i;:::-;85527:43;;85589:18;85630:3;85624:2;85611:10;:15;;;;:::i;:::-;85610:23;;;;:::i;:::-;85589:44;;85652:17;85697:10;85685:9;85672:10;:22;;;;:::i;:::-;:35;;;;:::i;:::-;85652:55;;85741:13;85759:3;:8;;85775:9;85759:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85740:49;;;85801:13;85819:4;:9;;85836:10;85819:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85800:51;;;85863:13;85881:3;:8;;85897:9;85881:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85862:49;;;85930:8;:20;;;;;85942:8;85930:20;:32;;;;;85954:8;85930:32;85922:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;85174:856;;;;;;;;;;10971:20:::1;:18;:20::i;:::-;85123:907::o:0;90853:165::-;28902:1;27728:42;28856:43;;;:47;28852:225;;;27728:42;28925:40;;;28974:4;28981:10;28925:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28920:146;;29039:10;29020:30;;;;;;;;;;;:::i;:::-;;;;;;;;28920:146;28852:225;90969:41:::1;90992:4;90998:2;91002:7;90969:22;:41::i;:::-;90853:165:::0;;;:::o;90154:100::-;80605:13;:11;:13::i;:::-;90238:8:::1;90224:11;:22;;;;90154:100:::0;:::o;83649:27::-;;;;:::o;86038:690::-;80605:13;:11;:13::i;:::-;86117::::1;;;;;;;;;;;86109:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;86186:1;86171:17;;:3;:17;;::::0;86163:57:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;86241:1;86235:3;:7;86227:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;86311:3;86293:14;;:21;;86285:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;86384:9;;86376:3;86362:11;;:17;;;;:::i;:::-;:31;;86354:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;86451:21;86475:11;;86451:35;;86511:3;86493:14;;:21;;;;;;;:::i;:::-;;;;;;;;86536:3;86521:11;;:18;;;;;;;:::i;:::-;;;;;;;;86574:9;86569:149;86593:3;86589:1;:7;86569:149;;;86618:33;86628:3;86649:1;86633:13;:17;86618:9;:33::i;:::-;86683:3;86671:35;;;86704:1;86688:13;:17;86671:35;;;;;;:::i;:::-;;;;;;;;86598:3;;;;;;;86569:149;;;;86102:626;86038:690:::0;;:::o;89517:94::-;80605:13;:11;:13::i;:::-;89597:6:::1;89587:7;:16;;;;;;:::i;:::-;;89517:94:::0;:::o;90576:104::-;80605:13;:11;:13::i;:::-;90663:9:::1;90648:12;:24;;;;90576:104:::0;:::o;64227:223::-;64299:7;64319:13;64335:17;64344:7;64335:8;:17::i;:::-;64319:33;;64388:1;64371:19;;:5;:19;;;64363:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;64437:5;64430:12;;;64227:223;;;:::o;89798:::-;80605:13;:11;:13::i;:::-;89909:14:::1;;89895:11;;:28;;;;:::i;:::-;89879:13;:44;89870:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;90000:13;89988:9;:25;;;;89798:223:::0;:::o;63958:207::-;64030:7;64075:1;64058:19;;:5;:19;;;64050:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;64141:9;:16;64151:5;64141:16;;;;;;;;;;;;;;;;64134:23;;63958:207;;;:::o;81367:103::-;80605:13;:11;:13::i;:::-;81432:30:::1;81459:1;81432:18;:30::i;:::-;81367:103::o:0;84175:588::-;80605:13;:11;:13::i;:::-;84250:5:::1;84233:22;;:13;;;;;;;;;;;:22;;;84225:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;84290:43;;;;;;;;;;;;;;;;::::0;:7:::1;:43;;;;;;:::i;:::-;;84358:4;84344:11;;:18;;;;;;;;;;;;;;;;;;84395:5;84383:9;:17;;;;84435:15;84421:11;:29;;;;84513:3;84498:12;:18;;;;84549:3;84534:12;:18;;;;84580:3;84563:14;:20;;;;84643:1;84629:11;:15;;;;84657:35;84676:10;84688:3;84657:18;:35::i;:::-;84750:4;84734:13;;:20;;;;;;;;;;;;;;;;;;84175:588::o:0;80719:87::-;80765:7;80792:6;;;;;;;;;;;80785:13;;80719:87;:::o;64686:104::-;64742:13;64775:7;64768:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64686:104;:::o;83582:26::-;;;;:::o;89415:88::-;80605:13;:11;:13::i;:::-;89490:5:::1;89471:16;;:24;;;;;;;;;;;;;;;;;;89415:88::o:0;66272:155::-;66367:52;66386:12;:10;:12::i;:::-;66400:8;66410;66367:18;:52::i;:::-;66272:155;;:::o;83796:48::-;;;;;;;;;;;;;;;;;:::o;90029:117::-;80605:13;:11;:13::i;:::-;90123:15:::1;90108:12;:30;;;;90029:117:::0;:::o;89619:78::-;80605:13;:11;:13::i;:::-;89685:4:::1;89671:11;;:18;;;;;;;;;;;;;;;;;;89619:78::o:0;83431:28::-;;;;;;;;;;;;;:::o;91026:222::-;28902:1;27728:42;28856:43;;;:47;28852:225;;;27728:42;28925:40;;;28974:4;28981:10;28925:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28920:146;;29039:10;29020:30;;;;;;;;;;;:::i;:::-;;;;;;;;28920:146;28852:225;91193:47:::1;91216:4;91222:2;91226:7;91235:4;91193:22;:47::i;:::-;91026:222:::0;;;;:::o;91342:608::-;91415:13;91448:16;91456:7;91448;:16::i;:::-;91440:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;91537:22;91584:11;;;;;;;;;;;91580:327;;;91686:7;91669:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;91651:61;;91580:327;;;91838:7;91847:17;91856:7;91847:8;:17::i;:::-;91821:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;91803:72;;91580:327;91934:8;91927:15;;;91342:608;;;:::o;83551:24::-;;;;:::o;83615:27::-;;;;:::o;91958:138::-;92002:13;92063:7;92046:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;92032:56;;91958:138;:::o;66498:164::-;66595:4;66619:18;:25;66638:5;66619:25;;;;;;;;;;;;;;;:35;66645:8;66619:35;;;;;;;;;;;;;;;;;;;;;;;;;66612:42;;66498:164;;;;:::o;81625:201::-;80605:13;:11;:13::i;:::-;81734:1:::1;81714:22;;:8;:22;;::::0;81706:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;81790:28;81809:8;81790:18;:28::i;:::-;81625:201:::0;:::o;5133:215::-;5235:4;5274:26;5259:41;;;:11;:41;;;;:81;;;;5304:36;5328:11;5304:23;:36::i;:::-;5259:81;5252:88;;5133:215;;;:::o;80884:132::-;80959:12;:10;:12::i;:::-;80948:23;;:7;:5;:7::i;:::-;:23;;;80940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80884:132::o;6726:518::-;6821:19;6843:17;:15;:17::i;:::-;6821:39;;;;6890:11;6875:12;:26;;;6871:176;;;7009:12;7023:11;6980:55;;;;;;;;;;;;:::i;:::-;;;;;;;;6871:176;7081:1;7061:22;;:8;:22;;;7057:110;;7152:1;7107:48;;;;;;;;;;;:::i;:::-;;;;;;;;7057:110;7201:35;;;;;;;;7213:8;7201:35;;;;;;7223:12;7201:35;;;;;7179:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6810:434;6726:518;;:::o;75848:135::-;75930:16;75938:7;75930;:16::i;:::-;75922:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;75848:135;:::o;61913:98::-;61966:7;61993:10;61986:17;;61913:98;:::o;75127:174::-;75229:2;75202:15;:24;75218:7;75202:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;75285:7;75281:2;75247:46;;75256:23;75271:7;75256:14;:23::i;:::-;75247:46;;;;;;;;;;;;75127:174;;:::o;66729:335::-;66924:41;66943:12;:10;:12::i;:::-;66957:7;66924:18;:41::i;:::-;66916:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;67028:28;67038:4;67044:2;67048:7;67028:9;:28::i;:::-;66729:335;;;:::o;6358:97::-;6416:6;6442:5;6435:12;;6358:97;:::o;69451:128::-;69516:4;69569:1;69540:31;;:17;69549:7;69540:8;:17::i;:::-;:31;;;;69533:38;;69451:128;;;:::o;70352:110::-;70428:26;70438:2;70442:7;70428:26;;;;;;;;;;;;:9;:26::i;:::-;70352:110;;:::o;11007:293::-;10409:1;11141:7;;:19;11133:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10409:1;11274:7;:18;;;;11007:293::o;11308:213::-;10365:1;11491:7;:22;;;;11308:213::o;67135:185::-;67273:39;67290:4;67296:2;67300:7;67273:39;;;;;;;;;;;;:16;:39::i;:::-;67135:185;;;:::o;69021:117::-;69087:7;69114;:16;69122:7;69114:16;;;;;;;;;;;;;;;;;;;;;69107:23;;69021:117;;;:::o;81986:191::-;82060:16;82079:6;;;;;;;;;;;82060:25;;82105:8;82096:6;;:17;;;;;;;;;;;;;;;;;;82160:8;82129:40;;82150:8;82129:40;;;;;;;;;;;;82049:128;81986:191;:::o;75444:315::-;75599:8;75590:17;;:5;:17;;;75582:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;75686:8;75648:18;:25;75667:5;75648:25;;;;;;;;;;;;;;;:35;75674:8;75648:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;75732:8;75710:41;;75725:5;75710:41;;;75742:8;75710:41;;;;;;:::i;:::-;;;;;;;;75444:315;;;:::o;67391:322::-;67565:41;67584:12;:10;:12::i;:::-;67598:7;67565:18;:41::i;:::-;67557:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;67667:38;67681:4;67687:2;67691:7;67700:4;67667:13;:38::i;:::-;67391:322;;;;:::o;82220:532::-;82276:13;82315:1;82306:5;:10;82302:53;;82333:10;;;;;;;;;;;;;;;;;;;;;82302:53;82365:12;82380:5;82365:20;;82396:14;82421:78;82436:1;82428:4;:9;82421:78;;82454:8;;;;;:::i;:::-;;;;82485:2;82477:10;;;;;:::i;:::-;;;82421:78;;;82509:19;82541:6;82531:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82509:39;;82559:154;82575:1;82566:5;:10;82559:154;;82603:1;82593:11;;;;;:::i;:::-;;;82670:2;82662:5;:10;;;;:::i;:::-;82649:2;:24;;;;:::i;:::-;82636:39;;82619:6;82626;82619:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;82699:2;82690:11;;;;;:::i;:::-;;;82559:154;;;82737:6;82723:21;;;;;82220:532;;;;:::o;63589:305::-;63691:4;63743:25;63728:40;;;:11;:40;;;;:105;;;;63800:33;63785:48;;;:11;:48;;;;63728:105;:158;;;;63850:36;63874:11;63850:23;:36::i;:::-;63728:158;63708:178;;63589:305;;;:::o;69746:264::-;69839:4;69856:13;69872:23;69887:7;69872:14;:23::i;:::-;69856:39;;69925:5;69914:16;;:7;:16;;;:52;;;;69934:32;69951:5;69958:7;69934:16;:32::i;:::-;69914:52;:87;;;;69994:7;69970:31;;:20;69982:7;69970:11;:20::i;:::-;:31;;;69914:87;69906:96;;;69746:264;;;;:::o;73745:1263::-;73904:4;73877:31;;:23;73892:7;73877:14;:23::i;:::-;:31;;;73869:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;73983:1;73969:16;;:2;:16;;;73961:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;74039:42;74060:4;74066:2;74070:7;74079:1;74039:20;:42::i;:::-;74211:4;74184:31;;:23;74199:7;74184:14;:23::i;:::-;:31;;;74176:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;74329:15;:24;74345:7;74329:24;;;;;;;;;;;;74322:31;;;;;;;;;;;74824:1;74805:9;:15;74815:4;74805:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;74857:1;74840:9;:13;74850:2;74840:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;74899:2;74880:7;:16;74888:7;74880:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;74938:7;74934:2;74919:27;;74928:4;74919:27;;;;;;;;;;;;74959:41;74979:4;74985:2;74989:7;74998:1;74959:19;:41::i;:::-;73745:1263;;;:::o;70689:319::-;70818:18;70824:2;70828:7;70818:5;:18::i;:::-;70869:53;70900:1;70904:2;70908:7;70917:4;70869:22;:53::i;:::-;70847:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;70689:319;;;:::o;68594:313::-;68750:28;68760:4;68766:2;68770:7;68750:9;:28::i;:::-;68797:47;68820:4;68826:2;68830:7;68839:4;68797:22;:47::i;:::-;68789:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;68594:313;;;;:::o;2906:148::-;2982:4;3021:25;3006:40;;;:11;:40;;;;2999:47;;2906:148;;;:::o;78132:410::-;78322:1;78310:9;:13;78306:229;;;78360:1;78344:18;;:4;:18;;;78340:87;;78402:9;78383;:15;78393:4;78383:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;78340:87;78459:1;78445:16;;:2;:16;;;78441:83;;78499:9;78482;:13;78492:2;78482:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;78441:83;78306:229;78132:410;;;;:::o;79264:158::-;;;;;:::o;71344:942::-;71438:1;71424:16;;:2;:16;;;71416:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;71497:16;71505:7;71497;:16::i;:::-;71496:17;71488:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;71559:48;71588:1;71592:2;71596:7;71605:1;71559:20;:48::i;:::-;71706:16;71714:7;71706;:16::i;:::-;71705:17;71697:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;72121:1;72104:9;:13;72114:2;72104:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;72165:2;72146:7;:16;72154:7;72146:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;72210:7;72206:2;72185:33;;72202:1;72185:33;;;;;;;;;;;;72231:47;72259:1;72263:2;72267:7;72276:1;72231:19;:47::i;:::-;71344:942;;:::o;76547:853::-;76701:4;76722:15;:2;:13;;;:15::i;:::-;76718:675;;;76774:2;76758:36;;;76795:12;:10;:12::i;:::-;76809:4;76815:7;76824:4;76758:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;76754:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77016:1;76999:6;:13;:18;76995:328;;77042:60;;;;;;;;;;:::i;:::-;;;;;;;;76995:328;77273:6;77267:13;77258:6;77254:2;77250:15;77243:38;76754:584;76890:41;;;76880:51;;;:6;:51;;;;76873:58;;;;;76718:675;77377:4;77370:11;;76547:853;;;;;;;:::o;46041:326::-;46101:4;46358:1;46336:7;:19;;;:23;46329:30;;46041: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:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:329::-;1933:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:119;;;1988:79;;:::i;:::-;1950:119;2108:1;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2079:117;1874:329;;;;:::o;2209:126::-;2246:7;2286:42;2279:5;2275:54;2264:65;;2209:126;;;:::o;2341:96::-;2378:7;2407:24;2425:5;2407:24;:::i;:::-;2396:35;;2341:96;;;:::o;2443:122::-;2516:24;2534:5;2516:24;:::i;:::-;2509:5;2506:35;2496:63;;2555:1;2552;2545:12;2496:63;2443:122;:::o;2571:139::-;2617:5;2655:6;2642:20;2633:29;;2671:33;2698:5;2671:33;:::i;:::-;2571:139;;;;:::o;2716:109::-;2752:7;2792:26;2785:5;2781:38;2770:49;;2716:109;;;:::o;2831:120::-;2903:23;2920:5;2903:23;:::i;:::-;2896:5;2893:34;2883:62;;2941:1;2938;2931:12;2883:62;2831:120;:::o;2957:137::-;3002:5;3040:6;3027:20;3018:29;;3056:32;3082:5;3056:32;:::i;:::-;2957:137;;;;:::o;3100:472::-;3167:6;3175;3224:2;3212:9;3203:7;3199:23;3195:32;3192:119;;;3230:79;;:::i;:::-;3192:119;3350:1;3375:53;3420:7;3411:6;3400:9;3396:22;3375:53;:::i;:::-;3365:63;;3321:117;3477:2;3503:52;3547:7;3538:6;3527:9;3523:22;3503:52;:::i;:::-;3493:62;;3448:117;3100:472;;;;;:::o;3578:99::-;3630:6;3664:5;3658:12;3648:22;;3578:99;;;:::o;3683:169::-;3767:11;3801:6;3796:3;3789:19;3841:4;3836:3;3832:14;3817:29;;3683:169;;;;:::o;3858:139::-;3947:6;3942:3;3937;3931:23;3988:1;3979:6;3974:3;3970:16;3963:27;3858:139;;;:::o;4003:102::-;4044:6;4095:2;4091:7;4086:2;4079:5;4075:14;4071:28;4061:38;;4003:102;;;:::o;4111:377::-;4199:3;4227:39;4260:5;4227:39;:::i;:::-;4282:71;4346:6;4341:3;4282:71;:::i;:::-;4275:78;;4362:65;4420:6;4415:3;4408:4;4401:5;4397:16;4362:65;:::i;:::-;4452:29;4474:6;4452:29;:::i;:::-;4447:3;4443:39;4436:46;;4203:285;4111:377;;;;:::o;4494:313::-;4607:4;4645:2;4634:9;4630:18;4622:26;;4694:9;4688:4;4684:20;4680:1;4669:9;4665:17;4658:47;4722:78;4795:4;4786:6;4722:78;:::i;:::-;4714:86;;4494:313;;;;:::o;4813:118::-;4900:24;4918:5;4900:24;:::i;:::-;4895:3;4888:37;4813:118;;:::o;4937:222::-;5030:4;5068:2;5057:9;5053:18;5045:26;;5081:71;5149:1;5138:9;5134:17;5125:6;5081:71;:::i;:::-;4937:222;;;;:::o;5165:474::-;5233:6;5241;5290:2;5278:9;5269:7;5265:23;5261:32;5258:119;;;5296:79;;:::i;:::-;5258:119;5416:1;5441:53;5486:7;5477:6;5466:9;5462:22;5441:53;:::i;:::-;5431:63;;5387:117;5543:2;5569:53;5614:7;5605:6;5594:9;5590:22;5569:53;:::i;:::-;5559:63;;5514:118;5165:474;;;;;:::o;5645:118::-;5732:24;5750:5;5732:24;:::i;:::-;5727:3;5720:37;5645:118;;:::o;5769:222::-;5862:4;5900:2;5889:9;5885:18;5877:26;;5913:71;5981:1;5970:9;5966:17;5957:6;5913:71;:::i;:::-;5769:222;;;;:::o;5997:619::-;6074:6;6082;6090;6139:2;6127:9;6118:7;6114:23;6110:32;6107:119;;;6145:79;;:::i;:::-;6107:119;6265:1;6290:53;6335:7;6326:6;6315:9;6311:22;6290:53;:::i;:::-;6280:63;;6236:117;6392:2;6418:53;6463:7;6454:6;6443:9;6439:22;6418:53;:::i;:::-;6408:63;;6363:118;6520:2;6546:53;6591:7;6582:6;6571:9;6567:22;6546:53;:::i;:::-;6536:63;;6491:118;5997:619;;;;;:::o;6622:474::-;6690:6;6698;6747:2;6735:9;6726:7;6722:23;6718:32;6715:119;;;6753:79;;:::i;:::-;6715:119;6873:1;6898:53;6943:7;6934:6;6923:9;6919:22;6898:53;:::i;:::-;6888:63;;6844:117;7000:2;7026:53;7071:7;7062:6;7051:9;7047:22;7026:53;:::i;:::-;7016:63;;6971:118;6622:474;;;;;:::o;7102:332::-;7223:4;7261:2;7250:9;7246:18;7238:26;;7274:71;7342:1;7331:9;7327:17;7318:6;7274:71;:::i;:::-;7355:72;7423:2;7412:9;7408:18;7399:6;7355:72;:::i;:::-;7102:332;;;;;:::o;7440:117::-;7549:1;7546;7539:12;7563:180;7611:77;7608:1;7601:88;7708:4;7705:1;7698:15;7732:4;7729:1;7722:15;7749:281;7832:27;7854:4;7832:27;:::i;:::-;7824:6;7820:40;7962:6;7950:10;7947:22;7926:18;7914:10;7911:34;7908:62;7905:88;;;7973:18;;:::i;:::-;7905:88;8013:10;8009:2;8002:22;7792:238;7749:281;;:::o;8036:129::-;8070:6;8097:20;;:::i;:::-;8087:30;;8126:33;8154:4;8146:6;8126:33;:::i;:::-;8036:129;;;:::o;8171:311::-;8248:4;8338:18;8330:6;8327:30;8324:56;;;8360:18;;:::i;:::-;8324:56;8410:4;8402:6;8398:17;8390:25;;8470:4;8464;8460:15;8452:23;;8171:311;;;:::o;8488:117::-;8597:1;8594;8587:12;8628:710;8724:5;8749:81;8765:64;8822:6;8765:64;:::i;:::-;8749:81;:::i;:::-;8740:90;;8850:5;8879:6;8872:5;8865:21;8913:4;8906:5;8902:16;8895:23;;8966:4;8958:6;8954:17;8946:6;8942:30;8995:3;8987:6;8984:15;8981:122;;;9014:79;;:::i;:::-;8981:122;9129:6;9112:220;9146:6;9141:3;9138:15;9112:220;;;9221:3;9250:37;9283:3;9271:10;9250:37;:::i;:::-;9245:3;9238:50;9317:4;9312:3;9308:14;9301:21;;9188:144;9172:4;9167:3;9163:14;9156:21;;9112:220;;;9116:21;8730:608;;8628:710;;;;;:::o;9361:370::-;9432:5;9481:3;9474:4;9466:6;9462:17;9458:27;9448:122;;9489:79;;:::i;:::-;9448:122;9606:6;9593:20;9631:94;9721:3;9713:6;9706:4;9698:6;9694:17;9631:94;:::i;:::-;9622:103;;9438:293;9361:370;;;;:::o;9737:311::-;9814:4;9904:18;9896:6;9893:30;9890:56;;;9926:18;;:::i;:::-;9890:56;9976:4;9968:6;9964:17;9956:25;;10036:4;10030;10026:15;10018:23;;9737:311;;;:::o;10071:710::-;10167:5;10192:81;10208:64;10265:6;10208:64;:::i;:::-;10192:81;:::i;:::-;10183:90;;10293:5;10322:6;10315:5;10308:21;10356:4;10349:5;10345:16;10338:23;;10409:4;10401:6;10397:17;10389:6;10385:30;10438:3;10430:6;10427:15;10424:122;;;10457:79;;:::i;:::-;10424:122;10572:6;10555:220;10589:6;10584:3;10581:15;10555:220;;;10664:3;10693:37;10726:3;10714:10;10693:37;:::i;:::-;10688:3;10681:50;10760:4;10755:3;10751:14;10744:21;;10631:144;10615:4;10610:3;10606:14;10599:21;;10555:220;;;10559:21;10173:608;;10071:710;;;;;:::o;10804:370::-;10875:5;10924:3;10917:4;10909:6;10905:17;10901:27;10891:122;;10932:79;;:::i;:::-;10891:122;11049:6;11036:20;11074:94;11164:3;11156:6;11149:4;11141:6;11137:17;11074:94;:::i;:::-;11065:103;;10881:293;10804:370;;;;:::o;11180:894::-;11298:6;11306;11355:2;11343:9;11334:7;11330:23;11326:32;11323:119;;;11361:79;;:::i;:::-;11323:119;11509:1;11498:9;11494:17;11481:31;11539:18;11531:6;11528:30;11525:117;;;11561:79;;:::i;:::-;11525:117;11666:78;11736:7;11727:6;11716:9;11712:22;11666:78;:::i;:::-;11656:88;;11452:302;11821:2;11810:9;11806:18;11793:32;11852:18;11844:6;11841:30;11838:117;;;11874:79;;:::i;:::-;11838:117;11979:78;12049:7;12040:6;12029:9;12025:22;11979:78;:::i;:::-;11969:88;;11764:303;11180:894;;;;;:::o;12080:117::-;12189:1;12186;12179:12;12203:308;12265:4;12355:18;12347:6;12344:30;12341:56;;;12377:18;;:::i;:::-;12341:56;12415:29;12437:6;12415:29;:::i;:::-;12407:37;;12499:4;12493;12489:15;12481:23;;12203:308;;;:::o;12517:148::-;12615:6;12610:3;12605;12592:30;12656:1;12647:6;12642:3;12638:16;12631:27;12517:148;;;:::o;12671:425::-;12749:5;12774:66;12790:49;12832:6;12790:49;:::i;:::-;12774:66;:::i;:::-;12765:75;;12863:6;12856:5;12849:21;12901:4;12894:5;12890:16;12939:3;12930:6;12925:3;12921:16;12918:25;12915:112;;;12946:79;;:::i;:::-;12915:112;13036:54;13083:6;13078:3;13073;13036:54;:::i;:::-;12755:341;12671:425;;;;;:::o;13116:340::-;13172:5;13221:3;13214:4;13206:6;13202:17;13198:27;13188:122;;13229:79;;:::i;:::-;13188:122;13346:6;13333:20;13371:79;13446:3;13438:6;13431:4;13423:6;13419:17;13371:79;:::i;:::-;13362:88;;13178:278;13116:340;;;;:::o;13462:509::-;13531:6;13580:2;13568:9;13559:7;13555:23;13551:32;13548:119;;;13586:79;;:::i;:::-;13548:119;13734:1;13723:9;13719:17;13706:31;13764:18;13756:6;13753:30;13750:117;;;13786:79;;:::i;:::-;13750:117;13891:63;13946:7;13937:6;13926:9;13922:22;13891:63;:::i;:::-;13881:73;;13677:287;13462:509;;;;:::o;13977:329::-;14036:6;14085:2;14073:9;14064:7;14060:23;14056:32;14053:119;;;14091:79;;:::i;:::-;14053:119;14211:1;14236:53;14281:7;14272:6;14261:9;14257:22;14236:53;:::i;:::-;14226:63;;14182:117;13977:329;;;;:::o;14312:116::-;14382:21;14397:5;14382:21;:::i;:::-;14375:5;14372:32;14362:60;;14418:1;14415;14408:12;14362:60;14312:116;:::o;14434:133::-;14477:5;14515:6;14502:20;14493:29;;14531:30;14555:5;14531:30;:::i;:::-;14434:133;;;;:::o;14573:468::-;14638:6;14646;14695:2;14683:9;14674:7;14670:23;14666:32;14663:119;;;14701:79;;:::i;:::-;14663:119;14821:1;14846:53;14891:7;14882:6;14871:9;14867:22;14846:53;:::i;:::-;14836:63;;14792:117;14948:2;14974:50;15016:7;15007:6;14996:9;14992:22;14974:50;:::i;:::-;14964:60;;14919:115;14573:468;;;;;:::o;15047:307::-;15108:4;15198:18;15190:6;15187:30;15184:56;;;15220:18;;:::i;:::-;15184:56;15258:29;15280:6;15258:29;:::i;:::-;15250:37;;15342:4;15336;15332:15;15324:23;;15047:307;;;:::o;15360:423::-;15437:5;15462:65;15478:48;15519:6;15478:48;:::i;:::-;15462:65;:::i;:::-;15453:74;;15550:6;15543:5;15536:21;15588:4;15581:5;15577:16;15626:3;15617:6;15612:3;15608:16;15605:25;15602:112;;;15633:79;;:::i;:::-;15602:112;15723:54;15770:6;15765:3;15760;15723:54;:::i;:::-;15443:340;15360:423;;;;;:::o;15802:338::-;15857:5;15906:3;15899:4;15891:6;15887:17;15883:27;15873:122;;15914:79;;:::i;:::-;15873:122;16031:6;16018:20;16056:78;16130:3;16122:6;16115:4;16107:6;16103:17;16056:78;:::i;:::-;16047:87;;15863:277;15802:338;;;;:::o;16146:943::-;16241:6;16249;16257;16265;16314:3;16302:9;16293:7;16289:23;16285:33;16282:120;;;16321:79;;:::i;:::-;16282:120;16441:1;16466:53;16511:7;16502:6;16491:9;16487:22;16466:53;:::i;:::-;16456:63;;16412:117;16568:2;16594:53;16639:7;16630:6;16619:9;16615:22;16594:53;:::i;:::-;16584:63;;16539:118;16696:2;16722:53;16767:7;16758:6;16747:9;16743:22;16722:53;:::i;:::-;16712:63;;16667:118;16852:2;16841:9;16837:18;16824:32;16883:18;16875:6;16872:30;16869:117;;;16905:79;;:::i;:::-;16869:117;17010:62;17064:7;17055:6;17044:9;17040:22;17010:62;:::i;:::-;17000:72;;16795:287;16146:943;;;;;;;:::o;17095:474::-;17163:6;17171;17220:2;17208:9;17199:7;17195:23;17191:32;17188:119;;;17226:79;;:::i;:::-;17188:119;17346:1;17371:53;17416:7;17407:6;17396:9;17392:22;17371:53;:::i;:::-;17361:63;;17317:117;17473:2;17499:53;17544:7;17535:6;17524:9;17520:22;17499:53;:::i;:::-;17489:63;;17444:118;17095:474;;;;;:::o;17575:169::-;17715:21;17711:1;17703:6;17699:14;17692:45;17575:169;:::o;17750:366::-;17892:3;17913:67;17977:2;17972:3;17913:67;:::i;:::-;17906:74;;17989:93;18078:3;17989:93;:::i;:::-;18107:2;18102:3;18098:12;18091:19;;17750:366;;;:::o;18122:419::-;18288:4;18326:2;18315:9;18311:18;18303:26;;18375:9;18369:4;18365:20;18361:1;18350:9;18346:17;18339:47;18403:131;18529:4;18403:131;:::i;:::-;18395:139;;18122:419;;;:::o;18547:180::-;18595:77;18592:1;18585:88;18692:4;18689:1;18682:15;18716:4;18713:1;18706:15;18733:194;18773:4;18793:20;18811:1;18793:20;:::i;:::-;18788:25;;18827:20;18845:1;18827:20;:::i;:::-;18822:25;;18871:1;18868;18864:9;18856:17;;18895:1;18889:4;18886:11;18883:37;;;18900:18;;:::i;:::-;18883:37;18733:194;;;;:::o;18933:226::-;19073:34;19069:1;19061:6;19057:14;19050:58;19142:9;19137:2;19129:6;19125:15;19118:34;18933:226;:::o;19165:366::-;19307:3;19328:67;19392:2;19387:3;19328:67;:::i;:::-;19321:74;;19404:93;19493:3;19404:93;:::i;:::-;19522:2;19517:3;19513:12;19506:19;;19165:366;;;:::o;19537:419::-;19703:4;19741:2;19730:9;19726:18;19718:26;;19790:9;19784:4;19780:20;19776:1;19765:9;19761:17;19754:47;19818:131;19944:4;19818:131;:::i;:::-;19810:139;;19537:419;;;:::o;19962:174::-;20102:26;20098:1;20090:6;20086:14;20079:50;19962:174;:::o;20142:366::-;20284:3;20305:67;20369:2;20364:3;20305:67;:::i;:::-;20298:74;;20381:93;20470:3;20381:93;:::i;:::-;20499:2;20494:3;20490:12;20483:19;;20142:366;;;:::o;20514:419::-;20680:4;20718:2;20707:9;20703:18;20695:26;;20767:9;20761:4;20757:20;20753:1;20742:9;20738:17;20731:47;20795:131;20921:4;20795:131;:::i;:::-;20787:139;;20514:419;;;:::o;20939:170::-;21079:22;21075:1;21067:6;21063:14;21056:46;20939:170;:::o;21115:366::-;21257:3;21278:67;21342:2;21337:3;21278:67;:::i;:::-;21271:74;;21354:93;21443:3;21354:93;:::i;:::-;21472:2;21467:3;21463:12;21456:19;;21115:366;;;:::o;21487:419::-;21653:4;21691:2;21680:9;21676:18;21668:26;;21740:9;21734:4;21730:20;21726:1;21715:9;21711:17;21704:47;21768:131;21894:4;21768:131;:::i;:::-;21760:139;;21487:419;;;:::o;21912:60::-;21940:3;21961:5;21954:12;;21912:60;;;:::o;21978:140::-;22027:9;22060:52;22078:33;22087:23;22104:5;22087:23;:::i;:::-;22078:33;:::i;:::-;22060:52;:::i;:::-;22047:65;;21978:140;;;:::o;22124:129::-;22210:36;22240:5;22210:36;:::i;:::-;22205:3;22198:49;22124:129;;:::o;22259:220::-;22351:4;22389:2;22378:9;22374:18;22366:26;;22402:70;22469:1;22458:9;22454:17;22445:6;22402:70;:::i;:::-;22259:220;;;;:::o;22485:180::-;22533:77;22530:1;22523:88;22630:4;22627:1;22620:15;22654:4;22651:1;22644:15;22671:320;22715:6;22752:1;22746:4;22742:12;22732:22;;22799:1;22793:4;22789:12;22820:18;22810:81;;22876:4;22868:6;22864:17;22854:27;;22810:81;22938:2;22930:6;22927:14;22907:18;22904:38;22901:84;;22957:18;;:::i;:::-;22901:84;22722:269;22671:320;;;:::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:248::-;24160:34;24156:1;24148:6;24144:14;24137:58;24229:31;24224:2;24216:6;24212:15;24205:56;24020:248;:::o;24274:366::-;24416:3;24437:67;24501:2;24496:3;24437:67;:::i;:::-;24430:74;;24513:93;24602:3;24513:93;:::i;:::-;24631:2;24626:3;24622:12;24615:19;;24274:366;;;:::o;24646:419::-;24812:4;24850:2;24839:9;24835:18;24827:26;;24899:9;24893:4;24889:20;24885:1;24874:9;24870:17;24863:47;24927:131;25053:4;24927:131;:::i;:::-;24919:139;;24646:419;;;:::o;25071:332::-;25192:4;25230:2;25219:9;25215:18;25207:26;;25243:71;25311:1;25300:9;25296:17;25287:6;25243:71;:::i;:::-;25324:72;25392:2;25381:9;25377:18;25368:6;25324:72;:::i;:::-;25071:332;;;;;:::o;25409:137::-;25463:5;25494:6;25488:13;25479:22;;25510:30;25534:5;25510:30;:::i;:::-;25409:137;;;;:::o;25552:345::-;25619:6;25668:2;25656:9;25647:7;25643:23;25639:32;25636:119;;;25674:79;;:::i;:::-;25636:119;25794:1;25819:61;25872:7;25863:6;25852:9;25848:22;25819:61;:::i;:::-;25809:71;;25765:125;25552:345;;;;:::o;25903:410::-;25943:7;25966:20;25984:1;25966:20;:::i;:::-;25961:25;;26000:20;26018:1;26000:20;:::i;:::-;25995:25;;26055:1;26052;26048:9;26077:30;26095:11;26077:30;:::i;:::-;26066:41;;26256:1;26247:7;26243:15;26240:1;26237:22;26217:1;26210:9;26190:83;26167:139;;26286:18;;:::i;:::-;26167:139;25951:362;25903:410;;;;:::o;26319:180::-;26367:77;26364:1;26357:88;26464:4;26461:1;26454:15;26488:4;26485:1;26478:15;26505:185;26545:1;26562:20;26580:1;26562:20;:::i;:::-;26557:25;;26596:20;26614:1;26596:20;:::i;:::-;26591:25;;26635:1;26625:35;;26640:18;;:::i;:::-;26625:35;26682:1;26679;26675:9;26670:14;;26505:185;;;;:::o;26696:170::-;26836:22;26832:1;26824:6;26820:14;26813:46;26696:170;:::o;26872:366::-;27014:3;27035:67;27099:2;27094:3;27035:67;:::i;:::-;27028:74;;27111:93;27200:3;27111:93;:::i;:::-;27229:2;27224:3;27220:12;27213:19;;26872:366;;;:::o;27244:419::-;27410:4;27448:2;27437:9;27433:18;27425:26;;27497:9;27491:4;27487:20;27483:1;27472:9;27468:17;27461:47;27525:131;27651:4;27525:131;:::i;:::-;27517:139;;27244:419;;;:::o;27669:231::-;27809:34;27805:1;27797:6;27793:14;27786:58;27878:14;27873:2;27865:6;27861:15;27854:39;27669:231;:::o;27906:366::-;28048:3;28069:67;28133:2;28128:3;28069:67;:::i;:::-;28062:74;;28145:93;28234:3;28145:93;:::i;:::-;28263:2;28258:3;28254:12;28247:19;;27906:366;;;:::o;28278:419::-;28444:4;28482:2;28471:9;28467:18;28459:26;;28531:9;28525:4;28521:20;28517:1;28506:9;28502:17;28495:47;28559:131;28685:4;28559:131;:::i;:::-;28551:139;;28278:419;;;:::o;28703:223::-;28843:34;28839:1;28831:6;28827:14;28820:58;28912:6;28907:2;28899:6;28895:15;28888:31;28703:223;:::o;28932:366::-;29074:3;29095:67;29159:2;29154:3;29095:67;:::i;:::-;29088:74;;29171:93;29260:3;29171:93;:::i;:::-;29289:2;29284:3;29280:12;29273:19;;28932:366;;;:::o;29304:419::-;29470:4;29508:2;29497:9;29493:18;29485:26;;29557:9;29551:4;29547:20;29543:1;29532:9;29528:17;29521:47;29585:131;29711:4;29585:131;:::i;:::-;29577:139;;29304:419;;;:::o;29729:191::-;29769:3;29788:20;29806:1;29788:20;:::i;:::-;29783:25;;29822:20;29840:1;29822:20;:::i;:::-;29817:25;;29865:1;29862;29858:9;29851:16;;29886:3;29883:1;29880:10;29877:36;;;29893:18;;:::i;:::-;29877:36;29729:191;;;;:::o;29926:178::-;30066:30;30062:1;30054:6;30050:14;30043:54;29926:178;:::o;30110:366::-;30252:3;30273:67;30337:2;30332:3;30273:67;:::i;:::-;30266:74;;30349:93;30438:3;30349:93;:::i;:::-;30467:2;30462:3;30458:12;30451:19;;30110:366;;;:::o;30482:419::-;30648:4;30686:2;30675:9;30671:18;30663:26;;30735:9;30729:4;30725:20;30721:1;30710:9;30706:17;30699:47;30763:131;30889:4;30763:131;:::i;:::-;30755:139;;30482:419;;;:::o;30907:178::-;31047:30;31043:1;31035:6;31031:14;31024:54;30907:178;:::o;31091:366::-;31233:3;31254:67;31318:2;31313:3;31254:67;:::i;:::-;31247:74;;31330:93;31419:3;31330:93;:::i;:::-;31448:2;31443:3;31439:12;31432:19;;31091:366;;;:::o;31463:419::-;31629:4;31667:2;31656:9;31652:18;31644:26;;31716:9;31710:4;31706:20;31702:1;31691:9;31687:17;31680:47;31744:131;31870:4;31744:131;:::i;:::-;31736:139;;31463:419;;;:::o;31888:180::-;31936:77;31933:1;31926:88;32033:4;32030:1;32023:15;32057:4;32054:1;32047:15;32074:170;32214:22;32210:1;32202:6;32198:14;32191:46;32074:170;:::o;32250:366::-;32392:3;32413:67;32477:2;32472:3;32413:67;:::i;:::-;32406:74;;32489:93;32578:3;32489:93;:::i;:::-;32607:2;32602:3;32598:12;32591:19;;32250:366;;;:::o;32622:419::-;32788:4;32826:2;32815:9;32811:18;32803:26;;32875:9;32869:4;32865:20;32861:1;32850:9;32846:17;32839:47;32903:131;33029:4;32903:131;:::i;:::-;32895:139;;32622:419;;;:::o;33047:177::-;33187:29;33183:1;33175:6;33171:14;33164:53;33047:177;:::o;33230:366::-;33372:3;33393:67;33457:2;33452:3;33393:67;:::i;:::-;33386:74;;33469:93;33558:3;33469:93;:::i;:::-;33587:2;33582:3;33578:12;33571:19;;33230:366;;;:::o;33602:419::-;33768:4;33806:2;33795:9;33791:18;33783:26;;33855:9;33849:4;33845:20;33841:1;33830:9;33826:17;33819:47;33883:131;34009:4;33883:131;:::i;:::-;33875:139;;33602:419;;;:::o;34027:233::-;34066:3;34089:24;34107:5;34089:24;:::i;:::-;34080:33;;34135:66;34128:5;34125:77;34122:103;;34205:18;;:::i;:::-;34122:103;34252:1;34245:5;34241:13;34234:20;;34027:233;;;:::o;34266:182::-;34406:34;34402:1;34394:6;34390:14;34383:58;34266:182;:::o;34454:366::-;34596:3;34617:67;34681:2;34676:3;34617:67;:::i;:::-;34610:74;;34693:93;34782:3;34693:93;:::i;:::-;34811:2;34806:3;34802:12;34795:19;;34454:366;;;:::o;34826:419::-;34992:4;35030:2;35019:9;35015:18;35007:26;;35079:9;35073:4;35069:20;35065:1;35054:9;35050:17;35043:47;35107:131;35233:4;35107:131;:::i;:::-;35099:139;;34826:419;;;:::o;35251:175::-;35391:27;35387:1;35379:6;35375:14;35368:51;35251:175;:::o;35432:366::-;35574:3;35595:67;35659:2;35654:3;35595:67;:::i;:::-;35588:74;;35671:93;35760:3;35671:93;:::i;:::-;35789:2;35784:3;35780:12;35773:19;;35432:366;;;:::o;35804:419::-;35970:4;36008:2;35997:9;35993:18;35985:26;;36057:9;36051:4;36047:20;36043:1;36032:9;36028:17;36021:47;36085:131;36211:4;36085:131;:::i;:::-;36077:139;;35804:419;;;:::o;36229:180::-;36369:32;36365:1;36357:6;36353:14;36346:56;36229:180;:::o;36415:366::-;36557:3;36578:67;36642:2;36637:3;36578:67;:::i;:::-;36571:74;;36654:93;36743:3;36654:93;:::i;:::-;36772:2;36767:3;36763:12;36756:19;;36415:366;;;:::o;36787:419::-;36953:4;36991:2;36980:9;36976:18;36968:26;;37040:9;37034:4;37030:20;37026:1;37015:9;37011:17;37004:47;37068:131;37194:4;37068:131;:::i;:::-;37060:139;;36787:419;;;:::o;37212:233::-;37352:34;37348:1;37340:6;37336:14;37329:58;37421:16;37416:2;37408:6;37404:15;37397:41;37212:233;:::o;37451:366::-;37593:3;37614:67;37678:2;37673:3;37614:67;:::i;:::-;37607:74;;37690:93;37779:3;37690:93;:::i;:::-;37808:2;37803:3;37799:12;37792:19;;37451:366;;;:::o;37823:419::-;37989:4;38027:2;38016:9;38012:18;38004:26;;38076:9;38070:4;38066:20;38062:1;38051:9;38047:17;38040:47;38104:131;38230:4;38104:131;:::i;:::-;38096:139;;37823:419;;;:::o;38248:223::-;38388:34;38384:1;38376:6;38372:14;38365:58;38457:6;38452:2;38444:6;38440:15;38433:31;38248:223;:::o;38477:366::-;38619:3;38640:67;38704:2;38699:3;38640:67;:::i;:::-;38633:74;;38716:93;38805:3;38716:93;:::i;:::-;38834:2;38829:3;38825:12;38818:19;;38477:366;;;:::o;38849:419::-;39015:4;39053:2;39042:9;39038:18;39030:26;;39102:9;39096:4;39092:20;39088:1;39077:9;39073:17;39066:47;39130:131;39256:4;39130:131;:::i;:::-;39122:139;;38849:419;;;:::o;39274:181::-;39414:33;39410:1;39402:6;39398:14;39391:57;39274:181;:::o;39461:366::-;39603:3;39624:67;39688:2;39683:3;39624:67;:::i;:::-;39617:74;;39700:93;39789:3;39700:93;:::i;:::-;39818:2;39813:3;39809:12;39802:19;;39461:366;;;:::o;39833:419::-;39999:4;40037:2;40026:9;40022:18;40014:26;;40086:9;40080:4;40076:20;40072:1;40061:9;40057:17;40050:47;40114:131;40240:4;40114:131;:::i;:::-;40106:139;;39833:419;;;:::o;40258:173::-;40398:25;40394:1;40386:6;40382:14;40375:49;40258:173;:::o;40437:366::-;40579:3;40600:67;40664:2;40659:3;40600:67;:::i;:::-;40593:74;;40676:93;40765:3;40676:93;:::i;:::-;40794:2;40789:3;40785:12;40778:19;;40437:366;;;:::o;40809:419::-;40975:4;41013:2;41002:9;40998:18;40990:26;;41062:9;41056:4;41052:20;41048:1;41037:9;41033:17;41026:47;41090:131;41216:4;41090:131;:::i;:::-;41082:139;;40809:419;;;:::o;41234:168::-;41374:20;41370:1;41362:6;41358:14;41351:44;41234:168;:::o;41408:366::-;41550:3;41571:67;41635:2;41630:3;41571:67;:::i;:::-;41564:74;;41647:93;41736:3;41647:93;:::i;:::-;41765:2;41760:3;41756:12;41749:19;;41408:366;;;:::o;41780:419::-;41946:4;41984:2;41973:9;41969:18;41961:26;;42033:9;42027:4;42023:20;42019:1;42008:9;42004:17;41997:47;42061:131;42187:4;42061:131;:::i;:::-;42053:139;;41780:419;;;:::o;42205:147::-;42306:11;42343:3;42328:18;;42205:147;;;;:::o;42358:114::-;;:::o;42478:398::-;42637:3;42658:83;42739:1;42734:3;42658:83;:::i;:::-;42651:90;;42750:93;42839:3;42750:93;:::i;:::-;42868:1;42863:3;42859:11;42852:18;;42478:398;;;:::o;42882:379::-;43066:3;43088:147;43231:3;43088:147;:::i;:::-;43081:154;;43252:3;43245:10;;42882:379;;;:::o;43267:174::-;43407:26;43403:1;43395:6;43391:14;43384:50;43267:174;:::o;43447:366::-;43589:3;43610:67;43674:2;43669:3;43610:67;:::i;:::-;43603:74;;43686:93;43775:3;43686:93;:::i;:::-;43804:2;43799:3;43795:12;43788:19;;43447:366;;;:::o;43819:419::-;43985:4;44023:2;44012:9;44008:18;44000:26;;44072:9;44066:4;44062:20;44058:1;44047:9;44043:17;44036:47;44100:131;44226:4;44100:131;:::i;:::-;44092:139;;43819:419;;;:::o;44244:171::-;44384:23;44380:1;44372:6;44368:14;44361:47;44244:171;:::o;44421:366::-;44563:3;44584:67;44648:2;44643:3;44584:67;:::i;:::-;44577:74;;44660:93;44749:3;44660:93;:::i;:::-;44778:2;44773:3;44769:12;44762:19;;44421:366;;;:::o;44793:419::-;44959:4;44997:2;44986:9;44982:18;44974:26;;45046:9;45040:4;45036:20;45032:1;45021:9;45017:17;45010:47;45074:131;45200:4;45074:131;:::i;:::-;45066:139;;44793:419;;;:::o;45218:177::-;45358:29;45354:1;45346:6;45342:14;45335:53;45218:177;:::o;45401:366::-;45543:3;45564:67;45628:2;45623:3;45564:67;:::i;:::-;45557:74;;45640:93;45729:3;45640:93;:::i;:::-;45758:2;45753:3;45749:12;45742:19;;45401:366;;;:::o;45773:419::-;45939:4;45977:2;45966:9;45962:18;45954:26;;46026:9;46020:4;46016:20;46012:1;46001:9;45997:17;45990:47;46054:131;46180:4;46054:131;:::i;:::-;46046:139;;45773:419;;;:::o;46198:178::-;46338:30;46334:1;46326:6;46322:14;46315:54;46198:178;:::o;46382:366::-;46524:3;46545:67;46609:2;46604:3;46545:67;:::i;:::-;46538:74;;46621:93;46710:3;46621:93;:::i;:::-;46739:2;46734:3;46730:12;46723:19;;46382:366;;;:::o;46754:419::-;46920:4;46958:2;46947:9;46943:18;46935:26;;47007:9;47001:4;46997:20;46993:1;46982:9;46978:17;46971:47;47035:131;47161:4;47035:131;:::i;:::-;47027:139;;46754:419;;;:::o;47179:231::-;47319:34;47315:1;47307:6;47303:14;47296:58;47388:14;47383:2;47375:6;47371:15;47364:39;47179:231;:::o;47416:366::-;47558:3;47579:67;47643:2;47638:3;47579:67;:::i;:::-;47572:74;;47655:93;47744:3;47655:93;:::i;:::-;47773:2;47768:3;47764:12;47757:19;;47416:366;;;:::o;47788:419::-;47954:4;47992:2;47981:9;47977:18;47969:26;;48041:9;48035:4;48031:20;48027:1;48016:9;48012:17;48005:47;48069:131;48195:4;48069:131;:::i;:::-;48061:139;;47788:419;;;:::o;48213:141::-;48262:4;48285:3;48277:11;;48308:3;48305:1;48298:14;48342:4;48339:1;48329:18;48321:26;;48213:141;;;:::o;48360:93::-;48397:6;48444:2;48439;48432:5;48428:14;48424:23;48414:33;;48360:93;;;:::o;48459:107::-;48503:8;48553:5;48547:4;48543:16;48522:37;;48459:107;;;;:::o;48572:393::-;48641:6;48691:1;48679:10;48675:18;48714:97;48744:66;48733:9;48714:97;:::i;:::-;48832:39;48862:8;48851:9;48832:39;:::i;:::-;48820:51;;48904:4;48900:9;48893:5;48889:21;48880:30;;48953:4;48943:8;48939:19;48932:5;48929:30;48919:40;;48648:317;;48572:393;;;;;:::o;48971:142::-;49021:9;49054:53;49072:34;49081:24;49099:5;49081:24;:::i;:::-;49072:34;:::i;:::-;49054:53;:::i;:::-;49041:66;;48971:142;;;:::o;49119:75::-;49162:3;49183:5;49176:12;;49119:75;;;:::o;49200:269::-;49310:39;49341:7;49310:39;:::i;:::-;49371:91;49420:41;49444:16;49420:41;:::i;:::-;49412:6;49405:4;49399:11;49371:91;:::i;:::-;49365:4;49358:105;49276:193;49200:269;;;:::o;49475:73::-;49520:3;49475:73;:::o;49554:189::-;49631:32;;:::i;:::-;49672:65;49730:6;49722;49716:4;49672:65;:::i;:::-;49607:136;49554:189;;:::o;49749:186::-;49809:120;49826:3;49819:5;49816:14;49809:120;;;49880:39;49917:1;49910:5;49880:39;:::i;:::-;49853:1;49846:5;49842:13;49833:22;;49809:120;;;49749:186;;:::o;49941:543::-;50042:2;50037:3;50034:11;50031:446;;;50076:38;50108:5;50076:38;:::i;:::-;50160:29;50178:10;50160:29;:::i;:::-;50150:8;50146:44;50343:2;50331:10;50328:18;50325:49;;;50364:8;50349:23;;50325:49;50387:80;50443:22;50461:3;50443:22;:::i;:::-;50433:8;50429:37;50416:11;50387:80;:::i;:::-;50046:431;;50031:446;49941:543;;;:::o;50490:117::-;50544:8;50594:5;50588:4;50584:16;50563:37;;50490:117;;;;:::o;50613:169::-;50657:6;50690:51;50738:1;50734:6;50726:5;50723:1;50719:13;50690:51;:::i;:::-;50686:56;50771:4;50765;50761:15;50751:25;;50664:118;50613:169;;;;:::o;50787:295::-;50863:4;51009:29;51034:3;51028:4;51009:29;:::i;:::-;51001:37;;51071:3;51068:1;51064:11;51058:4;51055:21;51047:29;;50787:295;;;;:::o;51087:1395::-;51204:37;51237:3;51204:37;:::i;:::-;51306:18;51298:6;51295:30;51292:56;;;51328:18;;:::i;:::-;51292:56;51372:38;51404:4;51398:11;51372:38;:::i;:::-;51457:67;51517:6;51509;51503:4;51457:67;:::i;:::-;51551:1;51575:4;51562:17;;51607:2;51599:6;51596:14;51624:1;51619:618;;;;52281:1;52298:6;52295:77;;;52347:9;52342:3;52338:19;52332:26;52323:35;;52295:77;52398:67;52458:6;52451:5;52398:67;:::i;:::-;52392:4;52385:81;52254:222;51589:887;;51619:618;51671:4;51667:9;51659:6;51655:22;51705:37;51737:4;51705:37;:::i;:::-;51764:1;51778:208;51792:7;51789:1;51786:14;51778:208;;;51871:9;51866:3;51862:19;51856:26;51848:6;51841:42;51922:1;51914:6;51910:14;51900:24;;51969:2;51958:9;51954:18;51941:31;;51815:4;51812:1;51808:12;51803:17;;51778:208;;;52014:6;52005:7;52002:19;51999:179;;;52072:9;52067:3;52063:19;52057:26;52115:48;52157:4;52149:6;52145:17;52134:9;52115:48;:::i;:::-;52107:6;52100:64;52022:156;51999:179;52224:1;52220;52212:6;52208:14;52204:22;52198:4;52191:36;51626:611;;;51589:887;;51179:1303;;;51087:1395;;:::o;52488:174::-;52628:26;52624:1;52616:6;52612:14;52605:50;52488:174;:::o;52668:366::-;52810:3;52831:67;52895:2;52890:3;52831:67;:::i;:::-;52824:74;;52907:93;52996:3;52907:93;:::i;:::-;53025:2;53020:3;53016:12;53009:19;;52668:366;;;:::o;53040:419::-;53206:4;53244:2;53233:9;53229:18;53221:26;;53293:9;53287:4;53283:20;53279:1;53268:9;53264:17;53257:47;53321:131;53447:4;53321:131;:::i;:::-;53313:139;;53040:419;;;:::o;53465:222::-;53605:34;53601:1;53593:6;53589:14;53582:58;53674:5;53669:2;53661:6;53657:15;53650:30;53465:222;:::o;53693:366::-;53835:3;53856:67;53920:2;53915:3;53856:67;:::i;:::-;53849:74;;53932:93;54021:3;53932:93;:::i;:::-;54050:2;54045:3;54041:12;54034:19;;53693:366;;;:::o;54065:419::-;54231:4;54269:2;54258:9;54254:18;54246:26;;54318:9;54312:4;54308:20;54304:1;54293:9;54289:17;54282:47;54346:131;54472:4;54346:131;:::i;:::-;54338:139;;54065:419;;;:::o;54490:228::-;54630:34;54626:1;54618:6;54614:14;54607:58;54699:11;54694:2;54686:6;54682:15;54675:36;54490:228;:::o;54724:366::-;54866:3;54887:67;54951:2;54946:3;54887:67;:::i;:::-;54880:74;;54963:93;55052:3;54963:93;:::i;:::-;55081:2;55076:3;55072:12;55065:19;;54724:366;;;:::o;55096:419::-;55262:4;55300:2;55289:9;55285:18;55277:26;;55349:9;55343:4;55339:20;55335:1;55324:9;55320:17;55313:47;55377:131;55503:4;55377:131;:::i;:::-;55369:139;;55096:419;;;:::o;55521:170::-;55661:22;55657:1;55649:6;55645:14;55638:46;55521:170;:::o;55697:366::-;55839:3;55860:67;55924:2;55919:3;55860:67;:::i;:::-;55853:74;;55936:93;56025:3;55936:93;:::i;:::-;56054:2;56049:3;56045:12;56038:19;;55697:366;;;:::o;56069:419::-;56235:4;56273:2;56262:9;56258:18;56250:26;;56322:9;56316:4;56312:20;56308:1;56297:9;56293:17;56286:47;56350:131;56476:4;56350:131;:::i;:::-;56342:139;;56069:419;;;:::o;56494:234::-;56634:34;56630:1;56622:6;56618:14;56611:58;56703:17;56698:2;56690:6;56686:15;56679:42;56494:234;:::o;56734:366::-;56876:3;56897:67;56961:2;56956:3;56897:67;:::i;:::-;56890:74;;56973:93;57062:3;56973:93;:::i;:::-;57091:2;57086:3;57082:12;57075:19;;56734:366;;;:::o;57106:419::-;57272:4;57310:2;57299:9;57295:18;57287:26;;57359:9;57353:4;57349:20;57345:1;57334:9;57330:17;57323:47;57387:131;57513:4;57387:131;:::i;:::-;57379:139;;57106:419;;;:::o;57531:148::-;57633:11;57670:3;57655:18;;57531:148;;;;:::o;57709:874::-;57812:3;57849:5;57843:12;57878:36;57904:9;57878:36;:::i;:::-;57930:89;58012:6;58007:3;57930:89;:::i;:::-;57923:96;;58050:1;58039:9;58035:17;58066:1;58061:166;;;;58241:1;58236:341;;;;58028:549;;58061:166;58145:4;58141:9;58130;58126:25;58121:3;58114:38;58207:6;58200:14;58193:22;58185:6;58181:35;58176:3;58172:45;58165:52;;58061:166;;58236:341;58303:38;58335:5;58303:38;:::i;:::-;58363:1;58377:154;58391:6;58388:1;58385:13;58377:154;;;58465:7;58459:14;58455:1;58450:3;58446:11;58439:35;58515:1;58506:7;58502:15;58491:26;;58413:4;58410:1;58406:12;58401:17;;58377:154;;;58560:6;58555:3;58551:16;58544:23;;58243:334;;58028:549;;57816:767;;57709:874;;;;:::o;58589:163::-;58729:15;58725:1;58717:6;58713:14;58706:39;58589:163;:::o;58758:402::-;58918:3;58939:85;59021:2;59016:3;58939:85;:::i;:::-;58932:92;;59033:93;59122:3;59033:93;:::i;:::-;59151:2;59146:3;59142:12;59135:19;;58758:402;;;:::o;59166:535::-;59396:3;59418:92;59506:3;59497:6;59418:92;:::i;:::-;59411:99;;59527:148;59671:3;59527:148;:::i;:::-;59520:155;;59692:3;59685:10;;59166:535;;;;:::o;59707:390::-;59813:3;59841:39;59874:5;59841:39;:::i;:::-;59896:89;59978:6;59973:3;59896:89;:::i;:::-;59889:96;;59994:65;60052:6;60047:3;60040:4;60033:5;60029:16;59994:65;:::i;:::-;60084:6;60079:3;60075:16;60068:23;;59817:280;59707:390;;;;:::o;60103:155::-;60243:7;60239:1;60231:6;60227:14;60220:31;60103:155;:::o;60264:400::-;60424:3;60445:84;60527:1;60522:3;60445:84;:::i;:::-;60438:91;;60538:93;60627:3;60538:93;:::i;:::-;60656:1;60651:3;60647:11;60640:18;;60264:400;;;:::o;60670:695::-;60948:3;60970:92;61058:3;61049:6;60970:92;:::i;:::-;60963:99;;61079:95;61170:3;61161:6;61079:95;:::i;:::-;61072:102;;61191:148;61335:3;61191:148;:::i;:::-;61184:155;;61356:3;61349:10;;60670:695;;;;;:::o;61371:163::-;61511:15;61507:1;61499:6;61495:14;61488:39;61371:163;:::o;61540:402::-;61700:3;61721:85;61803:2;61798:3;61721:85;:::i;:::-;61714:92;;61815:93;61904:3;61815:93;:::i;:::-;61933:2;61928:3;61924:12;61917:19;;61540:402;;;:::o;61948:535::-;62178:3;62200:92;62288:3;62279:6;62200:92;:::i;:::-;62193:99;;62309:148;62453:3;62309:148;:::i;:::-;62302:155;;62474:3;62467:10;;61948:535;;;;:::o;62489:225::-;62629:34;62625:1;62617:6;62613:14;62606:58;62698:8;62693:2;62685:6;62681:15;62674:33;62489:225;:::o;62720:366::-;62862:3;62883:67;62947:2;62942:3;62883:67;:::i;:::-;62876:74;;62959:93;63048:3;62959:93;:::i;:::-;63077:2;63072:3;63068:12;63061:19;;62720:366;;;:::o;63092:419::-;63258:4;63296:2;63285:9;63281:18;63273:26;;63345:9;63339:4;63335:20;63331:1;63320:9;63316:17;63309:47;63373:131;63499:4;63373:131;:::i;:::-;63365:139;;63092:419;;;:::o;63517:182::-;63657:34;63653:1;63645:6;63641:14;63634:58;63517:182;:::o;63705:366::-;63847:3;63868:67;63932:2;63927:3;63868:67;:::i;:::-;63861:74;;63944:93;64033:3;63944:93;:::i;:::-;64062:2;64057:3;64053:12;64046:19;;63705:366;;;:::o;64077:419::-;64243:4;64281:2;64270:9;64266:18;64258:26;;64330:9;64324:4;64320:20;64316:1;64305:9;64301:17;64294:47;64358:131;64484:4;64358:131;:::i;:::-;64350:139;;64077:419;;;:::o;64502:330::-;64622:4;64660:2;64649:9;64645:18;64637:26;;64673:70;64740:1;64729:9;64725:17;64716:6;64673:70;:::i;:::-;64753:72;64821:2;64810:9;64806:18;64797:6;64753:72;:::i;:::-;64502:330;;;;;:::o;64838:232::-;64978:34;64974:1;64966:6;64962:14;64955:58;65047:15;65042:2;65034:6;65030:15;65023:40;64838:232;:::o;65076:366::-;65218:3;65239:67;65303:2;65298:3;65239:67;:::i;:::-;65232:74;;65315:93;65404:3;65315:93;:::i;:::-;65433:2;65428:3;65424:12;65417:19;;65076:366;;;:::o;65448:419::-;65614:4;65652:2;65641:9;65637:18;65629:26;;65701:9;65695:4;65691:20;65687:1;65676:9;65672:17;65665:47;65729:131;65855:4;65729:131;:::i;:::-;65721:139;;65448:419;;;:::o;65873:181::-;66013:33;66009:1;66001:6;65997:14;65990:57;65873:181;:::o;66060:366::-;66202:3;66223:67;66287:2;66282:3;66223:67;:::i;:::-;66216:74;;66299:93;66388:3;66299:93;:::i;:::-;66417:2;66412:3;66408:12;66401:19;;66060:366;;;:::o;66432:419::-;66598:4;66636:2;66625:9;66621:18;66613:26;;66685:9;66679:4;66675:20;66671:1;66660:9;66656:17;66649:47;66713:131;66839:4;66713:131;:::i;:::-;66705:139;;66432:419;;;:::o;66857:175::-;66997:27;66993:1;66985:6;66981:14;66974:51;66857:175;:::o;67038:366::-;67180:3;67201:67;67265:2;67260:3;67201:67;:::i;:::-;67194:74;;67277:93;67366:3;67277:93;:::i;:::-;67395:2;67390:3;67386:12;67379:19;;67038:366;;;:::o;67410:419::-;67576:4;67614:2;67603:9;67599:18;67591:26;;67663:9;67657:4;67653:20;67649:1;67638:9;67634:17;67627:47;67691:131;67817:4;67691:131;:::i;:::-;67683:139;;67410:419;;;:::o;67835:176::-;67867:1;67884:20;67902:1;67884:20;:::i;:::-;67879:25;;67918:20;67936:1;67918:20;:::i;:::-;67913:25;;67957:1;67947:35;;67962:18;;:::i;:::-;67947:35;68003:1;68000;67996:9;67991:14;;67835:176;;;;:::o;68017:224::-;68157:34;68153:1;68145:6;68141:14;68134:58;68226:7;68221:2;68213:6;68209:15;68202:32;68017:224;:::o;68247:366::-;68389:3;68410:67;68474:2;68469:3;68410:67;:::i;:::-;68403:74;;68486:93;68575:3;68486:93;:::i;:::-;68604:2;68599:3;68595:12;68588:19;;68247:366;;;:::o;68619:419::-;68785:4;68823:2;68812:9;68808:18;68800:26;;68872:9;68866:4;68862:20;68858:1;68847:9;68843:17;68836:47;68900:131;69026:4;68900:131;:::i;:::-;68892:139;;68619:419;;;:::o;69044:223::-;69184:34;69180:1;69172:6;69168:14;69161:58;69253:6;69248:2;69240:6;69236:15;69229:31;69044:223;:::o;69273:366::-;69415:3;69436:67;69500:2;69495:3;69436:67;:::i;:::-;69429:74;;69512:93;69601:3;69512:93;:::i;:::-;69630:2;69625:3;69621:12;69614:19;;69273:366;;;:::o;69645:419::-;69811:4;69849:2;69838:9;69834:18;69826:26;;69898:9;69892:4;69888:20;69884:1;69873:9;69869:17;69862:47;69926:131;70052:4;69926:131;:::i;:::-;69918:139;;69645:419;;;:::o;70070:237::-;70210:34;70206:1;70198:6;70194:14;70187:58;70279:20;70274:2;70266:6;70262:15;70255:45;70070:237;:::o;70313:366::-;70455:3;70476:67;70540:2;70535:3;70476:67;:::i;:::-;70469:74;;70552:93;70641:3;70552:93;:::i;:::-;70670:2;70665:3;70661:12;70654:19;;70313:366;;;:::o;70685:419::-;70851:4;70889:2;70878:9;70874:18;70866:26;;70938:9;70932:4;70928:20;70924:1;70913:9;70909:17;70902:47;70966:131;71092:4;70966:131;:::i;:::-;70958:139;;70685:419;;;:::o;71110:182::-;71250:34;71246:1;71238:6;71234:14;71227:58;71110:182;:::o;71298:366::-;71440:3;71461:67;71525:2;71520:3;71461:67;:::i;:::-;71454:74;;71537:93;71626:3;71537:93;:::i;:::-;71655:2;71650:3;71646:12;71639:19;;71298:366;;;:::o;71670:419::-;71836:4;71874:2;71863:9;71859:18;71851:26;;71923:9;71917:4;71913:20;71909:1;71898:9;71894:17;71887:47;71951:131;72077:4;71951:131;:::i;:::-;71943:139;;71670:419;;;:::o;72095:178::-;72235:30;72231:1;72223:6;72219:14;72212:54;72095:178;:::o;72279:366::-;72421:3;72442:67;72506:2;72501:3;72442:67;:::i;:::-;72435:74;;72518:93;72607:3;72518:93;:::i;:::-;72636:2;72631:3;72627:12;72620:19;;72279:366;;;:::o;72651:419::-;72817:4;72855:2;72844:9;72840:18;72832:26;;72904:9;72898:4;72894:20;72890:1;72879:9;72875:17;72868:47;72932:131;73058:4;72932:131;:::i;:::-;72924:139;;72651:419;;;:::o;73076:98::-;73127:6;73161:5;73155:12;73145:22;;73076:98;;;:::o;73180:168::-;73263:11;73297:6;73292:3;73285:19;73337:4;73332:3;73328:14;73313:29;;73180:168;;;;:::o;73354:373::-;73440:3;73468:38;73500:5;73468:38;:::i;:::-;73522:70;73585:6;73580:3;73522:70;:::i;:::-;73515:77;;73601:65;73659:6;73654:3;73647:4;73640:5;73636:16;73601:65;:::i;:::-;73691:29;73713:6;73691:29;:::i;:::-;73686:3;73682:39;73675:46;;73444:283;73354:373;;;;:::o;73733:640::-;73928:4;73966:3;73955:9;73951:19;73943:27;;73980:71;74048:1;74037:9;74033:17;74024:6;73980:71;:::i;:::-;74061:72;74129:2;74118:9;74114:18;74105:6;74061:72;:::i;:::-;74143;74211:2;74200:9;74196:18;74187:6;74143:72;:::i;:::-;74262:9;74256:4;74252:20;74247:2;74236:9;74232:18;74225:48;74290:76;74361:4;74352:6;74290:76;:::i;:::-;74282:84;;73733:640;;;;;;;:::o;74379:141::-;74435:5;74466:6;74460:13;74451:22;;74482:32;74508:5;74482:32;:::i;:::-;74379:141;;;;:::o;74526:349::-;74595:6;74644:2;74632:9;74623:7;74619:23;74615:32;74612:119;;;74650:79;;:::i;:::-;74612:119;74770:1;74795:63;74850:7;74841:6;74830:9;74826:22;74795:63;:::i;:::-;74785:73;;74741:127;74526:349;;;;:::o

Swarm Source

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