ETH Price: $3,385.71 (-1.78%)
Gas: 1 Gwei

Token

Fantasy World CUP NFT (FWCNFT)
 

Overview

Max Total Supply

274 FWCNFT

Holders

80

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 FWCNFT
0x0d5da38c9ec77c50c1aad5e58341338882299e82
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:
FantasyWorlCupNFT

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-29
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/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: @openzeppelin/contracts/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: 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 nor 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 nor approved");

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @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.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


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

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: contracts/Ca.sol


pragma solidity ^0.8.16;







contract FantasyWorlCupNFT is ERC721, ERC721URIStorage, ERC721Enumerable, Ownable  {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;

    mapping(string => uint8) existingURIs;
    mapping(address => bool) boughtWallets;

    mapping (uint256 => uint256) nftCounters;

    uint256 public priceToken = 10000000000000000;

    uint256 public priceLuckyNative = 1;

    
    uint256 public priceNative = 25000000000000000;

    uint256 public priceLuckyToken = 1;

    
    uint256 public luckyCount = 0;

     // needs to be unlocked for the `_mint()` function in constructor
    bool public locked = true;

    address [] public ownerAddress;

    address tokenContract = 0x20913d93c7FB11D163CeFE62F4ee8c2F815fE5d9;

    address developmentAddress = 0xf1A23A37BDB477aC8687490c0B4C5a1A320Abc43;
 
    constructor() ERC721("Fantasy World CUP NFT", "FWCNFT") {}

       function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override(ERC721, ERC721Enumerable) {
        require(locked!=true, "Transfer locked");
        super._beforeTokenTransfer(from, to, tokenId);
    }


    function getAddressArray() external view returns (address [] memory ) {
    return ownerAddress;
}

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function _baseURI() internal pure override returns (string memory) {
        return "ipfs://";
    }

    function setPriceNative(uint256 newPriceNative) external onlyOwner{
        priceNative = newPriceNative;
    }
    
    function setPriceToken(uint256 newPriceToken) external onlyOwner{
        priceToken = newPriceToken;
    }

    function setPriceLuckyToken(uint256 newPriceLuckyToken) external onlyOwner{
        priceLuckyToken = newPriceLuckyToken;
    }

       function setPriceLuckyNative(uint256 newPriceLuckyNative) external onlyOwner{
        priceLuckyNative = newPriceLuckyNative;
    }

      function setTokenAddress(address tokenAddressNew) external onlyOwner{
        tokenContract = tokenAddressNew;
    }


    function manualETH(uint256 amountPercentage) external onlyOwner{  
        uint256 amountETH = address(this).balance;
        payable(developmentAddress).transfer(amountETH * amountPercentage / 100);
    }

     function manualTokenTransfer() external onlyOwner{  
        uint256 bal = IERC20(tokenContract).balanceOf(address(this));
        IERC20(tokenContract).transfer(developmentAddress, bal);
     }
    



    function safeMint(address to, string memory uri) public onlyOwner {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
        existingURIs[uri] = 1;
    }

    // The following functions are overrides required by Solidity.

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function isContentOwned(string memory uri) public view returns (bool) {
        return existingURIs[uri] == 1;
    }

    function payToMintNative(
        uint256 whichNFT,
        string [] memory metadataURI,
        bytes32 _hashedMessage, 
        uint8 _v, 
        bytes32 _r, 
        bytes32 _s
    ) public payable  {
       require(VerifyMessage(_hashedMessage,_v,_r,_s)==msg.sender);
         require (msg.value >= priceNative, "Need to pay up!");       
        ownerAddress.push(msg.sender);
        boughtWallets[msg.sender]=true; 
         for (uint i = 0; i < 6; i++) {
            uint256 newItemId = _tokenIdCounter.current();
            counterIncrement(whichNFT);
            _tokenIdCounter.increment();
            

            _mint(msg.sender, newItemId);
            _setTokenURI(newItemId, metadataURI[i]);
        }

    }

        function payToMintToken(
        uint256 whichNFT,
        uint256 amount,
        string [] memory metadataURI,
        bytes32 _hashedMessage, 
        uint8 _v, 
        bytes32 _r, 
        bytes32 _s
    ) public payable  {
       require(VerifyMessage(_hashedMessage,_v,_r,_s)==msg.sender);
       require (amount >= priceToken, "Need to pay up!");  
    
        IERC20(tokenContract).transferFrom(msg.sender, address(this), amount);
        ownerAddress.push(msg.sender);
        boughtWallets[msg.sender]=true; 
         for (uint i = 0; i < 6; i++) {
            uint256 newItemId = _tokenIdCounter.current();
            counterIncrement(whichNFT);
            _tokenIdCounter.increment();

            _mint(msg.sender, newItemId);
            _setTokenURI(newItemId, metadataURI[i]);
        }

    }

        
    function feelingLuckyToken(
        uint256 whichNFT,
        uint256 amount,
        string memory metadataURI,
        bytes32 _hashedMessage, 
        uint8 _v, 
        bytes32 _r, 
        bytes32 _s
    ) public payable  {
  
       require (amount >= priceLuckyToken, "Need to pay up!");
        require(VerifyMessage(_hashedMessage,_v,_r,_s)==msg.sender);
        luckyCount+=1;
        boughtWallets[msg.sender]=true;
            uint256 newItemId = _tokenIdCounter.current();
            counterIncrement(whichNFT);
            _tokenIdCounter.increment();
            IERC20(tokenContract).transferFrom(msg.sender, address(this), amount);

            _mint(msg.sender, newItemId);
            _setTokenURI(newItemId, metadataURI);
    }

    function feelingLuckyNative(
        uint256 whichNFT,
        string memory metadataURI,
        bytes32 _hashedMessage, 
        uint8 _v, 
        bytes32 _r, 
        bytes32 _s
    ) public payable  {
        require (msg.value >= priceLuckyNative, "Need to pay up!");
        require(VerifyMessage(_hashedMessage,_v,_r,_s)==msg.sender);
        boughtWallets[msg.sender]=true;
        luckyCount+=1;
            uint256 newItemId = _tokenIdCounter.current();
            counterIncrement(whichNFT);
            _tokenIdCounter.increment();
            _mint(msg.sender, newItemId);
            _setTokenURI(newItemId, metadataURI);
    }

    function ownerBuySingle(
        uint256 whichNFT,
        string memory metadataURI
    ) external onlyOwner  {
            uint256 newItemId = _tokenIdCounter.current();
            counterIncrement(whichNFT);
            _tokenIdCounter.increment();
            _mint(msg.sender, newItemId);
            _setTokenURI(newItemId, metadataURI);
    }

    function ownerBuyBulk(
        uint256 whichNFT,
        string [] memory metadataURI
    ) external onlyOwner  {
            for (uint i = 0; i < metadataURI.length; i++) 
            {
            uint256 newItemId = _tokenIdCounter.current();
            counterIncrement(whichNFT);
            _tokenIdCounter.increment();
            _mint(msg.sender, newItemId);
            _setTokenURI(newItemId, metadataURI[i]);
        }
    }

    function count() public view returns (uint256) {
        return _tokenIdCounter.current();
    }

    function counterIncrement(uint256 nft) internal {
        uint256 nftCounter = nftCounters[nft];
        nftCounter+=1;
        nftCounters[nft]=nftCounter;

    }

    function setLocked(bool _locked) external onlyOwner {
        locked = _locked;
    }

    function VerifyMessage(bytes32 _hashedMessage, uint8 _v, bytes32 _r, bytes32 _s) internal pure returns (address) {
        bytes memory prefix = "\x19Ethereum Signed Message:\n32";
        bytes32 prefixedHashMessage = keccak256(abi.encodePacked(prefix, _hashedMessage));
        address signer = ecrecover(prefixedHashMessage, _v, _r, _s);
        return signer;
    }
   

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":[],"name":"count","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"whichNFT","type":"uint256"},{"internalType":"string","name":"metadataURI","type":"string"},{"internalType":"bytes32","name":"_hashedMessage","type":"bytes32"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"feelingLuckyNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"whichNFT","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"metadataURI","type":"string"},{"internalType":"bytes32","name":"_hashedMessage","type":"bytes32"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"feelingLuckyToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getAddressArray","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"isContentOwned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"luckyCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountPercentage","type":"uint256"}],"name":"manualETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualTokenTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"whichNFT","type":"uint256"},{"internalType":"string[]","name":"metadataURI","type":"string[]"}],"name":"ownerBuyBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"whichNFT","type":"uint256"},{"internalType":"string","name":"metadataURI","type":"string"}],"name":"ownerBuySingle","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":[{"internalType":"uint256","name":"whichNFT","type":"uint256"},{"internalType":"string[]","name":"metadataURI","type":"string[]"},{"internalType":"bytes32","name":"_hashedMessage","type":"bytes32"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"payToMintNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"whichNFT","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string[]","name":"metadataURI","type":"string[]"},{"internalType":"bytes32","name":"_hashedMessage","type":"bytes32"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"payToMintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"priceLuckyNative","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceLuckyToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceNative","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_locked","type":"bool"}],"name":"setLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPriceLuckyNative","type":"uint256"}],"name":"setPriceLuckyNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPriceLuckyToken","type":"uint256"}],"name":"setPriceLuckyToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPriceNative","type":"uint256"}],"name":"setPriceNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPriceToken","type":"uint256"}],"name":"setPriceToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddressNew","type":"address"}],"name":"setTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052662386f26fc1000060105560016011556658d15e17628000601255600160135560006014556001601560006101000a81548160ff0219169083151502179055507320913d93c7fb11d163cefe62f4ee8c2f815fe5d9601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073f1a23a37bdb477ac8687490c0b4c5a1a320abc43601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000fb57600080fd5b506040518060400160405280601581526020017f46616e7461737920576f726c6420435550204e465400000000000000000000008152506040518060400160405280600681526020017f4657434e465400000000000000000000000000000000000000000000000000008152508160009081620001799190620004fc565b5080600190816200018b9190620004fc565b505050620001ae620001a2620001b460201b60201c565b620001bc60201b60201c565b620005e3565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200030457607f821691505b6020821081036200031a5762000319620002bc565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000345565b62000390868362000345565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003dd620003d7620003d184620003a8565b620003b2565b620003a8565b9050919050565b6000819050919050565b620003f983620003bc565b620004116200040882620003e4565b84845462000352565b825550505050565b600090565b6200042862000419565b62000435818484620003ee565b505050565b5b818110156200045d57620004516000826200041e565b6001810190506200043b565b5050565b601f821115620004ac57620004768162000320565b620004818462000335565b8101602085101562000491578190505b620004a9620004a08562000335565b8301826200043a565b50505b505050565b600082821c905092915050565b6000620004d160001984600802620004b1565b1980831691505092915050565b6000620004ec8383620004be565b9150826002028217905092915050565b620005078262000282565b67ffffffffffffffff8111156200052357620005226200028d565b5b6200052f8254620002eb565b6200053c82828562000461565b600060209050601f8311600181146200057457600084156200055f578287015190505b6200056b8582620004de565b865550620005db565b601f198416620005848662000320565b60005b82811015620005ae5784890151825560018201915060208501945060208101905062000587565b86831015620005ce5784890151620005ca601f891682620004be565b8355505b6001600288020188555050505b505050505050565b6152c580620005f36000396000f3fe6080604052600436106102675760003560e01c80636632274911610144578063a5b0930d116100b6578063d204c45e1161007a578063d204c45e146108ef578063d567943a14610918578063e93a93f814610934578063e985e9c51461095d578063f2fde38b1461099a578063fc462408146109c357610267565b8063a5b0930d14610817578063b88d4fde14610842578063c87b56dd1461086b578063c9a59157146108a8578063cf309012146108c457610267565b80638da5cb5b116101085780638da5cb5b1461070757806395d89b411461073257806397bfcda31461075d5780639d1b097b146107865780639f1cabc6146107b1578063a22cb465146107ee57610267565b8063663227491461064357806370a082311461066e578063715018a6146106ab5780638270c41e146106c257806382c44ca7146106eb57610267565b8063211e28b6116101dd57806333e61bb5116101a157806333e61bb5146105355780633bcfc0621461055e57806342842e0e146105755780634f6ccce71461059e5780636352211e146105db5780636374859e1461061857610267565b8063211e28b61461045257806323b872dd1461047b57806326a4e8d2146104a45780632f745c59146104cd5780632ff6fe761461050a57610267565b8063081812fc1161022f578063081812fc14610344578063095ea7b314610381578063108df0b6146103aa5780631202ee31146103d357806316c43c1f146103fe57806318160ddd1461042757610267565b806301ffc9a71461026c57806306661abd146102a957806306ab3148146102d457806306fdde03146102f057806307be48781461031b575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e91906134c5565b610a00565b6040516102a0919061350d565b60405180910390f35b3480156102b557600080fd5b506102be610a12565b6040516102cb9190613541565b60405180910390f35b6102ee60048036038101906102e9919061373d565b610a23565b005b3480156102fc57600080fd5b50610305610b5b565b6040516103129190613865565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613887565b610bed565b005b34801561035057600080fd5b5061036b60048036038101906103669190613887565b610bff565b60405161037891906138f5565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a3919061393c565b610c45565b005b3480156103b657600080fd5b506103d160048036038101906103cc919061397c565b610d5c565b005b3480156103df57600080fd5b506103e8610d9e565b6040516103f59190613541565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613887565b610da4565b005b34801561043357600080fd5b5061043c610db6565b6040516104499190613541565b60405180910390f35b34801561045e57600080fd5b5061047960048036038101906104749190613a04565b610dc3565b005b34801561048757600080fd5b506104a2600480360381019061049d9190613a31565b610de8565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190613a84565b610e48565b005b3480156104d957600080fd5b506104f460048036038101906104ef919061393c565b610e94565b6040516105019190613541565b60405180910390f35b34801561051657600080fd5b5061051f610f39565b60405161052c9190613541565b60405180910390f35b34801561054157600080fd5b5061055c60048036038101906105579190613887565b610f3f565b005b34801561056a57600080fd5b50610573610f51565b005b34801561058157600080fd5b5061059c60048036038101906105979190613a31565b6110bf565b005b3480156105aa57600080fd5b506105c560048036038101906105c09190613887565b6110df565b6040516105d29190613541565b60405180910390f35b3480156105e757600080fd5b5061060260048036038101906105fd9190613887565b611150565b60405161060f91906138f5565b60405180910390f35b34801561062457600080fd5b5061062d611201565b60405161063a9190613541565b60405180910390f35b34801561064f57600080fd5b50610658611207565b6040516106659190613541565b60405180910390f35b34801561067a57600080fd5b5061069560048036038101906106909190613a84565b61120d565b6040516106a29190613541565b60405180910390f35b3480156106b757600080fd5b506106c06112c4565b005b3480156106ce57600080fd5b506106e960048036038101906106e49190613887565b6112d8565b005b61070560048036038101906107009190613ab1565b6112ea565b005b34801561071357600080fd5b5061071c6114c6565b60405161072991906138f5565b60405180910390f35b34801561073e57600080fd5b506107476114f0565b6040516107549190613865565b60405180910390f35b34801561076957600080fd5b50610784600480360381019061077f9190613887565b611582565b005b34801561079257600080fd5b5061079b611613565b6040516107a89190613541565b60405180910390f35b3480156107bd57600080fd5b506107d860048036038101906107d39190613b6f565b611619565b6040516107e5919061350d565b60405180910390f35b3480156107fa57600080fd5b5061081560048036038101906108109190613bb8565b611654565b005b34801561082357600080fd5b5061082c61166a565b6040516108399190613cb6565b60405180910390f35b34801561084e57600080fd5b5061086960048036038101906108649190613d79565b6116f8565b005b34801561087757600080fd5b50610892600480360381019061088d9190613887565b61175a565b60405161089f9190613865565b60405180910390f35b6108c260048036038101906108bd9190613ee2565b61176c565b005b3480156108d057600080fd5b506108d96119cb565b6040516108e6919061350d565b60405180910390f35b3480156108fb57600080fd5b5061091660048036038101906109119190613fa0565b6119de565b005b610932600480360381019061092d9190613ffc565b611a4f565b005b34801561094057600080fd5b5061095b600480360381019061095691906140a5565b611c0a565b005b34801561096957600080fd5b50610984600480360381019061097f9190614101565b611c86565b604051610991919061350d565b60405180910390f35b3480156109a657600080fd5b506109c160048036038101906109bc9190613a84565b611d1a565b005b3480156109cf57600080fd5b506109ea60048036038101906109e59190613887565b611d9d565b6040516109f791906138f5565b60405180910390f35b6000610a0b82611ddc565b9050919050565b6000610a1e600c611e56565b905090565b601154341015610a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5f9061418d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16610a8b85858585611e64565b73ffffffffffffffffffffffffffffffffffffffff1614610aab57600080fd5b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160146000828254610b1691906141dc565b925050819055506000610b29600c611e56565b9050610b3487611f2d565b610b3e600c611f70565b610b483382611f86565b610b52818761215f565b50505050505050565b606060008054610b6a9061423f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b969061423f565b8015610be35780601f10610bb857610100808354040283529160200191610be3565b820191906000526020600020905b815481529060010190602001808311610bc657829003601f168201915b5050505050905090565b610bf56121cc565b8060118190555050565b6000610c0a8261224a565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c5082611150565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb7906142e2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cdf612295565b73ffffffffffffffffffffffffffffffffffffffff161480610d0e5750610d0d81610d08612295565b611c86565b5b610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4490614374565b60405180910390fd5b610d57838361229d565b505050565b610d646121cc565b6000610d70600c611e56565b9050610d7b83611f2d565b610d85600c611f70565b610d8f3382611f86565b610d99818361215f565b505050565b60145481565b610dac6121cc565b8060138190555050565b6000600980549050905090565b610dcb6121cc565b80601560006101000a81548160ff02191690831515021790555050565b610df9610df3612295565b82612356565b610e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2f90614406565b60405180910390fd5b610e438383836123eb565b505050565b610e506121cc565b80601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610e9f8361120d565b8210610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed790614498565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60105481565b610f476121cc565b8060128190555050565b610f596121cc565b6000601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fb691906138f5565b602060405180830381865afa158015610fd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff791906144cd565b9050601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016110789291906144fa565b6020604051808303816000875af1158015611097573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bb9190614538565b5050565b6110da838383604051806020016040528060008152506116f8565b505050565b60006110e9610db6565b821061112a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611121906145d7565b60405180910390fd5b6009828154811061113e5761113d6145f7565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90614672565b60405180910390fd5b80915050919050565b60135481565b60125481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127490614704565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112cc6121cc565b6112d66000612651565b565b6112e06121cc565b8060108190555050565b60135486101561132f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113269061418d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1661135285858585611e64565b73ffffffffffffffffffffffffffffffffffffffff161461137257600080fd5b60016014600082825461138591906141dc565b925050819055506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060006113f0600c611e56565b90506113fb88611f2d565b611405600c611f70565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308a6040518463ffffffff1660e01b815260040161146493929190614724565b6020604051808303816000875af1158015611483573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a79190614538565b506114b23382611f86565b6114bc818761215f565b5050505050505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546114ff9061423f565b80601f016020809104026020016040519081016040528092919081815260200182805461152b9061423f565b80156115785780601f1061154d57610100808354040283529160200191611578565b820191906000526020600020905b81548152906001019060200180831161155b57829003601f168201915b5050505050905090565b61158a6121cc565b6000479050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc606484846115d9919061475b565b6115e391906147cc565b9081150290604051600060405180830381858888f1935050505015801561160e573d6000803e3d6000fd5b505050565b60115481565b60006001600d8360405161162d9190614839565b908152602001604051809103902060009054906101000a900460ff1660ff16149050919050565b61166661165f612295565b8383612717565b5050565b606060168054806020026020016040519081016040528092919081815260200182805480156116ee57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116116a4575b5050505050905090565b611709611703612295565b83612356565b611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f90614406565b60405180910390fd5b61175484848484612883565b50505050565b6060611765826128df565b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff1661178f85858585611e64565b73ffffffffffffffffffffffffffffffffffffffff16146117af57600080fd5b6010548610156117f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117eb9061418d565b60405180910390fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330896040518463ffffffff1660e01b815260040161185393929190614724565b6020604051808303816000875af1158015611872573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118969190614538565b506016339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b60068110156119c157600061196a600c611e56565b905061197589611f2d565b61197f600c611f70565b6119893382611f86565b6119ad818884815181106119a05761199f6145f7565b5b602002602001015161215f565b5080806119b990614850565b915050611955565b5050505050505050565b601560009054906101000a900460ff1681565b6119e66121cc565b60006119f2600c611e56565b90506119fe600c611f70565b611a0883826129f1565b611a12818361215f565b6001600d83604051611a249190614839565b908152602001604051809103902060006101000a81548160ff021916908360ff160217905550505050565b3373ffffffffffffffffffffffffffffffffffffffff16611a7285858585611e64565b73ffffffffffffffffffffffffffffffffffffffff1614611a9257600080fd5b601254341015611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace9061418d565b60405180910390fd5b6016339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b6006811015611c01576000611baa600c611e56565b9050611bb588611f2d565b611bbf600c611f70565b611bc93382611f86565b611bed81888481518110611be057611bdf6145f7565b5b602002602001015161215f565b508080611bf990614850565b915050611b95565b50505050505050565b611c126121cc565b60005b8151811015611c81576000611c2a600c611e56565b9050611c3584611f2d565b611c3f600c611f70565b611c493382611f86565b611c6d81848481518110611c6057611c5f6145f7565b5b602002602001015161215f565b508080611c7990614850565b915050611c15565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d226121cc565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d889061490a565b60405180910390fd5b611d9a81612651565b50565b60168181548110611dad57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e4f5750611e4e82612a0f565b5b9050919050565b600081600001549050919050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250905060008187604051602001611eb4929190614992565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051611ef194939291906149d8565b6020604051602081039080840390855afa158015611f13573d6000803e3d6000fd5b505050602060405103519050809350505050949350505050565b6000600f6000838152602001908152602001600020549050600181611f5291906141dc565b905080600f6000848152602001908152602001600020819055505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fec90614a69565b60405180910390fd5b611ffe81612af1565b1561203e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203590614ad5565b60405180910390fd5b61204a60008383612b5d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461209a91906141dc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461215b60008383612bc3565b5050565b61216882612af1565b6121a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219e90614b67565b60405180910390fd5b806006600084815260200190815260200160002090816121c79190614d33565b505050565b6121d4612295565b73ffffffffffffffffffffffffffffffffffffffff166121f26114c6565b73ffffffffffffffffffffffffffffffffffffffff1614612248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223f90614e51565b60405180910390fd5b565b61225381612af1565b612292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228990614672565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661231083611150565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061236283611150565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123a457506123a38185611c86565b5b806123e257508373ffffffffffffffffffffffffffffffffffffffff166123ca84610bff565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661240b82611150565b73ffffffffffffffffffffffffffffffffffffffff1614612461576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245890614ee3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c790614f75565b60405180910390fd5b6124db838383612b5d565b6124e660008261229d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125369190614f95565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461258d91906141dc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461264c838383612bc3565b505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277c90615015565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612876919061350d565b60405180910390a3505050565b61288e8484846123eb565b61289a84848484612bc8565b6128d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d0906150a7565b60405180910390fd5b50505050565b60606128ea8261224a565b600060066000848152602001908152602001600020805461290a9061423f565b80601f01602080910402602001604051908101604052809291908181526020018280546129369061423f565b80156129835780601f1061295857610100808354040283529160200191612983565b820191906000526020600020905b81548152906001019060200180831161296657829003601f168201915b505050505090506000612994612d4f565b905060008151036129a95781925050506129ec565b6000825111156129de5780826040516020016129c69291906150c7565b604051602081830303815290604052925050506129ec565b6129e784612d8c565b925050505b919050565b612a0b828260405180602001604052806000815250612df4565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ada57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612aea5750612ae982612e4f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60011515601560009054906101000a900460ff16151503612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90615137565b60405180910390fd5b612bbe838383612eb9565b505050565b505050565b6000612be98473ffffffffffffffffffffffffffffffffffffffff16612fcb565b15612d42578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c12612295565b8786866040518563ffffffff1660e01b8152600401612c3494939291906151a1565b6020604051808303816000875af1925050508015612c7057506040513d601f19601f82011682018060405250810190612c6d9190615202565b60015b612cf2573d8060008114612ca0576040519150601f19603f3d011682016040523d82523d6000602084013e612ca5565b606091505b506000815103612cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce1906150a7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d47565b600190505b949350505050565b60606040518060400160405280600781526020017f697066733a2f2f00000000000000000000000000000000000000000000000000815250905090565b6060612d978261224a565b6000612da1612d4f565b90506000815111612dc15760405180602001604052806000815250612dec565b80612dcb84612fee565b604051602001612ddc9291906150c7565b6040516020818303038152906040525b915050919050565b612dfe8383611f86565b612e0b6000848484612bc8565b612e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e41906150a7565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ec483838361314e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f0657612f0181613153565b612f45565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f4457612f43838261319c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f8757612f8281613309565b612fc6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612fc557612fc482826133da565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060008203613035576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613149565b600082905060005b6000821461306757808061305090614850565b915050600a8261306091906147cc565b915061303d565b60008167ffffffffffffffff811115613083576130826135a3565b5b6040519080825280601f01601f1916602001820160405280156130b55781602001600182028036833780820191505090505b5090505b60008514613142576001826130ce9190614f95565b9150600a856130dd919061522f565b60306130e991906141dc565b60f81b8183815181106130ff576130fe6145f7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561313b91906147cc565b94506130b9565b8093505050505b919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016131a98461120d565b6131b39190614f95565b9050600060086000848152602001908152602001600020549050818114613298576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905061331d9190614f95565b90506000600a600084815260200190815260200160002054905060006009838154811061334d5761334c6145f7565b5b90600052602060002001549050806009838154811061336f5761336e6145f7565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806133be576133bd615260565b5b6001900381819060005260206000200160009055905550505050565b60006133e58361120d565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134a28161346d565b81146134ad57600080fd5b50565b6000813590506134bf81613499565b92915050565b6000602082840312156134db576134da613463565b5b60006134e9848285016134b0565b91505092915050565b60008115159050919050565b613507816134f2565b82525050565b600060208201905061352260008301846134fe565b92915050565b6000819050919050565b61353b81613528565b82525050565b60006020820190506135566000830184613532565b92915050565b61356581613528565b811461357057600080fd5b50565b6000813590506135828161355c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135db82613592565b810181811067ffffffffffffffff821117156135fa576135f96135a3565b5b80604052505050565b600061360d613459565b905061361982826135d2565b919050565b600067ffffffffffffffff821115613639576136386135a3565b5b61364282613592565b9050602081019050919050565b82818337600083830152505050565b600061367161366c8461361e565b613603565b90508281526020810184848401111561368d5761368c61358d565b5b61369884828561364f565b509392505050565b600082601f8301126136b5576136b4613588565b5b81356136c584826020860161365e565b91505092915050565b6000819050919050565b6136e1816136ce565b81146136ec57600080fd5b50565b6000813590506136fe816136d8565b92915050565b600060ff82169050919050565b61371a81613704565b811461372557600080fd5b50565b60008135905061373781613711565b92915050565b60008060008060008060c0878903121561375a57613759613463565b5b600061376889828a01613573565b965050602087013567ffffffffffffffff81111561378957613788613468565b5b61379589828a016136a0565b95505060406137a689828a016136ef565b94505060606137b789828a01613728565b93505060806137c889828a016136ef565b92505060a06137d989828a016136ef565b9150509295509295509295565b600081519050919050565b600082825260208201905092915050565b60005b83811015613820578082015181840152602081019050613805565b60008484015250505050565b6000613837826137e6565b61384181856137f1565b9350613851818560208601613802565b61385a81613592565b840191505092915050565b6000602082019050818103600083015261387f818461382c565b905092915050565b60006020828403121561389d5761389c613463565b5b60006138ab84828501613573565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006138df826138b4565b9050919050565b6138ef816138d4565b82525050565b600060208201905061390a60008301846138e6565b92915050565b613919816138d4565b811461392457600080fd5b50565b60008135905061393681613910565b92915050565b6000806040838503121561395357613952613463565b5b600061396185828601613927565b925050602061397285828601613573565b9150509250929050565b6000806040838503121561399357613992613463565b5b60006139a185828601613573565b925050602083013567ffffffffffffffff8111156139c2576139c1613468565b5b6139ce858286016136a0565b9150509250929050565b6139e1816134f2565b81146139ec57600080fd5b50565b6000813590506139fe816139d8565b92915050565b600060208284031215613a1a57613a19613463565b5b6000613a28848285016139ef565b91505092915050565b600080600060608486031215613a4a57613a49613463565b5b6000613a5886828701613927565b9350506020613a6986828701613927565b9250506040613a7a86828701613573565b9150509250925092565b600060208284031215613a9a57613a99613463565b5b6000613aa884828501613927565b91505092915050565b600080600080600080600060e0888a031215613ad057613acf613463565b5b6000613ade8a828b01613573565b9750506020613aef8a828b01613573565b965050604088013567ffffffffffffffff811115613b1057613b0f613468565b5b613b1c8a828b016136a0565b9550506060613b2d8a828b016136ef565b9450506080613b3e8a828b01613728565b93505060a0613b4f8a828b016136ef565b92505060c0613b608a828b016136ef565b91505092959891949750929550565b600060208284031215613b8557613b84613463565b5b600082013567ffffffffffffffff811115613ba357613ba2613468565b5b613baf848285016136a0565b91505092915050565b60008060408385031215613bcf57613bce613463565b5b6000613bdd85828601613927565b9250506020613bee858286016139ef565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c2d816138d4565b82525050565b6000613c3f8383613c24565b60208301905092915050565b6000602082019050919050565b6000613c6382613bf8565b613c6d8185613c03565b9350613c7883613c14565b8060005b83811015613ca9578151613c908882613c33565b9750613c9b83613c4b565b925050600181019050613c7c565b5085935050505092915050565b60006020820190508181036000830152613cd08184613c58565b905092915050565b600067ffffffffffffffff821115613cf357613cf26135a3565b5b613cfc82613592565b9050602081019050919050565b6000613d1c613d1784613cd8565b613603565b905082815260208101848484011115613d3857613d3761358d565b5b613d4384828561364f565b509392505050565b600082601f830112613d6057613d5f613588565b5b8135613d70848260208601613d09565b91505092915050565b60008060008060808587031215613d9357613d92613463565b5b6000613da187828801613927565b9450506020613db287828801613927565b9350506040613dc387828801613573565b925050606085013567ffffffffffffffff811115613de457613de3613468565b5b613df087828801613d4b565b91505092959194509250565b600067ffffffffffffffff821115613e1757613e166135a3565b5b602082029050602081019050919050565b600080fd5b6000613e40613e3b84613dfc565b613603565b90508083825260208201905060208402830185811115613e6357613e62613e28565b5b835b81811015613eaa57803567ffffffffffffffff811115613e8857613e87613588565b5b808601613e9589826136a0565b85526020850194505050602081019050613e65565b5050509392505050565b600082601f830112613ec957613ec8613588565b5b8135613ed9848260208601613e2d565b91505092915050565b600080600080600080600060e0888a031215613f0157613f00613463565b5b6000613f0f8a828b01613573565b9750506020613f208a828b01613573565b965050604088013567ffffffffffffffff811115613f4157613f40613468565b5b613f4d8a828b01613eb4565b9550506060613f5e8a828b016136ef565b9450506080613f6f8a828b01613728565b93505060a0613f808a828b016136ef565b92505060c0613f918a828b016136ef565b91505092959891949750929550565b60008060408385031215613fb757613fb6613463565b5b6000613fc585828601613927565b925050602083013567ffffffffffffffff811115613fe657613fe5613468565b5b613ff2858286016136a0565b9150509250929050565b60008060008060008060c0878903121561401957614018613463565b5b600061402789828a01613573565b965050602087013567ffffffffffffffff81111561404857614047613468565b5b61405489828a01613eb4565b955050604061406589828a016136ef565b945050606061407689828a01613728565b935050608061408789828a016136ef565b92505060a061409889828a016136ef565b9150509295509295509295565b600080604083850312156140bc576140bb613463565b5b60006140ca85828601613573565b925050602083013567ffffffffffffffff8111156140eb576140ea613468565b5b6140f785828601613eb4565b9150509250929050565b6000806040838503121561411857614117613463565b5b600061412685828601613927565b925050602061413785828601613927565b9150509250929050565b7f4e65656420746f20706179207570210000000000000000000000000000000000600082015250565b6000614177600f836137f1565b915061418282614141565b602082019050919050565b600060208201905081810360008301526141a68161416a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141e782613528565b91506141f283613528565b925082820190508082111561420a576142096141ad565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061425757607f821691505b60208210810361426a57614269614210565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006142cc6021836137f1565b91506142d782614270565b604082019050919050565b600060208201905081810360008301526142fb816142bf565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b600061435e603e836137f1565b915061436982614302565b604082019050919050565b6000602082019050818103600083015261438d81614351565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b60006143f0602e836137f1565b91506143fb82614394565b604082019050919050565b6000602082019050818103600083015261441f816143e3565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614482602b836137f1565b915061448d82614426565b604082019050919050565b600060208201905081810360008301526144b181614475565b9050919050565b6000815190506144c78161355c565b92915050565b6000602082840312156144e3576144e2613463565b5b60006144f1848285016144b8565b91505092915050565b600060408201905061450f60008301856138e6565b61451c6020830184613532565b9392505050565b600081519050614532816139d8565b92915050565b60006020828403121561454e5761454d613463565b5b600061455c84828501614523565b91505092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006145c1602c836137f1565b91506145cc82614565565b604082019050919050565b600060208201905081810360008301526145f0816145b4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061465c6018836137f1565b915061466782614626565b602082019050919050565b6000602082019050818103600083015261468b8161464f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006146ee6029836137f1565b91506146f982614692565b604082019050919050565b6000602082019050818103600083015261471d816146e1565b9050919050565b600060608201905061473960008301866138e6565b61474660208301856138e6565b6147536040830184613532565b949350505050565b600061476682613528565b915061477183613528565b925082820261477f81613528565b91508282048414831517614796576147956141ad565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147d782613528565b91506147e283613528565b9250826147f2576147f161479d565b5b828204905092915050565b600081905092915050565b6000614813826137e6565b61481d81856147fd565b935061482d818560208601613802565b80840191505092915050565b60006148458284614808565b915081905092915050565b600061485b82613528565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361488d5761488c6141ad565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006148f46026836137f1565b91506148ff82614898565b604082019050919050565b60006020820190508181036000830152614923816148e7565b9050919050565b600081519050919050565b600081905092915050565b600061494b8261492a565b6149558185614935565b9350614965818560208601613802565b80840191505092915050565b6000819050919050565b61498c614987826136ce565b614971565b82525050565b600061499e8285614940565b91506149aa828461497b565b6020820191508190509392505050565b6149c3816136ce565b82525050565b6149d281613704565b82525050565b60006080820190506149ed60008301876149ba565b6149fa60208301866149c9565b614a0760408301856149ba565b614a1460608301846149ba565b95945050505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a536020836137f1565b9150614a5e82614a1d565b602082019050919050565b60006020820190508181036000830152614a8281614a46565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614abf601c836137f1565b9150614aca82614a89565b602082019050919050565b60006020820190508181036000830152614aee81614ab2565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000614b51602e836137f1565b9150614b5c82614af5565b604082019050919050565b60006020820190508181036000830152614b8081614b44565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614be97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614bac565b614bf38683614bac565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614c30614c2b614c2684613528565b614c0b565b613528565b9050919050565b6000819050919050565b614c4a83614c15565b614c5e614c5682614c37565b848454614bb9565b825550505050565b600090565b614c73614c66565b614c7e818484614c41565b505050565b5b81811015614ca257614c97600082614c6b565b600181019050614c84565b5050565b601f821115614ce757614cb881614b87565b614cc184614b9c565b81016020851015614cd0578190505b614ce4614cdc85614b9c565b830182614c83565b50505b505050565b600082821c905092915050565b6000614d0a60001984600802614cec565b1980831691505092915050565b6000614d238383614cf9565b9150826002028217905092915050565b614d3c826137e6565b67ffffffffffffffff811115614d5557614d546135a3565b5b614d5f825461423f565b614d6a828285614ca6565b600060209050601f831160018114614d9d5760008415614d8b578287015190505b614d958582614d17565b865550614dfd565b601f198416614dab86614b87565b60005b82811015614dd357848901518255600182019150602085019450602081019050614dae565b86831015614df05784890151614dec601f891682614cf9565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614e3b6020836137f1565b9150614e4682614e05565b602082019050919050565b60006020820190508181036000830152614e6a81614e2e565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614ecd6025836137f1565b9150614ed882614e71565b604082019050919050565b60006020820190508181036000830152614efc81614ec0565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614f5f6024836137f1565b9150614f6a82614f03565b604082019050919050565b60006020820190508181036000830152614f8e81614f52565b9050919050565b6000614fa082613528565b9150614fab83613528565b9250828203905081811115614fc357614fc26141ad565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614fff6019836137f1565b915061500a82614fc9565b602082019050919050565b6000602082019050818103600083015261502e81614ff2565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006150916032836137f1565b915061509c82615035565b604082019050919050565b600060208201905081810360008301526150c081615084565b9050919050565b60006150d38285614808565b91506150df8284614808565b91508190509392505050565b7f5472616e73666572206c6f636b65640000000000000000000000000000000000600082015250565b6000615121600f836137f1565b915061512c826150eb565b602082019050919050565b6000602082019050818103600083015261515081615114565b9050919050565b600082825260208201905092915050565b60006151738261492a565b61517d8185615157565b935061518d818560208601613802565b61519681613592565b840191505092915050565b60006080820190506151b660008301876138e6565b6151c360208301866138e6565b6151d06040830185613532565b81810360608301526151e28184615168565b905095945050505050565b6000815190506151fc81613499565b92915050565b60006020828403121561521857615217613463565b5b6000615226848285016151ed565b91505092915050565b600061523a82613528565b915061524583613528565b9250826152555761525461479d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220030697cfe06ffb1a3892739faaf701e096ef36641808255d6ded5d7e900814ee64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102675760003560e01c80636632274911610144578063a5b0930d116100b6578063d204c45e1161007a578063d204c45e146108ef578063d567943a14610918578063e93a93f814610934578063e985e9c51461095d578063f2fde38b1461099a578063fc462408146109c357610267565b8063a5b0930d14610817578063b88d4fde14610842578063c87b56dd1461086b578063c9a59157146108a8578063cf309012146108c457610267565b80638da5cb5b116101085780638da5cb5b1461070757806395d89b411461073257806397bfcda31461075d5780639d1b097b146107865780639f1cabc6146107b1578063a22cb465146107ee57610267565b8063663227491461064357806370a082311461066e578063715018a6146106ab5780638270c41e146106c257806382c44ca7146106eb57610267565b8063211e28b6116101dd57806333e61bb5116101a157806333e61bb5146105355780633bcfc0621461055e57806342842e0e146105755780634f6ccce71461059e5780636352211e146105db5780636374859e1461061857610267565b8063211e28b61461045257806323b872dd1461047b57806326a4e8d2146104a45780632f745c59146104cd5780632ff6fe761461050a57610267565b8063081812fc1161022f578063081812fc14610344578063095ea7b314610381578063108df0b6146103aa5780631202ee31146103d357806316c43c1f146103fe57806318160ddd1461042757610267565b806301ffc9a71461026c57806306661abd146102a957806306ab3148146102d457806306fdde03146102f057806307be48781461031b575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e91906134c5565b610a00565b6040516102a0919061350d565b60405180910390f35b3480156102b557600080fd5b506102be610a12565b6040516102cb9190613541565b60405180910390f35b6102ee60048036038101906102e9919061373d565b610a23565b005b3480156102fc57600080fd5b50610305610b5b565b6040516103129190613865565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613887565b610bed565b005b34801561035057600080fd5b5061036b60048036038101906103669190613887565b610bff565b60405161037891906138f5565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a3919061393c565b610c45565b005b3480156103b657600080fd5b506103d160048036038101906103cc919061397c565b610d5c565b005b3480156103df57600080fd5b506103e8610d9e565b6040516103f59190613541565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613887565b610da4565b005b34801561043357600080fd5b5061043c610db6565b6040516104499190613541565b60405180910390f35b34801561045e57600080fd5b5061047960048036038101906104749190613a04565b610dc3565b005b34801561048757600080fd5b506104a2600480360381019061049d9190613a31565b610de8565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190613a84565b610e48565b005b3480156104d957600080fd5b506104f460048036038101906104ef919061393c565b610e94565b6040516105019190613541565b60405180910390f35b34801561051657600080fd5b5061051f610f39565b60405161052c9190613541565b60405180910390f35b34801561054157600080fd5b5061055c60048036038101906105579190613887565b610f3f565b005b34801561056a57600080fd5b50610573610f51565b005b34801561058157600080fd5b5061059c60048036038101906105979190613a31565b6110bf565b005b3480156105aa57600080fd5b506105c560048036038101906105c09190613887565b6110df565b6040516105d29190613541565b60405180910390f35b3480156105e757600080fd5b5061060260048036038101906105fd9190613887565b611150565b60405161060f91906138f5565b60405180910390f35b34801561062457600080fd5b5061062d611201565b60405161063a9190613541565b60405180910390f35b34801561064f57600080fd5b50610658611207565b6040516106659190613541565b60405180910390f35b34801561067a57600080fd5b5061069560048036038101906106909190613a84565b61120d565b6040516106a29190613541565b60405180910390f35b3480156106b757600080fd5b506106c06112c4565b005b3480156106ce57600080fd5b506106e960048036038101906106e49190613887565b6112d8565b005b61070560048036038101906107009190613ab1565b6112ea565b005b34801561071357600080fd5b5061071c6114c6565b60405161072991906138f5565b60405180910390f35b34801561073e57600080fd5b506107476114f0565b6040516107549190613865565b60405180910390f35b34801561076957600080fd5b50610784600480360381019061077f9190613887565b611582565b005b34801561079257600080fd5b5061079b611613565b6040516107a89190613541565b60405180910390f35b3480156107bd57600080fd5b506107d860048036038101906107d39190613b6f565b611619565b6040516107e5919061350d565b60405180910390f35b3480156107fa57600080fd5b5061081560048036038101906108109190613bb8565b611654565b005b34801561082357600080fd5b5061082c61166a565b6040516108399190613cb6565b60405180910390f35b34801561084e57600080fd5b5061086960048036038101906108649190613d79565b6116f8565b005b34801561087757600080fd5b50610892600480360381019061088d9190613887565b61175a565b60405161089f9190613865565b60405180910390f35b6108c260048036038101906108bd9190613ee2565b61176c565b005b3480156108d057600080fd5b506108d96119cb565b6040516108e6919061350d565b60405180910390f35b3480156108fb57600080fd5b5061091660048036038101906109119190613fa0565b6119de565b005b610932600480360381019061092d9190613ffc565b611a4f565b005b34801561094057600080fd5b5061095b600480360381019061095691906140a5565b611c0a565b005b34801561096957600080fd5b50610984600480360381019061097f9190614101565b611c86565b604051610991919061350d565b60405180910390f35b3480156109a657600080fd5b506109c160048036038101906109bc9190613a84565b611d1a565b005b3480156109cf57600080fd5b506109ea60048036038101906109e59190613887565b611d9d565b6040516109f791906138f5565b60405180910390f35b6000610a0b82611ddc565b9050919050565b6000610a1e600c611e56565b905090565b601154341015610a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5f9061418d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16610a8b85858585611e64565b73ffffffffffffffffffffffffffffffffffffffff1614610aab57600080fd5b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160146000828254610b1691906141dc565b925050819055506000610b29600c611e56565b9050610b3487611f2d565b610b3e600c611f70565b610b483382611f86565b610b52818761215f565b50505050505050565b606060008054610b6a9061423f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b969061423f565b8015610be35780601f10610bb857610100808354040283529160200191610be3565b820191906000526020600020905b815481529060010190602001808311610bc657829003601f168201915b5050505050905090565b610bf56121cc565b8060118190555050565b6000610c0a8261224a565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c5082611150565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb7906142e2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cdf612295565b73ffffffffffffffffffffffffffffffffffffffff161480610d0e5750610d0d81610d08612295565b611c86565b5b610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4490614374565b60405180910390fd5b610d57838361229d565b505050565b610d646121cc565b6000610d70600c611e56565b9050610d7b83611f2d565b610d85600c611f70565b610d8f3382611f86565b610d99818361215f565b505050565b60145481565b610dac6121cc565b8060138190555050565b6000600980549050905090565b610dcb6121cc565b80601560006101000a81548160ff02191690831515021790555050565b610df9610df3612295565b82612356565b610e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2f90614406565b60405180910390fd5b610e438383836123eb565b505050565b610e506121cc565b80601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610e9f8361120d565b8210610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed790614498565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60105481565b610f476121cc565b8060128190555050565b610f596121cc565b6000601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fb691906138f5565b602060405180830381865afa158015610fd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff791906144cd565b9050601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016110789291906144fa565b6020604051808303816000875af1158015611097573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bb9190614538565b5050565b6110da838383604051806020016040528060008152506116f8565b505050565b60006110e9610db6565b821061112a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611121906145d7565b60405180910390fd5b6009828154811061113e5761113d6145f7565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90614672565b60405180910390fd5b80915050919050565b60135481565b60125481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127490614704565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112cc6121cc565b6112d66000612651565b565b6112e06121cc565b8060108190555050565b60135486101561132f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113269061418d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1661135285858585611e64565b73ffffffffffffffffffffffffffffffffffffffff161461137257600080fd5b60016014600082825461138591906141dc565b925050819055506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060006113f0600c611e56565b90506113fb88611f2d565b611405600c611f70565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308a6040518463ffffffff1660e01b815260040161146493929190614724565b6020604051808303816000875af1158015611483573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a79190614538565b506114b23382611f86565b6114bc818761215f565b5050505050505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546114ff9061423f565b80601f016020809104026020016040519081016040528092919081815260200182805461152b9061423f565b80156115785780601f1061154d57610100808354040283529160200191611578565b820191906000526020600020905b81548152906001019060200180831161155b57829003601f168201915b5050505050905090565b61158a6121cc565b6000479050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc606484846115d9919061475b565b6115e391906147cc565b9081150290604051600060405180830381858888f1935050505015801561160e573d6000803e3d6000fd5b505050565b60115481565b60006001600d8360405161162d9190614839565b908152602001604051809103902060009054906101000a900460ff1660ff16149050919050565b61166661165f612295565b8383612717565b5050565b606060168054806020026020016040519081016040528092919081815260200182805480156116ee57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116116a4575b5050505050905090565b611709611703612295565b83612356565b611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f90614406565b60405180910390fd5b61175484848484612883565b50505050565b6060611765826128df565b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff1661178f85858585611e64565b73ffffffffffffffffffffffffffffffffffffffff16146117af57600080fd5b6010548610156117f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117eb9061418d565b60405180910390fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330896040518463ffffffff1660e01b815260040161185393929190614724565b6020604051808303816000875af1158015611872573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118969190614538565b506016339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b60068110156119c157600061196a600c611e56565b905061197589611f2d565b61197f600c611f70565b6119893382611f86565b6119ad818884815181106119a05761199f6145f7565b5b602002602001015161215f565b5080806119b990614850565b915050611955565b5050505050505050565b601560009054906101000a900460ff1681565b6119e66121cc565b60006119f2600c611e56565b90506119fe600c611f70565b611a0883826129f1565b611a12818361215f565b6001600d83604051611a249190614839565b908152602001604051809103902060006101000a81548160ff021916908360ff160217905550505050565b3373ffffffffffffffffffffffffffffffffffffffff16611a7285858585611e64565b73ffffffffffffffffffffffffffffffffffffffff1614611a9257600080fd5b601254341015611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace9061418d565b60405180910390fd5b6016339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b6006811015611c01576000611baa600c611e56565b9050611bb588611f2d565b611bbf600c611f70565b611bc93382611f86565b611bed81888481518110611be057611bdf6145f7565b5b602002602001015161215f565b508080611bf990614850565b915050611b95565b50505050505050565b611c126121cc565b60005b8151811015611c81576000611c2a600c611e56565b9050611c3584611f2d565b611c3f600c611f70565b611c493382611f86565b611c6d81848481518110611c6057611c5f6145f7565b5b602002602001015161215f565b508080611c7990614850565b915050611c15565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d226121cc565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d889061490a565b60405180910390fd5b611d9a81612651565b50565b60168181548110611dad57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e4f5750611e4e82612a0f565b5b9050919050565b600081600001549050919050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250905060008187604051602001611eb4929190614992565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051611ef194939291906149d8565b6020604051602081039080840390855afa158015611f13573d6000803e3d6000fd5b505050602060405103519050809350505050949350505050565b6000600f6000838152602001908152602001600020549050600181611f5291906141dc565b905080600f6000848152602001908152602001600020819055505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fec90614a69565b60405180910390fd5b611ffe81612af1565b1561203e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203590614ad5565b60405180910390fd5b61204a60008383612b5d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461209a91906141dc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461215b60008383612bc3565b5050565b61216882612af1565b6121a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219e90614b67565b60405180910390fd5b806006600084815260200190815260200160002090816121c79190614d33565b505050565b6121d4612295565b73ffffffffffffffffffffffffffffffffffffffff166121f26114c6565b73ffffffffffffffffffffffffffffffffffffffff1614612248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223f90614e51565b60405180910390fd5b565b61225381612af1565b612292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228990614672565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661231083611150565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061236283611150565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123a457506123a38185611c86565b5b806123e257508373ffffffffffffffffffffffffffffffffffffffff166123ca84610bff565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661240b82611150565b73ffffffffffffffffffffffffffffffffffffffff1614612461576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245890614ee3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c790614f75565b60405180910390fd5b6124db838383612b5d565b6124e660008261229d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125369190614f95565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461258d91906141dc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461264c838383612bc3565b505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277c90615015565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612876919061350d565b60405180910390a3505050565b61288e8484846123eb565b61289a84848484612bc8565b6128d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d0906150a7565b60405180910390fd5b50505050565b60606128ea8261224a565b600060066000848152602001908152602001600020805461290a9061423f565b80601f01602080910402602001604051908101604052809291908181526020018280546129369061423f565b80156129835780601f1061295857610100808354040283529160200191612983565b820191906000526020600020905b81548152906001019060200180831161296657829003601f168201915b505050505090506000612994612d4f565b905060008151036129a95781925050506129ec565b6000825111156129de5780826040516020016129c69291906150c7565b604051602081830303815290604052925050506129ec565b6129e784612d8c565b925050505b919050565b612a0b828260405180602001604052806000815250612df4565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ada57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612aea5750612ae982612e4f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60011515601560009054906101000a900460ff16151503612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90615137565b60405180910390fd5b612bbe838383612eb9565b505050565b505050565b6000612be98473ffffffffffffffffffffffffffffffffffffffff16612fcb565b15612d42578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c12612295565b8786866040518563ffffffff1660e01b8152600401612c3494939291906151a1565b6020604051808303816000875af1925050508015612c7057506040513d601f19601f82011682018060405250810190612c6d9190615202565b60015b612cf2573d8060008114612ca0576040519150601f19603f3d011682016040523d82523d6000602084013e612ca5565b606091505b506000815103612cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce1906150a7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d47565b600190505b949350505050565b60606040518060400160405280600781526020017f697066733a2f2f00000000000000000000000000000000000000000000000000815250905090565b6060612d978261224a565b6000612da1612d4f565b90506000815111612dc15760405180602001604052806000815250612dec565b80612dcb84612fee565b604051602001612ddc9291906150c7565b6040516020818303038152906040525b915050919050565b612dfe8383611f86565b612e0b6000848484612bc8565b612e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e41906150a7565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ec483838361314e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f0657612f0181613153565b612f45565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f4457612f43838261319c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f8757612f8281613309565b612fc6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612fc557612fc482826133da565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060008203613035576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613149565b600082905060005b6000821461306757808061305090614850565b915050600a8261306091906147cc565b915061303d565b60008167ffffffffffffffff811115613083576130826135a3565b5b6040519080825280601f01601f1916602001820160405280156130b55781602001600182028036833780820191505090505b5090505b60008514613142576001826130ce9190614f95565b9150600a856130dd919061522f565b60306130e991906141dc565b60f81b8183815181106130ff576130fe6145f7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561313b91906147cc565b94506130b9565b8093505050505b919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016131a98461120d565b6131b39190614f95565b9050600060086000848152602001908152602001600020549050818114613298576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905061331d9190614f95565b90506000600a600084815260200190815260200160002054905060006009838154811061334d5761334c6145f7565b5b90600052602060002001549050806009838154811061336f5761336e6145f7565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806133be576133bd615260565b5b6001900381819060005260206000200160009055905550505050565b60006133e58361120d565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134a28161346d565b81146134ad57600080fd5b50565b6000813590506134bf81613499565b92915050565b6000602082840312156134db576134da613463565b5b60006134e9848285016134b0565b91505092915050565b60008115159050919050565b613507816134f2565b82525050565b600060208201905061352260008301846134fe565b92915050565b6000819050919050565b61353b81613528565b82525050565b60006020820190506135566000830184613532565b92915050565b61356581613528565b811461357057600080fd5b50565b6000813590506135828161355c565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135db82613592565b810181811067ffffffffffffffff821117156135fa576135f96135a3565b5b80604052505050565b600061360d613459565b905061361982826135d2565b919050565b600067ffffffffffffffff821115613639576136386135a3565b5b61364282613592565b9050602081019050919050565b82818337600083830152505050565b600061367161366c8461361e565b613603565b90508281526020810184848401111561368d5761368c61358d565b5b61369884828561364f565b509392505050565b600082601f8301126136b5576136b4613588565b5b81356136c584826020860161365e565b91505092915050565b6000819050919050565b6136e1816136ce565b81146136ec57600080fd5b50565b6000813590506136fe816136d8565b92915050565b600060ff82169050919050565b61371a81613704565b811461372557600080fd5b50565b60008135905061373781613711565b92915050565b60008060008060008060c0878903121561375a57613759613463565b5b600061376889828a01613573565b965050602087013567ffffffffffffffff81111561378957613788613468565b5b61379589828a016136a0565b95505060406137a689828a016136ef565b94505060606137b789828a01613728565b93505060806137c889828a016136ef565b92505060a06137d989828a016136ef565b9150509295509295509295565b600081519050919050565b600082825260208201905092915050565b60005b83811015613820578082015181840152602081019050613805565b60008484015250505050565b6000613837826137e6565b61384181856137f1565b9350613851818560208601613802565b61385a81613592565b840191505092915050565b6000602082019050818103600083015261387f818461382c565b905092915050565b60006020828403121561389d5761389c613463565b5b60006138ab84828501613573565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006138df826138b4565b9050919050565b6138ef816138d4565b82525050565b600060208201905061390a60008301846138e6565b92915050565b613919816138d4565b811461392457600080fd5b50565b60008135905061393681613910565b92915050565b6000806040838503121561395357613952613463565b5b600061396185828601613927565b925050602061397285828601613573565b9150509250929050565b6000806040838503121561399357613992613463565b5b60006139a185828601613573565b925050602083013567ffffffffffffffff8111156139c2576139c1613468565b5b6139ce858286016136a0565b9150509250929050565b6139e1816134f2565b81146139ec57600080fd5b50565b6000813590506139fe816139d8565b92915050565b600060208284031215613a1a57613a19613463565b5b6000613a28848285016139ef565b91505092915050565b600080600060608486031215613a4a57613a49613463565b5b6000613a5886828701613927565b9350506020613a6986828701613927565b9250506040613a7a86828701613573565b9150509250925092565b600060208284031215613a9a57613a99613463565b5b6000613aa884828501613927565b91505092915050565b600080600080600080600060e0888a031215613ad057613acf613463565b5b6000613ade8a828b01613573565b9750506020613aef8a828b01613573565b965050604088013567ffffffffffffffff811115613b1057613b0f613468565b5b613b1c8a828b016136a0565b9550506060613b2d8a828b016136ef565b9450506080613b3e8a828b01613728565b93505060a0613b4f8a828b016136ef565b92505060c0613b608a828b016136ef565b91505092959891949750929550565b600060208284031215613b8557613b84613463565b5b600082013567ffffffffffffffff811115613ba357613ba2613468565b5b613baf848285016136a0565b91505092915050565b60008060408385031215613bcf57613bce613463565b5b6000613bdd85828601613927565b9250506020613bee858286016139ef565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c2d816138d4565b82525050565b6000613c3f8383613c24565b60208301905092915050565b6000602082019050919050565b6000613c6382613bf8565b613c6d8185613c03565b9350613c7883613c14565b8060005b83811015613ca9578151613c908882613c33565b9750613c9b83613c4b565b925050600181019050613c7c565b5085935050505092915050565b60006020820190508181036000830152613cd08184613c58565b905092915050565b600067ffffffffffffffff821115613cf357613cf26135a3565b5b613cfc82613592565b9050602081019050919050565b6000613d1c613d1784613cd8565b613603565b905082815260208101848484011115613d3857613d3761358d565b5b613d4384828561364f565b509392505050565b600082601f830112613d6057613d5f613588565b5b8135613d70848260208601613d09565b91505092915050565b60008060008060808587031215613d9357613d92613463565b5b6000613da187828801613927565b9450506020613db287828801613927565b9350506040613dc387828801613573565b925050606085013567ffffffffffffffff811115613de457613de3613468565b5b613df087828801613d4b565b91505092959194509250565b600067ffffffffffffffff821115613e1757613e166135a3565b5b602082029050602081019050919050565b600080fd5b6000613e40613e3b84613dfc565b613603565b90508083825260208201905060208402830185811115613e6357613e62613e28565b5b835b81811015613eaa57803567ffffffffffffffff811115613e8857613e87613588565b5b808601613e9589826136a0565b85526020850194505050602081019050613e65565b5050509392505050565b600082601f830112613ec957613ec8613588565b5b8135613ed9848260208601613e2d565b91505092915050565b600080600080600080600060e0888a031215613f0157613f00613463565b5b6000613f0f8a828b01613573565b9750506020613f208a828b01613573565b965050604088013567ffffffffffffffff811115613f4157613f40613468565b5b613f4d8a828b01613eb4565b9550506060613f5e8a828b016136ef565b9450506080613f6f8a828b01613728565b93505060a0613f808a828b016136ef565b92505060c0613f918a828b016136ef565b91505092959891949750929550565b60008060408385031215613fb757613fb6613463565b5b6000613fc585828601613927565b925050602083013567ffffffffffffffff811115613fe657613fe5613468565b5b613ff2858286016136a0565b9150509250929050565b60008060008060008060c0878903121561401957614018613463565b5b600061402789828a01613573565b965050602087013567ffffffffffffffff81111561404857614047613468565b5b61405489828a01613eb4565b955050604061406589828a016136ef565b945050606061407689828a01613728565b935050608061408789828a016136ef565b92505060a061409889828a016136ef565b9150509295509295509295565b600080604083850312156140bc576140bb613463565b5b60006140ca85828601613573565b925050602083013567ffffffffffffffff8111156140eb576140ea613468565b5b6140f785828601613eb4565b9150509250929050565b6000806040838503121561411857614117613463565b5b600061412685828601613927565b925050602061413785828601613927565b9150509250929050565b7f4e65656420746f20706179207570210000000000000000000000000000000000600082015250565b6000614177600f836137f1565b915061418282614141565b602082019050919050565b600060208201905081810360008301526141a68161416a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141e782613528565b91506141f283613528565b925082820190508082111561420a576142096141ad565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061425757607f821691505b60208210810361426a57614269614210565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006142cc6021836137f1565b91506142d782614270565b604082019050919050565b600060208201905081810360008301526142fb816142bf565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b600061435e603e836137f1565b915061436982614302565b604082019050919050565b6000602082019050818103600083015261438d81614351565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b60006143f0602e836137f1565b91506143fb82614394565b604082019050919050565b6000602082019050818103600083015261441f816143e3565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614482602b836137f1565b915061448d82614426565b604082019050919050565b600060208201905081810360008301526144b181614475565b9050919050565b6000815190506144c78161355c565b92915050565b6000602082840312156144e3576144e2613463565b5b60006144f1848285016144b8565b91505092915050565b600060408201905061450f60008301856138e6565b61451c6020830184613532565b9392505050565b600081519050614532816139d8565b92915050565b60006020828403121561454e5761454d613463565b5b600061455c84828501614523565b91505092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006145c1602c836137f1565b91506145cc82614565565b604082019050919050565b600060208201905081810360008301526145f0816145b4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061465c6018836137f1565b915061466782614626565b602082019050919050565b6000602082019050818103600083015261468b8161464f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006146ee6029836137f1565b91506146f982614692565b604082019050919050565b6000602082019050818103600083015261471d816146e1565b9050919050565b600060608201905061473960008301866138e6565b61474660208301856138e6565b6147536040830184613532565b949350505050565b600061476682613528565b915061477183613528565b925082820261477f81613528565b91508282048414831517614796576147956141ad565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147d782613528565b91506147e283613528565b9250826147f2576147f161479d565b5b828204905092915050565b600081905092915050565b6000614813826137e6565b61481d81856147fd565b935061482d818560208601613802565b80840191505092915050565b60006148458284614808565b915081905092915050565b600061485b82613528565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361488d5761488c6141ad565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006148f46026836137f1565b91506148ff82614898565b604082019050919050565b60006020820190508181036000830152614923816148e7565b9050919050565b600081519050919050565b600081905092915050565b600061494b8261492a565b6149558185614935565b9350614965818560208601613802565b80840191505092915050565b6000819050919050565b61498c614987826136ce565b614971565b82525050565b600061499e8285614940565b91506149aa828461497b565b6020820191508190509392505050565b6149c3816136ce565b82525050565b6149d281613704565b82525050565b60006080820190506149ed60008301876149ba565b6149fa60208301866149c9565b614a0760408301856149ba565b614a1460608301846149ba565b95945050505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a536020836137f1565b9150614a5e82614a1d565b602082019050919050565b60006020820190508181036000830152614a8281614a46565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614abf601c836137f1565b9150614aca82614a89565b602082019050919050565b60006020820190508181036000830152614aee81614ab2565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000614b51602e836137f1565b9150614b5c82614af5565b604082019050919050565b60006020820190508181036000830152614b8081614b44565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614be97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614bac565b614bf38683614bac565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614c30614c2b614c2684613528565b614c0b565b613528565b9050919050565b6000819050919050565b614c4a83614c15565b614c5e614c5682614c37565b848454614bb9565b825550505050565b600090565b614c73614c66565b614c7e818484614c41565b505050565b5b81811015614ca257614c97600082614c6b565b600181019050614c84565b5050565b601f821115614ce757614cb881614b87565b614cc184614b9c565b81016020851015614cd0578190505b614ce4614cdc85614b9c565b830182614c83565b50505b505050565b600082821c905092915050565b6000614d0a60001984600802614cec565b1980831691505092915050565b6000614d238383614cf9565b9150826002028217905092915050565b614d3c826137e6565b67ffffffffffffffff811115614d5557614d546135a3565b5b614d5f825461423f565b614d6a828285614ca6565b600060209050601f831160018114614d9d5760008415614d8b578287015190505b614d958582614d17565b865550614dfd565b601f198416614dab86614b87565b60005b82811015614dd357848901518255600182019150602085019450602081019050614dae565b86831015614df05784890151614dec601f891682614cf9565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614e3b6020836137f1565b9150614e4682614e05565b602082019050919050565b60006020820190508181036000830152614e6a81614e2e565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614ecd6025836137f1565b9150614ed882614e71565b604082019050919050565b60006020820190508181036000830152614efc81614ec0565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614f5f6024836137f1565b9150614f6a82614f03565b604082019050919050565b60006020820190508181036000830152614f8e81614f52565b9050919050565b6000614fa082613528565b9150614fab83613528565b9250828203905081811115614fc357614fc26141ad565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614fff6019836137f1565b915061500a82614fc9565b602082019050919050565b6000602082019050818103600083015261502e81614ff2565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006150916032836137f1565b915061509c82615035565b604082019050919050565b600060208201905081810360008301526150c081615084565b9050919050565b60006150d38285614808565b91506150df8284614808565b91508190509392505050565b7f5472616e73666572206c6f636b65640000000000000000000000000000000000600082015250565b6000615121600f836137f1565b915061512c826150eb565b602082019050919050565b6000602082019050818103600083015261515081615114565b9050919050565b600082825260208201905092915050565b60006151738261492a565b61517d8185615157565b935061518d818560208601613802565b61519681613592565b840191505092915050565b60006080820190506151b660008301876138e6565b6151c360208301866138e6565b6151d06040830185613532565b81810360608301526151e28184615168565b905095945050505050565b6000815190506151fc81613499565b92915050565b60006020828403121561521857615217613463565b5b6000615226848285016151ed565b91505092915050565b600061523a82613528565b915061524583613528565b9250826152555761525461479d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220030697cfe06ffb1a3892739faaf701e096ef36641808255d6ded5d7e900814ee64736f6c63430008110033

