Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 2,306 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Safe Transfer Fr... | 23110412 | 230 days ago | IN | 0 ETH | 0.00010272 | ||||
| Set Approval For... | 23108063 | 230 days ago | IN | 0 ETH | 0.00002426 | ||||
| Set Approval For... | 23080001 | 234 days ago | IN | 0 ETH | 0.00001936 | ||||
| Set Approval For... | 21446877 | 462 days ago | IN | 0 ETH | 0.00049272 | ||||
| Safe Transfer Fr... | 20885879 | 541 days ago | IN | 0 ETH | 0.00080815 | ||||
| Safe Transfer Fr... | 20369496 | 613 days ago | IN | 0 ETH | 0.00027937 | ||||
| Safe Mint | 20369455 | 613 days ago | IN | 0 ETH | 0.00039255 | ||||
| Set Approval For... | 20285291 | 624 days ago | IN | 0 ETH | 0.00009926 | ||||
| Safe Transfer Fr... | 20279391 | 625 days ago | IN | 0 ETH | 0.00019062 | ||||
| Safe Mint | 20279341 | 625 days ago | IN | 0 ETH | 0.00026354 | ||||
| Safe Transfer Fr... | 20158602 | 642 days ago | IN | 0 ETH | 0.00020499 | ||||
| Safe Mint | 20143060 | 644 days ago | IN | 0 ETH | 0.00024271 | ||||
| Safe Transfer Fr... | 20119514 | 648 days ago | IN | 0 ETH | 0.00093827 | ||||
| Safe Mint | 20119486 | 648 days ago | IN | 0 ETH | 0.00108899 | ||||
| Safe Transfer Fr... | 20086706 | 652 days ago | IN | 0 ETH | 0.00042908 | ||||
| Safe Mint | 20086662 | 652 days ago | IN | 0 ETH | 0.00057204 | ||||
| Safe Transfer Fr... | 20019702 | 661 days ago | IN | 0 ETH | 0.00117165 | ||||
| Safe Mint | 20019665 | 661 days ago | IN | 0 ETH | 0.00198253 | ||||
| Safe Transfer Fr... | 19934497 | 673 days ago | IN | 0 ETH | 0.00070552 | ||||
| Set Approval For... | 19920400 | 675 days ago | IN | 0 ETH | 0.00079539 | ||||
| Safe Mint | 19919654 | 675 days ago | IN | 0 ETH | 0.00222083 | ||||
| Safe Transfer Fr... | 19868246 | 683 days ago | IN | 0 ETH | 0.00071083 | ||||
| Safe Transfer Fr... | 19790191 | 694 days ago | IN | 0 ETH | 0.00063843 | ||||
| Safe Mint | 19790179 | 694 days ago | IN | 0 ETH | 0.00089412 | ||||
| Safe Transfer Fr... | 19771941 | 696 days ago | IN | 0 ETH | 0.00036984 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PayPhone
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-11 */ // // ██████╗░░█████╗░██╗░░░██╗██████╗░██╗░░██╗░█████╗░███╗░░██╗███████╗ // ██╔══██╗██╔══██╗╚██╗░██╔╝██╔══██╗██║░░██║██╔══██╗████╗░██║██╔════╝ // ██████╔╝███████║░╚████╔╝░██████╔╝███████║██║░░██║██╔██╗██║█████╗░░ // ██╔═══╝░██╔══██║░░╚██╔╝░░██╔═══╝░██╔══██║██║░░██║██║╚████║██╔══╝░░ // ██║░░░░░██║░░██║░░░██║░░░██║░░░░░██║░░██║╚█████╔╝██║░╚███║███████╗ // ╚═╝░░░░░╚═╝░░╚═╝░░░╚═╝░░░╚═╝░░░░░╚═╝░░╚═╝░╚════╝░╚═╝░░╚══╝╚══════╝ // // Payphone by 0xDEAFBEEF // Sep 2022 // File: @openzeppelin/[email protected]/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) //SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/[email protected]/utils/Strings.sol // 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/[email protected]/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/[email protected]/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/[email protected]/utils/Address.sol // 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/[email protected]/token/ERC721/IERC721Receiver.sol // 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/[email protected]/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/[email protected]/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol // 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/[email protected]/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/[email protected]/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; string internal _baseURI; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return bytes(_baseURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenId.toString())) : ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: payphone.sol pragma solidity ^0.8.4; contract PayPhone is ERC721, Ownable { using Counters for Counters.Counter; uint256 public last_dial_ts; uint256 public dial_index; uint256 public callsRemaining; uint256 public callRateLimit; bool public inTheOffice; uint256 public dialCost; uint256 public maxMsgLength; event DialEvent(address from, string m,uint256 dial_id); bool public isSealed; Counters.Counter private _tokenIdCounter; struct dialStruct { address from; uint256 ts; string m; //optionally store the message in contract storage } struct tokenStruct { uint256 dialId; //indentifies which dial, index into dials[] id; string m; //optionally store the message in contract storage string ipfs; //optional IPFS hash for backup of metadata } mapping (uint256 => dialStruct) public dials; mapping (uint256 => tokenStruct) public tokens; constructor() ERC721("PayPhone", "PAYPHONE") { inTheOffice = false; callsRemaining = 0; callRateLimit = 60; setBaseURI("https://payphone.deafbeef.com/"); dialCost = 25000000000; //calls cost 25 Gwei maxMsgLength=10000; } function dial(string calldata m) payable public { require(msg.value>=dialCost, "Must send [dialCost] to dial"); require(inTheOffice==true,"Please call back during business hours."); require(callsRemaining > 0,"Order book is full for now. Call back later."); require(block.timestamp - last_dial_ts > callRateLimit,"Busy signal. Wait [callRateLimit] seconds before calling back."); require(bytes(m).length < maxMsgLength, "Message too long"); last_dial_ts = block.timestamp; dials[dial_index].from = msg.sender; dials[dial_index].ts = last_dial_ts; dial_index++; callsRemaining--; emit DialEvent(msg.sender,m,dial_index-1); } //seconds remaining in rate limiting function timeRemaining() public view returns (uint256) { uint256 a = block.timestamp - last_dial_ts; if (a > callRateLimit) { return 0; } else { return callRateLimit - a; } } function setTokenIPFS(uint256 id, string memory h) public onlyOwner { require(id < _tokenIdCounter.current(), "TokenID out of range."); tokens[id].ipfs = h; } function setTokenDetails(uint256 id, uint256 dialId, string calldata m) public onlyOwner { require(id < _tokenIdCounter.current(), "TokenID out of range."); tokens[id].dialId = dialId; tokens[id].m = m; } function storeDialMessage(uint256 dialId, string calldata m) public onlyOwner { require(dialId < dial_index, "Dial Index out of range."); dials[dialId].m = m; } function setBaseURI(string memory b) public onlyOwner { _baseURI = b; } function setMaxMsgLength(uint256 a) public onlyOwner { maxMsgLength=a; } function setDialCost(uint256 a) public onlyOwner { dialCost = a; } //enable function setInTheOffice(bool a) public onlyOwner { inTheOffice = a; } //set the number of calls allowed during a shift function setCallsRemaining(uint256 a) public onlyOwner { callsRemaining = a; } function seal() public onlyOwner { isSealed=true; } function withdraw() public onlyOwner { payable(msg.sender).transfer(address(this).balance); } //set the allowable minimum number of seconds between calls function setCallRateLimit(uint256 a) public onlyOwner { callRateLimit = a; } function safeMint(address to) public onlyOwner { require(!isSealed, "contract sealed"); uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"string","name":"m","type":"string"},{"indexed":false,"internalType":"uint256","name":"dial_id","type":"uint256"}],"name":"DialEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callRateLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"m","type":"string"}],"name":"dial","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"dialCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dial_index","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dials","outputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"ts","type":"uint256"},{"internalType":"string","name":"m","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inTheOffice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"last_dial_ts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMsgLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seal","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":"b","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setCallRateLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setCallsRemaining","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setDialCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"a","type":"bool"}],"name":"setInTheOffice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setMaxMsgLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"dialId","type":"uint256"},{"internalType":"string","name":"m","type":"string"}],"name":"setTokenDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"h","type":"string"}],"name":"setTokenIPFS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dialId","type":"uint256"},{"internalType":"string","name":"m","type":"string"}],"name":"storeDialMessage","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":"timeRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"uint256","name":"dialId","type":"uint256"},{"internalType":"string","name":"m","type":"string"},{"internalType":"string","name":"ipfs","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600881526020017f50617950686f6e650000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f50415950484f4e4500000000000000000000000000000000000000000000000081525081600090805190602001906200009692919062000301565b508060019080519060200190620000af92919062000301565b505050620000d2620000c66200015e60201b60201c565b6200016660201b60201c565b6000600c60006101000a81548160ff0219169083151502179055506000600a81905550603c600b81905550620001436040518060400160405280601e81526020017f68747470733a2f2f70617970686f6e652e64656166626565662e636f6d2f00008152506200022c60201b60201c565b6405d21dba00600d81905550612710600e8190555062000499565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200023c6200015e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000262620002d760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002bb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002b290620003d8565b60405180910390fd5b8060029080519060200190620002d392919062000301565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200030f906200040b565b90600052602060002090601f0160209004810192826200033357600085556200037f565b82601f106200034e57805160ff19168380011785556200037f565b828001600101855582156200037f579182015b828111156200037e57825182559160200191906001019062000361565b5b5090506200038e919062000392565b5090565b5b80821115620003ad57600081600090555060010162000393565b5090565b6000620003c0602083620003fa565b9150620003cd8262000470565b602082019050919050565b60006020820190508181036000830152620003f381620003b1565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200042457607f821691505b602082108114156200043b576200043a62000441565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61482380620004a96000396000f3fe60806040526004361061023b5760003560e01c8063715018a61161012e578063c97efd0b116100ab578063e985e9c51161006f578063e985e9c51461083c578063f2fde38b14610879578063f42231f8146108a2578063f789d0b6146108cd578063fa63ca25146108f85761023b565b8063c97efd0b14610769578063d010028514610794578063d189db97146107bf578063d6ec4c61146107e8578063e3cfef60146108115761023b565b806395d89b41116100f257806395d89b4114610684578063a22cb465146106af578063b88d4fde146106d8578063c62ef37414610701578063c87b56dd1461072c5761023b565b8063715018a6146105af578063786c8adb146105c65780637a3c371014610605578063859912d81461062e5780638da5cb5b146106595761023b565b806340d097c3116101bc57806355f804b31161018057806355f804b3146104b857806359be30ec146104e1578063631f98521461050a5780636352211e1461053557806370a08231146105725761023b565b806340d097c3146103d357806342842e0e146103fc57806349b71b45146104255780634a1530f8146104505780634f64b2be146104795761023b565b806323b872dd1161020357806323b872dd1461032a5780632a396a67146103535780633ccfd60b1461037c5780633d103951146103935780633fb27b85146103bc5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e55780631bee16181461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613157565b610921565b6040516102749190613971565b60405180910390f35b34801561028957600080fd5b50610292610a03565b60405161029f919061398c565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613247565b610a95565b6040516102dc919061388c565b60405180910390f35b3480156102f157600080fd5b5061030c600480360381019061030791906130ea565b610b1a565b005b610328600480360381019061032391906131b1565b610c32565b005b34801561033657600080fd5b50610351600480360381019061034c9190612fd4565b610ea6565b005b34801561035f57600080fd5b5061037a600480360381019061037591906132d4565b610f06565b005b34801561038857600080fd5b50610391610ffc565b005b34801561039f57600080fd5b506103ba60048036038101906103b59190613247565b6110c1565b005b3480156103c857600080fd5b506103d1611147565b005b3480156103df57600080fd5b506103fa60048036038101906103f59190612f67565b6111e0565b005b34801561040857600080fd5b50610423600480360381019061041e9190612fd4565b6112d2565b005b34801561043157600080fd5b5061043a6112f2565b6040516104479190613cae565b60405180910390f35b34801561045c57600080fd5b5061047760048036038101906104729190613274565b6112f8565b005b34801561048557600080fd5b506104a0600480360381019061049b9190613247565b6113e3565b6040516104af93929190613cc9565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da91906131fe565b61151d565b005b3480156104ed57600080fd5b5061050860048036038101906105039190613247565b6115b3565b005b34801561051657600080fd5b5061051f611639565b60405161052c9190613971565b60405180910390f35b34801561054157600080fd5b5061055c60048036038101906105579190613247565b61164c565b604051610569919061388c565b60405180910390f35b34801561057e57600080fd5b5061059960048036038101906105949190612f67565b6116fe565b6040516105a69190613cae565b60405180910390f35b3480156105bb57600080fd5b506105c46117b6565b005b3480156105d257600080fd5b506105ed60048036038101906105e89190613247565b61183e565b6040516105fc93929190613933565b60405180910390f35b34801561061157600080fd5b5061062c60048036038101906106279190613247565b611910565b005b34801561063a57600080fd5b50610643611996565b6040516106509190613cae565b60405180910390f35b34801561066557600080fd5b5061066e61199c565b60405161067b919061388c565b60405180910390f35b34801561069057600080fd5b506106996119c6565b6040516106a6919061398c565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d191906130aa565b611a58565b005b3480156106e457600080fd5b506106ff60048036038101906106fa9190613027565b611a6e565b005b34801561070d57600080fd5b50610716611ad0565b6040516107239190613cae565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e9190613247565b611ad6565b604051610760919061398c565b60405180910390f35b34801561077557600080fd5b5061077e611b7e565b60405161078b9190613cae565b60405180910390f35b3480156107a057600080fd5b506107a9611b84565b6040516107b69190613cae565b60405180910390f35b3480156107cb57600080fd5b506107e660048036038101906107e1919061312a565b611b8a565b005b3480156107f457600080fd5b5061080f600480360381019061080a9190613330565b611c23565b005b34801561081d57600080fd5b50610826611d31565b6040516108339190613cae565b60405180910390f35b34801561084857600080fd5b50610863600480360381019061085e9190612f94565b611d6d565b6040516108709190613971565b60405180910390f35b34801561088557600080fd5b506108a0600480360381019061089b9190612f67565b611e01565b005b3480156108ae57600080fd5b506108b7611ef9565b6040516108c49190613cae565b60405180910390f35b3480156108d957600080fd5b506108e2611eff565b6040516108ef9190613971565b60405180910390f35b34801561090457600080fd5b5061091f600480360381019061091a9190613247565b611f12565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ec57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109fc57506109fb82611f98565b5b9050919050565b606060008054610a1290613f88565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3e90613f88565b8015610a8b5780601f10610a6057610100808354040283529160200191610a8b565b820191906000526020600020905b815481529060010190602001808311610a6e57829003601f168201915b5050505050905090565b6000610aa082612002565b610adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad690613b8e565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b258261164c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8d90613c0e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bb561206e565b73ffffffffffffffffffffffffffffffffffffffff161480610be45750610be381610bde61206e565b611d6d565b5b610c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1a90613b0e565b60405180910390fd5b610c2d8383612076565b505050565b600d54341015610c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6e90613bce565b60405180910390fd5b60011515600c60009054906101000a900460ff16151514610ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc490613c6e565b60405180910390fd5b6000600a5411610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0990613c8e565b60405180910390fd5b600b5460085442610d239190613e74565b11610d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a90613aee565b60405180910390fd5b600e548282905010610daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da190613a4e565b60405180910390fd5b426008819055503360116000600954815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506008546011600060095481526020019081526020016000206001018190555060096000815480929190610e3a90613feb565b9190505550600a6000815480929190610e5290613f5e565b91905055507fdc6e76f97d4f15c462881cdfdeb427927289b902dcfa73b79be8933b9156699f3383836001600954610e8a9190613e74565b604051610e9a94939291906138f3565b60405180910390a15050565b610eb7610eb161206e565b8261212f565b610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed90613c4e565b60405180910390fd5b610f0183838361220d565b505050565b610f0e61206e565b73ffffffffffffffffffffffffffffffffffffffff16610f2c61199c565b73ffffffffffffffffffffffffffffffffffffffff1614610f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7990613bae565b60405180910390fd5b610f8c6010612474565b8210610fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc4906139ae565b60405180910390fd5b80601260008481526020019081526020016000206002019080519060200190610ff7929190612c9f565b505050565b61100461206e565b73ffffffffffffffffffffffffffffffffffffffff1661102261199c565b73ffffffffffffffffffffffffffffffffffffffff1614611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f90613bae565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156110be573d6000803e3d6000fd5b50565b6110c961206e565b73ffffffffffffffffffffffffffffffffffffffff166110e761199c565b73ffffffffffffffffffffffffffffffffffffffff161461113d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113490613bae565b60405180910390fd5b80600d8190555050565b61114f61206e565b73ffffffffffffffffffffffffffffffffffffffff1661116d61199c565b73ffffffffffffffffffffffffffffffffffffffff16146111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba90613bae565b60405180910390fd5b6001600f60006101000a81548160ff021916908315150217905550565b6111e861206e565b73ffffffffffffffffffffffffffffffffffffffff1661120661199c565b73ffffffffffffffffffffffffffffffffffffffff161461125c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125390613bae565b60405180910390fd5b600f60009054906101000a900460ff16156112ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a390613a6e565b60405180910390fd5b60006112b86010612474565b90506112c46010612482565b6112ce8282612498565b5050565b6112ed83838360405180602001604052806000815250611a6e565b505050565b600d5481565b61130061206e565b73ffffffffffffffffffffffffffffffffffffffff1661131e61199c565b73ffffffffffffffffffffffffffffffffffffffff1614611374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136b90613bae565b60405180910390fd5b60095483106113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af90613c2e565b60405180910390fd5b81816011600086815260200190815260200160002060020191906113dd929190612d25565b50505050565b601260205280600052604060002060009150905080600001549080600101805461140c90613f88565b80601f016020809104026020016040519081016040528092919081815260200182805461143890613f88565b80156114855780601f1061145a57610100808354040283529160200191611485565b820191906000526020600020905b81548152906001019060200180831161146857829003601f168201915b50505050509080600201805461149a90613f88565b80601f01602080910402602001604051908101604052809291908181526020018280546114c690613f88565b80156115135780601f106114e857610100808354040283529160200191611513565b820191906000526020600020905b8154815290600101906020018083116114f657829003601f168201915b5050505050905083565b61152561206e565b73ffffffffffffffffffffffffffffffffffffffff1661154361199c565b73ffffffffffffffffffffffffffffffffffffffff1614611599576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159090613bae565b60405180910390fd5b80600290805190602001906115af929190612c9f565b5050565b6115bb61206e565b73ffffffffffffffffffffffffffffffffffffffff166115d961199c565b73ffffffffffffffffffffffffffffffffffffffff161461162f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162690613bae565b60405180910390fd5b80600b8190555050565b600f60009054906101000a900460ff1681565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90613b4e565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690613b2e565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117be61206e565b73ffffffffffffffffffffffffffffffffffffffff166117dc61199c565b73ffffffffffffffffffffffffffffffffffffffff1614611832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182990613bae565b60405180910390fd5b61183c60006124b6565b565b60116020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201805461188d90613f88565b80601f01602080910402602001604051908101604052809291908181526020018280546118b990613f88565b80156119065780601f106118db57610100808354040283529160200191611906565b820191906000526020600020905b8154815290600101906020018083116118e957829003601f168201915b5050505050905083565b61191861206e565b73ffffffffffffffffffffffffffffffffffffffff1661193661199c565b73ffffffffffffffffffffffffffffffffffffffff161461198c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198390613bae565b60405180910390fd5b80600a8190555050565b600b5481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546119d590613f88565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0190613f88565b8015611a4e5780601f10611a2357610100808354040283529160200191611a4e565b820191906000526020600020905b815481529060010190602001808311611a3157829003601f168201915b5050505050905090565b611a6a611a6361206e565b838361257c565b5050565b611a7f611a7961206e565b8361212f565b611abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab590613c4e565b60405180910390fd5b611aca848484846126e9565b50505050565b60095481565b6060611ae182612002565b611b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1790613bee565b60405180910390fd5b600060028054611b2f90613f88565b905011611b4b5760405180602001604052806000815250611b77565b6002611b5683612745565b604051602001611b67929190613868565b6040516020818303038152906040525b9050919050565b60085481565b600a5481565b611b9261206e565b73ffffffffffffffffffffffffffffffffffffffff16611bb061199c565b73ffffffffffffffffffffffffffffffffffffffff1614611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd90613bae565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b611c2b61206e565b73ffffffffffffffffffffffffffffffffffffffff16611c4961199c565b73ffffffffffffffffffffffffffffffffffffffff1614611c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9690613bae565b60405180910390fd5b611ca96010612474565b8410611cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce1906139ae565b60405180910390fd5b8260126000868152602001908152602001600020600001819055508181601260008781526020019081526020016000206001019190611d2a929190612d25565b5050505050565b60008060085442611d429190613e74565b9050600b54811115611d58576000915050611d6a565b80600b54611d669190613e74565b9150505b90565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e0961206e565b73ffffffffffffffffffffffffffffffffffffffff16611e2761199c565b73ffffffffffffffffffffffffffffffffffffffff1614611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490613bae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee4906139ee565b60405180910390fd5b611ef6816124b6565b50565b600e5481565b600c60009054906101000a900460ff1681565b611f1a61206e565b73ffffffffffffffffffffffffffffffffffffffff16611f3861199c565b73ffffffffffffffffffffffffffffffffffffffff1614611f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8590613bae565b60405180910390fd5b80600e8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120e98361164c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061213a82612002565b612179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217090613ace565b60405180910390fd5b60006121848361164c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121f357508373ffffffffffffffffffffffffffffffffffffffff166121db84610a95565b73ffffffffffffffffffffffffffffffffffffffff16145b8061220457506122038185611d6d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661222d8261164c565b73ffffffffffffffffffffffffffffffffffffffff1614612283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227a90613a0e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ea90613a8e565b60405180910390fd5b6122fe8383836128a6565b612309600082612076565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123599190613e74565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123b09190613ded565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461246f8383836128ab565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6124b28282604051806020016040528060008152506128b0565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e290613aae565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126dc9190613971565b60405180910390a3505050565b6126f484848461220d565b6127008484848461290b565b61273f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612736906139ce565b60405180910390fd5b50505050565b6060600082141561278d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128a1565b600082905060005b600082146127bf5780806127a890613feb565b915050600a826127b89190613e43565b9150612795565b60008167ffffffffffffffff8111156127db576127da614121565b5b6040519080825280601f01601f19166020018201604052801561280d5781602001600182028036833780820191505090505b5090505b6000851461289a576001826128269190613e74565b9150600a856128359190614034565b60306128419190613ded565b60f81b818381518110612857576128566140f2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128939190613e43565b9450612811565b8093505050505b919050565b505050565b505050565b6128ba8383612aa2565b6128c7600084848461290b565b612906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128fd906139ce565b60405180910390fd5b505050565b600061292c8473ffffffffffffffffffffffffffffffffffffffff16612c7c565b15612a95578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261295561206e565b8786866040518563ffffffff1660e01b815260040161297794939291906138a7565b602060405180830381600087803b15801561299157600080fd5b505af19250505080156129c257506040513d601f19601f820116820180604052508101906129bf9190613184565b60015b612a45573d80600081146129f2576040519150601f19603f3d011682016040523d82523d6000602084013e6129f7565b606091505b50600081511415612a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a34906139ce565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a9a565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0990613b6e565b60405180910390fd5b612b1b81612002565b15612b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5290613a2e565b60405180910390fd5b612b67600083836128a6565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bb79190613ded565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c78600083836128ab565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612cab90613f88565b90600052602060002090601f016020900481019282612ccd5760008555612d14565b82601f10612ce657805160ff1916838001178555612d14565b82800160010185558215612d14579182015b82811115612d13578251825591602001919060010190612cf8565b5b509050612d219190612dab565b5090565b828054612d3190613f88565b90600052602060002090601f016020900481019282612d535760008555612d9a565b82601f10612d6c57803560ff1916838001178555612d9a565b82800160010185558215612d9a579182015b82811115612d99578235825591602001919060010190612d7e565b5b509050612da79190612dab565b5090565b5b80821115612dc4576000816000905550600101612dac565b5090565b6000612ddb612dd684613d33565b613d0e565b905082815260208101848484011115612df757612df661415f565b5b612e02848285613f1c565b509392505050565b6000612e1d612e1884613d64565b613d0e565b905082815260208101848484011115612e3957612e3861415f565b5b612e44848285613f1c565b509392505050565b600081359050612e5b81614791565b92915050565b600081359050612e70816147a8565b92915050565b600081359050612e85816147bf565b92915050565b600081519050612e9a816147bf565b92915050565b600082601f830112612eb557612eb4614155565b5b8135612ec5848260208601612dc8565b91505092915050565b60008083601f840112612ee457612ee3614155565b5b8235905067ffffffffffffffff811115612f0157612f00614150565b5b602083019150836001820283011115612f1d57612f1c61415a565b5b9250929050565b600082601f830112612f3957612f38614155565b5b8135612f49848260208601612e0a565b91505092915050565b600081359050612f61816147d6565b92915050565b600060208284031215612f7d57612f7c614169565b5b6000612f8b84828501612e4c565b91505092915050565b60008060408385031215612fab57612faa614169565b5b6000612fb985828601612e4c565b9250506020612fca85828601612e4c565b9150509250929050565b600080600060608486031215612fed57612fec614169565b5b6000612ffb86828701612e4c565b935050602061300c86828701612e4c565b925050604061301d86828701612f52565b9150509250925092565b6000806000806080858703121561304157613040614169565b5b600061304f87828801612e4c565b945050602061306087828801612e4c565b935050604061307187828801612f52565b925050606085013567ffffffffffffffff81111561309257613091614164565b5b61309e87828801612ea0565b91505092959194509250565b600080604083850312156130c1576130c0614169565b5b60006130cf85828601612e4c565b92505060206130e085828601612e61565b9150509250929050565b6000806040838503121561310157613100614169565b5b600061310f85828601612e4c565b925050602061312085828601612f52565b9150509250929050565b6000602082840312156131405761313f614169565b5b600061314e84828501612e61565b91505092915050565b60006020828403121561316d5761316c614169565b5b600061317b84828501612e76565b91505092915050565b60006020828403121561319a57613199614169565b5b60006131a884828501612e8b565b91505092915050565b600080602083850312156131c8576131c7614169565b5b600083013567ffffffffffffffff8111156131e6576131e5614164565b5b6131f285828601612ece565b92509250509250929050565b60006020828403121561321457613213614169565b5b600082013567ffffffffffffffff81111561323257613231614164565b5b61323e84828501612f24565b91505092915050565b60006020828403121561325d5761325c614169565b5b600061326b84828501612f52565b91505092915050565b60008060006040848603121561328d5761328c614169565b5b600061329b86828701612f52565b935050602084013567ffffffffffffffff8111156132bc576132bb614164565b5b6132c886828701612ece565b92509250509250925092565b600080604083850312156132eb576132ea614169565b5b60006132f985828601612f52565b925050602083013567ffffffffffffffff81111561331a57613319614164565b5b61332685828601612f24565b9150509250929050565b6000806000806060858703121561334a57613349614169565b5b600061335887828801612f52565b945050602061336987828801612f52565b935050604085013567ffffffffffffffff81111561338a57613389614164565b5b61339687828801612ece565b925092505092959194509250565b6133ad81613ea8565b82525050565b6133bc81613eba565b82525050565b60006133cd82613daa565b6133d78185613dc0565b93506133e7818560208601613f2b565b6133f08161416e565b840191505092915050565b60006134078385613dd1565b9350613414838584613f1c565b61341d8361416e565b840190509392505050565b600061343382613db5565b61343d8185613dd1565b935061344d818560208601613f2b565b6134568161416e565b840191505092915050565b600061346c82613db5565b6134768185613de2565b9350613486818560208601613f2b565b80840191505092915050565b6000815461349f81613f88565b6134a98186613de2565b945060018216600081146134c457600181146134d557613508565b60ff19831686528186019350613508565b6134de85613d95565b60005b83811015613500578154818901526001820191506020810190506134e1565b838801955050505b50505092915050565b600061351e601583613dd1565b91506135298261417f565b602082019050919050565b6000613541603283613dd1565b915061354c826141a8565b604082019050919050565b6000613564602683613dd1565b915061356f826141f7565b604082019050919050565b6000613587602583613dd1565b915061359282614246565b604082019050919050565b60006135aa601c83613dd1565b91506135b582614295565b602082019050919050565b60006135cd601083613dd1565b91506135d8826142be565b602082019050919050565b60006135f0600f83613dd1565b91506135fb826142e7565b602082019050919050565b6000613613602483613dd1565b915061361e82614310565b604082019050919050565b6000613636601983613dd1565b91506136418261435f565b602082019050919050565b6000613659602c83613dd1565b915061366482614388565b604082019050919050565b600061367c603e83613dd1565b9150613687826143d7565b604082019050919050565b600061369f603883613dd1565b91506136aa82614426565b604082019050919050565b60006136c2602a83613dd1565b91506136cd82614475565b604082019050919050565b60006136e5602983613dd1565b91506136f0826144c4565b604082019050919050565b6000613708602083613dd1565b915061371382614513565b602082019050919050565b600061372b602c83613dd1565b91506137368261453c565b604082019050919050565b600061374e602083613dd1565b91506137598261458b565b602082019050919050565b6000613771601c83613dd1565b915061377c826145b4565b602082019050919050565b6000613794602f83613dd1565b915061379f826145dd565b604082019050919050565b60006137b7602183613dd1565b91506137c28261462c565b604082019050919050565b60006137da601883613dd1565b91506137e58261467b565b602082019050919050565b60006137fd603183613dd1565b9150613808826146a4565b604082019050919050565b6000613820602783613dd1565b915061382b826146f3565b604082019050919050565b6000613843602c83613dd1565b915061384e82614742565b604082019050919050565b61386281613f12565b82525050565b60006138748285613492565b91506138808284613461565b91508190509392505050565b60006020820190506138a160008301846133a4565b92915050565b60006080820190506138bc60008301876133a4565b6138c960208301866133a4565b6138d66040830185613859565b81810360608301526138e881846133c2565b905095945050505050565b600060608201905061390860008301876133a4565b818103602083015261391b8185876133fb565b905061392a6040830184613859565b95945050505050565b600060608201905061394860008301866133a4565b6139556020830185613859565b81810360408301526139678184613428565b9050949350505050565b600060208201905061398660008301846133b3565b92915050565b600060208201905081810360008301526139a68184613428565b905092915050565b600060208201905081810360008301526139c781613511565b9050919050565b600060208201905081810360008301526139e781613534565b9050919050565b60006020820190508181036000830152613a0781613557565b9050919050565b60006020820190508181036000830152613a278161357a565b9050919050565b60006020820190508181036000830152613a478161359d565b9050919050565b60006020820190508181036000830152613a67816135c0565b9050919050565b60006020820190508181036000830152613a87816135e3565b9050919050565b60006020820190508181036000830152613aa781613606565b9050919050565b60006020820190508181036000830152613ac781613629565b9050919050565b60006020820190508181036000830152613ae78161364c565b9050919050565b60006020820190508181036000830152613b078161366f565b9050919050565b60006020820190508181036000830152613b2781613692565b9050919050565b60006020820190508181036000830152613b47816136b5565b9050919050565b60006020820190508181036000830152613b67816136d8565b9050919050565b60006020820190508181036000830152613b87816136fb565b9050919050565b60006020820190508181036000830152613ba78161371e565b9050919050565b60006020820190508181036000830152613bc781613741565b9050919050565b60006020820190508181036000830152613be781613764565b9050919050565b60006020820190508181036000830152613c0781613787565b9050919050565b60006020820190508181036000830152613c27816137aa565b9050919050565b60006020820190508181036000830152613c47816137cd565b9050919050565b60006020820190508181036000830152613c67816137f0565b9050919050565b60006020820190508181036000830152613c8781613813565b9050919050565b60006020820190508181036000830152613ca781613836565b9050919050565b6000602082019050613cc36000830184613859565b92915050565b6000606082019050613cde6000830186613859565b8181036020830152613cf08185613428565b90508181036040830152613d048184613428565b9050949350505050565b6000613d18613d29565b9050613d248282613fba565b919050565b6000604051905090565b600067ffffffffffffffff821115613d4e57613d4d614121565b5b613d578261416e565b9050602081019050919050565b600067ffffffffffffffff821115613d7f57613d7e614121565b5b613d888261416e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613df882613f12565b9150613e0383613f12565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e3857613e37614065565b5b828201905092915050565b6000613e4e82613f12565b9150613e5983613f12565b925082613e6957613e68614094565b5b828204905092915050565b6000613e7f82613f12565b9150613e8a83613f12565b925082821015613e9d57613e9c614065565b5b828203905092915050565b6000613eb382613ef2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613f49578082015181840152602081019050613f2e565b83811115613f58576000848401525b50505050565b6000613f6982613f12565b91506000821415613f7d57613f7c614065565b5b600182039050919050565b60006002820490506001821680613fa057607f821691505b60208210811415613fb457613fb36140c3565b5b50919050565b613fc38261416e565b810181811067ffffffffffffffff82111715613fe257613fe1614121565b5b80604052505050565b6000613ff682613f12565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561402957614028614065565b5b600182019050919050565b600061403f82613f12565b915061404a83613f12565b92508261405a57614059614094565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f546f6b656e4944206f7574206f662072616e67652e0000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d65737361676520746f6f206c6f6e6700000000000000000000000000000000600082015250565b7f636f6e7472616374207365616c65640000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f42757379207369676e616c2e2057616974205b63616c6c526174654c696d697460008201527f5d207365636f6e6473206265666f72652063616c6c696e67206261636b2e0000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d7573742073656e64205b6469616c436f73745d20746f206469616c00000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4469616c20496e646578206f7574206f662072616e67652e0000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f506c656173652063616c6c206261636b20647572696e6720627573696e65737360008201527f20686f7572732e00000000000000000000000000000000000000000000000000602082015250565b7f4f7264657220626f6f6b2069732066756c6c20666f72206e6f772e2043616c6c60008201527f206261636b206c617465722e0000000000000000000000000000000000000000602082015250565b61479a81613ea8565b81146147a557600080fd5b50565b6147b181613eba565b81146147bc57600080fd5b50565b6147c881613ec6565b81146147d357600080fd5b50565b6147df81613f12565b81146147ea57600080fd5b5056fea264697066735822122031a1f8286c163270dfe0075bf1da697b030831f4a092fceb714c5c16ce3ea4e764736f6c63430008070033
Deployed Bytecode
0x60806040526004361061023b5760003560e01c8063715018a61161012e578063c97efd0b116100ab578063e985e9c51161006f578063e985e9c51461083c578063f2fde38b14610879578063f42231f8146108a2578063f789d0b6146108cd578063fa63ca25146108f85761023b565b8063c97efd0b14610769578063d010028514610794578063d189db97146107bf578063d6ec4c61146107e8578063e3cfef60146108115761023b565b806395d89b41116100f257806395d89b4114610684578063a22cb465146106af578063b88d4fde146106d8578063c62ef37414610701578063c87b56dd1461072c5761023b565b8063715018a6146105af578063786c8adb146105c65780637a3c371014610605578063859912d81461062e5780638da5cb5b146106595761023b565b806340d097c3116101bc57806355f804b31161018057806355f804b3146104b857806359be30ec146104e1578063631f98521461050a5780636352211e1461053557806370a08231146105725761023b565b806340d097c3146103d357806342842e0e146103fc57806349b71b45146104255780634a1530f8146104505780634f64b2be146104795761023b565b806323b872dd1161020357806323b872dd1461032a5780632a396a67146103535780633ccfd60b1461037c5780633d103951146103935780633fb27b85146103bc5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e55780631bee16181461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613157565b610921565b6040516102749190613971565b60405180910390f35b34801561028957600080fd5b50610292610a03565b60405161029f919061398c565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613247565b610a95565b6040516102dc919061388c565b60405180910390f35b3480156102f157600080fd5b5061030c600480360381019061030791906130ea565b610b1a565b005b610328600480360381019061032391906131b1565b610c32565b005b34801561033657600080fd5b50610351600480360381019061034c9190612fd4565b610ea6565b005b34801561035f57600080fd5b5061037a600480360381019061037591906132d4565b610f06565b005b34801561038857600080fd5b50610391610ffc565b005b34801561039f57600080fd5b506103ba60048036038101906103b59190613247565b6110c1565b005b3480156103c857600080fd5b506103d1611147565b005b3480156103df57600080fd5b506103fa60048036038101906103f59190612f67565b6111e0565b005b34801561040857600080fd5b50610423600480360381019061041e9190612fd4565b6112d2565b005b34801561043157600080fd5b5061043a6112f2565b6040516104479190613cae565b60405180910390f35b34801561045c57600080fd5b5061047760048036038101906104729190613274565b6112f8565b005b34801561048557600080fd5b506104a0600480360381019061049b9190613247565b6113e3565b6040516104af93929190613cc9565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da91906131fe565b61151d565b005b3480156104ed57600080fd5b5061050860048036038101906105039190613247565b6115b3565b005b34801561051657600080fd5b5061051f611639565b60405161052c9190613971565b60405180910390f35b34801561054157600080fd5b5061055c60048036038101906105579190613247565b61164c565b604051610569919061388c565b60405180910390f35b34801561057e57600080fd5b5061059960048036038101906105949190612f67565b6116fe565b6040516105a69190613cae565b60405180910390f35b3480156105bb57600080fd5b506105c46117b6565b005b3480156105d257600080fd5b506105ed60048036038101906105e89190613247565b61183e565b6040516105fc93929190613933565b60405180910390f35b34801561061157600080fd5b5061062c60048036038101906106279190613247565b611910565b005b34801561063a57600080fd5b50610643611996565b6040516106509190613cae565b60405180910390f35b34801561066557600080fd5b5061066e61199c565b60405161067b919061388c565b60405180910390f35b34801561069057600080fd5b506106996119c6565b6040516106a6919061398c565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d191906130aa565b611a58565b005b3480156106e457600080fd5b506106ff60048036038101906106fa9190613027565b611a6e565b005b34801561070d57600080fd5b50610716611ad0565b6040516107239190613cae565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e9190613247565b611ad6565b604051610760919061398c565b60405180910390f35b34801561077557600080fd5b5061077e611b7e565b60405161078b9190613cae565b60405180910390f35b3480156107a057600080fd5b506107a9611b84565b6040516107b69190613cae565b60405180910390f35b3480156107cb57600080fd5b506107e660048036038101906107e1919061312a565b611b8a565b005b3480156107f457600080fd5b5061080f600480360381019061080a9190613330565b611c23565b005b34801561081d57600080fd5b50610826611d31565b6040516108339190613cae565b60405180910390f35b34801561084857600080fd5b50610863600480360381019061085e9190612f94565b611d6d565b6040516108709190613971565b60405180910390f35b34801561088557600080fd5b506108a0600480360381019061089b9190612f67565b611e01565b005b3480156108ae57600080fd5b506108b7611ef9565b6040516108c49190613cae565b60405180910390f35b3480156108d957600080fd5b506108e2611eff565b6040516108ef9190613971565b60405180910390f35b34801561090457600080fd5b5061091f600480360381019061091a9190613247565b611f12565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ec57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109fc57506109fb82611f98565b5b9050919050565b606060008054610a1290613f88565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3e90613f88565b8015610a8b5780601f10610a6057610100808354040283529160200191610a8b565b820191906000526020600020905b815481529060010190602001808311610a6e57829003601f168201915b5050505050905090565b6000610aa082612002565b610adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad690613b8e565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b258261164c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8d90613c0e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bb561206e565b73ffffffffffffffffffffffffffffffffffffffff161480610be45750610be381610bde61206e565b611d6d565b5b610c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1a90613b0e565b60405180910390fd5b610c2d8383612076565b505050565b600d54341015610c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6e90613bce565b60405180910390fd5b60011515600c60009054906101000a900460ff16151514610ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc490613c6e565b60405180910390fd5b6000600a5411610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0990613c8e565b60405180910390fd5b600b5460085442610d239190613e74565b11610d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a90613aee565b60405180910390fd5b600e548282905010610daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da190613a4e565b60405180910390fd5b426008819055503360116000600954815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506008546011600060095481526020019081526020016000206001018190555060096000815480929190610e3a90613feb565b9190505550600a6000815480929190610e5290613f5e565b91905055507fdc6e76f97d4f15c462881cdfdeb427927289b902dcfa73b79be8933b9156699f3383836001600954610e8a9190613e74565b604051610e9a94939291906138f3565b60405180910390a15050565b610eb7610eb161206e565b8261212f565b610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed90613c4e565b60405180910390fd5b610f0183838361220d565b505050565b610f0e61206e565b73ffffffffffffffffffffffffffffffffffffffff16610f2c61199c565b73ffffffffffffffffffffffffffffffffffffffff1614610f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7990613bae565b60405180910390fd5b610f8c6010612474565b8210610fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc4906139ae565b60405180910390fd5b80601260008481526020019081526020016000206002019080519060200190610ff7929190612c9f565b505050565b61100461206e565b73ffffffffffffffffffffffffffffffffffffffff1661102261199c565b73ffffffffffffffffffffffffffffffffffffffff1614611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f90613bae565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156110be573d6000803e3d6000fd5b50565b6110c961206e565b73ffffffffffffffffffffffffffffffffffffffff166110e761199c565b73ffffffffffffffffffffffffffffffffffffffff161461113d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113490613bae565b60405180910390fd5b80600d8190555050565b61114f61206e565b73ffffffffffffffffffffffffffffffffffffffff1661116d61199c565b73ffffffffffffffffffffffffffffffffffffffff16146111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba90613bae565b60405180910390fd5b6001600f60006101000a81548160ff021916908315150217905550565b6111e861206e565b73ffffffffffffffffffffffffffffffffffffffff1661120661199c565b73ffffffffffffffffffffffffffffffffffffffff161461125c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125390613bae565b60405180910390fd5b600f60009054906101000a900460ff16156112ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a390613a6e565b60405180910390fd5b60006112b86010612474565b90506112c46010612482565b6112ce8282612498565b5050565b6112ed83838360405180602001604052806000815250611a6e565b505050565b600d5481565b61130061206e565b73ffffffffffffffffffffffffffffffffffffffff1661131e61199c565b73ffffffffffffffffffffffffffffffffffffffff1614611374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136b90613bae565b60405180910390fd5b60095483106113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af90613c2e565b60405180910390fd5b81816011600086815260200190815260200160002060020191906113dd929190612d25565b50505050565b601260205280600052604060002060009150905080600001549080600101805461140c90613f88565b80601f016020809104026020016040519081016040528092919081815260200182805461143890613f88565b80156114855780601f1061145a57610100808354040283529160200191611485565b820191906000526020600020905b81548152906001019060200180831161146857829003601f168201915b50505050509080600201805461149a90613f88565b80601f01602080910402602001604051908101604052809291908181526020018280546114c690613f88565b80156115135780601f106114e857610100808354040283529160200191611513565b820191906000526020600020905b8154815290600101906020018083116114f657829003601f168201915b5050505050905083565b61152561206e565b73ffffffffffffffffffffffffffffffffffffffff1661154361199c565b73ffffffffffffffffffffffffffffffffffffffff1614611599576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159090613bae565b60405180910390fd5b80600290805190602001906115af929190612c9f565b5050565b6115bb61206e565b73ffffffffffffffffffffffffffffffffffffffff166115d961199c565b73ffffffffffffffffffffffffffffffffffffffff161461162f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162690613bae565b60405180910390fd5b80600b8190555050565b600f60009054906101000a900460ff1681565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90613b4e565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690613b2e565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117be61206e565b73ffffffffffffffffffffffffffffffffffffffff166117dc61199c565b73ffffffffffffffffffffffffffffffffffffffff1614611832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182990613bae565b60405180910390fd5b61183c60006124b6565b565b60116020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201805461188d90613f88565b80601f01602080910402602001604051908101604052809291908181526020018280546118b990613f88565b80156119065780601f106118db57610100808354040283529160200191611906565b820191906000526020600020905b8154815290600101906020018083116118e957829003601f168201915b5050505050905083565b61191861206e565b73ffffffffffffffffffffffffffffffffffffffff1661193661199c565b73ffffffffffffffffffffffffffffffffffffffff161461198c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198390613bae565b60405180910390fd5b80600a8190555050565b600b5481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546119d590613f88565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0190613f88565b8015611a4e5780601f10611a2357610100808354040283529160200191611a4e565b820191906000526020600020905b815481529060010190602001808311611a3157829003601f168201915b5050505050905090565b611a6a611a6361206e565b838361257c565b5050565b611a7f611a7961206e565b8361212f565b611abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab590613c4e565b60405180910390fd5b611aca848484846126e9565b50505050565b60095481565b6060611ae182612002565b611b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1790613bee565b60405180910390fd5b600060028054611b2f90613f88565b905011611b4b5760405180602001604052806000815250611b77565b6002611b5683612745565b604051602001611b67929190613868565b6040516020818303038152906040525b9050919050565b60085481565b600a5481565b611b9261206e565b73ffffffffffffffffffffffffffffffffffffffff16611bb061199c565b73ffffffffffffffffffffffffffffffffffffffff1614611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd90613bae565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b611c2b61206e565b73ffffffffffffffffffffffffffffffffffffffff16611c4961199c565b73ffffffffffffffffffffffffffffffffffffffff1614611c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9690613bae565b60405180910390fd5b611ca96010612474565b8410611cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce1906139ae565b60405180910390fd5b8260126000868152602001908152602001600020600001819055508181601260008781526020019081526020016000206001019190611d2a929190612d25565b5050505050565b60008060085442611d429190613e74565b9050600b54811115611d58576000915050611d6a565b80600b54611d669190613e74565b9150505b90565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e0961206e565b73ffffffffffffffffffffffffffffffffffffffff16611e2761199c565b73ffffffffffffffffffffffffffffffffffffffff1614611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490613bae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee4906139ee565b60405180910390fd5b611ef6816124b6565b50565b600e5481565b600c60009054906101000a900460ff1681565b611f1a61206e565b73ffffffffffffffffffffffffffffffffffffffff16611f3861199c565b73ffffffffffffffffffffffffffffffffffffffff1614611f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8590613bae565b60405180910390fd5b80600e8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120e98361164c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061213a82612002565b612179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217090613ace565b60405180910390fd5b60006121848361164c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121f357508373ffffffffffffffffffffffffffffffffffffffff166121db84610a95565b73ffffffffffffffffffffffffffffffffffffffff16145b8061220457506122038185611d6d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661222d8261164c565b73ffffffffffffffffffffffffffffffffffffffff1614612283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227a90613a0e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ea90613a8e565b60405180910390fd5b6122fe8383836128a6565b612309600082612076565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123599190613e74565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123b09190613ded565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461246f8383836128ab565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6124b28282604051806020016040528060008152506128b0565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e290613aae565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126dc9190613971565b60405180910390a3505050565b6126f484848461220d565b6127008484848461290b565b61273f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612736906139ce565b60405180910390fd5b50505050565b6060600082141561278d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128a1565b600082905060005b600082146127bf5780806127a890613feb565b915050600a826127b89190613e43565b9150612795565b60008167ffffffffffffffff8111156127db576127da614121565b5b6040519080825280601f01601f19166020018201604052801561280d5781602001600182028036833780820191505090505b5090505b6000851461289a576001826128269190613e74565b9150600a856128359190614034565b60306128419190613ded565b60f81b818381518110612857576128566140f2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128939190613e43565b9450612811565b8093505050505b919050565b505050565b505050565b6128ba8383612aa2565b6128c7600084848461290b565b612906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128fd906139ce565b60405180910390fd5b505050565b600061292c8473ffffffffffffffffffffffffffffffffffffffff16612c7c565b15612a95578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261295561206e565b8786866040518563ffffffff1660e01b815260040161297794939291906138a7565b602060405180830381600087803b15801561299157600080fd5b505af19250505080156129c257506040513d601f19601f820116820180604052508101906129bf9190613184565b60015b612a45573d80600081146129f2576040519150601f19603f3d011682016040523d82523d6000602084013e6129f7565b606091505b50600081511415612a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a34906139ce565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a9a565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0990613b6e565b60405180910390fd5b612b1b81612002565b15612b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5290613a2e565b60405180910390fd5b612b67600083836128a6565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bb79190613ded565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c78600083836128ab565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612cab90613f88565b90600052602060002090601f016020900481019282612ccd5760008555612d14565b82601f10612ce657805160ff1916838001178555612d14565b82800160010185558215612d14579182015b82811115612d13578251825591602001919060010190612cf8565b5b509050612d219190612dab565b5090565b828054612d3190613f88565b90600052602060002090601f016020900481019282612d535760008555612d9a565b82601f10612d6c57803560ff1916838001178555612d9a565b82800160010185558215612d9a579182015b82811115612d99578235825591602001919060010190612d7e565b5b509050612da79190612dab565b5090565b5b80821115612dc4576000816000905550600101612dac565b5090565b6000612ddb612dd684613d33565b613d0e565b905082815260208101848484011115612df757612df661415f565b5b612e02848285613f1c565b509392505050565b6000612e1d612e1884613d64565b613d0e565b905082815260208101848484011115612e3957612e3861415f565b5b612e44848285613f1c565b509392505050565b600081359050612e5b81614791565b92915050565b600081359050612e70816147a8565b92915050565b600081359050612e85816147bf565b92915050565b600081519050612e9a816147bf565b92915050565b600082601f830112612eb557612eb4614155565b5b8135612ec5848260208601612dc8565b91505092915050565b60008083601f840112612ee457612ee3614155565b5b8235905067ffffffffffffffff811115612f0157612f00614150565b5b602083019150836001820283011115612f1d57612f1c61415a565b5b9250929050565b600082601f830112612f3957612f38614155565b5b8135612f49848260208601612e0a565b91505092915050565b600081359050612f61816147d6565b92915050565b600060208284031215612f7d57612f7c614169565b5b6000612f8b84828501612e4c565b91505092915050565b60008060408385031215612fab57612faa614169565b5b6000612fb985828601612e4c565b9250506020612fca85828601612e4c565b9150509250929050565b600080600060608486031215612fed57612fec614169565b5b6000612ffb86828701612e4c565b935050602061300c86828701612e4c565b925050604061301d86828701612f52565b9150509250925092565b6000806000806080858703121561304157613040614169565b5b600061304f87828801612e4c565b945050602061306087828801612e4c565b935050604061307187828801612f52565b925050606085013567ffffffffffffffff81111561309257613091614164565b5b61309e87828801612ea0565b91505092959194509250565b600080604083850312156130c1576130c0614169565b5b60006130cf85828601612e4c565b92505060206130e085828601612e61565b9150509250929050565b6000806040838503121561310157613100614169565b5b600061310f85828601612e4c565b925050602061312085828601612f52565b9150509250929050565b6000602082840312156131405761313f614169565b5b600061314e84828501612e61565b91505092915050565b60006020828403121561316d5761316c614169565b5b600061317b84828501612e76565b91505092915050565b60006020828403121561319a57613199614169565b5b60006131a884828501612e8b565b91505092915050565b600080602083850312156131c8576131c7614169565b5b600083013567ffffffffffffffff8111156131e6576131e5614164565b5b6131f285828601612ece565b92509250509250929050565b60006020828403121561321457613213614169565b5b600082013567ffffffffffffffff81111561323257613231614164565b5b61323e84828501612f24565b91505092915050565b60006020828403121561325d5761325c614169565b5b600061326b84828501612f52565b91505092915050565b60008060006040848603121561328d5761328c614169565b5b600061329b86828701612f52565b935050602084013567ffffffffffffffff8111156132bc576132bb614164565b5b6132c886828701612ece565b92509250509250925092565b600080604083850312156132eb576132ea614169565b5b60006132f985828601612f52565b925050602083013567ffffffffffffffff81111561331a57613319614164565b5b61332685828601612f24565b9150509250929050565b6000806000806060858703121561334a57613349614169565b5b600061335887828801612f52565b945050602061336987828801612f52565b935050604085013567ffffffffffffffff81111561338a57613389614164565b5b61339687828801612ece565b925092505092959194509250565b6133ad81613ea8565b82525050565b6133bc81613eba565b82525050565b60006133cd82613daa565b6133d78185613dc0565b93506133e7818560208601613f2b565b6133f08161416e565b840191505092915050565b60006134078385613dd1565b9350613414838584613f1c565b61341d8361416e565b840190509392505050565b600061343382613db5565b61343d8185613dd1565b935061344d818560208601613f2b565b6134568161416e565b840191505092915050565b600061346c82613db5565b6134768185613de2565b9350613486818560208601613f2b565b80840191505092915050565b6000815461349f81613f88565b6134a98186613de2565b945060018216600081146134c457600181146134d557613508565b60ff19831686528186019350613508565b6134de85613d95565b60005b83811015613500578154818901526001820191506020810190506134e1565b838801955050505b50505092915050565b600061351e601583613dd1565b91506135298261417f565b602082019050919050565b6000613541603283613dd1565b915061354c826141a8565b604082019050919050565b6000613564602683613dd1565b915061356f826141f7565b604082019050919050565b6000613587602583613dd1565b915061359282614246565b604082019050919050565b60006135aa601c83613dd1565b91506135b582614295565b602082019050919050565b60006135cd601083613dd1565b91506135d8826142be565b602082019050919050565b60006135f0600f83613dd1565b91506135fb826142e7565b602082019050919050565b6000613613602483613dd1565b915061361e82614310565b604082019050919050565b6000613636601983613dd1565b91506136418261435f565b602082019050919050565b6000613659602c83613dd1565b915061366482614388565b604082019050919050565b600061367c603e83613dd1565b9150613687826143d7565b604082019050919050565b600061369f603883613dd1565b91506136aa82614426565b604082019050919050565b60006136c2602a83613dd1565b91506136cd82614475565b604082019050919050565b60006136e5602983613dd1565b91506136f0826144c4565b604082019050919050565b6000613708602083613dd1565b915061371382614513565b602082019050919050565b600061372b602c83613dd1565b91506137368261453c565b604082019050919050565b600061374e602083613dd1565b91506137598261458b565b602082019050919050565b6000613771601c83613dd1565b915061377c826145b4565b602082019050919050565b6000613794602f83613dd1565b915061379f826145dd565b604082019050919050565b60006137b7602183613dd1565b91506137c28261462c565b604082019050919050565b60006137da601883613dd1565b91506137e58261467b565b602082019050919050565b60006137fd603183613dd1565b9150613808826146a4565b604082019050919050565b6000613820602783613dd1565b915061382b826146f3565b604082019050919050565b6000613843602c83613dd1565b915061384e82614742565b604082019050919050565b61386281613f12565b82525050565b60006138748285613492565b91506138808284613461565b91508190509392505050565b60006020820190506138a160008301846133a4565b92915050565b60006080820190506138bc60008301876133a4565b6138c960208301866133a4565b6138d66040830185613859565b81810360608301526138e881846133c2565b905095945050505050565b600060608201905061390860008301876133a4565b818103602083015261391b8185876133fb565b905061392a6040830184613859565b95945050505050565b600060608201905061394860008301866133a4565b6139556020830185613859565b81810360408301526139678184613428565b9050949350505050565b600060208201905061398660008301846133b3565b92915050565b600060208201905081810360008301526139a68184613428565b905092915050565b600060208201905081810360008301526139c781613511565b9050919050565b600060208201905081810360008301526139e781613534565b9050919050565b60006020820190508181036000830152613a0781613557565b9050919050565b60006020820190508181036000830152613a278161357a565b9050919050565b60006020820190508181036000830152613a478161359d565b9050919050565b60006020820190508181036000830152613a67816135c0565b9050919050565b60006020820190508181036000830152613a87816135e3565b9050919050565b60006020820190508181036000830152613aa781613606565b9050919050565b60006020820190508181036000830152613ac781613629565b9050919050565b60006020820190508181036000830152613ae78161364c565b9050919050565b60006020820190508181036000830152613b078161366f565b9050919050565b60006020820190508181036000830152613b2781613692565b9050919050565b60006020820190508181036000830152613b47816136b5565b9050919050565b60006020820190508181036000830152613b67816136d8565b9050919050565b60006020820190508181036000830152613b87816136fb565b9050919050565b60006020820190508181036000830152613ba78161371e565b9050919050565b60006020820190508181036000830152613bc781613741565b9050919050565b60006020820190508181036000830152613be781613764565b9050919050565b60006020820190508181036000830152613c0781613787565b9050919050565b60006020820190508181036000830152613c27816137aa565b9050919050565b60006020820190508181036000830152613c47816137cd565b9050919050565b60006020820190508181036000830152613c67816137f0565b9050919050565b60006020820190508181036000830152613c8781613813565b9050919050565b60006020820190508181036000830152613ca781613836565b9050919050565b6000602082019050613cc36000830184613859565b92915050565b6000606082019050613cde6000830186613859565b8181036020830152613cf08185613428565b90508181036040830152613d048184613428565b9050949350505050565b6000613d18613d29565b9050613d248282613fba565b919050565b6000604051905090565b600067ffffffffffffffff821115613d4e57613d4d614121565b5b613d578261416e565b9050602081019050919050565b600067ffffffffffffffff821115613d7f57613d7e614121565b5b613d888261416e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613df882613f12565b9150613e0383613f12565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e3857613e37614065565b5b828201905092915050565b6000613e4e82613f12565b9150613e5983613f12565b925082613e6957613e68614094565b5b828204905092915050565b6000613e7f82613f12565b9150613e8a83613f12565b925082821015613e9d57613e9c614065565b5b828203905092915050565b6000613eb382613ef2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613f49578082015181840152602081019050613f2e565b83811115613f58576000848401525b50505050565b6000613f6982613f12565b91506000821415613f7d57613f7c614065565b5b600182039050919050565b60006002820490506001821680613fa057607f821691505b60208210811415613fb457613fb36140c3565b5b50919050565b613fc38261416e565b810181811067ffffffffffffffff82111715613fe257613fe1614121565b5b80604052505050565b6000613ff682613f12565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561402957614028614065565b5b600182019050919050565b600061403f82613f12565b915061404a83613f12565b92508261405a57614059614094565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f546f6b656e4944206f7574206f662072616e67652e0000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d65737361676520746f6f206c6f6e6700000000000000000000000000000000600082015250565b7f636f6e7472616374207365616c65640000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f42757379207369676e616c2e2057616974205b63616c6c526174654c696d697460008201527f5d207365636f6e6473206265666f72652063616c6c696e67206261636b2e0000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d7573742073656e64205b6469616c436f73745d20746f206469616c00000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4469616c20496e646578206f7574206f662072616e67652e0000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f506c656173652063616c6c206261636b20647572696e6720627573696e65737360008201527f20686f7572732e00000000000000000000000000000000000000000000000000602082015250565b7f4f7264657220626f6f6b2069732066756c6c20666f72206e6f772e2043616c6c60008201527f206261636b206c617465722e0000000000000000000000000000000000000000602082015250565b61479a81613ea8565b81146147a557600080fd5b50565b6147b181613eba565b81146147bc57600080fd5b50565b6147c881613ec6565b81146147d357600080fd5b50565b6147df81613f12565b81146147ea57600080fd5b5056fea264697066735822122031a1f8286c163270dfe0075bf1da697b030831f4a092fceb714c5c16ce3ea4e764736f6c63430008070033
Deployed Bytecode Sourcemap
39754:4044:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26969:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27914:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29092:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28615:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40993:745;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29842:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42039:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43292:106;;;;;;;;;;;;;:::i;:::-;;42870:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43215:65;;;;;;;;;;;;;:::i;:::-;;43567:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30252:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40007:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42496:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40651:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;42687:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43471:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40133:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27608:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27338:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7515:103;;;;;;;;;;;;;:::i;:::-;;40600:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;43117:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39942:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6864:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28083:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29385:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30508:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39874:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28258:291;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39840:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39906:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42972:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42238:246;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41788:243;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29611:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7773:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40037:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39977:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42778:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26969:305;27071:4;27123:25;27108:40;;;:11;:40;;;;:105;;;;27180:33;27165:48;;;:11;:48;;;;27108:105;:158;;;;27230:36;27254:11;27230:23;:36::i;:::-;27108:158;27088:178;;26969:305;;;:::o;27914:100::-;27968:13;28001:5;27994:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27914:100;:::o;29092:221::-;29168:7;29196:16;29204:7;29196;:16::i;:::-;29188:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29281:15;:24;29297:7;29281:24;;;;;;;;;;;;;;;;;;;;;29274:31;;29092:221;;;:::o;28615:411::-;28696:13;28712:23;28727:7;28712:14;:23::i;:::-;28696:39;;28760:5;28754:11;;:2;:11;;;;28746:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28854:5;28838:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28863:37;28880:5;28887:12;:10;:12::i;:::-;28863:16;:37::i;:::-;28838:62;28816:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28997:21;29006:2;29010:7;28997:8;:21::i;:::-;28685:341;28615:411;;:::o;40993:745::-;41071:8;;41060:9;:19;;41052:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;41146:4;41133:17;;:11;;;;;;;;;;;:17;;;41125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41229:1;41212:14;;:18;41204:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41330:13;;41315:12;;41297:15;:30;;;;:::i;:::-;:46;41289:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;41446:12;;41434:1;;41428:15;;:30;41420:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;41507:15;41492:12;:30;;;;41558:10;41533:5;:17;41539:10;;41533:17;;;;;;;;;;;:22;;;:35;;;;;;;;;;;;;;;;;;41602:12;;41579:5;:17;41585:10;;41579:17;;;;;;;;;;;:20;;:35;;;;41635:10;;:12;;;;;;;;;:::i;:::-;;;;;;41658:14;;:16;;;;;;;;;:::i;:::-;;;;;;41690:36;41700:10;41711:1;;41724;41713:10;;:12;;;;:::i;:::-;41690:36;;;;;;;;;:::i;:::-;;;;;;;;40993:745;;:::o;29842:339::-;30037:41;30056:12;:10;:12::i;:::-;30070:7;30037:18;:41::i;:::-;30029:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30145:28;30155:4;30161:2;30165:7;30145:9;:28::i;:::-;29842:339;;;:::o;42039:191::-;7095:12;:10;:12::i;:::-;7084:23;;:7;:5;:7::i;:::-;:23;;;7076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42131:25:::1;:15;:23;:25::i;:::-;42126:2;:30;42118:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;42221:1;42203:6;:10;42210:2;42203:10;;;;;;;;;;;:15;;:19;;;;;;;;;;;;:::i;:::-;;42039:191:::0;;:::o;43292:106::-;7095:12;:10;:12::i;:::-;7084:23;;:7;:5;:7::i;:::-;:23;;;7076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43347:10:::1;43339:28;;:51;43368:21;43339:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;43292:106::o:0;42870:80::-;7095:12;:10;:12::i;:::-;7084:23;;:7;:5;:7::i;:::-;:23;;;7076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42941:1:::1;42930:8;:12;;;;42870:80:::0;:::o;43215:65::-;7095:12;:10;:12::i;:::-;7084:23;;:7;:5;:7::i;:::-;:23;;;7076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43268:4:::1;43259:8;;:13;;;;;;;;;;;;;;;;;;43215:65::o:0;43567:228::-;7095:12;:10;:12::i;:::-;7084:23;;:7;:5;:7::i;:::-;:23;;;7076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43634:8:::1;;;;;;;;;;;43633:9;43625:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;43673:15;43691:25;:15;:23;:25::i;:::-;43673:43;;43727:27;:15;:25;:27::i;:::-;43765:22;43775:2;43779:7;43765:9;:22::i;:::-;43614:181;43567:228:::0;:::o;30252:185::-;30390:39;30407:4;30413:2;30417:7;30390:39;;;;;;;;;;;;:16;:39::i;:::-;30252:185;;;:::o;40007:23::-;;;;:::o;42496:183::-;7095:12;:10;:12::i;:::-;7084:23;;:7;:5;:7::i;:::-;:23;;;7076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42602:10:::1;;42593:6;:19;42585:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;42670:1;;42652:5;:13;42658:6;42652:13;;;;;;;;;;;:15;;:19;;;;;;;:::i;:::-;;42496:183:::0;;;:::o;40651:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42687:85::-;7095:12;:10;:12::i;:::-;7084:23;;:7;:5;:7::i;:::-;:23;;;7076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42763:1:::1;42752:8;:12;;;;;;;;;;;;:::i;:::-;;42687:85:::0;:::o;43471:90::-;7095:12;:10;:12::i;:::-;7084:23;;:7;:5;:7::i;:::-;:23;;;7076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43552:1:::1;43536:13;:17;;;;43471:90:::0;:::o;40133:20::-;;;;;;;;;;;;;:::o;27608:239::-;27680:7;27700:13;27716:7;:16;27724:7;27716:16;;;;;;;;;;;;;;;;;;;;;27700:32;;27768:1;27751:19;;:5;:19;;;;27743:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27834:5;27827:12;;;27608:239;;;:::o;27338:208::-;27410:7;27455:1;27438:19;;:5;:19;;;;27430:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27522:9;:16;27532:5;27522:16;;;;;;;;;;;;;;;;27515:23;;27338:208;;;:::o;7515:103::-;7095:12;:10;:12::i;:::-;7084:23;;:7;:5;:7::i;:::-;:23;;;7076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7580:30:::1;7607:1;7580:18;:30::i;:::-;7515:103::o:0;40600:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43117:92::-;7095:12;:10;:12::i;:::-;7084:23;;:7;:5;:7::i;:::-;:23;;;7076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43200:1:::1;43183:14;:18;;;;43117:92:::0;:::o;39942:28::-;;;;:::o;6864:87::-;6910:7;6937:6;;;;;;;;;;;6930:13;;6864:87;:::o;28083:104::-;28139:13;28172:7;28165:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28083:104;:::o;29385:155::-;29480:52;29499:12;:10;:12::i;:::-;29513:8;29523;29480:18;:52::i;:::-;29385:155;;:::o;30508:328::-;30683:41;30702:12;:10;:12::i;:::-;30716:7;30683:18;:41::i;:::-;30675:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30789:39;30803:4;30809:2;30813:7;30822:5;30789:13;:39::i;:::-;30508:328;;;;:::o;39874:25::-;;;;:::o;28258:291::-;28331:13;28365:16;28373:7;28365;:16::i;:::-;28357:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28478:1;28459:8;28453:22;;;;;:::i;:::-;;;:26;:88;;;;;;;;;;;;;;;;;28506:8;28516:18;:7;:16;:18::i;:::-;28489:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28453:88;28446:95;;28258:291;;;:::o;39840:27::-;;;;:::o;39906:29::-;;;;:::o;42972:83::-;7095:12;:10;:12::i;:::-;7084:23;;:7;:5;:7::i;:::-;:23;;;7076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43046:1:::1;43032:11;;:15;;;;;;;;;;;;;;;;;;42972:83:::0;:::o;42238:246::-;7095:12;:10;:12::i;:::-;7084:23;;:7;:5;:7::i;:::-;:23;;;7076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42351:25:::1;:15;:23;:25::i;:::-;42346:2;:30;42338:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;42443:6;42423;:10;42430:2;42423:10;;;;;;;;;;;:17;;:26;;;;42475:1;;42460:6;:10;42467:2;42460:10;;;;;;;;;;;:12;;:16;;;;;;;:::i;:::-;;42238:246:::0;;;;:::o;41788:243::-;41834:7;41855:9;41885:12;;41867:15;:30;;;;:::i;:::-;41855:42;;41916:13;;41912:1;:17;41908:116;;;41953:1;41946:8;;;;;41908:116;42011:1;41995:13;;:17;;;;:::i;:::-;41988:24;;;41788:243;;:::o;29611:164::-;29708:4;29732:18;:25;29751:5;29732:25;;;;;;;;;;;;;;;:35;29758:8;29732:35;;;;;;;;;;;;;;;;;;;;;;;;;29725:42;;29611:164;;;;:::o;7773:201::-;7095:12;:10;:12::i;:::-;7084:23;;:7;:5;:7::i;:::-;:23;;;7076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7882:1:::1;7862:22;;:8;:22;;;;7854:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7938:28;7957:8;7938:18;:28::i;:::-;7773:201:::0;:::o;40037:27::-;;;;:::o;39977:23::-;;;;;;;;;;;;;:::o;42778:86::-;7095:12;:10;:12::i;:::-;7084:23;;:7;:5;:7::i;:::-;:23;;;7076:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42855:1:::1;42842:12;:14;;;;42778:86:::0;:::o;19672:157::-;19757:4;19796:25;19781:40;;;:11;:40;;;;19774:47;;19672:157;;;:::o;32346:127::-;32411:4;32463:1;32435:30;;:7;:16;32443:7;32435:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32428:37;;32346:127;;;:::o;5582:98::-;5635:7;5662:10;5655:17;;5582:98;:::o;36492:174::-;36594:2;36567:15;:24;36583:7;36567:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36650:7;36646:2;36612:46;;36621:23;36636:7;36621:14;:23::i;:::-;36612:46;;;;;;;;;;;;36492:174;;:::o;32640:348::-;32733:4;32758:16;32766:7;32758;:16::i;:::-;32750:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32834:13;32850:23;32865:7;32850:14;:23::i;:::-;32834:39;;32903:5;32892:16;;:7;:16;;;:51;;;;32936:7;32912:31;;:20;32924:7;32912:11;:20::i;:::-;:31;;;32892:51;:87;;;;32947:32;32964:5;32971:7;32947:16;:32::i;:::-;32892:87;32884:96;;;32640:348;;;;:::o;35749:625::-;35908:4;35881:31;;:23;35896:7;35881:14;:23::i;:::-;:31;;;35873:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35987:1;35973:16;;:2;:16;;;;35965:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36043:39;36064:4;36070:2;36074:7;36043:20;:39::i;:::-;36147:29;36164:1;36168:7;36147:8;:29::i;:::-;36208:1;36189:9;:15;36199:4;36189:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36237:1;36220:9;:13;36230:2;36220:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36268:2;36249:7;:16;36257:7;36249:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36307:7;36303:2;36288:27;;36297:4;36288:27;;;;;;;;;;;;36328:38;36348:4;36354:2;36358:7;36328:19;:38::i;:::-;35749:625;;;:::o;2174:114::-;2239:7;2266;:14;;;2259:21;;2174:114;;;:::o;2296:127::-;2403:1;2385:7;:14;;;:19;;;;;;;;;;;2296:127;:::o;33330:110::-;33406:26;33416:2;33420:7;33406:26;;;;;;;;;;;;:9;:26::i;:::-;33330:110;;:::o;8134:191::-;8208:16;8227:6;;;;;;;;;;;8208:25;;8253:8;8244:6;;:17;;;;;;;;;;;;;;;;;;8308:8;8277:40;;8298:8;8277:40;;;;;;;;;;;;8197:128;8134:191;:::o;36808:315::-;36963:8;36954:17;;:5;:17;;;;36946:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37050:8;37012:18;:25;37031:5;37012:25;;;;;;;;;;;;;;;:35;37038:8;37012:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;37096:8;37074:41;;37089:5;37074:41;;;37106:8;37074:41;;;;;;:::i;:::-;;;;;;;;36808:315;;;:::o;31718:::-;31875:28;31885:4;31891:2;31895:7;31875:9;:28::i;:::-;31922:48;31945:4;31951:2;31955:7;31964:5;31922:22;:48::i;:::-;31914:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31718:315;;;;:::o;3138:723::-;3194:13;3424:1;3415:5;:10;3411:53;;;3442:10;;;;;;;;;;;;;;;;;;;;;3411:53;3474:12;3489:5;3474:20;;3505:14;3530:78;3545:1;3537:4;:9;3530:78;;3563:8;;;;;:::i;:::-;;;;3594:2;3586:10;;;;;:::i;:::-;;;3530:78;;;3618:19;3650:6;3640:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3618:39;;3668:154;3684:1;3675:5;:10;3668:154;;3712:1;3702:11;;;;;:::i;:::-;;;3779:2;3771:5;:10;;;;:::i;:::-;3758:2;:24;;;;:::i;:::-;3745:39;;3728:6;3735;3728:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3808:2;3799:11;;;;;:::i;:::-;;;3668:154;;;3846:6;3832:21;;;;;3138:723;;;;:::o;39059:126::-;;;;:::o;39570:125::-;;;;:::o;33667:321::-;33797:18;33803:2;33807:7;33797:5;:18::i;:::-;33848:54;33879:1;33883:2;33887:7;33896:5;33848:22;:54::i;:::-;33826:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;33667:321;;;:::o;37688:799::-;37843:4;37864:15;:2;:13;;;:15::i;:::-;37860:620;;;37916:2;37900:36;;;37937:12;:10;:12::i;:::-;37951:4;37957:7;37966:5;37900:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37896:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38159:1;38142:6;:13;:18;38138:272;;;38185:60;;;;;;;;;;:::i;:::-;;;;;;;;38138:272;38360:6;38354:13;38345:6;38341:2;38337:15;38330:38;37896:529;38033:41;;;38023:51;;;:6;:51;;;;38016:58;;;;;37860:620;38464:4;38457:11;;37688:799;;;;;;;:::o;34324:439::-;34418:1;34404:16;;:2;:16;;;;34396:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34477:16;34485:7;34477;:16::i;:::-;34476:17;34468:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34539:45;34568:1;34572:2;34576:7;34539:20;:45::i;:::-;34614:1;34597:9;:13;34607:2;34597:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34645:2;34626:7;:16;34634:7;34626:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34690:7;34686:2;34665:33;;34682:1;34665:33;;;;;;;;;;;;34711:44;34739:1;34743:2;34747:7;34711:19;:44::i;:::-;34324:439;;:::o;9571:326::-;9631:4;9888:1;9866:7;:19;;;:23;9859:30;;9571:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:553::-;1844:8;1854:6;1904:3;1897:4;1889:6;1885:17;1881:27;1871:122;;1912:79;;:::i;:::-;1871:122;2025:6;2012:20;2002:30;;2055:18;2047:6;2044:30;2041:117;;;2077:79;;:::i;:::-;2041:117;2191:4;2183:6;2179:17;2167:29;;2245:3;2237:4;2229:6;2225:17;2215:8;2211:32;2208:41;2205:128;;;2252:79;;:::i;:::-;2205:128;1786:553;;;;;:::o;2359:340::-;2415:5;2464:3;2457:4;2449:6;2445:17;2441:27;2431:122;;2472:79;;:::i;:::-;2431:122;2589:6;2576:20;2614:79;2689:3;2681:6;2674:4;2666:6;2662:17;2614:79;:::i;:::-;2605:88;;2421:278;2359:340;;;;:::o;2705:139::-;2751:5;2789:6;2776:20;2767:29;;2805:33;2832:5;2805:33;:::i;:::-;2705:139;;;;:::o;2850:329::-;2909:6;2958:2;2946:9;2937:7;2933:23;2929:32;2926:119;;;2964:79;;:::i;:::-;2926:119;3084:1;3109:53;3154:7;3145:6;3134:9;3130:22;3109:53;:::i;:::-;3099:63;;3055:117;2850:329;;;;:::o;3185:474::-;3253:6;3261;3310:2;3298:9;3289:7;3285:23;3281:32;3278:119;;;3316:79;;:::i;:::-;3278:119;3436:1;3461:53;3506:7;3497:6;3486:9;3482:22;3461:53;:::i;:::-;3451:63;;3407:117;3563:2;3589:53;3634:7;3625:6;3614:9;3610:22;3589:53;:::i;:::-;3579:63;;3534:118;3185:474;;;;;:::o;3665:619::-;3742:6;3750;3758;3807:2;3795:9;3786:7;3782:23;3778:32;3775:119;;;3813:79;;:::i;:::-;3775:119;3933:1;3958:53;4003:7;3994:6;3983:9;3979:22;3958:53;:::i;:::-;3948:63;;3904:117;4060:2;4086:53;4131:7;4122:6;4111:9;4107:22;4086:53;:::i;:::-;4076:63;;4031:118;4188:2;4214:53;4259:7;4250:6;4239:9;4235:22;4214:53;:::i;:::-;4204:63;;4159:118;3665:619;;;;;:::o;4290:943::-;4385:6;4393;4401;4409;4458:3;4446:9;4437:7;4433:23;4429:33;4426:120;;;4465:79;;:::i;:::-;4426:120;4585:1;4610:53;4655:7;4646:6;4635:9;4631:22;4610:53;:::i;:::-;4600:63;;4556:117;4712:2;4738:53;4783:7;4774:6;4763:9;4759:22;4738:53;:::i;:::-;4728:63;;4683:118;4840:2;4866:53;4911:7;4902:6;4891:9;4887:22;4866:53;:::i;:::-;4856:63;;4811:118;4996:2;4985:9;4981:18;4968:32;5027:18;5019:6;5016:30;5013:117;;;5049:79;;:::i;:::-;5013:117;5154:62;5208:7;5199:6;5188:9;5184:22;5154:62;:::i;:::-;5144:72;;4939:287;4290:943;;;;;;;:::o;5239:468::-;5304:6;5312;5361:2;5349:9;5340:7;5336:23;5332:32;5329:119;;;5367:79;;:::i;:::-;5329:119;5487:1;5512:53;5557:7;5548:6;5537:9;5533:22;5512:53;:::i;:::-;5502:63;;5458:117;5614:2;5640:50;5682:7;5673:6;5662:9;5658:22;5640:50;:::i;:::-;5630:60;;5585:115;5239:468;;;;;:::o;5713:474::-;5781:6;5789;5838:2;5826:9;5817:7;5813:23;5809:32;5806:119;;;5844:79;;:::i;:::-;5806:119;5964:1;5989:53;6034:7;6025:6;6014:9;6010:22;5989:53;:::i;:::-;5979:63;;5935:117;6091:2;6117:53;6162:7;6153:6;6142:9;6138:22;6117:53;:::i;:::-;6107:63;;6062:118;5713:474;;;;;:::o;6193:323::-;6249:6;6298:2;6286:9;6277:7;6273:23;6269:32;6266:119;;;6304:79;;:::i;:::-;6266:119;6424:1;6449:50;6491:7;6482:6;6471:9;6467:22;6449:50;:::i;:::-;6439:60;;6395:114;6193:323;;;;:::o;6522:327::-;6580:6;6629:2;6617:9;6608:7;6604:23;6600:32;6597:119;;;6635:79;;:::i;:::-;6597:119;6755:1;6780:52;6824:7;6815:6;6804:9;6800:22;6780:52;:::i;:::-;6770:62;;6726:116;6522:327;;;;:::o;6855:349::-;6924:6;6973:2;6961:9;6952:7;6948:23;6944:32;6941:119;;;6979:79;;:::i;:::-;6941:119;7099:1;7124:63;7179:7;7170:6;7159:9;7155:22;7124:63;:::i;:::-;7114:73;;7070:127;6855:349;;;;:::o;7210:529::-;7281:6;7289;7338:2;7326:9;7317:7;7313:23;7309:32;7306:119;;;7344:79;;:::i;:::-;7306:119;7492:1;7481:9;7477:17;7464:31;7522:18;7514:6;7511:30;7508:117;;;7544:79;;:::i;:::-;7508:117;7657:65;7714:7;7705:6;7694:9;7690:22;7657:65;:::i;:::-;7639:83;;;;7435:297;7210:529;;;;;:::o;7745:509::-;7814:6;7863:2;7851:9;7842:7;7838:23;7834:32;7831:119;;;7869:79;;:::i;:::-;7831:119;8017:1;8006:9;8002:17;7989:31;8047:18;8039:6;8036:30;8033:117;;;8069:79;;:::i;:::-;8033:117;8174:63;8229:7;8220:6;8209:9;8205:22;8174:63;:::i;:::-;8164:73;;7960:287;7745:509;;;;:::o;8260:329::-;8319:6;8368:2;8356:9;8347:7;8343:23;8339:32;8336:119;;;8374:79;;:::i;:::-;8336:119;8494:1;8519:53;8564:7;8555:6;8544:9;8540:22;8519:53;:::i;:::-;8509:63;;8465:117;8260:329;;;;:::o;8595:674::-;8675:6;8683;8691;8740:2;8728:9;8719:7;8715:23;8711:32;8708:119;;;8746:79;;:::i;:::-;8708:119;8866:1;8891:53;8936:7;8927:6;8916:9;8912:22;8891:53;:::i;:::-;8881:63;;8837:117;9021:2;9010:9;9006:18;8993:32;9052:18;9044:6;9041:30;9038:117;;;9074:79;;:::i;:::-;9038:117;9187:65;9244:7;9235:6;9224:9;9220:22;9187:65;:::i;:::-;9169:83;;;;8964:298;8595:674;;;;;:::o;9275:654::-;9353:6;9361;9410:2;9398:9;9389:7;9385:23;9381:32;9378:119;;;9416:79;;:::i;:::-;9378:119;9536:1;9561:53;9606:7;9597:6;9586:9;9582:22;9561:53;:::i;:::-;9551:63;;9507:117;9691:2;9680:9;9676:18;9663:32;9722:18;9714:6;9711:30;9708:117;;;9744:79;;:::i;:::-;9708:117;9849:63;9904:7;9895:6;9884:9;9880:22;9849:63;:::i;:::-;9839:73;;9634:288;9275:654;;;;;:::o;9935:819::-;10024:6;10032;10040;10048;10097:2;10085:9;10076:7;10072:23;10068:32;10065:119;;;10103:79;;:::i;:::-;10065:119;10223:1;10248:53;10293:7;10284:6;10273:9;10269:22;10248:53;:::i;:::-;10238:63;;10194:117;10350:2;10376:53;10421:7;10412:6;10401:9;10397:22;10376:53;:::i;:::-;10366:63;;10321:118;10506:2;10495:9;10491:18;10478:32;10537:18;10529:6;10526:30;10523:117;;;10559:79;;:::i;:::-;10523:117;10672:65;10729:7;10720:6;10709:9;10705:22;10672:65;:::i;:::-;10654:83;;;;10449:298;9935:819;;;;;;;:::o;10760:118::-;10847:24;10865:5;10847:24;:::i;:::-;10842:3;10835:37;10760:118;;:::o;10884:109::-;10965:21;10980:5;10965:21;:::i;:::-;10960:3;10953:34;10884:109;;:::o;10999:360::-;11085:3;11113:38;11145:5;11113:38;:::i;:::-;11167:70;11230:6;11225:3;11167:70;:::i;:::-;11160:77;;11246:52;11291:6;11286:3;11279:4;11272:5;11268:16;11246:52;:::i;:::-;11323:29;11345:6;11323:29;:::i;:::-;11318:3;11314:39;11307:46;;11089:270;10999:360;;;;:::o;11389:304::-;11487:3;11508:71;11572:6;11567:3;11508:71;:::i;:::-;11501:78;;11589:43;11625:6;11620:3;11613:5;11589:43;:::i;:::-;11657:29;11679:6;11657:29;:::i;:::-;11652:3;11648:39;11641:46;;11389:304;;;;;:::o;11699:364::-;11787:3;11815:39;11848:5;11815:39;:::i;:::-;11870:71;11934:6;11929:3;11870:71;:::i;:::-;11863:78;;11950:52;11995:6;11990:3;11983:4;11976:5;11972:16;11950:52;:::i;:::-;12027:29;12049:6;12027:29;:::i;:::-;12022:3;12018:39;12011:46;;11791:272;11699:364;;;;:::o;12069:377::-;12175:3;12203:39;12236:5;12203:39;:::i;:::-;12258:89;12340:6;12335:3;12258:89;:::i;:::-;12251:96;;12356:52;12401:6;12396:3;12389:4;12382:5;12378:16;12356:52;:::i;:::-;12433:6;12428:3;12424:16;12417:23;;12179:267;12069:377;;;;:::o;12476:845::-;12579:3;12616:5;12610:12;12645:36;12671:9;12645:36;:::i;:::-;12697:89;12779:6;12774:3;12697:89;:::i;:::-;12690:96;;12817:1;12806:9;12802:17;12833:1;12828:137;;;;12979:1;12974:341;;;;12795:520;;12828:137;12912:4;12908:9;12897;12893:25;12888:3;12881:38;12948:6;12943:3;12939:16;12932:23;;12828:137;;12974:341;13041:38;13073:5;13041:38;:::i;:::-;13101:1;13115:154;13129:6;13126:1;13123:13;13115:154;;;13203:7;13197:14;13193:1;13188:3;13184:11;13177:35;13253:1;13244:7;13240:15;13229:26;;13151:4;13148:1;13144:12;13139:17;;13115:154;;;13298:6;13293:3;13289:16;13282:23;;12981:334;;12795:520;;12583:738;;12476:845;;;;:::o;13327:366::-;13469:3;13490:67;13554:2;13549:3;13490:67;:::i;:::-;13483:74;;13566:93;13655:3;13566:93;:::i;:::-;13684:2;13679:3;13675:12;13668:19;;13327:366;;;:::o;13699:::-;13841:3;13862:67;13926:2;13921:3;13862:67;:::i;:::-;13855:74;;13938:93;14027:3;13938:93;:::i;:::-;14056:2;14051:3;14047:12;14040:19;;13699:366;;;:::o;14071:::-;14213:3;14234:67;14298:2;14293:3;14234:67;:::i;:::-;14227:74;;14310:93;14399:3;14310:93;:::i;:::-;14428:2;14423:3;14419:12;14412:19;;14071:366;;;:::o;14443:::-;14585:3;14606:67;14670:2;14665:3;14606:67;:::i;:::-;14599:74;;14682:93;14771:3;14682:93;:::i;:::-;14800:2;14795:3;14791:12;14784:19;;14443:366;;;:::o;14815:::-;14957:3;14978:67;15042:2;15037:3;14978:67;:::i;:::-;14971:74;;15054:93;15143:3;15054:93;:::i;:::-;15172:2;15167:3;15163:12;15156:19;;14815:366;;;:::o;15187:::-;15329:3;15350:67;15414:2;15409:3;15350:67;:::i;:::-;15343:74;;15426:93;15515:3;15426:93;:::i;:::-;15544:2;15539:3;15535:12;15528:19;;15187:366;;;:::o;15559:::-;15701:3;15722:67;15786:2;15781:3;15722:67;:::i;:::-;15715:74;;15798:93;15887:3;15798:93;:::i;:::-;15916:2;15911:3;15907:12;15900:19;;15559:366;;;:::o;15931:::-;16073:3;16094:67;16158:2;16153:3;16094:67;:::i;:::-;16087:74;;16170:93;16259:3;16170:93;:::i;:::-;16288:2;16283:3;16279:12;16272:19;;15931:366;;;:::o;16303:::-;16445:3;16466:67;16530:2;16525:3;16466:67;:::i;:::-;16459:74;;16542:93;16631:3;16542:93;:::i;:::-;16660:2;16655:3;16651:12;16644:19;;16303:366;;;:::o;16675:::-;16817:3;16838:67;16902:2;16897:3;16838:67;:::i;:::-;16831:74;;16914:93;17003:3;16914:93;:::i;:::-;17032:2;17027:3;17023:12;17016:19;;16675:366;;;:::o;17047:::-;17189:3;17210:67;17274:2;17269:3;17210:67;:::i;:::-;17203:74;;17286:93;17375:3;17286:93;:::i;:::-;17404:2;17399:3;17395:12;17388:19;;17047:366;;;:::o;17419:::-;17561:3;17582:67;17646:2;17641:3;17582:67;:::i;:::-;17575:74;;17658:93;17747:3;17658:93;:::i;:::-;17776:2;17771:3;17767:12;17760:19;;17419:366;;;:::o;17791:::-;17933:3;17954:67;18018:2;18013:3;17954:67;:::i;:::-;17947:74;;18030:93;18119:3;18030:93;:::i;:::-;18148:2;18143:3;18139:12;18132:19;;17791:366;;;:::o;18163:::-;18305:3;18326:67;18390:2;18385:3;18326:67;:::i;:::-;18319:74;;18402:93;18491:3;18402:93;:::i;:::-;18520:2;18515:3;18511:12;18504:19;;18163:366;;;:::o;18535:::-;18677:3;18698:67;18762:2;18757:3;18698:67;:::i;:::-;18691:74;;18774:93;18863:3;18774:93;:::i;:::-;18892:2;18887:3;18883:12;18876:19;;18535:366;;;:::o;18907:::-;19049:3;19070:67;19134:2;19129:3;19070:67;:::i;:::-;19063:74;;19146:93;19235:3;19146:93;:::i;:::-;19264:2;19259:3;19255:12;19248:19;;18907:366;;;:::o;19279:::-;19421:3;19442:67;19506:2;19501:3;19442:67;:::i;:::-;19435:74;;19518:93;19607:3;19518:93;:::i;:::-;19636:2;19631:3;19627:12;19620:19;;19279:366;;;:::o;19651:::-;19793:3;19814:67;19878:2;19873:3;19814:67;:::i;:::-;19807:74;;19890:93;19979:3;19890:93;:::i;:::-;20008:2;20003:3;19999:12;19992:19;;19651:366;;;:::o;20023:::-;20165:3;20186:67;20250:2;20245:3;20186:67;:::i;:::-;20179:74;;20262:93;20351:3;20262:93;:::i;:::-;20380:2;20375:3;20371:12;20364:19;;20023:366;;;:::o;20395:::-;20537:3;20558:67;20622:2;20617:3;20558:67;:::i;:::-;20551:74;;20634:93;20723:3;20634:93;:::i;:::-;20752:2;20747:3;20743:12;20736:19;;20395:366;;;:::o;20767:::-;20909:3;20930:67;20994:2;20989:3;20930:67;:::i;:::-;20923:74;;21006:93;21095:3;21006:93;:::i;:::-;21124:2;21119:3;21115:12;21108:19;;20767:366;;;:::o;21139:::-;21281:3;21302:67;21366:2;21361:3;21302:67;:::i;:::-;21295:74;;21378:93;21467:3;21378:93;:::i;:::-;21496:2;21491:3;21487:12;21480:19;;21139:366;;;:::o;21511:::-;21653:3;21674:67;21738:2;21733:3;21674:67;:::i;:::-;21667:74;;21750:93;21839:3;21750:93;:::i;:::-;21868:2;21863:3;21859:12;21852:19;;21511:366;;;:::o;21883:::-;22025:3;22046:67;22110:2;22105:3;22046:67;:::i;:::-;22039:74;;22122:93;22211:3;22122:93;:::i;:::-;22240:2;22235:3;22231:12;22224:19;;21883:366;;;:::o;22255:118::-;22342:24;22360:5;22342:24;:::i;:::-;22337:3;22330:37;22255:118;;:::o;22379:429::-;22556:3;22578:92;22666:3;22657:6;22578:92;:::i;:::-;22571:99;;22687:95;22778:3;22769:6;22687:95;:::i;:::-;22680:102;;22799:3;22792:10;;22379:429;;;;;:::o;22814:222::-;22907:4;22945:2;22934:9;22930:18;22922:26;;22958:71;23026:1;23015:9;23011:17;23002:6;22958:71;:::i;:::-;22814:222;;;;:::o;23042:640::-;23237:4;23275:3;23264:9;23260:19;23252:27;;23289:71;23357:1;23346:9;23342:17;23333:6;23289:71;:::i;:::-;23370:72;23438:2;23427:9;23423:18;23414:6;23370:72;:::i;:::-;23452;23520:2;23509:9;23505:18;23496:6;23452:72;:::i;:::-;23571:9;23565:4;23561:20;23556:2;23545:9;23541:18;23534:48;23599:76;23670:4;23661:6;23599:76;:::i;:::-;23591:84;;23042:640;;;;;;;:::o;23688:553::-;23867:4;23905:2;23894:9;23890:18;23882:26;;23918:71;23986:1;23975:9;23971:17;23962:6;23918:71;:::i;:::-;24036:9;24030:4;24026:20;24021:2;24010:9;24006:18;23999:48;24064:88;24147:4;24138:6;24130;24064:88;:::i;:::-;24056:96;;24162:72;24230:2;24219:9;24215:18;24206:6;24162:72;:::i;:::-;23688:553;;;;;;;:::o;24247:533::-;24416:4;24454:2;24443:9;24439:18;24431:26;;24467:71;24535:1;24524:9;24520:17;24511:6;24467:71;:::i;:::-;24548:72;24616:2;24605:9;24601:18;24592:6;24548:72;:::i;:::-;24667:9;24661:4;24657:20;24652:2;24641:9;24637:18;24630:48;24695:78;24768:4;24759:6;24695:78;:::i;:::-;24687:86;;24247:533;;;;;;:::o;24786:210::-;24873:4;24911:2;24900:9;24896:18;24888:26;;24924:65;24986:1;24975:9;24971:17;24962:6;24924:65;:::i;:::-;24786:210;;;;:::o;25002:313::-;25115:4;25153:2;25142:9;25138:18;25130:26;;25202:9;25196:4;25192:20;25188:1;25177:9;25173:17;25166:47;25230:78;25303:4;25294:6;25230:78;:::i;:::-;25222:86;;25002:313;;;;:::o;25321:419::-;25487:4;25525:2;25514:9;25510:18;25502:26;;25574:9;25568:4;25564:20;25560:1;25549:9;25545:17;25538:47;25602:131;25728:4;25602:131;:::i;:::-;25594:139;;25321:419;;;:::o;25746:::-;25912:4;25950:2;25939:9;25935:18;25927:26;;25999:9;25993:4;25989:20;25985:1;25974:9;25970:17;25963:47;26027:131;26153:4;26027:131;:::i;:::-;26019:139;;25746:419;;;:::o;26171:::-;26337:4;26375:2;26364:9;26360:18;26352:26;;26424:9;26418:4;26414:20;26410:1;26399:9;26395:17;26388:47;26452:131;26578:4;26452:131;:::i;:::-;26444:139;;26171:419;;;:::o;26596:::-;26762:4;26800:2;26789:9;26785:18;26777:26;;26849:9;26843:4;26839:20;26835:1;26824:9;26820:17;26813:47;26877:131;27003:4;26877:131;:::i;:::-;26869:139;;26596:419;;;:::o;27021:::-;27187:4;27225:2;27214:9;27210:18;27202:26;;27274:9;27268:4;27264:20;27260:1;27249:9;27245:17;27238:47;27302:131;27428:4;27302:131;:::i;:::-;27294:139;;27021:419;;;:::o;27446:::-;27612:4;27650:2;27639:9;27635:18;27627:26;;27699:9;27693:4;27689:20;27685:1;27674:9;27670:17;27663:47;27727:131;27853:4;27727:131;:::i;:::-;27719:139;;27446:419;;;:::o;27871:::-;28037:4;28075:2;28064:9;28060:18;28052:26;;28124:9;28118:4;28114:20;28110:1;28099:9;28095:17;28088:47;28152:131;28278:4;28152:131;:::i;:::-;28144:139;;27871:419;;;:::o;28296:::-;28462:4;28500:2;28489:9;28485:18;28477:26;;28549:9;28543:4;28539:20;28535:1;28524:9;28520:17;28513:47;28577:131;28703:4;28577:131;:::i;:::-;28569:139;;28296:419;;;:::o;28721:::-;28887:4;28925:2;28914:9;28910:18;28902:26;;28974:9;28968:4;28964:20;28960:1;28949:9;28945:17;28938:47;29002:131;29128:4;29002:131;:::i;:::-;28994:139;;28721:419;;;:::o;29146:::-;29312:4;29350:2;29339:9;29335:18;29327:26;;29399:9;29393:4;29389:20;29385:1;29374:9;29370:17;29363:47;29427:131;29553:4;29427:131;:::i;:::-;29419:139;;29146:419;;;:::o;29571:::-;29737:4;29775:2;29764:9;29760:18;29752:26;;29824:9;29818:4;29814:20;29810:1;29799:9;29795:17;29788:47;29852:131;29978:4;29852:131;:::i;:::-;29844:139;;29571:419;;;:::o;29996:::-;30162:4;30200:2;30189:9;30185:18;30177:26;;30249:9;30243:4;30239:20;30235:1;30224:9;30220:17;30213:47;30277:131;30403:4;30277:131;:::i;:::-;30269:139;;29996:419;;;:::o;30421:::-;30587:4;30625:2;30614:9;30610:18;30602:26;;30674:9;30668:4;30664:20;30660:1;30649:9;30645:17;30638:47;30702:131;30828:4;30702:131;:::i;:::-;30694:139;;30421:419;;;:::o;30846:::-;31012:4;31050:2;31039:9;31035:18;31027:26;;31099:9;31093:4;31089:20;31085:1;31074:9;31070:17;31063:47;31127:131;31253:4;31127:131;:::i;:::-;31119:139;;30846:419;;;:::o;31271:::-;31437:4;31475:2;31464:9;31460:18;31452:26;;31524:9;31518:4;31514:20;31510:1;31499:9;31495:17;31488:47;31552:131;31678:4;31552:131;:::i;:::-;31544:139;;31271:419;;;:::o;31696:::-;31862:4;31900:2;31889:9;31885:18;31877:26;;31949:9;31943:4;31939:20;31935:1;31924:9;31920:17;31913:47;31977:131;32103:4;31977:131;:::i;:::-;31969:139;;31696:419;;;:::o;32121:::-;32287:4;32325:2;32314:9;32310:18;32302:26;;32374:9;32368:4;32364:20;32360:1;32349:9;32345:17;32338:47;32402:131;32528:4;32402:131;:::i;:::-;32394:139;;32121:419;;;:::o;32546:::-;32712:4;32750:2;32739:9;32735:18;32727:26;;32799:9;32793:4;32789:20;32785:1;32774:9;32770:17;32763:47;32827:131;32953:4;32827:131;:::i;:::-;32819:139;;32546:419;;;:::o;32971:::-;33137:4;33175:2;33164:9;33160:18;33152:26;;33224:9;33218:4;33214:20;33210:1;33199:9;33195:17;33188:47;33252:131;33378:4;33252:131;:::i;:::-;33244:139;;32971:419;;;:::o;33396:::-;33562:4;33600:2;33589:9;33585:18;33577:26;;33649:9;33643:4;33639:20;33635:1;33624:9;33620:17;33613:47;33677:131;33803:4;33677:131;:::i;:::-;33669:139;;33396:419;;;:::o;33821:::-;33987:4;34025:2;34014:9;34010:18;34002:26;;34074:9;34068:4;34064:20;34060:1;34049:9;34045:17;34038:47;34102:131;34228:4;34102:131;:::i;:::-;34094:139;;33821:419;;;:::o;34246:::-;34412:4;34450:2;34439:9;34435:18;34427:26;;34499:9;34493:4;34489:20;34485:1;34474:9;34470:17;34463:47;34527:131;34653:4;34527:131;:::i;:::-;34519:139;;34246:419;;;:::o;34671:::-;34837:4;34875:2;34864:9;34860:18;34852:26;;34924:9;34918:4;34914:20;34910:1;34899:9;34895:17;34888:47;34952:131;35078:4;34952:131;:::i;:::-;34944:139;;34671:419;;;:::o;35096:::-;35262:4;35300:2;35289:9;35285:18;35277:26;;35349:9;35343:4;35339:20;35335:1;35324:9;35320:17;35313:47;35377:131;35503:4;35377:131;:::i;:::-;35369:139;;35096:419;;;:::o;35521:222::-;35614:4;35652:2;35641:9;35637:18;35629:26;;35665:71;35733:1;35722:9;35718:17;35709:6;35665:71;:::i;:::-;35521:222;;;;:::o;35749:624::-;35938:4;35976:2;35965:9;35961:18;35953:26;;35989:71;36057:1;36046:9;36042:17;36033:6;35989:71;:::i;:::-;36107:9;36101:4;36097:20;36092:2;36081:9;36077:18;36070:48;36135:78;36208:4;36199:6;36135:78;:::i;:::-;36127:86;;36260:9;36254:4;36250:20;36245:2;36234:9;36230:18;36223:48;36288:78;36361:4;36352:6;36288:78;:::i;:::-;36280:86;;35749:624;;;;;;:::o;36379:129::-;36413:6;36440:20;;:::i;:::-;36430:30;;36469:33;36497:4;36489:6;36469:33;:::i;:::-;36379:129;;;:::o;36514:75::-;36547:6;36580:2;36574:9;36564:19;;36514:75;:::o;36595:307::-;36656:4;36746:18;36738:6;36735:30;36732:56;;;36768:18;;:::i;:::-;36732:56;36806:29;36828:6;36806:29;:::i;:::-;36798:37;;36890:4;36884;36880:15;36872:23;;36595:307;;;:::o;36908:308::-;36970:4;37060:18;37052:6;37049:30;37046:56;;;37082:18;;:::i;:::-;37046:56;37120:29;37142:6;37120:29;:::i;:::-;37112:37;;37204:4;37198;37194:15;37186:23;;36908:308;;;:::o;37222:141::-;37271:4;37294:3;37286:11;;37317:3;37314:1;37307:14;37351:4;37348:1;37338:18;37330:26;;37222:141;;;:::o;37369:98::-;37420:6;37454:5;37448:12;37438:22;;37369:98;;;:::o;37473:99::-;37525:6;37559:5;37553:12;37543:22;;37473:99;;;:::o;37578:168::-;37661:11;37695:6;37690:3;37683:19;37735:4;37730:3;37726:14;37711:29;;37578:168;;;;:::o;37752:169::-;37836:11;37870:6;37865:3;37858:19;37910:4;37905:3;37901:14;37886:29;;37752:169;;;;:::o;37927:148::-;38029:11;38066:3;38051:18;;37927:148;;;;:::o;38081:305::-;38121:3;38140:20;38158:1;38140:20;:::i;:::-;38135:25;;38174:20;38192:1;38174:20;:::i;:::-;38169:25;;38328:1;38260:66;38256:74;38253:1;38250:81;38247:107;;;38334:18;;:::i;:::-;38247:107;38378:1;38375;38371:9;38364:16;;38081:305;;;;:::o;38392:185::-;38432:1;38449:20;38467:1;38449:20;:::i;:::-;38444:25;;38483:20;38501:1;38483:20;:::i;:::-;38478:25;;38522:1;38512:35;;38527:18;;:::i;:::-;38512:35;38569:1;38566;38562:9;38557:14;;38392:185;;;;:::o;38583:191::-;38623:4;38643:20;38661:1;38643:20;:::i;:::-;38638:25;;38677:20;38695:1;38677:20;:::i;:::-;38672:25;;38716:1;38713;38710:8;38707:34;;;38721:18;;:::i;:::-;38707:34;38766:1;38763;38759:9;38751:17;;38583:191;;;;:::o;38780:96::-;38817:7;38846:24;38864:5;38846:24;:::i;:::-;38835:35;;38780:96;;;:::o;38882:90::-;38916:7;38959:5;38952:13;38945:21;38934:32;;38882:90;;;:::o;38978:149::-;39014:7;39054:66;39047:5;39043:78;39032:89;;38978:149;;;:::o;39133:126::-;39170:7;39210:42;39203:5;39199:54;39188:65;;39133:126;;;:::o;39265:77::-;39302:7;39331:5;39320:16;;39265:77;;;:::o;39348:154::-;39432:6;39427:3;39422;39409:30;39494:1;39485:6;39480:3;39476:16;39469:27;39348:154;;;:::o;39508:307::-;39576:1;39586:113;39600:6;39597:1;39594:13;39586:113;;;39685:1;39680:3;39676:11;39670:18;39666:1;39661:3;39657:11;39650:39;39622:2;39619:1;39615:10;39610:15;;39586:113;;;39717:6;39714:1;39711:13;39708:101;;;39797:1;39788:6;39783:3;39779:16;39772:27;39708:101;39557:258;39508:307;;;:::o;39821:171::-;39860:3;39883:24;39901:5;39883:24;:::i;:::-;39874:33;;39929:4;39922:5;39919:15;39916:41;;;39937:18;;:::i;:::-;39916:41;39984:1;39977:5;39973:13;39966:20;;39821:171;;;:::o;39998:320::-;40042:6;40079:1;40073:4;40069:12;40059:22;;40126:1;40120:4;40116:12;40147:18;40137:81;;40203:4;40195:6;40191:17;40181:27;;40137:81;40265:2;40257:6;40254:14;40234:18;40231:38;40228:84;;;40284:18;;:::i;:::-;40228:84;40049:269;39998:320;;;:::o;40324:281::-;40407:27;40429:4;40407:27;:::i;:::-;40399:6;40395:40;40537:6;40525:10;40522:22;40501:18;40489:10;40486:34;40483:62;40480:88;;;40548:18;;:::i;:::-;40480:88;40588:10;40584:2;40577:22;40367:238;40324:281;;:::o;40611:233::-;40650:3;40673:24;40691:5;40673:24;:::i;:::-;40664:33;;40719:66;40712:5;40709:77;40706:103;;;40789:18;;:::i;:::-;40706:103;40836:1;40829:5;40825:13;40818:20;;40611:233;;;:::o;40850:176::-;40882:1;40899:20;40917:1;40899:20;:::i;:::-;40894:25;;40933:20;40951:1;40933:20;:::i;:::-;40928:25;;40972:1;40962:35;;40977:18;;:::i;:::-;40962:35;41018:1;41015;41011:9;41006:14;;40850:176;;;;:::o;41032:180::-;41080:77;41077:1;41070:88;41177:4;41174:1;41167:15;41201:4;41198:1;41191:15;41218:180;41266:77;41263:1;41256:88;41363:4;41360:1;41353:15;41387:4;41384:1;41377:15;41404:180;41452:77;41449:1;41442:88;41549:4;41546:1;41539:15;41573:4;41570:1;41563:15;41590:180;41638:77;41635:1;41628:88;41735:4;41732:1;41725:15;41759:4;41756:1;41749:15;41776:180;41824:77;41821:1;41814:88;41921:4;41918:1;41911:15;41945:4;41942:1;41935:15;41962:117;42071:1;42068;42061:12;42085:117;42194:1;42191;42184:12;42208:117;42317:1;42314;42307:12;42331:117;42440:1;42437;42430:12;42454:117;42563:1;42560;42553:12;42577:117;42686:1;42683;42676:12;42700:102;42741:6;42792:2;42788:7;42783:2;42776:5;42772:14;42768:28;42758:38;;42700:102;;;:::o;42808:171::-;42948:23;42944:1;42936:6;42932:14;42925:47;42808:171;:::o;42985:237::-;43125:34;43121:1;43113:6;43109:14;43102:58;43194:20;43189:2;43181:6;43177:15;43170:45;42985:237;:::o;43228:225::-;43368:34;43364:1;43356:6;43352:14;43345:58;43437:8;43432:2;43424:6;43420:15;43413:33;43228:225;:::o;43459:224::-;43599:34;43595:1;43587:6;43583:14;43576:58;43668:7;43663:2;43655:6;43651:15;43644:32;43459:224;:::o;43689:178::-;43829:30;43825:1;43817:6;43813:14;43806:54;43689:178;:::o;43873:166::-;44013:18;44009:1;44001:6;43997:14;43990:42;43873:166;:::o;44045:165::-;44185:17;44181:1;44173:6;44169:14;44162:41;44045:165;:::o;44216:223::-;44356:34;44352:1;44344:6;44340:14;44333:58;44425:6;44420:2;44412:6;44408:15;44401:31;44216:223;:::o;44445:175::-;44585:27;44581:1;44573:6;44569:14;44562:51;44445:175;:::o;44626:231::-;44766:34;44762:1;44754:6;44750:14;44743:58;44835:14;44830:2;44822:6;44818:15;44811:39;44626:231;:::o;44863:249::-;45003:34;44999:1;44991:6;44987:14;44980:58;45072:32;45067:2;45059:6;45055:15;45048:57;44863:249;:::o;45118:243::-;45258:34;45254:1;45246:6;45242:14;45235:58;45327:26;45322:2;45314:6;45310:15;45303:51;45118:243;:::o;45367:229::-;45507:34;45503:1;45495:6;45491:14;45484:58;45576:12;45571:2;45563:6;45559:15;45552:37;45367:229;:::o;45602:228::-;45742:34;45738:1;45730:6;45726:14;45719:58;45811:11;45806:2;45798:6;45794:15;45787:36;45602:228;:::o;45836:182::-;45976:34;45972:1;45964:6;45960:14;45953:58;45836:182;:::o;46024:231::-;46164:34;46160:1;46152:6;46148:14;46141:58;46233:14;46228:2;46220:6;46216:15;46209:39;46024:231;:::o;46261:182::-;46401:34;46397:1;46389:6;46385:14;46378:58;46261:182;:::o;46449:178::-;46589:30;46585:1;46577:6;46573:14;46566:54;46449:178;:::o;46633:234::-;46773:34;46769:1;46761:6;46757:14;46750:58;46842:17;46837:2;46829:6;46825:15;46818:42;46633:234;:::o;46873:220::-;47013:34;47009:1;47001:6;46997:14;46990:58;47082:3;47077:2;47069:6;47065:15;47058:28;46873:220;:::o;47099:174::-;47239:26;47235:1;47227:6;47223:14;47216:50;47099:174;:::o;47279:236::-;47419:34;47415:1;47407:6;47403:14;47396:58;47488:19;47483:2;47475:6;47471:15;47464:44;47279:236;:::o;47521:226::-;47661:34;47657:1;47649:6;47645:14;47638:58;47730:9;47725:2;47717:6;47713:15;47706:34;47521:226;:::o;47753:231::-;47893:34;47889:1;47881:6;47877:14;47870:58;47962:14;47957:2;47949:6;47945:15;47938:39;47753:231;:::o;47990:122::-;48063:24;48081:5;48063:24;:::i;:::-;48056:5;48053:35;48043:63;;48102:1;48099;48092:12;48043:63;47990:122;:::o;48118:116::-;48188:21;48203:5;48188:21;:::i;:::-;48181:5;48178:32;48168:60;;48224:1;48221;48214:12;48168:60;48118:116;:::o;48240:120::-;48312:23;48329:5;48312:23;:::i;:::-;48305:5;48302:34;48292:62;;48350:1;48347;48340:12;48292:62;48240:120;:::o;48366:122::-;48439:24;48457:5;48439:24;:::i;:::-;48432:5;48429:35;48419:63;;48478:1;48475;48468:12;48419:63;48366:122;:::o
Swarm Source
ipfs://31a1f8286c163270dfe0075bf1da697b030831f4a092fceb714c5c16ce3ea4e7
Loading...
Loading
Loading...
Loading
Net Worth in USD
$374.79
Net Worth in ETH
0.185077
Token Allocations
ETH
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $2,025.07 | 0.1851 | $374.79 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.