ERC-721
Overview
Max Total Supply
2,500 FunkySalamanders
Holders
741
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 FunkySalamandersLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NFT
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-23 */ // Sources flattened with hardhat v2.8.4 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, 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; } // File @openzeppelin/contracts/token/ERC721/[email protected] // // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/utils/[email protected] // // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File hardhat/[email protected] // pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } } // File @openzeppelin/contracts/utils/math/[email protected] // // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File contracts/NFT.sol error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** *Submitted for verification at Etherscan.io on 2021-04-22 */ // File: @openzeppelin/contracts/utils/Context.sol // pragma solidity >=0.6.0 <= 0.8.4; /* * @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 GSN 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. */ // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex times unchecked { return _currentIndex - _burnCounter; } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _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 { _transfer(from, to, tokenId); if (!_checkOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) { revert TransferToNonERC721ReceiverImplementer(); } updatedIndex++; } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @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 { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: @openzeppelin/contracts/access/Ownable.sol abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } pragma solidity >=0.6.0 <= 0.8.4; /** * @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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/NFT.sol pragma solidity ^0.8.4; /** * @title NFT contract * @dev Extends ERC721 Non-Fungible Token Standard basic implementation */ contract NFT is ERC721A, Ownable, ReentrancyGuard { using SafeMath for uint256; using Strings for uint256; bool public preSaleActive = false; bool public publicSaleActive = false; bool public paused = true; bool public revealed = false; string public NETWORK_PROVENANCE = ""; string public notRevealedUri; uint256 public maxSupply; // 2500 uint256 public maxAirDropSupply; // 100 uint256 public currentAirDropSupply; uint256 public preSalePrice; //0.05 ETH --> 50000000000000000 uint256 public publicSalePrice; //0.05 ETH --> 50000000000000000 uint public maxPurchase; // 2 uint public maxPurchaseOG; // 4 uint public publicPurchase; // 5 string private _baseURIextended; mapping(address => bool) public isWhiteListed; mapping(address => bool) public isWhiteListedOG; constructor(string memory name, string memory symbol, uint256 _maxSupply, uint256 _publicPurchase, uint256 _maxPurchase, uint256 _maxPurchaseOG, uint256 _preSalePrice, uint256 _publicSalePrice, uint256 _maxAirDropSupply) ERC721A(name, symbol) ReentrancyGuard() { maxSupply = _maxSupply; preSalePrice = _preSalePrice; publicSalePrice = _publicSalePrice; publicPurchase = _publicPurchase; maxPurchase = _maxPurchase; maxPurchaseOG = _maxPurchaseOG; maxAirDropSupply = _maxAirDropSupply; } function preSaleMint(uint256 _amount)external payable nonReentrant{ require(preSaleActive, "NFT:Pre-sale is not active"); require(isWhiteListed[msg.sender], "NFT:Sender is not whitelisted"); mint(_amount, true); } function publicSaleMint(uint256 _amount)external payable nonReentrant{ require(publicSaleActive, "NFT:Public-sale is not active"); mint(_amount, false); } function mint(uint256 _amount, bool _state)internal{ require(!paused, "NFT: contract is paused"); require(totalSupply().add(_amount) <= maxSupply, "NFT: minting would exceed total supply"); if(publicSaleActive){ require(balanceOf(msg.sender).add(_amount) <= publicPurchase, "NFT-Public: You can't mint any more tokens"); } else{ if(isWhiteListedOG[msg.sender]){ require(balanceOf(msg.sender).add(_amount) <= maxPurchaseOG, "NFT-OG: You can't mint any more tokens"); } else{ require(balanceOf(msg.sender).add(_amount) <= maxPurchase, "NFT: You can't mint any more tokens"); } } if(_state){ require(preSalePrice.mul(_amount) <= msg.value, "NFT: Ether value sent for presale mint is not correct"); } else{ require(publicSalePrice.mul(_amount) <= msg.value, "NFT: Ether value sent for public mint is not correct"); } uint mintIndex = totalSupply(); for (uint256 ind = 1; ind <= _amount; ind++) { mintIndex.add(ind); } _safeMint(msg.sender, _amount); } function getTotalSupply() public view returns (uint){ return totalSupply(); } function _baseURI() internal view virtual override returns (string memory) { return _baseURIextended; } function setBaseURI(string calldata baseURI_) external onlyOwner { _baseURIextended = baseURI_; } function addWhiteListedAddresses(address[] memory _address) external onlyOwner { for (uint256 i = 0; i < _address.length; i++) { require(!isWhiteListed[_address[i]], "NFT: address is already white listed"); isWhiteListed[_address[i]] = true; } } function addWhiteListedAddressesOG(address[] memory _address) external onlyOwner { for (uint256 i = 0; i < _address.length; i++) { require(!isWhiteListedOG[_address[i]], "NFT: address is already OG listed"); isWhiteListed[_address[i]] = true; isWhiteListedOG[_address[i]] = true; } } function togglePauseState() external onlyOwner { paused = !paused; } function togglePreSale()external onlyOwner { preSaleActive = !preSaleActive; } function setPreSalePrice(uint256 _preSalePrice)external onlyOwner { preSalePrice = _preSalePrice; } function togglePublicSale()external onlyOwner { publicSaleActive = !publicSaleActive; } function setPublicSalePrice(uint256 _publicSalePrice)external onlyOwner { publicSalePrice = _publicSalePrice; } function airDrop(address[] memory _address)external onlyOwner{ uint256 mintIndex = totalSupply(); require(currentAirDropSupply + _address.length <= maxAirDropSupply, "NFT: Maximum Air Drop Limit Reached"); require(mintIndex.add(_address.length) <= maxSupply, "NFT: minting would exceed total supply"); for(uint256 i = 0; i < _address.length; i++){ mintIndex.add(i); _safeMint(_address[i],1); } currentAirDropSupply += _address.length; } function reveal() external onlyOwner { revealed = true; } function withdraw() external onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } /* * Set provenance once it's calculated */ function setProvenanceHash(string memory provenanceHash) external onlyOwner { NETWORK_PROVENANCE = provenanceHash; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if (revealed == false) { return notRevealedUri; } tokenId+=1; string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, tokenId.toString(), ".json" ) ) : ""; } function setNotRevealedURI(string memory _notRevealedURI) external onlyOwner { notRevealedUri = _notRevealedURI; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_publicPurchase","type":"uint256"},{"internalType":"uint256","name":"_maxPurchase","type":"uint256"},{"internalType":"uint256","name":"_maxPurchaseOG","type":"uint256"},{"internalType":"uint256","name":"_preSalePrice","type":"uint256"},{"internalType":"uint256","name":"_publicSalePrice","type":"uint256"},{"internalType":"uint256","name":"_maxAirDropSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"NETWORK_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"}],"name":"addWhiteListedAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"}],"name":"addWhiteListedAddressesOG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","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":"currentAirDropSupply","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":"getTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhiteListedOG","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAirDropSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPurchaseOG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_preSalePrice","type":"uint256"}],"name":"setPreSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicSalePrice","type":"uint256"}],"name":"setPublicSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePauseState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff0219169083151502179055506001600a60026101000a81548160ff0219169083151502179055506000600a60036101000a81548160ff02191690831515021790555060405180602001604052806000815250600b90805190602001906200009792919062000202565b50348015620000a557600080fd5b5060405162005690380380620056908339818101604052810190620000cb91906200033b565b88888160029080519060200190620000e592919062000202565b508060039080519060200190620000fe92919062000202565b505050600062000113620001fa60201b60201c565b905080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600160098190555086600d81905550826010819055508160118190555085601481905550846012819055508360138190555080600e81905550505050505050505050620005da565b600033905090565b8280546200021090620004e5565b90600052602060002090601f01602090048101928262000234576000855562000280565b82601f106200024f57805160ff191683800117855562000280565b8280016001018555821562000280579182015b828111156200027f57825182559160200191906001019062000262565b5b5090506200028f919062000293565b5090565b5b80821115620002ae57600081600090555060010162000294565b5090565b6000620002c9620002c3846200046f565b62000446565b905082815260208101848484011115620002e257600080fd5b620002ef848285620004af565b509392505050565b600082601f8301126200030957600080fd5b81516200031b848260208601620002b2565b91505092915050565b6000815190506200033581620005c0565b92915050565b60008060008060008060008060006101208a8c0312156200035b57600080fd5b60008a015167ffffffffffffffff8111156200037657600080fd5b620003848c828d01620002f7565b99505060208a015167ffffffffffffffff811115620003a257600080fd5b620003b08c828d01620002f7565b9850506040620003c38c828d0162000324565b9750506060620003d68c828d0162000324565b9650506080620003e98c828d0162000324565b95505060a0620003fc8c828d0162000324565b94505060c06200040f8c828d0162000324565b93505060e0620004228c828d0162000324565b925050610100620004368c828d0162000324565b9150509295985092959850929598565b60006200045262000465565b90506200046082826200051b565b919050565b6000604051905090565b600067ffffffffffffffff8211156200048d576200048c62000580565b5b6200049882620005af565b9050602081019050919050565b6000819050919050565b60005b83811015620004cf578082015181840152602081019050620004b2565b83811115620004df576000848401525b50505050565b60006002820490506001821680620004fe57607f821691505b6020821081141562000515576200051462000551565b5b50919050565b6200052682620005af565b810181811067ffffffffffffffff8211171562000548576200054762000580565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b620005cb81620004a5565b8114620005d757600080fd5b50565b6150a680620005ea6000396000f3fe6080604052600436106102ab5760003560e01c8063715018a611610175578063b88d4fde116100dc578063e222c7f911610095578063e985e9c51161006f578063e985e9c514610a0f578063f046768c14610a4c578063f2c4ce1e14610a77578063f2fde38b14610aa0576102ab565b8063e222c7f9146109a2578063e39c2092146109b9578063e757c17d146109e4576102ab565b8063b88d4fde146108a4578063bc8893b4146108cd578063c4e41b22146108f8578063c87b56dd14610923578063ca3cb52214610960578063d5abeb0114610977576102ab565b806395d89b411161012e57806395d89b41146107c7578063977b055b146107f25780639b6860c81461081d578063a22cb46514610848578063a475b5dd14610871578063b3ab66b014610888576102ab565b8063715018a6146106ec5780637835c63514610703578063791a25191461071f5780637d7eee421461074857806384494708146107715780638da5cb5b1461079c576102ab565b806318160ddd1161021957806351830227116101d257806351830227146105b657806355f804b3146105e15780635c975abb1461060a5780636352211e146106355780636f9170f61461067257806370a08231146106af576102ab565b806318160ddd146104cc5780631dcd8e4e146104f757806323b872dd146105225780632ff912a01461054b5780633ccfd60b1461057657806342842e0e1461058d576102ab565b8063081c8c441161026b578063081c8c44146103be578063095ea7b3146103e95780630bcb106a146104125780630c2d03451461043b5780631096952314610478578063154cd140146104a1576102ab565b80628803d3146102b0578062b6849f146102c7578062fec52c146102f057806301ffc9a71461031957806306fdde0314610356578063081812fc14610381575b600080fd5b3480156102bc57600080fd5b506102c5610ac9565b005b3480156102d357600080fd5b506102ee60048036038101906102e99190613f8f565b610b71565b005b3480156102fc57600080fd5b5061031760048036038101906103129190613f8f565b610d41565b005b34801561032557600080fd5b50610340600480360381019061033b9190613fd0565b610fdd565b60405161034d91906144ad565b60405180910390f35b34801561036257600080fd5b5061036b6110bf565b60405161037891906144c8565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a391906140a8565b611151565b6040516103b59190614446565b60405180910390f35b3480156103ca57600080fd5b506103d36111cd565b6040516103e091906144c8565b60405180910390f35b3480156103f557600080fd5b50610410600480360381019061040b9190613f53565b61125b565b005b34801561041e57600080fd5b5061043960048036038101906104349190613f8f565b611366565b005b34801561044757600080fd5b50610462600480360381019061045d9190613de8565b61156a565b60405161046f91906144ad565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190614067565b61158a565b005b3480156104ad57600080fd5b506104b6611620565b6040516104c3919061470a565b60405180910390f35b3480156104d857600080fd5b506104e1611626565b6040516104ee919061470a565b60405180910390f35b34801561050357600080fd5b5061050c611634565b604051610519919061470a565b60405180910390f35b34801561052e57600080fd5b5061054960048036038101906105449190613e4d565b61163a565b005b34801561055757600080fd5b5061056061164a565b60405161056d91906144c8565b60405180910390f35b34801561058257600080fd5b5061058b6116d8565b005b34801561059957600080fd5b506105b460048036038101906105af9190613e4d565b6117a3565b005b3480156105c257600080fd5b506105cb6117c3565b6040516105d891906144ad565b60405180910390f35b3480156105ed57600080fd5b5061060860048036038101906106039190614022565b6117d6565b005b34801561061657600080fd5b5061061f611868565b60405161062c91906144ad565b60405180910390f35b34801561064157600080fd5b5061065c600480360381019061065791906140a8565b61187b565b6040516106699190614446565b60405180910390f35b34801561067e57600080fd5b5061069960048036038101906106949190613de8565b611891565b6040516106a691906144ad565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d19190613de8565b6118b1565b6040516106e3919061470a565b60405180910390f35b3480156106f857600080fd5b50610701611981565b005b61071d600480360381019061071891906140a8565b611abe565b005b34801561072b57600080fd5b50610746600480360381019061074191906140a8565b611bfd565b005b34801561075457600080fd5b5061076f600480360381019061076a91906140a8565b611c83565b005b34801561077d57600080fd5b50610786611d09565b60405161079391906144ad565b60405180910390f35b3480156107a857600080fd5b506107b1611d1c565b6040516107be9190614446565b60405180910390f35b3480156107d357600080fd5b506107dc611d46565b6040516107e991906144c8565b60405180910390f35b3480156107fe57600080fd5b50610807611dd8565b604051610814919061470a565b60405180910390f35b34801561082957600080fd5b50610832611dde565b60405161083f919061470a565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a9190613f17565b611de4565b005b34801561087d57600080fd5b50610886611f5c565b005b6108a2600480360381019061089d91906140a8565b611ff5565b005b3480156108b057600080fd5b506108cb60048036038101906108c69190613e9c565b6120a8565b005b3480156108d957600080fd5b506108e26120fb565b6040516108ef91906144ad565b60405180910390f35b34801561090457600080fd5b5061090d61210e565b60405161091a919061470a565b60405180910390f35b34801561092f57600080fd5b5061094a600480360381019061094591906140a8565b61211d565b60405161095791906144c8565b60405180910390f35b34801561096c57600080fd5b50610975612282565b005b34801561098357600080fd5b5061098c61232a565b604051610999919061470a565b60405180910390f35b3480156109ae57600080fd5b506109b7612330565b005b3480156109c557600080fd5b506109ce6123d8565b6040516109db919061470a565b60405180910390f35b3480156109f057600080fd5b506109f96123de565b604051610a06919061470a565b60405180910390f35b348015610a1b57600080fd5b50610a366004803603810190610a319190613e11565b6123e4565b604051610a4391906144ad565b60405180910390f35b348015610a5857600080fd5b50610a61612478565b604051610a6e919061470a565b60405180910390f35b348015610a8357600080fd5b50610a9e6004803603810190610a999190614067565b61247e565b005b348015610aac57600080fd5b50610ac76004803603810190610ac29190613de8565b612514565b005b610ad16126c0565b73ffffffffffffffffffffffffffffffffffffffff16610aef611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614610b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3c906145ea565b60405180910390fd5b600a60029054906101000a900460ff1615600a60026101000a81548160ff021916908315150217905550565b610b796126c0565b73ffffffffffffffffffffffffffffffffffffffff16610b97611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614610bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be4906145ea565b60405180910390fd5b6000610bf7611626565b9050600e548251600f54610c0b919061481b565b1115610c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c439061464a565b60405180910390fd5b600d54610c638351836126c890919063ffffffff16565b1115610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b906146aa565b60405180910390fd5b60005b8251811015610d2257610cc381836126c890919063ffffffff16565b50610d0f838281518110610d00577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160016126de565b8080610d1a90614a49565b915050610ca7565b508151600f6000828254610d36919061481b565b925050819055505050565b610d496126c0565b73ffffffffffffffffffffffffffffffffffffffff16610d67611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db4906145ea565b60405180910390fd5b60005b8151811015610fd95760176000838381518110610e06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d9061454a565b60405180910390fd5b600160166000848481518110610ed5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160176000848481518110610f6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610fd190614a49565b915050610dc0565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806110a857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806110b857506110b7826126fc565b5b9050919050565b6060600280546110ce906149e6565b80601f01602080910402602001604051908101604052809291908181526020018280546110fa906149e6565b80156111475780601f1061111c57610100808354040283529160200191611147565b820191906000526020600020905b81548152906001019060200180831161112a57829003601f168201915b5050505050905090565b600061115c82612766565b611192576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c80546111da906149e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611206906149e6565b80156112535780601f1061122857610100808354040283529160200191611253565b820191906000526020600020905b81548152906001019060200180831161123657829003601f168201915b505050505081565b60006112668261187b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112ce576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166112ed6126c0565b73ffffffffffffffffffffffffffffffffffffffff161415801561131f575061131d816113186126c0565b6123e4565b155b15611356576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113618383836127a0565b505050565b61136e6126c0565b73ffffffffffffffffffffffffffffffffffffffff1661138c611d1c565b73ffffffffffffffffffffffffffffffffffffffff16146113e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d9906145ea565b60405180910390fd5b60005b8151811015611566576016600083838151811061142b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b29061458a565b60405180910390fd5b6001601660008484815181106114fa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061155e90614a49565b9150506113e5565b5050565b60176020528060005260406000206000915054906101000a900460ff1681565b6115926126c0565b73ffffffffffffffffffffffffffffffffffffffff166115b0611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614611606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fd906145ea565b60405180910390fd5b80600b908051906020019061161c929190613a63565b5050565b60135481565b600060015460005403905090565b600e5481565b611645838383612852565b505050565b600b8054611657906149e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611683906149e6565b80156116d05780601f106116a5576101008083540402835291602001916116d0565b820191906000526020600020905b8154815290600101906020018083116116b357829003601f168201915b505050505081565b6116e06126c0565b73ffffffffffffffffffffffffffffffffffffffff166116fe611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b906145ea565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561179f573d6000803e3d6000fd5b5050565b6117be838383604051806020016040528060008152506120a8565b505050565b600a60039054906101000a900460ff1681565b6117de6126c0565b73ffffffffffffffffffffffffffffffffffffffff166117fc611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614611852576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611849906145ea565b60405180910390fd5b818160159190611863929190613ae9565b505050565b600a60029054906101000a900460ff1681565b600061188682612d43565b600001519050919050565b60166020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611919576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6119896126c0565b73ffffffffffffffffffffffffffffffffffffffff166119a7611d1c565b73ffffffffffffffffffffffffffffffffffffffff16146119fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f4906145ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60026009541415611b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afb906146ca565b60405180910390fd5b6002600981905550600a60009054906101000a900460ff16611b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b52906146ea565b60405180910390fd5b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde9061468a565b60405180910390fd5b611bf2816001612fbf565b600160098190555050565b611c056126c0565b73ffffffffffffffffffffffffffffffffffffffff16611c23611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614611c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c70906145ea565b60405180910390fd5b8060118190555050565b611c8b6126c0565b73ffffffffffffffffffffffffffffffffffffffff16611ca9611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614611cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf6906145ea565b60405180910390fd5b8060108190555050565b600a60009054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611d55906149e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d81906149e6565b8015611dce5780601f10611da357610100808354040283529160200191611dce565b820191906000526020600020905b815481529060010190602001808311611db157829003601f168201915b5050505050905090565b60125481565b60115481565b611dec6126c0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e51576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611e5e6126c0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f0b6126c0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f5091906144ad565b60405180910390a35050565b611f646126c0565b73ffffffffffffffffffffffffffffffffffffffff16611f82611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614611fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcf906145ea565b60405180910390fd5b6001600a60036101000a81548160ff021916908315150217905550565b6002600954141561203b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612032906146ca565b60405180910390fd5b6002600981905550600a60019054906101000a900460ff16612092576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120899061450a565b60405180910390fd5b61209d816000612fbf565b600160098190555050565b6120b3848484612852565b6120bf84848484613308565b6120f5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600a60019054906101000a900460ff1681565b6000612118611626565b905090565b606061212882612766565b612167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215e9061460a565b60405180910390fd5b60001515600a60039054906101000a900460ff161515141561221557600c8054612190906149e6565b80601f01602080910402602001604051908101604052809291908181526020018280546121bc906149e6565b80156122095780601f106121de57610100808354040283529160200191612209565b820191906000526020600020905b8154815290600101906020018083116121ec57829003601f168201915b5050505050905061227d565b600182612222919061481b565b9150600061222e613496565b9050600081511161224e5760405180602001604052806000815250612279565b8061225884613528565b604051602001612269929190614417565b6040516020818303038152906040525b9150505b919050565b61228a6126c0565b73ffffffffffffffffffffffffffffffffffffffff166122a8611d1c565b73ffffffffffffffffffffffffffffffffffffffff16146122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f5906145ea565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b600d5481565b6123386126c0565b73ffffffffffffffffffffffffffffffffffffffff16612356611d1c565b73ffffffffffffffffffffffffffffffffffffffff16146123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a3906145ea565b60405180910390fd5b600a60019054906101000a900460ff1615600a60016101000a81548160ff021916908315150217905550565b60145481565b60105481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f5481565b6124866126c0565b73ffffffffffffffffffffffffffffffffffffffff166124a4611d1c565b73ffffffffffffffffffffffffffffffffffffffff16146124fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f1906145ea565b60405180910390fd5b80600c9080519060200190612510929190613a63565b5050565b61251c6126c0565b73ffffffffffffffffffffffffffffffffffffffff1661253a611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614612590576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612587906145ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f79061452a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600081836126d6919061481b565b905092915050565b6126f88282604051806020016040528060008152506136d5565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482108015612799575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061285d82612d43565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166128846126c0565b73ffffffffffffffffffffffffffffffffffffffff1614806128b757506128b682600001516128b16126c0565b6123e4565b5b806128fc57506128c56126c0565b73ffffffffffffffffffffffffffffffffffffffff166128e484611151565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612935576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461299e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a05576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a1285858560016136e7565b612a2260008484600001516127a0565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612cd357600054811015612cd25782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d3c85858560016136ed565b5050505050565b612d4b613b6f565b6000829050600054811015612f88576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612f8657600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e6a578092505050612fba565b5b600115612f8557818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f80578092505050612fba565b612e6b565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600a60029054906101000a900460ff161561300f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613006906145aa565b60405180910390fd5b600d5461302c8361301e611626565b6126c890919063ffffffff16565b111561306d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613064906146aa565b60405180910390fd5b600a60019054906101000a900460ff16156130e6576014546130a083613092336118b1565b6126c890919063ffffffff16565b11156130e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d89061462a565b60405180910390fd5b6131fd565b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561319c5760135461315683613148336118b1565b6126c890919063ffffffff16565b1115613197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318e9061466a565b60405180910390fd5b6131fc565b6012546131ba836131ac336118b1565b6126c890919063ffffffff16565b11156131fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f2906144ea565b60405180910390fd5b5b5b801561325f5734613219836010546136f390919063ffffffff16565b111561325a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613251906145ca565b60405180910390fd5b6132b7565b34613275836011546136f390919063ffffffff16565b11156132b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ad9061456a565b60405180910390fd5b5b60006132c1611626565b90506000600190505b8381116132f8576132e481836126c890919063ffffffff16565b5080806132f090614a49565b9150506132ca565b5061330333846126de565b505050565b60006133298473ffffffffffffffffffffffffffffffffffffffff16613709565b15613489578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133526126c0565b8786866040518563ffffffff1660e01b81526004016133749493929190614461565b602060405180830381600087803b15801561338e57600080fd5b505af19250505080156133bf57506040513d601f19601f820116820180604052508101906133bc9190613ff9565b60015b613439573d80600081146133ef576040519150601f19603f3d011682016040523d82523d6000602084013e6133f4565b606091505b50600081511415613431576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061348e565b600190505b949350505050565b6060601580546134a5906149e6565b80601f01602080910402602001604051908101604052809291908181526020018280546134d1906149e6565b801561351e5780601f106134f35761010080835404028352916020019161351e565b820191906000526020600020905b81548152906001019060200180831161350157829003601f168201915b5050505050905090565b60606000821415613570576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506136d0565b600082905060005b600082146135a257808061358b90614a49565b915050600a8261359b9190614871565b9150613578565b60008167ffffffffffffffff8111156135e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156136165781602001600182028036833780820191505090505b5090505b600085146136c95760018261362f91906148fc565b9150600a8561363e9190614a92565b603061364a919061481b565b60f81b818381518110613686577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856136c29190614871565b945061361a565b8093505050505b919050565b6136e2838383600161372c565b505050565b50505050565b50505050565b6000818361370191906148a2565b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613799576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156137d4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6137e160008683876136e7565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015613a4657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156139fa57506139f86000888488613308565b155b15613a31576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505061397f565b508060008190555050613a5c60008683876136ed565b5050505050565b828054613a6f906149e6565b90600052602060002090601f016020900481019282613a915760008555613ad8565b82601f10613aaa57805160ff1916838001178555613ad8565b82800160010185558215613ad8579182015b82811115613ad7578251825591602001919060010190613abc565b5b509050613ae59190613bb2565b5090565b828054613af5906149e6565b90600052602060002090601f016020900481019282613b175760008555613b5e565b82601f10613b3057803560ff1916838001178555613b5e565b82800160010185558215613b5e579182015b82811115613b5d578235825591602001919060010190613b42565b5b509050613b6b9190613bb2565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613bcb576000816000905550600101613bb3565b5090565b6000613be2613bdd8461474a565b614725565b90508083825260208201905082856020860282011115613c0157600080fd5b60005b85811015613c315781613c178882613cb7565b845260208401935060208301925050600181019050613c04565b5050509392505050565b6000613c4e613c4984614776565b614725565b905082815260208101848484011115613c6657600080fd5b613c718482856149a4565b509392505050565b6000613c8c613c87846147a7565b614725565b905082815260208101848484011115613ca457600080fd5b613caf8482856149a4565b509392505050565b600081359050613cc681615014565b92915050565b600082601f830112613cdd57600080fd5b8135613ced848260208601613bcf565b91505092915050565b600081359050613d058161502b565b92915050565b600081359050613d1a81615042565b92915050565b600081519050613d2f81615042565b92915050565b600082601f830112613d4657600080fd5b8135613d56848260208601613c3b565b91505092915050565b60008083601f840112613d7157600080fd5b8235905067ffffffffffffffff811115613d8a57600080fd5b602083019150836001820283011115613da257600080fd5b9250929050565b600082601f830112613dba57600080fd5b8135613dca848260208601613c79565b91505092915050565b600081359050613de281615059565b92915050565b600060208284031215613dfa57600080fd5b6000613e0884828501613cb7565b91505092915050565b60008060408385031215613e2457600080fd5b6000613e3285828601613cb7565b9250506020613e4385828601613cb7565b9150509250929050565b600080600060608486031215613e6257600080fd5b6000613e7086828701613cb7565b9350506020613e8186828701613cb7565b9250506040613e9286828701613dd3565b9150509250925092565b60008060008060808587031215613eb257600080fd5b6000613ec087828801613cb7565b9450506020613ed187828801613cb7565b9350506040613ee287828801613dd3565b925050606085013567ffffffffffffffff811115613eff57600080fd5b613f0b87828801613d35565b91505092959194509250565b60008060408385031215613f2a57600080fd5b6000613f3885828601613cb7565b9250506020613f4985828601613cf6565b9150509250929050565b60008060408385031215613f6657600080fd5b6000613f7485828601613cb7565b9250506020613f8585828601613dd3565b9150509250929050565b600060208284031215613fa157600080fd5b600082013567ffffffffffffffff811115613fbb57600080fd5b613fc784828501613ccc565b91505092915050565b600060208284031215613fe257600080fd5b6000613ff084828501613d0b565b91505092915050565b60006020828403121561400b57600080fd5b600061401984828501613d20565b91505092915050565b6000806020838503121561403557600080fd5b600083013567ffffffffffffffff81111561404f57600080fd5b61405b85828601613d5f565b92509250509250929050565b60006020828403121561407957600080fd5b600082013567ffffffffffffffff81111561409357600080fd5b61409f84828501613da9565b91505092915050565b6000602082840312156140ba57600080fd5b60006140c884828501613dd3565b91505092915050565b6140da81614930565b82525050565b6140e981614942565b82525050565b60006140fa826147d8565b61410481856147ee565b93506141148185602086016149b3565b61411d81614b7f565b840191505092915050565b6000614133826147e3565b61413d81856147ff565b935061414d8185602086016149b3565b61415681614b7f565b840191505092915050565b600061416c826147e3565b6141768185614810565b93506141868185602086016149b3565b80840191505092915050565b600061419f6023836147ff565b91506141aa82614b90565b604082019050919050565b60006141c2601d836147ff565b91506141cd82614bdf565b602082019050919050565b60006141e56026836147ff565b91506141f082614c08565b604082019050919050565b60006142086021836147ff565b915061421382614c57565b604082019050919050565b600061422b6034836147ff565b915061423682614ca6565b604082019050919050565b600061424e6024836147ff565b915061425982614cf5565b604082019050919050565b60006142716017836147ff565b915061427c82614d44565b602082019050919050565b6000614294600583614810565b915061429f82614d6d565b600582019050919050565b60006142b76035836147ff565b91506142c282614d96565b604082019050919050565b60006142da6020836147ff565b91506142e582614de5565b602082019050919050565b60006142fd602f836147ff565b915061430882614e0e565b604082019050919050565b6000614320602a836147ff565b915061432b82614e5d565b604082019050919050565b60006143436023836147ff565b915061434e82614eac565b604082019050919050565b60006143666026836147ff565b915061437182614efb565b604082019050919050565b6000614389601d836147ff565b915061439482614f4a565b602082019050919050565b60006143ac6026836147ff565b91506143b782614f73565b604082019050919050565b60006143cf601f836147ff565b91506143da82614fc2565b602082019050919050565b60006143f2601a836147ff565b91506143fd82614feb565b602082019050919050565b6144118161499a565b82525050565b60006144238285614161565b915061442f8284614161565b915061443a82614287565b91508190509392505050565b600060208201905061445b60008301846140d1565b92915050565b600060808201905061447660008301876140d1565b61448360208301866140d1565b6144906040830185614408565b81810360608301526144a281846140ef565b905095945050505050565b60006020820190506144c260008301846140e0565b92915050565b600060208201905081810360008301526144e28184614128565b905092915050565b6000602082019050818103600083015261450381614192565b9050919050565b60006020820190508181036000830152614523816141b5565b9050919050565b60006020820190508181036000830152614543816141d8565b9050919050565b60006020820190508181036000830152614563816141fb565b9050919050565b600060208201905081810360008301526145838161421e565b9050919050565b600060208201905081810360008301526145a381614241565b9050919050565b600060208201905081810360008301526145c381614264565b9050919050565b600060208201905081810360008301526145e3816142aa565b9050919050565b60006020820190508181036000830152614603816142cd565b9050919050565b60006020820190508181036000830152614623816142f0565b9050919050565b6000602082019050818103600083015261464381614313565b9050919050565b6000602082019050818103600083015261466381614336565b9050919050565b6000602082019050818103600083015261468381614359565b9050919050565b600060208201905081810360008301526146a38161437c565b9050919050565b600060208201905081810360008301526146c38161439f565b9050919050565b600060208201905081810360008301526146e3816143c2565b9050919050565b60006020820190508181036000830152614703816143e5565b9050919050565b600060208201905061471f6000830184614408565b92915050565b600061472f614740565b905061473b8282614a18565b919050565b6000604051905090565b600067ffffffffffffffff82111561476557614764614b50565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561479157614790614b50565b5b61479a82614b7f565b9050602081019050919050565b600067ffffffffffffffff8211156147c2576147c1614b50565b5b6147cb82614b7f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006148268261499a565b91506148318361499a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561486657614865614ac3565b5b828201905092915050565b600061487c8261499a565b91506148878361499a565b92508261489757614896614af2565b5b828204905092915050565b60006148ad8261499a565b91506148b88361499a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148f1576148f0614ac3565b5b828202905092915050565b60006149078261499a565b91506149128361499a565b92508282101561492557614924614ac3565b5b828203905092915050565b600061493b8261497a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156149d15780820151818401526020810190506149b6565b838111156149e0576000848401525b50505050565b600060028204905060018216806149fe57607f821691505b60208210811415614a1257614a11614b21565b5b50919050565b614a2182614b7f565b810181811067ffffffffffffffff82111715614a4057614a3f614b50565b5b80604052505050565b6000614a548261499a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a8757614a86614ac3565b5b600182019050919050565b6000614a9d8261499a565b9150614aa88361499a565b925082614ab857614ab7614af2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4e46543a20596f752063616e2774206d696e7420616e79206d6f726520746f6b60008201527f656e730000000000000000000000000000000000000000000000000000000000602082015250565b7f4e46543a5075626c69632d73616c65206973206e6f7420616374697665000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e46543a206164647265737320697320616c7265616479204f47206c6973746560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e46543a2045746865722076616c75652073656e7420666f72207075626c696360008201527f206d696e74206973206e6f7420636f7272656374000000000000000000000000602082015250565b7f4e46543a206164647265737320697320616c7265616479207768697465206c6960008201527f7374656400000000000000000000000000000000000000000000000000000000602082015250565b7f4e46543a20636f6e747261637420697320706175736564000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4e46543a2045746865722076616c75652073656e7420666f722070726573616c60008201527f65206d696e74206973206e6f7420636f72726563740000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e46542d5075626c69633a20596f752063616e2774206d696e7420616e79206d60008201527f6f726520746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f4e46543a204d6178696d756d204169722044726f70204c696d6974205265616360008201527f6865640000000000000000000000000000000000000000000000000000000000602082015250565b7f4e46542d4f473a20596f752063616e2774206d696e7420616e79206d6f72652060008201527f746f6b656e730000000000000000000000000000000000000000000000000000602082015250565b7f4e46543a53656e646572206973206e6f742077686974656c6973746564000000600082015250565b7f4e46543a206d696e74696e6720776f756c642065786365656420746f74616c2060008201527f737570706c790000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4e46543a5072652d73616c65206973206e6f7420616374697665000000000000600082015250565b61501d81614930565b811461502857600080fd5b50565b61503481614942565b811461503f57600080fd5b50565b61504b8161494e565b811461505657600080fd5b50565b6150628161499a565b811461506d57600080fd5b5056fea26469706673582212206f9fe5da4e53381ac38566930b1e305dbf42f3b7be15ac07c2f32690ef89788c64736f6c634300080400330000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000009c400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000001146756e6b792053616c616d616e64657273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001046756e6b7953616c616d616e6465727300000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102ab5760003560e01c8063715018a611610175578063b88d4fde116100dc578063e222c7f911610095578063e985e9c51161006f578063e985e9c514610a0f578063f046768c14610a4c578063f2c4ce1e14610a77578063f2fde38b14610aa0576102ab565b8063e222c7f9146109a2578063e39c2092146109b9578063e757c17d146109e4576102ab565b8063b88d4fde146108a4578063bc8893b4146108cd578063c4e41b22146108f8578063c87b56dd14610923578063ca3cb52214610960578063d5abeb0114610977576102ab565b806395d89b411161012e57806395d89b41146107c7578063977b055b146107f25780639b6860c81461081d578063a22cb46514610848578063a475b5dd14610871578063b3ab66b014610888576102ab565b8063715018a6146106ec5780637835c63514610703578063791a25191461071f5780637d7eee421461074857806384494708146107715780638da5cb5b1461079c576102ab565b806318160ddd1161021957806351830227116101d257806351830227146105b657806355f804b3146105e15780635c975abb1461060a5780636352211e146106355780636f9170f61461067257806370a08231146106af576102ab565b806318160ddd146104cc5780631dcd8e4e146104f757806323b872dd146105225780632ff912a01461054b5780633ccfd60b1461057657806342842e0e1461058d576102ab565b8063081c8c441161026b578063081c8c44146103be578063095ea7b3146103e95780630bcb106a146104125780630c2d03451461043b5780631096952314610478578063154cd140146104a1576102ab565b80628803d3146102b0578062b6849f146102c7578062fec52c146102f057806301ffc9a71461031957806306fdde0314610356578063081812fc14610381575b600080fd5b3480156102bc57600080fd5b506102c5610ac9565b005b3480156102d357600080fd5b506102ee60048036038101906102e99190613f8f565b610b71565b005b3480156102fc57600080fd5b5061031760048036038101906103129190613f8f565b610d41565b005b34801561032557600080fd5b50610340600480360381019061033b9190613fd0565b610fdd565b60405161034d91906144ad565b60405180910390f35b34801561036257600080fd5b5061036b6110bf565b60405161037891906144c8565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a391906140a8565b611151565b6040516103b59190614446565b60405180910390f35b3480156103ca57600080fd5b506103d36111cd565b6040516103e091906144c8565b60405180910390f35b3480156103f557600080fd5b50610410600480360381019061040b9190613f53565b61125b565b005b34801561041e57600080fd5b5061043960048036038101906104349190613f8f565b611366565b005b34801561044757600080fd5b50610462600480360381019061045d9190613de8565b61156a565b60405161046f91906144ad565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190614067565b61158a565b005b3480156104ad57600080fd5b506104b6611620565b6040516104c3919061470a565b60405180910390f35b3480156104d857600080fd5b506104e1611626565b6040516104ee919061470a565b60405180910390f35b34801561050357600080fd5b5061050c611634565b604051610519919061470a565b60405180910390f35b34801561052e57600080fd5b5061054960048036038101906105449190613e4d565b61163a565b005b34801561055757600080fd5b5061056061164a565b60405161056d91906144c8565b60405180910390f35b34801561058257600080fd5b5061058b6116d8565b005b34801561059957600080fd5b506105b460048036038101906105af9190613e4d565b6117a3565b005b3480156105c257600080fd5b506105cb6117c3565b6040516105d891906144ad565b60405180910390f35b3480156105ed57600080fd5b5061060860048036038101906106039190614022565b6117d6565b005b34801561061657600080fd5b5061061f611868565b60405161062c91906144ad565b60405180910390f35b34801561064157600080fd5b5061065c600480360381019061065791906140a8565b61187b565b6040516106699190614446565b60405180910390f35b34801561067e57600080fd5b5061069960048036038101906106949190613de8565b611891565b6040516106a691906144ad565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d19190613de8565b6118b1565b6040516106e3919061470a565b60405180910390f35b3480156106f857600080fd5b50610701611981565b005b61071d600480360381019061071891906140a8565b611abe565b005b34801561072b57600080fd5b50610746600480360381019061074191906140a8565b611bfd565b005b34801561075457600080fd5b5061076f600480360381019061076a91906140a8565b611c83565b005b34801561077d57600080fd5b50610786611d09565b60405161079391906144ad565b60405180910390f35b3480156107a857600080fd5b506107b1611d1c565b6040516107be9190614446565b60405180910390f35b3480156107d357600080fd5b506107dc611d46565b6040516107e991906144c8565b60405180910390f35b3480156107fe57600080fd5b50610807611dd8565b604051610814919061470a565b60405180910390f35b34801561082957600080fd5b50610832611dde565b60405161083f919061470a565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a9190613f17565b611de4565b005b34801561087d57600080fd5b50610886611f5c565b005b6108a2600480360381019061089d91906140a8565b611ff5565b005b3480156108b057600080fd5b506108cb60048036038101906108c69190613e9c565b6120a8565b005b3480156108d957600080fd5b506108e26120fb565b6040516108ef91906144ad565b60405180910390f35b34801561090457600080fd5b5061090d61210e565b60405161091a919061470a565b60405180910390f35b34801561092f57600080fd5b5061094a600480360381019061094591906140a8565b61211d565b60405161095791906144c8565b60405180910390f35b34801561096c57600080fd5b50610975612282565b005b34801561098357600080fd5b5061098c61232a565b604051610999919061470a565b60405180910390f35b3480156109ae57600080fd5b506109b7612330565b005b3480156109c557600080fd5b506109ce6123d8565b6040516109db919061470a565b60405180910390f35b3480156109f057600080fd5b506109f96123de565b604051610a06919061470a565b60405180910390f35b348015610a1b57600080fd5b50610a366004803603810190610a319190613e11565b6123e4565b604051610a4391906144ad565b60405180910390f35b348015610a5857600080fd5b50610a61612478565b604051610a6e919061470a565b60405180910390f35b348015610a8357600080fd5b50610a9e6004803603810190610a999190614067565b61247e565b005b348015610aac57600080fd5b50610ac76004803603810190610ac29190613de8565b612514565b005b610ad16126c0565b73ffffffffffffffffffffffffffffffffffffffff16610aef611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614610b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3c906145ea565b60405180910390fd5b600a60029054906101000a900460ff1615600a60026101000a81548160ff021916908315150217905550565b610b796126c0565b73ffffffffffffffffffffffffffffffffffffffff16610b97611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614610bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be4906145ea565b60405180910390fd5b6000610bf7611626565b9050600e548251600f54610c0b919061481b565b1115610c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c439061464a565b60405180910390fd5b600d54610c638351836126c890919063ffffffff16565b1115610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b906146aa565b60405180910390fd5b60005b8251811015610d2257610cc381836126c890919063ffffffff16565b50610d0f838281518110610d00577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160016126de565b8080610d1a90614a49565b915050610ca7565b508151600f6000828254610d36919061481b565b925050819055505050565b610d496126c0565b73ffffffffffffffffffffffffffffffffffffffff16610d67611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db4906145ea565b60405180910390fd5b60005b8151811015610fd95760176000838381518110610e06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d9061454a565b60405180910390fd5b600160166000848481518110610ed5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160176000848481518110610f6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610fd190614a49565b915050610dc0565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806110a857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806110b857506110b7826126fc565b5b9050919050565b6060600280546110ce906149e6565b80601f01602080910402602001604051908101604052809291908181526020018280546110fa906149e6565b80156111475780601f1061111c57610100808354040283529160200191611147565b820191906000526020600020905b81548152906001019060200180831161112a57829003601f168201915b5050505050905090565b600061115c82612766565b611192576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c80546111da906149e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611206906149e6565b80156112535780601f1061122857610100808354040283529160200191611253565b820191906000526020600020905b81548152906001019060200180831161123657829003601f168201915b505050505081565b60006112668261187b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112ce576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166112ed6126c0565b73ffffffffffffffffffffffffffffffffffffffff161415801561131f575061131d816113186126c0565b6123e4565b155b15611356576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113618383836127a0565b505050565b61136e6126c0565b73ffffffffffffffffffffffffffffffffffffffff1661138c611d1c565b73ffffffffffffffffffffffffffffffffffffffff16146113e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d9906145ea565b60405180910390fd5b60005b8151811015611566576016600083838151811061142b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b29061458a565b60405180910390fd5b6001601660008484815181106114fa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061155e90614a49565b9150506113e5565b5050565b60176020528060005260406000206000915054906101000a900460ff1681565b6115926126c0565b73ffffffffffffffffffffffffffffffffffffffff166115b0611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614611606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fd906145ea565b60405180910390fd5b80600b908051906020019061161c929190613a63565b5050565b60135481565b600060015460005403905090565b600e5481565b611645838383612852565b505050565b600b8054611657906149e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611683906149e6565b80156116d05780601f106116a5576101008083540402835291602001916116d0565b820191906000526020600020905b8154815290600101906020018083116116b357829003601f168201915b505050505081565b6116e06126c0565b73ffffffffffffffffffffffffffffffffffffffff166116fe611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b906145ea565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561179f573d6000803e3d6000fd5b5050565b6117be838383604051806020016040528060008152506120a8565b505050565b600a60039054906101000a900460ff1681565b6117de6126c0565b73ffffffffffffffffffffffffffffffffffffffff166117fc611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614611852576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611849906145ea565b60405180910390fd5b818160159190611863929190613ae9565b505050565b600a60029054906101000a900460ff1681565b600061188682612d43565b600001519050919050565b60166020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611919576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6119896126c0565b73ffffffffffffffffffffffffffffffffffffffff166119a7611d1c565b73ffffffffffffffffffffffffffffffffffffffff16146119fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f4906145ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60026009541415611b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afb906146ca565b60405180910390fd5b6002600981905550600a60009054906101000a900460ff16611b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b52906146ea565b60405180910390fd5b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde9061468a565b60405180910390fd5b611bf2816001612fbf565b600160098190555050565b611c056126c0565b73ffffffffffffffffffffffffffffffffffffffff16611c23611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614611c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c70906145ea565b60405180910390fd5b8060118190555050565b611c8b6126c0565b73ffffffffffffffffffffffffffffffffffffffff16611ca9611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614611cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf6906145ea565b60405180910390fd5b8060108190555050565b600a60009054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611d55906149e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d81906149e6565b8015611dce5780601f10611da357610100808354040283529160200191611dce565b820191906000526020600020905b815481529060010190602001808311611db157829003601f168201915b5050505050905090565b60125481565b60115481565b611dec6126c0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e51576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611e5e6126c0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f0b6126c0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f5091906144ad565b60405180910390a35050565b611f646126c0565b73ffffffffffffffffffffffffffffffffffffffff16611f82611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614611fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcf906145ea565b60405180910390fd5b6001600a60036101000a81548160ff021916908315150217905550565b6002600954141561203b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612032906146ca565b60405180910390fd5b6002600981905550600a60019054906101000a900460ff16612092576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120899061450a565b60405180910390fd5b61209d816000612fbf565b600160098190555050565b6120b3848484612852565b6120bf84848484613308565b6120f5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600a60019054906101000a900460ff1681565b6000612118611626565b905090565b606061212882612766565b612167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215e9061460a565b60405180910390fd5b60001515600a60039054906101000a900460ff161515141561221557600c8054612190906149e6565b80601f01602080910402602001604051908101604052809291908181526020018280546121bc906149e6565b80156122095780601f106121de57610100808354040283529160200191612209565b820191906000526020600020905b8154815290600101906020018083116121ec57829003601f168201915b5050505050905061227d565b600182612222919061481b565b9150600061222e613496565b9050600081511161224e5760405180602001604052806000815250612279565b8061225884613528565b604051602001612269929190614417565b6040516020818303038152906040525b9150505b919050565b61228a6126c0565b73ffffffffffffffffffffffffffffffffffffffff166122a8611d1c565b73ffffffffffffffffffffffffffffffffffffffff16146122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f5906145ea565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b600d5481565b6123386126c0565b73ffffffffffffffffffffffffffffffffffffffff16612356611d1c565b73ffffffffffffffffffffffffffffffffffffffff16146123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a3906145ea565b60405180910390fd5b600a60019054906101000a900460ff1615600a60016101000a81548160ff021916908315150217905550565b60145481565b60105481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f5481565b6124866126c0565b73ffffffffffffffffffffffffffffffffffffffff166124a4611d1c565b73ffffffffffffffffffffffffffffffffffffffff16146124fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f1906145ea565b60405180910390fd5b80600c9080519060200190612510929190613a63565b5050565b61251c6126c0565b73ffffffffffffffffffffffffffffffffffffffff1661253a611d1c565b73ffffffffffffffffffffffffffffffffffffffff1614612590576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612587906145ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f79061452a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600081836126d6919061481b565b905092915050565b6126f88282604051806020016040528060008152506136d5565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482108015612799575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061285d82612d43565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166128846126c0565b73ffffffffffffffffffffffffffffffffffffffff1614806128b757506128b682600001516128b16126c0565b6123e4565b5b806128fc57506128c56126c0565b73ffffffffffffffffffffffffffffffffffffffff166128e484611151565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612935576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461299e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a05576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a1285858560016136e7565b612a2260008484600001516127a0565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612cd357600054811015612cd25782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d3c85858560016136ed565b5050505050565b612d4b613b6f565b6000829050600054811015612f88576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612f8657600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e6a578092505050612fba565b5b600115612f8557818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f80578092505050612fba565b612e6b565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600a60029054906101000a900460ff161561300f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613006906145aa565b60405180910390fd5b600d5461302c8361301e611626565b6126c890919063ffffffff16565b111561306d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613064906146aa565b60405180910390fd5b600a60019054906101000a900460ff16156130e6576014546130a083613092336118b1565b6126c890919063ffffffff16565b11156130e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d89061462a565b60405180910390fd5b6131fd565b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561319c5760135461315683613148336118b1565b6126c890919063ffffffff16565b1115613197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318e9061466a565b60405180910390fd5b6131fc565b6012546131ba836131ac336118b1565b6126c890919063ffffffff16565b11156131fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f2906144ea565b60405180910390fd5b5b5b801561325f5734613219836010546136f390919063ffffffff16565b111561325a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613251906145ca565b60405180910390fd5b6132b7565b34613275836011546136f390919063ffffffff16565b11156132b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ad9061456a565b60405180910390fd5b5b60006132c1611626565b90506000600190505b8381116132f8576132e481836126c890919063ffffffff16565b5080806132f090614a49565b9150506132ca565b5061330333846126de565b505050565b60006133298473ffffffffffffffffffffffffffffffffffffffff16613709565b15613489578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133526126c0565b8786866040518563ffffffff1660e01b81526004016133749493929190614461565b602060405180830381600087803b15801561338e57600080fd5b505af19250505080156133bf57506040513d601f19601f820116820180604052508101906133bc9190613ff9565b60015b613439573d80600081146133ef576040519150601f19603f3d011682016040523d82523d6000602084013e6133f4565b606091505b50600081511415613431576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061348e565b600190505b949350505050565b6060601580546134a5906149e6565b80601f01602080910402602001604051908101604052809291908181526020018280546134d1906149e6565b801561351e5780601f106134f35761010080835404028352916020019161351e565b820191906000526020600020905b81548152906001019060200180831161350157829003601f168201915b5050505050905090565b60606000821415613570576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506136d0565b600082905060005b600082146135a257808061358b90614a49565b915050600a8261359b9190614871565b9150613578565b60008167ffffffffffffffff8111156135e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156136165781602001600182028036833780820191505090505b5090505b600085146136c95760018261362f91906148fc565b9150600a8561363e9190614a92565b603061364a919061481b565b60f81b818381518110613686577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856136c29190614871565b945061361a565b8093505050505b919050565b6136e2838383600161372c565b505050565b50505050565b50505050565b6000818361370191906148a2565b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613799576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156137d4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6137e160008683876136e7565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015613a4657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156139fa57506139f86000888488613308565b155b15613a31576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505061397f565b508060008190555050613a5c60008683876136ed565b5050505050565b828054613a6f906149e6565b90600052602060002090601f016020900481019282613a915760008555613ad8565b82601f10613aaa57805160ff1916838001178555613ad8565b82800160010185558215613ad8579182015b82811115613ad7578251825591602001919060010190613abc565b5b509050613ae59190613bb2565b5090565b828054613af5906149e6565b90600052602060002090601f016020900481019282613b175760008555613b5e565b82601f10613b3057803560ff1916838001178555613b5e565b82800160010185558215613b5e579182015b82811115613b5d578235825591602001919060010190613b42565b5b509050613b6b9190613bb2565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613bcb576000816000905550600101613bb3565b5090565b6000613be2613bdd8461474a565b614725565b90508083825260208201905082856020860282011115613c0157600080fd5b60005b85811015613c315781613c178882613cb7565b845260208401935060208301925050600181019050613c04565b5050509392505050565b6000613c4e613c4984614776565b614725565b905082815260208101848484011115613c6657600080fd5b613c718482856149a4565b509392505050565b6000613c8c613c87846147a7565b614725565b905082815260208101848484011115613ca457600080fd5b613caf8482856149a4565b509392505050565b600081359050613cc681615014565b92915050565b600082601f830112613cdd57600080fd5b8135613ced848260208601613bcf565b91505092915050565b600081359050613d058161502b565b92915050565b600081359050613d1a81615042565b92915050565b600081519050613d2f81615042565b92915050565b600082601f830112613d4657600080fd5b8135613d56848260208601613c3b565b91505092915050565b60008083601f840112613d7157600080fd5b8235905067ffffffffffffffff811115613d8a57600080fd5b602083019150836001820283011115613da257600080fd5b9250929050565b600082601f830112613dba57600080fd5b8135613dca848260208601613c79565b91505092915050565b600081359050613de281615059565b92915050565b600060208284031215613dfa57600080fd5b6000613e0884828501613cb7565b91505092915050565b60008060408385031215613e2457600080fd5b6000613e3285828601613cb7565b9250506020613e4385828601613cb7565b9150509250929050565b600080600060608486031215613e6257600080fd5b6000613e7086828701613cb7565b9350506020613e8186828701613cb7565b9250506040613e9286828701613dd3565b9150509250925092565b60008060008060808587031215613eb257600080fd5b6000613ec087828801613cb7565b9450506020613ed187828801613cb7565b9350506040613ee287828801613dd3565b925050606085013567ffffffffffffffff811115613eff57600080fd5b613f0b87828801613d35565b91505092959194509250565b60008060408385031215613f2a57600080fd5b6000613f3885828601613cb7565b9250506020613f4985828601613cf6565b9150509250929050565b60008060408385031215613f6657600080fd5b6000613f7485828601613cb7565b9250506020613f8585828601613dd3565b9150509250929050565b600060208284031215613fa157600080fd5b600082013567ffffffffffffffff811115613fbb57600080fd5b613fc784828501613ccc565b91505092915050565b600060208284031215613fe257600080fd5b6000613ff084828501613d0b565b91505092915050565b60006020828403121561400b57600080fd5b600061401984828501613d20565b91505092915050565b6000806020838503121561403557600080fd5b600083013567ffffffffffffffff81111561404f57600080fd5b61405b85828601613d5f565b92509250509250929050565b60006020828403121561407957600080fd5b600082013567ffffffffffffffff81111561409357600080fd5b61409f84828501613da9565b91505092915050565b6000602082840312156140ba57600080fd5b60006140c884828501613dd3565b91505092915050565b6140da81614930565b82525050565b6140e981614942565b82525050565b60006140fa826147d8565b61410481856147ee565b93506141148185602086016149b3565b61411d81614b7f565b840191505092915050565b6000614133826147e3565b61413d81856147ff565b935061414d8185602086016149b3565b61415681614b7f565b840191505092915050565b600061416c826147e3565b6141768185614810565b93506141868185602086016149b3565b80840191505092915050565b600061419f6023836147ff565b91506141aa82614b90565b604082019050919050565b60006141c2601d836147ff565b91506141cd82614bdf565b602082019050919050565b60006141e56026836147ff565b91506141f082614c08565b604082019050919050565b60006142086021836147ff565b915061421382614c57565b604082019050919050565b600061422b6034836147ff565b915061423682614ca6565b604082019050919050565b600061424e6024836147ff565b915061425982614cf5565b604082019050919050565b60006142716017836147ff565b915061427c82614d44565b602082019050919050565b6000614294600583614810565b915061429f82614d6d565b600582019050919050565b60006142b76035836147ff565b91506142c282614d96565b604082019050919050565b60006142da6020836147ff565b91506142e582614de5565b602082019050919050565b60006142fd602f836147ff565b915061430882614e0e565b604082019050919050565b6000614320602a836147ff565b915061432b82614e5d565b604082019050919050565b60006143436023836147ff565b915061434e82614eac565b604082019050919050565b60006143666026836147ff565b915061437182614efb565b604082019050919050565b6000614389601d836147ff565b915061439482614f4a565b602082019050919050565b60006143ac6026836147ff565b91506143b782614f73565b604082019050919050565b60006143cf601f836147ff565b91506143da82614fc2565b602082019050919050565b60006143f2601a836147ff565b91506143fd82614feb565b602082019050919050565b6144118161499a565b82525050565b60006144238285614161565b915061442f8284614161565b915061443a82614287565b91508190509392505050565b600060208201905061445b60008301846140d1565b92915050565b600060808201905061447660008301876140d1565b61448360208301866140d1565b6144906040830185614408565b81810360608301526144a281846140ef565b905095945050505050565b60006020820190506144c260008301846140e0565b92915050565b600060208201905081810360008301526144e28184614128565b905092915050565b6000602082019050818103600083015261450381614192565b9050919050565b60006020820190508181036000830152614523816141b5565b9050919050565b60006020820190508181036000830152614543816141d8565b9050919050565b60006020820190508181036000830152614563816141fb565b9050919050565b600060208201905081810360008301526145838161421e565b9050919050565b600060208201905081810360008301526145a381614241565b9050919050565b600060208201905081810360008301526145c381614264565b9050919050565b600060208201905081810360008301526145e3816142aa565b9050919050565b60006020820190508181036000830152614603816142cd565b9050919050565b60006020820190508181036000830152614623816142f0565b9050919050565b6000602082019050818103600083015261464381614313565b9050919050565b6000602082019050818103600083015261466381614336565b9050919050565b6000602082019050818103600083015261468381614359565b9050919050565b600060208201905081810360008301526146a38161437c565b9050919050565b600060208201905081810360008301526146c38161439f565b9050919050565b600060208201905081810360008301526146e3816143c2565b9050919050565b60006020820190508181036000830152614703816143e5565b9050919050565b600060208201905061471f6000830184614408565b92915050565b600061472f614740565b905061473b8282614a18565b919050565b6000604051905090565b600067ffffffffffffffff82111561476557614764614b50565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561479157614790614b50565b5b61479a82614b7f565b9050602081019050919050565b600067ffffffffffffffff8211156147c2576147c1614b50565b5b6147cb82614b7f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006148268261499a565b91506148318361499a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561486657614865614ac3565b5b828201905092915050565b600061487c8261499a565b91506148878361499a565b92508261489757614896614af2565b5b828204905092915050565b60006148ad8261499a565b91506148b88361499a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148f1576148f0614ac3565b5b828202905092915050565b60006149078261499a565b91506149128361499a565b92508282101561492557614924614ac3565b5b828203905092915050565b600061493b8261497a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156149d15780820151818401526020810190506149b6565b838111156149e0576000848401525b50505050565b600060028204905060018216806149fe57607f821691505b60208210811415614a1257614a11614b21565b5b50919050565b614a2182614b7f565b810181811067ffffffffffffffff82111715614a4057614a3f614b50565b5b80604052505050565b6000614a548261499a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a8757614a86614ac3565b5b600182019050919050565b6000614a9d8261499a565b9150614aa88361499a565b925082614ab857614ab7614af2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4e46543a20596f752063616e2774206d696e7420616e79206d6f726520746f6b60008201527f656e730000000000000000000000000000000000000000000000000000000000602082015250565b7f4e46543a5075626c69632d73616c65206973206e6f7420616374697665000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e46543a206164647265737320697320616c7265616479204f47206c6973746560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e46543a2045746865722076616c75652073656e7420666f72207075626c696360008201527f206d696e74206973206e6f7420636f7272656374000000000000000000000000602082015250565b7f4e46543a206164647265737320697320616c7265616479207768697465206c6960008201527f7374656400000000000000000000000000000000000000000000000000000000602082015250565b7f4e46543a20636f6e747261637420697320706175736564000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4e46543a2045746865722076616c75652073656e7420666f722070726573616c60008201527f65206d696e74206973206e6f7420636f72726563740000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e46542d5075626c69633a20596f752063616e2774206d696e7420616e79206d60008201527f6f726520746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f4e46543a204d6178696d756d204169722044726f70204c696d6974205265616360008201527f6865640000000000000000000000000000000000000000000000000000000000602082015250565b7f4e46542d4f473a20596f752063616e2774206d696e7420616e79206d6f72652060008201527f746f6b656e730000000000000000000000000000000000000000000000000000602082015250565b7f4e46543a53656e646572206973206e6f742077686974656c6973746564000000600082015250565b7f4e46543a206d696e74696e6720776f756c642065786365656420746f74616c2060008201527f737570706c790000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4e46543a5072652d73616c65206973206e6f7420616374697665000000000000600082015250565b61501d81614930565b811461502857600080fd5b50565b61503481614942565b811461503f57600080fd5b50565b61504b8161494e565b811461505657600080fd5b50565b6150628161499a565b811461506d57600080fd5b5056fea26469706673582212206f9fe5da4e53381ac38566930b1e305dbf42f3b7be15ac07c2f32690ef89788c64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000009c400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000001146756e6b792053616c616d616e64657273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001046756e6b7953616c616d616e6465727300000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Funky Salamanders
Arg [1] : symbol (string): FunkySalamanders
Arg [2] : _maxSupply (uint256): 2500
Arg [3] : _publicPurchase (uint256): 5
Arg [4] : _maxPurchase (uint256): 2
Arg [5] : _maxPurchaseOG (uint256): 4
Arg [6] : _preSalePrice (uint256): 50000000000000000
Arg [7] : _publicSalePrice (uint256): 50000000000000000
Arg [8] : _maxAirDropSupply (uint256): 100
-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [2] : 00000000000000000000000000000000000000000000000000000000000009c4
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 00000000000000000000000000000000000000000000000000b1a2bc2ec50000
Arg [7] : 00000000000000000000000000000000000000000000000000b1a2bc2ec50000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [10] : 46756e6b792053616c616d616e64657273000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [12] : 46756e6b7953616c616d616e6465727300000000000000000000000000000000
Deployed Bytecode Sourcemap
116881:6500:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120989:82;;;;;;;;;;;;;:::i;:::-;;121542:521;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;120636:345;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;96194:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98737:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100240:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;117203:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99803:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;120336:294;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;117708:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;122362:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;117541:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95851:271;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;117279:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101097:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;117159:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;122150:142;;;;;;;;;;;;;:::i;:::-;;101338:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;117122:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;120215:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;117090:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98546:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;117656:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96563:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;116163:148;;;;;;;;;;;;;:::i;:::-;;118326:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;121409:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;121179:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;117005:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;115512:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98906:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;117506:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;117434:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100516:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;122071:71;;;;;;;;;;;;;:::i;:::-;;118581:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;101594:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;117045:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;119991:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;122500:736;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;121079:92;;;;;;;;;;;;;:::i;:::-;;117240:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;121300:101;;;;;;;;;;;;;:::i;:::-;;117578:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;117367:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100866:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;117324:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;123248:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;116466:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;120989:82;115743:12;:10;:12::i;:::-;115732:23;;:7;:5;:7::i;:::-;:23;;;115724:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;121057:6:::1;;;;;;;;;;;121056:7;121047:6;;:16;;;;;;;;;;;;;;;;;;120989:82::o:0;121542:521::-;115743:12;:10;:12::i;:::-;115732:23;;:7;:5;:7::i;:::-;:23;;;115724:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;121614:17:::1;121634:13;:11;:13::i;:::-;121614:33;;121708:16;;121689:8;:15;121666:20;;:38;;;;:::i;:::-;:58;;121658:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;121817:9;;121783:30;121797:8;:15;121783:9;:13;;:30;;;;:::i;:::-;:43;;121775:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;121884:9;121880:126;121903:8;:15;121899:1;:19;121880:126;;;121939:16;121953:1;121939:9;:13;;:16;;;;:::i;:::-;;121970:24;121980:8;121989:1;121980:11;;;;;;;;;;;;;;;;;;;;;;121992:1;121970:9;:24::i;:::-;121920:3;;;;;:::i;:::-;;;;121880:126;;;;122040:8;:15;122016:20;;:39;;;;;;;:::i;:::-;;;;;;;;115803:1;121542:521:::0;:::o;120636:345::-;115743:12;:10;:12::i;:::-;115732:23;;:7;:5;:7::i;:::-;:23;;;115724:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;120733:9:::1;120728:246;120752:8;:15;120748:1;:19;120728:246;;;120798:15;:28;120814:8;120823:1;120814:11;;;;;;;;;;;;;;;;;;;;;;120798:28;;;;;;;;;;;;;;;;;;;;;;;;;120797:29;120789:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;120908:4;120879:13;:26;120893:8;120902:1;120893:11;;;;;;;;;;;;;;;;;;;;;;120879:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;120958:4;120927:15;:28;120943:8;120952:1;120943:11;;;;;;;;;;;;;;;;;;;;;;120927:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;120769:3;;;;;:::i;:::-;;;;120728:246;;;;120636:345:::0;:::o;96194:305::-;96296:4;96348:25;96333:40;;;:11;:40;;;;:105;;;;96405:33;96390:48;;;:11;:48;;;;96333:105;:158;;;;96455:36;96479:11;96455:23;:36::i;:::-;96333:158;96313:178;;96194:305;;;:::o;98737:100::-;98791:13;98824:5;98817:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98737:100;:::o;100240:204::-;100308:7;100333:16;100341:7;100333;:16::i;:::-;100328:64;;100358:34;;;;;;;;;;;;;;100328:64;100412:15;:24;100428:7;100412:24;;;;;;;;;;;;;;;;;;;;;100405:31;;100240:204;;;:::o;117203:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;99803:371::-;99876:13;99892:24;99908:7;99892:15;:24::i;:::-;99876:40;;99937:5;99931:11;;:2;:11;;;99927:48;;;99951:24;;;;;;;;;;;;;;99927:48;100008:5;99992:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;100018:37;100035:5;100042:12;:10;:12::i;:::-;100018:16;:37::i;:::-;100017:38;99992:63;99988:138;;;100079:35;;;;;;;;;;;;;;99988:138;100138:28;100147:2;100151:7;100160:5;100138:8;:28::i;:::-;99803:371;;;:::o;120336:294::-;115743:12;:10;:12::i;:::-;115732:23;;:7;:5;:7::i;:::-;:23;;;115724:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;120431:9:::1;120426:197;120450:8;:15;120446:1;:19;120426:197;;;120496:13;:26;120510:8;120519:1;120510:11;;;;;;;;;;;;;;;;;;;;;;120496:26;;;;;;;;;;;;;;;;;;;;;;;;;120495:27;120487:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;120607:4;120578:13;:26;120592:8;120601:1;120592:11;;;;;;;;;;;;;;;;;;;;;;120578:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;120467:3;;;;;:::i;:::-;;;;120426:197;;;;120336:294:::0;:::o;117708:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;122362:130::-;115743:12;:10;:12::i;:::-;115732:23;;:7;:5;:7::i;:::-;:23;;;115724:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;122470:14:::1;122449:18;:35;;;;;;;;;;;;:::i;:::-;;122362:130:::0;:::o;117541:25::-;;;;:::o;95851:271::-;95895:7;96087:12;;96071:13;;:28;96064:35;;95851:271;:::o;117279:31::-;;;;:::o;101097:170::-;101231:28;101241:4;101247:2;101251:7;101231:9;:28::i;:::-;101097:170;;;:::o;117159:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;122150:142::-;115743:12;:10;:12::i;:::-;115732:23;;:7;:5;:7::i;:::-;:23;;;115724:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;122200:12:::1;122215:21;122200:36;;122255:10;122247:28;;:37;122276:7;122247:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;115803:1;122150:142::o:0;101338:185::-;101476:39;101493:4;101499:2;101503:7;101476:39;;;;;;;;;;;;:16;:39::i;:::-;101338:185;;;:::o;117122:28::-;;;;;;;;;;;;;:::o;120215:111::-;115743:12;:10;:12::i;:::-;115732:23;;:7;:5;:7::i;:::-;:23;;;115724:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;120310:8:::1;;120291:16;:27;;;;;;;:::i;:::-;;120215:111:::0;;:::o;117090:25::-;;;;;;;;;;;;;:::o;98546:124::-;98610:7;98637:20;98649:7;98637:11;:20::i;:::-;:25;;;98630:32;;98546:124;;;:::o;117656:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;96563:206::-;96627:7;96668:1;96651:19;;:5;:19;;;96647:60;;;96679:28;;;;;;;;;;;;;;96647:60;96733:12;:19;96746:5;96733:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;96725:36;;96718:43;;96563:206;;;:::o;116163:148::-;115743:12;:10;:12::i;:::-;115732:23;;:7;:5;:7::i;:::-;:23;;;115724:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;116270:1:::1;116233:40;;116254:6;;;;;;;;;;;116233:40;;;;;;;;;;;;116301:1;116284:6;;:19;;;;;;;;;;;;;;;;;;116163:148::o:0;118326:247::-;113518:1;114116:7;;:19;;114108:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;113518:1;114249:7;:18;;;;118413:13:::1;;;;;;;;;;;118405:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;118476:13;:25;118490:10;118476:25;;;;;;;;;;;;;;;;;;;;;;;;;118468:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;118546:19;118551:7;118560:4;118546;:19::i;:::-;113474:1:::0;114428:7;:22;;;;118326:247;:::o;121409:125::-;115743:12;:10;:12::i;:::-;115732:23;;:7;:5;:7::i;:::-;:23;;;115724:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;121510:16:::1;121492:15;:34;;;;121409:125:::0;:::o;121179:113::-;115743:12;:10;:12::i;:::-;115732:23;;:7;:5;:7::i;:::-;:23;;;115724:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;121271:13:::1;121256:12;:28;;;;121179:113:::0;:::o;117005:33::-;;;;;;;;;;;;;:::o;115512:87::-;115558:7;115585:6;;;;;;;;;;;115578:13;;115512:87;:::o;98906:104::-;98962:13;98995:7;98988:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98906:104;:::o;117506:23::-;;;;:::o;117434:30::-;;;;:::o;100516:279::-;100619:12;:10;:12::i;:::-;100607:24;;:8;:24;;;100603:54;;;100640:17;;;;;;;;;;;;;;100603:54;100715:8;100670:18;:32;100689:12;:10;:12::i;:::-;100670:32;;;;;;;;;;;;;;;:42;100703:8;100670:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;100768:8;100739:48;;100754:12;:10;:12::i;:::-;100739:48;;;100778:8;100739:48;;;;;;:::i;:::-;;;;;;;;100516:279;;:::o;122071:71::-;115743:12;:10;:12::i;:::-;115732:23;;:7;:5;:7::i;:::-;:23;;;115724:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;122130:4:::1;122119:8;;:15;;;;;;;;;;;;;;;;;;122071:71::o:0;118581:177::-;113518:1;114116:7;;:19;;114108:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;113518:1;114249:7;:18;;;;118669:16:::1;;;;;;;;;;;118661:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;118730:20;118735:7;118744:5;118730:4;:20::i;:::-;113474:1:::0;114428:7;:22;;;;118581:177;:::o;101594:342::-;101761:28;101771:4;101777:2;101781:7;101761:9;:28::i;:::-;101805:48;101828:4;101834:2;101838:7;101847:5;101805:22;:48::i;:::-;101800:129;;101877:40;;;;;;;;;;;;;;101800:129;101594:342;;;;:::o;117045:36::-;;;;;;;;;;;;;:::o;119991:91::-;120038:4;120061:13;:11;:13::i;:::-;120054:20;;119991:91;:::o;122500:736::-;122618:13;122671:16;122679:7;122671;:16::i;:::-;122649:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;122789:5;122777:17;;:8;;;;;;;;;;;:17;;;122773:71;;;122818:14;122811:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;122773:71;122863:1;122854:10;;;;;:::i;:::-;;;122875:28;122906:10;:8;:10::i;:::-;122875:41;;122978:1;122953:14;122947:28;:32;:281;;;;;;;;;;;;;;;;;123071:14;123112:18;:7;:16;:18::i;:::-;123028:159;;;;;;;;;:::i;:::-;;;;;;;;;;;;;122947:281;122927:301;;;122500:736;;;;:::o;121079:92::-;115743:12;:10;:12::i;:::-;115732:23;;:7;:5;:7::i;:::-;:23;;;115724:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;121150:13:::1;;;;;;;;;;;121149:14;121133:13;;:30;;;;;;;;;;;;;;;;;;121079:92::o:0;117240:24::-;;;;:::o;121300:101::-;115743:12;:10;:12::i;:::-;115732:23;;:7;:5;:7::i;:::-;:23;;;115724:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;121377:16:::1;;;;;;;;;;;121376:17;121357:16;;:36;;;;;;;;;;;;;;;;;;121300:101::o:0;117578:26::-;;;;:::o;117367:27::-;;;;:::o;100866:164::-;100963:4;100987:18;:25;101006:5;100987:25;;;;;;;;;;;;;;;:35;101013:8;100987:35;;;;;;;;;;;;;;;;;;;;;;;;;100980:42;;100866:164;;;;:::o;117324:35::-;;;;:::o;123248:128::-;115743:12;:10;:12::i;:::-;115732:23;;:7;:5;:7::i;:::-;:23;;;115724:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;123353:15:::1;123336:14;:32;;;;;;;;;;;;:::i;:::-;;123248:128:::0;:::o;116466:244::-;115743:12;:10;:12::i;:::-;115732:23;;:7;:5;:7::i;:::-;:23;;;115724:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;116575:1:::1;116555:22;;:8;:22;;;;116547:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;116665:8;116636:38;;116657:6;;;;;;;;;;;116636:38;;;;;;;;;;;;116694:8;116685:6;;:17;;;;;;;;;;;;;;;;;;116466:244:::0;:::o;18046:98::-;18099:7;18126:10;18119:17;;18046:98;:::o;87900:::-;87958:7;87989:1;87985;:5;;;;:::i;:::-;87978:12;;87900:98;;;;:::o;102343:104::-;102412:27;102422:2;102426:8;102412:27;;;;;;;;;;;;:9;:27::i;:::-;102343:104;;:::o;21269:157::-;21354:4;21393:25;21378:40;;;:11;:40;;;;21371:47;;21269:157;;;:::o;102191:144::-;102248:4;102282:13;;102272:7;:23;:55;;;;;102300:11;:20;102312:7;102300:20;;;;;;;;;;;:27;;;;;;;;;;;;102299:28;102272:55;102265:62;;102191:144;;;:::o;109397:196::-;109539:2;109512:15;:24;109528:7;109512:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;109577:7;109573:2;109557:28;;109566:5;109557:28;;;;;;;;;;;;109397:196;;;:::o;104898:2112::-;105013:35;105051:20;105063:7;105051:11;:20::i;:::-;105013:58;;105084:22;105126:13;:18;;;105110:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;105161:50;105178:13;:18;;;105198:12;:10;:12::i;:::-;105161:16;:50::i;:::-;105110:101;:154;;;;105252:12;:10;:12::i;:::-;105228:36;;:20;105240:7;105228:11;:20::i;:::-;:36;;;105110:154;105084:181;;105283:17;105278:66;;105309:35;;;;;;;;;;;;;;105278:66;105381:4;105359:26;;:13;:18;;;:26;;;105355:67;;105394:28;;;;;;;;;;;;;;105355:67;105451:1;105437:16;;:2;:16;;;105433:52;;;105462:23;;;;;;;;;;;;;;105433:52;105498:43;105520:4;105526:2;105530:7;105539:1;105498:21;:43::i;:::-;105606:49;105623:1;105627:7;105636:13;:18;;;105606:8;:49::i;:::-;105981:1;105951:12;:18;105964:4;105951:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106025:1;105997:12;:16;106010:2;105997:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106071:2;106043:11;:20;106055:7;106043:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;106133:15;106088:11;:20;106100:7;106088:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;106401:19;106433:1;106423:7;:11;106401:33;;106494:1;106453:43;;:11;:24;106465:11;106453:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;106449:445;;;106678:13;;106664:11;:27;106660:219;;;106748:13;:18;;;106716:11;:24;106728:11;106716:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;106831:13;:28;;;106789:11;:24;106801:11;106789:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;106660:219;106449:445;104898:2112;106941:7;106937:2;106922:27;;106931:4;106922:27;;;;;;;;;;;;106960:42;106981:4;106987:2;106991:7;107000:1;106960:20;:42::i;:::-;104898:2112;;;;;:::o;97401:1083::-;97462:21;;:::i;:::-;97496:12;97511:7;97496:22;;97567:13;;97560:4;:20;97556:861;;;97601:31;97635:11;:17;97647:4;97635:17;;;;;;;;;;;97601:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97676:9;:16;;;97671:731;;97747:1;97721:28;;:9;:14;;;:28;;;97717:101;;97785:9;97778:16;;;;;;97717:101;98122:261;98129:4;98122:261;;;98162:6;;;;;;;;98207:11;:17;98219:4;98207:17;;;;;;;;;;;98195:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98281:1;98255:28;;:9;:14;;;:28;;;98251:109;;98323:9;98316:16;;;;;;98251:109;98122:261;;;97671:731;97556:861;;98445:31;;;;;;;;;;;;;;97401:1083;;;;:::o;118766:1217::-;118837:6;;;;;;;;;;;118836:7;118828:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;118920:9;;118890:26;118908:7;118890:13;:11;:13::i;:::-;:17;;:26;;;;:::i;:::-;:39;;118882:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;118986:16;;;;;;;;;;;118983:512;;;119064:14;;119026:34;119052:7;119026:21;119036:10;119026:9;:21::i;:::-;:25;;:34;;;;:::i;:::-;:52;;119018:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;118983:512;;;119169:15;:27;119185:10;119169:27;;;;;;;;;;;;;;;;;;;;;;;;;119166:318;;;119262:13;;119224:34;119250:7;119224:21;119234:10;119224:9;:21::i;:::-;:25;;:34;;;;:::i;:::-;:51;;119216:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;119166:318;;;119417:11;;119379:34;119405:7;119379:21;119389:10;119379:9;:21::i;:::-;:25;;:34;;;;:::i;:::-;:49;;119371:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;119166:318;118983:512;119508:6;119505:288;;;119567:9;119538:25;119555:7;119538:12;;:16;;:25;;;;:::i;:::-;:38;;119530:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;119505:288;;;119715:9;119683:28;119703:7;119683:15;;:19;;:28;;;;:::i;:::-;:41;;119675:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;119505:288;119803:14;119820:13;:11;:13::i;:::-;119803:30;;119849:11;119863:1;119849:15;;119844:90;119873:7;119866:3;:14;119844:90;;119904:18;119918:3;119904:9;:13;;:18;;;;:::i;:::-;;119882:5;;;;;:::i;:::-;;;;119844:90;;;;119945:30;119955:10;119967:7;119945:9;:30::i;:::-;118766:1217;;;:::o;110158:790::-;110313:4;110334:15;:2;:13;;;:15::i;:::-;110330:611;;;110386:2;110370:36;;;110407:12;:10;:12::i;:::-;110421:4;110427:7;110436:5;110370:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;110366:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;110633:1;110616:6;:13;:18;110612:259;;;110666:40;;;;;;;;;;;;;;110612:259;110821:6;110815:13;110806:6;110802:2;110798:15;110791:38;110366:520;110503:45;;;110493:55;;;:6;:55;;;;110486:62;;;;;110330:611;110925:4;110918:11;;110158:790;;;;;;;:::o;120090:117::-;120150:13;120183:16;120176:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120090:117;:::o;18636:723::-;18692:13;18922:1;18913:5;:10;18909:53;;;18940:10;;;;;;;;;;;;;;;;;;;;;18909:53;18972:12;18987:5;18972:20;;19003:14;19028:78;19043:1;19035:4;:9;19028:78;;19061:8;;;;;:::i;:::-;;;;19092:2;19084:10;;;;;:::i;:::-;;;19028:78;;;19116:19;19148:6;19138:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19116:39;;19166:154;19182:1;19173:5;:10;19166:154;;19210:1;19200:11;;;;;:::i;:::-;;;19277:2;19269:5;:10;;;;:::i;:::-;19256:2;:24;;;;:::i;:::-;19243:39;;19226:6;19233;19226:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;19306:2;19297:11;;;;;:::i;:::-;;;19166:154;;;19344:6;19330:21;;;;;18636:723;;;;:::o;102810:163::-;102933:32;102939:2;102943:8;102953:5;102960:4;102933:5;:32::i;:::-;102810:163;;;:::o;111596:159::-;;;;;:::o;112414:158::-;;;;;:::o;88638:98::-;88696:7;88727:1;88723;:5;;;;:::i;:::-;88716:12;;88638:98;;;;:::o;10086:326::-;10146:4;10403:1;10381:7;:19;;;:23;10374:30;;10086:326;;;:::o;103232:1412::-;103371:20;103394:13;;103371:36;;103436:1;103422:16;;:2;:16;;;103418:48;;;103447:19;;;;;;;;;;;;;;103418:48;103493:1;103481:8;:13;103477:44;;;103503:18;;;;;;;;;;;;;;103477:44;103534:61;103564:1;103568:2;103572:12;103586:8;103534:21;:61::i;:::-;103907:8;103872:12;:16;103885:2;103872:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;103971:8;103931:12;:16;103944:2;103931:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104030:2;103997:11;:25;104009:12;103997:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;104097:15;104047:11;:25;104059:12;104047:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;104130:20;104153:12;104130:35;;104187:9;104182:328;104202:8;104198:1;:12;104182:328;;;104266:12;104262:2;104241:38;;104258:1;104241:38;;;;;;;;;;;;104302:4;:68;;;;;104311:59;104342:1;104346:2;104350:12;104364:5;104311:22;:59::i;:::-;104310:60;104302:68;104298:164;;;104402:40;;;;;;;;;;;;;;104298:164;104480:14;;;;;;;104212:3;;;;;;;104182:328;;;;104542:12;104526:13;:28;;;;103232:1412;104576:60;104605:1;104609:2;104613:12;104627:8;104576:20;:60::i;:::-;103232:1412;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:345::-;1112:5;1137:66;1153:49;1195:6;1153:49;:::i;:::-;1137:66;:::i;:::-;1128:75;;1226:6;1219:5;1212:21;1264:4;1257:5;1253:16;1302:3;1293:6;1288:3;1284:16;1281:25;1278:2;;;1319:1;1316;1309:12;1278:2;1332:41;1366:6;1361:3;1356;1332:41;:::i;:::-;1118:261;;;;;;:::o;1385:139::-;1431:5;1469:6;1456:20;1447:29;;1485:33;1512:5;1485:33;:::i;:::-;1437:87;;;;:::o;1547:303::-;1618:5;1667:3;1660:4;1652:6;1648:17;1644:27;1634:2;;1685:1;1682;1675:12;1634:2;1725:6;1712:20;1750:94;1840:3;1832:6;1825:4;1817:6;1813:17;1750:94;:::i;:::-;1741:103;;1624:226;;;;;:::o;1856:133::-;1899:5;1937:6;1924:20;1915:29;;1953:30;1977:5;1953:30;:::i;:::-;1905:84;;;;:::o;1995:137::-;2040:5;2078:6;2065:20;2056:29;;2094:32;2120:5;2094:32;:::i;:::-;2046:86;;;;:::o;2138:141::-;2194:5;2225:6;2219:13;2210:22;;2241:32;2267:5;2241:32;:::i;:::-;2200:79;;;;:::o;2298:271::-;2353:5;2402:3;2395:4;2387:6;2383:17;2379:27;2369:2;;2420:1;2417;2410:12;2369:2;2460:6;2447:20;2485:78;2559:3;2551:6;2544:4;2536:6;2532:17;2485:78;:::i;:::-;2476:87;;2359:210;;;;;:::o;2589:352::-;2647:8;2657:6;2707:3;2700:4;2692:6;2688:17;2684:27;2674:2;;2725:1;2722;2715:12;2674:2;2761:6;2748:20;2738:30;;2791:18;2783:6;2780:30;2777:2;;;2823:1;2820;2813:12;2777:2;2860:4;2852:6;2848:17;2836:29;;2914:3;2906:4;2898:6;2894:17;2884:8;2880:32;2877:41;2874:2;;;2931:1;2928;2921:12;2874:2;2664:277;;;;;:::o;2961:273::-;3017:5;3066:3;3059:4;3051:6;3047:17;3043:27;3033:2;;3084:1;3081;3074:12;3033:2;3124:6;3111:20;3149:79;3224:3;3216:6;3209:4;3201:6;3197:17;3149:79;:::i;:::-;3140:88;;3023:211;;;;;:::o;3240:139::-;3286:5;3324:6;3311:20;3302:29;;3340:33;3367:5;3340:33;:::i;:::-;3292:87;;;;:::o;3385:262::-;3444:6;3493:2;3481:9;3472:7;3468:23;3464:32;3461:2;;;3509:1;3506;3499:12;3461:2;3552:1;3577:53;3622:7;3613:6;3602:9;3598:22;3577:53;:::i;:::-;3567:63;;3523:117;3451:196;;;;:::o;3653:407::-;3721:6;3729;3778:2;3766:9;3757:7;3753:23;3749:32;3746:2;;;3794:1;3791;3784:12;3746:2;3837:1;3862:53;3907:7;3898:6;3887:9;3883:22;3862:53;:::i;:::-;3852:63;;3808:117;3964:2;3990:53;4035:7;4026:6;4015:9;4011:22;3990:53;:::i;:::-;3980:63;;3935:118;3736:324;;;;;:::o;4066:552::-;4143:6;4151;4159;4208:2;4196:9;4187:7;4183:23;4179:32;4176:2;;;4224:1;4221;4214:12;4176:2;4267:1;4292:53;4337:7;4328:6;4317:9;4313:22;4292:53;:::i;:::-;4282:63;;4238:117;4394:2;4420:53;4465:7;4456:6;4445:9;4441:22;4420:53;:::i;:::-;4410:63;;4365:118;4522:2;4548:53;4593:7;4584:6;4573:9;4569:22;4548:53;:::i;:::-;4538:63;;4493:118;4166:452;;;;;:::o;4624:809::-;4719:6;4727;4735;4743;4792:3;4780:9;4771:7;4767:23;4763:33;4760:2;;;4809:1;4806;4799:12;4760:2;4852:1;4877:53;4922:7;4913:6;4902:9;4898:22;4877:53;:::i;:::-;4867:63;;4823:117;4979:2;5005:53;5050:7;5041:6;5030:9;5026:22;5005:53;:::i;:::-;4995:63;;4950:118;5107:2;5133:53;5178:7;5169:6;5158:9;5154:22;5133:53;:::i;:::-;5123:63;;5078:118;5263:2;5252:9;5248:18;5235:32;5294:18;5286:6;5283:30;5280:2;;;5326:1;5323;5316:12;5280:2;5354:62;5408:7;5399:6;5388:9;5384:22;5354:62;:::i;:::-;5344:72;;5206:220;4750:683;;;;;;;:::o;5439:401::-;5504:6;5512;5561:2;5549:9;5540:7;5536:23;5532:32;5529:2;;;5577:1;5574;5567:12;5529:2;5620:1;5645:53;5690:7;5681:6;5670:9;5666:22;5645:53;:::i;:::-;5635:63;;5591:117;5747:2;5773:50;5815:7;5806:6;5795:9;5791:22;5773:50;:::i;:::-;5763:60;;5718:115;5519:321;;;;;:::o;5846:407::-;5914:6;5922;5971:2;5959:9;5950:7;5946:23;5942:32;5939:2;;;5987:1;5984;5977:12;5939:2;6030:1;6055:53;6100:7;6091:6;6080:9;6076:22;6055:53;:::i;:::-;6045:63;;6001:117;6157:2;6183:53;6228:7;6219:6;6208:9;6204:22;6183:53;:::i;:::-;6173:63;;6128:118;5929:324;;;;;:::o;6259:405::-;6343:6;6392:2;6380:9;6371:7;6367:23;6363:32;6360:2;;;6408:1;6405;6398:12;6360:2;6479:1;6468:9;6464:17;6451:31;6509:18;6501:6;6498:30;6495:2;;;6541:1;6538;6531:12;6495:2;6569:78;6639:7;6630:6;6619:9;6615:22;6569:78;:::i;:::-;6559:88;;6422:235;6350:314;;;;:::o;6670:260::-;6728:6;6777:2;6765:9;6756:7;6752:23;6748:32;6745:2;;;6793:1;6790;6783:12;6745:2;6836:1;6861:52;6905:7;6896:6;6885:9;6881:22;6861:52;:::i;:::-;6851:62;;6807:116;6735:195;;;;:::o;6936:282::-;7005:6;7054:2;7042:9;7033:7;7029:23;7025:32;7022:2;;;7070:1;7067;7060:12;7022:2;7113:1;7138:63;7193:7;7184:6;7173:9;7169:22;7138:63;:::i;:::-;7128:73;;7084:127;7012:206;;;;:::o;7224:395::-;7295:6;7303;7352:2;7340:9;7331:7;7327:23;7323:32;7320:2;;;7368:1;7365;7358:12;7320:2;7439:1;7428:9;7424:17;7411:31;7469:18;7461:6;7458:30;7455:2;;;7501:1;7498;7491:12;7455:2;7537:65;7594:7;7585:6;7574:9;7570:22;7537:65;:::i;:::-;7519:83;;;;7382:230;7310:309;;;;;:::o;7625:375::-;7694:6;7743:2;7731:9;7722:7;7718:23;7714:32;7711:2;;;7759:1;7756;7749:12;7711:2;7830:1;7819:9;7815:17;7802:31;7860:18;7852:6;7849:30;7846:2;;;7892:1;7889;7882:12;7846:2;7920:63;7975:7;7966:6;7955:9;7951:22;7920:63;:::i;:::-;7910:73;;7773:220;7701:299;;;;:::o;8006:262::-;8065:6;8114:2;8102:9;8093:7;8089:23;8085:32;8082:2;;;8130:1;8127;8120:12;8082:2;8173:1;8198:53;8243:7;8234:6;8223:9;8219:22;8198:53;:::i;:::-;8188:63;;8144:117;8072:196;;;;:::o;8274:118::-;8361:24;8379:5;8361:24;:::i;:::-;8356:3;8349:37;8339:53;;:::o;8398:109::-;8479:21;8494:5;8479:21;:::i;:::-;8474:3;8467:34;8457:50;;:::o;8513:360::-;8599:3;8627:38;8659:5;8627:38;:::i;:::-;8681:70;8744:6;8739:3;8681:70;:::i;:::-;8674:77;;8760:52;8805:6;8800:3;8793:4;8786:5;8782:16;8760:52;:::i;:::-;8837:29;8859:6;8837:29;:::i;:::-;8832:3;8828:39;8821:46;;8603:270;;;;;:::o;8879:364::-;8967:3;8995:39;9028:5;8995:39;:::i;:::-;9050:71;9114:6;9109:3;9050:71;:::i;:::-;9043:78;;9130:52;9175:6;9170:3;9163:4;9156:5;9152:16;9130:52;:::i;:::-;9207:29;9229:6;9207:29;:::i;:::-;9202:3;9198:39;9191:46;;8971:272;;;;;:::o;9249:377::-;9355:3;9383:39;9416:5;9383:39;:::i;:::-;9438:89;9520:6;9515:3;9438:89;:::i;:::-;9431:96;;9536:52;9581:6;9576:3;9569:4;9562:5;9558:16;9536:52;:::i;:::-;9613:6;9608:3;9604:16;9597:23;;9359:267;;;;;:::o;9632:366::-;9774:3;9795:67;9859:2;9854:3;9795:67;:::i;:::-;9788:74;;9871:93;9960:3;9871:93;:::i;:::-;9989:2;9984:3;9980:12;9973:19;;9778:220;;;:::o;10004:366::-;10146:3;10167:67;10231:2;10226:3;10167:67;:::i;:::-;10160:74;;10243:93;10332:3;10243:93;:::i;:::-;10361:2;10356:3;10352:12;10345:19;;10150:220;;;:::o;10376:366::-;10518:3;10539:67;10603:2;10598:3;10539:67;:::i;:::-;10532:74;;10615:93;10704:3;10615:93;:::i;:::-;10733:2;10728:3;10724:12;10717:19;;10522:220;;;:::o;10748:366::-;10890:3;10911:67;10975:2;10970:3;10911:67;:::i;:::-;10904:74;;10987:93;11076:3;10987:93;:::i;:::-;11105:2;11100:3;11096:12;11089:19;;10894:220;;;:::o;11120:366::-;11262:3;11283:67;11347:2;11342:3;11283:67;:::i;:::-;11276:74;;11359:93;11448:3;11359:93;:::i;:::-;11477:2;11472:3;11468:12;11461:19;;11266:220;;;:::o;11492:366::-;11634:3;11655:67;11719:2;11714:3;11655:67;:::i;:::-;11648:74;;11731:93;11820:3;11731:93;:::i;:::-;11849:2;11844:3;11840:12;11833:19;;11638:220;;;:::o;11864:366::-;12006:3;12027:67;12091:2;12086:3;12027:67;:::i;:::-;12020:74;;12103:93;12192:3;12103:93;:::i;:::-;12221:2;12216:3;12212:12;12205:19;;12010:220;;;:::o;12236:400::-;12396:3;12417:84;12499:1;12494:3;12417:84;:::i;:::-;12410:91;;12510:93;12599:3;12510:93;:::i;:::-;12628:1;12623:3;12619:11;12612:18;;12400:236;;;:::o;12642:366::-;12784:3;12805:67;12869:2;12864:3;12805:67;:::i;:::-;12798:74;;12881:93;12970:3;12881:93;:::i;:::-;12999:2;12994:3;12990:12;12983:19;;12788:220;;;:::o;13014:366::-;13156:3;13177:67;13241:2;13236:3;13177:67;:::i;:::-;13170:74;;13253:93;13342:3;13253:93;:::i;:::-;13371:2;13366:3;13362:12;13355:19;;13160:220;;;:::o;13386:366::-;13528:3;13549:67;13613:2;13608:3;13549:67;:::i;:::-;13542:74;;13625:93;13714:3;13625:93;:::i;:::-;13743:2;13738:3;13734:12;13727:19;;13532:220;;;:::o;13758:366::-;13900:3;13921:67;13985:2;13980:3;13921:67;:::i;:::-;13914:74;;13997:93;14086:3;13997:93;:::i;:::-;14115:2;14110:3;14106:12;14099:19;;13904:220;;;:::o;14130:366::-;14272:3;14293:67;14357:2;14352:3;14293:67;:::i;:::-;14286:74;;14369:93;14458:3;14369:93;:::i;:::-;14487:2;14482:3;14478:12;14471:19;;14276:220;;;:::o;14502:366::-;14644:3;14665:67;14729:2;14724:3;14665:67;:::i;:::-;14658:74;;14741:93;14830:3;14741:93;:::i;:::-;14859:2;14854:3;14850:12;14843:19;;14648:220;;;:::o;14874:366::-;15016:3;15037:67;15101:2;15096:3;15037:67;:::i;:::-;15030:74;;15113:93;15202:3;15113:93;:::i;:::-;15231:2;15226:3;15222:12;15215:19;;15020:220;;;:::o;15246:366::-;15388:3;15409:67;15473:2;15468:3;15409:67;:::i;:::-;15402:74;;15485:93;15574:3;15485:93;:::i;:::-;15603:2;15598:3;15594:12;15587:19;;15392:220;;;:::o;15618:366::-;15760:3;15781:67;15845:2;15840:3;15781:67;:::i;:::-;15774:74;;15857:93;15946:3;15857:93;:::i;:::-;15975:2;15970:3;15966:12;15959:19;;15764:220;;;:::o;15990:366::-;16132:3;16153:67;16217:2;16212:3;16153:67;:::i;:::-;16146:74;;16229:93;16318:3;16229:93;:::i;:::-;16347:2;16342:3;16338:12;16331:19;;16136:220;;;:::o;16362:118::-;16449:24;16467:5;16449:24;:::i;:::-;16444:3;16437:37;16427:53;;:::o;16486:701::-;16767:3;16789:95;16880:3;16871:6;16789:95;:::i;:::-;16782:102;;16901:95;16992:3;16983:6;16901:95;:::i;:::-;16894:102;;17013:148;17157:3;17013:148;:::i;:::-;17006:155;;17178:3;17171:10;;16771:416;;;;;:::o;17193:222::-;17286:4;17324:2;17313:9;17309:18;17301:26;;17337:71;17405:1;17394:9;17390:17;17381:6;17337:71;:::i;:::-;17291:124;;;;:::o;17421:640::-;17616:4;17654:3;17643:9;17639:19;17631:27;;17668:71;17736:1;17725:9;17721:17;17712:6;17668:71;:::i;:::-;17749:72;17817:2;17806:9;17802:18;17793:6;17749:72;:::i;:::-;17831;17899:2;17888:9;17884:18;17875:6;17831:72;:::i;:::-;17950:9;17944:4;17940:20;17935:2;17924:9;17920:18;17913:48;17978:76;18049:4;18040:6;17978:76;:::i;:::-;17970:84;;17621:440;;;;;;;:::o;18067:210::-;18154:4;18192:2;18181:9;18177:18;18169:26;;18205:65;18267:1;18256:9;18252:17;18243:6;18205:65;:::i;:::-;18159:118;;;;:::o;18283:313::-;18396:4;18434:2;18423:9;18419:18;18411:26;;18483:9;18477:4;18473:20;18469:1;18458:9;18454:17;18447:47;18511:78;18584:4;18575:6;18511:78;:::i;:::-;18503:86;;18401:195;;;;:::o;18602:419::-;18768:4;18806:2;18795:9;18791:18;18783:26;;18855:9;18849:4;18845:20;18841:1;18830:9;18826:17;18819:47;18883:131;19009:4;18883:131;:::i;:::-;18875:139;;18773:248;;;:::o;19027:419::-;19193:4;19231:2;19220:9;19216:18;19208:26;;19280:9;19274:4;19270:20;19266:1;19255:9;19251:17;19244:47;19308:131;19434:4;19308:131;:::i;:::-;19300:139;;19198:248;;;:::o;19452:419::-;19618:4;19656:2;19645:9;19641:18;19633:26;;19705:9;19699:4;19695:20;19691:1;19680:9;19676:17;19669:47;19733:131;19859:4;19733:131;:::i;:::-;19725:139;;19623:248;;;:::o;19877:419::-;20043:4;20081:2;20070:9;20066:18;20058:26;;20130:9;20124:4;20120:20;20116:1;20105:9;20101:17;20094:47;20158:131;20284:4;20158:131;:::i;:::-;20150:139;;20048:248;;;:::o;20302:419::-;20468:4;20506:2;20495:9;20491:18;20483:26;;20555:9;20549:4;20545:20;20541:1;20530:9;20526:17;20519:47;20583:131;20709:4;20583:131;:::i;:::-;20575:139;;20473:248;;;:::o;20727:419::-;20893:4;20931:2;20920:9;20916:18;20908:26;;20980:9;20974:4;20970:20;20966:1;20955:9;20951:17;20944:47;21008:131;21134:4;21008:131;:::i;:::-;21000:139;;20898:248;;;:::o;21152:419::-;21318:4;21356:2;21345:9;21341:18;21333:26;;21405:9;21399:4;21395:20;21391:1;21380:9;21376:17;21369:47;21433:131;21559:4;21433:131;:::i;:::-;21425:139;;21323:248;;;:::o;21577:419::-;21743:4;21781:2;21770:9;21766:18;21758:26;;21830:9;21824:4;21820:20;21816:1;21805:9;21801:17;21794:47;21858:131;21984:4;21858:131;:::i;:::-;21850:139;;21748:248;;;:::o;22002:419::-;22168:4;22206:2;22195:9;22191:18;22183:26;;22255:9;22249:4;22245:20;22241:1;22230:9;22226:17;22219:47;22283:131;22409:4;22283:131;:::i;:::-;22275:139;;22173:248;;;:::o;22427:419::-;22593:4;22631:2;22620:9;22616:18;22608:26;;22680:9;22674:4;22670:20;22666:1;22655:9;22651:17;22644:47;22708:131;22834:4;22708:131;:::i;:::-;22700:139;;22598:248;;;:::o;22852:419::-;23018:4;23056:2;23045:9;23041:18;23033:26;;23105:9;23099:4;23095:20;23091:1;23080:9;23076:17;23069:47;23133:131;23259:4;23133:131;:::i;:::-;23125:139;;23023:248;;;:::o;23277:419::-;23443:4;23481:2;23470:9;23466:18;23458:26;;23530:9;23524:4;23520:20;23516:1;23505:9;23501:17;23494:47;23558:131;23684:4;23558:131;:::i;:::-;23550:139;;23448:248;;;:::o;23702:419::-;23868:4;23906:2;23895:9;23891:18;23883:26;;23955:9;23949:4;23945:20;23941:1;23930:9;23926:17;23919:47;23983:131;24109:4;23983:131;:::i;:::-;23975:139;;23873:248;;;:::o;24127:419::-;24293:4;24331:2;24320:9;24316:18;24308:26;;24380:9;24374:4;24370:20;24366:1;24355:9;24351:17;24344:47;24408:131;24534:4;24408:131;:::i;:::-;24400:139;;24298:248;;;:::o;24552:419::-;24718:4;24756:2;24745:9;24741:18;24733:26;;24805:9;24799:4;24795:20;24791:1;24780:9;24776:17;24769:47;24833:131;24959:4;24833:131;:::i;:::-;24825:139;;24723:248;;;:::o;24977:419::-;25143:4;25181:2;25170:9;25166:18;25158:26;;25230:9;25224:4;25220:20;25216:1;25205:9;25201:17;25194:47;25258:131;25384:4;25258:131;:::i;:::-;25250:139;;25148:248;;;:::o;25402:419::-;25568:4;25606:2;25595:9;25591:18;25583:26;;25655:9;25649:4;25645:20;25641:1;25630:9;25626:17;25619:47;25683:131;25809:4;25683:131;:::i;:::-;25675:139;;25573:248;;;:::o;25827:222::-;25920:4;25958:2;25947:9;25943:18;25935:26;;25971:71;26039:1;26028:9;26024:17;26015:6;25971:71;:::i;:::-;25925:124;;;;:::o;26055:129::-;26089:6;26116:20;;:::i;:::-;26106:30;;26145:33;26173:4;26165:6;26145:33;:::i;:::-;26096:88;;;:::o;26190:75::-;26223:6;26256:2;26250:9;26240:19;;26230:35;:::o;26271:311::-;26348:4;26438:18;26430:6;26427:30;26424:2;;;26460:18;;:::i;:::-;26424:2;26510:4;26502:6;26498:17;26490:25;;26570:4;26564;26560:15;26552:23;;26353:229;;;:::o;26588:307::-;26649:4;26739:18;26731:6;26728:30;26725:2;;;26761:18;;:::i;:::-;26725:2;26799:29;26821:6;26799:29;:::i;:::-;26791:37;;26883:4;26877;26873:15;26865:23;;26654:241;;;:::o;26901:308::-;26963:4;27053:18;27045:6;27042:30;27039:2;;;27075:18;;:::i;:::-;27039:2;27113:29;27135:6;27113:29;:::i;:::-;27105:37;;27197:4;27191;27187:15;27179:23;;26968:241;;;:::o;27215:98::-;27266:6;27300:5;27294:12;27284:22;;27273:40;;;:::o;27319:99::-;27371:6;27405:5;27399:12;27389:22;;27378:40;;;:::o;27424:168::-;27507:11;27541:6;27536:3;27529:19;27581:4;27576:3;27572:14;27557:29;;27519:73;;;;:::o;27598:169::-;27682:11;27716:6;27711:3;27704:19;27756:4;27751:3;27747:14;27732:29;;27694:73;;;;:::o;27773:148::-;27875:11;27912:3;27897:18;;27887:34;;;;:::o;27927:305::-;27967:3;27986:20;28004:1;27986:20;:::i;:::-;27981:25;;28020:20;28038:1;28020:20;:::i;:::-;28015:25;;28174:1;28106:66;28102:74;28099:1;28096:81;28093:2;;;28180:18;;:::i;:::-;28093:2;28224:1;28221;28217:9;28210:16;;27971:261;;;;:::o;28238:185::-;28278:1;28295:20;28313:1;28295:20;:::i;:::-;28290:25;;28329:20;28347:1;28329:20;:::i;:::-;28324:25;;28368:1;28358:2;;28373:18;;:::i;:::-;28358:2;28415:1;28412;28408:9;28403:14;;28280:143;;;;:::o;28429:348::-;28469:7;28492:20;28510:1;28492:20;:::i;:::-;28487:25;;28526:20;28544:1;28526:20;:::i;:::-;28521:25;;28714:1;28646:66;28642:74;28639:1;28636:81;28631:1;28624:9;28617:17;28613:105;28610:2;;;28721:18;;:::i;:::-;28610:2;28769:1;28766;28762:9;28751:20;;28477:300;;;;:::o;28783:191::-;28823:4;28843:20;28861:1;28843:20;:::i;:::-;28838:25;;28877:20;28895:1;28877:20;:::i;:::-;28872:25;;28916:1;28913;28910:8;28907:2;;;28921:18;;:::i;:::-;28907:2;28966:1;28963;28959:9;28951:17;;28828:146;;;;:::o;28980:96::-;29017:7;29046:24;29064:5;29046:24;:::i;:::-;29035:35;;29025:51;;;:::o;29082:90::-;29116:7;29159:5;29152:13;29145:21;29134:32;;29124:48;;;:::o;29178:149::-;29214:7;29254:66;29247:5;29243:78;29232:89;;29222:105;;;:::o;29333:126::-;29370:7;29410:42;29403:5;29399:54;29388:65;;29378:81;;;:::o;29465:77::-;29502:7;29531:5;29520:16;;29510:32;;;:::o;29548:154::-;29632:6;29627:3;29622;29609:30;29694:1;29685:6;29680:3;29676:16;29669:27;29599:103;;;:::o;29708:307::-;29776:1;29786:113;29800:6;29797:1;29794:13;29786:113;;;29885:1;29880:3;29876:11;29870:18;29866:1;29861:3;29857:11;29850:39;29822:2;29819:1;29815:10;29810:15;;29786:113;;;29917:6;29914:1;29911:13;29908:2;;;29997:1;29988:6;29983:3;29979:16;29972:27;29908:2;29757:258;;;;:::o;30021:320::-;30065:6;30102:1;30096:4;30092:12;30082:22;;30149:1;30143:4;30139:12;30170:18;30160:2;;30226:4;30218:6;30214:17;30204:27;;30160:2;30288;30280:6;30277:14;30257:18;30254:38;30251:2;;;30307:18;;:::i;:::-;30251:2;30072:269;;;;:::o;30347:281::-;30430:27;30452:4;30430:27;:::i;:::-;30422:6;30418:40;30560:6;30548:10;30545:22;30524:18;30512:10;30509:34;30506:62;30503:2;;;30571:18;;:::i;:::-;30503:2;30611:10;30607:2;30600:22;30390:238;;;:::o;30634:233::-;30673:3;30696:24;30714:5;30696:24;:::i;:::-;30687:33;;30742:66;30735:5;30732:77;30729:2;;;30812:18;;:::i;:::-;30729:2;30859:1;30852:5;30848:13;30841:20;;30677:190;;;:::o;30873:176::-;30905:1;30922:20;30940:1;30922:20;:::i;:::-;30917:25;;30956:20;30974:1;30956:20;:::i;:::-;30951:25;;30995:1;30985:2;;31000:18;;:::i;:::-;30985:2;31041:1;31038;31034:9;31029:14;;30907:142;;;;:::o;31055:180::-;31103:77;31100:1;31093:88;31200:4;31197:1;31190:15;31224:4;31221:1;31214:15;31241:180;31289:77;31286:1;31279:88;31386:4;31383:1;31376:15;31410:4;31407:1;31400:15;31427:180;31475:77;31472:1;31465:88;31572:4;31569:1;31562:15;31596:4;31593:1;31586:15;31613:180;31661:77;31658:1;31651:88;31758:4;31755:1;31748:15;31782:4;31779:1;31772:15;31799:102;31840:6;31891:2;31887:7;31882:2;31875:5;31871:14;31867:28;31857:38;;31847:54;;;:::o;31907:222::-;32047:34;32043:1;32035:6;32031:14;32024:58;32116:5;32111:2;32103:6;32099:15;32092:30;32013:116;:::o;32135:179::-;32275:31;32271:1;32263:6;32259:14;32252:55;32241:73;:::o;32320:225::-;32460:34;32456:1;32448:6;32444:14;32437:58;32529:8;32524:2;32516:6;32512:15;32505:33;32426:119;:::o;32551:220::-;32691:34;32687:1;32679:6;32675:14;32668:58;32760:3;32755:2;32747:6;32743:15;32736:28;32657:114;:::o;32777:239::-;32917:34;32913:1;32905:6;32901:14;32894:58;32986:22;32981:2;32973:6;32969:15;32962:47;32883:133;:::o;33022:223::-;33162:34;33158:1;33150:6;33146:14;33139:58;33231:6;33226:2;33218:6;33214:15;33207:31;33128:117;:::o;33251:173::-;33391:25;33387:1;33379:6;33375:14;33368:49;33357:67;:::o;33430:155::-;33570:7;33566:1;33558:6;33554:14;33547:31;33536:49;:::o;33591:240::-;33731:34;33727:1;33719:6;33715:14;33708:58;33800:23;33795:2;33787:6;33783:15;33776:48;33697:134;:::o;33837:182::-;33977:34;33973:1;33965:6;33961:14;33954:58;33943:76;:::o;34025:234::-;34165:34;34161:1;34153:6;34149:14;34142:58;34234:17;34229:2;34221:6;34217:15;34210:42;34131:128;:::o;34265:229::-;34405:34;34401:1;34393:6;34389:14;34382:58;34474:12;34469:2;34461:6;34457:15;34450:37;34371:123;:::o;34500:222::-;34640:34;34636:1;34628:6;34624:14;34617:58;34709:5;34704:2;34696:6;34692:15;34685:30;34606:116;:::o;34728:225::-;34868:34;34864:1;34856:6;34852:14;34845:58;34937:8;34932:2;34924:6;34920:15;34913:33;34834:119;:::o;34959:179::-;35099:31;35095:1;35087:6;35083:14;35076:55;35065:73;:::o;35144:225::-;35284:34;35280:1;35272:6;35268:14;35261:58;35353:8;35348:2;35340:6;35336:15;35329:33;35250:119;:::o;35375:181::-;35515:33;35511:1;35503:6;35499:14;35492:57;35481:75;:::o;35562:176::-;35702:28;35698:1;35690:6;35686:14;35679:52;35668:70;:::o;35744:122::-;35817:24;35835:5;35817:24;:::i;:::-;35810:5;35807:35;35797:2;;35856:1;35853;35846:12;35797:2;35787:79;:::o;35872:116::-;35942:21;35957:5;35942:21;:::i;:::-;35935:5;35932:32;35922:2;;35978:1;35975;35968:12;35922:2;35912:76;:::o;35994:120::-;36066:23;36083:5;36066:23;:::i;:::-;36059:5;36056:34;36046:2;;36104:1;36101;36094:12;36046:2;36036:78;:::o;36120:122::-;36193:24;36211:5;36193:24;:::i;:::-;36186:5;36183:35;36173:2;;36232:1;36229;36222:12;36173:2;36163:79;:::o
Swarm Source
ipfs://6f9fe5da4e53381ac38566930b1e305dbf42f3b7be15ac07c2f32690ef89788c
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.