ETH Price: $2,874.38 (-11.31%)
Gas: 39 Gwei

Token

KenkyoGetaways ($KKG)
 

Overview

Max Total Supply

61 $KKG

Holders

30

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 $KKG
0xec1d5cfb0bf18925ab722eeebcb53dc636834e8a
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:
KenkyoGetaways

Compiler Version
v0.8.0+commit.c7dfd78e

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-23
*/

// SPDX-License-Identifier: MIT

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

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

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

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

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

    /**
     * @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 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);

    /**
     * @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;
}


/**
 * @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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


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);
}


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 tokenId);

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

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

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() {
        _setOwner(_msgSender());
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

pragma solidity ^0.8.0;

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

    /**
     * @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 Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: approve to caller');

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

    /**
     * @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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

library SafeMath {

    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {

            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }


    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}
library Counters {
    struct Counter {

        uint256 _value; 
    }

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

pragma solidity ^0.8.0;

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

    string private _baseURIextended = "";

    bool public pauseMint = true;

    uint256 public constant MAX_NFT_SUPPLY = 777;
    address public kenkyoContract = 0x58091d4c4f8F37A103789Dc0341616717a6F31cf;
    
    constructor() ERC721A("KenkyoGetaways", "$KKG") {
    }

    function mintNFTForOwner(uint256 amount) public onlyOwner {
        require(!pauseMint, "Paused!");
        require(totalSupply() < MAX_NFT_SUPPLY, "Sale has already ended");

        _safeMint(msg.sender, amount);
    }

    function walletHoldsNFT (address _wallet) public view returns (uint256) {
        return IERC721(kenkyoContract).balanceOf(_wallet);
    }

    function mintNFT(uint256 _quantity) public payable {
        uint256 nftHoldAmount = walletHoldsNFT(msg.sender);

        require(nftHoldAmount > 0, "Not NFT holder!");
        require(_quantity > 0 && _quantity <= nftHoldAmount);
        require(!pauseMint, "Paused!");
        require(totalSupply() + _quantity < MAX_NFT_SUPPLY, "Sale has already ended");

        _safeMint(msg.sender, _quantity);
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return bytes(_baseURIextended).length > 0 ? string(abi.encodePacked(_baseURIextended, tokenId.toString(), ".json")) : "";
    }

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

    function setBaseURI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

    function tokenMinted() public view returns (uint256) {
        return totalSupply();
    }

    function pause() public onlyOwner {
        pauseMint = true;
    }

    function unPause() public onlyOwner {
        pauseMint = false;
    }

    function getOwnershipData(uint256 tokenId)
        external
        view
        returns (TokenOwnership memory)
    {
        return ownershipOf(tokenId);
    }

    function setKenkyoContract (address _contract) external onlyOwner() {
        kenkyoContract = _contract;
    }
}

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":[],"name":"MAX_NFT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kenkyoContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintNFTForOwner","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":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setKenkyoContract","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":[],"name":"tokenMinted","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"},{"inputs":[],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"walletHoldsNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405260405180602001604052806000815250600990805190602001906200002b92919062000244565b506001600a60006101000a81548160ff0219169083151502179055507358091d4c4f8f37a103789dc0341616717a6f31cf600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000a957600080fd5b506040518060400160405280600e81526020017f4b656e6b796f47657461776179730000000000000000000000000000000000008152506040518060400160405280600481526020017f244b4b4700000000000000000000000000000000000000000000000000000000815250620001366200012a6200017860201b60201c565b6200018060201b60201c565b81600290805190602001906200014e92919062000244565b5080600390805190602001906200016792919062000244565b505050600160088190555062000359565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025290620002f4565b90600052602060002090601f016020900481019282620002765760008555620002c2565b82601f106200029157805160ff1916838001178555620002c2565b82800160010185558215620002c2579182015b82811115620002c1578251825591602001919060010190620002a4565b5b509050620002d19190620002d5565b5090565b5b80821115620002f0576000816000905550600101620002d6565b5090565b600060028204905060018216806200030d57607f821691505b602082108114156200032457620003236200032a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61405580620003696000396000f3fe6080604052600436106101d85760003560e01c80638456cb5911610102578063ad236d4c11610095578063cd85cdb511610064578063cd85cdb5146106c1578063e985e9c5146106ec578063f2fde38b14610729578063f7b188a514610752576101d8565b8063ad236d4c14610607578063b5077f4414610630578063b88d4fde1461065b578063c87b56dd14610684576101d8565b806395d89b41116100d157806395d89b411461054b5780639635635514610576578063976c2a50146105a1578063a22cb465146105de576101d8565b80638456cb59146104b05780638da5cb5b146104c75780639231ab2a146104f2578063926427441461052f576101d8565b80632f745c591161017a57806355f804b31161014957806355f804b3146103f65780636352211e1461041f57806370a082311461045c578063715018a614610499576101d8565b80632f745c591461032a5780633461fc791461036757806342842e0e146103905780634f6ccce7146103b9576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806313c21cd0146102ab57806318160ddd146102d657806323b872dd14610301576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612d4c565b610769565b60405161021191906138a9565b60405180910390f35b34801561022657600080fd5b5061022f6108b3565b60405161023c91906138c4565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190612ddf565b610945565b6040516102799190613842565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190612d10565b6109ca565b005b3480156102b757600080fd5b506102c0610ae3565b6040516102cd9190613842565b60405180910390f35b3480156102e257600080fd5b506102eb610b09565b6040516102f89190613bc1565b60405180910390f35b34801561030d57600080fd5b5061032860048036038101906103239190612c0a565b610b13565b005b34801561033657600080fd5b50610351600480360381019061034c9190612d10565b610b23565b60405161035e9190613bc1565b60405180910390f35b34801561037357600080fd5b5061038e60048036038101906103899190612ba5565b610d15565b005b34801561039c57600080fd5b506103b760048036038101906103b29190612c0a565b610dd5565b005b3480156103c557600080fd5b506103e060048036038101906103db9190612ddf565b610df5565b6040516103ed9190613bc1565b60405180910390f35b34801561040257600080fd5b5061041d60048036038101906104189190612d9e565b610e48565b005b34801561042b57600080fd5b5061044660048036038101906104419190612ddf565b610ede565b6040516104539190613842565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e9190612ba5565b610ef4565b6040516104909190613bc1565b60405180910390f35b3480156104a557600080fd5b506104ae610fdd565b005b3480156104bc57600080fd5b506104c5611065565b005b3480156104d357600080fd5b506104dc6110fe565b6040516104e99190613842565b60405180910390f35b3480156104fe57600080fd5b5061051960048036038101906105149190612ddf565b611127565b6040516105269190613ba6565b60405180910390f35b61054960048036038101906105449190612ddf565b61113f565b005b34801561055757600080fd5b5061056061125c565b60405161056d91906138c4565b60405180910390f35b34801561058257600080fd5b5061058b6112ee565b6040516105989190613bc1565b60405180910390f35b3480156105ad57600080fd5b506105c860048036038101906105c39190612ba5565b6112fd565b6040516105d59190613bc1565b60405180910390f35b3480156105ea57600080fd5b5061060560048036038101906106009190612cd4565b6113b1565b005b34801561061357600080fd5b5061062e60048036038101906106299190612ddf565b611532565b005b34801561063c57600080fd5b50610645611656565b6040516106529190613bc1565b60405180910390f35b34801561066757600080fd5b50610682600480360381019061067d9190612c59565b61165c565b005b34801561069057600080fd5b506106ab60048036038101906106a69190612ddf565b6116b8565b6040516106b891906138c4565b60405180910390f35b3480156106cd57600080fd5b506106d6611760565b6040516106e391906138a9565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190612bce565b611773565b60405161072091906138a9565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b9190612ba5565b611807565b005b34801561075e57600080fd5b506107676118ff565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061083457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061089c57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108ac57506108ab82611998565b5b9050919050565b6060600280546108c290613e4a565b80601f01602080910402602001604051908101604052809291908181526020018280546108ee90613e4a565b801561093b5780601f106109105761010080835404028352916020019161093b565b820191906000526020600020905b81548152906001019060200180831161091e57829003601f168201915b5050505050905090565b600061095082611a02565b61098f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098690613b86565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109d582610ede565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3d90613ac6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a65611a10565b73ffffffffffffffffffffffffffffffffffffffff161480610a945750610a9381610a8e611a10565b611773565b5b610ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aca906139c6565b60405180910390fd5b610ade838383611a18565b505050565b600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600154905090565b610b1e838383611aca565b505050565b6000610b2e83610ef4565b8210610b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b66906138e6565b60405180910390fd5b6000610b79610b09565b905060008060005b83811015610cd3576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610c7357806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cc55786841415610cbc578195505050505050610d0f565b83806001019450505b508080600101915050610b81565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690613b46565b60405180910390fd5b92915050565b610d1d611a10565b73ffffffffffffffffffffffffffffffffffffffff16610d3b6110fe565b73ffffffffffffffffffffffffffffffffffffffff1614610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8890613a26565b60405180910390fd5b80600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610df08383836040518060200160405280600081525061165c565b505050565b6000610dff610b09565b8210610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3790613966565b60405180910390fd5b819050919050565b610e50611a10565b73ffffffffffffffffffffffffffffffffffffffff16610e6e6110fe565b73ffffffffffffffffffffffffffffffffffffffff1614610ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebb90613a26565b60405180910390fd5b8060099080519060200190610eda92919061297a565b5050565b6000610ee98261200a565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c906139e6565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b610fe5611a10565b73ffffffffffffffffffffffffffffffffffffffff166110036110fe565b73ffffffffffffffffffffffffffffffffffffffff1614611059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105090613a26565b60405180910390fd5b61106360006121a4565b565b61106d611a10565b73ffffffffffffffffffffffffffffffffffffffff1661108b6110fe565b73ffffffffffffffffffffffffffffffffffffffff16146110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d890613a26565b60405180910390fd5b6001600a60006101000a81548160ff021916908315150217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61112f612a00565b6111388261200a565b9050919050565b600061114a336112fd565b90506000811161118f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118690613906565b60405180910390fd5b60008211801561119f5750808211155b6111a857600080fd5b600a60009054906101000a900460ff16156111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef906139a6565b60405180910390fd5b61030982611204610b09565b61120e9190613cc5565b1061124e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124590613aa6565b60405180910390fd5b6112583383612268565b5050565b60606003805461126b90613e4a565b80601f016020809104026020016040519081016040528092919081815260200182805461129790613e4a565b80156112e45780601f106112b9576101008083540402835291602001916112e4565b820191906000526020600020905b8154815290600101906020018083116112c757829003601f168201915b5050505050905090565b60006112f8610b09565b905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b815260040161135a9190613842565b60206040518083038186803b15801561137257600080fd5b505afa158015611386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113aa9190612e08565b9050919050565b6113b9611a10565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141e90613a66565b60405180910390fd5b8060076000611434611a10565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114e1611a10565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161152691906138a9565b60405180910390a35050565b61153a611a10565b73ffffffffffffffffffffffffffffffffffffffff166115586110fe565b73ffffffffffffffffffffffffffffffffffffffff16146115ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a590613a26565b60405180910390fd5b600a60009054906101000a900460ff16156115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f5906139a6565b60405180910390fd5b610309611609610b09565b10611649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164090613aa6565b60405180910390fd5b6116533382612268565b50565b61030981565b611667848484611aca565b61167384848484612286565b6116b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a990613ae6565b60405180910390fd5b50505050565b60606116c382611a02565b611702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f990613a46565b60405180910390fd5b60006009805461171190613e4a565b90501161172d5760405180602001604052806000815250611759565b60096117388361241d565b604051602001611749929190613813565b6040516020818303038152906040525b9050919050565b600a60009054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61180f611a10565b73ffffffffffffffffffffffffffffffffffffffff1661182d6110fe565b73ffffffffffffffffffffffffffffffffffffffff1614611883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187a90613a26565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90613926565b60405180910390fd5b6118fc816121a4565b50565b611907611a10565b73ffffffffffffffffffffffffffffffffffffffff166119256110fe565b73ffffffffffffffffffffffffffffffffffffffff161461197b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197290613a26565b60405180910390fd5b6000600a60006101000a81548160ff021916908315150217905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611ad58261200a565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611afc611a10565b73ffffffffffffffffffffffffffffffffffffffff161480611b585750611b21611a10565b73ffffffffffffffffffffffffffffffffffffffff16611b4084610945565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b745750611b738260000151611b6e611a10565b611773565b5b905080611bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bad90613a86565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1f90613a06565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8f90613986565b60405180910390fd5b611ca585858560016125ca565b611cb56000848460000151611a18565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f9a57611ef981611a02565b15611f995782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461200385858560016125d0565b5050505050565b612012612a00565b61201b82611a02565b61205a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205190613946565b60405180910390fd5b60008290505b60008110612163576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461215457809250505061219f565b50808060019003915050612060565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219690613b66565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122828282604051806020016040528060008152506125d6565b5050565b60006122a78473ffffffffffffffffffffffffffffffffffffffff166125e8565b15612410578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122d0611a10565b8786866040518563ffffffff1660e01b81526004016122f2949392919061385d565b602060405180830381600087803b15801561230c57600080fd5b505af192505050801561233d57506040513d601f19601f8201168201806040525081019061233a9190612d75565b60015b6123c0573d806000811461236d576040519150601f19603f3d011682016040523d82523d6000602084013e612372565b606091505b506000815114156123b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123af90613ae6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612415565b600190505b949350505050565b60606000821415612465576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125c5565b600082905060005b6000821461249757808061248090613e7c565b915050600a826124909190613d1b565b915061246d565b60008167ffffffffffffffff8111156124d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561250b5781602001600182028036833780820191505090505b5090505b600085146125be576001826125249190613d4c565b9150600a856125339190613ec5565b603061253f9190613cc5565b60f81b81838151811061257b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125b79190613d1b565b945061250f565b8093505050505b919050565b50505050565b50505050565b6125e383838360016125fb565b505050565b600080823b905060008111915050919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266990613b06565b60405180910390fd5b60008414156126b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ad90613b26565b60405180910390fd5b6126c360008683876125ca565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561295d57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612948576129086000888488612286565b612947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293e90613ae6565b60405180910390fd5b5b81806001019250508080600101915050612891565b50806001819055505061297360008683876125d0565b5050505050565b82805461298690613e4a565b90600052602060002090601f0160209004810192826129a857600085556129ef565b82601f106129c157805160ff19168380011785556129ef565b828001600101855582156129ef579182015b828111156129ee5782518255916020019190600101906129d3565b5b5090506129fc9190612a3a565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612a53576000816000905550600101612a3b565b5090565b6000612a6a612a6584613c0d565b613bdc565b905082815260208101848484011115612a8257600080fd5b612a8d848285613e08565b509392505050565b6000612aa8612aa384613c3d565b613bdc565b905082815260208101848484011115612ac057600080fd5b612acb848285613e08565b509392505050565b600081359050612ae281613fc3565b92915050565b600081359050612af781613fda565b92915050565b600081359050612b0c81613ff1565b92915050565b600081519050612b2181613ff1565b92915050565b600082601f830112612b3857600080fd5b8135612b48848260208601612a57565b91505092915050565b600082601f830112612b6257600080fd5b8135612b72848260208601612a95565b91505092915050565b600081359050612b8a81614008565b92915050565b600081519050612b9f81614008565b92915050565b600060208284031215612bb757600080fd5b6000612bc584828501612ad3565b91505092915050565b60008060408385031215612be157600080fd5b6000612bef85828601612ad3565b9250506020612c0085828601612ad3565b9150509250929050565b600080600060608486031215612c1f57600080fd5b6000612c2d86828701612ad3565b9350506020612c3e86828701612ad3565b9250506040612c4f86828701612b7b565b9150509250925092565b60008060008060808587031215612c6f57600080fd5b6000612c7d87828801612ad3565b9450506020612c8e87828801612ad3565b9350506040612c9f87828801612b7b565b925050606085013567ffffffffffffffff811115612cbc57600080fd5b612cc887828801612b27565b91505092959194509250565b60008060408385031215612ce757600080fd5b6000612cf585828601612ad3565b9250506020612d0685828601612ae8565b9150509250929050565b60008060408385031215612d2357600080fd5b6000612d3185828601612ad3565b9250506020612d4285828601612b7b565b9150509250929050565b600060208284031215612d5e57600080fd5b6000612d6c84828501612afd565b91505092915050565b600060208284031215612d8757600080fd5b6000612d9584828501612b12565b91505092915050565b600060208284031215612db057600080fd5b600082013567ffffffffffffffff811115612dca57600080fd5b612dd684828501612b51565b91505092915050565b600060208284031215612df157600080fd5b6000612dff84828501612b7b565b91505092915050565b600060208284031215612e1a57600080fd5b6000612e2884828501612b90565b91505092915050565b612e3a81613d80565b82525050565b612e4981613d80565b82525050565b612e5881613d92565b82525050565b6000612e6982613c82565b612e738185613c98565b9350612e83818560208601613e17565b612e8c81613fb2565b840191505092915050565b6000612ea282613c8d565b612eac8185613ca9565b9350612ebc818560208601613e17565b612ec581613fb2565b840191505092915050565b6000612edb82613c8d565b612ee58185613cba565b9350612ef5818560208601613e17565b80840191505092915050565b60008154612f0e81613e4a565b612f188186613cba565b94506001821660008114612f335760018114612f4457612f77565b60ff19831686528186019350612f77565b612f4d85613c6d565b60005b83811015612f6f57815481890152600182019150602081019050612f50565b838801955050505b50505092915050565b6000612f8d602283613ca9565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ff3600f83613ca9565b91507f4e6f74204e465420686f6c6465722100000000000000000000000000000000006000830152602082019050919050565b6000613033602683613ca9565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613099602a83613ca9565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b60006130ff602383613ca9565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613165602583613ca9565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131cb600783613ca9565b91507f50617573656421000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061320b603983613ca9565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b6000613271602b83613ca9565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b60006132d7602683613ca9565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061333d600583613cba565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b600061337d602083613ca9565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006133bd602f83613ca9565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613423601a83613ca9565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b6000613463603283613ca9565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b60006134c9601683613ca9565b91507f53616c652068617320616c726561647920656e646564000000000000000000006000830152602082019050919050565b6000613509602283613ca9565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061356f603383613ca9565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b60006135d5602183613ca9565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061363b602883613ca9565b91507f455243373231413a207175616e74697479206d7573742062652067726561746560008301527f72207468616e20300000000000000000000000000000000000000000000000006020830152604082019050919050565b60006136a1602e83613ca9565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b6000613707602f83613ca9565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061376d602d83613ca9565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b6040820160008201516137dc6000850182612e31565b5060208201516137ef6020850182613804565b50505050565b6137fe81613dea565b82525050565b61380d81613df4565b82525050565b600061381f8285612f01565b915061382b8284612ed0565b915061383682613330565b91508190509392505050565b60006020820190506138576000830184612e40565b92915050565b60006080820190506138726000830187612e40565b61387f6020830186612e40565b61388c60408301856137f5565b818103606083015261389e8184612e5e565b905095945050505050565b60006020820190506138be6000830184612e4f565b92915050565b600060208201905081810360008301526138de8184612e97565b905092915050565b600060208201905081810360008301526138ff81612f80565b9050919050565b6000602082019050818103600083015261391f81612fe6565b9050919050565b6000602082019050818103600083015261393f81613026565b9050919050565b6000602082019050818103600083015261395f8161308c565b9050919050565b6000602082019050818103600083015261397f816130f2565b9050919050565b6000602082019050818103600083015261399f81613158565b9050919050565b600060208201905081810360008301526139bf816131be565b9050919050565b600060208201905081810360008301526139df816131fe565b9050919050565b600060208201905081810360008301526139ff81613264565b9050919050565b60006020820190508181036000830152613a1f816132ca565b9050919050565b60006020820190508181036000830152613a3f81613370565b9050919050565b60006020820190508181036000830152613a5f816133b0565b9050919050565b60006020820190508181036000830152613a7f81613416565b9050919050565b60006020820190508181036000830152613a9f81613456565b9050919050565b60006020820190508181036000830152613abf816134bc565b9050919050565b60006020820190508181036000830152613adf816134fc565b9050919050565b60006020820190508181036000830152613aff81613562565b9050919050565b60006020820190508181036000830152613b1f816135c8565b9050919050565b60006020820190508181036000830152613b3f8161362e565b9050919050565b60006020820190508181036000830152613b5f81613694565b9050919050565b60006020820190508181036000830152613b7f816136fa565b9050919050565b60006020820190508181036000830152613b9f81613760565b9050919050565b6000604082019050613bbb60008301846137c6565b92915050565b6000602082019050613bd660008301846137f5565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613c0357613c02613f83565b5b8060405250919050565b600067ffffffffffffffff821115613c2857613c27613f83565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613c5857613c57613f83565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cd082613dea565b9150613cdb83613dea565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d1057613d0f613ef6565b5b828201905092915050565b6000613d2682613dea565b9150613d3183613dea565b925082613d4157613d40613f25565b5b828204905092915050565b6000613d5782613dea565b9150613d6283613dea565b925082821015613d7557613d74613ef6565b5b828203905092915050565b6000613d8b82613dca565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613e35578082015181840152602081019050613e1a565b83811115613e44576000848401525b50505050565b60006002820490506001821680613e6257607f821691505b60208210811415613e7657613e75613f54565b5b50919050565b6000613e8782613dea565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613eba57613eb9613ef6565b5b600182019050919050565b6000613ed082613dea565b9150613edb83613dea565b925082613eeb57613eea613f25565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613fcc81613d80565b8114613fd757600080fd5b50565b613fe381613d92565b8114613fee57600080fd5b50565b613ffa81613d9e565b811461400557600080fd5b50565b61401181613dea565b811461401c57600080fd5b5056fea26469706673582212202525a5c4b29bb95e985fd26b30d2546c2af34b9cb51bd15f43612c0b4688a15664736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101d85760003560e01c80638456cb5911610102578063ad236d4c11610095578063cd85cdb511610064578063cd85cdb5146106c1578063e985e9c5146106ec578063f2fde38b14610729578063f7b188a514610752576101d8565b8063ad236d4c14610607578063b5077f4414610630578063b88d4fde1461065b578063c87b56dd14610684576101d8565b806395d89b41116100d157806395d89b411461054b5780639635635514610576578063976c2a50146105a1578063a22cb465146105de576101d8565b80638456cb59146104b05780638da5cb5b146104c75780639231ab2a146104f2578063926427441461052f576101d8565b80632f745c591161017a57806355f804b31161014957806355f804b3146103f65780636352211e1461041f57806370a082311461045c578063715018a614610499576101d8565b80632f745c591461032a5780633461fc791461036757806342842e0e146103905780634f6ccce7146103b9576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806313c21cd0146102ab57806318160ddd146102d657806323b872dd14610301576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612d4c565b610769565b60405161021191906138a9565b60405180910390f35b34801561022657600080fd5b5061022f6108b3565b60405161023c91906138c4565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190612ddf565b610945565b6040516102799190613842565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190612d10565b6109ca565b005b3480156102b757600080fd5b506102c0610ae3565b6040516102cd9190613842565b60405180910390f35b3480156102e257600080fd5b506102eb610b09565b6040516102f89190613bc1565b60405180910390f35b34801561030d57600080fd5b5061032860048036038101906103239190612c0a565b610b13565b005b34801561033657600080fd5b50610351600480360381019061034c9190612d10565b610b23565b60405161035e9190613bc1565b60405180910390f35b34801561037357600080fd5b5061038e60048036038101906103899190612ba5565b610d15565b005b34801561039c57600080fd5b506103b760048036038101906103b29190612c0a565b610dd5565b005b3480156103c557600080fd5b506103e060048036038101906103db9190612ddf565b610df5565b6040516103ed9190613bc1565b60405180910390f35b34801561040257600080fd5b5061041d60048036038101906104189190612d9e565b610e48565b005b34801561042b57600080fd5b5061044660048036038101906104419190612ddf565b610ede565b6040516104539190613842565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e9190612ba5565b610ef4565b6040516104909190613bc1565b60405180910390f35b3480156104a557600080fd5b506104ae610fdd565b005b3480156104bc57600080fd5b506104c5611065565b005b3480156104d357600080fd5b506104dc6110fe565b6040516104e99190613842565b60405180910390f35b3480156104fe57600080fd5b5061051960048036038101906105149190612ddf565b611127565b6040516105269190613ba6565b60405180910390f35b61054960048036038101906105449190612ddf565b61113f565b005b34801561055757600080fd5b5061056061125c565b60405161056d91906138c4565b60405180910390f35b34801561058257600080fd5b5061058b6112ee565b6040516105989190613bc1565b60405180910390f35b3480156105ad57600080fd5b506105c860048036038101906105c39190612ba5565b6112fd565b6040516105d59190613bc1565b60405180910390f35b3480156105ea57600080fd5b5061060560048036038101906106009190612cd4565b6113b1565b005b34801561061357600080fd5b5061062e60048036038101906106299190612ddf565b611532565b005b34801561063c57600080fd5b50610645611656565b6040516106529190613bc1565b60405180910390f35b34801561066757600080fd5b50610682600480360381019061067d9190612c59565b61165c565b005b34801561069057600080fd5b506106ab60048036038101906106a69190612ddf565b6116b8565b6040516106b891906138c4565b60405180910390f35b3480156106cd57600080fd5b506106d6611760565b6040516106e391906138a9565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190612bce565b611773565b60405161072091906138a9565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b9190612ba5565b611807565b005b34801561075e57600080fd5b506107676118ff565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061083457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061089c57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108ac57506108ab82611998565b5b9050919050565b6060600280546108c290613e4a565b80601f01602080910402602001604051908101604052809291908181526020018280546108ee90613e4a565b801561093b5780601f106109105761010080835404028352916020019161093b565b820191906000526020600020905b81548152906001019060200180831161091e57829003601f168201915b5050505050905090565b600061095082611a02565b61098f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098690613b86565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109d582610ede565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3d90613ac6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a65611a10565b73ffffffffffffffffffffffffffffffffffffffff161480610a945750610a9381610a8e611a10565b611773565b5b610ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aca906139c6565b60405180910390fd5b610ade838383611a18565b505050565b600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600154905090565b610b1e838383611aca565b505050565b6000610b2e83610ef4565b8210610b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b66906138e6565b60405180910390fd5b6000610b79610b09565b905060008060005b83811015610cd3576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610c7357806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cc55786841415610cbc578195505050505050610d0f565b83806001019450505b508080600101915050610b81565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690613b46565b60405180910390fd5b92915050565b610d1d611a10565b73ffffffffffffffffffffffffffffffffffffffff16610d3b6110fe565b73ffffffffffffffffffffffffffffffffffffffff1614610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8890613a26565b60405180910390fd5b80600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610df08383836040518060200160405280600081525061165c565b505050565b6000610dff610b09565b8210610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3790613966565b60405180910390fd5b819050919050565b610e50611a10565b73ffffffffffffffffffffffffffffffffffffffff16610e6e6110fe565b73ffffffffffffffffffffffffffffffffffffffff1614610ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebb90613a26565b60405180910390fd5b8060099080519060200190610eda92919061297a565b5050565b6000610ee98261200a565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c906139e6565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b610fe5611a10565b73ffffffffffffffffffffffffffffffffffffffff166110036110fe565b73ffffffffffffffffffffffffffffffffffffffff1614611059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105090613a26565b60405180910390fd5b61106360006121a4565b565b61106d611a10565b73ffffffffffffffffffffffffffffffffffffffff1661108b6110fe565b73ffffffffffffffffffffffffffffffffffffffff16146110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d890613a26565b60405180910390fd5b6001600a60006101000a81548160ff021916908315150217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61112f612a00565b6111388261200a565b9050919050565b600061114a336112fd565b90506000811161118f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118690613906565b60405180910390fd5b60008211801561119f5750808211155b6111a857600080fd5b600a60009054906101000a900460ff16156111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef906139a6565b60405180910390fd5b61030982611204610b09565b61120e9190613cc5565b1061124e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124590613aa6565b60405180910390fd5b6112583383612268565b5050565b60606003805461126b90613e4a565b80601f016020809104026020016040519081016040528092919081815260200182805461129790613e4a565b80156112e45780601f106112b9576101008083540402835291602001916112e4565b820191906000526020600020905b8154815290600101906020018083116112c757829003601f168201915b5050505050905090565b60006112f8610b09565b905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b815260040161135a9190613842565b60206040518083038186803b15801561137257600080fd5b505afa158015611386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113aa9190612e08565b9050919050565b6113b9611a10565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141e90613a66565b60405180910390fd5b8060076000611434611a10565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114e1611a10565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161152691906138a9565b60405180910390a35050565b61153a611a10565b73ffffffffffffffffffffffffffffffffffffffff166115586110fe565b73ffffffffffffffffffffffffffffffffffffffff16146115ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a590613a26565b60405180910390fd5b600a60009054906101000a900460ff16156115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f5906139a6565b60405180910390fd5b610309611609610b09565b10611649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164090613aa6565b60405180910390fd5b6116533382612268565b50565b61030981565b611667848484611aca565b61167384848484612286565b6116b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a990613ae6565b60405180910390fd5b50505050565b60606116c382611a02565b611702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f990613a46565b60405180910390fd5b60006009805461171190613e4a565b90501161172d5760405180602001604052806000815250611759565b60096117388361241d565b604051602001611749929190613813565b6040516020818303038152906040525b9050919050565b600a60009054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61180f611a10565b73ffffffffffffffffffffffffffffffffffffffff1661182d6110fe565b73ffffffffffffffffffffffffffffffffffffffff1614611883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187a90613a26565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90613926565b60405180910390fd5b6118fc816121a4565b50565b611907611a10565b73ffffffffffffffffffffffffffffffffffffffff166119256110fe565b73ffffffffffffffffffffffffffffffffffffffff161461197b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197290613a26565b60405180910390fd5b6000600a60006101000a81548160ff021916908315150217905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611ad58261200a565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611afc611a10565b73ffffffffffffffffffffffffffffffffffffffff161480611b585750611b21611a10565b73ffffffffffffffffffffffffffffffffffffffff16611b4084610945565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b745750611b738260000151611b6e611a10565b611773565b5b905080611bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bad90613a86565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1f90613a06565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8f90613986565b60405180910390fd5b611ca585858560016125ca565b611cb56000848460000151611a18565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f9a57611ef981611a02565b15611f995782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461200385858560016125d0565b5050505050565b612012612a00565b61201b82611a02565b61205a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205190613946565b60405180910390fd5b60008290505b60008110612163576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461215457809250505061219f565b50808060019003915050612060565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219690613b66565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122828282604051806020016040528060008152506125d6565b5050565b60006122a78473ffffffffffffffffffffffffffffffffffffffff166125e8565b15612410578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122d0611a10565b8786866040518563ffffffff1660e01b81526004016122f2949392919061385d565b602060405180830381600087803b15801561230c57600080fd5b505af192505050801561233d57506040513d601f19601f8201168201806040525081019061233a9190612d75565b60015b6123c0573d806000811461236d576040519150601f19603f3d011682016040523d82523d6000602084013e612372565b606091505b506000815114156123b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123af90613ae6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612415565b600190505b949350505050565b60606000821415612465576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125c5565b600082905060005b6000821461249757808061248090613e7c565b915050600a826124909190613d1b565b915061246d565b60008167ffffffffffffffff8111156124d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561250b5781602001600182028036833780820191505090505b5090505b600085146125be576001826125249190613d4c565b9150600a856125339190613ec5565b603061253f9190613cc5565b60f81b81838151811061257b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125b79190613d1b565b945061250f565b8093505050505b919050565b50505050565b50505050565b6125e383838360016125fb565b505050565b600080823b905060008111915050919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266990613b06565b60405180910390fd5b60008414156126b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ad90613b26565b60405180910390fd5b6126c360008683876125ca565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561295d57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612948576129086000888488612286565b612947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293e90613ae6565b60405180910390fd5b5b81806001019250508080600101915050612891565b50806001819055505061297360008683876125d0565b5050505050565b82805461298690613e4a565b90600052602060002090601f0160209004810192826129a857600085556129ef565b82601f106129c157805160ff19168380011785556129ef565b828001600101855582156129ef579182015b828111156129ee5782518255916020019190600101906129d3565b5b5090506129fc9190612a3a565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612a53576000816000905550600101612a3b565b5090565b6000612a6a612a6584613c0d565b613bdc565b905082815260208101848484011115612a8257600080fd5b612a8d848285613e08565b509392505050565b6000612aa8612aa384613c3d565b613bdc565b905082815260208101848484011115612ac057600080fd5b612acb848285613e08565b509392505050565b600081359050612ae281613fc3565b92915050565b600081359050612af781613fda565b92915050565b600081359050612b0c81613ff1565b92915050565b600081519050612b2181613ff1565b92915050565b600082601f830112612b3857600080fd5b8135612b48848260208601612a57565b91505092915050565b600082601f830112612b6257600080fd5b8135612b72848260208601612a95565b91505092915050565b600081359050612b8a81614008565b92915050565b600081519050612b9f81614008565b92915050565b600060208284031215612bb757600080fd5b6000612bc584828501612ad3565b91505092915050565b60008060408385031215612be157600080fd5b6000612bef85828601612ad3565b9250506020612c0085828601612ad3565b9150509250929050565b600080600060608486031215612c1f57600080fd5b6000612c2d86828701612ad3565b9350506020612c3e86828701612ad3565b9250506040612c4f86828701612b7b565b9150509250925092565b60008060008060808587031215612c6f57600080fd5b6000612c7d87828801612ad3565b9450506020612c8e87828801612ad3565b9350506040612c9f87828801612b7b565b925050606085013567ffffffffffffffff811115612cbc57600080fd5b612cc887828801612b27565b91505092959194509250565b60008060408385031215612ce757600080fd5b6000612cf585828601612ad3565b9250506020612d0685828601612ae8565b9150509250929050565b60008060408385031215612d2357600080fd5b6000612d3185828601612ad3565b9250506020612d4285828601612b7b565b9150509250929050565b600060208284031215612d5e57600080fd5b6000612d6c84828501612afd565b91505092915050565b600060208284031215612d8757600080fd5b6000612d9584828501612b12565b91505092915050565b600060208284031215612db057600080fd5b600082013567ffffffffffffffff811115612dca57600080fd5b612dd684828501612b51565b91505092915050565b600060208284031215612df157600080fd5b6000612dff84828501612b7b565b91505092915050565b600060208284031215612e1a57600080fd5b6000612e2884828501612b90565b91505092915050565b612e3a81613d80565b82525050565b612e4981613d80565b82525050565b612e5881613d92565b82525050565b6000612e6982613c82565b612e738185613c98565b9350612e83818560208601613e17565b612e8c81613fb2565b840191505092915050565b6000612ea282613c8d565b612eac8185613ca9565b9350612ebc818560208601613e17565b612ec581613fb2565b840191505092915050565b6000612edb82613c8d565b612ee58185613cba565b9350612ef5818560208601613e17565b80840191505092915050565b60008154612f0e81613e4a565b612f188186613cba565b94506001821660008114612f335760018114612f4457612f77565b60ff19831686528186019350612f77565b612f4d85613c6d565b60005b83811015612f6f57815481890152600182019150602081019050612f50565b838801955050505b50505092915050565b6000612f8d602283613ca9565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ff3600f83613ca9565b91507f4e6f74204e465420686f6c6465722100000000000000000000000000000000006000830152602082019050919050565b6000613033602683613ca9565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613099602a83613ca9565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b60006130ff602383613ca9565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613165602583613ca9565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131cb600783613ca9565b91507f50617573656421000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061320b603983613ca9565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b6000613271602b83613ca9565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b60006132d7602683613ca9565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061333d600583613cba565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b600061337d602083613ca9565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006133bd602f83613ca9565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613423601a83613ca9565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b6000613463603283613ca9565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b60006134c9601683613ca9565b91507f53616c652068617320616c726561647920656e646564000000000000000000006000830152602082019050919050565b6000613509602283613ca9565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061356f603383613ca9565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b60006135d5602183613ca9565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061363b602883613ca9565b91507f455243373231413a207175616e74697479206d7573742062652067726561746560008301527f72207468616e20300000000000000000000000000000000000000000000000006020830152604082019050919050565b60006136a1602e83613ca9565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b6000613707602f83613ca9565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061376d602d83613ca9565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b6040820160008201516137dc6000850182612e31565b5060208201516137ef6020850182613804565b50505050565b6137fe81613dea565b82525050565b61380d81613df4565b82525050565b600061381f8285612f01565b915061382b8284612ed0565b915061383682613330565b91508190509392505050565b60006020820190506138576000830184612e40565b92915050565b60006080820190506138726000830187612e40565b61387f6020830186612e40565b61388c60408301856137f5565b818103606083015261389e8184612e5e565b905095945050505050565b60006020820190506138be6000830184612e4f565b92915050565b600060208201905081810360008301526138de8184612e97565b905092915050565b600060208201905081810360008301526138ff81612f80565b9050919050565b6000602082019050818103600083015261391f81612fe6565b9050919050565b6000602082019050818103600083015261393f81613026565b9050919050565b6000602082019050818103600083015261395f8161308c565b9050919050565b6000602082019050818103600083015261397f816130f2565b9050919050565b6000602082019050818103600083015261399f81613158565b9050919050565b600060208201905081810360008301526139bf816131be565b9050919050565b600060208201905081810360008301526139df816131fe565b9050919050565b600060208201905081810360008301526139ff81613264565b9050919050565b60006020820190508181036000830152613a1f816132ca565b9050919050565b60006020820190508181036000830152613a3f81613370565b9050919050565b60006020820190508181036000830152613a5f816133b0565b9050919050565b60006020820190508181036000830152613a7f81613416565b9050919050565b60006020820190508181036000830152613a9f81613456565b9050919050565b60006020820190508181036000830152613abf816134bc565b9050919050565b60006020820190508181036000830152613adf816134fc565b9050919050565b60006020820190508181036000830152613aff81613562565b9050919050565b60006020820190508181036000830152613b1f816135c8565b9050919050565b60006020820190508181036000830152613b3f8161362e565b9050919050565b60006020820190508181036000830152613b5f81613694565b9050919050565b60006020820190508181036000830152613b7f816136fa565b9050919050565b60006020820190508181036000830152613b9f81613760565b9050919050565b6000604082019050613bbb60008301846137c6565b92915050565b6000602082019050613bd660008301846137f5565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613c0357613c02613f83565b5b8060405250919050565b600067ffffffffffffffff821115613c2857613c27613f83565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613c5857613c57613f83565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cd082613dea565b9150613cdb83613dea565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d1057613d0f613ef6565b5b828201905092915050565b6000613d2682613dea565b9150613d3183613dea565b925082613d4157613d40613f25565b5b828204905092915050565b6000613d5782613dea565b9150613d6283613dea565b925082821015613d7557613d74613ef6565b5b828203905092915050565b6000613d8b82613dca565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613e35578082015181840152602081019050613e1a565b83811115613e44576000848401525b50505050565b60006002820490506001821680613e6257607f821691505b60208210811415613e7657613e75613f54565b5b50919050565b6000613e8782613dea565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613eba57613eb9613ef6565b5b600182019050919050565b6000613ed082613dea565b9150613edb83613dea565b925082613eeb57613eea613f25565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613fcc81613d80565b8114613fd757600080fd5b50565b613fe381613d92565b8114613fee57600080fd5b50565b613ffa81613d9e565b811461400557600080fd5b50565b61401181613dea565b811461401c57600080fd5b5056fea26469706673582212202525a5c4b29bb95e985fd26b30d2546c2af34b9cb51bd15f43612c0b4688a15664736f6c63430008000033

Deployed Bytecode Sourcemap

43756:2298:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27703:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29589:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31151:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30672:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43993:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25960:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32027:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26624:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45938:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32260:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26137:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45387:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29398:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28139:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18991:94;;;;;;;;;;;;;:::i;:::-;;45606:69;;;;;;;;;;;;;:::i;:::-;;18340:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45763:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44525:415;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29758:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45506:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44377:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31437:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44144:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43942:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32508:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44948:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43905:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31796:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19240:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45683:72;;;;;;;;;;;;;:::i;:::-;;27703:372;27805:4;27857:25;27842:40;;;:11;:40;;;;:105;;;;27914:33;27899:48;;;:11;:48;;;;27842:105;:172;;;;27979:35;27964:50;;;:11;:50;;;;27842:172;:225;;;;28031:36;28055:11;28031:23;:36::i;:::-;27842:225;27822:245;;27703:372;;;:::o;29589:100::-;29643:13;29676:5;29669:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29589:100;:::o;31151:214::-;31219:7;31247:16;31255:7;31247;:16::i;:::-;31239:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31333:15;:24;31349:7;31333:24;;;;;;;;;;;;;;;;;;;;;31326:31;;31151:214;;;:::o;30672:413::-;30745:13;30761:24;30777:7;30761:15;:24::i;:::-;30745:40;;30810:5;30804:11;;:2;:11;;;;30796:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30905:5;30889:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30914:37;30931:5;30938:12;:10;:12::i;:::-;30914:16;:37::i;:::-;30889:62;30867:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;31049:28;31058:2;31062:7;31071:5;31049:8;:28::i;:::-;30672:413;;;:::o;43993:74::-;;;;;;;;;;;;;:::o;25960:100::-;26013:7;26040:12;;26033:19;;25960:100;:::o;32027:162::-;32153:28;32163:4;32169:2;32173:7;32153:9;:28::i;:::-;32027:162;;;:::o;26624:1007::-;26713:7;26749:16;26759:5;26749:9;:16::i;:::-;26741:5;:24;26733:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26815:22;26840:13;:11;:13::i;:::-;26815:38;;26864:19;26894:25;27083:9;27078:466;27098:14;27094:1;:18;27078:466;;;27138:31;27172:11;:14;27184:1;27172:14;;;;;;;;;;;27138:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27235:1;27209:28;;:9;:14;;;:28;;;27205:111;;27282:9;:14;;;27262:34;;27205:111;27359:5;27338:26;;:17;:26;;;27334:195;;;27408:5;27393:11;:20;27389:85;;;27449:1;27442:8;;;;;;;;;27389:85;27496:13;;;;;;;27334:195;27078:466;27114:3;;;;;;;27078:466;;;;27567:56;;;;;;;;;;:::i;:::-;;;;;;;;26624:1007;;;;;:::o;45938:113::-;18571:12;:10;:12::i;:::-;18560:23;;:7;:5;:7::i;:::-;:23;;;18552:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46034:9:::1;46017:14;;:26;;;;;;;;;;;;;;;;;;45938:113:::0;:::o;32260:177::-;32390:39;32407:4;32413:2;32417:7;32390:39;;;;;;;;;;;;:16;:39::i;:::-;32260:177;;;:::o;26137:187::-;26204:7;26240:13;:11;:13::i;:::-;26232:5;:21;26224:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;26311:5;26304:12;;26137:187;;;:::o;45387:111::-;18571:12;:10;:12::i;:::-;18560:23;;:7;:5;:7::i;:::-;:23;;;18552:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45482:8:::1;45463:16;:27;;;;;;;;;;;;:::i;:::-;;45387:111:::0;:::o;29398:124::-;29462:7;29489:20;29501:7;29489:11;:20::i;:::-;:25;;;29482:32;;29398:124;;;:::o;28139:221::-;28203:7;28248:1;28231:19;;:5;:19;;;;28223:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;28324:12;:19;28337:5;28324:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28316:36;;28309:43;;28139:221;;;:::o;18991:94::-;18571:12;:10;:12::i;:::-;18560:23;;:7;:5;:7::i;:::-;:23;;;18552:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19056:21:::1;19074:1;19056:9;:21::i;:::-;18991:94::o:0;45606:69::-;18571:12;:10;:12::i;:::-;18560:23;;:7;:5;:7::i;:::-;:23;;;18552:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45663:4:::1;45651:9;;:16;;;;;;;;;;;;;;;;;;45606:69::o:0;18340:87::-;18386:7;18413:6;;;;;;;;;;;18406:13;;18340:87;:::o;45763:167::-;45856:21;;:::i;:::-;45902:20;45914:7;45902:11;:20::i;:::-;45895:27;;45763:167;;;:::o;44525:415::-;44587:21;44611:26;44626:10;44611:14;:26::i;:::-;44587:50;;44674:1;44658:13;:17;44650:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;44726:1;44714:9;:13;:43;;;;;44744:13;44731:9;:26;;44714:43;44706:52;;;;;;44778:9;;;;;;;;;;;44777:10;44769:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;43983:3;44834:9;44818:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:42;44810:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;44900:32;44910:10;44922:9;44900;:32::i;:::-;44525:415;;:::o;29758:104::-;29814:13;29847:7;29840:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29758:104;:::o;45506:92::-;45550:7;45577:13;:11;:13::i;:::-;45570:20;;45506:92;:::o;44377:140::-;44440:7;44475:14;;;;;;;;;;;44467:33;;;44501:7;44467:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44460:49;;44377:140;;;:::o;31437:288::-;31544:12;:10;:12::i;:::-;31532:24;;:8;:24;;;;31524:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;31645:8;31600:18;:32;31619:12;:10;:12::i;:::-;31600:32;;;;;;;;;;;;;;;:42;31633:8;31600:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31698:8;31669:48;;31684:12;:10;:12::i;:::-;31669:48;;;31708:8;31669:48;;;;;;:::i;:::-;;;;;;;;31437:288;;:::o;44144:225::-;18571:12;:10;:12::i;:::-;18560:23;;:7;:5;:7::i;:::-;:23;;;18552:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44222:9:::1;;;;;;;;;;;44221:10;44213:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;43983:3;44262:13;:11;:13::i;:::-;:30;44254:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44332:29;44342:10;44354:6;44332:9;:29::i;:::-;44144:225:::0;:::o;43942:44::-;43983:3;43942:44;:::o;32508:355::-;32667:28;32677:4;32683:2;32687:7;32667:9;:28::i;:::-;32728:48;32751:4;32757:2;32761:7;32770:5;32728:22;:48::i;:::-;32706:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;32508:355;;;;:::o;44948:306::-;45013:13;45047:16;45055:7;45047;:16::i;:::-;45039:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;45166:1;45139:16;45133:30;;;;;:::i;:::-;;;:34;:113;;;;;;;;;;;;;;;;;45194:16;45212:18;:7;:16;:18::i;:::-;45177:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45133:113;45126:120;;44948:306;;;:::o;43905:28::-;;;;;;;;;;;;;:::o;31796:164::-;31893:4;31917:18;:25;31936:5;31917:25;;;;;;;;;;;;;;;:35;31943:8;31917:35;;;;;;;;;;;;;;;;;;;;;;;;;31910:42;;31796:164;;;;:::o;19240:192::-;18571:12;:10;:12::i;:::-;18560:23;;:7;:5;:7::i;:::-;:23;;;18552:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19349:1:::1;19329:22;;:8;:22;;;;19321:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19405:19;19415:8;19405:9;:19::i;:::-;19240:192:::0;:::o;45683:72::-;18571:12;:10;:12::i;:::-;18560:23;;:7;:5;:7::i;:::-;:23;;;18552:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45742:5:::1;45730:9;;:17;;;;;;;;;;;;;;;;;;45683:72::o:0;17239:157::-;17324:4;17363:25;17348:40;;;:11;:40;;;;17341:47;;17239:157;;;:::o;33118:111::-;33175:4;33209:12;;33199:7;:22;33192:29;;33118:111;;;:::o;603:98::-;656:7;683:10;676:17;;603:98;:::o;38038:196::-;38180:2;38153:15;:24;38169:7;38153:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38218:7;38214:2;38198:28;;38207:5;38198:28;;;;;;;;;;;;38038:196;;;:::o;35918:2002::-;36033:35;36071:20;36083:7;36071:11;:20::i;:::-;36033:58;;36104:22;36146:13;:18;;;36130:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;36205:12;:10;:12::i;:::-;36181:36;;:20;36193:7;36181:11;:20::i;:::-;:36;;;36130:87;:154;;;;36234:50;36251:13;:18;;;36271:12;:10;:12::i;:::-;36234:16;:50::i;:::-;36130:154;36104:181;;36306:17;36298:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;36421:4;36399:26;;:13;:18;;;:26;;;36391:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;36501:1;36487:16;;:2;:16;;;;36479:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;36558:43;36580:4;36586:2;36590:7;36599:1;36558:21;:43::i;:::-;36666:49;36683:1;36687:7;36696:13;:18;;;36666:8;:49::i;:::-;37041:1;37011:12;:18;37024:4;37011:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37085:1;37057:12;:16;37070:2;37057:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37131:2;37103:11;:20;37115:7;37103:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;37193:15;37148:11;:20;37160:7;37148:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;37461:19;37493:1;37483:7;:11;37461:33;;37554:1;37513:43;;:11;:24;37525:11;37513:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;37509:295;;;37581:20;37589:11;37581:7;:20::i;:::-;37577:212;;;37658:13;:18;;;37626:11;:24;37638:11;37626:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;37741:13;:28;;;37699:11;:24;37711:11;37699:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;37577:212;37509:295;35918:2002;37851:7;37847:2;37832:27;;37841:4;37832:27;;;;;;;;;;;;37870:42;37891:4;37897:2;37901:7;37910:1;37870:20;:42::i;:::-;35918:2002;;;;;:::o;28799:537::-;28860:21;;:::i;:::-;28902:16;28910:7;28902;:16::i;:::-;28894:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29008:12;29023:7;29008:22;;29003:245;29040:1;29032:4;:9;29003:245;;29070:31;29104:11;:17;29116:4;29104:17;;;;;;;;;;;29070:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29170:1;29144:28;;:9;:14;;;:28;;;29140:93;;29204:9;29197:16;;;;;;29140:93;29003:245;29043:6;;;;;;;;29003:245;;;;29271:57;;;;;;;;;;:::i;:::-;;;;;;;;28799:537;;;;:::o;19440:173::-;19496:16;19515:6;;;;;;;;;;;19496:25;;19541:8;19532:6;;:17;;;;;;;;;;;;;;;;;;19596:8;19565:40;;19586:8;19565:40;;;;;;;;;;;;19440:173;;:::o;33237:104::-;33306:27;33316:2;33320:8;33306:27;;;;;;;;;;;;:9;:27::i;:::-;33237:104;;:::o;38799:804::-;38954:4;38975:15;:2;:13;;;:15::i;:::-;38971:625;;;39027:2;39011:36;;;39048:12;:10;:12::i;:::-;39062:4;39068:7;39077:5;39011:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39007:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39274:1;39257:6;:13;:18;39253:273;;;39300:61;;;;;;;;;;:::i;:::-;;;;;;;;39253:273;39476:6;39470:13;39461:6;39457:2;39453:15;39446:38;39007:534;39144:45;;;39134:55;;;:6;:55;;;;39127:62;;;;;38971:625;39580:4;39573:11;;38799:804;;;;;;;:::o;22496:723::-;22552:13;22782:1;22773:5;:10;22769:53;;;22800:10;;;;;;;;;;;;;;;;;;;;;22769:53;22832:12;22847:5;22832:20;;22863:14;22888:78;22903:1;22895:4;:9;22888:78;;22921:8;;;;;:::i;:::-;;;;22952:2;22944:10;;;;;:::i;:::-;;;22888:78;;;22976:19;23008:6;22998:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22976:39;;23026:154;23042:1;23033:5;:10;23026:154;;23070:1;23060:11;;;;;:::i;:::-;;;23137:2;23129:5;:10;;;;:::i;:::-;23116:2;:24;;;;:::i;:::-;23103:39;;23086:6;23093;23086:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;23166:2;23157:11;;;;;:::i;:::-;;;23026:154;;;23204:6;23190:21;;;;;22496:723;;;;:::o;40098:159::-;;;;;:::o;40669:158::-;;;;;:::o;33704:163::-;33827:32;33833:2;33837:8;33847:5;33854:4;33827:5;:32::i;:::-;33704:163;;;:::o;9400:387::-;9460:4;9668:12;9735:7;9723:20;9715:28;;9778:1;9771:4;:8;9764:15;;;9400:387;;;:::o;34126:1538::-;34265:20;34288:12;;34265:35;;34333:1;34319:16;;:2;:16;;;;34311:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;34404:1;34392:8;:13;;34384:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34463:61;34493:1;34497:2;34501:12;34515:8;34463:21;:61::i;:::-;34838:8;34802:12;:16;34815:2;34802:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34903:8;34862:12;:16;34875:2;34862:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34962:2;34929:11;:25;34941:12;34929:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;35029:15;34979:11;:25;34991:12;34979:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;35062:20;35085:12;35062:35;;35119:9;35114:415;35134:8;35130:1;:12;35114:415;;;35198:12;35194:2;35173:38;;35190:1;35173:38;;;;;;;;;;;;35234:4;35230:249;;;35297:59;35328:1;35332:2;35336:12;35350:5;35297:22;:59::i;:::-;35263:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;35230:249;35499:14;;;;;;;35144:3;;;;;;;35114:415;;;;35560:12;35545;:27;;;;34126:1538;35596:60;35625:1;35629:2;35633:12;35647:8;35596:20;:60::i;:::-;34126:1538;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:143::-;;2095:6;2089:13;2080:22;;2111:33;2138:5;2111:33;:::i;:::-;2070:80;;;;:::o;2156:262::-;;2264:2;2252:9;2243:7;2239:23;2235:32;2232:2;;;2280:1;2277;2270:12;2232:2;2323:1;2348:53;2393:7;2384:6;2373:9;2369:22;2348:53;:::i;:::-;2338:63;;2294:117;2222:196;;;;:::o;2424:407::-;;;2549:2;2537:9;2528:7;2524:23;2520:32;2517:2;;;2565:1;2562;2555:12;2517:2;2608:1;2633:53;2678:7;2669:6;2658:9;2654:22;2633:53;:::i;:::-;2623:63;;2579:117;2735:2;2761:53;2806:7;2797:6;2786:9;2782:22;2761:53;:::i;:::-;2751:63;;2706:118;2507:324;;;;;:::o;2837:552::-;;;;2979:2;2967:9;2958:7;2954:23;2950:32;2947:2;;;2995:1;2992;2985:12;2947:2;3038:1;3063:53;3108:7;3099:6;3088:9;3084:22;3063:53;:::i;:::-;3053:63;;3009:117;3165:2;3191:53;3236:7;3227:6;3216:9;3212:22;3191:53;:::i;:::-;3181:63;;3136:118;3293:2;3319:53;3364:7;3355:6;3344:9;3340:22;3319:53;:::i;:::-;3309:63;;3264:118;2937:452;;;;;:::o;3395:809::-;;;;;3563:3;3551:9;3542:7;3538:23;3534:33;3531:2;;;3580:1;3577;3570:12;3531:2;3623:1;3648:53;3693:7;3684:6;3673:9;3669:22;3648:53;:::i;:::-;3638:63;;3594:117;3750:2;3776:53;3821:7;3812:6;3801:9;3797:22;3776:53;:::i;:::-;3766:63;;3721:118;3878:2;3904:53;3949:7;3940:6;3929:9;3925:22;3904:53;:::i;:::-;3894:63;;3849:118;4034:2;4023:9;4019:18;4006:32;4065:18;4057:6;4054:30;4051:2;;;4097:1;4094;4087:12;4051:2;4125:62;4179:7;4170:6;4159:9;4155:22;4125:62;:::i;:::-;4115:72;;3977:220;3521:683;;;;;;;:::o;4210:401::-;;;4332:2;4320:9;4311:7;4307:23;4303:32;4300:2;;;4348:1;4345;4338:12;4300:2;4391:1;4416:53;4461:7;4452:6;4441:9;4437:22;4416:53;:::i;:::-;4406:63;;4362:117;4518:2;4544:50;4586:7;4577:6;4566:9;4562:22;4544:50;:::i;:::-;4534:60;;4489:115;4290:321;;;;;:::o;4617:407::-;;;4742:2;4730:9;4721:7;4717:23;4713:32;4710:2;;;4758:1;4755;4748:12;4710:2;4801:1;4826:53;4871:7;4862:6;4851:9;4847:22;4826:53;:::i;:::-;4816:63;;4772:117;4928:2;4954:53;4999:7;4990:6;4979:9;4975:22;4954:53;:::i;:::-;4944:63;;4899:118;4700:324;;;;;:::o;5030:260::-;;5137:2;5125:9;5116:7;5112:23;5108:32;5105:2;;;5153:1;5150;5143:12;5105:2;5196:1;5221:52;5265:7;5256:6;5245:9;5241:22;5221:52;:::i;:::-;5211:62;;5167:116;5095:195;;;;:::o;5296:282::-;;5414:2;5402:9;5393:7;5389:23;5385:32;5382:2;;;5430:1;5427;5420:12;5382:2;5473:1;5498:63;5553:7;5544:6;5533:9;5529:22;5498:63;:::i;:::-;5488:73;;5444:127;5372:206;;;;:::o;5584:375::-;;5702:2;5690:9;5681:7;5677:23;5673:32;5670:2;;;5718:1;5715;5708:12;5670:2;5789:1;5778:9;5774:17;5761:31;5819:18;5811:6;5808:30;5805:2;;;5851:1;5848;5841:12;5805:2;5879:63;5934:7;5925:6;5914:9;5910:22;5879:63;:::i;:::-;5869:73;;5732:220;5660:299;;;;:::o;5965:262::-;;6073:2;6061:9;6052:7;6048:23;6044:32;6041:2;;;6089:1;6086;6079:12;6041:2;6132:1;6157:53;6202:7;6193:6;6182:9;6178:22;6157:53;:::i;:::-;6147:63;;6103:117;6031:196;;;;:::o;6233:284::-;;6352:2;6340:9;6331:7;6327:23;6323:32;6320:2;;;6368:1;6365;6358:12;6320:2;6411:1;6436:64;6492:7;6483:6;6472:9;6468:22;6436:64;:::i;:::-;6426:74;;6382:128;6310:207;;;;:::o;6523:108::-;6600:24;6618:5;6600:24;:::i;:::-;6595:3;6588:37;6578:53;;:::o;6637:118::-;6724:24;6742:5;6724:24;:::i;:::-;6719:3;6712:37;6702:53;;:::o;6761:109::-;6842:21;6857:5;6842:21;:::i;:::-;6837:3;6830:34;6820:50;;:::o;6876:360::-;;6990:38;7022:5;6990:38;:::i;:::-;7044:70;7107:6;7102:3;7044:70;:::i;:::-;7037:77;;7123:52;7168:6;7163:3;7156:4;7149:5;7145:16;7123:52;:::i;:::-;7200:29;7222:6;7200:29;:::i;:::-;7195:3;7191:39;7184:46;;6966:270;;;;;:::o;7242:364::-;;7358:39;7391:5;7358:39;:::i;:::-;7413:71;7477:6;7472:3;7413:71;:::i;:::-;7406:78;;7493:52;7538:6;7533:3;7526:4;7519:5;7515:16;7493:52;:::i;:::-;7570:29;7592:6;7570:29;:::i;:::-;7565:3;7561:39;7554:46;;7334:272;;;;;:::o;7612:377::-;;7746:39;7779:5;7746:39;:::i;:::-;7801:89;7883:6;7878:3;7801:89;:::i;:::-;7794:96;;7899:52;7944:6;7939:3;7932:4;7925:5;7921:16;7899:52;:::i;:::-;7976:6;7971:3;7967:16;7960:23;;7722:267;;;;;:::o;8019:845::-;;8159:5;8153:12;8188:36;8214:9;8188:36;:::i;:::-;8240:89;8322:6;8317:3;8240:89;:::i;:::-;8233:96;;8360:1;8349:9;8345:17;8376:1;8371:137;;;;8522:1;8517:341;;;;8338:520;;8371:137;8455:4;8451:9;8440;8436:25;8431:3;8424:38;8491:6;8486:3;8482:16;8475:23;;8371:137;;8517:341;8584:38;8616:5;8584:38;:::i;:::-;8644:1;8658:154;8672:6;8669:1;8666:13;8658:154;;;8746:7;8740:14;8736:1;8731:3;8727:11;8720:35;8796:1;8787:7;8783:15;8772:26;;8694:4;8691:1;8687:12;8682:17;;8658:154;;;8841:6;8836:3;8832:16;8825:23;;8524:334;;8338:520;;8126:738;;;;;;:::o;8870:366::-;;9033:67;9097:2;9092:3;9033:67;:::i;:::-;9026:74;;9130:34;9126:1;9121:3;9117:11;9110:55;9196:4;9191:2;9186:3;9182:12;9175:26;9227:2;9222:3;9218:12;9211:19;;9016:220;;;:::o;9242:313::-;;9405:67;9469:2;9464:3;9405:67;:::i;:::-;9398:74;;9502:17;9498:1;9493:3;9489:11;9482:38;9546:2;9541:3;9537:12;9530:19;;9388:167;;;:::o;9561:370::-;;9724:67;9788:2;9783:3;9724:67;:::i;:::-;9717:74;;9821:34;9817:1;9812:3;9808:11;9801:55;9887:8;9882:2;9877:3;9873:12;9866:30;9922:2;9917:3;9913:12;9906:19;;9707:224;;;:::o;9937:374::-;;10100:67;10164:2;10159:3;10100:67;:::i;:::-;10093:74;;10197:34;10193:1;10188:3;10184:11;10177:55;10263:12;10258:2;10253:3;10249:12;10242:34;10302:2;10297:3;10293:12;10286:19;;10083:228;;;:::o;10317:367::-;;10480:67;10544:2;10539:3;10480:67;:::i;:::-;10473:74;;10577:34;10573:1;10568:3;10564:11;10557:55;10643:5;10638:2;10633:3;10629:12;10622:27;10675:2;10670:3;10666:12;10659:19;;10463:221;;;:::o;10690:369::-;;10853:67;10917:2;10912:3;10853:67;:::i;:::-;10846:74;;10950:34;10946:1;10941:3;10937:11;10930:55;11016:7;11011:2;11006:3;11002:12;10995:29;11050:2;11045:3;11041:12;11034:19;;10836:223;;;:::o;11065:304::-;;11228:66;11292:1;11287:3;11228:66;:::i;:::-;11221:73;;11324:9;11320:1;11315:3;11311:11;11304:30;11360:2;11355:3;11351:12;11344:19;;11211:158;;;:::o;11375:389::-;;11538:67;11602:2;11597:3;11538:67;:::i;:::-;11531:74;;11635:34;11631:1;11626:3;11622:11;11615:55;11701:27;11696:2;11691:3;11687:12;11680:49;11755:2;11750:3;11746:12;11739:19;;11521:243;;;:::o;11770:375::-;;11933:67;11997:2;11992:3;11933:67;:::i;:::-;11926:74;;12030:34;12026:1;12021:3;12017:11;12010:55;12096:13;12091:2;12086:3;12082:12;12075:35;12136:2;12131:3;12127:12;12120:19;;11916:229;;;:::o;12151:370::-;;12314:67;12378:2;12373:3;12314:67;:::i;:::-;12307:74;;12411:34;12407:1;12402:3;12398:11;12391:55;12477:8;12472:2;12467:3;12463:12;12456:30;12512:2;12507:3;12503:12;12496:19;;12297:224;;;:::o;12527:337::-;;12708:84;12790:1;12785:3;12708:84;:::i;:::-;12701:91;;12822:7;12818:1;12813:3;12809:11;12802:28;12856:1;12851:3;12847:11;12840:18;;12691:173;;;:::o;12870:330::-;;13033:67;13097:2;13092:3;13033:67;:::i;:::-;13026:74;;13130:34;13126:1;13121:3;13117:11;13110:55;13191:2;13186:3;13182:12;13175:19;;13016:184;;;:::o;13206:379::-;;13369:67;13433:2;13428:3;13369:67;:::i;:::-;13362:74;;13466:34;13462:1;13457:3;13453:11;13446:55;13532:17;13527:2;13522:3;13518:12;13511:39;13576:2;13571:3;13567:12;13560:19;;13352:233;;;:::o;13591:324::-;;13754:67;13818:2;13813:3;13754:67;:::i;:::-;13747:74;;13851:28;13847:1;13842:3;13838:11;13831:49;13906:2;13901:3;13897:12;13890:19;;13737:178;;;:::o;13921:382::-;;14084:67;14148:2;14143:3;14084:67;:::i;:::-;14077:74;;14181:34;14177:1;14172:3;14168:11;14161:55;14247:20;14242:2;14237:3;14233:12;14226:42;14294:2;14289:3;14285:12;14278:19;;14067:236;;;:::o;14309:320::-;;14472:67;14536:2;14531:3;14472:67;:::i;:::-;14465:74;;14569:24;14565:1;14560:3;14556:11;14549:45;14620:2;14615:3;14611:12;14604:19;;14455:174;;;:::o;14635:366::-;;14798:67;14862:2;14857:3;14798:67;:::i;:::-;14791:74;;14895:34;14891:1;14886:3;14882:11;14875:55;14961:4;14956:2;14951:3;14947:12;14940:26;14992:2;14987:3;14983:12;14976:19;;14781:220;;;:::o;15007:383::-;;15170:67;15234:2;15229:3;15170:67;:::i;:::-;15163:74;;15267:34;15263:1;15258:3;15254:11;15247:55;15333:21;15328:2;15323:3;15319:12;15312:43;15381:2;15376:3;15372:12;15365:19;;15153:237;;;:::o;15396:365::-;;15559:67;15623:2;15618:3;15559:67;:::i;:::-;15552:74;;15656:34;15652:1;15647:3;15643:11;15636:55;15722:3;15717:2;15712:3;15708:12;15701:25;15752:2;15747:3;15743:12;15736:19;;15542:219;;;:::o;15767:372::-;;15930:67;15994:2;15989:3;15930:67;:::i;:::-;15923:74;;16027:34;16023:1;16018:3;16014:11;16007:55;16093:10;16088:2;16083:3;16079:12;16072:32;16130:2;16125:3;16121:12;16114:19;;15913:226;;;:::o;16145:378::-;;16308:67;16372:2;16367:3;16308:67;:::i;:::-;16301:74;;16405:34;16401:1;16396:3;16392:11;16385:55;16471:16;16466:2;16461:3;16457:12;16450:38;16514:2;16509:3;16505:12;16498:19;;16291:232;;;:::o;16529:379::-;;16692:67;16756:2;16751:3;16692:67;:::i;:::-;16685:74;;16789:34;16785:1;16780:3;16776:11;16769:55;16855:17;16850:2;16845:3;16841:12;16834:39;16899:2;16894:3;16890:12;16883:19;;16675:233;;;:::o;16914:377::-;;17077:67;17141:2;17136:3;17077:67;:::i;:::-;17070:74;;17174:34;17170:1;17165:3;17161:11;17154:55;17240:15;17235:2;17230:3;17226:12;17219:37;17282:2;17277:3;17273:12;17266:19;;17060:231;;;:::o;17367:527::-;17526:4;17521:3;17517:14;17613:4;17606:5;17602:16;17596:23;17632:63;17689:4;17684:3;17680:14;17666:12;17632:63;:::i;:::-;17541:164;17797:4;17790:5;17786:16;17780:23;17816:61;17871:4;17866:3;17862:14;17848:12;17816:61;:::i;:::-;17715:172;17495:399;;;:::o;17900:118::-;17987:24;18005:5;17987:24;:::i;:::-;17982:3;17975:37;17965:53;;:::o;18024:105::-;18099:23;18116:5;18099:23;:::i;:::-;18094:3;18087:36;18077:52;;:::o;18135:695::-;;18435:92;18523:3;18514:6;18435:92;:::i;:::-;18428:99;;18544:95;18635:3;18626:6;18544:95;:::i;:::-;18537:102;;18656:148;18800:3;18656:148;:::i;:::-;18649:155;;18821:3;18814:10;;18417:413;;;;;:::o;18836:222::-;;18967:2;18956:9;18952:18;18944:26;;18980:71;19048:1;19037:9;19033:17;19024:6;18980:71;:::i;:::-;18934:124;;;;:::o;19064:640::-;;19297:3;19286:9;19282:19;19274:27;;19311:71;19379:1;19368:9;19364:17;19355:6;19311:71;:::i;:::-;19392:72;19460:2;19449:9;19445:18;19436:6;19392:72;:::i;:::-;19474;19542:2;19531:9;19527:18;19518:6;19474:72;:::i;:::-;19593:9;19587:4;19583:20;19578:2;19567:9;19563:18;19556:48;19621:76;19692:4;19683:6;19621:76;:::i;:::-;19613:84;;19264:440;;;;;;;:::o;19710:210::-;;19835:2;19824:9;19820:18;19812:26;;19848:65;19910:1;19899:9;19895:17;19886:6;19848:65;:::i;:::-;19802:118;;;;:::o;19926:313::-;;20077:2;20066:9;20062:18;20054:26;;20126:9;20120:4;20116:20;20112:1;20101:9;20097:17;20090:47;20154:78;20227:4;20218:6;20154:78;:::i;:::-;20146:86;;20044:195;;;;:::o;20245:419::-;;20449:2;20438:9;20434:18;20426:26;;20498:9;20492:4;20488:20;20484:1;20473:9;20469:17;20462:47;20526:131;20652:4;20526:131;:::i;:::-;20518:139;;20416:248;;;:::o;20670:419::-;;20874:2;20863:9;20859:18;20851:26;;20923:9;20917:4;20913:20;20909:1;20898:9;20894:17;20887:47;20951:131;21077:4;20951:131;:::i;:::-;20943:139;;20841:248;;;:::o;21095:419::-;;21299:2;21288:9;21284:18;21276:26;;21348:9;21342:4;21338:20;21334:1;21323:9;21319:17;21312:47;21376:131;21502:4;21376:131;:::i;:::-;21368:139;;21266:248;;;:::o;21520:419::-;;21724:2;21713:9;21709:18;21701:26;;21773:9;21767:4;21763:20;21759:1;21748:9;21744:17;21737:47;21801:131;21927:4;21801:131;:::i;:::-;21793:139;;21691:248;;;:::o;21945:419::-;;22149:2;22138:9;22134:18;22126:26;;22198:9;22192:4;22188:20;22184:1;22173:9;22169:17;22162:47;22226:131;22352:4;22226:131;:::i;:::-;22218:139;;22116:248;;;:::o;22370:419::-;;22574:2;22563:9;22559:18;22551:26;;22623:9;22617:4;22613:20;22609:1;22598:9;22594:17;22587:47;22651:131;22777:4;22651:131;:::i;:::-;22643:139;;22541:248;;;:::o;22795:419::-;;22999:2;22988:9;22984:18;22976:26;;23048:9;23042:4;23038:20;23034:1;23023:9;23019:17;23012:47;23076:131;23202:4;23076:131;:::i;:::-;23068:139;;22966:248;;;:::o;23220:419::-;;23424:2;23413:9;23409:18;23401:26;;23473:9;23467:4;23463:20;23459:1;23448:9;23444:17;23437:47;23501:131;23627:4;23501:131;:::i;:::-;23493:139;;23391:248;;;:::o;23645:419::-;;23849:2;23838:9;23834:18;23826:26;;23898:9;23892:4;23888:20;23884:1;23873:9;23869:17;23862:47;23926:131;24052:4;23926:131;:::i;:::-;23918:139;;23816:248;;;:::o;24070:419::-;;24274:2;24263:9;24259:18;24251:26;;24323:9;24317:4;24313:20;24309:1;24298:9;24294:17;24287:47;24351:131;24477:4;24351:131;:::i;:::-;24343:139;;24241:248;;;:::o;24495:419::-;;24699:2;24688:9;24684:18;24676:26;;24748:9;24742:4;24738:20;24734:1;24723:9;24719:17;24712:47;24776:131;24902:4;24776:131;:::i;:::-;24768:139;;24666:248;;;:::o;24920:419::-;;25124:2;25113:9;25109:18;25101:26;;25173:9;25167:4;25163:20;25159:1;25148:9;25144:17;25137:47;25201:131;25327:4;25201:131;:::i;:::-;25193:139;;25091:248;;;:::o;25345:419::-;;25549:2;25538:9;25534:18;25526:26;;25598:9;25592:4;25588:20;25584:1;25573:9;25569:17;25562:47;25626:131;25752:4;25626:131;:::i;:::-;25618:139;;25516:248;;;:::o;25770:419::-;;25974:2;25963:9;25959:18;25951:26;;26023:9;26017:4;26013:20;26009:1;25998:9;25994:17;25987:47;26051:131;26177:4;26051:131;:::i;:::-;26043:139;;25941:248;;;:::o;26195:419::-;;26399:2;26388:9;26384:18;26376:26;;26448:9;26442:4;26438:20;26434:1;26423:9;26419:17;26412:47;26476:131;26602:4;26476:131;:::i;:::-;26468:139;;26366:248;;;:::o;26620:419::-;;26824:2;26813:9;26809:18;26801:26;;26873:9;26867:4;26863:20;26859:1;26848:9;26844:17;26837:47;26901:131;27027:4;26901:131;:::i;:::-;26893:139;;26791:248;;;:::o;27045:419::-;;27249:2;27238:9;27234:18;27226:26;;27298:9;27292:4;27288:20;27284:1;27273:9;27269:17;27262:47;27326:131;27452:4;27326:131;:::i;:::-;27318:139;;27216:248;;;:::o;27470:419::-;;27674:2;27663:9;27659:18;27651:26;;27723:9;27717:4;27713:20;27709:1;27698:9;27694:17;27687:47;27751:131;27877:4;27751:131;:::i;:::-;27743:139;;27641:248;;;:::o;27895:419::-;;28099:2;28088:9;28084:18;28076:26;;28148:9;28142:4;28138:20;28134:1;28123:9;28119:17;28112:47;28176:131;28302:4;28176:131;:::i;:::-;28168:139;;28066:248;;;:::o;28320:419::-;;28524:2;28513:9;28509:18;28501:26;;28573:9;28567:4;28563:20;28559:1;28548:9;28544:17;28537:47;28601:131;28727:4;28601:131;:::i;:::-;28593:139;;28491:248;;;:::o;28745:419::-;;28949:2;28938:9;28934:18;28926:26;;28998:9;28992:4;28988:20;28984:1;28973:9;28969:17;28962:47;29026:131;29152:4;29026:131;:::i;:::-;29018:139;;28916:248;;;:::o;29170:419::-;;29374:2;29363:9;29359:18;29351:26;;29423:9;29417:4;29413:20;29409:1;29398:9;29394:17;29387:47;29451:131;29577:4;29451:131;:::i;:::-;29443:139;;29341:248;;;:::o;29595:346::-;;29788:2;29777:9;29773:18;29765:26;;29801:133;29931:1;29920:9;29916:17;29907:6;29801:133;:::i;:::-;29755:186;;;;:::o;29947:222::-;;30078:2;30067:9;30063:18;30055:26;;30091:71;30159:1;30148:9;30144:17;30135:6;30091:71;:::i;:::-;30045:124;;;;:::o;30175:283::-;;30241:2;30235:9;30225:19;;30283:4;30275:6;30271:17;30390:6;30378:10;30375:22;30354:18;30342:10;30339:34;30336:62;30333:2;;;30401:18;;:::i;:::-;30333:2;30441:10;30437:2;30430:22;30215:243;;;;:::o;30464:331::-;;30615:18;30607:6;30604:30;30601:2;;;30637:18;;:::i;:::-;30601:2;30722:4;30718:9;30711:4;30703:6;30699:17;30695:33;30687:41;;30783:4;30777;30773:15;30765:23;;30530:265;;;:::o;30801:332::-;;30953:18;30945:6;30942:30;30939:2;;;30975:18;;:::i;:::-;30939:2;31060:4;31056:9;31049:4;31041:6;31037:17;31033:33;31025:41;;31121:4;31115;31111:15;31103:23;;30868:265;;;:::o;31139:141::-;;31211:3;31203:11;;31234:3;31231:1;31224:14;31268:4;31265:1;31255:18;31247:26;;31193:87;;;:::o;31286:98::-;;31371:5;31365:12;31355:22;;31344:40;;;:::o;31390:99::-;;31476:5;31470:12;31460:22;;31449:40;;;:::o;31495:168::-;;31612:6;31607:3;31600:19;31652:4;31647:3;31643:14;31628:29;;31590:73;;;;:::o;31669:169::-;;31787:6;31782:3;31775:19;31827:4;31822:3;31818:14;31803:29;;31765:73;;;;:::o;31844:148::-;;31983:3;31968:18;;31958:34;;;;:::o;31998:305::-;;32057:20;32075:1;32057:20;:::i;:::-;32052:25;;32091:20;32109:1;32091:20;:::i;:::-;32086:25;;32245:1;32177:66;32173:74;32170:1;32167:81;32164:2;;;32251:18;;:::i;:::-;32164:2;32295:1;32292;32288:9;32281:16;;32042:261;;;;:::o;32309:185::-;;32366:20;32384:1;32366:20;:::i;:::-;32361:25;;32400:20;32418:1;32400:20;:::i;:::-;32395:25;;32439:1;32429:2;;32444:18;;:::i;:::-;32429:2;32486:1;32483;32479:9;32474:14;;32351:143;;;;:::o;32500:191::-;;32560:20;32578:1;32560:20;:::i;:::-;32555:25;;32594:20;32612:1;32594:20;:::i;:::-;32589:25;;32633:1;32630;32627:8;32624:2;;;32638:18;;:::i;:::-;32624:2;32683:1;32680;32676:9;32668:17;;32545:146;;;;:::o;32697:96::-;;32763:24;32781:5;32763:24;:::i;:::-;32752:35;;32742:51;;;:::o;32799:90::-;;32876:5;32869:13;32862:21;32851:32;;32841:48;;;:::o;32895:149::-;;32971:66;32964:5;32960:78;32949:89;;32939:105;;;:::o;33050:126::-;;33127:42;33120:5;33116:54;33105:65;;33095:81;;;:::o;33182:77::-;;33248:5;33237:16;;33227:32;;;:::o;33265:101::-;;33341:18;33334:5;33330:30;33319:41;;33309:57;;;:::o;33372:154::-;33456:6;33451:3;33446;33433:30;33518:1;33509:6;33504:3;33500:16;33493:27;33423:103;;;:::o;33532:307::-;33600:1;33610:113;33624:6;33621:1;33618:13;33610:113;;;33709:1;33704:3;33700:11;33694:18;33690:1;33685:3;33681:11;33674:39;33646:2;33643:1;33639:10;33634:15;;33610:113;;;33741:6;33738:1;33735:13;33732:2;;;33821:1;33812:6;33807:3;33803:16;33796:27;33732:2;33581:258;;;;:::o;33845:320::-;;33926:1;33920:4;33916:12;33906:22;;33973:1;33967:4;33963:12;33994:18;33984:2;;34050:4;34042:6;34038:17;34028:27;;33984:2;34112;34104:6;34101:14;34081:18;34078:38;34075:2;;;34131:18;;:::i;:::-;34075:2;33896:269;;;;:::o;34171:233::-;;34233:24;34251:5;34233:24;:::i;:::-;34224:33;;34279:66;34272:5;34269:77;34266:2;;;34349:18;;:::i;:::-;34266:2;34396:1;34389:5;34385:13;34378:20;;34214:190;;;:::o;34410:176::-;;34459:20;34477:1;34459:20;:::i;:::-;34454:25;;34493:20;34511:1;34493:20;:::i;:::-;34488:25;;34532:1;34522:2;;34537:18;;:::i;:::-;34522:2;34578:1;34575;34571:9;34566:14;;34444:142;;;;:::o;34592:180::-;34640:77;34637:1;34630:88;34737:4;34734:1;34727:15;34761:4;34758:1;34751:15;34778:180;34826:77;34823:1;34816:88;34923:4;34920:1;34913:15;34947:4;34944:1;34937:15;34964:180;35012:77;35009:1;35002:88;35109:4;35106:1;35099:15;35133:4;35130:1;35123:15;35150:180;35198:77;35195:1;35188:88;35295:4;35292:1;35285:15;35319:4;35316:1;35309:15;35336:102;;35428:2;35424:7;35419:2;35412:5;35408:14;35404:28;35394:38;;35384:54;;;:::o;35444:122::-;35517:24;35535:5;35517:24;:::i;:::-;35510:5;35507:35;35497:2;;35556:1;35553;35546:12;35497:2;35487:79;:::o;35572:116::-;35642:21;35657:5;35642:21;:::i;:::-;35635:5;35632:32;35622:2;;35678:1;35675;35668:12;35622:2;35612:76;:::o;35694:120::-;35766:23;35783:5;35766:23;:::i;:::-;35759:5;35756:34;35746:2;;35804:1;35801;35794:12;35746:2;35736:78;:::o;35820:122::-;35893:24;35911:5;35893:24;:::i;:::-;35886:5;35883:35;35873:2;;35932:1;35929;35922:12;35873:2;35863:79;:::o

Swarm Source

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