Deployed Bytecode Sourcemap

52534:8211:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53865:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59984:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58492:660;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31088:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54594:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32601:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32118:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59160:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53065:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54454:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44994:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60266:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33301:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54737:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44662:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52857:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54212:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55082:197;;;;;;;;;;;;;:::i;:::-;;33708:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45184:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30799:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53016:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52961:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30530:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9617:103;;;;;;;;;;;;;:::i;:::-;;54337:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57715:769;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8969:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31257:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54865:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52911:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55970:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32844:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53757:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33964:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55766:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56860:837;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53175:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55297:268;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56096:752;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59527:449;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33070:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9875:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53209:30;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53865:229;54021:4;54050:36;54074:11;54050:23;:36::i;:::-;54043:43;;53865:229;;;:::o;59984:98::-;60022:7;60049:25;:15;:23;:25::i;:::-;60042:32;;59984:98;:::o;58492:660::-;58736:16;;58723:9;:29;;58714:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;58831:10;58791:50;;:38;58805:14;58820:2;58823;58826;58791:13;:38::i;:::-;:50;;;58783:59;;;;;;58879:4;58853:13;:25;58867:10;58853:25;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;58906:1;58894:10;;:13;;;;;;;:::i;:::-;;;;;;;;58922:17;58942:25;:15;:23;:25::i;:::-;58922:45;;58982:26;58999:8;58982:16;:26::i;:::-;59023:27;:15;:25;:27::i;:::-;59065:28;59071:10;59083:9;59065:5;:28::i;:::-;59108:36;59121:9;59132:11;59108:12;:36::i;:::-;58703:449;58492:660;;;;;;:::o;31088:100::-;31142:13;31175:5;31168:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31088:100;:::o;54594:133::-;8855:13;:11;:13::i;:::-;54700:19:::1;54681:16;:38;;;;54594:133:::0;:::o;32601:171::-;32677:7;32697:23;32712:7;32697:14;:23::i;:::-;32740:15;:24;32756:7;32740:24;;;;;;;;;;;;;;;;;;;;;32733:31;;32601:171;;;:::o;32118:417::-;32199:13;32215:23;32230:7;32215:14;:23::i;:::-;32199:39;;32263:5;32257:11;;:2;:11;;;32249:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32357:5;32341:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32366:37;32383:5;32390:12;:10;:12::i;:::-;32366:16;:37::i;:::-;32341:62;32319:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;32506:21;32515:2;32519:7;32506:8;:21::i;:::-;32188:347;32118:417;;:::o;59160:359::-;8855:13;:11;:13::i;:::-;59289:17:::1;59309:25;:15;:23;:25::i;:::-;59289:45;;59349:26;59366:8;59349:16;:26::i;:::-;59390:27;:15;:25;:27::i;:::-;59432:28;59438:10;59450:9;59432:5;:28::i;:::-;59475:36;59488:9;59499:11;59475:12;:36::i;:::-;59274:245;59160:359:::0;;:::o;53065:29::-;;;;:::o;54454:129::-;8855:13;:11;:13::i;:::-;54557:18:::1;54539:15;:36;;;;54454:129:::0;:::o;44994:113::-;45055:7;45082:10;:17;;;;45075:24;;44994:113;:::o;60266:87::-;8855:13;:11;:13::i;:::-;60338:7:::1;60329:6;;:16;;;;;;;;;;;;;;;;;;60266:87:::0;:::o;33301:336::-;33496:41;33515:12;:10;:12::i;:::-;33529:7;33496:18;:41::i;:::-;33488:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;33601:28;33611:4;33617:2;33621:7;33601:9;:28::i;:::-;33301:336;;;:::o;54737:118::-;8855:13;:11;:13::i;:::-;54832:15:::1;54816:13;;:31;;;;;;;;;;;;;;;;;;54737:118:::0;:::o;44662:256::-;44759:7;44795:23;44812:5;44795:16;:23::i;:::-;44787:5;:31;44779:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;44884:12;:19;44897:5;44884:19;;;;;;;;;;;;;;;:26;44904:5;44884:26;;;;;;;;;;;;44877:33;;44662:256;;;;:::o;52857:45::-;;;;:::o;54212:113::-;8855:13;:11;:13::i;:::-;54303:14:::1;54289:11;:28;;;;54212:113:::0;:::o;55082:197::-;8855:13;:11;:13::i;:::-;55144:11:::1;55165:13;;;;;;;;;;;55158:31;;;55198:4;55158:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55144:60;;55222:13;;;;;;;;;;;55215:30;;;55246:18;;;;;;;;;;;55266:3;55215:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55131:148;55082:197::o:0;33708:185::-;33846:39;33863:4;33869:2;33873:7;33846:39;;;;;;;;;;;;:16;:39::i;:::-;33708:185;;;:::o;45184:233::-;45259:7;45295:30;:28;:30::i;:::-;45287:5;:38;45279:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;45392:10;45403:5;45392:17;;;;;;;;:::i;:::-;;;;;;;;;;45385:24;;45184:233;;;:::o;30799:222::-;30871:7;30891:13;30907:7;:16;30915:7;30907:16;;;;;;;;;;;;;;;;;;;;;30891:32;;30959:1;30942:19;;:5;:19;;;30934:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;31008:5;31001:12;;;30799:222;;;:::o;53016:34::-;;;;:::o;52961:46::-;;;;:::o;30530:207::-;30602:7;30647:1;30630:19;;:5;:19;;;30622:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30713:9;:16;30723:5;30713:16;;;;;;;;;;;;;;;;30706:23;;30530:207;;;:::o;9617:103::-;8855:13;:11;:13::i;:::-;9682:30:::1;9709:1;9682:18;:30::i;:::-;9617:103::o:0;54337:109::-;8855:13;:11;:13::i;:::-;54425::::1;54412:10;:26;;;;54337:109:::0;:::o;57715:769::-;57983:15;;57973:6;:25;;57964:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;58077:10;58037:50;;:38;58051:14;58066:2;58069;58072;58037:13;:38::i;:::-;:50;;;58029:59;;;;;;58111:1;58099:10;;:13;;;;;;;:::i;:::-;;;;;;;;58149:4;58123:13;:25;58137:10;58123:25;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;58168:17;58188:25;:15;:23;:25::i;:::-;58168:45;;58228:26;58245:8;58228:16;:26::i;:::-;58269:27;:15;:25;:27::i;:::-;58318:13;;;;;;;;;;;58311:34;;;58346:10;58366:4;58373:6;58311:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58397:28;58403:10;58415:9;58397:5;:28::i;:::-;58440:36;58453:9;58464:11;58440:12;:36::i;:::-;57950:534;57715:769;;;;;;;:::o;8969:87::-;9015:7;9042:6;;;;;;;;;;;9035:13;;8969:87;:::o;31257:104::-;31313:13;31346:7;31339:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31257:104;:::o;54865:208::-;8855:13;:11;:13::i;:::-;54941:17:::1;54961:21;54941:41;;55001:18;;;;;;;;;;;54993:36;;:72;55061:3;55042:16;55030:9;:28;;;;:::i;:::-;:34;;;;:::i;:::-;54993:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;54928:145;54865:208:::0;:::o;52911:35::-;;;;:::o;55970:118::-;56034:4;56079:1;56058:12;56071:3;56058:17;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:22;;;56051:29;;55970:118;;;:::o;32844:155::-;32939:52;32958:12;:10;:12::i;:::-;32972:8;32982;32939:18;:52::i;:::-;32844:155;;:::o;53757:100::-;53807:17;53841:12;53834:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53757:100;:::o;33964:323::-;34138:41;34157:12;:10;:12::i;:::-;34171:7;34138:18;:41::i;:::-;34130:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;34241:38;34255:4;34261:2;34265:7;34274:4;34241:13;:38::i;:::-;33964:323;;;;:::o;55766:196::-;55893:13;55931:23;55946:7;55931:14;:23::i;:::-;55924:30;;55766:196;;;:::o;56860:837::-;57153:10;57113:50;;:38;57127:14;57142:2;57145;57148;57113:13;:38::i;:::-;:50;;;57105:59;;;;;;57193:10;;57183:6;:20;;57174:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;57249:13;;;;;;;;;;;57242:34;;;57277:10;57297:4;57304:6;57242:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57322:12;57340:10;57322:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57388:4;57362:13;:25;57376:10;57362:25;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;57410:6;57405:283;57426:1;57422;:5;57405:283;;;57449:17;57469:25;:15;:23;:25::i;:::-;57449:45;;57509:26;57526:8;57509:16;:26::i;:::-;57550:27;:15;:25;:27::i;:::-;57594:28;57600:10;57612:9;57594:5;:28::i;:::-;57637:39;57650:9;57661:11;57673:1;57661:14;;;;;;;;:::i;:::-;;;;;;;;57637:12;:39::i;:::-;57434:254;57429:3;;;;;:::i;:::-;;;;57405:283;;;;56860:837;;;;;;;:::o;53175:25::-;;;;;;;;;;;;;:::o;55297:268::-;8855:13;:11;:13::i;:::-;55374:15:::1;55392:25;:15;:23;:25::i;:::-;55374:43;;55428:27;:15;:25;:27::i;:::-;55466:22;55476:2;55480:7;55466:9;:22::i;:::-;55499:26;55512:7;55521:3;55499:12;:26::i;:::-;55556:1;55536:12;55549:3;55536:17;;;;;;:::i;:::-;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;55363:202;55297:268:::0;;:::o;56096:752::-;56365:10;56325:50;;:38;56339:14;56354:2;56357;56360;56325:13;:38::i;:::-;:50;;;56317:59;;;;;;56410:11;;56397:9;:24;;56388:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;56459:12;56477:10;56459:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56525:4;56499:13;:25;56513:10;56499:25;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;56547:6;56542:297;56563:1;56559;:5;56542:297;;;56586:17;56606:25;:15;:23;:25::i;:::-;56586:45;;56646:26;56663:8;56646:16;:26::i;:::-;56687:27;:15;:25;:27::i;:::-;56745:28;56751:10;56763:9;56745:5;:28::i;:::-;56788:39;56801:9;56812:11;56824:1;56812:14;;;;;;;;:::i;:::-;;;;;;;;56788:12;:39::i;:::-;56571:268;56566:3;;;;;:::i;:::-;;;;56542:297;;;;56096:752;;;;;;:::o;59527:449::-;8855:13;:11;:13::i;:::-;59662:6:::1;59657:312;59678:11;:18;59674:1;:22;59657:312;;;59732:17;59752:25;:15;:23;:25::i;:::-;59732:45;;59792:26;59809:8;59792:16;:26::i;:::-;59833:27;:15;:25;:27::i;:::-;59875:28;59881:10;59893:9;59875:5;:28::i;:::-;59918:39;59931:9;59942:11;59954:1;59942:14;;;;;;;;:::i;:::-;;;;;;;;59918:12;:39::i;:::-;59717:252;59698:3;;;;;:::i;:::-;;;;59657:312;;;;59527:449:::0;;:::o;33070:164::-;33167:4;33191:18;:25;33210:5;33191:25;;;;;;;;;;;;;;;:35;33217:8;33191:35;;;;;;;;;;;;;;;;;;;;;;;;;33184:42;;33070:164;;;;:::o;9875:201::-;8855:13;:11;:13::i;:::-;9984:1:::1;9964:22;;:8;:22;;::::0;9956:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;10040:28;10059:8;10040:18;:28::i;:::-;9875:201:::0;:::o;53209:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44354:224::-;44456:4;44495:35;44480:50;;;:11;:50;;;;:90;;;;44534:36;44558:11;44534:23;:36::i;:::-;44480:90;44473:97;;44354:224;;;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;60361:374::-;60465:7;60485:19;:56;;;;;;;;;;;;;;;;;;;60552:27;60609:6;60617:14;60592:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60582:51;;;;;;60552:81;;60644:14;60661:42;60671:19;60692:2;60696;60700;60661:42;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60644:59;;60721:6;60714:13;;;;;60361:374;;;;;;:::o;60090:168::-;60149:18;60170:11;:16;60182:3;60170:16;;;;;;;;;;;;60149:37;;60209:1;60197:13;;;;;:::i;:::-;;;60238:10;60221:11;:16;60233:3;60221:16;;;;;;;;;;;:27;;;;60138:120;60090:168;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;37686:439::-;37780:1;37766:16;;:2;:16;;;37758:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37839:16;37847:7;37839;:16::i;:::-;37838:17;37830:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37901:45;37930:1;37934:2;37938:7;37901:20;:45::i;:::-;37976:1;37959:9;:13;37969:2;37959:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38007:2;37988:7;:16;37996:7;37988:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38052:7;38048:2;38027:33;;38044:1;38027:33;;;;;;;;;;;;38073:44;38101:1;38105:2;38109:7;38073:19;:44::i;:::-;37686:439;;:::o;51808:217::-;51908:16;51916:7;51908;:16::i;:::-;51900:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;52008:9;51986:10;:19;51997:7;51986:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;51808:217;;:::o;9134:132::-;9209:12;:10;:12::i;:::-;9198:23;;:7;:5;:7::i;:::-;:23;;;9190:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9134:132::o;40576:135::-;40658:16;40666:7;40658;:16::i;:::-;40650:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;40576:135;:::o;7520:98::-;7573:7;7600:10;7593:17;;7520:98;:::o;39855:174::-;39957:2;39930:15;:24;39946:7;39930:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40013:7;40009:2;39975:46;;39984:23;39999:7;39984:14;:23::i;:::-;39975:46;;;;;;;;;;;;39855:174;;:::o;36088:264::-;36181:4;36198:13;36214:23;36229:7;36214:14;:23::i;:::-;36198:39;;36267:5;36256:16;;:7;:16;;;:52;;;;36276:32;36293:5;36300:7;36276:16;:32::i;:::-;36256:52;:87;;;;36336:7;36312:31;;:20;36324:7;36312:11;:20::i;:::-;:31;;;36256:87;36248:96;;;36088:264;;;;:::o;39111:625::-;39270:4;39243:31;;:23;39258:7;39243:14;:23::i;:::-;:31;;;39235:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;39349:1;39335:16;;:2;:16;;;39327:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39405:39;39426:4;39432:2;39436:7;39405:20;:39::i;:::-;39509:29;39526:1;39530:7;39509:8;:29::i;:::-;39570:1;39551:9;:15;39561:4;39551:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39599:1;39582:9;:13;39592:2;39582:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39630:2;39611:7;:16;39619:7;39611:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39669:7;39665:2;39650:27;;39659:4;39650:27;;;;;;;;;;;;39690:38;39710:4;39716:2;39720:7;39690:19;:38::i;:::-;39111:625;;;:::o;10236:191::-;10310:16;10329:6;;;;;;;;;;;10310:25;;10355:8;10346:6;;:17;;;;;;;;;;;;;;;;;;10410:8;10379:40;;10400:8;10379:40;;;;;;;;;;;;10299:128;10236:191;:::o;40172:315::-;40327:8;40318:17;;:5;:17;;;40310:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;40414:8;40376:18;:25;40395:5;40376:25;;;;;;;;;;;;;;;:35;40402:8;40376:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;40460:8;40438:41;;40453:5;40438:41;;;40470:8;40438:41;;;;;;:::i;:::-;;;;;;;;40172:315;;;:::o;35168:313::-;35324:28;35334:4;35340:2;35344:7;35324:9;:28::i;:::-;35371:47;35394:4;35400:2;35404:7;35413:4;35371:22;:47::i;:::-;35363:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;35168:313;;;;:::o;51028:624::-;51101:13;51127:23;51142:7;51127:14;:23::i;:::-;51163;51189:10;:19;51200:7;51189:19;;;;;;;;;;;51163:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51219:18;51240:10;:8;:10::i;:::-;51219:31;;51348:1;51332:4;51326:18;:23;51322:72;;51373:9;51366:16;;;;;;51322:72;51524:1;51504:9;51498:23;:27;51494:108;;;51573:4;51579:9;51556:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51542:48;;;;;;51494:108;51621:23;51636:7;51621:14;:23::i;:::-;51614:30;;;;51028:624;;;;:::o;36694:110::-;36770:26;36780:2;36784:7;36770:26;;;;;;;;;;;;:9;:26::i;:::-;36694:110;;:::o;30161:305::-;30263:4;30315:25;30300:40;;;:11;:40;;;;:105;;;;30372:33;30357:48;;;:11;:48;;;;30300:105;:158;;;;30422:36;30446:11;30422:23;:36::i;:::-;30300:158;30280:178;;30161:305;;;:::o;35794:127::-;35859:4;35911:1;35883:30;;:7;:16;35891:7;35883:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35876:37;;35794:127;;;:::o;53473:274::-;53659:4;53651:12;;:6;;;;;;;;;;;:12;;;53643:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;53694:45;53721:4;53727:2;53731:7;53694:26;:45::i;:::-;53473:274;;;:::o;43211:125::-;;;;:::o;41275:853::-;41429:4;41450:15;:2;:13;;;:15::i;:::-;41446:675;;;41502:2;41486:36;;;41523:12;:10;:12::i;:::-;41537:4;41543:7;41552:4;41486:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41482:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41744:1;41727:6;:13;:18;41723:328;;41770:60;;;;;;;;;;:::i;:::-;;;;;;;;41723:328;42001:6;41995:13;41986:6;41982:2;41978:15;41971:38;41482:584;41618:41;;;41608:51;;;:6;:51;;;;41601:58;;;;;41446:675;42105:4;42098:11;;41275:853;;;;;;;:::o;54102:102::-;54154:13;54180:16;;;;;;;;;;;;;;;;;;;54102:102;:::o;31432:281::-;31505:13;31531:23;31546:7;31531:14;:23::i;:::-;31567:21;31591:10;:8;:10::i;:::-;31567:34;;31643:1;31625:7;31619:21;:25;:86;;;;;;;;;;;;;;;;;31671:7;31680:18;:7;:16;:18::i;:::-;31654:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31619:86;31612:93;;;31432:281;;;:::o;37031:319::-;37160:18;37166:2;37170:7;37160:5;:18::i;:::-;37211:53;37242:1;37246:2;37250:7;37259:4;37211:22;:53::i;:::-;37189:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;37031:319;;;:::o;21823:157::-;21908:4;21947:25;21932:40;;;:11;:40;;;;21925:47;;21823:157;;;:::o;46030:589::-;46174:45;46201:4;46207:2;46211:7;46174:26;:45::i;:::-;46252:1;46236:18;;:4;:18;;;46232:187;;46271:40;46303:7;46271:31;:40::i;:::-;46232:187;;;46341:2;46333:10;;:4;:10;;;46329:90;;46360:47;46393:4;46399:7;46360:32;:47::i;:::-;46329:90;46232:187;46447:1;46433:16;;:2;:16;;;46429:183;;46466:45;46503:7;46466:36;:45::i;:::-;46429:183;;;46539:4;46533:10;;:2;:10;;;46529:83;;46560:40;46588:2;46592:7;46560:27;:40::i;:::-;46529:83;46429:183;46030:589;;;:::o;11667:326::-;11727:4;11984:1;11962:7;:19;;;:23;11955:30;;11667:326;;;:::o;4774:723::-;4830:13;5060:1;5051:5;:10;5047:53;;5078:10;;;;;;;;;;;;;;;;;;;;;5047:53;5110:12;5125:5;5110:20;;5141:14;5166:78;5181:1;5173:4;:9;5166:78;;5199:8;;;;;:::i;:::-;;;;5230:2;5222:10;;;;;:::i;:::-;;;5166:78;;;5254:19;5286:6;5276:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5254:39;;5304:154;5320:1;5311:5;:10;5304:154;;5348:1;5338:11;;;;;:::i;:::-;;;5415:2;5407:5;:10;;;;:::i;:::-;5394:2;:24;;;;:::i;:::-;5381:39;;5364:6;5371;5364:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5444:2;5435:11;;;;;:::i;:::-;;;5304:154;;;5482:6;5468:21;;;;;4774:723;;;;:::o;42700:126::-;;;;:::o;47342:164::-;47446:10;:17;;;;47419:15;:24;47435:7;47419:24;;;;;;;;;;;:44;;;;47474:10;47490:7;47474:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47342:164;:::o;48133:988::-;48399:22;48449:1;48424:22;48441:4;48424:16;:22::i;:::-;:26;;;;:::i;:::-;48399:51;;48461:18;48482:17;:26;48500:7;48482:26;;;;;;;;;;;;48461:47;;48629:14;48615:10;:28;48611:328;;48660:19;48682:12;:18;48695:4;48682:18;;;;;;;;;;;;;;;:34;48701:14;48682:34;;;;;;;;;;;;48660:56;;48766:11;48733:12;:18;48746:4;48733:18;;;;;;;;;;;;;;;:30;48752:10;48733:30;;;;;;;;;;;:44;;;;48883:10;48850:17;:30;48868:11;48850:30;;;;;;;;;;;:43;;;;48645:294;48611:328;49035:17;:26;49053:7;49035:26;;;;;;;;;;;49028:33;;;49079:12;:18;49092:4;49079:18;;;;;;;;;;;;;;;:34;49098:14;49079:34;;;;;;;;;;;49072:41;;;48214:907;;48133:988;;:::o;49416:1079::-;49669:22;49714:1;49694:10;:17;;;;:21;;;;:::i;:::-;49669:46;;49726:18;49747:15;:24;49763:7;49747:24;;;;;;;;;;;;49726:45;;50098:19;50120:10;50131:14;50120:26;;;;;;;;:::i;:::-;;;;;;;;;;50098:48;;50184:11;50159:10;50170;50159:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;50295:10;50264:15;:28;50280:11;50264:28;;;;;;;;;;;:41;;;;50436:15;:24;50452:7;50436:24;;;;;;;;;;;50429:31;;;50471:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49487:1008;;;49416:1079;:::o;46920:221::-;47005:14;47022:20;47039:2;47022:16;:20::i;:::-;47005:37;;47080:7;47053:12;:16;47066:2;47053:16;;;;;;;;;;;;;;;:24;47070:6;47053:24;;;;;;;;;;;:34;;;;47127:6;47098:17;:26;47116:7;47098:26;;;;;;;;;;;:35;;;;46994:147;46920:221;;:::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:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:122::-;2026:24;2044:5;2026:24;:::i;:::-;2019:5;2016:35;2006:63;;2065:1;2062;2055:12;2006:63;1953:122;:::o;2081:139::-;2127:5;2165:6;2152:20;2143:29;;2181:33;2208:5;2181:33;:::i;:::-;2081:139;;;;:::o;2226:117::-;2335:1;2332;2325:12;2349:117;2458:1;2455;2448:12;2472:102;2513:6;2564:2;2560:7;2555:2;2548:5;2544:14;2540:28;2530:38;;2472:102;;;:::o;2580:180::-;2628:77;2625:1;2618:88;2725:4;2722:1;2715:15;2749:4;2746:1;2739:15;2766:281;2849:27;2871:4;2849:27;:::i;:::-;2841:6;2837:40;2979:6;2967:10;2964:22;2943:18;2931:10;2928:34;2925:62;2922:88;;;2990:18;;:::i;:::-;2922:88;3030:10;3026:2;3019:22;2809:238;2766:281;;:::o;3053:129::-;3087:6;3114:20;;:::i;:::-;3104:30;;3143:33;3171:4;3163:6;3143:33;:::i;:::-;3053:129;;;:::o;3188:308::-;3250:4;3340:18;3332:6;3329:30;3326:56;;;3362:18;;:::i;:::-;3326:56;3400:29;3422:6;3400:29;:::i;:::-;3392:37;;3484:4;3478;3474:15;3466:23;;3188:308;;;:::o;3502:146::-;3599:6;3594:3;3589;3576:30;3640:1;3631:6;3626:3;3622:16;3615:27;3502:146;;;:::o;3654:425::-;3732:5;3757:66;3773:49;3815:6;3773:49;:::i;:::-;3757:66;:::i;:::-;3748:75;;3846:6;3839:5;3832:21;3884:4;3877:5;3873:16;3922:3;3913:6;3908:3;3904:16;3901:25;3898:112;;;3929:79;;:::i;:::-;3898:112;4019:54;4066:6;4061:3;4056;4019:54;:::i;:::-;3738:341;3654:425;;;;;:::o;4099:340::-;4155:5;4204:3;4197:4;4189:6;4185:17;4181:27;4171:122;;4212:79;;:::i;:::-;4171:122;4329:6;4316:20;4354:79;4429:3;4421:6;4414:4;4406:6;4402:17;4354:79;:::i;:::-;4345:88;;4161:278;4099:340;;;;:::o;4445:77::-;4482:7;4511:5;4500:16;;4445:77;;;:::o;4528:122::-;4601:24;4619:5;4601:24;:::i;:::-;4594:5;4591:35;4581:63;;4640:1;4637;4630:12;4581:63;4528:122;:::o;4656:139::-;4702:5;4740:6;4727:20;4718:29;;4756:33;4783:5;4756:33;:::i;:::-;4656:139;;;;:::o;4801:86::-;4836:7;4876:4;4869:5;4865:16;4854:27;;4801:86;;;:::o;4893:118::-;4964:22;4980:5;4964:22;:::i;:::-;4957:5;4954:33;4944:61;;5001:1;4998;4991:12;4944:61;4893:118;:::o;5017:135::-;5061:5;5099:6;5086:20;5077:29;;5115:31;5140:5;5115:31;:::i;:::-;5017:135;;;;:::o;5158:1233::-;5270:6;5278;5286;5294;5302;5310;5359:3;5347:9;5338:7;5334:23;5330:33;5327:120;;;5366:79;;:::i;:::-;5327:120;5486:1;5511:53;5556:7;5547:6;5536:9;5532:22;5511:53;:::i;:::-;5501:63;;5457:117;5641:2;5630:9;5626:18;5613:32;5672:18;5664:6;5661:30;5658:117;;;5694:79;;:::i;:::-;5658:117;5799:63;5854:7;5845:6;5834:9;5830:22;5799:63;:::i;:::-;5789:73;;5584:288;5911:2;5937:53;5982:7;5973:6;5962:9;5958:22;5937:53;:::i;:::-;5927:63;;5882:118;6039:2;6065:51;6108:7;6099:6;6088:9;6084:22;6065:51;:::i;:::-;6055:61;;6010:116;6165:3;6192:53;6237:7;6228:6;6217:9;6213:22;6192:53;:::i;:::-;6182:63;;6136:119;6294:3;6321:53;6366:7;6357:6;6346:9;6342:22;6321:53;:::i;:::-;6311:63;;6265:119;5158:1233;;;;;;;;:::o;6397:99::-;6449:6;6483:5;6477:12;6467:22;;6397:99;;;:::o;6502:169::-;6586:11;6620:6;6615:3;6608:19;6660:4;6655:3;6651:14;6636:29;;6502:169;;;;:::o;6677:246::-;6758:1;6768:113;6782:6;6779:1;6776:13;6768:113;;;6867:1;6862:3;6858:11;6852:18;6848:1;6843:3;6839:11;6832:39;6804:2;6801:1;6797:10;6792:15;;6768:113;;;6915:1;6906:6;6901:3;6897:16;6890:27;6739:184;6677:246;;;:::o;6929:377::-;7017:3;7045:39;7078:5;7045:39;:::i;:::-;7100:71;7164:6;7159:3;7100:71;:::i;:::-;7093:78;;7180:65;7238:6;7233:3;7226:4;7219:5;7215:16;7180:65;:::i;:::-;7270:29;7292:6;7270:29;:::i;:::-;7265:3;7261:39;7254:46;;7021:285;6929:377;;;;:::o;7312:313::-;7425:4;7463:2;7452:9;7448:18;7440:26;;7512:9;7506:4;7502:20;7498:1;7487:9;7483:17;7476:47;7540:78;7613:4;7604:6;7540:78;:::i;:::-;7532:86;;7312:313;;;;:::o;7631:329::-;7690:6;7739:2;7727:9;7718:7;7714:23;7710:32;7707:119;;;7745:79;;:::i;:::-;7707:119;7865:1;7890:53;7935:7;7926:6;7915:9;7911:22;7890:53;:::i;:::-;7880:63;;7836:117;7631:329;;;;:::o;7966:126::-;8003:7;8043:42;8036:5;8032:54;8021:65;;7966:126;;;:::o;8098:96::-;8135:7;8164:24;8182:5;8164:24;:::i;:::-;8153:35;;8098:96;;;:::o;8200:118::-;8287:24;8305:5;8287:24;:::i;:::-;8282:3;8275:37;8200:118;;:::o;8324:222::-;8417:4;8455:2;8444:9;8440:18;8432:26;;8468:71;8536:1;8525:9;8521:17;8512:6;8468:71;:::i;:::-;8324:222;;;;:::o;8552:122::-;8625:24;8643:5;8625:24;:::i;:::-;8618:5;8615:35;8605:63;;8664:1;8661;8654:12;8605:63;8552:122;:::o;8680:139::-;8726:5;8764:6;8751:20;8742:29;;8780:33;8807:5;8780:33;:::i;:::-;8680:139;;;;:::o;8825:474::-;8893:6;8901;8950:2;8938:9;8929:7;8925:23;8921:32;8918:119;;;8956:79;;:::i;:::-;8918:119;9076:1;9101:53;9146:7;9137:6;9126:9;9122:22;9101:53;:::i;:::-;9091:63;;9047:117;9203:2;9229:53;9274:7;9265:6;9254:9;9250:22;9229:53;:::i;:::-;9219:63;;9174:118;8825:474;;;;;:::o;9305:654::-;9383:6;9391;9440:2;9428:9;9419:7;9415:23;9411:32;9408:119;;;9446:79;;:::i;:::-;9408:119;9566:1;9591:53;9636:7;9627:6;9616:9;9612:22;9591:53;:::i;:::-;9581:63;;9537:117;9721:2;9710:9;9706:18;9693:32;9752:18;9744:6;9741:30;9738:117;;;9774:79;;:::i;:::-;9738:117;9879:63;9934:7;9925:6;9914:9;9910:22;9879:63;:::i;:::-;9869:73;;9664:288;9305:654;;;;;:::o;9965:116::-;10035:21;10050:5;10035:21;:::i;:::-;10028:5;10025:32;10015:60;;10071:1;10068;10061:12;10015:60;9965:116;:::o;10087:133::-;10130:5;10168:6;10155:20;10146:29;;10184:30;10208:5;10184:30;:::i;:::-;10087:133;;;;:::o;10226:323::-;10282:6;10331:2;10319:9;10310:7;10306:23;10302:32;10299:119;;;10337:79;;:::i;:::-;10299:119;10457:1;10482:50;10524:7;10515:6;10504:9;10500:22;10482:50;:::i;:::-;10472:60;;10428:114;10226:323;;;;:::o;10555:619::-;10632:6;10640;10648;10697:2;10685:9;10676:7;10672:23;10668:32;10665:119;;;10703:79;;:::i;:::-;10665:119;10823:1;10848:53;10893:7;10884:6;10873:9;10869:22;10848:53;:::i;:::-;10838:63;;10794:117;10950:2;10976:53;11021:7;11012:6;11001:9;10997:22;10976:53;:::i;:::-;10966:63;;10921:118;11078:2;11104:53;11149:7;11140:6;11129:9;11125:22;11104:53;:::i;:::-;11094:63;;11049:118;10555:619;;;;;:::o;11180:329::-;11239:6;11288:2;11276:9;11267:7;11263:23;11259:32;11256:119;;;11294:79;;:::i;:::-;11256:119;11414:1;11439:53;11484:7;11475:6;11464:9;11460:22;11439:53;:::i;:::-;11429:63;;11385:117;11180:329;;;;:::o;11515:1379::-;11636:6;11644;11652;11660;11668;11676;11684;11733:3;11721:9;11712:7;11708:23;11704:33;11701:120;;;11740:79;;:::i;:::-;11701:120;11860:1;11885:53;11930:7;11921:6;11910:9;11906:22;11885:53;:::i;:::-;11875:63;;11831:117;11987:2;12013:53;12058:7;12049:6;12038:9;12034:22;12013:53;:::i;:::-;12003:63;;11958:118;12143:2;12132:9;12128:18;12115:32;12174:18;12166:6;12163:30;12160:117;;;12196:79;;:::i;:::-;12160:117;12301:63;12356:7;12347:6;12336:9;12332:22;12301:63;:::i;:::-;12291:73;;12086:288;12413:2;12439:53;12484:7;12475:6;12464:9;12460:22;12439:53;:::i;:::-;12429:63;;12384:118;12541:3;12568:51;12611:7;12602:6;12591:9;12587:22;12568:51;:::i;:::-;12558:61;;12512:117;12668:3;12695:53;12740:7;12731:6;12720:9;12716:22;12695:53;:::i;:::-;12685:63;;12639:119;12797:3;12824:53;12869:7;12860:6;12849:9;12845:22;12824:53;:::i;:::-;12814:63;;12768:119;11515:1379;;;;;;;;;;:::o;12900:509::-;12969:6;13018:2;13006:9;12997:7;12993:23;12989:32;12986:119;;;13024:79;;:::i;:::-;12986:119;13172:1;13161:9;13157:17;13144:31;13202:18;13194:6;13191:30;13188:117;;;13224:79;;:::i;:::-;13188:117;13329:63;13384:7;13375:6;13364:9;13360:22;13329:63;:::i;:::-;13319:73;;13115:287;12900:509;;;;:::o;13415:468::-;13480:6;13488;13537:2;13525:9;13516:7;13512:23;13508:32;13505:119;;;13543:79;;:::i;:::-;13505:119;13663:1;13688:53;13733:7;13724:6;13713:9;13709:22;13688:53;:::i;:::-;13678:63;;13634:117;13790:2;13816:50;13858:7;13849:6;13838:9;13834:22;13816:50;:::i;:::-;13806:60;;13761:115;13415:468;;;;;:::o;13889:114::-;13956:6;13990:5;13984:12;13974:22;;13889:114;;;:::o;14009:184::-;14108:11;14142:6;14137:3;14130:19;14182:4;14177:3;14173:14;14158:29;;14009:184;;;;:::o;14199:132::-;14266:4;14289:3;14281:11;;14319:4;14314:3;14310:14;14302:22;;14199:132;;;:::o;14337:108::-;14414:24;14432:5;14414:24;:::i;:::-;14409:3;14402:37;14337:108;;:::o;14451:179::-;14520:10;14541:46;14583:3;14575:6;14541:46;:::i;:::-;14619:4;14614:3;14610:14;14596:28;;14451:179;;;;:::o;14636:113::-;14706:4;14738;14733:3;14729:14;14721:22;;14636:113;;;:::o;14785:732::-;14904:3;14933:54;14981:5;14933:54;:::i;:::-;15003:86;15082:6;15077:3;15003:86;:::i;:::-;14996:93;;15113:56;15163:5;15113:56;:::i;:::-;15192:7;15223:1;15208:284;15233:6;15230:1;15227:13;15208:284;;;15309:6;15303:13;15336:63;15395:3;15380:13;15336:63;:::i;:::-;15329:70;;15422:60;15475:6;15422:60;:::i;:::-;15412:70;;15268:224;15255:1;15252;15248:9;15243:14;;15208:284;;;15212:14;15508:3;15501:10;;14909:608;;;14785:732;;;;:::o;15523:373::-;15666:4;15704:2;15693:9;15689:18;15681:26;;15753:9;15747:4;15743:20;15739:1;15728:9;15724:17;15717:47;15781:108;15884:4;15875:6;15781:108;:::i;:::-;15773:116;;15523:373;;;;:::o;15902:307::-;15963:4;16053:18;16045:6;16042:30;16039:56;;;16075:18;;:::i;:::-;16039:56;16113:29;16135:6;16113:29;:::i;:::-;16105:37;;16197:4;16191;16187:15;16179:23;;15902:307;;;:::o;16215:423::-;16292:5;16317:65;16333:48;16374:6;16333:48;:::i;:::-;16317:65;:::i;:::-;16308:74;;16405:6;16398:5;16391:21;16443:4;16436:5;16432:16;16481:3;16472:6;16467:3;16463:16;16460:25;16457:112;;;16488:79;;:::i;:::-;16457:112;16578:54;16625:6;16620:3;16615;16578:54;:::i;:::-;16298:340;16215:423;;;;;:::o;16657:338::-;16712:5;16761:3;16754:4;16746:6;16742:17;16738:27;16728:122;;16769:79;;:::i;:::-;16728:122;16886:6;16873:20;16911:78;16985:3;16977:6;16970:4;16962:6;16958:17;16911:78;:::i;:::-;16902:87;;16718:277;16657:338;;;;:::o;17001:943::-;17096:6;17104;17112;17120;17169:3;17157:9;17148:7;17144:23;17140:33;17137:120;;;17176:79;;:::i;:::-;17137:120;17296:1;17321:53;17366:7;17357:6;17346:9;17342:22;17321:53;:::i;:::-;17311:63;;17267:117;17423:2;17449:53;17494:7;17485:6;17474:9;17470:22;17449:53;:::i;:::-;17439:63;;17394:118;17551:2;17577:53;17622:7;17613:6;17602:9;17598:22;17577:53;:::i;:::-;17567:63;;17522:118;17707:2;17696:9;17692:18;17679:32;17738:18;17730:6;17727:30;17724:117;;;17760:79;;:::i;:::-;17724:117;17865:62;17919:7;17910:6;17899:9;17895:22;17865:62;:::i;:::-;17855:72;;17650:287;17001:943;;;;;;;:::o;17950:321::-;18037:4;18127:18;18119:6;18116:30;18113:56;;;18149:18;;:::i;:::-;18113:56;18199:4;18191:6;18187:17;18179:25;;18259:4;18253;18249:15;18241:23;;17950:321;;;:::o;18277:117::-;18386:1;18383;18376:12;18416:945;18522:5;18547:91;18563:74;18630:6;18563:74;:::i;:::-;18547:91;:::i;:::-;18538:100;;18658:5;18687:6;18680:5;18673:21;18721:4;18714:5;18710:16;18703:23;;18774:4;18766:6;18762:17;18754:6;18750:30;18803:3;18795:6;18792:15;18789:122;;;18822:79;;:::i;:::-;18789:122;18937:6;18920:435;18954:6;18949:3;18946:15;18920:435;;;19043:3;19030:17;19079:18;19066:11;19063:35;19060:122;;;19101:79;;:::i;:::-;19060:122;19225:11;19217:6;19213:24;19263:47;19306:3;19294:10;19263:47;:::i;:::-;19258:3;19251:60;19340:4;19335:3;19331:14;19324:21;;18996:359;;18980:4;18975:3;18971:14;18964:21;;18920:435;;;18924:21;18528:833;;18416:945;;;;;:::o;19383:390::-;19464:5;19513:3;19506:4;19498:6;19494:17;19490:27;19480:122;;19521:79;;:::i;:::-;19480:122;19638:6;19625:20;19663:104;19763:3;19755:6;19748:4;19740:6;19736:17;19663:104;:::i;:::-;19654:113;;19470:303;19383:390;;;;:::o;19779:1429::-;19925:6;19933;19941;19949;19957;19965;19973;20022:3;20010:9;20001:7;19997:23;19993:33;19990:120;;;20029:79;;:::i;:::-;19990:120;20149:1;20174:53;20219:7;20210:6;20199:9;20195:22;20174:53;:::i;:::-;20164:63;;20120:117;20276:2;20302:53;20347:7;20338:6;20327:9;20323:22;20302:53;:::i;:::-;20292:63;;20247:118;20432:2;20421:9;20417:18;20404:32;20463:18;20455:6;20452:30;20449:117;;;20485:79;;:::i;:::-;20449:117;20590:88;20670:7;20661:6;20650:9;20646:22;20590:88;:::i;:::-;20580:98;;20375:313;20727:2;20753:53;20798:7;20789:6;20778:9;20774:22;20753:53;:::i;:::-;20743:63;;20698:118;20855:3;20882:51;20925:7;20916:6;20905:9;20901:22;20882:51;:::i;:::-;20872:61;;20826:117;20982:3;21009:53;21054:7;21045:6;21034:9;21030:22;21009:53;:::i;:::-;20999:63;;20953:119;21111:3;21138:53;21183:7;21174:6;21163:9;21159:22;21138:53;:::i;:::-;21128:63;;21082:119;19779:1429;;;;;;;;;;:::o;21214:654::-;21292:6;21300;21349:2;21337:9;21328:7;21324:23;21320:32;21317:119;;;21355:79;;:::i;:::-;21317:119;21475:1;21500:53;21545:7;21536:6;21525:9;21521:22;21500:53;:::i;:::-;21490:63;;21446:117;21630:2;21619:9;21615:18;21602:32;21661:18;21653:6;21650:30;21647:117;;;21683:79;;:::i;:::-;21647:117;21788:63;21843:7;21834:6;21823:9;21819:22;21788:63;:::i;:::-;21778:73;;21573:288;21214:654;;;;;:::o;21874:1283::-;22011:6;22019;22027;22035;22043;22051;22100:3;22088:9;22079:7;22075:23;22071:33;22068:120;;;22107:79;;:::i;:::-;22068:120;22227:1;22252:53;22297:7;22288:6;22277:9;22273:22;22252:53;:::i;:::-;22242:63;;22198:117;22382:2;22371:9;22367:18;22354:32;22413:18;22405:6;22402:30;22399:117;;;22435:79;;:::i;:::-;22399:117;22540:88;22620:7;22611:6;22600:9;22596:22;22540:88;:::i;:::-;22530:98;;22325:313;22677:2;22703:53;22748:7;22739:6;22728:9;22724:22;22703:53;:::i;:::-;22693:63;;22648:118;22805:2;22831:51;22874:7;22865:6;22854:9;22850:22;22831:51;:::i;:::-;22821:61;;22776:116;22931:3;22958:53;23003:7;22994:6;22983:9;22979:22;22958:53;:::i;:::-;22948:63;;22902:119;23060:3;23087:53;23132:7;23123:6;23112:9;23108:22;23087:53;:::i;:::-;23077:63;;23031:119;21874:1283;;;;;;;;:::o;23163:704::-;23266:6;23274;23323:2;23311:9;23302:7;23298:23;23294:32;23291:119;;;23329:79;;:::i;:::-;23291:119;23449:1;23474:53;23519:7;23510:6;23499:9;23495:22;23474:53;:::i;:::-;23464:63;;23420:117;23604:2;23593:9;23589:18;23576:32;23635:18;23627:6;23624:30;23621:117;;;23657:79;;:::i;:::-;23621:117;23762:88;23842:7;23833:6;23822:9;23818:22;23762:88;:::i;:::-;23752:98;;23547:313;23163:704;;;;;:::o;23873:474::-;23941:6;23949;23998:2;23986:9;23977:7;23973:23;23969:32;23966:119;;;24004:79;;:::i;:::-;23966:119;24124:1;24149:53;24194:7;24185:6;24174:9;24170:22;24149:53;:::i;:::-;24139:63;;24095:117;24251:2;24277:53;24322:7;24313:6;24302:9;24298:22;24277:53;:::i;:::-;24267:63;;24222:118;23873:474;;;;;:::o;24353:165::-;24493:17;24489:1;24481:6;24477:14;24470:41;24353:165;:::o;24524:366::-;24666:3;24687:67;24751:2;24746:3;24687:67;:::i;:::-;24680:74;;24763:93;24852:3;24763:93;:::i;:::-;24881:2;24876:3;24872:12;24865:19;;24524:366;;;:::o;24896:419::-;25062:4;25100:2;25089:9;25085:18;25077:26;;25149:9;25143:4;25139:20;25135:1;25124:9;25120:17;25113:47;25177:131;25303:4;25177:131;:::i;:::-;25169:139;;24896:419;;;:::o;25321:180::-;25369:77;25366:1;25359:88;25466:4;25463:1;25456:15;25490:4;25487:1;25480:15;25507:191;25547:3;25566:20;25584:1;25566:20;:::i;:::-;25561:25;;25600:20;25618:1;25600:20;:::i;:::-;25595:25;;25643:1;25640;25636:9;25629:16;;25664:3;25661:1;25658:10;25655:36;;;25671:18;;:::i;:::-;25655:36;25507:191;;;;:::o;25704:180::-;25752:77;25749:1;25742:88;25849:4;25846:1;25839:15;25873:4;25870:1;25863:15;25890:320;25934:6;25971:1;25965:4;25961:12;25951:22;;26018:1;26012:4;26008:12;26039:18;26029:81;;26095:4;26087:6;26083:17;26073:27;;26029:81;26157:2;26149:6;26146:14;26126:18;26123:38;26120:84;;26176:18;;:::i;:::-;26120:84;25941:269;25890:320;;;:::o;26216:220::-;26356:34;26352:1;26344:6;26340:14;26333:58;26425:3;26420:2;26412:6;26408:15;26401:28;26216:220;:::o;26442:366::-;26584:3;26605:67;26669:2;26664:3;26605:67;:::i;:::-;26598:74;;26681:93;26770:3;26681:93;:::i;:::-;26799:2;26794:3;26790:12;26783:19;;26442:366;;;:::o;26814:419::-;26980:4;27018:2;27007:9;27003:18;26995:26;;27067:9;27061:4;27057:20;27053:1;27042:9;27038:17;27031:47;27095:131;27221:4;27095:131;:::i;:::-;27087:139;;26814:419;;;:::o;27239:249::-;27379:34;27375:1;27367:6;27363:14;27356:58;27448:32;27443:2;27435:6;27431:15;27424:57;27239:249;:::o;27494:366::-;27636:3;27657:67;27721:2;27716:3;27657:67;:::i;:::-;27650:74;;27733:93;27822:3;27733:93;:::i;:::-;27851:2;27846:3;27842:12;27835:19;;27494:366;;;:::o;27866:419::-;28032:4;28070:2;28059:9;28055:18;28047:26;;28119:9;28113:4;28109:20;28105:1;28094:9;28090:17;28083:47;28147:131;28273:4;28147:131;:::i;:::-;28139:139;;27866:419;;;:::o;28291:233::-;28431:34;28427:1;28419:6;28415:14;28408:58;28500:16;28495:2;28487:6;28483:15;28476:41;28291:233;:::o;28530:366::-;28672:3;28693:67;28757:2;28752:3;28693:67;:::i;:::-;28686:74;;28769:93;28858:3;28769:93;:::i;:::-;28887:2;28882:3;28878:12;28871:19;;28530:366;;;:::o;28902:419::-;29068:4;29106:2;29095:9;29091:18;29083:26;;29155:9;29149:4;29145:20;29141:1;29130:9;29126:17;29119:47;29183:131;29309:4;29183:131;:::i;:::-;29175:139;;28902:419;;;:::o;29327:230::-;29467:34;29463:1;29455:6;29451:14;29444:58;29536:13;29531:2;29523:6;29519:15;29512:38;29327:230;:::o;29563:366::-;29705:3;29726:67;29790:2;29785:3;29726:67;:::i;:::-;29719:74;;29802:93;29891:3;29802:93;:::i;:::-;29920:2;29915:3;29911:12;29904:19;;29563:366;;;:::o;29935:419::-;30101:4;30139:2;30128:9;30124:18;30116:26;;30188:9;30182:4;30178:20;30174:1;30163:9;30159:17;30152:47;30216:131;30342:4;30216:131;:::i;:::-;30208:139;;29935:419;;;:::o;30360:143::-;30417:5;30448:6;30442:13;30433:22;;30464:33;30491:5;30464:33;:::i;:::-;30360:143;;;;:::o;30509:351::-;30579:6;30628:2;30616:9;30607:7;30603:23;30599:32;30596:119;;;30634:79;;:::i;:::-;30596:119;30754:1;30779:64;30835:7;30826:6;30815:9;30811:22;30779:64;:::i;:::-;30769:74;;30725:128;30509:351;;;;:::o;30866:332::-;30987:4;31025:2;31014:9;31010:18;31002:26;;31038:71;31106:1;31095:9;31091:17;31082:6;31038:71;:::i;:::-;31119:72;31187:2;31176:9;31172:18;31163:6;31119:72;:::i;:::-;30866:332;;;;;:::o;31204:137::-;31258:5;31289:6;31283:13;31274:22;;31305:30;31329:5;31305:30;:::i;:::-;31204:137;;;;:::o;31347:345::-;31414:6;31463:2;31451:9;31442:7;31438:23;31434:32;31431:119;;;31469:79;;:::i;:::-;31431:119;31589:1;31614:61;31667:7;31658:6;31647:9;31643:22;31614:61;:::i;:::-;31604:71;;31560:125;31347:345;;;;:::o;31698:231::-;31838:34;31834:1;31826:6;31822:14;31815:58;31907:14;31902:2;31894:6;31890:15;31883:39;31698:231;:::o;31935:366::-;32077:3;32098:67;32162:2;32157:3;32098:67;:::i;:::-;32091:74;;32174:93;32263:3;32174:93;:::i;:::-;32292:2;32287:3;32283:12;32276:19;;31935:366;;;:::o;32307:419::-;32473:4;32511:2;32500:9;32496:18;32488:26;;32560:9;32554:4;32550:20;32546:1;32535:9;32531:17;32524:47;32588:131;32714:4;32588:131;:::i;:::-;32580:139;;32307:419;;;:::o;32732:180::-;32780:77;32777:1;32770:88;32877:4;32874:1;32867:15;32901:4;32898:1;32891:15;32918:174;33058:26;33054:1;33046:6;33042:14;33035:50;32918:174;:::o;33098:366::-;33240:3;33261:67;33325:2;33320:3;33261:67;:::i;:::-;33254:74;;33337:93;33426:3;33337:93;:::i;:::-;33455:2;33450:3;33446:12;33439:19;;33098:366;;;:::o;33470:419::-;33636:4;33674:2;33663:9;33659:18;33651:26;;33723:9;33717:4;33713:20;33709:1;33698:9;33694:17;33687:47;33751:131;33877:4;33751:131;:::i;:::-;33743:139;;33470:419;;;:::o;33895:228::-;34035:34;34031:1;34023:6;34019:14;34012:58;34104:11;34099:2;34091:6;34087:15;34080:36;33895:228;:::o;34129:366::-;34271:3;34292:67;34356:2;34351:3;34292:67;:::i;:::-;34285:74;;34368:93;34457:3;34368:93;:::i;:::-;34486:2;34481:3;34477:12;34470:19;;34129:366;;;:::o;34501:419::-;34667:4;34705:2;34694:9;34690:18;34682:26;;34754:9;34748:4;34744:20;34740:1;34729:9;34725:17;34718:47;34782:131;34908:4;34782:131;:::i;:::-;34774:139;;34501:419;;;:::o;34926:442::-;35075:4;35113:2;35102:9;35098:18;35090:26;;35126:71;35194:1;35183:9;35179:17;35170:6;35126:71;:::i;:::-;35207:72;35275:2;35264:9;35260:18;35251:6;35207:72;:::i;:::-;35289;35357:2;35346:9;35342:18;35333:6;35289:72;:::i;:::-;34926:442;;;;;;:::o;35374:410::-;35414:7;35437:20;35455:1;35437:20;:::i;:::-;35432:25;;35471:20;35489:1;35471:20;:::i;:::-;35466:25;;35526:1;35523;35519:9;35548:30;35566:11;35548:30;:::i;:::-;35537:41;;35727:1;35718:7;35714:15;35711:1;35708:22;35688:1;35681:9;35661:83;35638:139;;35757:18;;:::i;:::-;35638:139;35422:362;35374:410;;;;:::o;35790:180::-;35838:77;35835:1;35828:88;35935:4;35932:1;35925:15;35959:4;35956:1;35949:15;35976:185;36016:1;36033:20;36051:1;36033:20;:::i;:::-;36028:25;;36067:20;36085:1;36067:20;:::i;:::-;36062:25;;36106:1;36096:35;;36111:18;;:::i;:::-;36096:35;36153:1;36150;36146:9;36141:14;;35976:185;;;;:::o;36167:148::-;36269:11;36306:3;36291:18;;36167:148;;;;:::o;36321:390::-;36427:3;36455:39;36488:5;36455:39;:::i;:::-;36510:89;36592:6;36587:3;36510:89;:::i;:::-;36503:96;;36608:65;36666:6;36661:3;36654:4;36647:5;36643:16;36608:65;:::i;:::-;36698:6;36693:3;36689:16;36682:23;;36431:280;36321:390;;;;:::o;36717:275::-;36849:3;36871:95;36962:3;36953:6;36871:95;:::i;:::-;36864:102;;36983:3;36976:10;;36717:275;;;;:::o;36998:233::-;37037:3;37060:24;37078:5;37060:24;:::i;:::-;37051:33;;37106:66;37099:5;37096:77;37093:103;;37176:18;;:::i;:::-;37093:103;37223:1;37216:5;37212:13;37205:20;;36998:233;;;:::o;37237:225::-;37377:34;37373:1;37365:6;37361:14;37354:58;37446:8;37441:2;37433:6;37429:15;37422:33;37237:225;:::o;37468:366::-;37610:3;37631:67;37695:2;37690:3;37631:67;:::i;:::-;37624:74;;37707:93;37796:3;37707:93;:::i;:::-;37825:2;37820:3;37816:12;37809:19;;37468:366;;;:::o;37840:419::-;38006:4;38044:2;38033:9;38029:18;38021:26;;38093:9;38087:4;38083:20;38079:1;38068:9;38064:17;38057:47;38121:131;38247:4;38121:131;:::i;:::-;38113:139;;37840:419;;;:::o;38265:98::-;38316:6;38350:5;38344:12;38334:22;;38265:98;;;:::o;38369:147::-;38470:11;38507:3;38492:18;;38369:147;;;;:::o;38522:386::-;38626:3;38654:38;38686:5;38654:38;:::i;:::-;38708:88;38789:6;38784:3;38708:88;:::i;:::-;38701:95;;38805:65;38863:6;38858:3;38851:4;38844:5;38840:16;38805:65;:::i;:::-;38895:6;38890:3;38886:16;38879:23;;38630:278;38522:386;;;;:::o;38914:79::-;38953:7;38982:5;38971:16;;38914:79;;;:::o;38999:157::-;39104:45;39124:24;39142:5;39124:24;:::i;:::-;39104:45;:::i;:::-;39099:3;39092:58;38999:157;;:::o;39162:412::-;39320:3;39342:93;39431:3;39422:6;39342:93;:::i;:::-;39335:100;;39445:75;39516:3;39507:6;39445:75;:::i;:::-;39545:2;39540:3;39536:12;39529:19;;39565:3;39558:10;;39162:412;;;;;:::o;39580:118::-;39667:24;39685:5;39667:24;:::i;:::-;39662:3;39655:37;39580:118;;:::o;39704:112::-;39787:22;39803:5;39787:22;:::i;:::-;39782:3;39775:35;39704:112;;:::o;39822:545::-;39995:4;40033:3;40022:9;40018:19;40010:27;;40047:71;40115:1;40104:9;40100:17;40091:6;40047:71;:::i;:::-;40128:68;40192:2;40181:9;40177:18;40168:6;40128:68;:::i;:::-;40206:72;40274:2;40263:9;40259:18;40250:6;40206:72;:::i;:::-;40288;40356:2;40345:9;40341:18;40332:6;40288:72;:::i;:::-;39822:545;;;;;;;:::o;40373:182::-;40513:34;40509:1;40501:6;40497:14;40490:58;40373:182;:::o;40561:366::-;40703:3;40724:67;40788:2;40783:3;40724:67;:::i;:::-;40717:74;;40800:93;40889:3;40800:93;:::i;:::-;40918:2;40913:3;40909:12;40902:19;;40561:366;;;:::o;40933:419::-;41099:4;41137:2;41126:9;41122:18;41114:26;;41186:9;41180:4;41176:20;41172:1;41161:9;41157:17;41150:47;41214:131;41340:4;41214:131;:::i;:::-;41206:139;;40933:419;;;:::o;41358:178::-;41498:30;41494:1;41486:6;41482:14;41475:54;41358:178;:::o;41542:366::-;41684:3;41705:67;41769:2;41764:3;41705:67;:::i;:::-;41698:74;;41781:93;41870:3;41781:93;:::i;:::-;41899:2;41894:3;41890:12;41883:19;;41542:366;;;:::o;41914:419::-;42080:4;42118:2;42107:9;42103:18;42095:26;;42167:9;42161:4;42157:20;42153:1;42142:9;42138:17;42131:47;42195:131;42321:4;42195:131;:::i;:::-;42187:139;;41914:419;;;:::o;42339:233::-;42479:34;42475:1;42467:6;42463:14;42456:58;42548:16;42543:2;42535:6;42531:15;42524:41;42339:233;:::o;42578:366::-;42720:3;42741:67;42805:2;42800:3;42741:67;:::i;:::-;42734:74;;42817:93;42906:3;42817:93;:::i;:::-;42935:2;42930:3;42926:12;42919:19;;42578:366;;;:::o;42950:419::-;43116:4;43154:2;43143:9;43139:18;43131:26;;43203:9;43197:4;43193:20;43189:1;43178:9;43174:17;43167:47;43231:131;43357:4;43231:131;:::i;:::-;43223:139;;42950:419;;;:::o;43375:141::-;43424:4;43447:3;43439:11;;43470:3;43467:1;43460:14;43504:4;43501:1;43491:18;43483:26;;43375:141;;;:::o;43522:93::-;43559:6;43606:2;43601;43594:5;43590:14;43586:23;43576:33;;43522:93;;;:::o;43621:107::-;43665:8;43715:5;43709:4;43705:16;43684:37;;43621:107;;;;:::o;43734:393::-;43803:6;43853:1;43841:10;43837:18;43876:97;43906:66;43895:9;43876:97;:::i;:::-;43994:39;44024:8;44013:9;43994:39;:::i;:::-;43982:51;;44066:4;44062:9;44055:5;44051:21;44042:30;;44115:4;44105:8;44101:19;44094:5;44091:30;44081:40;;43810:317;;43734:393;;;;;:::o;44133:60::-;44161:3;44182:5;44175:12;;44133:60;;;:::o;44199:142::-;44249:9;44282:53;44300:34;44309:24;44327:5;44309:24;:::i;:::-;44300:34;:::i;:::-;44282:53;:::i;:::-;44269:66;;44199:142;;;:::o;44347:75::-;44390:3;44411:5;44404:12;;44347:75;;;:::o;44428:269::-;44538:39;44569:7;44538:39;:::i;:::-;44599:91;44648:41;44672:16;44648:41;:::i;:::-;44640:6;44633:4;44627:11;44599:91;:::i;:::-;44593:4;44586:105;44504:193;44428:269;;;:::o;44703:73::-;44748:3;44703:73;:::o;44782:189::-;44859:32;;:::i;:::-;44900:65;44958:6;44950;44944:4;44900:65;:::i;:::-;44835:136;44782:189;;:::o;44977:186::-;45037:120;45054:3;45047:5;45044:14;45037:120;;;45108:39;45145:1;45138:5;45108:39;:::i;:::-;45081:1;45074:5;45070:13;45061:22;;45037:120;;;44977:186;;:::o;45169:543::-;45270:2;45265:3;45262:11;45259:446;;;45304:38;45336:5;45304:38;:::i;:::-;45388:29;45406:10;45388:29;:::i;:::-;45378:8;45374:44;45571:2;45559:10;45556:18;45553:49;;;45592:8;45577:23;;45553:49;45615:80;45671:22;45689:3;45671:22;:::i;:::-;45661:8;45657:37;45644:11;45615:80;:::i;:::-;45274:431;;45259:446;45169:543;;;:::o;45718:117::-;45772:8;45822:5;45816:4;45812:16;45791:37;;45718:117;;;;:::o;45841:169::-;45885:6;45918:51;45966:1;45962:6;45954:5;45951:1;45947:13;45918:51;:::i;:::-;45914:56;45999:4;45993;45989:15;45979:25;;45892:118;45841:169;;;;:::o;46015:295::-;46091:4;46237:29;46262:3;46256:4;46237:29;:::i;:::-;46229:37;;46299:3;46296:1;46292:11;46286:4;46283:21;46275:29;;46015:295;;;;:::o;46315:1395::-;46432:37;46465:3;46432:37;:::i;:::-;46534:18;46526:6;46523:30;46520:56;;;46556:18;;:::i;:::-;46520:56;46600:38;46632:4;46626:11;46600:38;:::i;:::-;46685:67;46745:6;46737;46731:4;46685:67;:::i;:::-;46779:1;46803:4;46790:17;;46835:2;46827:6;46824:14;46852:1;46847:618;;;;47509:1;47526:6;47523:77;;;47575:9;47570:3;47566:19;47560:26;47551:35;;47523:77;47626:67;47686:6;47679:5;47626:67;:::i;:::-;47620:4;47613:81;47482:222;46817:887;;46847:618;46899:4;46895:9;46887:6;46883:22;46933:37;46965:4;46933:37;:::i;:::-;46992:1;47006:208;47020:7;47017:1;47014:14;47006:208;;;47099:9;47094:3;47090:19;47084:26;47076:6;47069:42;47150:1;47142:6;47138:14;47128:24;;47197:2;47186:9;47182:18;47169:31;;47043:4;47040:1;47036:12;47031:17;;47006:208;;;47242:6;47233:7;47230:19;47227:179;;;47300:9;47295:3;47291:19;47285:26;47343:48;47385:4;47377:6;47373:17;47362:9;47343:48;:::i;:::-;47335:6;47328:64;47250:156;47227:179;47452:1;47448;47440:6;47436:14;47432:22;47426:4;47419:36;46854:611;;;46817:887;;46407:1303;;;46315:1395;;:::o;47716:182::-;47856:34;47852:1;47844:6;47840:14;47833:58;47716:182;:::o;47904:366::-;48046:3;48067:67;48131:2;48126:3;48067:67;:::i;:::-;48060:74;;48143:93;48232:3;48143:93;:::i;:::-;48261:2;48256:3;48252:12;48245:19;;47904:366;;;:::o;48276:419::-;48442:4;48480:2;48469:9;48465:18;48457:26;;48529:9;48523:4;48519:20;48515:1;48504:9;48500:17;48493:47;48557:131;48683:4;48557:131;:::i;:::-;48549:139;;48276:419;;;:::o;48701:224::-;48841:34;48837:1;48829:6;48825:14;48818:58;48910:7;48905:2;48897:6;48893:15;48886:32;48701:224;:::o;48931:366::-;49073:3;49094:67;49158:2;49153:3;49094:67;:::i;:::-;49087:74;;49170:93;49259:3;49170:93;:::i;:::-;49288:2;49283:3;49279:12;49272:19;;48931:366;;;:::o;49303:419::-;49469:4;49507:2;49496:9;49492:18;49484:26;;49556:9;49550:4;49546:20;49542:1;49531:9;49527:17;49520:47;49584:131;49710:4;49584:131;:::i;:::-;49576:139;;49303:419;;;:::o;49728:223::-;49868:34;49864:1;49856:6;49852:14;49845:58;49937:6;49932:2;49924:6;49920:15;49913:31;49728:223;:::o;49957:366::-;50099:3;50120:67;50184:2;50179:3;50120:67;:::i;:::-;50113:74;;50196:93;50285:3;50196:93;:::i;:::-;50314:2;50309:3;50305:12;50298:19;;49957:366;;;:::o;50329:419::-;50495:4;50533:2;50522:9;50518:18;50510:26;;50582:9;50576:4;50572:20;50568:1;50557:9;50553:17;50546:47;50610:131;50736:4;50610:131;:::i;:::-;50602:139;;50329:419;;;:::o;50754:194::-;50794:4;50814:20;50832:1;50814:20;:::i;:::-;50809:25;;50848:20;50866:1;50848:20;:::i;:::-;50843:25;;50892:1;50889;50885:9;50877:17;;50916:1;50910:4;50907:11;50904:37;;;50921:18;;:::i;:::-;50904:37;50754:194;;;;:::o;50954:175::-;51094:27;51090:1;51082:6;51078:14;51071:51;50954:175;:::o;51135:366::-;51277:3;51298:67;51362:2;51357:3;51298:67;:::i;:::-;51291:74;;51374:93;51463:3;51374:93;:::i;:::-;51492:2;51487:3;51483:12;51476:19;;51135:366;;;:::o;51507:419::-;51673:4;51711:2;51700:9;51696:18;51688:26;;51760:9;51754:4;51750:20;51746:1;51735:9;51731:17;51724:47;51788:131;51914:4;51788:131;:::i;:::-;51780:139;;51507:419;;;:::o;51932:237::-;52072:34;52068:1;52060:6;52056:14;52049:58;52141:20;52136:2;52128:6;52124:15;52117:45;51932:237;:::o;52175:366::-;52317:3;52338:67;52402:2;52397:3;52338:67;:::i;:::-;52331:74;;52414:93;52503:3;52414:93;:::i;:::-;52532:2;52527:3;52523:12;52516:19;;52175:366;;;:::o;52547:419::-;52713:4;52751:2;52740:9;52736:18;52728:26;;52800:9;52794:4;52790:20;52786:1;52775:9;52771:17;52764:47;52828:131;52954:4;52828:131;:::i;:::-;52820:139;;52547:419;;;:::o;52972:435::-;53152:3;53174:95;53265:3;53256:6;53174:95;:::i;:::-;53167:102;;53286:95;53377:3;53368:6;53286:95;:::i;:::-;53279:102;;53398:3;53391:10;;52972:435;;;;;:::o;53413:165::-;53553:17;53549:1;53541:6;53537:14;53530:41;53413:165;:::o;53584:366::-;53726:3;53747:67;53811:2;53806:3;53747:67;:::i;:::-;53740:74;;53823:93;53912:3;53823:93;:::i;:::-;53941:2;53936:3;53932:12;53925:19;;53584:366;;;:::o;53956:419::-;54122:4;54160:2;54149:9;54145:18;54137:26;;54209:9;54203:4;54199:20;54195:1;54184:9;54180:17;54173:47;54237:131;54363:4;54237:131;:::i;:::-;54229:139;;53956:419;;;:::o;54381:168::-;54464:11;54498:6;54493:3;54486:19;54538:4;54533:3;54529:14;54514:29;;54381:168;;;;:::o;54555:373::-;54641:3;54669:38;54701:5;54669:38;:::i;:::-;54723:70;54786:6;54781:3;54723:70;:::i;:::-;54716:77;;54802:65;54860:6;54855:3;54848:4;54841:5;54837:16;54802:65;:::i;:::-;54892:29;54914:6;54892:29;:::i;:::-;54887:3;54883:39;54876:46;;54645:283;54555:373;;;;:::o;54934:640::-;55129:4;55167:3;55156:9;55152:19;55144:27;;55181:71;55249:1;55238:9;55234:17;55225:6;55181:71;:::i;:::-;55262:72;55330:2;55319:9;55315:18;55306:6;55262:72;:::i;:::-;55344;55412:2;55401:9;55397:18;55388:6;55344:72;:::i;:::-;55463:9;55457:4;55453:20;55448:2;55437:9;55433:18;55426:48;55491:76;55562:4;55553:6;55491:76;:::i;:::-;55483:84;;54934:640;;;;;;;:::o;55580:141::-;55636:5;55667:6;55661:13;55652:22;;55683:32;55709:5;55683:32;:::i;:::-;55580:141;;;;:::o;55727:349::-;55796:6;55845:2;55833:9;55824:7;55820:23;55816:32;55813:119;;;55851:79;;:::i;:::-;55813:119;55971:1;55996:63;56051:7;56042:6;56031:9;56027:22;55996:63;:::i;:::-;55986:73;;55942:127;55727:349;;;;:::o;56082:176::-;56114:1;56131:20;56149:1;56131:20;:::i;:::-;56126:25;;56165:20;56183:1;56165:20;:::i;:::-;56160:25;;56204:1;56194:35;;56209:18;;:::i;:::-;56194:35;56250:1;56247;56243:9;56238:14;;56082:176;;;;:::o;56264:180::-;56312:77;56309:1;56302:88;56409:4;56406:1;56399:15;56433:4;56430:1;56423:15

Swarm Source

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