ETH Price: $2,608.15 (-6.07%)

Token

SOS (SOS)
 

Overview

Max Total Supply

8 SOS

Holders

5

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
Cypherzilla
Balance
2 SOS
0x2B7E05173fCfE4C12A8AbD7Fbf8F97cc9b465492
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:
SOS

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 2021-12-26
*/

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)





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

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





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

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



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

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



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

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



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

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

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

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





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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)



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

// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)



/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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





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

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











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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @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 virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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




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






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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)






/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


// OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol)





// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)





/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}



/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

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

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

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)





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

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

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

    /**
     * @dev 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 {
        _transferOwnership(address(0));
    }

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

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













//........................................................................
//........................................................................
//...||     ||     ||     ||  || ||||||    ||    || ||||||||||||| |||||||
//...|||| ||||    ||||    || ||  ||        |||   || ||      ||   ||||
//...||  || ||   ||  ||   ||||   |||||     || || || |||||   ||     |||||
//...||     ||  ||||||||  || ||  ||        ||  |||| ||      ||        |||
//...||     || ||      || ||  || ||||||    ||    || ||      ||   |||||||
//...
//...||    ||    ||||  ||||||||    ||          ||     ||      ||||||
//...|||   ||   ||  ||    ||        ||   ||   ||     ||||     ||   ||
//...|| || ||  ||    ||   ||         || ||| |||     ||  ||    ||||||
//...||  ||||   ||  ||    ||          |||  |||     ||||||||   ||   ||
//...||    ||    ||||     ||           ||  ||     ||      ||  ||    ||
//........................................................................
//..........................................................SOS --refugee
//........................................................................
 
contract SOS is ERC721,ERC721Enumerable, Ownable {
 

    ERC20 public erc20PaymentToken;
    uint256 private _erc20Amt = 10000000 ether; 
    using Strings for uint256; 
    string _baseTokenURI; 
    // stay foxy my friends
    uint256 private _price = 0.06 ether; 
    bool public _paused = true; 
    bool public _pausedErc20Mint = true;   
    mapping (address => uint256) public erc20TokenBalance;

    // withdraw addresses
    address f1 = 0xb4a20CE1411F19397d94B940B85C7148123110c8; 
       
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
 
    constructor(
        string memory name,
        string memory symbol,
        string memory baseURI
    ) ERC721(name,symbol)  {
        setBaseURI(baseURI);
    }
    
    function setErc20PaymentToken(address _erc20PaymentToken) external onlyOwner { 
         erc20PaymentToken = ERC20(_erc20PaymentToken); 
    }

    function SOSMint(uint256 num) public payable {
        uint256 supply = totalSupply(); 
        require( !_paused,                      "Minting paused" );
        require( num < 31,                      "You can mint a maximum of 30 NFTs" );
        require( supply + num < 10001,          "Exceeds maximum supply" );
        require( msg.value >= _price * num,     "Eth sent is not correct" ); 
        for(uint256 i; i < num; i++){
            _safeMint( msg.sender, supply + i ); 
        }
    }
 
    //require( erc20PaymentToken.balanceOf(msg.sender) > 10,          "Not enough token");
    //save gas by handling on front end
    //require(erc20PaymentToken.allowance(msg.sender, f1) == _erc20Amt * num, "Not enough token");
    function SOSTokenMint(uint256 num) public {
        uint256 supply = totalSupply(); 
        require( !_pausedErc20Mint,             "Minting paused" );
        require( num < 31,                      "You can mint a maximum of 30 NFTs" );
        require( supply + num < 10001,          "Exceeds maximum supply" ); 
        erc20PaymentToken.transferFrom(msg.sender, f1, _erc20Amt * num); 
        for(uint256 i; i < num; i++){
            _safeMint( msg.sender, supply + i ); 
        } 
    }

    function giveAway(address _to, uint256 _amount) external onlyOwner() {
        uint256 supply = totalSupply(); 
        require( supply + _amount < 10001,  "Exceeds maximum supply" );
        for(uint256 i; i < _amount; i++){
            _safeMint( _to, supply + i );
            erc20TokenBalance[_to]++;
        } 
    }

    function walletOfOwner(address _owner) public view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner); 
        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }
    
    function setPrice(uint256 _newPrice) public onlyOwner() {
        _price = _newPrice;
    }

    function getPrice() public view returns (uint256){
        return _price;
    }
 
    function setErc20Amt(uint256 _newErc20Amt) public onlyOwner() {
        _erc20Amt = _newErc20Amt;
    }

    function getErc20Amt() public view returns (uint256){
        return _erc20Amt;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }
    
    function setBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }
 
    function pause(bool val) public onlyOwner {
        _paused = val;
    }

    function pausedErc20Mint(bool val) public onlyOwner {
        _pausedErc20Mint = val;
    }
    
    function withdrawAll() public payable onlyOwner {
        uint256 _each = address(this).balance;
        require(payable(f1).send(_each));
    }
  
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"SOSMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"SOSTokenMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_pausedErc20Mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"erc20PaymentToken","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"erc20TokenBalance","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":[],"name":"getErc20Amt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"giveAway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"pausedErc20Mint","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"_newErc20Amt","type":"uint256"}],"name":"setErc20Amt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20PaymentToken","type":"address"}],"name":"setErc20PaymentToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526a084595161401484a000000600c5566d529ae9e860000600e556001600f60006101000a81548160ff0219169083151502179055506001600f60016101000a81548160ff02191690831515021790555073b4a20ce1411f19397d94b940b85c7148123110c8601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000b657600080fd5b5060405162004d7a38038062004d7a8339818101604052810190620000dc919062000411565b82828160009080519060200190620000f6929190620002ef565b5080600190805190602001906200010f929190620002ef565b50505062000132620001266200014c60201b60201c565b6200015460201b60201c565b62000143816200021a60201b60201c565b50505062000658565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200022a6200014c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000250620002c560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a090620004f4565b60405180910390fd5b80600d9080519060200190620002c1929190620002ef565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002fd90620005c4565b90600052602060002090601f0160209004810192826200032157600085556200036d565b82601f106200033c57805160ff19168380011785556200036d565b828001600101855582156200036d579182015b828111156200036c5782518255916020019190600101906200034f565b5b5090506200037c919062000380565b5090565b5b808211156200039b57600081600090555060010162000381565b5090565b6000620003b6620003b0846200054a565b62000516565b905082815260208101848484011115620003cf57600080fd5b620003dc8482856200058e565b509392505050565b600082601f830112620003f657600080fd5b8151620004088482602086016200039f565b91505092915050565b6000806000606084860312156200042757600080fd5b600084015167ffffffffffffffff8111156200044257600080fd5b6200045086828701620003e4565b935050602084015167ffffffffffffffff8111156200046e57600080fd5b6200047c86828701620003e4565b925050604084015167ffffffffffffffff8111156200049a57600080fd5b620004a886828701620003e4565b9150509250925092565b6000620004c16020836200057d565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600060208201905081810360008301526200050f81620004b2565b9050919050565b6000604051905081810181811067ffffffffffffffff8211171562000540576200053f62000629565b5b8060405250919050565b600067ffffffffffffffff82111562000568576200056762000629565b5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b60005b83811015620005ae57808201518184015260208101905062000591565b83811115620005be576000848401525b50505050565b60006002820490506001821680620005dd57607f821691505b60208210811415620005f457620005f3620005fa565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61471280620006686000396000f3fe60806040526004361061020f5760003560e01c806370a0823111610118578063a697756b116100a0578063d3fb93591161006f578063d3fb93591461077d578063d80759a8146107a8578063e985e9c5146107e5578063f2fde38b14610822578063fdaf94eb1461084b5761020f565b8063a697756b146106c3578063b88d4fde146106ee578063c87b56dd14610717578063ca800144146107545761020f565b806391b7f5ed116100e757806391b7f5ed146105f257806395d89b411461061b57806398d5fdca14610646578063a1c37ce214610671578063a22cb4651461069a5761020f565b806370a0823114610569578063715018a6146105a6578063853828b6146105bd5780638da5cb5b146105c75761020f565b80632f745c591161019b578063438b63001161016a578063438b63001461046d5780634f6ccce7146104aa57806355f804b3146104e75780636352211e14610510578063668b61261461054d5761020f565b80632f745c59146103b35780633cc3a0ed146103f0578063406300fe1461041957806342842e0e146104445761020f565b8063095ea7b3116101e2578063095ea7b3146102e257806316c61ccc1461030b57806318160ddd146103365780631b5aebf11461036157806323b872dd1461038a5761020f565b806301ffc9a71461021457806302329a291461025157806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b6004803603810190610236919061341a565b610874565b6040516102489190613ed8565b60405180910390f35b34801561025d57600080fd5b50610278600480360381019061027391906133c8565b610886565b005b34801561028657600080fd5b5061028f61091f565b60405161029c9190613f0e565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c791906134ad565b6109b1565b6040516102d99190613e18565b60405180910390f35b3480156102ee57600080fd5b506103096004803603810190610304919061338c565b610a36565b005b34801561031757600080fd5b50610320610b4e565b60405161032d9190613ed8565b60405180910390f35b34801561034257600080fd5b5061034b610b61565b60405161035891906141f0565b60405180910390f35b34801561036d57600080fd5b50610388600480360381019061038391906134ad565b610b6e565b005b34801561039657600080fd5b506103b160048036038101906103ac9190613286565b610bf4565b005b3480156103bf57600080fd5b506103da60048036038101906103d5919061338c565b610c54565b6040516103e791906141f0565b60405180910390f35b3480156103fc57600080fd5b5061041760048036038101906104129190613221565b610cf9565b005b34801561042557600080fd5b5061042e610db9565b60405161043b91906141f0565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190613286565b610dc3565b005b34801561047957600080fd5b50610494600480360381019061048f9190613221565b610de3565b6040516104a19190613eb6565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc91906134ad565b610edd565b6040516104de91906141f0565b60405180910390f35b3480156104f357600080fd5b5061050e6004803603810190610509919061346c565b610f74565b005b34801561051c57600080fd5b50610537600480360381019061053291906134ad565b61100a565b6040516105449190613e18565b60405180910390f35b610567600480360381019061056291906134ad565b6110bc565b005b34801561057557600080fd5b50610590600480360381019061058b9190613221565b611232565b60405161059d91906141f0565b60405180910390f35b3480156105b257600080fd5b506105bb6112ea565b005b6105c5611372565b005b3480156105d357600080fd5b506105dc611456565b6040516105e99190613e18565b60405180910390f35b3480156105fe57600080fd5b50610619600480360381019061061491906134ad565b611480565b005b34801561062757600080fd5b50610630611506565b60405161063d9190613f0e565b60405180910390f35b34801561065257600080fd5b5061065b611598565b60405161066891906141f0565b60405180910390f35b34801561067d57600080fd5b50610698600480360381019061069391906134ad565b6115a2565b005b3480156106a657600080fd5b506106c160048036038101906106bc9190613350565b6117a9565b005b3480156106cf57600080fd5b506106d86117bf565b6040516106e59190613ed8565b60405180910390f35b3480156106fa57600080fd5b50610715600480360381019061071091906132d5565b6117d2565b005b34801561072357600080fd5b5061073e600480360381019061073991906134ad565b611834565b60405161074b9190613f0e565b60405180910390f35b34801561076057600080fd5b5061077b6004803603810190610776919061338c565b6118db565b005b34801561078957600080fd5b50610792611a40565b60405161079f9190613ef3565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca9190613221565b611a66565b6040516107dc91906141f0565b60405180910390f35b3480156107f157600080fd5b5061080c6004803603810190610807919061324a565b611a7e565b6040516108199190613ed8565b60405180910390f35b34801561082e57600080fd5b5061084960048036038101906108449190613221565b611b12565b005b34801561085757600080fd5b50610872600480360381019061086d91906133c8565b611c0a565b005b600061087f82611ca3565b9050919050565b61088e611d1d565b73ffffffffffffffffffffffffffffffffffffffff166108ac611456565b73ffffffffffffffffffffffffffffffffffffffff1614610902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f9906140f0565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b60606000805461092e90614507565b80601f016020809104026020016040519081016040528092919081815260200182805461095a90614507565b80156109a75780601f1061097c576101008083540402835291602001916109a7565b820191906000526020600020905b81548152906001019060200180831161098a57829003601f168201915b5050505050905090565b60006109bc82611d25565b6109fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f2906140d0565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a418261100a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa990614150565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ad1611d1d565b73ffffffffffffffffffffffffffffffffffffffff161480610b005750610aff81610afa611d1d565b611a7e565b5b610b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3690614050565b60405180910390fd5b610b498383611d91565b505050565b600f60009054906101000a900460ff1681565b6000600880549050905090565b610b76611d1d565b73ffffffffffffffffffffffffffffffffffffffff16610b94611456565b73ffffffffffffffffffffffffffffffffffffffff1614610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be1906140f0565b60405180910390fd5b80600c8190555050565b610c05610bff611d1d565b82611e4a565b610c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3b906141b0565b60405180910390fd5b610c4f838383611f28565b505050565b6000610c5f83611232565b8210610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790613f30565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d01611d1d565b73ffffffffffffffffffffffffffffffffffffffff16610d1f611456565b73ffffffffffffffffffffffffffffffffffffffff1614610d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6c906140f0565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600c54905090565b610dde838383604051806020016040528060008152506117d2565b505050565b60606000610df083611232565b905060008167ffffffffffffffff811115610e34577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610e625781602001602082028036833780820191505090505b50905060005b82811015610ed257610e7a8582610c54565b828281518110610eb3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610eca90614539565b915050610e68565b508092505050919050565b6000610ee7610b61565b8210610f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1f906141d0565b60405180910390fd5b60088281548110610f62577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f7c611d1d565b73ffffffffffffffffffffffffffffffffffffffff16610f9a611456565b73ffffffffffffffffffffffffffffffffffffffff1614610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe7906140f0565b60405180910390fd5b80600d9080519060200190611006929190613030565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110aa90614090565b60405180910390fd5b80915050919050565b60006110c6610b61565b9050600f60009054906101000a900460ff1615611118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110f90613f70565b60405180910390fd5b601f821061115b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115290614030565b60405180910390fd5b612711828261116a9190614318565b106111aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a190614170565b60405180910390fd5b81600e546111b8919061439f565b3410156111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f190614190565b60405180910390fd5b60005b8281101561122d5761121a3382846112159190614318565b612184565b808061122590614539565b9150506111fd565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129a90614070565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112f2611d1d565b73ffffffffffffffffffffffffffffffffffffffff16611310611456565b73ffffffffffffffffffffffffffffffffffffffff1614611366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135d906140f0565b60405180910390fd5b61137060006121a2565b565b61137a611d1d565b73ffffffffffffffffffffffffffffffffffffffff16611398611456565b73ffffffffffffffffffffffffffffffffffffffff16146113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e5906140f0565b60405180910390fd5b6000479050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061145357600080fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611488611d1d565b73ffffffffffffffffffffffffffffffffffffffff166114a6611456565b73ffffffffffffffffffffffffffffffffffffffff16146114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f3906140f0565b60405180910390fd5b80600e8190555050565b60606001805461151590614507565b80601f016020809104026020016040519081016040528092919081815260200182805461154190614507565b801561158e5780601f106115635761010080835404028352916020019161158e565b820191906000526020600020905b81548152906001019060200180831161157157829003601f168201915b5050505050905090565b6000600e54905090565b60006115ac610b61565b9050600f60019054906101000a900460ff16156115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590613f70565b60405180910390fd5b601f8210611641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163890614030565b60405180910390fd5b61271182826116509190614318565b10611690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168790614170565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685600c54611700919061439f565b6040518463ffffffff1660e01b815260040161171e93929190613e33565b602060405180830381600087803b15801561173857600080fd5b505af115801561174c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177091906133f1565b5060005b828110156117a45761179133828461178c9190614318565b612184565b808061179c90614539565b915050611774565b505050565b6117bb6117b4611d1d565b8383612268565b5050565b600f60019054906101000a900460ff1681565b6117e36117dd611d1d565b83611e4a565b611822576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611819906141b0565b60405180910390fd5b61182e848484846123d5565b50505050565b606061183f82611d25565b61187e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187590614130565b60405180910390fd5b6000611888612431565b905060008151116118a857604051806020016040528060008152506118d3565b806118b2846124c3565b6040516020016118c3929190613df4565b6040516020818303038152906040525b915050919050565b6118e3611d1d565b73ffffffffffffffffffffffffffffffffffffffff16611901611456565b73ffffffffffffffffffffffffffffffffffffffff1614611957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194e906140f0565b60405180910390fd5b6000611961610b61565b905061271182826119729190614318565b106119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990614170565b60405180910390fd5b60005b82811015611a3a576119d28482846119cd9190614318565b612184565b601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611a2290614539565b91905055508080611a3290614539565b9150506119b5565b50505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60106020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b1a611d1d565b73ffffffffffffffffffffffffffffffffffffffff16611b38611456565b73ffffffffffffffffffffffffffffffffffffffff1614611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b85906140f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf590613f90565b60405180910390fd5b611c07816121a2565b50565b611c12611d1d565b73ffffffffffffffffffffffffffffffffffffffff16611c30611456565b73ffffffffffffffffffffffffffffffffffffffff1614611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d906140f0565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d165750611d1582612670565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e048361100a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e5582611d25565b611e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8b90614010565b60405180910390fd5b6000611e9f8361100a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f0e57508373ffffffffffffffffffffffffffffffffffffffff16611ef6846109b1565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f1f5750611f1e8185611a7e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f488261100a565b73ffffffffffffffffffffffffffffffffffffffff1614611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9590614110565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561200e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200590613fd0565b60405180910390fd5b612019838383612752565b612024600082611d91565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461207491906143f9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120cb9190614318565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61219e828260405180602001604052806000815250612762565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ce90613ff0565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123c89190613ed8565b60405180910390a3505050565b6123e0848484611f28565b6123ec848484846127bd565b61242b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242290613f50565b60405180910390fd5b50505050565b6060600d805461244090614507565b80601f016020809104026020016040519081016040528092919081815260200182805461246c90614507565b80156124b95780601f1061248e576101008083540402835291602001916124b9565b820191906000526020600020905b81548152906001019060200180831161249c57829003601f168201915b5050505050905090565b6060600082141561250b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061266b565b600082905060005b6000821461253d57808061252690614539565b915050600a82612536919061436e565b9150612513565b60008167ffffffffffffffff81111561257f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125b15781602001600182028036833780820191505090505b5090505b60008514612664576001826125ca91906143f9565b9150600a856125d99190614582565b60306125e59190614318565b60f81b818381518110612621577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561265d919061436e565b94506125b5565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061273b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061274b575061274a82612954565b5b9050919050565b61275d8383836129be565b505050565b61276c8383612ad2565b61277960008484846127bd565b6127b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127af90613f50565b60405180910390fd5b505050565b60006127de8473ffffffffffffffffffffffffffffffffffffffff16612ca0565b15612947578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612807611d1d565b8786866040518563ffffffff1660e01b81526004016128299493929190613e6a565b602060405180830381600087803b15801561284357600080fd5b505af192505050801561287457506040513d601f19601f820116820180604052508101906128719190613443565b60015b6128f7573d80600081146128a4576040519150601f19603f3d011682016040523d82523d6000602084013e6128a9565b606091505b506000815114156128ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e690613f50565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061294c565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6129c9838383612cb3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a0c57612a0781612cb8565b612a4b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a4a57612a498382612d01565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a8e57612a8981612e6e565b612acd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612acc57612acb8282612fb1565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b39906140b0565b60405180910390fd5b612b4b81611d25565b15612b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8290613fb0565b60405180910390fd5b612b9760008383612752565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612be79190614318565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d0e84611232565b612d1891906143f9565b9050600060076000848152602001908152602001600020549050818114612dfd576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e8291906143f9565b9050600060096000848152602001908152602001600020549050600060088381548110612ed8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612f20577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612f95577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612fbc83611232565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461303c90614507565b90600052602060002090601f01602090048101928261305e57600085556130a5565b82601f1061307757805160ff19168380011785556130a5565b828001600101855582156130a5579182015b828111156130a4578251825591602001919060010190613089565b5b5090506130b291906130b6565b5090565b5b808211156130cf5760008160009055506001016130b7565b5090565b60006130e66130e18461423c565b61420b565b9050828152602081018484840111156130fe57600080fd5b6131098482856144c5565b509392505050565b600061312461311f8461426c565b61420b565b90508281526020810184848401111561313c57600080fd5b6131478482856144c5565b509392505050565b60008135905061315e81614680565b92915050565b60008135905061317381614697565b92915050565b60008151905061318881614697565b92915050565b60008135905061319d816146ae565b92915050565b6000815190506131b2816146ae565b92915050565b600082601f8301126131c957600080fd5b81356131d98482602086016130d3565b91505092915050565b600082601f8301126131f357600080fd5b8135613203848260208601613111565b91505092915050565b60008135905061321b816146c5565b92915050565b60006020828403121561323357600080fd5b60006132418482850161314f565b91505092915050565b6000806040838503121561325d57600080fd5b600061326b8582860161314f565b925050602061327c8582860161314f565b9150509250929050565b60008060006060848603121561329b57600080fd5b60006132a98682870161314f565b93505060206132ba8682870161314f565b92505060406132cb8682870161320c565b9150509250925092565b600080600080608085870312156132eb57600080fd5b60006132f98782880161314f565b945050602061330a8782880161314f565b935050604061331b8782880161320c565b925050606085013567ffffffffffffffff81111561333857600080fd5b613344878288016131b8565b91505092959194509250565b6000806040838503121561336357600080fd5b60006133718582860161314f565b925050602061338285828601613164565b9150509250929050565b6000806040838503121561339f57600080fd5b60006133ad8582860161314f565b92505060206133be8582860161320c565b9150509250929050565b6000602082840312156133da57600080fd5b60006133e884828501613164565b91505092915050565b60006020828403121561340357600080fd5b600061341184828501613179565b91505092915050565b60006020828403121561342c57600080fd5b600061343a8482850161318e565b91505092915050565b60006020828403121561345557600080fd5b6000613463848285016131a3565b91505092915050565b60006020828403121561347e57600080fd5b600082013567ffffffffffffffff81111561349857600080fd5b6134a4848285016131e2565b91505092915050565b6000602082840312156134bf57600080fd5b60006134cd8482850161320c565b91505092915050565b60006134e28383613dd6565b60208301905092915050565b6134f78161442d565b82525050565b6000613508826142ac565b61351281856142da565b935061351d8361429c565b8060005b8381101561354e57815161353588826134d6565b9750613540836142cd565b925050600181019050613521565b5085935050505092915050565b6135648161443f565b82525050565b6000613575826142b7565b61357f81856142eb565b935061358f8185602086016144d4565b6135988161466f565b840191505092915050565b6135ac816144a1565b82525050565b60006135bd826142c2565b6135c781856142fc565b93506135d78185602086016144d4565b6135e08161466f565b840191505092915050565b60006135f6826142c2565b613600818561430d565b93506136108185602086016144d4565b80840191505092915050565b6000613629602b836142fc565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061368f6032836142fc565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006136f5600e836142fc565b91507f4d696e74696e67207061757365640000000000000000000000000000000000006000830152602082019050919050565b60006137356026836142fc565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061379b601c836142fc565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006137db6024836142fc565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138416019836142fc565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613881602c836142fc565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006138e76021836142fc565b91507f596f752063616e206d696e742061206d6178696d756d206f66203330204e465460008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061394d6038836142fc565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006139b3602a836142fc565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a196029836142fc565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a7f6020836142fc565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613abf602c836142fc565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613b256020836142fc565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613b656029836142fc565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bcb602f836142fc565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613c316021836142fc565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c976016836142fc565b91507f45786365656473206d6178696d756d20737570706c79000000000000000000006000830152602082019050919050565b6000613cd76017836142fc565b91507f4574682073656e74206973206e6f7420636f72726563740000000000000000006000830152602082019050919050565b6000613d176031836142fc565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613d7d602c836142fc565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b613ddf81614497565b82525050565b613dee81614497565b82525050565b6000613e0082856135eb565b9150613e0c82846135eb565b91508190509392505050565b6000602082019050613e2d60008301846134ee565b92915050565b6000606082019050613e4860008301866134ee565b613e5560208301856134ee565b613e626040830184613de5565b949350505050565b6000608082019050613e7f60008301876134ee565b613e8c60208301866134ee565b613e996040830185613de5565b8181036060830152613eab818461356a565b905095945050505050565b60006020820190508181036000830152613ed081846134fd565b905092915050565b6000602082019050613eed600083018461355b565b92915050565b6000602082019050613f0860008301846135a3565b92915050565b60006020820190508181036000830152613f2881846135b2565b905092915050565b60006020820190508181036000830152613f498161361c565b9050919050565b60006020820190508181036000830152613f6981613682565b9050919050565b60006020820190508181036000830152613f89816136e8565b9050919050565b60006020820190508181036000830152613fa981613728565b9050919050565b60006020820190508181036000830152613fc98161378e565b9050919050565b60006020820190508181036000830152613fe9816137ce565b9050919050565b6000602082019050818103600083015261400981613834565b9050919050565b6000602082019050818103600083015261402981613874565b9050919050565b60006020820190508181036000830152614049816138da565b9050919050565b6000602082019050818103600083015261406981613940565b9050919050565b60006020820190508181036000830152614089816139a6565b9050919050565b600060208201905081810360008301526140a981613a0c565b9050919050565b600060208201905081810360008301526140c981613a72565b9050919050565b600060208201905081810360008301526140e981613ab2565b9050919050565b6000602082019050818103600083015261410981613b18565b9050919050565b6000602082019050818103600083015261412981613b58565b9050919050565b6000602082019050818103600083015261414981613bbe565b9050919050565b6000602082019050818103600083015261416981613c24565b9050919050565b6000602082019050818103600083015261418981613c8a565b9050919050565b600060208201905081810360008301526141a981613cca565b9050919050565b600060208201905081810360008301526141c981613d0a565b9050919050565b600060208201905081810360008301526141e981613d70565b9050919050565b60006020820190506142056000830184613de5565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561423257614231614640565b5b8060405250919050565b600067ffffffffffffffff82111561425757614256614640565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561428757614286614640565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061432382614497565b915061432e83614497565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614363576143626145b3565b5b828201905092915050565b600061437982614497565b915061438483614497565b925082614394576143936145e2565b5b828204905092915050565b60006143aa82614497565b91506143b583614497565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143ee576143ed6145b3565b5b828202905092915050565b600061440482614497565b915061440f83614497565b925082821015614422576144216145b3565b5b828203905092915050565b600061443882614477565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006144ac826144b3565b9050919050565b60006144be82614477565b9050919050565b82818337600083830152505050565b60005b838110156144f25780820151818401526020810190506144d7565b83811115614501576000848401525b50505050565b6000600282049050600182168061451f57607f821691505b6020821081141561453357614532614611565b5b50919050565b600061454482614497565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614577576145766145b3565b5b600182019050919050565b600061458d82614497565b915061459883614497565b9250826145a8576145a76145e2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6146898161442d565b811461469457600080fd5b50565b6146a08161443f565b81146146ab57600080fd5b50565b6146b78161444b565b81146146c257600080fd5b50565b6146ce81614497565b81146146d957600080fd5b5056fea2646970667358221220add9dc3de3c9a079b08209429bc30887fd1810bab2e0b492d7e086991cd5420e64736f6c63430008000033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000003534f5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003534f530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b68747470733a2f2f3537366c6162732e636f6d2f736f736e66742f0000000000

Deployed Bytecode

0x60806040526004361061020f5760003560e01c806370a0823111610118578063a697756b116100a0578063d3fb93591161006f578063d3fb93591461077d578063d80759a8146107a8578063e985e9c5146107e5578063f2fde38b14610822578063fdaf94eb1461084b5761020f565b8063a697756b146106c3578063b88d4fde146106ee578063c87b56dd14610717578063ca800144146107545761020f565b806391b7f5ed116100e757806391b7f5ed146105f257806395d89b411461061b57806398d5fdca14610646578063a1c37ce214610671578063a22cb4651461069a5761020f565b806370a0823114610569578063715018a6146105a6578063853828b6146105bd5780638da5cb5b146105c75761020f565b80632f745c591161019b578063438b63001161016a578063438b63001461046d5780634f6ccce7146104aa57806355f804b3146104e75780636352211e14610510578063668b61261461054d5761020f565b80632f745c59146103b35780633cc3a0ed146103f0578063406300fe1461041957806342842e0e146104445761020f565b8063095ea7b3116101e2578063095ea7b3146102e257806316c61ccc1461030b57806318160ddd146103365780631b5aebf11461036157806323b872dd1461038a5761020f565b806301ffc9a71461021457806302329a291461025157806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b6004803603810190610236919061341a565b610874565b6040516102489190613ed8565b60405180910390f35b34801561025d57600080fd5b50610278600480360381019061027391906133c8565b610886565b005b34801561028657600080fd5b5061028f61091f565b60405161029c9190613f0e565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c791906134ad565b6109b1565b6040516102d99190613e18565b60405180910390f35b3480156102ee57600080fd5b506103096004803603810190610304919061338c565b610a36565b005b34801561031757600080fd5b50610320610b4e565b60405161032d9190613ed8565b60405180910390f35b34801561034257600080fd5b5061034b610b61565b60405161035891906141f0565b60405180910390f35b34801561036d57600080fd5b50610388600480360381019061038391906134ad565b610b6e565b005b34801561039657600080fd5b506103b160048036038101906103ac9190613286565b610bf4565b005b3480156103bf57600080fd5b506103da60048036038101906103d5919061338c565b610c54565b6040516103e791906141f0565b60405180910390f35b3480156103fc57600080fd5b5061041760048036038101906104129190613221565b610cf9565b005b34801561042557600080fd5b5061042e610db9565b60405161043b91906141f0565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190613286565b610dc3565b005b34801561047957600080fd5b50610494600480360381019061048f9190613221565b610de3565b6040516104a19190613eb6565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc91906134ad565b610edd565b6040516104de91906141f0565b60405180910390f35b3480156104f357600080fd5b5061050e6004803603810190610509919061346c565b610f74565b005b34801561051c57600080fd5b50610537600480360381019061053291906134ad565b61100a565b6040516105449190613e18565b60405180910390f35b610567600480360381019061056291906134ad565b6110bc565b005b34801561057557600080fd5b50610590600480360381019061058b9190613221565b611232565b60405161059d91906141f0565b60405180910390f35b3480156105b257600080fd5b506105bb6112ea565b005b6105c5611372565b005b3480156105d357600080fd5b506105dc611456565b6040516105e99190613e18565b60405180910390f35b3480156105fe57600080fd5b50610619600480360381019061061491906134ad565b611480565b005b34801561062757600080fd5b50610630611506565b60405161063d9190613f0e565b60405180910390f35b34801561065257600080fd5b5061065b611598565b60405161066891906141f0565b60405180910390f35b34801561067d57600080fd5b50610698600480360381019061069391906134ad565b6115a2565b005b3480156106a657600080fd5b506106c160048036038101906106bc9190613350565b6117a9565b005b3480156106cf57600080fd5b506106d86117bf565b6040516106e59190613ed8565b60405180910390f35b3480156106fa57600080fd5b50610715600480360381019061071091906132d5565b6117d2565b005b34801561072357600080fd5b5061073e600480360381019061073991906134ad565b611834565b60405161074b9190613f0e565b60405180910390f35b34801561076057600080fd5b5061077b6004803603810190610776919061338c565b6118db565b005b34801561078957600080fd5b50610792611a40565b60405161079f9190613ef3565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca9190613221565b611a66565b6040516107dc91906141f0565b60405180910390f35b3480156107f157600080fd5b5061080c6004803603810190610807919061324a565b611a7e565b6040516108199190613ed8565b60405180910390f35b34801561082e57600080fd5b5061084960048036038101906108449190613221565b611b12565b005b34801561085757600080fd5b50610872600480360381019061086d91906133c8565b611c0a565b005b600061087f82611ca3565b9050919050565b61088e611d1d565b73ffffffffffffffffffffffffffffffffffffffff166108ac611456565b73ffffffffffffffffffffffffffffffffffffffff1614610902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f9906140f0565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b60606000805461092e90614507565b80601f016020809104026020016040519081016040528092919081815260200182805461095a90614507565b80156109a75780601f1061097c576101008083540402835291602001916109a7565b820191906000526020600020905b81548152906001019060200180831161098a57829003601f168201915b5050505050905090565b60006109bc82611d25565b6109fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f2906140d0565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a418261100a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa990614150565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ad1611d1d565b73ffffffffffffffffffffffffffffffffffffffff161480610b005750610aff81610afa611d1d565b611a7e565b5b610b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3690614050565b60405180910390fd5b610b498383611d91565b505050565b600f60009054906101000a900460ff1681565b6000600880549050905090565b610b76611d1d565b73ffffffffffffffffffffffffffffffffffffffff16610b94611456565b73ffffffffffffffffffffffffffffffffffffffff1614610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be1906140f0565b60405180910390fd5b80600c8190555050565b610c05610bff611d1d565b82611e4a565b610c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3b906141b0565b60405180910390fd5b610c4f838383611f28565b505050565b6000610c5f83611232565b8210610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790613f30565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d01611d1d565b73ffffffffffffffffffffffffffffffffffffffff16610d1f611456565b73ffffffffffffffffffffffffffffffffffffffff1614610d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6c906140f0565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600c54905090565b610dde838383604051806020016040528060008152506117d2565b505050565b60606000610df083611232565b905060008167ffffffffffffffff811115610e34577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610e625781602001602082028036833780820191505090505b50905060005b82811015610ed257610e7a8582610c54565b828281518110610eb3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610eca90614539565b915050610e68565b508092505050919050565b6000610ee7610b61565b8210610f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1f906141d0565b60405180910390fd5b60088281548110610f62577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f7c611d1d565b73ffffffffffffffffffffffffffffffffffffffff16610f9a611456565b73ffffffffffffffffffffffffffffffffffffffff1614610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe7906140f0565b60405180910390fd5b80600d9080519060200190611006929190613030565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110aa90614090565b60405180910390fd5b80915050919050565b60006110c6610b61565b9050600f60009054906101000a900460ff1615611118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110f90613f70565b60405180910390fd5b601f821061115b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115290614030565b60405180910390fd5b612711828261116a9190614318565b106111aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a190614170565b60405180910390fd5b81600e546111b8919061439f565b3410156111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f190614190565b60405180910390fd5b60005b8281101561122d5761121a3382846112159190614318565b612184565b808061122590614539565b9150506111fd565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129a90614070565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112f2611d1d565b73ffffffffffffffffffffffffffffffffffffffff16611310611456565b73ffffffffffffffffffffffffffffffffffffffff1614611366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135d906140f0565b60405180910390fd5b61137060006121a2565b565b61137a611d1d565b73ffffffffffffffffffffffffffffffffffffffff16611398611456565b73ffffffffffffffffffffffffffffffffffffffff16146113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e5906140f0565b60405180910390fd5b6000479050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061145357600080fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611488611d1d565b73ffffffffffffffffffffffffffffffffffffffff166114a6611456565b73ffffffffffffffffffffffffffffffffffffffff16146114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f3906140f0565b60405180910390fd5b80600e8190555050565b60606001805461151590614507565b80601f016020809104026020016040519081016040528092919081815260200182805461154190614507565b801561158e5780601f106115635761010080835404028352916020019161158e565b820191906000526020600020905b81548152906001019060200180831161157157829003601f168201915b5050505050905090565b6000600e54905090565b60006115ac610b61565b9050600f60019054906101000a900460ff16156115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590613f70565b60405180910390fd5b601f8210611641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163890614030565b60405180910390fd5b61271182826116509190614318565b10611690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168790614170565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685600c54611700919061439f565b6040518463ffffffff1660e01b815260040161171e93929190613e33565b602060405180830381600087803b15801561173857600080fd5b505af115801561174c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177091906133f1565b5060005b828110156117a45761179133828461178c9190614318565b612184565b808061179c90614539565b915050611774565b505050565b6117bb6117b4611d1d565b8383612268565b5050565b600f60019054906101000a900460ff1681565b6117e36117dd611d1d565b83611e4a565b611822576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611819906141b0565b60405180910390fd5b61182e848484846123d5565b50505050565b606061183f82611d25565b61187e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187590614130565b60405180910390fd5b6000611888612431565b905060008151116118a857604051806020016040528060008152506118d3565b806118b2846124c3565b6040516020016118c3929190613df4565b6040516020818303038152906040525b915050919050565b6118e3611d1d565b73ffffffffffffffffffffffffffffffffffffffff16611901611456565b73ffffffffffffffffffffffffffffffffffffffff1614611957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194e906140f0565b60405180910390fd5b6000611961610b61565b905061271182826119729190614318565b106119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990614170565b60405180910390fd5b60005b82811015611a3a576119d28482846119cd9190614318565b612184565b601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611a2290614539565b91905055508080611a3290614539565b9150506119b5565b50505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60106020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b1a611d1d565b73ffffffffffffffffffffffffffffffffffffffff16611b38611456565b73ffffffffffffffffffffffffffffffffffffffff1614611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b85906140f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf590613f90565b60405180910390fd5b611c07816121a2565b50565b611c12611d1d565b73ffffffffffffffffffffffffffffffffffffffff16611c30611456565b73ffffffffffffffffffffffffffffffffffffffff1614611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d906140f0565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d165750611d1582612670565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e048361100a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e5582611d25565b611e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8b90614010565b60405180910390fd5b6000611e9f8361100a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f0e57508373ffffffffffffffffffffffffffffffffffffffff16611ef6846109b1565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f1f5750611f1e8185611a7e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f488261100a565b73ffffffffffffffffffffffffffffffffffffffff1614611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9590614110565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561200e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200590613fd0565b60405180910390fd5b612019838383612752565b612024600082611d91565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461207491906143f9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120cb9190614318565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61219e828260405180602001604052806000815250612762565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ce90613ff0565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123c89190613ed8565b60405180910390a3505050565b6123e0848484611f28565b6123ec848484846127bd565b61242b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242290613f50565b60405180910390fd5b50505050565b6060600d805461244090614507565b80601f016020809104026020016040519081016040528092919081815260200182805461246c90614507565b80156124b95780601f1061248e576101008083540402835291602001916124b9565b820191906000526020600020905b81548152906001019060200180831161249c57829003601f168201915b5050505050905090565b6060600082141561250b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061266b565b600082905060005b6000821461253d57808061252690614539565b915050600a82612536919061436e565b9150612513565b60008167ffffffffffffffff81111561257f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125b15781602001600182028036833780820191505090505b5090505b60008514612664576001826125ca91906143f9565b9150600a856125d99190614582565b60306125e59190614318565b60f81b818381518110612621577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561265d919061436e565b94506125b5565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061273b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061274b575061274a82612954565b5b9050919050565b61275d8383836129be565b505050565b61276c8383612ad2565b61277960008484846127bd565b6127b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127af90613f50565b60405180910390fd5b505050565b60006127de8473ffffffffffffffffffffffffffffffffffffffff16612ca0565b15612947578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612807611d1d565b8786866040518563ffffffff1660e01b81526004016128299493929190613e6a565b602060405180830381600087803b15801561284357600080fd5b505af192505050801561287457506040513d601f19601f820116820180604052508101906128719190613443565b60015b6128f7573d80600081146128a4576040519150601f19603f3d011682016040523d82523d6000602084013e6128a9565b606091505b506000815114156128ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e690613f50565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061294c565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6129c9838383612cb3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a0c57612a0781612cb8565b612a4b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a4a57612a498382612d01565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a8e57612a8981612e6e565b612acd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612acc57612acb8282612fb1565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b39906140b0565b60405180910390fd5b612b4b81611d25565b15612b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8290613fb0565b60405180910390fd5b612b9760008383612752565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612be79190614318565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d0e84611232565b612d1891906143f9565b9050600060076000848152602001908152602001600020549050818114612dfd576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e8291906143f9565b9050600060096000848152602001908152602001600020549050600060088381548110612ed8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612f20577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612f95577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612fbc83611232565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461303c90614507565b90600052602060002090601f01602090048101928261305e57600085556130a5565b82601f1061307757805160ff19168380011785556130a5565b828001600101855582156130a5579182015b828111156130a4578251825591602001919060010190613089565b5b5090506130b291906130b6565b5090565b5b808211156130cf5760008160009055506001016130b7565b5090565b60006130e66130e18461423c565b61420b565b9050828152602081018484840111156130fe57600080fd5b6131098482856144c5565b509392505050565b600061312461311f8461426c565b61420b565b90508281526020810184848401111561313c57600080fd5b6131478482856144c5565b509392505050565b60008135905061315e81614680565b92915050565b60008135905061317381614697565b92915050565b60008151905061318881614697565b92915050565b60008135905061319d816146ae565b92915050565b6000815190506131b2816146ae565b92915050565b600082601f8301126131c957600080fd5b81356131d98482602086016130d3565b91505092915050565b600082601f8301126131f357600080fd5b8135613203848260208601613111565b91505092915050565b60008135905061321b816146c5565b92915050565b60006020828403121561323357600080fd5b60006132418482850161314f565b91505092915050565b6000806040838503121561325d57600080fd5b600061326b8582860161314f565b925050602061327c8582860161314f565b9150509250929050565b60008060006060848603121561329b57600080fd5b60006132a98682870161314f565b93505060206132ba8682870161314f565b92505060406132cb8682870161320c565b9150509250925092565b600080600080608085870312156132eb57600080fd5b60006132f98782880161314f565b945050602061330a8782880161314f565b935050604061331b8782880161320c565b925050606085013567ffffffffffffffff81111561333857600080fd5b613344878288016131b8565b91505092959194509250565b6000806040838503121561336357600080fd5b60006133718582860161314f565b925050602061338285828601613164565b9150509250929050565b6000806040838503121561339f57600080fd5b60006133ad8582860161314f565b92505060206133be8582860161320c565b9150509250929050565b6000602082840312156133da57600080fd5b60006133e884828501613164565b91505092915050565b60006020828403121561340357600080fd5b600061341184828501613179565b91505092915050565b60006020828403121561342c57600080fd5b600061343a8482850161318e565b91505092915050565b60006020828403121561345557600080fd5b6000613463848285016131a3565b91505092915050565b60006020828403121561347e57600080fd5b600082013567ffffffffffffffff81111561349857600080fd5b6134a4848285016131e2565b91505092915050565b6000602082840312156134bf57600080fd5b60006134cd8482850161320c565b91505092915050565b60006134e28383613dd6565b60208301905092915050565b6134f78161442d565b82525050565b6000613508826142ac565b61351281856142da565b935061351d8361429c565b8060005b8381101561354e57815161353588826134d6565b9750613540836142cd565b925050600181019050613521565b5085935050505092915050565b6135648161443f565b82525050565b6000613575826142b7565b61357f81856142eb565b935061358f8185602086016144d4565b6135988161466f565b840191505092915050565b6135ac816144a1565b82525050565b60006135bd826142c2565b6135c781856142fc565b93506135d78185602086016144d4565b6135e08161466f565b840191505092915050565b60006135f6826142c2565b613600818561430d565b93506136108185602086016144d4565b80840191505092915050565b6000613629602b836142fc565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061368f6032836142fc565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006136f5600e836142fc565b91507f4d696e74696e67207061757365640000000000000000000000000000000000006000830152602082019050919050565b60006137356026836142fc565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061379b601c836142fc565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006137db6024836142fc565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138416019836142fc565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613881602c836142fc565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006138e76021836142fc565b91507f596f752063616e206d696e742061206d6178696d756d206f66203330204e465460008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061394d6038836142fc565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006139b3602a836142fc565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a196029836142fc565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a7f6020836142fc565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613abf602c836142fc565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613b256020836142fc565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613b656029836142fc565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bcb602f836142fc565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613c316021836142fc565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c976016836142fc565b91507f45786365656473206d6178696d756d20737570706c79000000000000000000006000830152602082019050919050565b6000613cd76017836142fc565b91507f4574682073656e74206973206e6f7420636f72726563740000000000000000006000830152602082019050919050565b6000613d176031836142fc565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613d7d602c836142fc565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b613ddf81614497565b82525050565b613dee81614497565b82525050565b6000613e0082856135eb565b9150613e0c82846135eb565b91508190509392505050565b6000602082019050613e2d60008301846134ee565b92915050565b6000606082019050613e4860008301866134ee565b613e5560208301856134ee565b613e626040830184613de5565b949350505050565b6000608082019050613e7f60008301876134ee565b613e8c60208301866134ee565b613e996040830185613de5565b8181036060830152613eab818461356a565b905095945050505050565b60006020820190508181036000830152613ed081846134fd565b905092915050565b6000602082019050613eed600083018461355b565b92915050565b6000602082019050613f0860008301846135a3565b92915050565b60006020820190508181036000830152613f2881846135b2565b905092915050565b60006020820190508181036000830152613f498161361c565b9050919050565b60006020820190508181036000830152613f6981613682565b9050919050565b60006020820190508181036000830152613f89816136e8565b9050919050565b60006020820190508181036000830152613fa981613728565b9050919050565b60006020820190508181036000830152613fc98161378e565b9050919050565b60006020820190508181036000830152613fe9816137ce565b9050919050565b6000602082019050818103600083015261400981613834565b9050919050565b6000602082019050818103600083015261402981613874565b9050919050565b60006020820190508181036000830152614049816138da565b9050919050565b6000602082019050818103600083015261406981613940565b9050919050565b60006020820190508181036000830152614089816139a6565b9050919050565b600060208201905081810360008301526140a981613a0c565b9050919050565b600060208201905081810360008301526140c981613a72565b9050919050565b600060208201905081810360008301526140e981613ab2565b9050919050565b6000602082019050818103600083015261410981613b18565b9050919050565b6000602082019050818103600083015261412981613b58565b9050919050565b6000602082019050818103600083015261414981613bbe565b9050919050565b6000602082019050818103600083015261416981613c24565b9050919050565b6000602082019050818103600083015261418981613c8a565b9050919050565b600060208201905081810360008301526141a981613cca565b9050919050565b600060208201905081810360008301526141c981613d0a565b9050919050565b600060208201905081810360008301526141e981613d70565b9050919050565b60006020820190506142056000830184613de5565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561423257614231614640565b5b8060405250919050565b600067ffffffffffffffff82111561425757614256614640565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561428757614286614640565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061432382614497565b915061432e83614497565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614363576143626145b3565b5b828201905092915050565b600061437982614497565b915061438483614497565b925082614394576143936145e2565b5b828204905092915050565b60006143aa82614497565b91506143b583614497565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143ee576143ed6145b3565b5b828202905092915050565b600061440482614497565b915061440f83614497565b925082821015614422576144216145b3565b5b828203905092915050565b600061443882614477565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006144ac826144b3565b9050919050565b60006144be82614477565b9050919050565b82818337600083830152505050565b60005b838110156144f25780820151818401526020810190506144d7565b83811115614501576000848401525b50505050565b6000600282049050600182168061451f57607f821691505b6020821081141561453357614532614611565b5b50919050565b600061454482614497565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614577576145766145b3565b5b600182019050919050565b600061458d82614497565b915061459883614497565b9250826145a8576145a76145e2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6146898161442d565b811461469457600080fd5b50565b6146a08161443f565b81146146ab57600080fd5b50565b6146b78161444b565b81146146c257600080fd5b50565b6146ce81614497565b81146146d957600080fd5b5056fea2646970667358221220add9dc3de3c9a079b08209429bc30887fd1810bab2e0b492d7e086991cd5420e64736f6c63430008000033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000003534f5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003534f530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b68747470733a2f2f3537366c6162732e636f6d2f736f736e66742f0000000000

-----Decoded View---------------
Arg [0] : name (string): SOS
Arg [1] : symbol (string): SOS
Arg [2] : baseURI (string): https://576labs.com/sosnft/

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [4] : 534f530000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 534f530000000000000000000000000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000001b
Arg [8] : 68747470733a2f2f3537366c6162732e636f6d2f736f736e66742f0000000000


Deployed Bytecode Sourcemap

63907:4162:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64617:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67728:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25209:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26768:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26291:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64188:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38257:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67283:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27518:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37925:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64987:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67396:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27928:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66739:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38447:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67617:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24903:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65139:509;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24633:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61954:103;;;;;;;;;;;;;:::i;:::-;;67915:147;;;:::i;:::-;;61303:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67092:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25378:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67193:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65890:504;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27061:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64222:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28184:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25553:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66402:329;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63968:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64267:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27287:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62212:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67810:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64617:179;64728:4;64752:36;64776:11;64752:23;:36::i;:::-;64745:43;;64617:179;;;:::o;67728:74::-;61534:12;:10;:12::i;:::-;61523:23;;:7;:5;:7::i;:::-;:23;;;61515:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67791:3:::1;67781:7;;:13;;;;;;;;;;;;;;;;;;67728:74:::0;:::o;25209:100::-;25263:13;25296:5;25289:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25209:100;:::o;26768:221::-;26844:7;26872:16;26880:7;26872;:16::i;:::-;26864:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26957:15;:24;26973:7;26957:24;;;;;;;;;;;;;;;;;;;;;26950:31;;26768:221;;;:::o;26291:411::-;26372:13;26388:23;26403:7;26388:14;:23::i;:::-;26372:39;;26436:5;26430:11;;:2;:11;;;;26422:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26530:5;26514:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26539:37;26556:5;26563:12;:10;:12::i;:::-;26539:16;:37::i;:::-;26514:62;26492:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26673:21;26682:2;26686:7;26673:8;:21::i;:::-;26291:411;;;:::o;64188:26::-;;;;;;;;;;;;;:::o;38257:113::-;38318:7;38345:10;:17;;;;38338:24;;38257:113;:::o;67283:105::-;61534:12;:10;:12::i;:::-;61523:23;;:7;:5;:7::i;:::-;:23;;;61515:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67368:12:::1;67356:9;:24;;;;67283:105:::0;:::o;27518:339::-;27713:41;27732:12;:10;:12::i;:::-;27746:7;27713:18;:41::i;:::-;27705:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27821:28;27831:4;27837:2;27841:7;27821:9;:28::i;:::-;27518:339;;;:::o;37925:256::-;38022:7;38058:23;38075:5;38058:16;:23::i;:::-;38050:5;:31;38042:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38147:12;:19;38160:5;38147:19;;;;;;;;;;;;;;;:26;38167:5;38147:26;;;;;;;;;;;;38140:33;;37925:256;;;;:::o;64987:144::-;61534:12;:10;:12::i;:::-;61523:23;;:7;:5;:7::i;:::-;:23;;;61515:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65103:18:::1;65077:17;;:45;;;;;;;;;;;;;;;;;;64987:144:::0;:::o;67396:87::-;67440:7;67466:9;;67459:16;;67396:87;:::o;27928:185::-;28066:39;28083:4;28089:2;28093:7;28066:39;;;;;;;;;;;;:16;:39::i;:::-;27928:185;;;:::o;66739:341::-;66798:16;66827:18;66848:17;66858:6;66848:9;:17::i;:::-;66827:38;;66877:25;66919:10;66905:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66877:53;;66945:9;66941:106;66960:10;66956:1;:14;66941:106;;;67005:30;67025:6;67033:1;67005:19;:30::i;:::-;66991:8;67000:1;66991:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;66972:3;;;;;:::i;:::-;;;;66941:106;;;;67064:8;67057:15;;;;66739:341;;;:::o;38447:233::-;38522:7;38558:30;:28;:30::i;:::-;38550:5;:38;38542:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38655:10;38666:5;38655:17;;;;;;;;;;;;;;;;;;;;;;;;38648:24;;38447:233;;;:::o;67617:102::-;61534:12;:10;:12::i;:::-;61523:23;;:7;:5;:7::i;:::-;:23;;;61515:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67704:7:::1;67688:13;:23;;;;;;;;;;;;:::i;:::-;;67617:102:::0;:::o;24903:239::-;24975:7;24995:13;25011:7;:16;25019:7;25011:16;;;;;;;;;;;;;;;;;;;;;24995:32;;25063:1;25046:19;;:5;:19;;;;25038:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25129:5;25122:12;;;24903:239;;;:::o;65139:509::-;65195:14;65212:13;:11;:13::i;:::-;65195:30;;65247:7;;;;;;;;;;;65246:8;65237:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;65321:2;65315:3;:8;65306:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;65418:5;65412:3;65403:6;:12;;;;:::i;:::-;:20;65394:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;65502:3;65493:6;;:12;;;;:::i;:::-;65480:9;:25;;65471:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;65554:9;65550:91;65569:3;65565:1;:7;65550:91;;;65593:35;65604:10;65625:1;65616:6;:10;;;;:::i;:::-;65593:9;:35::i;:::-;65574:3;;;;;:::i;:::-;;;;65550:91;;;;65139:509;;:::o;24633:208::-;24705:7;24750:1;24733:19;;:5;:19;;;;24725:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24817:9;:16;24827:5;24817:16;;;;;;;;;;;;;;;;24810:23;;24633:208;;;:::o;61954:103::-;61534:12;:10;:12::i;:::-;61523:23;;:7;:5;:7::i;:::-;:23;;;61515:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62019:30:::1;62046:1;62019:18;:30::i;:::-;61954:103::o:0;67915:147::-;61534:12;:10;:12::i;:::-;61523:23;;:7;:5;:7::i;:::-;:23;;;61515:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67974:13:::1;67990:21;67974:37;;68038:2;;;;;;;;;;;68030:16;;:23;68047:5;68030:23;;;;;;;;;;;;;;;;;;;;;;;68022:32;;;::::0;::::1;;61594:1;67915:147::o:0;61303:87::-;61349:7;61376:6;;;;;;;;;;;61369:13;;61303:87;:::o;67092:93::-;61534:12;:10;:12::i;:::-;61523:23;;:7;:5;:7::i;:::-;:23;;;61515:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67168:9:::1;67159:6;:18;;;;67092:93:::0;:::o;25378:104::-;25434:13;25467:7;25460:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25378:104;:::o;67193:81::-;67234:7;67260:6;;67253:13;;67193:81;:::o;65890:504::-;65943:14;65960:13;:11;:13::i;:::-;65943:30;;65995:16;;;;;;;;;;;65994:17;65985:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;66069:2;66063:3;:8;66054:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;66166:5;66160:3;66151:6;:12;;;;:::i;:::-;:20;66142:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;66220:17;;;;;;;;;;;:30;;;66251:10;66263:2;;;;;;;;;;;66279:3;66267:9;;:15;;;;:::i;:::-;66220:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;66299:9;66295:91;66314:3;66310:1;:7;66295:91;;;66338:35;66349:10;66370:1;66361:6;:10;;;;:::i;:::-;66338:9;:35::i;:::-;66319:3;;;;;:::i;:::-;;;;66295:91;;;;65890:504;;:::o;27061:155::-;27156:52;27175:12;:10;:12::i;:::-;27189:8;27199;27156:18;:52::i;:::-;27061:155;;:::o;64222:35::-;;;;;;;;;;;;;:::o;28184:328::-;28359:41;28378:12;:10;:12::i;:::-;28392:7;28359:18;:41::i;:::-;28351:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28465:39;28479:4;28485:2;28489:7;28498:5;28465:13;:39::i;:::-;28184:328;;;;:::o;25553:334::-;25626:13;25660:16;25668:7;25660;:16::i;:::-;25652:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25741:21;25765:10;:8;:10::i;:::-;25741:34;;25817:1;25799:7;25793:21;:25;:86;;;;;;;;;;;;;;;;;25845:7;25854:18;:7;:16;:18::i;:::-;25828:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25793:86;25786:93;;;25553:334;;;:::o;66402:329::-;61534:12;:10;:12::i;:::-;61523:23;;:7;:5;:7::i;:::-;:23;;;61515:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66482:14:::1;66499:13;:11;:13::i;:::-;66482:30;;66552:5;66542:7;66533:6;:16;;;;:::i;:::-;:24;66524:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;66601:9;66597:126;66616:7;66612:1;:11;66597:126;;;66644:28;66655:3;66669:1;66660:6;:10;;;;:::i;:::-;66644:9;:28::i;:::-;66687:17;:22;66705:3;66687:22;;;;;;;;;;;;;;;;:24;;;;;;;;;:::i;:::-;;;;;;66625:3;;;;;:::i;:::-;;;;66597:126;;;;61594:1;66402:329:::0;;:::o;63968:30::-;;;;;;;;;;;;;:::o;64267:53::-;;;;;;;;;;;;;;;;;:::o;27287:164::-;27384:4;27408:18;:25;27427:5;27408:25;;;;;;;;;;;;;;;:35;27434:8;27408:35;;;;;;;;;;;;;;;;;;;;;;;;;27401:42;;27287:164;;;;:::o;62212:201::-;61534:12;:10;:12::i;:::-;61523:23;;:7;:5;:7::i;:::-;:23;;;61515:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62321:1:::1;62301:22;;:8;:22;;;;62293:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;62377:28;62396:8;62377:18;:28::i;:::-;62212:201:::0;:::o;67810:93::-;61534:12;:10;:12::i;:::-;61523:23;;:7;:5;:7::i;:::-;:23;;;61515:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67892:3:::1;67873:16;;:22;;;;;;;;;;;;;;;;;;67810:93:::0;:::o;37617:224::-;37719:4;37758:35;37743:50;;;:11;:50;;;;:90;;;;37797:36;37821:11;37797:23;:36::i;:::-;37743:90;37736:97;;37617:224;;;:::o;9242:98::-;9295:7;9322:10;9315:17;;9242:98;:::o;30022:127::-;30087:4;30139:1;30111:30;;:7;:16;30119:7;30111:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30104:37;;30022:127;;;:::o;34004:174::-;34106:2;34079:15;:24;34095:7;34079:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34162:7;34158:2;34124:46;;34133:23;34148:7;34133:14;:23::i;:::-;34124:46;;;;;;;;;;;;34004:174;;:::o;30316:348::-;30409:4;30434:16;30442:7;30434;:16::i;:::-;30426:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30510:13;30526:23;30541:7;30526:14;:23::i;:::-;30510:39;;30579:5;30568:16;;:7;:16;;;:51;;;;30612:7;30588:31;;:20;30600:7;30588:11;:20::i;:::-;:31;;;30568:51;:87;;;;30623:32;30640:5;30647:7;30623:16;:32::i;:::-;30568:87;30560:96;;;30316:348;;;;:::o;33308:578::-;33467:4;33440:31;;:23;33455:7;33440:14;:23::i;:::-;:31;;;33432:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33550:1;33536:16;;:2;:16;;;;33528:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33606:39;33627:4;33633:2;33637:7;33606:20;:39::i;:::-;33710:29;33727:1;33731:7;33710:8;:29::i;:::-;33771:1;33752:9;:15;33762:4;33752:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33800:1;33783:9;:13;33793:2;33783:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33831:2;33812:7;:16;33820:7;33812:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33870:7;33866:2;33851:27;;33860:4;33851:27;;;;;;;;;;;;33308:578;;;:::o;31006:110::-;31082:26;31092:2;31096:7;31082:26;;;;;;;;;;;;:9;:26::i;:::-;31006:110;;:::o;62573:191::-;62647:16;62666:6;;;;;;;;;;;62647:25;;62692:8;62683:6;;:17;;;;;;;;;;;;;;;;;;62747:8;62716:40;;62737:8;62716:40;;;;;;;;;;;;62573:191;;:::o;34320:315::-;34475:8;34466:17;;:5;:17;;;;34458:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;34562:8;34524:18;:25;34543:5;34524:25;;;;;;;;;;;;;;;:35;34550:8;34524:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;34608:8;34586:41;;34601:5;34586:41;;;34618:8;34586:41;;;;;;:::i;:::-;;;;;;;;34320:315;;;:::o;29394:::-;29551:28;29561:4;29567:2;29571:7;29551:9;:28::i;:::-;29598:48;29621:4;29627:2;29631:7;29640:5;29598:22;:48::i;:::-;29590:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29394:315;;;;:::o;67491:114::-;67551:13;67584;67577:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67491:114;:::o;6883:723::-;6939:13;7169:1;7160:5;:10;7156:53;;;7187:10;;;;;;;;;;;;;;;;;;;;;7156:53;7219:12;7234:5;7219:20;;7250:14;7275:78;7290:1;7282:4;:9;7275:78;;7308:8;;;;;:::i;:::-;;;;7339:2;7331:10;;;;;:::i;:::-;;;7275:78;;;7363:19;7395:6;7385:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7363:39;;7413:154;7429:1;7420:5;:10;7413:154;;7457:1;7447:11;;;;;:::i;:::-;;;7524:2;7516:5;:10;;;;:::i;:::-;7503:2;:24;;;;:::i;:::-;7490:39;;7473:6;7480;7473:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;7553:2;7544:11;;;;;:::i;:::-;;;7413:154;;;7591:6;7577:21;;;;;6883:723;;;;:::o;24264:305::-;24366:4;24418:25;24403:40;;;:11;:40;;;;:105;;;;24475:33;24460:48;;;:11;:48;;;;24403:105;:158;;;;24525:36;24549:11;24525:23;:36::i;:::-;24403:158;24383:178;;24264:305;;;:::o;64428:181::-;64556:45;64583:4;64589:2;64593:7;64556:26;:45::i;:::-;64428:181;;;:::o;31343:321::-;31473:18;31479:2;31483:7;31473:5;:18::i;:::-;31524:54;31555:1;31559:2;31563:7;31572:5;31524:22;:54::i;:::-;31502:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31343:321;;;:::o;35200:799::-;35355:4;35376:15;:2;:13;;;:15::i;:::-;35372:620;;;35428:2;35412:36;;;35449:12;:10;:12::i;:::-;35463:4;35469:7;35478:5;35412:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35408:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35671:1;35654:6;:13;:18;35650:272;;;35697:60;;;;;;;;;;:::i;:::-;;;;;;;;35650:272;35872:6;35866:13;35857:6;35853:2;35849:15;35842:38;35408:529;35545:41;;;35535:51;;;:6;:51;;;;35528:58;;;;;35372:620;35976:4;35969:11;;35200:799;;;;;;;:::o;6433:157::-;6518:4;6557:25;6542:40;;;:11;:40;;;;6535:47;;6433:157;;;:::o;39293:589::-;39437:45;39464:4;39470:2;39474:7;39437:26;:45::i;:::-;39515:1;39499:18;;:4;:18;;;39495:187;;;39534:40;39566:7;39534:31;:40::i;:::-;39495:187;;;39604:2;39596:10;;:4;:10;;;39592:90;;39623:47;39656:4;39662:7;39623:32;:47::i;:::-;39592:90;39495:187;39710:1;39696:16;;:2;:16;;;39692:183;;;39729:45;39766:7;39729:36;:45::i;:::-;39692:183;;;39802:4;39796:10;;:2;:10;;;39792:83;;39823:40;39851:2;39855:7;39823:27;:40::i;:::-;39792:83;39692:183;39293:589;;;:::o;32000:382::-;32094:1;32080:16;;:2;:16;;;;32072:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32153:16;32161:7;32153;:16::i;:::-;32152:17;32144:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32215:45;32244:1;32248:2;32252:7;32215:20;:45::i;:::-;32290:1;32273:9;:13;32283:2;32273:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32321:2;32302:7;:16;32310:7;32302:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32366:7;32362:2;32341:33;;32358:1;32341:33;;;;;;;;;;;;32000:382;;:::o;10197:387::-;10257:4;10465:12;10532:7;10520:20;10512:28;;10575:1;10568:4;:8;10561:15;;;10197:387;;;:::o;36571:126::-;;;;:::o;40605:164::-;40709:10;:17;;;;40682:15;:24;40698:7;40682:24;;;;;;;;;;;:44;;;;40737:10;40753:7;40737:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40605:164;:::o;41396:988::-;41662:22;41712:1;41687:22;41704:4;41687:16;:22::i;:::-;:26;;;;:::i;:::-;41662:51;;41724:18;41745:17;:26;41763:7;41745:26;;;;;;;;;;;;41724:47;;41892:14;41878:10;:28;41874:328;;41923:19;41945:12;:18;41958:4;41945:18;;;;;;;;;;;;;;;:34;41964:14;41945:34;;;;;;;;;;;;41923:56;;42029:11;41996:12;:18;42009:4;41996:18;;;;;;;;;;;;;;;:30;42015:10;41996:30;;;;;;;;;;;:44;;;;42146:10;42113:17;:30;42131:11;42113:30;;;;;;;;;;;:43;;;;41874:328;;42298:17;:26;42316:7;42298:26;;;;;;;;;;;42291:33;;;42342:12;:18;42355:4;42342:18;;;;;;;;;;;;;;;:34;42361:14;42342:34;;;;;;;;;;;42335:41;;;41396:988;;;;:::o;42679:1079::-;42932:22;42977:1;42957:10;:17;;;;:21;;;;:::i;:::-;42932:46;;42989:18;43010:15;:24;43026:7;43010:24;;;;;;;;;;;;42989:45;;43361:19;43383:10;43394:14;43383:26;;;;;;;;;;;;;;;;;;;;;;;;43361:48;;43447:11;43422:10;43433;43422:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;43558:10;43527:15;:28;43543:11;43527:28;;;;;;;;;;;:41;;;;43699:15;:24;43715:7;43699:24;;;;;;;;;;;43692:31;;;43734:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42679:1079;;;;:::o;40183:221::-;40268:14;40285:20;40302:2;40285:16;:20::i;:::-;40268:37;;40343:7;40316:12;:16;40329:2;40316:16;;;;;;;;;;;;;;;:24;40333:6;40316:24;;;;;;;;;;;:34;;;;40390:6;40361:17;:26;40379:7;40361:26;;;;;;;;;;;:35;;;;40183:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::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::-;;1074:6;1068:13;1059:22;;1090:30;1114:5;1090:30;:::i;:::-;1049:77;;;;:::o;1132:137::-;;1215:6;1202:20;1193:29;;1231:32;1257:5;1231:32;:::i;:::-;1183:86;;;;:::o;1275:141::-;;1362:6;1356:13;1347:22;;1378:32;1404:5;1378:32;:::i;:::-;1337:79;;;;:::o;1435:271::-;;1539:3;1532:4;1524:6;1520:17;1516:27;1506:2;;1557:1;1554;1547:12;1506:2;1597:6;1584:20;1622:78;1696:3;1688:6;1681:4;1673:6;1669:17;1622:78;:::i;:::-;1613:87;;1496:210;;;;;:::o;1726:273::-;;1831:3;1824:4;1816:6;1812:17;1808:27;1798:2;;1849:1;1846;1839:12;1798:2;1889:6;1876:20;1914:79;1989:3;1981:6;1974:4;1966:6;1962:17;1914:79;:::i;:::-;1905:88;;1788:211;;;;;:::o;2005:139::-;;2089:6;2076:20;2067:29;;2105:33;2132:5;2105:33;:::i;:::-;2057:87;;;;:::o;2150:262::-;;2258:2;2246:9;2237:7;2233:23;2229:32;2226:2;;;2274:1;2271;2264:12;2226:2;2317:1;2342:53;2387:7;2378:6;2367:9;2363:22;2342:53;:::i;:::-;2332:63;;2288:117;2216:196;;;;:::o;2418:407::-;;;2543:2;2531:9;2522:7;2518:23;2514:32;2511:2;;;2559:1;2556;2549:12;2511:2;2602:1;2627:53;2672:7;2663:6;2652:9;2648:22;2627:53;:::i;:::-;2617:63;;2573:117;2729:2;2755:53;2800:7;2791:6;2780:9;2776:22;2755:53;:::i;:::-;2745:63;;2700:118;2501:324;;;;;:::o;2831:552::-;;;;2973:2;2961:9;2952:7;2948:23;2944:32;2941:2;;;2989:1;2986;2979:12;2941:2;3032:1;3057:53;3102:7;3093:6;3082:9;3078:22;3057:53;:::i;:::-;3047:63;;3003:117;3159:2;3185:53;3230:7;3221:6;3210:9;3206:22;3185:53;:::i;:::-;3175:63;;3130:118;3287:2;3313:53;3358:7;3349:6;3338:9;3334:22;3313:53;:::i;:::-;3303:63;;3258:118;2931:452;;;;;:::o;3389:809::-;;;;;3557:3;3545:9;3536:7;3532:23;3528:33;3525:2;;;3574:1;3571;3564:12;3525:2;3617:1;3642:53;3687:7;3678:6;3667:9;3663:22;3642:53;:::i;:::-;3632:63;;3588:117;3744:2;3770:53;3815:7;3806:6;3795:9;3791:22;3770:53;:::i;:::-;3760:63;;3715:118;3872:2;3898:53;3943:7;3934:6;3923:9;3919:22;3898:53;:::i;:::-;3888:63;;3843:118;4028:2;4017:9;4013:18;4000:32;4059:18;4051:6;4048:30;4045:2;;;4091:1;4088;4081:12;4045:2;4119:62;4173:7;4164:6;4153:9;4149:22;4119:62;:::i;:::-;4109:72;;3971:220;3515:683;;;;;;;:::o;4204:401::-;;;4326:2;4314:9;4305:7;4301:23;4297:32;4294:2;;;4342:1;4339;4332:12;4294:2;4385:1;4410:53;4455:7;4446:6;4435:9;4431:22;4410:53;:::i;:::-;4400:63;;4356:117;4512:2;4538:50;4580:7;4571:6;4560:9;4556:22;4538:50;:::i;:::-;4528:60;;4483:115;4284:321;;;;;:::o;4611:407::-;;;4736:2;4724:9;4715:7;4711:23;4707:32;4704:2;;;4752:1;4749;4742:12;4704:2;4795:1;4820:53;4865:7;4856:6;4845:9;4841:22;4820:53;:::i;:::-;4810:63;;4766:117;4922:2;4948:53;4993:7;4984:6;4973:9;4969:22;4948:53;:::i;:::-;4938:63;;4893:118;4694:324;;;;;:::o;5024:256::-;;5129:2;5117:9;5108:7;5104:23;5100:32;5097:2;;;5145:1;5142;5135:12;5097:2;5188:1;5213:50;5255:7;5246:6;5235:9;5231:22;5213:50;:::i;:::-;5203:60;;5159:114;5087:193;;;;:::o;5286:278::-;;5402:2;5390:9;5381:7;5377:23;5373:32;5370:2;;;5418:1;5415;5408:12;5370:2;5461:1;5486:61;5539:7;5530:6;5519:9;5515:22;5486:61;:::i;:::-;5476:71;;5432:125;5360:204;;;;:::o;5570:260::-;;5677:2;5665:9;5656:7;5652:23;5648:32;5645:2;;;5693:1;5690;5683:12;5645:2;5736:1;5761:52;5805:7;5796:6;5785:9;5781:22;5761:52;:::i;:::-;5751:62;;5707:116;5635:195;;;;:::o;5836:282::-;;5954:2;5942:9;5933:7;5929:23;5925:32;5922:2;;;5970:1;5967;5960:12;5922:2;6013:1;6038:63;6093:7;6084:6;6073:9;6069:22;6038:63;:::i;:::-;6028:73;;5984:127;5912:206;;;;:::o;6124:375::-;;6242:2;6230:9;6221:7;6217:23;6213:32;6210:2;;;6258:1;6255;6248:12;6210:2;6329:1;6318:9;6314:17;6301:31;6359:18;6351:6;6348:30;6345:2;;;6391:1;6388;6381:12;6345:2;6419:63;6474:7;6465:6;6454:9;6450:22;6419:63;:::i;:::-;6409:73;;6272:220;6200:299;;;;:::o;6505:262::-;;6613:2;6601:9;6592:7;6588:23;6584:32;6581:2;;;6629:1;6626;6619:12;6581:2;6672:1;6697:53;6742:7;6733:6;6722:9;6718:22;6697:53;:::i;:::-;6687:63;;6643:117;6571:196;;;;:::o;6773:179::-;;6863:46;6905:3;6897:6;6863:46;:::i;:::-;6941:4;6936:3;6932:14;6918:28;;6853:99;;;;:::o;6958:118::-;7045:24;7063:5;7045:24;:::i;:::-;7040:3;7033:37;7023:53;;:::o;7112:732::-;;7260:54;7308:5;7260:54;:::i;:::-;7330:86;7409:6;7404:3;7330:86;:::i;:::-;7323:93;;7440:56;7490:5;7440:56;:::i;:::-;7519:7;7550:1;7535:284;7560:6;7557:1;7554:13;7535:284;;;7636:6;7630:13;7663:63;7722:3;7707:13;7663:63;:::i;:::-;7656:70;;7749:60;7802:6;7749:60;:::i;:::-;7739:70;;7595:224;7582:1;7579;7575:9;7570:14;;7535:284;;;7539:14;7835:3;7828:10;;7236:608;;;;;;;:::o;7850:109::-;7931:21;7946:5;7931:21;:::i;:::-;7926:3;7919:34;7909:50;;:::o;7965:360::-;;8079:38;8111:5;8079:38;:::i;:::-;8133:70;8196:6;8191:3;8133:70;:::i;:::-;8126:77;;8212:52;8257:6;8252:3;8245:4;8238:5;8234:16;8212:52;:::i;:::-;8289:29;8311:6;8289:29;:::i;:::-;8284:3;8280:39;8273:46;;8055:270;;;;;:::o;8331:159::-;8432:51;8477:5;8432:51;:::i;:::-;8427:3;8420:64;8410:80;;:::o;8496:364::-;;8612:39;8645:5;8612:39;:::i;:::-;8667:71;8731:6;8726:3;8667:71;:::i;:::-;8660:78;;8747:52;8792:6;8787:3;8780:4;8773:5;8769:16;8747:52;:::i;:::-;8824:29;8846:6;8824:29;:::i;:::-;8819:3;8815:39;8808:46;;8588:272;;;;;:::o;8866:377::-;;9000:39;9033:5;9000:39;:::i;:::-;9055:89;9137:6;9132:3;9055:89;:::i;:::-;9048:96;;9153:52;9198:6;9193:3;9186:4;9179:5;9175:16;9153:52;:::i;:::-;9230:6;9225:3;9221:16;9214:23;;8976:267;;;;;:::o;9249:375::-;;9412:67;9476:2;9471:3;9412:67;:::i;:::-;9405:74;;9509:34;9505:1;9500:3;9496:11;9489:55;9575:13;9570:2;9565:3;9561:12;9554:35;9615:2;9610:3;9606:12;9599:19;;9395:229;;;:::o;9630:382::-;;9793:67;9857:2;9852:3;9793:67;:::i;:::-;9786:74;;9890:34;9886:1;9881:3;9877:11;9870:55;9956:20;9951:2;9946:3;9942:12;9935:42;10003:2;9998:3;9994:12;9987:19;;9776:236;;;:::o;10018:312::-;;10181:67;10245:2;10240:3;10181:67;:::i;:::-;10174:74;;10278:16;10274:1;10269:3;10265:11;10258:37;10321:2;10316:3;10312:12;10305:19;;10164:166;;;:::o;10336:370::-;;10499:67;10563:2;10558:3;10499:67;:::i;:::-;10492:74;;10596:34;10592:1;10587:3;10583:11;10576:55;10662:8;10657:2;10652:3;10648:12;10641:30;10697:2;10692:3;10688:12;10681:19;;10482:224;;;:::o;10712:326::-;;10875:67;10939:2;10934:3;10875:67;:::i;:::-;10868:74;;10972:30;10968:1;10963:3;10959:11;10952:51;11029:2;11024:3;11020:12;11013:19;;10858:180;;;:::o;11044:368::-;;11207:67;11271:2;11266:3;11207:67;:::i;:::-;11200:74;;11304:34;11300:1;11295:3;11291:11;11284:55;11370:6;11365:2;11360:3;11356:12;11349:28;11403:2;11398:3;11394:12;11387:19;;11190:222;;;:::o;11418:323::-;;11581:67;11645:2;11640:3;11581:67;:::i;:::-;11574:74;;11678:27;11674:1;11669:3;11665:11;11658:48;11732:2;11727:3;11723:12;11716:19;;11564:177;;;:::o;11747:376::-;;11910:67;11974:2;11969:3;11910:67;:::i;:::-;11903:74;;12007:34;12003:1;11998:3;11994:11;11987:55;12073:14;12068:2;12063:3;12059:12;12052:36;12114:2;12109:3;12105:12;12098:19;;11893:230;;;:::o;12129:365::-;;12292:67;12356:2;12351:3;12292:67;:::i;:::-;12285:74;;12389:34;12385:1;12380:3;12376:11;12369:55;12455:3;12450:2;12445:3;12441:12;12434:25;12485:2;12480:3;12476:12;12469:19;;12275:219;;;:::o;12500:388::-;;12663:67;12727:2;12722:3;12663:67;:::i;:::-;12656:74;;12760:34;12756:1;12751:3;12747:11;12740:55;12826:26;12821:2;12816:3;12812:12;12805:48;12879:2;12874:3;12870:12;12863:19;;12646:242;;;:::o;12894:374::-;;13057:67;13121:2;13116:3;13057:67;:::i;:::-;13050:74;;13154:34;13150:1;13145:3;13141:11;13134:55;13220:12;13215:2;13210:3;13206:12;13199:34;13259:2;13254:3;13250:12;13243:19;;13040:228;;;:::o;13274:373::-;;13437:67;13501:2;13496:3;13437:67;:::i;:::-;13430:74;;13534:34;13530:1;13525:3;13521:11;13514:55;13600:11;13595:2;13590:3;13586:12;13579:33;13638:2;13633:3;13629:12;13622:19;;13420:227;;;:::o;13653:330::-;;13816:67;13880:2;13875:3;13816:67;:::i;:::-;13809:74;;13913:34;13909:1;13904:3;13900:11;13893:55;13974:2;13969:3;13965:12;13958:19;;13799:184;;;:::o;13989:376::-;;14152:67;14216:2;14211:3;14152:67;:::i;:::-;14145:74;;14249:34;14245:1;14240:3;14236:11;14229:55;14315:14;14310:2;14305:3;14301:12;14294:36;14356:2;14351:3;14347:12;14340:19;;14135:230;;;:::o;14371:330::-;;14534:67;14598:2;14593:3;14534:67;:::i;:::-;14527:74;;14631:34;14627:1;14622:3;14618:11;14611:55;14692:2;14687:3;14683:12;14676:19;;14517:184;;;:::o;14707:373::-;;14870:67;14934:2;14929:3;14870:67;:::i;:::-;14863:74;;14967:34;14963:1;14958:3;14954:11;14947:55;15033:11;15028:2;15023:3;15019:12;15012:33;15071:2;15066:3;15062:12;15055:19;;14853:227;;;:::o;15086:379::-;;15249:67;15313:2;15308:3;15249:67;:::i;:::-;15242:74;;15346:34;15342:1;15337:3;15333:11;15326:55;15412:17;15407:2;15402:3;15398:12;15391:39;15456:2;15451:3;15447:12;15440:19;;15232:233;;;:::o;15471:365::-;;15634:67;15698:2;15693:3;15634:67;:::i;:::-;15627:74;;15731:34;15727:1;15722:3;15718:11;15711:55;15797:3;15792:2;15787:3;15783:12;15776:25;15827:2;15822:3;15818:12;15811:19;;15617:219;;;:::o;15842:320::-;;16005:67;16069:2;16064:3;16005:67;:::i;:::-;15998:74;;16102:24;16098:1;16093:3;16089:11;16082:45;16153:2;16148:3;16144:12;16137:19;;15988:174;;;:::o;16168:321::-;;16331:67;16395:2;16390:3;16331:67;:::i;:::-;16324:74;;16428:25;16424:1;16419:3;16415:11;16408:46;16480:2;16475:3;16471:12;16464:19;;16314:175;;;:::o;16495:381::-;;16658:67;16722:2;16717:3;16658:67;:::i;:::-;16651:74;;16755:34;16751:1;16746:3;16742:11;16735:55;16821:19;16816:2;16811:3;16807:12;16800:41;16867:2;16862:3;16858:12;16851:19;;16641:235;;;:::o;16882:376::-;;17045:67;17109:2;17104:3;17045:67;:::i;:::-;17038:74;;17142:34;17138:1;17133:3;17129:11;17122:55;17208:14;17203:2;17198:3;17194:12;17187:36;17249:2;17244:3;17240:12;17233:19;;17028:230;;;:::o;17264:108::-;17341:24;17359:5;17341:24;:::i;:::-;17336:3;17329:37;17319:53;;:::o;17378:118::-;17465:24;17483:5;17465:24;:::i;:::-;17460:3;17453:37;17443:53;;:::o;17502:435::-;;17704:95;17795:3;17786:6;17704:95;:::i;:::-;17697:102;;17816:95;17907:3;17898:6;17816:95;:::i;:::-;17809:102;;17928:3;17921:10;;17686:251;;;;;:::o;17943:222::-;;18074:2;18063:9;18059:18;18051:26;;18087:71;18155:1;18144:9;18140:17;18131:6;18087:71;:::i;:::-;18041:124;;;;:::o;18171:442::-;;18358:2;18347:9;18343:18;18335:26;;18371:71;18439:1;18428:9;18424:17;18415:6;18371:71;:::i;:::-;18452:72;18520:2;18509:9;18505:18;18496:6;18452:72;:::i;:::-;18534;18602:2;18591:9;18587:18;18578:6;18534:72;:::i;:::-;18325:288;;;;;;:::o;18619:640::-;;18852:3;18841:9;18837:19;18829:27;;18866:71;18934:1;18923:9;18919:17;18910:6;18866:71;:::i;:::-;18947:72;19015:2;19004:9;19000:18;18991:6;18947:72;:::i;:::-;19029;19097:2;19086:9;19082:18;19073:6;19029:72;:::i;:::-;19148:9;19142:4;19138:20;19133:2;19122:9;19118:18;19111:48;19176:76;19247:4;19238:6;19176:76;:::i;:::-;19168:84;;18819:440;;;;;;;:::o;19265:373::-;;19446:2;19435:9;19431:18;19423:26;;19495:9;19489:4;19485:20;19481:1;19470:9;19466:17;19459:47;19523:108;19626:4;19617:6;19523:108;:::i;:::-;19515:116;;19413:225;;;;:::o;19644:210::-;;19769:2;19758:9;19754:18;19746:26;;19782:65;19844:1;19833:9;19829:17;19820:6;19782:65;:::i;:::-;19736:118;;;;:::o;19860:250::-;;20005:2;19994:9;19990:18;19982:26;;20018:85;20100:1;20089:9;20085:17;20076:6;20018:85;:::i;:::-;19972:138;;;;:::o;20116:313::-;;20267:2;20256:9;20252:18;20244:26;;20316:9;20310:4;20306:20;20302:1;20291:9;20287:17;20280:47;20344:78;20417:4;20408:6;20344:78;:::i;:::-;20336:86;;20234:195;;;;:::o;20435:419::-;;20639:2;20628:9;20624:18;20616:26;;20688:9;20682:4;20678:20;20674:1;20663:9;20659:17;20652:47;20716:131;20842:4;20716:131;:::i;:::-;20708:139;;20606:248;;;:::o;20860:419::-;;21064:2;21053:9;21049:18;21041:26;;21113:9;21107:4;21103:20;21099:1;21088:9;21084:17;21077:47;21141:131;21267:4;21141:131;:::i;:::-;21133:139;;21031:248;;;:::o;21285:419::-;;21489:2;21478:9;21474:18;21466:26;;21538:9;21532:4;21528:20;21524:1;21513:9;21509:17;21502:47;21566:131;21692:4;21566:131;:::i;:::-;21558:139;;21456:248;;;:::o;21710:419::-;;21914:2;21903:9;21899:18;21891:26;;21963:9;21957:4;21953:20;21949:1;21938:9;21934:17;21927:47;21991:131;22117:4;21991:131;:::i;:::-;21983:139;;21881:248;;;:::o;22135:419::-;;22339:2;22328:9;22324:18;22316:26;;22388:9;22382:4;22378:20;22374:1;22363:9;22359:17;22352:47;22416:131;22542:4;22416:131;:::i;:::-;22408:139;;22306:248;;;:::o;22560:419::-;;22764:2;22753:9;22749:18;22741:26;;22813:9;22807:4;22803:20;22799:1;22788:9;22784:17;22777:47;22841:131;22967:4;22841:131;:::i;:::-;22833:139;;22731:248;;;:::o;22985:419::-;;23189:2;23178:9;23174:18;23166:26;;23238:9;23232:4;23228:20;23224:1;23213:9;23209:17;23202:47;23266:131;23392:4;23266:131;:::i;:::-;23258:139;;23156:248;;;:::o;23410:419::-;;23614:2;23603:9;23599:18;23591:26;;23663:9;23657:4;23653:20;23649:1;23638:9;23634:17;23627:47;23691:131;23817:4;23691:131;:::i;:::-;23683:139;;23581:248;;;:::o;23835:419::-;;24039:2;24028:9;24024:18;24016:26;;24088:9;24082:4;24078:20;24074:1;24063:9;24059:17;24052:47;24116:131;24242:4;24116:131;:::i;:::-;24108:139;;24006:248;;;:::o;24260:419::-;;24464:2;24453:9;24449:18;24441:26;;24513:9;24507:4;24503:20;24499:1;24488:9;24484:17;24477:47;24541:131;24667:4;24541:131;:::i;:::-;24533:139;;24431:248;;;:::o;24685:419::-;;24889:2;24878:9;24874:18;24866:26;;24938:9;24932:4;24928:20;24924:1;24913:9;24909:17;24902:47;24966:131;25092:4;24966:131;:::i;:::-;24958:139;;24856:248;;;:::o;25110:419::-;;25314:2;25303:9;25299:18;25291:26;;25363:9;25357:4;25353:20;25349:1;25338:9;25334:17;25327:47;25391:131;25517:4;25391:131;:::i;:::-;25383:139;;25281:248;;;:::o;25535:419::-;;25739:2;25728:9;25724:18;25716:26;;25788:9;25782:4;25778:20;25774:1;25763:9;25759:17;25752:47;25816:131;25942:4;25816:131;:::i;:::-;25808:139;;25706:248;;;:::o;25960:419::-;;26164:2;26153:9;26149:18;26141:26;;26213:9;26207:4;26203:20;26199:1;26188:9;26184:17;26177:47;26241:131;26367:4;26241:131;:::i;:::-;26233:139;;26131:248;;;:::o;26385:419::-;;26589:2;26578:9;26574:18;26566:26;;26638:9;26632:4;26628:20;26624:1;26613:9;26609:17;26602:47;26666:131;26792:4;26666:131;:::i;:::-;26658:139;;26556:248;;;:::o;26810:419::-;;27014:2;27003:9;26999:18;26991:26;;27063:9;27057:4;27053:20;27049:1;27038:9;27034:17;27027:47;27091:131;27217:4;27091:131;:::i;:::-;27083:139;;26981:248;;;:::o;27235:419::-;;27439:2;27428:9;27424:18;27416:26;;27488:9;27482:4;27478:20;27474:1;27463:9;27459:17;27452:47;27516:131;27642:4;27516:131;:::i;:::-;27508:139;;27406:248;;;:::o;27660:419::-;;27864:2;27853:9;27849:18;27841:26;;27913:9;27907:4;27903:20;27899:1;27888:9;27884:17;27877:47;27941:131;28067:4;27941:131;:::i;:::-;27933:139;;27831:248;;;:::o;28085:419::-;;28289:2;28278:9;28274:18;28266:26;;28338:9;28332:4;28328:20;28324:1;28313:9;28309:17;28302:47;28366:131;28492:4;28366:131;:::i;:::-;28358:139;;28256:248;;;:::o;28510:419::-;;28714:2;28703:9;28699:18;28691:26;;28763:9;28757:4;28753:20;28749:1;28738:9;28734:17;28727:47;28791:131;28917:4;28791:131;:::i;:::-;28783:139;;28681:248;;;:::o;28935:419::-;;29139:2;29128:9;29124:18;29116:26;;29188:9;29182:4;29178:20;29174:1;29163:9;29159:17;29152:47;29216:131;29342:4;29216:131;:::i;:::-;29208:139;;29106:248;;;:::o;29360:419::-;;29564:2;29553:9;29549:18;29541:26;;29613:9;29607:4;29603:20;29599:1;29588:9;29584:17;29577:47;29641:131;29767:4;29641:131;:::i;:::-;29633:139;;29531:248;;;:::o;29785:222::-;;29916:2;29905:9;29901:18;29893:26;;29929:71;29997:1;29986:9;29982:17;29973:6;29929:71;:::i;:::-;29883:124;;;;:::o;30013:283::-;;30079:2;30073:9;30063:19;;30121:4;30113:6;30109:17;30228:6;30216:10;30213:22;30192:18;30180:10;30177:34;30174:62;30171:2;;;30239:18;;:::i;:::-;30171:2;30279:10;30275:2;30268:22;30053:243;;;;:::o;30302:331::-;;30453:18;30445:6;30442:30;30439:2;;;30475:18;;:::i;:::-;30439:2;30560:4;30556:9;30549:4;30541:6;30537:17;30533:33;30525:41;;30621:4;30615;30611:15;30603:23;;30368:265;;;:::o;30639:332::-;;30791:18;30783:6;30780:30;30777:2;;;30813:18;;:::i;:::-;30777:2;30898:4;30894:9;30887:4;30879:6;30875:17;30871:33;30863:41;;30959:4;30953;30949:15;30941:23;;30706:265;;;:::o;30977:132::-;;31067:3;31059:11;;31097:4;31092:3;31088:14;31080:22;;31049:60;;;:::o;31115:114::-;;31216:5;31210:12;31200:22;;31189:40;;;:::o;31235:98::-;;31320:5;31314:12;31304:22;;31293:40;;;:::o;31339:99::-;;31425:5;31419:12;31409:22;;31398:40;;;:::o;31444:113::-;;31546:4;31541:3;31537:14;31529:22;;31519:38;;;:::o;31563:184::-;;31696:6;31691:3;31684:19;31736:4;31731:3;31727:14;31712:29;;31674:73;;;;:::o;31753:168::-;;31870:6;31865:3;31858:19;31910:4;31905:3;31901:14;31886:29;;31848:73;;;;:::o;31927:169::-;;32045:6;32040:3;32033:19;32085:4;32080:3;32076:14;32061:29;;32023:73;;;;:::o;32102:148::-;;32241:3;32226:18;;32216:34;;;;:::o;32256:305::-;;32315:20;32333:1;32315:20;:::i;:::-;32310:25;;32349:20;32367:1;32349:20;:::i;:::-;32344:25;;32503:1;32435:66;32431:74;32428:1;32425:81;32422:2;;;32509:18;;:::i;:::-;32422:2;32553:1;32550;32546:9;32539:16;;32300:261;;;;:::o;32567:185::-;;32624:20;32642:1;32624:20;:::i;:::-;32619:25;;32658:20;32676:1;32658:20;:::i;:::-;32653:25;;32697:1;32687:2;;32702:18;;:::i;:::-;32687:2;32744:1;32741;32737:9;32732:14;;32609:143;;;;:::o;32758:348::-;;32821:20;32839:1;32821:20;:::i;:::-;32816:25;;32855:20;32873:1;32855:20;:::i;:::-;32850:25;;33043:1;32975:66;32971:74;32968:1;32965:81;32960:1;32953:9;32946:17;32942:105;32939:2;;;33050:18;;:::i;:::-;32939:2;33098:1;33095;33091:9;33080:20;;32806:300;;;;:::o;33112:191::-;;33172:20;33190:1;33172:20;:::i;:::-;33167:25;;33206:20;33224:1;33206:20;:::i;:::-;33201:25;;33245:1;33242;33239:8;33236:2;;;33250:18;;:::i;:::-;33236:2;33295:1;33292;33288:9;33280:17;;33157:146;;;;:::o;33309:96::-;;33375:24;33393:5;33375:24;:::i;:::-;33364:35;;33354:51;;;:::o;33411:90::-;;33488:5;33481:13;33474:21;33463:32;;33453:48;;;:::o;33507:149::-;;33583:66;33576:5;33572:78;33561:89;;33551:105;;;:::o;33662:126::-;;33739:42;33732:5;33728:54;33717:65;;33707:81;;;:::o;33794:77::-;;33860:5;33849:16;;33839:32;;;:::o;33877:154::-;;33974:51;34019:5;33974:51;:::i;:::-;33961:64;;33951:80;;;:::o;34037:127::-;;34134:24;34152:5;34134:24;:::i;:::-;34121:37;;34111:53;;;:::o;34170:154::-;34254:6;34249:3;34244;34231:30;34316:1;34307:6;34302:3;34298:16;34291:27;34221:103;;;:::o;34330:307::-;34398:1;34408:113;34422:6;34419:1;34416:13;34408:113;;;34507:1;34502:3;34498:11;34492:18;34488:1;34483:3;34479:11;34472:39;34444:2;34441:1;34437:10;34432:15;;34408:113;;;34539:6;34536:1;34533:13;34530:2;;;34619:1;34610:6;34605:3;34601:16;34594:27;34530:2;34379:258;;;;:::o;34643:320::-;;34724:1;34718:4;34714:12;34704:22;;34771:1;34765:4;34761:12;34792:18;34782:2;;34848:4;34840:6;34836:17;34826:27;;34782:2;34910;34902:6;34899:14;34879:18;34876:38;34873:2;;;34929:18;;:::i;:::-;34873:2;34694:269;;;;:::o;34969:233::-;;35031:24;35049:5;35031:24;:::i;:::-;35022:33;;35077:66;35070:5;35067:77;35064:2;;;35147:18;;:::i;:::-;35064:2;35194:1;35187:5;35183:13;35176:20;;35012:190;;;:::o;35208:176::-;;35257:20;35275:1;35257:20;:::i;:::-;35252:25;;35291:20;35309:1;35291:20;:::i;:::-;35286:25;;35330:1;35320:2;;35335:18;;:::i;:::-;35320:2;35376:1;35373;35369:9;35364:14;;35242:142;;;;:::o;35390:180::-;35438:77;35435:1;35428:88;35535:4;35532:1;35525:15;35559:4;35556:1;35549:15;35576:180;35624:77;35621:1;35614:88;35721:4;35718:1;35711:15;35745:4;35742:1;35735:15;35762:180;35810:77;35807:1;35800:88;35907:4;35904:1;35897:15;35931:4;35928:1;35921:15;35948:180;35996:77;35993:1;35986:88;36093:4;36090:1;36083:15;36117:4;36114:1;36107:15;36134:102;;36226:2;36222:7;36217:2;36210:5;36206:14;36202:28;36192:38;;36182:54;;;:::o;36242:122::-;36315:24;36333:5;36315:24;:::i;:::-;36308:5;36305:35;36295:2;;36354:1;36351;36344:12;36295:2;36285:79;:::o;36370:116::-;36440:21;36455:5;36440:21;:::i;:::-;36433:5;36430:32;36420:2;;36476:1;36473;36466:12;36420:2;36410:76;:::o;36492:120::-;36564:23;36581:5;36564:23;:::i;:::-;36557:5;36554:34;36544:2;;36602:1;36599;36592:12;36544:2;36534:78;:::o;36618:122::-;36691:24;36709:5;36691:24;:::i;:::-;36684:5;36681:35;36671:2;;36730:1;36727;36720:12;36671:2;36661:79;:::o

Swarm Source

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