ERC-1155
Overview
Max Total Supply
2,278
Holders
304
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
JKKeyCard
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-07 */ // Sources flattened with hardhat v2.6.5 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC1155/[email protected] pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC1155/[email protected] pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC1155/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/introspection/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC1155/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(_msgSender() != operator, "ERC1155: setting approval status for self"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`. * * Emits a {TransferSingle} event. * * Requirements: * * - `account` cannot be the zero address. * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address account, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(account != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][account] += amount; emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `account` * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens of token type `id`. */ function _burn( address account, uint256 id, uint256 amount ) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][account] = accountBalance - amount; } emit TransferSingle(operator, account, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address account, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][account] = accountBalance - amount; } } emit TransferBatch(operator, account, address(0), ids, amounts); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File @openzeppelin/contracts/utils/cryptography/[email protected] pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File @openzeppelin/contracts/access/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/security/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File contracts/JKKeyCard.sol // SPDX-License-Identifier: MIT /* _ _ __ _ __________ _______ _____ _____ | | |/ / | |/ / ____\ \ / / ____| /\ | __ \| __ \ | | ' / | ' /| |__ \ \_/ / | / \ | |__) | | | | _ | | < | < | __| \ /| | / /\ \ | _ /| | | | | |__| | . \ | . \| |____ | | | |____ / ____ \| | \ \| |__| | \____/|_|\_\ |_|\_\______| |_| \_____/_/ \_\_| \_\_____/ Join us https://discord.gg/796KVFSf */ pragma solidity ^0.8.7; contract JKKeyCard is ReentrancyGuard, ERC1155, Ownable { uint256 public constant MAX_KEY_CARDS = 4500; uint256 public constant MINT_PRICE = 0.05 ether; uint256 public constant GIVEAWAY = 50; uint256 public maxPerAddress = 5; uint256 public mintCount; mapping(bytes32 => bool) private _usedHashes; bool public saleStarted = false; bool public presaleStarted = false; uint256 constant private _tokenId = 1; address private _signerAddress; constructor() ERC1155("https://ipfs.io/ipfs/QmYbWYv48DWGh5mTGUDo9i5EtZySpTVPv4nJ72A2B5vSuK?filename=jk_metadata%20copy.json") { // Mint 50 for giveaways mintCount = GIVEAWAY; _mint(msg.sender, _tokenId, GIVEAWAY, ""); } // Preasale Mint Key Card function presaleMint( uint256 _count, bytes32 _hash, bytes memory _sig) external payable nonReentrant { require(presaleStarted, "Presale not started"); require(tx.origin == msg.sender, "Prevent contract call"); require((balanceOf(msg.sender, _tokenId) + _count) <= maxPerAddress, "Max Per Address reached"); require(_count > 0 && msg.value == _count * MINT_PRICE, "invalid eth sent"); require(matchHash(msg.sender, _count, _hash), "invalid hash"); require(matchSigner(_hash, _sig), "invalid signer"); require(!_usedHashes[_hash], "_hash already used"); require(mintCount + _count <= MAX_KEY_CARDS, "max key cards"); _usedHashes[_hash] = true; mintCount += _count; _mint(msg.sender, _tokenId, _count, ""); } function publicMint(uint256 _count) external payable nonReentrant { require(saleStarted, "Public sale not started"); require(tx.origin == msg.sender, "Prevent contract call"); require((balanceOf(msg.sender, _tokenId) + _count) <= maxPerAddress, "Max Per Address reached"); require(_count > 0 && msg.value == _count * MINT_PRICE, "invalid eth sent"); require(mintCount + _count <= MAX_KEY_CARDS, "max key cards"); mintCount += _count; _mint(msg.sender, _tokenId, _count, ""); } function matchSigner(bytes32 _hash, bytes memory _signature) private view returns(bool) { return _signerAddress == ECDSA.recover(ECDSA.toEthSignedMessageHash(_hash), _signature); } function matchHash(address _sender, uint256 _count, bytes32 _hash) private pure returns(bool) { bytes32 h = keccak256(abi.encode(_sender, _count)); return h == _hash; } function checkWhitelist( address _sender, uint256 _count, bytes32 _hash, bytes memory _sig ) public view returns(bool) { return matchHash(_sender, _count, _hash) && matchSigner(_hash, _sig); } // ** Admin Fuctions ** // function setURI(string memory newuri) external onlyOwner { _setURI(newuri); } function withdraw(address payable _to) external onlyOwner { require(_to != address(0), "cannot withdraw to address(0)"); require(address(this).balance > 0, "empty balance"); _to.transfer(address(this).balance); } function setSaleStarted(bool _hasStarted) external onlyOwner { require(saleStarted != _hasStarted, "saleStarted already set"); saleStarted = _hasStarted; } function setPresaleStarted(bool _hasStarted) external onlyOwner { require(presaleStarted != _hasStarted, "presaleStarted already set"); presaleStarted= _hasStarted; } function setSignerAddress(address _signer) external onlyOwner { require(_signer != address(0), "signer address null"); _signerAddress = _signer; } function setMaxPerAddress(uint256 _max) external onlyOwner { require(_max > 0, "max cannot be null"); maxPerAddress = _max; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"GIVEAWAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_KEY_CARDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"checkWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_hasStarted","type":"bool"}],"name":"setPresaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_hasStarted","type":"bool"}],"name":"setSaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600580556000600860006101000a81548160ff0219169083151502179055506000600860016101000a81548160ff0219169083151502179055503480156200004b57600080fd5b506040518060a001604052806064815260200162005c7c6064913960016000819055506200007f81620000d360201b60201c565b50620000a062000094620000ef60201b60201c565b620000f760201b60201c565b6032600681905550620000cd336001603260405180602001604052806000815250620001bd60201b60201c565b62000dae565b8060039080519060200190620000eb92919062000629565b5050565b600033905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141562000230576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002279062000907565b60405180910390fd5b600062000242620000ef60201b60201c565b90506200027b816000876200025d886200038360201b60201c565b6200026e886200038360201b60201c565b876200040460201b60201c565b826001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620002dd919062000998565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516200035d92919062000929565b60405180910390a46200037c816000878787876200040c60201b60201c565b5050505050565b60606000600167ffffffffffffffff811115620003a557620003a462000b8e565b5b604051908082528060200260200182016040528015620003d45781602001602082028036833780820191505090505b5090508281600081518110620003ef57620003ee62000b5f565b5b60200260200101818152505080915050919050565b505050505050565b620004388473ffffffffffffffffffffffffffffffffffffffff166200061660201b62001ac21760201c565b156200060e578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401620004819594939291906200083b565b602060405180830381600087803b1580156200049c57600080fd5b505af1925050508015620004d057506040513d601f19601f82011682018060405250810190620004cd9190620006f0565b60015b6200058257620004df62000bbd565b806308c379a01415620005435750620004f762000cf2565b8062000504575062000545565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200053a91906200089f565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200057990620008c3565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146200060c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200060390620008e5565b60405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b828054620006379062000a95565b90600052602060002090601f0160209004810192826200065b5760008555620006a7565b82601f106200067657805160ff1916838001178555620006a7565b82800160010185558215620006a7579182015b82811115620006a657825182559160200191906001019062000689565b5b509050620006b69190620006ba565b5090565b5b80821115620006d5576000816000905550600101620006bb565b5090565b600081519050620006ea8162000d94565b92915050565b60006020828403121562000709576200070862000be2565b5b60006200071984828501620006d9565b91505092915050565b6200072d81620009f5565b82525050565b6000620007408262000960565b6200074c818562000976565b93506200075e81856020860162000a5f565b620007698162000be7565b840191505092915050565b600062000781826200096b565b6200078d818562000987565b93506200079f81856020860162000a5f565b620007aa8162000be7565b840191505092915050565b6000620007c460348362000987565b9150620007d18262000c05565b604082019050919050565b6000620007eb60288362000987565b9150620007f88262000c54565b604082019050919050565b60006200081260218362000987565b91506200081f8262000ca3565b604082019050919050565b620008358162000a55565b82525050565b600060a08201905062000852600083018862000722565b62000861602083018762000722565b6200087060408301866200082a565b6200087f60608301856200082a565b818103608083015262000893818462000733565b90509695505050505050565b60006020820190508181036000830152620008bb818462000774565b905092915050565b60006020820190508181036000830152620008de81620007b5565b9050919050565b600060208201905081810360008301526200090081620007dc565b9050919050565b60006020820190508181036000830152620009228162000803565b9050919050565b60006040820190506200094060008301856200082a565b6200094f60208301846200082a565b9392505050565b6000604051905090565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000620009a58262000a55565b9150620009b28362000a55565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620009ea57620009e962000b01565b5b828201905092915050565b600062000a028262000a35565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000a7f57808201518184015260208101905062000a62565b8381111562000a8f576000848401525b50505050565b6000600282049050600182168062000aae57607f821691505b6020821081141562000ac55762000ac462000b30565b5b50919050565b62000ad68262000be7565b810181811067ffffffffffffffff8211171562000af85762000af762000b8e565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111562000bdf5760046000803e62000bdc60005162000bf8565b90505b90565b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d101562000d045762000d91565b62000d0e62000956565b60043d036004823e80513d602482011167ffffffffffffffff8211171562000d3857505062000d91565b808201805167ffffffffffffffff81111562000d58575050505062000d91565b80602083010160043d03850181111562000d7757505050505062000d91565b62000d888260200185018662000acb565b82955050505050505b90565b62000d9f8162000a09565b811462000dab57600080fd5b50565b614ebe8062000dbe6000396000f3fe60806040526004361061019b5760003560e01c8063715018a6116100ec578063a854ffba1161008a578063e256037111610064578063e256037114610583578063e985e9c5146105c0578063f242432a146105fd578063f2fde38b146106265761019b565b8063a854ffba14610513578063bf9b7c8d1461053c578063c002d23d146105585761019b565b80638e2b54b8116100c65780638e2b54b814610469578063948cd413146104945780639659867e146104bf578063a22cb465146104ea5761019b565b8063715018a6146103fe5780637bddd65b146104155780638da5cb5b1461043e5761019b565b80632db115441161015957806351cff8d91161013357806351cff8d9146103565780635c474f9e1461037f578063639814e0146103aa5780636ecbac79146103d55761019b565b80632db11544146102d45780632eb2c2d6146102f05780634e1273f4146103195761019b565b8062fdd58e146101a057806301ffc9a7146101dd57806302fe53051461021a57806304549d6f14610243578063046dc1661461026e5780630e89341c14610297575b600080fd5b3480156101ac57600080fd5b506101c760048036038101906101c291906131ed565b61064f565b6040516101d491906140ba565b60405180910390f35b3480156101e957600080fd5b5061020460048036038101906101ff9190613355565b610719565b6040516102119190613c18565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c91906133af565b6107fb565b005b34801561024f57600080fd5b50610258610883565b6040516102659190613c18565b60405180910390f35b34801561027a57600080fd5b5061029560048036038101906102909190612fad565b610896565b005b3480156102a357600080fd5b506102be60048036038101906102b991906133f8565b6109c6565b6040516102cb9190613c78565b60405180910390f35b6102ee60048036038101906102e991906133f8565b610a5a565b005b3480156102fc57600080fd5b5061031760048036038101906103129190613047565b610cb1565b005b34801561032557600080fd5b50610340600480360381019061033b91906132b0565b610d52565b60405161034d9190613bbf565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190612fda565b610e6b565b005b34801561038b57600080fd5b50610394610fe4565b6040516103a19190613c18565b60405180910390f35b3480156103b657600080fd5b506103bf610ff7565b6040516103cc91906140ba565b60405180910390f35b3480156103e157600080fd5b506103fc60048036038101906103f79190613328565b610ffd565b005b34801561040a57600080fd5b506104136110ec565b005b34801561042157600080fd5b5061043c600480360381019061043791906133f8565b611174565b005b34801561044a57600080fd5b5061045361123d565b6040516104609190613ab9565b60405180910390f35b34801561047557600080fd5b5061047e611267565b60405161048b91906140ba565b60405180910390f35b3480156104a057600080fd5b506104a961126d565b6040516104b691906140ba565b60405180910390f35b3480156104cb57600080fd5b506104d4611272565b6040516104e191906140ba565b60405180910390f35b3480156104f657600080fd5b50610511600480360381019061050c91906131ad565b611278565b005b34801561051f57600080fd5b5061053a60048036038101906105359190613328565b6113f9565b005b61055660048036038101906105519190613425565b6114e8565b005b34801561056457600080fd5b5061056d611861565b60405161057a91906140ba565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a5919061322d565b61186c565b6040516105b79190613c18565b60405180910390f35b3480156105cc57600080fd5b506105e760048036038101906105e29190613007565b611895565b6040516105f49190613c18565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f9190613116565b611929565b005b34801561063257600080fd5b5061064d60048036038101906106489190612fad565b6119ca565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b790613d1a565b60405180910390fd5b6001600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107e457507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107f457506107f382611ad5565b5b9050919050565b610803611b3f565b73ffffffffffffffffffffffffffffffffffffffff1661082161123d565b73ffffffffffffffffffffffffffffffffffffffff1614610877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086e90613f5a565b60405180910390fd5b61088081611b47565b50565b600860019054906101000a900460ff1681565b61089e611b3f565b73ffffffffffffffffffffffffffffffffffffffff166108bc61123d565b73ffffffffffffffffffffffffffffffffffffffff1614610912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090990613f5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097990613f7a565b60405180910390fd5b80600860026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600380546109d5906143e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a01906143e8565b8015610a4e5780601f10610a2357610100808354040283529160200191610a4e565b820191906000526020600020905b815481529060010190602001808311610a3157829003601f168201915b50505050509050919050565b60026000541415610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a979061409a565b60405180910390fd5b6002600081905550600860009054906101000a900460ff16610af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aee90613dfa565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c90613efa565b60405180910390fd5b60055481610b7433600161064f565b610b7e9190614259565b1115610bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb690613d7a565b60405180910390fd5b600081118015610be0575066b1a2bc2ec5000081610bdd91906142af565b34145b610c1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1690613dda565b60405180910390fd5b61119481600654610c309190614259565b1115610c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6890613f9a565b60405180910390fd5b8060066000828254610c839190614259565b92505081905550610ca63360018360405180602001604052806000815250611b61565b600160008190555050565b610cb9611b3f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610cff5750610cfe85610cf9611b3f565b611895565b5b610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3590613e5a565b60405180910390fd5b610d4b8585858585611cf8565b5050505050565b60608151835114610d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8f9061403a565b60405180910390fd5b6000835167ffffffffffffffff811115610db557610db461455a565b5b604051908082528060200260200182016040528015610de35781602001602082028036833780820191505090505b50905060005b8451811015610e6057610e30858281518110610e0857610e0761452b565b5b6020026020010151858381518110610e2357610e2261452b565b5b602002602001015161064f565b828281518110610e4357610e4261452b565b5b60200260200101818152505080610e599061444b565b9050610de9565b508091505092915050565b610e73611b3f565b73ffffffffffffffffffffffffffffffffffffffff16610e9161123d565b73ffffffffffffffffffffffffffffffffffffffff1614610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede90613f5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e90613eda565b60405180910390fd5b60004711610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9190613fba565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610fe0573d6000803e3d6000fd5b5050565b600860009054906101000a900460ff1681565b60055481565b611005611b3f565b73ffffffffffffffffffffffffffffffffffffffff1661102361123d565b73ffffffffffffffffffffffffffffffffffffffff1614611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107090613f5a565b60405180910390fd5b801515600860019054906101000a900460ff16151514156110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c690613fda565b60405180910390fd5b80600860016101000a81548160ff02191690831515021790555050565b6110f4611b3f565b73ffffffffffffffffffffffffffffffffffffffff1661111261123d565b73ffffffffffffffffffffffffffffffffffffffff1614611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90613f5a565b60405180910390fd5b611172600061200f565b565b61117c611b3f565b73ffffffffffffffffffffffffffffffffffffffff1661119a61123d565b73ffffffffffffffffffffffffffffffffffffffff16146111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e790613f5a565b60405180910390fd5b60008111611233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122a90613f3a565b60405180910390fd5b8060058190555050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61119481565b603281565b60065481565b8173ffffffffffffffffffffffffffffffffffffffff16611297611b3f565b73ffffffffffffffffffffffffffffffffffffffff1614156112ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e59061401a565b60405180910390fd5b80600260006112fb611b3f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113a8611b3f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113ed9190613c18565b60405180910390a35050565b611401611b3f565b73ffffffffffffffffffffffffffffffffffffffff1661141f61123d565b73ffffffffffffffffffffffffffffffffffffffff1614611475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146c90613f5a565b60405180910390fd5b801515600860009054906101000a900460ff16151514156114cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c290613e7a565b60405180910390fd5b80600860006101000a81548160ff02191690831515021790555050565b6002600054141561152e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115259061409a565b60405180910390fd5b6002600081905550600860019054906101000a900460ff16611585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157c90613eba565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146115f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ea90613efa565b60405180910390fd5b6005548361160233600161064f565b61160c9190614259565b111561164d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164490613d7a565b60405180910390fd5b60008311801561166e575066b1a2bc2ec500008361166b91906142af565b34145b6116ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a490613dda565b60405180910390fd5b6116b83384846120d5565b6116f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ee90613ffa565b60405180910390fd5b6117018282612110565b611740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173790613d5a565b60405180910390fd5b6007600083815260200190815260200160002060009054906101000a900460ff16156117a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179890613dba565b60405180910390fd5b611194836006546117b29190614259565b11156117f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ea90613f9a565b60405180910390fd5b60016007600084815260200190815260200160002060006101000a81548160ff02191690831515021790555082600660008282546118319190614259565b925050819055506118543360018560405180602001604052806000815250611b61565b6001600081905550505050565b66b1a2bc2ec5000081565b60006118798585856120d5565b801561188b575061188a8383612110565b5b9050949350505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611931611b3f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611977575061197685611971611b3f565b611895565b5b6119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad90613d9a565b60405180910390fd5b6119c3858585858561217c565b5050505050565b6119d2611b3f565b73ffffffffffffffffffffffffffffffffffffffff166119f061123d565b73ffffffffffffffffffffffffffffffffffffffff1614611a46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3d90613f5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90613d3a565b60405180910390fd5b611abf8161200f565b50565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b8060039080519060200190611b5d929190612c5b565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc89061407a565b60405180910390fd5b6000611bdb611b3f565b9050611bfc81600087611bed88612401565b611bf688612401565b8761247b565b826001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c5c9190614259565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051611cda9291906140d5565b60405180910390a4611cf181600087878787612483565b5050505050565b8151835114611d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d339061405a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da390613e3a565b60405180910390fd5b6000611db6611b3f565b9050611dc681878787878761247b565b60005b8451811015611f7a576000858281518110611de757611de661452b565b5b602002602001015190506000858381518110611e0657611e0561452b565b5b6020026020010151905060006001600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9f90613f1a565b60405180910390fd5b8181036001600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816001600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f5f9190614259565b9250508190555050505080611f739061444b565b9050611dc9565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611ff1929190613be1565b60405180910390a461200781878787878761266a565b505050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008084846040516020016120eb929190613b96565b6040516020818303038152906040528051906020012090508281149150509392505050565b600061212461211e84612851565b83612881565b73ffffffffffffffffffffffffffffffffffffffff16600860029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e390613e3a565b60405180910390fd5b60006121f6611b3f565b905061221681878761220788612401565b61221088612401565b8761247b565b60006001600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156122ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a590613f1a565b60405180910390fd5b8381036001600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836001600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123659190614259565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516123e29291906140d5565b60405180910390a46123f8828888888888612483565b50505050505050565b60606000600167ffffffffffffffff8111156124205761241f61455a565b5b60405190808252806020026020018201604052801561244e5781602001602082028036833780820191505090505b50905082816000815181106124665761246561452b565b5b60200260200101818152505080915050919050565b505050505050565b6124a28473ffffffffffffffffffffffffffffffffffffffff16611ac2565b15612662578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016124e8959493929190613b3c565b602060405180830381600087803b15801561250257600080fd5b505af192505050801561253357506040513d601f19601f820116820180604052508101906125309190613382565b60015b6125d95761253f614589565b806308c379a0141561259c5750612554614d68565b8061255f575061259e565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125939190613c78565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d090613cba565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265790613cda565b60405180910390fd5b505b505050505050565b6126898473ffffffffffffffffffffffffffffffffffffffff16611ac2565b15612849578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016126cf959493929190613ad4565b602060405180830381600087803b1580156126e957600080fd5b505af192505050801561271a57506040513d601f19601f820116820180604052508101906127179190613382565b60015b6127c057612726614589565b806308c379a01415612783575061273b614d68565b806127465750612785565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277a9190613c78565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b790613cba565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283e90613cda565b60405180910390fd5b505b505050505050565b6000816040516020016128649190613a93565b604051602081830303815290604052805190602001209050919050565b600080600061289085856128a8565b9150915061289d8161292b565b819250505092915050565b6000806041835114156128ea5760008060006020860151925060408601519150606086015160001a90506128de87828585612b00565b94509450505050612924565b60408351141561291b576000806020850151915060408501519050612910868383612c0d565b935093505050612924565b60006002915091505b9250929050565b6000600481111561293f5761293e6144cd565b5b816004811115612952576129516144cd565b5b141561295d57612afd565b60016004811115612971576129706144cd565b5b816004811115612984576129836144cd565b5b14156129c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129bc90613c9a565b60405180910390fd5b600260048111156129d9576129d86144cd565b5b8160048111156129ec576129eb6144cd565b5b1415612a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2490613cfa565b60405180910390fd5b60036004811115612a4157612a406144cd565b5b816004811115612a5457612a536144cd565b5b1415612a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8c90613e1a565b60405180910390fd5b600480811115612aa857612aa76144cd565b5b816004811115612abb57612aba6144cd565b5b1415612afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af390613e9a565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612b3b576000600391509150612c04565b601b8560ff1614158015612b535750601c8560ff1614155b15612b65576000600491509150612c04565b600060018787878760405160008152602001604052604051612b8a9493929190613c33565b6020604051602081039080840390855afa158015612bac573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612bfb57600060019250925050612c04565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050612c4d87828885612b00565b935093505050935093915050565b828054612c67906143e8565b90600052602060002090601f016020900481019282612c895760008555612cd0565b82601f10612ca257805160ff1916838001178555612cd0565b82800160010185558215612cd0579182015b82811115612ccf578251825591602001919060010190612cb4565b5b509050612cdd9190612ce1565b5090565b5b80821115612cfa576000816000905550600101612ce2565b5090565b6000612d11612d0c84614123565b6140fe565b90508083825260208201905082856020860282011115612d3457612d336145b0565b5b60005b85811015612d645781612d4a8882612e62565b845260208401935060208301925050600181019050612d37565b5050509392505050565b6000612d81612d7c8461414f565b6140fe565b90508083825260208201905082856020860282011115612da457612da36145b0565b5b60005b85811015612dd45781612dba8882612f98565b845260208401935060208301925050600181019050612da7565b5050509392505050565b6000612df1612dec8461417b565b6140fe565b905082815260208101848484011115612e0d57612e0c6145b5565b5b612e188482856143a6565b509392505050565b6000612e33612e2e846141ac565b6140fe565b905082815260208101848484011115612e4f57612e4e6145b5565b5b612e5a8482856143a6565b509392505050565b600081359050612e7181614dfe565b92915050565b600081359050612e8681614e15565b92915050565b600082601f830112612ea157612ea06145ab565b5b8135612eb1848260208601612cfe565b91505092915050565b600082601f830112612ecf57612ece6145ab565b5b8135612edf848260208601612d6e565b91505092915050565b600081359050612ef781614e2c565b92915050565b600081359050612f0c81614e43565b92915050565b600081359050612f2181614e5a565b92915050565b600081519050612f3681614e5a565b92915050565b600082601f830112612f5157612f506145ab565b5b8135612f61848260208601612dde565b91505092915050565b600082601f830112612f7f57612f7e6145ab565b5b8135612f8f848260208601612e20565b91505092915050565b600081359050612fa781614e71565b92915050565b600060208284031215612fc357612fc26145bf565b5b6000612fd184828501612e62565b91505092915050565b600060208284031215612ff057612fef6145bf565b5b6000612ffe84828501612e77565b91505092915050565b6000806040838503121561301e5761301d6145bf565b5b600061302c85828601612e62565b925050602061303d85828601612e62565b9150509250929050565b600080600080600060a08688031215613063576130626145bf565b5b600061307188828901612e62565b955050602061308288828901612e62565b945050604086013567ffffffffffffffff8111156130a3576130a26145ba565b5b6130af88828901612eba565b935050606086013567ffffffffffffffff8111156130d0576130cf6145ba565b5b6130dc88828901612eba565b925050608086013567ffffffffffffffff8111156130fd576130fc6145ba565b5b61310988828901612f3c565b9150509295509295909350565b600080600080600060a08688031215613132576131316145bf565b5b600061314088828901612e62565b955050602061315188828901612e62565b945050604061316288828901612f98565b935050606061317388828901612f98565b925050608086013567ffffffffffffffff811115613194576131936145ba565b5b6131a088828901612f3c565b9150509295509295909350565b600080604083850312156131c4576131c36145bf565b5b60006131d285828601612e62565b92505060206131e385828601612ee8565b9150509250929050565b60008060408385031215613204576132036145bf565b5b600061321285828601612e62565b925050602061322385828601612f98565b9150509250929050565b60008060008060808587031215613247576132466145bf565b5b600061325587828801612e62565b945050602061326687828801612f98565b935050604061327787828801612efd565b925050606085013567ffffffffffffffff811115613298576132976145ba565b5b6132a487828801612f3c565b91505092959194509250565b600080604083850312156132c7576132c66145bf565b5b600083013567ffffffffffffffff8111156132e5576132e46145ba565b5b6132f185828601612e8c565b925050602083013567ffffffffffffffff811115613312576133116145ba565b5b61331e85828601612eba565b9150509250929050565b60006020828403121561333e5761333d6145bf565b5b600061334c84828501612ee8565b91505092915050565b60006020828403121561336b5761336a6145bf565b5b600061337984828501612f12565b91505092915050565b600060208284031215613398576133976145bf565b5b60006133a684828501612f27565b91505092915050565b6000602082840312156133c5576133c46145bf565b5b600082013567ffffffffffffffff8111156133e3576133e26145ba565b5b6133ef84828501612f6a565b91505092915050565b60006020828403121561340e5761340d6145bf565b5b600061341c84828501612f98565b91505092915050565b60008060006060848603121561343e5761343d6145bf565b5b600061344c86828701612f98565b935050602061345d86828701612efd565b925050604084013567ffffffffffffffff81111561347e5761347d6145ba565b5b61348a86828701612f3c565b9150509250925092565b60006134a08383613a66565b60208301905092915050565b6134b581614309565b82525050565b60006134c6826141ed565b6134d0818561421b565b93506134db836141dd565b8060005b8381101561350c5781516134f38882613494565b97506134fe8361420e565b9250506001810190506134df565b5085935050505092915050565b6135228161432d565b82525050565b61353181614339565b82525050565b61354861354382614339565b614494565b82525050565b6000613559826141f8565b613563818561422c565b93506135738185602086016143b5565b61357c816145c4565b840191505092915050565b600061359282614203565b61359c818561423d565b93506135ac8185602086016143b5565b6135b5816145c4565b840191505092915050565b60006135cd60188361423d565b91506135d8826145e2565b602082019050919050565b60006135f060348361423d565b91506135fb8261460b565b604082019050919050565b600061361360288361423d565b915061361e8261465a565b604082019050919050565b6000613636601f8361423d565b9150613641826146a9565b602082019050919050565b6000613659601c8361424e565b9150613664826146d2565b601c82019050919050565b600061367c602b8361423d565b9150613687826146fb565b604082019050919050565b600061369f60268361423d565b91506136aa8261474a565b604082019050919050565b60006136c2600e8361423d565b91506136cd82614799565b602082019050919050565b60006136e560178361423d565b91506136f0826147c2565b602082019050919050565b600061370860298361423d565b9150613713826147eb565b604082019050919050565b600061372b60128361423d565b91506137368261483a565b602082019050919050565b600061374e60108361423d565b915061375982614863565b602082019050919050565b600061377160178361423d565b915061377c8261488c565b602082019050919050565b600061379460228361423d565b915061379f826148b5565b604082019050919050565b60006137b760258361423d565b91506137c282614904565b604082019050919050565b60006137da60328361423d565b91506137e582614953565b604082019050919050565b60006137fd60178361423d565b9150613808826149a2565b602082019050919050565b600061382060228361423d565b915061382b826149cb565b604082019050919050565b600061384360138361423d565b915061384e82614a1a565b602082019050919050565b6000613866601d8361423d565b915061387182614a43565b602082019050919050565b600061388960158361423d565b915061389482614a6c565b602082019050919050565b60006138ac602a8361423d565b91506138b782614a95565b604082019050919050565b60006138cf60128361423d565b91506138da82614ae4565b602082019050919050565b60006138f260208361423d565b91506138fd82614b0d565b602082019050919050565b600061391560138361423d565b915061392082614b36565b602082019050919050565b6000613938600d8361423d565b915061394382614b5f565b602082019050919050565b600061395b600d8361423d565b915061396682614b88565b602082019050919050565b600061397e601a8361423d565b915061398982614bb1565b602082019050919050565b60006139a1600c8361423d565b91506139ac82614bda565b602082019050919050565b60006139c460298361423d565b91506139cf82614c03565b604082019050919050565b60006139e760298361423d565b91506139f282614c52565b604082019050919050565b6000613a0a60288361423d565b9150613a1582614ca1565b604082019050919050565b6000613a2d60218361423d565b9150613a3882614cf0565b604082019050919050565b6000613a50601f8361423d565b9150613a5b82614d3f565b602082019050919050565b613a6f8161438f565b82525050565b613a7e8161438f565b82525050565b613a8d81614399565b82525050565b6000613a9e8261364c565b9150613aaa8284613537565b60208201915081905092915050565b6000602082019050613ace60008301846134ac565b92915050565b600060a082019050613ae960008301886134ac565b613af660208301876134ac565b8181036040830152613b0881866134bb565b90508181036060830152613b1c81856134bb565b90508181036080830152613b30818461354e565b90509695505050505050565b600060a082019050613b5160008301886134ac565b613b5e60208301876134ac565b613b6b6040830186613a75565b613b786060830185613a75565b8181036080830152613b8a818461354e565b90509695505050505050565b6000604082019050613bab60008301856134ac565b613bb86020830184613a75565b9392505050565b60006020820190508181036000830152613bd981846134bb565b905092915050565b60006040820190508181036000830152613bfb81856134bb565b90508181036020830152613c0f81846134bb565b90509392505050565b6000602082019050613c2d6000830184613519565b92915050565b6000608082019050613c486000830187613528565b613c556020830186613a84565b613c626040830185613528565b613c6f6060830184613528565b95945050505050565b60006020820190508181036000830152613c928184613587565b905092915050565b60006020820190508181036000830152613cb3816135c0565b9050919050565b60006020820190508181036000830152613cd3816135e3565b9050919050565b60006020820190508181036000830152613cf381613606565b9050919050565b60006020820190508181036000830152613d1381613629565b9050919050565b60006020820190508181036000830152613d338161366f565b9050919050565b60006020820190508181036000830152613d5381613692565b9050919050565b60006020820190508181036000830152613d73816136b5565b9050919050565b60006020820190508181036000830152613d93816136d8565b9050919050565b60006020820190508181036000830152613db3816136fb565b9050919050565b60006020820190508181036000830152613dd38161371e565b9050919050565b60006020820190508181036000830152613df381613741565b9050919050565b60006020820190508181036000830152613e1381613764565b9050919050565b60006020820190508181036000830152613e3381613787565b9050919050565b60006020820190508181036000830152613e53816137aa565b9050919050565b60006020820190508181036000830152613e73816137cd565b9050919050565b60006020820190508181036000830152613e93816137f0565b9050919050565b60006020820190508181036000830152613eb381613813565b9050919050565b60006020820190508181036000830152613ed381613836565b9050919050565b60006020820190508181036000830152613ef381613859565b9050919050565b60006020820190508181036000830152613f138161387c565b9050919050565b60006020820190508181036000830152613f338161389f565b9050919050565b60006020820190508181036000830152613f53816138c2565b9050919050565b60006020820190508181036000830152613f73816138e5565b9050919050565b60006020820190508181036000830152613f9381613908565b9050919050565b60006020820190508181036000830152613fb38161392b565b9050919050565b60006020820190508181036000830152613fd38161394e565b9050919050565b60006020820190508181036000830152613ff381613971565b9050919050565b6000602082019050818103600083015261401381613994565b9050919050565b60006020820190508181036000830152614033816139b7565b9050919050565b60006020820190508181036000830152614053816139da565b9050919050565b60006020820190508181036000830152614073816139fd565b9050919050565b6000602082019050818103600083015261409381613a20565b9050919050565b600060208201905081810360008301526140b381613a43565b9050919050565b60006020820190506140cf6000830184613a75565b92915050565b60006040820190506140ea6000830185613a75565b6140f76020830184613a75565b9392505050565b6000614108614119565b9050614114828261441a565b919050565b6000604051905090565b600067ffffffffffffffff82111561413e5761413d61455a565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561416a5761416961455a565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156141965761419561455a565b5b61419f826145c4565b9050602081019050919050565b600067ffffffffffffffff8211156141c7576141c661455a565b5b6141d0826145c4565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142648261438f565b915061426f8361438f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142a4576142a361449e565b5b828201905092915050565b60006142ba8261438f565b91506142c58361438f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142fe576142fd61449e565b5b828202905092915050565b60006143148261436f565b9050919050565b60006143268261436f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156143d35780820151818401526020810190506143b8565b838111156143e2576000848401525b50505050565b6000600282049050600182168061440057607f821691505b60208210811415614414576144136144fc565b5b50919050565b614423826145c4565b810181811067ffffffffffffffff821117156144425761444161455a565b5b80604052505050565b60006144568261438f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144895761448861449e565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156145a85760046000803e6145a56000516145d5565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f696e76616c6964207369676e6572000000000000000000000000000000000000600082015250565b7f4d61782050657220416464726573732072656163686564000000000000000000600082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f5f6861736820616c726561647920757365640000000000000000000000000000600082015250565b7f696e76616c6964206574682073656e7400000000000000000000000000000000600082015250565b7f5075626c69632073616c65206e6f742073746172746564000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f73616c655374617274656420616c726561647920736574000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c65206e6f74207374617274656400000000000000000000000000600082015250565b7f63616e6e6f7420776974686472617720746f2061646472657373283029000000600082015250565b7f50726576656e7420636f6e74726163742063616c6c0000000000000000000000600082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f6d61782063616e6e6f74206265206e756c6c0000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7369676e65722061646472657373206e756c6c00000000000000000000000000600082015250565b7f6d6178206b657920636172647300000000000000000000000000000000000000600082015250565b7f656d7074792062616c616e636500000000000000000000000000000000000000600082015250565b7f70726573616c655374617274656420616c726561647920736574000000000000600082015250565b7f696e76616c696420686173680000000000000000000000000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600060443d1015614d7857614dfb565b614d80614119565b60043d036004823e80513d602482011167ffffffffffffffff82111715614da8575050614dfb565b808201805167ffffffffffffffff811115614dc65750505050614dfb565b80602083010160043d038501811115614de3575050505050614dfb565b614df28260200185018661441a565b82955050505050505b90565b614e0781614309565b8114614e1257600080fd5b50565b614e1e8161431b565b8114614e2957600080fd5b50565b614e358161432d565b8114614e4057600080fd5b50565b614e4c81614339565b8114614e5757600080fd5b50565b614e6381614343565b8114614e6e57600080fd5b50565b614e7a8161438f565b8114614e8557600080fd5b5056fea264697066735822122031974169a0eae74f1c2d098f724a17b9a7441b7b4ae9987633f2799b008a927864736f6c6343000807003368747470733a2f2f697066732e696f2f697066732f516d5962575976343844574768356d544755446f39693545745a79537054565076346e4a3732413242357653754b3f66696c656e616d653d6a6b5f6d65746164617461253230636f70792e6a736f6e
Deployed Bytecode
0x60806040526004361061019b5760003560e01c8063715018a6116100ec578063a854ffba1161008a578063e256037111610064578063e256037114610583578063e985e9c5146105c0578063f242432a146105fd578063f2fde38b146106265761019b565b8063a854ffba14610513578063bf9b7c8d1461053c578063c002d23d146105585761019b565b80638e2b54b8116100c65780638e2b54b814610469578063948cd413146104945780639659867e146104bf578063a22cb465146104ea5761019b565b8063715018a6146103fe5780637bddd65b146104155780638da5cb5b1461043e5761019b565b80632db115441161015957806351cff8d91161013357806351cff8d9146103565780635c474f9e1461037f578063639814e0146103aa5780636ecbac79146103d55761019b565b80632db11544146102d45780632eb2c2d6146102f05780634e1273f4146103195761019b565b8062fdd58e146101a057806301ffc9a7146101dd57806302fe53051461021a57806304549d6f14610243578063046dc1661461026e5780630e89341c14610297575b600080fd5b3480156101ac57600080fd5b506101c760048036038101906101c291906131ed565b61064f565b6040516101d491906140ba565b60405180910390f35b3480156101e957600080fd5b5061020460048036038101906101ff9190613355565b610719565b6040516102119190613c18565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c91906133af565b6107fb565b005b34801561024f57600080fd5b50610258610883565b6040516102659190613c18565b60405180910390f35b34801561027a57600080fd5b5061029560048036038101906102909190612fad565b610896565b005b3480156102a357600080fd5b506102be60048036038101906102b991906133f8565b6109c6565b6040516102cb9190613c78565b60405180910390f35b6102ee60048036038101906102e991906133f8565b610a5a565b005b3480156102fc57600080fd5b5061031760048036038101906103129190613047565b610cb1565b005b34801561032557600080fd5b50610340600480360381019061033b91906132b0565b610d52565b60405161034d9190613bbf565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190612fda565b610e6b565b005b34801561038b57600080fd5b50610394610fe4565b6040516103a19190613c18565b60405180910390f35b3480156103b657600080fd5b506103bf610ff7565b6040516103cc91906140ba565b60405180910390f35b3480156103e157600080fd5b506103fc60048036038101906103f79190613328565b610ffd565b005b34801561040a57600080fd5b506104136110ec565b005b34801561042157600080fd5b5061043c600480360381019061043791906133f8565b611174565b005b34801561044a57600080fd5b5061045361123d565b6040516104609190613ab9565b60405180910390f35b34801561047557600080fd5b5061047e611267565b60405161048b91906140ba565b60405180910390f35b3480156104a057600080fd5b506104a961126d565b6040516104b691906140ba565b60405180910390f35b3480156104cb57600080fd5b506104d4611272565b6040516104e191906140ba565b60405180910390f35b3480156104f657600080fd5b50610511600480360381019061050c91906131ad565b611278565b005b34801561051f57600080fd5b5061053a60048036038101906105359190613328565b6113f9565b005b61055660048036038101906105519190613425565b6114e8565b005b34801561056457600080fd5b5061056d611861565b60405161057a91906140ba565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a5919061322d565b61186c565b6040516105b79190613c18565b60405180910390f35b3480156105cc57600080fd5b506105e760048036038101906105e29190613007565b611895565b6040516105f49190613c18565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f9190613116565b611929565b005b34801561063257600080fd5b5061064d60048036038101906106489190612fad565b6119ca565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b790613d1a565b60405180910390fd5b6001600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107e457507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107f457506107f382611ad5565b5b9050919050565b610803611b3f565b73ffffffffffffffffffffffffffffffffffffffff1661082161123d565b73ffffffffffffffffffffffffffffffffffffffff1614610877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086e90613f5a565b60405180910390fd5b61088081611b47565b50565b600860019054906101000a900460ff1681565b61089e611b3f565b73ffffffffffffffffffffffffffffffffffffffff166108bc61123d565b73ffffffffffffffffffffffffffffffffffffffff1614610912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090990613f5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097990613f7a565b60405180910390fd5b80600860026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600380546109d5906143e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a01906143e8565b8015610a4e5780601f10610a2357610100808354040283529160200191610a4e565b820191906000526020600020905b815481529060010190602001808311610a3157829003601f168201915b50505050509050919050565b60026000541415610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a979061409a565b60405180910390fd5b6002600081905550600860009054906101000a900460ff16610af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aee90613dfa565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c90613efa565b60405180910390fd5b60055481610b7433600161064f565b610b7e9190614259565b1115610bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb690613d7a565b60405180910390fd5b600081118015610be0575066b1a2bc2ec5000081610bdd91906142af565b34145b610c1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1690613dda565b60405180910390fd5b61119481600654610c309190614259565b1115610c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6890613f9a565b60405180910390fd5b8060066000828254610c839190614259565b92505081905550610ca63360018360405180602001604052806000815250611b61565b600160008190555050565b610cb9611b3f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610cff5750610cfe85610cf9611b3f565b611895565b5b610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3590613e5a565b60405180910390fd5b610d4b8585858585611cf8565b5050505050565b60608151835114610d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8f9061403a565b60405180910390fd5b6000835167ffffffffffffffff811115610db557610db461455a565b5b604051908082528060200260200182016040528015610de35781602001602082028036833780820191505090505b50905060005b8451811015610e6057610e30858281518110610e0857610e0761452b565b5b6020026020010151858381518110610e2357610e2261452b565b5b602002602001015161064f565b828281518110610e4357610e4261452b565b5b60200260200101818152505080610e599061444b565b9050610de9565b508091505092915050565b610e73611b3f565b73ffffffffffffffffffffffffffffffffffffffff16610e9161123d565b73ffffffffffffffffffffffffffffffffffffffff1614610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede90613f5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e90613eda565b60405180910390fd5b60004711610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9190613fba565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610fe0573d6000803e3d6000fd5b5050565b600860009054906101000a900460ff1681565b60055481565b611005611b3f565b73ffffffffffffffffffffffffffffffffffffffff1661102361123d565b73ffffffffffffffffffffffffffffffffffffffff1614611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107090613f5a565b60405180910390fd5b801515600860019054906101000a900460ff16151514156110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c690613fda565b60405180910390fd5b80600860016101000a81548160ff02191690831515021790555050565b6110f4611b3f565b73ffffffffffffffffffffffffffffffffffffffff1661111261123d565b73ffffffffffffffffffffffffffffffffffffffff1614611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90613f5a565b60405180910390fd5b611172600061200f565b565b61117c611b3f565b73ffffffffffffffffffffffffffffffffffffffff1661119a61123d565b73ffffffffffffffffffffffffffffffffffffffff16146111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e790613f5a565b60405180910390fd5b60008111611233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122a90613f3a565b60405180910390fd5b8060058190555050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61119481565b603281565b60065481565b8173ffffffffffffffffffffffffffffffffffffffff16611297611b3f565b73ffffffffffffffffffffffffffffffffffffffff1614156112ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e59061401a565b60405180910390fd5b80600260006112fb611b3f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113a8611b3f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113ed9190613c18565b60405180910390a35050565b611401611b3f565b73ffffffffffffffffffffffffffffffffffffffff1661141f61123d565b73ffffffffffffffffffffffffffffffffffffffff1614611475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146c90613f5a565b60405180910390fd5b801515600860009054906101000a900460ff16151514156114cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c290613e7a565b60405180910390fd5b80600860006101000a81548160ff02191690831515021790555050565b6002600054141561152e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115259061409a565b60405180910390fd5b6002600081905550600860019054906101000a900460ff16611585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157c90613eba565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146115f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ea90613efa565b60405180910390fd5b6005548361160233600161064f565b61160c9190614259565b111561164d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164490613d7a565b60405180910390fd5b60008311801561166e575066b1a2bc2ec500008361166b91906142af565b34145b6116ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a490613dda565b60405180910390fd5b6116b83384846120d5565b6116f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ee90613ffa565b60405180910390fd5b6117018282612110565b611740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173790613d5a565b60405180910390fd5b6007600083815260200190815260200160002060009054906101000a900460ff16156117a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179890613dba565b60405180910390fd5b611194836006546117b29190614259565b11156117f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ea90613f9a565b60405180910390fd5b60016007600084815260200190815260200160002060006101000a81548160ff02191690831515021790555082600660008282546118319190614259565b925050819055506118543360018560405180602001604052806000815250611b61565b6001600081905550505050565b66b1a2bc2ec5000081565b60006118798585856120d5565b801561188b575061188a8383612110565b5b9050949350505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611931611b3f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611977575061197685611971611b3f565b611895565b5b6119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad90613d9a565b60405180910390fd5b6119c3858585858561217c565b5050505050565b6119d2611b3f565b73ffffffffffffffffffffffffffffffffffffffff166119f061123d565b73ffffffffffffffffffffffffffffffffffffffff1614611a46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3d90613f5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90613d3a565b60405180910390fd5b611abf8161200f565b50565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b8060039080519060200190611b5d929190612c5b565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc89061407a565b60405180910390fd5b6000611bdb611b3f565b9050611bfc81600087611bed88612401565b611bf688612401565b8761247b565b826001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c5c9190614259565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051611cda9291906140d5565b60405180910390a4611cf181600087878787612483565b5050505050565b8151835114611d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d339061405a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da390613e3a565b60405180910390fd5b6000611db6611b3f565b9050611dc681878787878761247b565b60005b8451811015611f7a576000858281518110611de757611de661452b565b5b602002602001015190506000858381518110611e0657611e0561452b565b5b6020026020010151905060006001600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9f90613f1a565b60405180910390fd5b8181036001600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816001600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f5f9190614259565b9250508190555050505080611f739061444b565b9050611dc9565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611ff1929190613be1565b60405180910390a461200781878787878761266a565b505050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008084846040516020016120eb929190613b96565b6040516020818303038152906040528051906020012090508281149150509392505050565b600061212461211e84612851565b83612881565b73ffffffffffffffffffffffffffffffffffffffff16600860029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e390613e3a565b60405180910390fd5b60006121f6611b3f565b905061221681878761220788612401565b61221088612401565b8761247b565b60006001600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156122ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a590613f1a565b60405180910390fd5b8381036001600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836001600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123659190614259565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516123e29291906140d5565b60405180910390a46123f8828888888888612483565b50505050505050565b60606000600167ffffffffffffffff8111156124205761241f61455a565b5b60405190808252806020026020018201604052801561244e5781602001602082028036833780820191505090505b50905082816000815181106124665761246561452b565b5b60200260200101818152505080915050919050565b505050505050565b6124a28473ffffffffffffffffffffffffffffffffffffffff16611ac2565b15612662578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016124e8959493929190613b3c565b602060405180830381600087803b15801561250257600080fd5b505af192505050801561253357506040513d601f19601f820116820180604052508101906125309190613382565b60015b6125d95761253f614589565b806308c379a0141561259c5750612554614d68565b8061255f575061259e565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125939190613c78565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d090613cba565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265790613cda565b60405180910390fd5b505b505050505050565b6126898473ffffffffffffffffffffffffffffffffffffffff16611ac2565b15612849578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016126cf959493929190613ad4565b602060405180830381600087803b1580156126e957600080fd5b505af192505050801561271a57506040513d601f19601f820116820180604052508101906127179190613382565b60015b6127c057612726614589565b806308c379a01415612783575061273b614d68565b806127465750612785565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277a9190613c78565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b790613cba565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283e90613cda565b60405180910390fd5b505b505050505050565b6000816040516020016128649190613a93565b604051602081830303815290604052805190602001209050919050565b600080600061289085856128a8565b9150915061289d8161292b565b819250505092915050565b6000806041835114156128ea5760008060006020860151925060408601519150606086015160001a90506128de87828585612b00565b94509450505050612924565b60408351141561291b576000806020850151915060408501519050612910868383612c0d565b935093505050612924565b60006002915091505b9250929050565b6000600481111561293f5761293e6144cd565b5b816004811115612952576129516144cd565b5b141561295d57612afd565b60016004811115612971576129706144cd565b5b816004811115612984576129836144cd565b5b14156129c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129bc90613c9a565b60405180910390fd5b600260048111156129d9576129d86144cd565b5b8160048111156129ec576129eb6144cd565b5b1415612a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2490613cfa565b60405180910390fd5b60036004811115612a4157612a406144cd565b5b816004811115612a5457612a536144cd565b5b1415612a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8c90613e1a565b60405180910390fd5b600480811115612aa857612aa76144cd565b5b816004811115612abb57612aba6144cd565b5b1415612afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af390613e9a565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612b3b576000600391509150612c04565b601b8560ff1614158015612b535750601c8560ff1614155b15612b65576000600491509150612c04565b600060018787878760405160008152602001604052604051612b8a9493929190613c33565b6020604051602081039080840390855afa158015612bac573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612bfb57600060019250925050612c04565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050612c4d87828885612b00565b935093505050935093915050565b828054612c67906143e8565b90600052602060002090601f016020900481019282612c895760008555612cd0565b82601f10612ca257805160ff1916838001178555612cd0565b82800160010185558215612cd0579182015b82811115612ccf578251825591602001919060010190612cb4565b5b509050612cdd9190612ce1565b5090565b5b80821115612cfa576000816000905550600101612ce2565b5090565b6000612d11612d0c84614123565b6140fe565b90508083825260208201905082856020860282011115612d3457612d336145b0565b5b60005b85811015612d645781612d4a8882612e62565b845260208401935060208301925050600181019050612d37565b5050509392505050565b6000612d81612d7c8461414f565b6140fe565b90508083825260208201905082856020860282011115612da457612da36145b0565b5b60005b85811015612dd45781612dba8882612f98565b845260208401935060208301925050600181019050612da7565b5050509392505050565b6000612df1612dec8461417b565b6140fe565b905082815260208101848484011115612e0d57612e0c6145b5565b5b612e188482856143a6565b509392505050565b6000612e33612e2e846141ac565b6140fe565b905082815260208101848484011115612e4f57612e4e6145b5565b5b612e5a8482856143a6565b509392505050565b600081359050612e7181614dfe565b92915050565b600081359050612e8681614e15565b92915050565b600082601f830112612ea157612ea06145ab565b5b8135612eb1848260208601612cfe565b91505092915050565b600082601f830112612ecf57612ece6145ab565b5b8135612edf848260208601612d6e565b91505092915050565b600081359050612ef781614e2c565b92915050565b600081359050612f0c81614e43565b92915050565b600081359050612f2181614e5a565b92915050565b600081519050612f3681614e5a565b92915050565b600082601f830112612f5157612f506145ab565b5b8135612f61848260208601612dde565b91505092915050565b600082601f830112612f7f57612f7e6145ab565b5b8135612f8f848260208601612e20565b91505092915050565b600081359050612fa781614e71565b92915050565b600060208284031215612fc357612fc26145bf565b5b6000612fd184828501612e62565b91505092915050565b600060208284031215612ff057612fef6145bf565b5b6000612ffe84828501612e77565b91505092915050565b6000806040838503121561301e5761301d6145bf565b5b600061302c85828601612e62565b925050602061303d85828601612e62565b9150509250929050565b600080600080600060a08688031215613063576130626145bf565b5b600061307188828901612e62565b955050602061308288828901612e62565b945050604086013567ffffffffffffffff8111156130a3576130a26145ba565b5b6130af88828901612eba565b935050606086013567ffffffffffffffff8111156130d0576130cf6145ba565b5b6130dc88828901612eba565b925050608086013567ffffffffffffffff8111156130fd576130fc6145ba565b5b61310988828901612f3c565b9150509295509295909350565b600080600080600060a08688031215613132576131316145bf565b5b600061314088828901612e62565b955050602061315188828901612e62565b945050604061316288828901612f98565b935050606061317388828901612f98565b925050608086013567ffffffffffffffff811115613194576131936145ba565b5b6131a088828901612f3c565b9150509295509295909350565b600080604083850312156131c4576131c36145bf565b5b60006131d285828601612e62565b92505060206131e385828601612ee8565b9150509250929050565b60008060408385031215613204576132036145bf565b5b600061321285828601612e62565b925050602061322385828601612f98565b9150509250929050565b60008060008060808587031215613247576132466145bf565b5b600061325587828801612e62565b945050602061326687828801612f98565b935050604061327787828801612efd565b925050606085013567ffffffffffffffff811115613298576132976145ba565b5b6132a487828801612f3c565b91505092959194509250565b600080604083850312156132c7576132c66145bf565b5b600083013567ffffffffffffffff8111156132e5576132e46145ba565b5b6132f185828601612e8c565b925050602083013567ffffffffffffffff811115613312576133116145ba565b5b61331e85828601612eba565b9150509250929050565b60006020828403121561333e5761333d6145bf565b5b600061334c84828501612ee8565b91505092915050565b60006020828403121561336b5761336a6145bf565b5b600061337984828501612f12565b91505092915050565b600060208284031215613398576133976145bf565b5b60006133a684828501612f27565b91505092915050565b6000602082840312156133c5576133c46145bf565b5b600082013567ffffffffffffffff8111156133e3576133e26145ba565b5b6133ef84828501612f6a565b91505092915050565b60006020828403121561340e5761340d6145bf565b5b600061341c84828501612f98565b91505092915050565b60008060006060848603121561343e5761343d6145bf565b5b600061344c86828701612f98565b935050602061345d86828701612efd565b925050604084013567ffffffffffffffff81111561347e5761347d6145ba565b5b61348a86828701612f3c565b9150509250925092565b60006134a08383613a66565b60208301905092915050565b6134b581614309565b82525050565b60006134c6826141ed565b6134d0818561421b565b93506134db836141dd565b8060005b8381101561350c5781516134f38882613494565b97506134fe8361420e565b9250506001810190506134df565b5085935050505092915050565b6135228161432d565b82525050565b61353181614339565b82525050565b61354861354382614339565b614494565b82525050565b6000613559826141f8565b613563818561422c565b93506135738185602086016143b5565b61357c816145c4565b840191505092915050565b600061359282614203565b61359c818561423d565b93506135ac8185602086016143b5565b6135b5816145c4565b840191505092915050565b60006135cd60188361423d565b91506135d8826145e2565b602082019050919050565b60006135f060348361423d565b91506135fb8261460b565b604082019050919050565b600061361360288361423d565b915061361e8261465a565b604082019050919050565b6000613636601f8361423d565b9150613641826146a9565b602082019050919050565b6000613659601c8361424e565b9150613664826146d2565b601c82019050919050565b600061367c602b8361423d565b9150613687826146fb565b604082019050919050565b600061369f60268361423d565b91506136aa8261474a565b604082019050919050565b60006136c2600e8361423d565b91506136cd82614799565b602082019050919050565b60006136e560178361423d565b91506136f0826147c2565b602082019050919050565b600061370860298361423d565b9150613713826147eb565b604082019050919050565b600061372b60128361423d565b91506137368261483a565b602082019050919050565b600061374e60108361423d565b915061375982614863565b602082019050919050565b600061377160178361423d565b915061377c8261488c565b602082019050919050565b600061379460228361423d565b915061379f826148b5565b604082019050919050565b60006137b760258361423d565b91506137c282614904565b604082019050919050565b60006137da60328361423d565b91506137e582614953565b604082019050919050565b60006137fd60178361423d565b9150613808826149a2565b602082019050919050565b600061382060228361423d565b915061382b826149cb565b604082019050919050565b600061384360138361423d565b915061384e82614a1a565b602082019050919050565b6000613866601d8361423d565b915061387182614a43565b602082019050919050565b600061388960158361423d565b915061389482614a6c565b602082019050919050565b60006138ac602a8361423d565b91506138b782614a95565b604082019050919050565b60006138cf60128361423d565b91506138da82614ae4565b602082019050919050565b60006138f260208361423d565b91506138fd82614b0d565b602082019050919050565b600061391560138361423d565b915061392082614b36565b602082019050919050565b6000613938600d8361423d565b915061394382614b5f565b602082019050919050565b600061395b600d8361423d565b915061396682614b88565b602082019050919050565b600061397e601a8361423d565b915061398982614bb1565b602082019050919050565b60006139a1600c8361423d565b91506139ac82614bda565b602082019050919050565b60006139c460298361423d565b91506139cf82614c03565b604082019050919050565b60006139e760298361423d565b91506139f282614c52565b604082019050919050565b6000613a0a60288361423d565b9150613a1582614ca1565b604082019050919050565b6000613a2d60218361423d565b9150613a3882614cf0565b604082019050919050565b6000613a50601f8361423d565b9150613a5b82614d3f565b602082019050919050565b613a6f8161438f565b82525050565b613a7e8161438f565b82525050565b613a8d81614399565b82525050565b6000613a9e8261364c565b9150613aaa8284613537565b60208201915081905092915050565b6000602082019050613ace60008301846134ac565b92915050565b600060a082019050613ae960008301886134ac565b613af660208301876134ac565b8181036040830152613b0881866134bb565b90508181036060830152613b1c81856134bb565b90508181036080830152613b30818461354e565b90509695505050505050565b600060a082019050613b5160008301886134ac565b613b5e60208301876134ac565b613b6b6040830186613a75565b613b786060830185613a75565b8181036080830152613b8a818461354e565b90509695505050505050565b6000604082019050613bab60008301856134ac565b613bb86020830184613a75565b9392505050565b60006020820190508181036000830152613bd981846134bb565b905092915050565b60006040820190508181036000830152613bfb81856134bb565b90508181036020830152613c0f81846134bb565b90509392505050565b6000602082019050613c2d6000830184613519565b92915050565b6000608082019050613c486000830187613528565b613c556020830186613a84565b613c626040830185613528565b613c6f6060830184613528565b95945050505050565b60006020820190508181036000830152613c928184613587565b905092915050565b60006020820190508181036000830152613cb3816135c0565b9050919050565b60006020820190508181036000830152613cd3816135e3565b9050919050565b60006020820190508181036000830152613cf381613606565b9050919050565b60006020820190508181036000830152613d1381613629565b9050919050565b60006020820190508181036000830152613d338161366f565b9050919050565b60006020820190508181036000830152613d5381613692565b9050919050565b60006020820190508181036000830152613d73816136b5565b9050919050565b60006020820190508181036000830152613d93816136d8565b9050919050565b60006020820190508181036000830152613db3816136fb565b9050919050565b60006020820190508181036000830152613dd38161371e565b9050919050565b60006020820190508181036000830152613df381613741565b9050919050565b60006020820190508181036000830152613e1381613764565b9050919050565b60006020820190508181036000830152613e3381613787565b9050919050565b60006020820190508181036000830152613e53816137aa565b9050919050565b60006020820190508181036000830152613e73816137cd565b9050919050565b60006020820190508181036000830152613e93816137f0565b9050919050565b60006020820190508181036000830152613eb381613813565b9050919050565b60006020820190508181036000830152613ed381613836565b9050919050565b60006020820190508181036000830152613ef381613859565b9050919050565b60006020820190508181036000830152613f138161387c565b9050919050565b60006020820190508181036000830152613f338161389f565b9050919050565b60006020820190508181036000830152613f53816138c2565b9050919050565b60006020820190508181036000830152613f73816138e5565b9050919050565b60006020820190508181036000830152613f9381613908565b9050919050565b60006020820190508181036000830152613fb38161392b565b9050919050565b60006020820190508181036000830152613fd38161394e565b9050919050565b60006020820190508181036000830152613ff381613971565b9050919050565b6000602082019050818103600083015261401381613994565b9050919050565b60006020820190508181036000830152614033816139b7565b9050919050565b60006020820190508181036000830152614053816139da565b9050919050565b60006020820190508181036000830152614073816139fd565b9050919050565b6000602082019050818103600083015261409381613a20565b9050919050565b600060208201905081810360008301526140b381613a43565b9050919050565b60006020820190506140cf6000830184613a75565b92915050565b60006040820190506140ea6000830185613a75565b6140f76020830184613a75565b9392505050565b6000614108614119565b9050614114828261441a565b919050565b6000604051905090565b600067ffffffffffffffff82111561413e5761413d61455a565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561416a5761416961455a565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156141965761419561455a565b5b61419f826145c4565b9050602081019050919050565b600067ffffffffffffffff8211156141c7576141c661455a565b5b6141d0826145c4565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142648261438f565b915061426f8361438f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142a4576142a361449e565b5b828201905092915050565b60006142ba8261438f565b91506142c58361438f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142fe576142fd61449e565b5b828202905092915050565b60006143148261436f565b9050919050565b60006143268261436f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156143d35780820151818401526020810190506143b8565b838111156143e2576000848401525b50505050565b6000600282049050600182168061440057607f821691505b60208210811415614414576144136144fc565b5b50919050565b614423826145c4565b810181811067ffffffffffffffff821117156144425761444161455a565b5b80604052505050565b60006144568261438f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144895761448861449e565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156145a85760046000803e6145a56000516145d5565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f696e76616c6964207369676e6572000000000000000000000000000000000000600082015250565b7f4d61782050657220416464726573732072656163686564000000000000000000600082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f5f6861736820616c726561647920757365640000000000000000000000000000600082015250565b7f696e76616c6964206574682073656e7400000000000000000000000000000000600082015250565b7f5075626c69632073616c65206e6f742073746172746564000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f73616c655374617274656420616c726561647920736574000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c65206e6f74207374617274656400000000000000000000000000600082015250565b7f63616e6e6f7420776974686472617720746f2061646472657373283029000000600082015250565b7f50726576656e7420636f6e74726163742063616c6c0000000000000000000000600082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f6d61782063616e6e6f74206265206e756c6c0000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7369676e65722061646472657373206e756c6c00000000000000000000000000600082015250565b7f6d6178206b657920636172647300000000000000000000000000000000000000600082015250565b7f656d7074792062616c616e636500000000000000000000000000000000000000600082015250565b7f70726573616c655374617274656420616c726561647920736574000000000000600082015250565b7f696e76616c696420686173680000000000000000000000000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600060443d1015614d7857614dfb565b614d80614119565b60043d036004823e80513d602482011167ffffffffffffffff82111715614da8575050614dfb565b808201805167ffffffffffffffff811115614dc65750505050614dfb565b80602083010160043d038501811115614de3575050505050614dfb565b614df28260200185018661441a565b82955050505050505b90565b614e0781614309565b8114614e1257600080fd5b50565b614e1e8161431b565b8114614e2957600080fd5b50565b614e358161432d565b8114614e4057600080fd5b50565b614e4c81614339565b8114614e5757600080fd5b50565b614e6381614343565b8114614e6e57600080fd5b50565b614e7a8161438f565b8114614e8557600080fd5b5056fea264697066735822122031974169a0eae74f1c2d098f724a17b9a7441b7b4ae9987633f2799b008a927864736f6c63430008070033
Deployed Bytecode Sourcemap
47858:3958:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20022:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19045:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50754:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48235:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51488:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19766:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49512:546;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22117:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20419:524;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50853:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48197:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48072:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51291:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43981:94;;;;;;;;;;;;;:::i;:::-;;51665:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43330:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47923:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48028:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48111:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21016:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51105:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48651:853;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47974:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50467:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21399:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21639:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44230:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20022:231;20108:7;20155:1;20136:21;;:7;:21;;;;20128:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;20223:9;:13;20233:2;20223:13;;;;;;;;;;;:22;20237:7;20223:22;;;;;;;;;;;;;;;;20216:29;;20022:231;;;;:::o;19045:310::-;19147:4;19199:26;19184:41;;;:11;:41;;;;:110;;;;19257:37;19242:52;;;:11;:52;;;;19184:110;:163;;;;19311:36;19335:11;19311:23;:36::i;:::-;19184:163;19164:183;;19045:310;;;:::o;50754:91::-;43561:12;:10;:12::i;:::-;43550:23;;:7;:5;:7::i;:::-;:23;;;43542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50822:15:::1;50830:6;50822:7;:15::i;:::-;50754:91:::0;:::o;48235:34::-;;;;;;;;;;;;;:::o;51488:169::-;43561:12;:10;:12::i;:::-;43550:23;;:7;:5;:7::i;:::-;:23;;;43542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51588:1:::1;51569:21;;:7;:21;;;;51561:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;51642:7;51625:14;;:24;;;;;;;;;;;;;;;;;;51488:169:::0;:::o;19766:105::-;19826:13;19859:4;19852:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19766:105;;;:::o;49512:546::-;46363:1;46959:7;;:19;;46951:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46363:1;47092:7;:18;;;;49597:11:::1;;;;;;;;;;;49589:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;49668:10;49655:23;;:9;:23;;;49647:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49769:13;;49758:6;49724:31;49734:10;48312:1;49724:9;:31::i;:::-;:40;;;;:::i;:::-;49723:59;;49715:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;49838:1;49829:6;:10;:46;;;;;48011:10;49856:6;:19;;;;:::i;:::-;49843:9;:32;49829:46;49821:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;47963:4;49927:6;49915:9;;:18;;;;:::i;:::-;:35;;49907:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49994:6;49981:9;;:19;;;;;;;:::i;:::-;;;;;;;;50011:39;50017:10;48312:1;50039:6;50011:39;;;;;;;;;;;::::0;:5:::1;:39::i;:::-;46319:1:::0;47271:7;:22;;;;49512:546;:::o;22117:442::-;22358:12;:10;:12::i;:::-;22350:20;;:4;:20;;;:60;;;;22374:36;22391:4;22397:12;:10;:12::i;:::-;22374:16;:36::i;:::-;22350:60;22328:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;22499:52;22522:4;22528:2;22532:3;22537:7;22546:4;22499:22;:52::i;:::-;22117:442;;;;;:::o;20419:524::-;20575:16;20636:3;:10;20617:8;:15;:29;20609:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;20705:30;20752:8;:15;20738:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20705:63;;20786:9;20781:122;20805:8;:15;20801:1;:19;20781:122;;;20861:30;20871:8;20880:1;20871:11;;;;;;;;:::i;:::-;;;;;;;;20884:3;20888:1;20884:6;;;;;;;;:::i;:::-;;;;;;;;20861:9;:30::i;:::-;20842:13;20856:1;20842:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;20822:3;;;;:::i;:::-;;;20781:122;;;;20922:13;20915:20;;;20419:524;;;;:::o;50853:244::-;43561:12;:10;:12::i;:::-;43550:23;;:7;:5;:7::i;:::-;:23;;;43542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50945:1:::1;50930:17;;:3;:17;;;;50922:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;51024:1;51000:21;:25;50992:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;51054:3;:12;;:35;51067:21;51054:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;50853:244:::0;:::o;48197:31::-;;;;;;;;;;;;;:::o;48072:32::-;;;;:::o;51291:189::-;43561:12;:10;:12::i;:::-;43550:23;;:7;:5;:7::i;:::-;:23;;;43542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51392:11:::1;51374:29;;:14;;;;;;;;;;;:29;;;;51366:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51461:11;51445:14;;:27;;;;;;;;;;;;;;;;;;51291:189:::0;:::o;43981:94::-;43561:12;:10;:12::i;:::-;43550:23;;:7;:5;:7::i;:::-;:23;;;43542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44046:21:::1;44064:1;44046:9;:21::i;:::-;43981:94::o:0;51665:148::-;43561:12;:10;:12::i;:::-;43550:23;;:7;:5;:7::i;:::-;:23;;;43542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51750:1:::1;51743:4;:8;51735:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;51801:4;51785:13;:20;;;;51665:148:::0;:::o;43330:87::-;43376:7;43403:6;;;;;;;;;;;43396:13;;43330:87;:::o;47923:44::-;47963:4;47923:44;:::o;48028:37::-;48063:2;48028:37;:::o;48111:24::-;;;;:::o;21016:311::-;21135:8;21119:24;;:12;:10;:12::i;:::-;:24;;;;21111:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;21247:8;21202:18;:32;21221:12;:10;:12::i;:::-;21202:32;;;;;;;;;;;;;;;:42;21235:8;21202:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;21300:8;21271:48;;21286:12;:10;:12::i;:::-;21271:48;;;21310:8;21271:48;;;;;;:::i;:::-;;;;;;;;21016:311;;:::o;51105:178::-;43561:12;:10;:12::i;:::-;43550:23;;:7;:5;:7::i;:::-;:23;;;43542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51200:11:::1;51185:26;;:11;;;;;;;;;;;:26;;;;51177:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51264:11;51250;;:25;;;;;;;;;;;;;;;;;;51105:178:::0;:::o;48651:853::-;46363:1;46959:7;;:19;;46951:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46363:1;47092:7;:18;;;;48813:14:::1;;;;;;;;;;;48805:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;48883:10;48870:23;;:9;:23;;;48862:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;48984:13;;48973:6;48939:31;48949:10;48312:1;48939:9;:31::i;:::-;:40;;;;:::i;:::-;48938:59;;48930:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;49053:1;49044:6;:10;:46;;;;;48011:10;49071:6;:19;;;;:::i;:::-;49058:9;:32;49044:46;49036:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;49130:36;49140:10;49152:6;49160:5;49130:9;:36::i;:::-;49122:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49202:24;49214:5;49221:4;49202:11;:24::i;:::-;49194:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;49265:11;:18;49277:5;49265:18;;;;;;;;;;;;;;;;;;;;;49264:19;49256:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;47963:4;49337:6;49325:9;;:18;;;;:::i;:::-;:35;;49317:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49412:4;49391:11;:18;49403:5;49391:18;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;49440:6;49427:9;;:19;;;;;;;:::i;:::-;;;;;;;;49457:39;49463:10;48312:1;49485:6;49457:39;;;;;;;;;;;::::0;:5:::1;:39::i;:::-;46319:1:::0;47271:7;:22;;;;48651:853;;;:::o;47974:47::-;48011:10;47974:47;:::o;50467:247::-;50621:4;50645:33;50655:7;50664:6;50672:5;50645:9;:33::i;:::-;:61;;;;;50682:24;50694:5;50701:4;50682:11;:24::i;:::-;50645:61;50638:68;;50467:247;;;;;;:::o;21399:168::-;21498:4;21522:18;:27;21541:7;21522:27;;;;;;;;;;;;;;;:37;21550:8;21522:37;;;;;;;;;;;;;;;;;;;;;;;;;21515:44;;21399:168;;;;:::o;21639:401::-;21855:12;:10;:12::i;:::-;21847:20;;:4;:20;;;:60;;;;21871:36;21888:4;21894:12;:10;:12::i;:::-;21871:16;:36::i;:::-;21847:60;21825:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;21987:45;22005:4;22011:2;22015;22019:6;22027:4;21987:17;:45::i;:::-;21639:401;;;;;:::o;44230:192::-;43561:12;:10;:12::i;:::-;43550:23;;:7;:5;:7::i;:::-;:23;;;43542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44339:1:::1;44319:22;;:8;:22;;;;44311:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44395:19;44405:8;44395:9;:19::i;:::-;44230:192:::0;:::o;8884:387::-;8944:4;9152:12;9219:7;9207:20;9199:28;;9262:1;9255:4;:8;9248:15;;;8884:387;;;:::o;17862:157::-;17947:4;17986:25;17971:40;;;:11;:40;;;;17964:47;;17862:157;;;:::o;16846:98::-;16899:7;16926:10;16919:17;;16846:98;:::o;26119:88::-;26193:6;26186:4;:13;;;;;;;;;;;;:::i;:::-;;26119:88;:::o;26608:599::-;26785:1;26766:21;;:7;:21;;;;26758:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26838:16;26857:12;:10;:12::i;:::-;26838:31;;26882:107;26903:8;26921:1;26925:7;26934:21;26952:2;26934:17;:21::i;:::-;26957:25;26975:6;26957:17;:25::i;:::-;26984:4;26882:20;:107::i;:::-;27028:6;27002:9;:13;27012:2;27002:13;;;;;;;;;;;:22;27016:7;27002:22;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;27087:7;27050:57;;27083:1;27050:57;;27065:8;27050:57;;;27096:2;27100:6;27050:57;;;;;;;:::i;:::-;;;;;;;;27120:79;27151:8;27169:1;27173:7;27182:2;27186:6;27194:4;27120:30;:79::i;:::-;26747:460;26608:599;;;;:::o;24201:1074::-;24428:7;:14;24414:3;:10;:28;24406:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;24520:1;24506:16;;:2;:16;;;;24498:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;24577:16;24596:12;:10;:12::i;:::-;24577:31;;24621:60;24642:8;24652:4;24658:2;24662:3;24667:7;24676:4;24621:20;:60::i;:::-;24699:9;24694:421;24718:3;:10;24714:1;:14;24694:421;;;24750:10;24763:3;24767:1;24763:6;;;;;;;;:::i;:::-;;;;;;;;24750:19;;24784:14;24801:7;24809:1;24801:10;;;;;;;;:::i;:::-;;;;;;;;24784:27;;24828:19;24850:9;:13;24860:2;24850:13;;;;;;;;;;;:19;24864:4;24850:19;;;;;;;;;;;;;;;;24828:41;;24907:6;24892:11;:21;;24884:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25040:6;25026:11;:20;25004:9;:13;25014:2;25004:13;;;;;;;;;;;:19;25018:4;25004:19;;;;;;;;;;;;;;;:42;;;;25097:6;25076:9;:13;25086:2;25076:13;;;;;;;;;;;:17;25090:2;25076:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;24735:380;;;24730:3;;;;:::i;:::-;;;24694:421;;;;25162:2;25132:47;;25156:4;25132:47;;25146:8;25132:47;;;25166:3;25171:7;25132:47;;;;;;;:::i;:::-;;;;;;;;25192:75;25228:8;25238:4;25244:2;25248:3;25253:7;25262:4;25192:35;:75::i;:::-;24395:880;24201:1074;;;;;:::o;44430:173::-;44486:16;44505:6;;;;;;;;;;;44486:25;;44531:8;44522:6;;:17;;;;;;;;;;;;;;;;;;44586:8;44555:40;;44576:8;44555:40;;;;;;;;;;;;44475:128;44430:173;:::o;50268:191::-;50356:4;50373:9;50406:7;50415:6;50395:27;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50385:38;;;;;;50373:50;;50446:5;50441:1;:10;50434:17;;;50268:191;;;;;:::o;50066:194::-;50148:4;50190:62;50204:35;50233:5;50204:28;:35::i;:::-;50241:10;50190:13;:62::i;:::-;50172:80;;:14;;;;;;;;;;;:80;;;50165:87;;50066:194;;;;:::o;23023:820::-;23225:1;23211:16;;:2;:16;;;;23203:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;23282:16;23301:12;:10;:12::i;:::-;23282:31;;23326:96;23347:8;23357:4;23363:2;23367:21;23385:2;23367:17;:21::i;:::-;23390:25;23408:6;23390:17;:25::i;:::-;23417:4;23326:20;:96::i;:::-;23435:19;23457:9;:13;23467:2;23457:13;;;;;;;;;;;:19;23471:4;23457:19;;;;;;;;;;;;;;;;23435:41;;23510:6;23495:11;:21;;23487:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23635:6;23621:11;:20;23599:9;:13;23609:2;23599:13;;;;;;;;;;;:19;23613:4;23599:19;;;;;;;;;;;;;;;:42;;;;23684:6;23663:9;:13;23673:2;23663:13;;;;;;;;;;;:17;23677:2;23663:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;23739:2;23708:46;;23733:4;23708:46;;23723:8;23708:46;;;23743:2;23747:6;23708:46;;;;;;;:::i;:::-;;;;;;;;23767:68;23798:8;23808:4;23814:2;23818;23822:6;23830:4;23767:30;:68::i;:::-;23192:651;;23023:820;;;;;:::o;33111:198::-;33177:16;33206:22;33245:1;33231:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33206:41;;33269:7;33258:5;33264:1;33258:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;33296:5;33289:12;;;33111:198;;;:::o;31309:221::-;;;;;;;:::o;31538:744::-;31753:15;:2;:13;;;:15::i;:::-;31749:526;;;31806:2;31789:38;;;31828:8;31838:4;31844:2;31848:6;31856:4;31789:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31785:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;32137:6;32130:14;;;;;;;;;;;:::i;:::-;;;;;;;;31785:479;;;32186:62;;;;;;;;;;:::i;:::-;;;;;;;;31785:479;31923:43;;;31911:55;;;:8;:55;;;;31907:154;;31991:50;;;;;;;;;;:::i;:::-;;;;;;;;31907:154;31862:214;31749:526;31538:744;;;;;;:::o;32290:813::-;32530:15;:2;:13;;;:15::i;:::-;32526:570;;;32583:2;32566:43;;;32610:8;32620:4;32626:3;32631:7;32640:4;32566:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32562:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;32958:6;32951:14;;;;;;;;;;;:::i;:::-;;;;;;;;32562:523;;;33007:62;;;;;;;;;;:::i;:::-;;;;;;;;32562:523;32739:48;;;32727:60;;;:8;:60;;;;32723:159;;32812:50;;;;;;;;;;:::i;:::-;;;;;;;;32723:159;32646:251;32526:570;32290:813;;;;;;:::o;41506:269::-;41575:7;41761:4;41708:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;41698:69;;;;;;41691:76;;41506:269;;;:::o;37657:231::-;37735:7;37756:17;37775:18;37797:27;37808:4;37814:9;37797:10;:27::i;:::-;37755:69;;;;37835:18;37847:5;37835:11;:18::i;:::-;37871:9;37864:16;;;;37657:231;;;;:::o;35547:1308::-;35628:7;35637:12;35882:2;35862:9;:16;:22;35858:990;;;35901:9;35925;35949:7;36158:4;36147:9;36143:20;36137:27;36132:32;;36208:4;36197:9;36193:20;36187:27;36182:32;;36266:4;36255:9;36251:20;36245:27;36242:1;36237:36;36232:41;;36309:25;36320:4;36326:1;36329;36332;36309:10;:25::i;:::-;36302:32;;;;;;;;;35858:990;36376:2;36356:9;:16;:22;36352:496;;;36395:9;36419:10;36631:4;36620:9;36616:20;36610:27;36605:32;;36682:4;36671:9;36667:20;36661:27;36655:33;;36724:23;36735:4;36741:1;36744:2;36724:10;:23::i;:::-;36717:30;;;;;;;;36352:496;36796:1;36800:35;36780:56;;;;35547:1308;;;;;;:::o;33818:643::-;33896:20;33887:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;33883:571;;;33933:7;;33883:571;33994:29;33985:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;33981:473;;;34040:34;;;;;;;;;;:::i;:::-;;;;;;;;33981:473;34105:35;34096:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;34092:362;;;34157:41;;;;;;;;;;:::i;:::-;;;;;;;;34092:362;34229:30;34220:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;34216:238;;;34276:44;;;;;;;;;;:::i;:::-;;;;;;;;34216:238;34351:30;34342:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;34338:116;;;34398:44;;;;;;;;;;:::i;:::-;;;;;;;;34338:116;33818:643;;:::o;39156:1632::-;39287:7;39296:12;40221:66;40216:1;40208:10;;:79;40204:163;;;40320:1;40324:30;40304:51;;;;;;40204:163;40386:2;40381:1;:7;;;;:18;;;;;40397:2;40392:1;:7;;;;40381:18;40377:102;;;40432:1;40436:30;40416:51;;;;;;40377:102;40576:14;40593:24;40603:4;40609:1;40612;40615;40593:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40576:41;;40650:1;40632:20;;:6;:20;;;40628:103;;;40685:1;40689:29;40669:50;;;;;;;40628:103;40751:6;40759:20;40743:37;;;;;39156:1632;;;;;;;;:::o;38151:391::-;38265:7;38274:12;38299:9;38319:7;38374:66;38370:2;38366:75;38361:80;;38478:2;38473;38468:3;38464:12;38460:21;38455:26;;38509:25;38520:4;38526:1;38529;38532;38509:10;:25::i;:::-;38502:32;;;;;;38151:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2476:155::-;2530:5;2568:6;2555:20;2546:29;;2584:41;2619:5;2584:41;:::i;:::-;2476:155;;;;:::o;2654:370::-;2725:5;2774:3;2767:4;2759:6;2755:17;2751:27;2741:122;;2782:79;;:::i;:::-;2741:122;2899:6;2886:20;2924:94;3014:3;3006:6;2999:4;2991:6;2987:17;2924:94;:::i;:::-;2915:103;;2731:293;2654:370;;;;:::o;3047:::-;3118:5;3167:3;3160:4;3152:6;3148:17;3144:27;3134:122;;3175:79;;:::i;:::-;3134:122;3292:6;3279:20;3317:94;3407:3;3399:6;3392:4;3384:6;3380:17;3317:94;:::i;:::-;3308:103;;3124:293;3047:370;;;;:::o;3423:133::-;3466:5;3504:6;3491:20;3482:29;;3520:30;3544:5;3520:30;:::i;:::-;3423:133;;;;:::o;3562:139::-;3608:5;3646:6;3633:20;3624:29;;3662:33;3689:5;3662:33;:::i;:::-;3562:139;;;;:::o;3707:137::-;3752:5;3790:6;3777:20;3768:29;;3806:32;3832:5;3806:32;:::i;:::-;3707:137;;;;:::o;3850:141::-;3906:5;3937:6;3931:13;3922:22;;3953:32;3979:5;3953:32;:::i;:::-;3850:141;;;;:::o;4010:338::-;4065:5;4114:3;4107:4;4099:6;4095:17;4091:27;4081:122;;4122:79;;:::i;:::-;4081:122;4239:6;4226:20;4264:78;4338:3;4330:6;4323:4;4315:6;4311:17;4264:78;:::i;:::-;4255:87;;4071:277;4010:338;;;;:::o;4368:340::-;4424:5;4473:3;4466:4;4458:6;4454:17;4450:27;4440:122;;4481:79;;:::i;:::-;4440:122;4598:6;4585:20;4623:79;4698:3;4690:6;4683:4;4675:6;4671:17;4623:79;:::i;:::-;4614:88;;4430:278;4368:340;;;;:::o;4714:139::-;4760:5;4798:6;4785:20;4776:29;;4814:33;4841:5;4814:33;:::i;:::-;4714:139;;;;:::o;4859:329::-;4918:6;4967:2;4955:9;4946:7;4942:23;4938:32;4935:119;;;4973:79;;:::i;:::-;4935:119;5093:1;5118:53;5163:7;5154:6;5143:9;5139:22;5118:53;:::i;:::-;5108:63;;5064:117;4859:329;;;;:::o;5194:345::-;5261:6;5310:2;5298:9;5289:7;5285:23;5281:32;5278:119;;;5316:79;;:::i;:::-;5278:119;5436:1;5461:61;5514:7;5505:6;5494:9;5490:22;5461:61;:::i;:::-;5451:71;;5407:125;5194:345;;;;:::o;5545:474::-;5613:6;5621;5670:2;5658:9;5649:7;5645:23;5641:32;5638:119;;;5676:79;;:::i;:::-;5638:119;5796:1;5821:53;5866:7;5857:6;5846:9;5842:22;5821:53;:::i;:::-;5811:63;;5767:117;5923:2;5949:53;5994:7;5985:6;5974:9;5970:22;5949:53;:::i;:::-;5939:63;;5894:118;5545:474;;;;;:::o;6025:1509::-;6179:6;6187;6195;6203;6211;6260:3;6248:9;6239:7;6235:23;6231:33;6228:120;;;6267:79;;:::i;:::-;6228:120;6387:1;6412:53;6457:7;6448:6;6437:9;6433:22;6412:53;:::i;:::-;6402:63;;6358:117;6514:2;6540:53;6585:7;6576:6;6565:9;6561:22;6540:53;:::i;:::-;6530:63;;6485:118;6670:2;6659:9;6655:18;6642:32;6701:18;6693:6;6690:30;6687:117;;;6723:79;;:::i;:::-;6687:117;6828:78;6898:7;6889:6;6878:9;6874:22;6828:78;:::i;:::-;6818:88;;6613:303;6983:2;6972:9;6968:18;6955:32;7014:18;7006:6;7003:30;7000:117;;;7036:79;;:::i;:::-;7000:117;7141:78;7211:7;7202:6;7191:9;7187:22;7141:78;:::i;:::-;7131:88;;6926:303;7296:3;7285:9;7281:19;7268:33;7328:18;7320:6;7317:30;7314:117;;;7350:79;;:::i;:::-;7314:117;7455:62;7509:7;7500:6;7489:9;7485:22;7455:62;:::i;:::-;7445:72;;7239:288;6025:1509;;;;;;;;:::o;7540:1089::-;7644:6;7652;7660;7668;7676;7725:3;7713:9;7704:7;7700:23;7696:33;7693:120;;;7732:79;;:::i;:::-;7693:120;7852:1;7877:53;7922:7;7913:6;7902:9;7898:22;7877:53;:::i;:::-;7867:63;;7823:117;7979:2;8005:53;8050:7;8041:6;8030:9;8026:22;8005:53;:::i;:::-;7995:63;;7950:118;8107:2;8133:53;8178:7;8169:6;8158:9;8154:22;8133:53;:::i;:::-;8123:63;;8078:118;8235:2;8261:53;8306:7;8297:6;8286:9;8282:22;8261:53;:::i;:::-;8251:63;;8206:118;8391:3;8380:9;8376:19;8363:33;8423:18;8415:6;8412:30;8409:117;;;8445:79;;:::i;:::-;8409:117;8550:62;8604:7;8595:6;8584:9;8580:22;8550:62;:::i;:::-;8540:72;;8334:288;7540:1089;;;;;;;;:::o;8635:468::-;8700:6;8708;8757:2;8745:9;8736:7;8732:23;8728:32;8725:119;;;8763:79;;:::i;:::-;8725:119;8883:1;8908:53;8953:7;8944:6;8933:9;8929:22;8908:53;:::i;:::-;8898:63;;8854:117;9010:2;9036:50;9078:7;9069:6;9058:9;9054:22;9036:50;:::i;:::-;9026:60;;8981:115;8635:468;;;;;:::o;9109:474::-;9177:6;9185;9234:2;9222:9;9213:7;9209:23;9205:32;9202:119;;;9240:79;;:::i;:::-;9202:119;9360:1;9385:53;9430:7;9421:6;9410:9;9406:22;9385:53;:::i;:::-;9375:63;;9331:117;9487:2;9513:53;9558:7;9549:6;9538:9;9534:22;9513:53;:::i;:::-;9503:63;;9458:118;9109:474;;;;;:::o;9589:943::-;9684:6;9692;9700;9708;9757:3;9745:9;9736:7;9732:23;9728:33;9725:120;;;9764:79;;:::i;:::-;9725:120;9884:1;9909:53;9954:7;9945:6;9934:9;9930:22;9909:53;:::i;:::-;9899:63;;9855:117;10011:2;10037:53;10082:7;10073:6;10062:9;10058:22;10037:53;:::i;:::-;10027:63;;9982:118;10139:2;10165:53;10210:7;10201:6;10190:9;10186:22;10165:53;:::i;:::-;10155:63;;10110:118;10295:2;10284:9;10280:18;10267:32;10326:18;10318:6;10315:30;10312:117;;;10348:79;;:::i;:::-;10312:117;10453:62;10507:7;10498:6;10487:9;10483:22;10453:62;:::i;:::-;10443:72;;10238:287;9589:943;;;;;;;:::o;10538:894::-;10656:6;10664;10713:2;10701:9;10692:7;10688:23;10684:32;10681:119;;;10719:79;;:::i;:::-;10681:119;10867:1;10856:9;10852:17;10839:31;10897:18;10889:6;10886:30;10883:117;;;10919:79;;:::i;:::-;10883:117;11024:78;11094:7;11085:6;11074:9;11070:22;11024:78;:::i;:::-;11014:88;;10810:302;11179:2;11168:9;11164:18;11151:32;11210:18;11202:6;11199:30;11196:117;;;11232:79;;:::i;:::-;11196:117;11337:78;11407:7;11398:6;11387:9;11383:22;11337:78;:::i;:::-;11327:88;;11122:303;10538:894;;;;;:::o;11438:323::-;11494:6;11543:2;11531:9;11522:7;11518:23;11514:32;11511:119;;;11549:79;;:::i;:::-;11511:119;11669:1;11694:50;11736:7;11727:6;11716:9;11712:22;11694:50;:::i;:::-;11684:60;;11640:114;11438:323;;;;:::o;11767:327::-;11825:6;11874:2;11862:9;11853:7;11849:23;11845:32;11842:119;;;11880:79;;:::i;:::-;11842:119;12000:1;12025:52;12069:7;12060:6;12049:9;12045:22;12025:52;:::i;:::-;12015:62;;11971:116;11767:327;;;;:::o;12100:349::-;12169:6;12218:2;12206:9;12197:7;12193:23;12189:32;12186:119;;;12224:79;;:::i;:::-;12186:119;12344:1;12369:63;12424:7;12415:6;12404:9;12400:22;12369:63;:::i;:::-;12359:73;;12315:127;12100:349;;;;:::o;12455:509::-;12524:6;12573:2;12561:9;12552:7;12548:23;12544:32;12541:119;;;12579:79;;:::i;:::-;12541:119;12727:1;12716:9;12712:17;12699:31;12757:18;12749:6;12746:30;12743:117;;;12779:79;;:::i;:::-;12743:117;12884:63;12939:7;12930:6;12919:9;12915:22;12884:63;:::i;:::-;12874:73;;12670:287;12455:509;;;;:::o;12970:329::-;13029:6;13078:2;13066:9;13057:7;13053:23;13049:32;13046:119;;;13084:79;;:::i;:::-;13046:119;13204:1;13229:53;13274:7;13265:6;13254:9;13250:22;13229:53;:::i;:::-;13219:63;;13175:117;12970:329;;;;:::o;13305:797::-;13391:6;13399;13407;13456:2;13444:9;13435:7;13431:23;13427:32;13424:119;;;13462:79;;:::i;:::-;13424:119;13582:1;13607:53;13652:7;13643:6;13632:9;13628:22;13607:53;:::i;:::-;13597:63;;13553:117;13709:2;13735:53;13780:7;13771:6;13760:9;13756:22;13735:53;:::i;:::-;13725:63;;13680:118;13865:2;13854:9;13850:18;13837:32;13896:18;13888:6;13885:30;13882:117;;;13918:79;;:::i;:::-;13882:117;14023:62;14077:7;14068:6;14057:9;14053:22;14023:62;:::i;:::-;14013:72;;13808:287;13305:797;;;;;:::o;14108:179::-;14177:10;14198:46;14240:3;14232:6;14198:46;:::i;:::-;14276:4;14271:3;14267:14;14253:28;;14108:179;;;;:::o;14293:118::-;14380:24;14398:5;14380:24;:::i;:::-;14375:3;14368:37;14293:118;;:::o;14447:732::-;14566:3;14595:54;14643:5;14595:54;:::i;:::-;14665:86;14744:6;14739:3;14665:86;:::i;:::-;14658:93;;14775:56;14825:5;14775:56;:::i;:::-;14854:7;14885:1;14870:284;14895:6;14892:1;14889:13;14870:284;;;14971:6;14965:13;14998:63;15057:3;15042:13;14998:63;:::i;:::-;14991:70;;15084:60;15137:6;15084:60;:::i;:::-;15074:70;;14930:224;14917:1;14914;14910:9;14905:14;;14870:284;;;14874:14;15170:3;15163:10;;14571:608;;;14447:732;;;;:::o;15185:109::-;15266:21;15281:5;15266:21;:::i;:::-;15261:3;15254:34;15185:109;;:::o;15300:118::-;15387:24;15405:5;15387:24;:::i;:::-;15382:3;15375:37;15300:118;;:::o;15424:157::-;15529:45;15549:24;15567:5;15549:24;:::i;:::-;15529:45;:::i;:::-;15524:3;15517:58;15424:157;;:::o;15587:360::-;15673:3;15701:38;15733:5;15701:38;:::i;:::-;15755:70;15818:6;15813:3;15755:70;:::i;:::-;15748:77;;15834:52;15879:6;15874:3;15867:4;15860:5;15856:16;15834:52;:::i;:::-;15911:29;15933:6;15911:29;:::i;:::-;15906:3;15902:39;15895:46;;15677:270;15587:360;;;;:::o;15953:364::-;16041:3;16069:39;16102:5;16069:39;:::i;:::-;16124:71;16188:6;16183:3;16124:71;:::i;:::-;16117:78;;16204:52;16249:6;16244:3;16237:4;16230:5;16226:16;16204:52;:::i;:::-;16281:29;16303:6;16281:29;:::i;:::-;16276:3;16272:39;16265:46;;16045:272;15953:364;;;;:::o;16323:366::-;16465:3;16486:67;16550:2;16545:3;16486:67;:::i;:::-;16479:74;;16562:93;16651:3;16562:93;:::i;:::-;16680:2;16675:3;16671:12;16664:19;;16323:366;;;:::o;16695:::-;16837:3;16858:67;16922:2;16917:3;16858:67;:::i;:::-;16851:74;;16934:93;17023:3;16934:93;:::i;:::-;17052:2;17047:3;17043:12;17036:19;;16695:366;;;:::o;17067:::-;17209:3;17230:67;17294:2;17289:3;17230:67;:::i;:::-;17223:74;;17306:93;17395:3;17306:93;:::i;:::-;17424:2;17419:3;17415:12;17408:19;;17067:366;;;:::o;17439:::-;17581:3;17602:67;17666:2;17661:3;17602:67;:::i;:::-;17595:74;;17678:93;17767:3;17678:93;:::i;:::-;17796:2;17791:3;17787:12;17780:19;;17439:366;;;:::o;17811:402::-;17971:3;17992:85;18074:2;18069:3;17992:85;:::i;:::-;17985:92;;18086:93;18175:3;18086:93;:::i;:::-;18204:2;18199:3;18195:12;18188:19;;17811:402;;;:::o;18219:366::-;18361:3;18382:67;18446:2;18441:3;18382:67;:::i;:::-;18375:74;;18458:93;18547:3;18458:93;:::i;:::-;18576:2;18571:3;18567:12;18560:19;;18219:366;;;:::o;18591:::-;18733:3;18754:67;18818:2;18813:3;18754:67;:::i;:::-;18747:74;;18830:93;18919:3;18830:93;:::i;:::-;18948:2;18943:3;18939:12;18932:19;;18591:366;;;:::o;18963:::-;19105:3;19126:67;19190:2;19185:3;19126:67;:::i;:::-;19119:74;;19202:93;19291:3;19202:93;:::i;:::-;19320:2;19315:3;19311:12;19304:19;;18963:366;;;:::o;19335:::-;19477:3;19498:67;19562:2;19557:3;19498:67;:::i;:::-;19491:74;;19574:93;19663:3;19574:93;:::i;:::-;19692:2;19687:3;19683:12;19676:19;;19335:366;;;:::o;19707:::-;19849:3;19870:67;19934:2;19929:3;19870:67;:::i;:::-;19863:74;;19946:93;20035:3;19946:93;:::i;:::-;20064:2;20059:3;20055:12;20048:19;;19707:366;;;:::o;20079:::-;20221:3;20242:67;20306:2;20301:3;20242:67;:::i;:::-;20235:74;;20318:93;20407:3;20318:93;:::i;:::-;20436:2;20431:3;20427:12;20420:19;;20079:366;;;:::o;20451:::-;20593:3;20614:67;20678:2;20673:3;20614:67;:::i;:::-;20607:74;;20690:93;20779:3;20690:93;:::i;:::-;20808:2;20803:3;20799:12;20792:19;;20451:366;;;:::o;20823:::-;20965:3;20986:67;21050:2;21045:3;20986:67;:::i;:::-;20979:74;;21062:93;21151:3;21062:93;:::i;:::-;21180:2;21175:3;21171:12;21164:19;;20823:366;;;:::o;21195:::-;21337:3;21358:67;21422:2;21417:3;21358:67;:::i;:::-;21351:74;;21434:93;21523:3;21434:93;:::i;:::-;21552:2;21547:3;21543:12;21536:19;;21195:366;;;:::o;21567:::-;21709:3;21730:67;21794:2;21789:3;21730:67;:::i;:::-;21723:74;;21806:93;21895:3;21806:93;:::i;:::-;21924:2;21919:3;21915:12;21908:19;;21567:366;;;:::o;21939:::-;22081:3;22102:67;22166:2;22161:3;22102:67;:::i;:::-;22095:74;;22178:93;22267:3;22178:93;:::i;:::-;22296:2;22291:3;22287:12;22280:19;;21939:366;;;:::o;22311:::-;22453:3;22474:67;22538:2;22533:3;22474:67;:::i;:::-;22467:74;;22550:93;22639:3;22550:93;:::i;:::-;22668:2;22663:3;22659:12;22652:19;;22311:366;;;:::o;22683:::-;22825:3;22846:67;22910:2;22905:3;22846:67;:::i;:::-;22839:74;;22922:93;23011:3;22922:93;:::i;:::-;23040:2;23035:3;23031:12;23024:19;;22683:366;;;:::o;23055:::-;23197:3;23218:67;23282:2;23277:3;23218:67;:::i;:::-;23211:74;;23294:93;23383:3;23294:93;:::i;:::-;23412:2;23407:3;23403:12;23396:19;;23055:366;;;:::o;23427:::-;23569:3;23590:67;23654:2;23649:3;23590:67;:::i;:::-;23583:74;;23666:93;23755:3;23666:93;:::i;:::-;23784:2;23779:3;23775:12;23768:19;;23427:366;;;:::o;23799:::-;23941:3;23962:67;24026:2;24021:3;23962:67;:::i;:::-;23955:74;;24038:93;24127:3;24038:93;:::i;:::-;24156:2;24151:3;24147:12;24140:19;;23799:366;;;:::o;24171:::-;24313:3;24334:67;24398:2;24393:3;24334:67;:::i;:::-;24327:74;;24410:93;24499:3;24410:93;:::i;:::-;24528:2;24523:3;24519:12;24512:19;;24171:366;;;:::o;24543:::-;24685:3;24706:67;24770:2;24765:3;24706:67;:::i;:::-;24699:74;;24782:93;24871:3;24782:93;:::i;:::-;24900:2;24895:3;24891:12;24884:19;;24543:366;;;:::o;24915:::-;25057:3;25078:67;25142:2;25137:3;25078:67;:::i;:::-;25071:74;;25154:93;25243:3;25154:93;:::i;:::-;25272:2;25267:3;25263:12;25256:19;;24915:366;;;:::o;25287:::-;25429:3;25450:67;25514:2;25509:3;25450:67;:::i;:::-;25443:74;;25526:93;25615:3;25526:93;:::i;:::-;25644:2;25639:3;25635:12;25628:19;;25287:366;;;:::o;25659:::-;25801:3;25822:67;25886:2;25881:3;25822:67;:::i;:::-;25815:74;;25898:93;25987:3;25898:93;:::i;:::-;26016:2;26011:3;26007:12;26000:19;;25659:366;;;:::o;26031:::-;26173:3;26194:67;26258:2;26253:3;26194:67;:::i;:::-;26187:74;;26270:93;26359:3;26270:93;:::i;:::-;26388:2;26383:3;26379:12;26372:19;;26031:366;;;:::o;26403:::-;26545:3;26566:67;26630:2;26625:3;26566:67;:::i;:::-;26559:74;;26642:93;26731:3;26642:93;:::i;:::-;26760:2;26755:3;26751:12;26744:19;;26403:366;;;:::o;26775:::-;26917:3;26938:67;27002:2;26997:3;26938:67;:::i;:::-;26931:74;;27014:93;27103:3;27014:93;:::i;:::-;27132:2;27127:3;27123:12;27116:19;;26775:366;;;:::o;27147:::-;27289:3;27310:67;27374:2;27369:3;27310:67;:::i;:::-;27303:74;;27386:93;27475:3;27386:93;:::i;:::-;27504:2;27499:3;27495:12;27488:19;;27147:366;;;:::o;27519:::-;27661:3;27682:67;27746:2;27741:3;27682:67;:::i;:::-;27675:74;;27758:93;27847:3;27758:93;:::i;:::-;27876:2;27871:3;27867:12;27860:19;;27519:366;;;:::o;27891:::-;28033:3;28054:67;28118:2;28113:3;28054:67;:::i;:::-;28047:74;;28130:93;28219:3;28130:93;:::i;:::-;28248:2;28243:3;28239:12;28232:19;;27891:366;;;:::o;28263:::-;28405:3;28426:67;28490:2;28485:3;28426:67;:::i;:::-;28419:74;;28502:93;28591:3;28502:93;:::i;:::-;28620:2;28615:3;28611:12;28604:19;;28263:366;;;:::o;28635:::-;28777:3;28798:67;28862:2;28857:3;28798:67;:::i;:::-;28791:74;;28874:93;28963:3;28874:93;:::i;:::-;28992:2;28987:3;28983:12;28976:19;;28635:366;;;:::o;29007:108::-;29084:24;29102:5;29084:24;:::i;:::-;29079:3;29072:37;29007:108;;:::o;29121:118::-;29208:24;29226:5;29208:24;:::i;:::-;29203:3;29196:37;29121:118;;:::o;29245:112::-;29328:22;29344:5;29328:22;:::i;:::-;29323:3;29316:35;29245:112;;:::o;29363:522::-;29576:3;29598:148;29742:3;29598:148;:::i;:::-;29591:155;;29756:75;29827:3;29818:6;29756:75;:::i;:::-;29856:2;29851:3;29847:12;29840:19;;29876:3;29869:10;;29363:522;;;;:::o;29891:222::-;29984:4;30022:2;30011:9;30007:18;29999:26;;30035:71;30103:1;30092:9;30088:17;30079:6;30035:71;:::i;:::-;29891:222;;;;:::o;30119:1053::-;30442:4;30480:3;30469:9;30465:19;30457:27;;30494:71;30562:1;30551:9;30547:17;30538:6;30494:71;:::i;:::-;30575:72;30643:2;30632:9;30628:18;30619:6;30575:72;:::i;:::-;30694:9;30688:4;30684:20;30679:2;30668:9;30664:18;30657:48;30722:108;30825:4;30816:6;30722:108;:::i;:::-;30714:116;;30877:9;30871:4;30867:20;30862:2;30851:9;30847:18;30840:48;30905:108;31008:4;30999:6;30905:108;:::i;:::-;30897:116;;31061:9;31055:4;31051:20;31045:3;31034:9;31030:19;31023:49;31089:76;31160:4;31151:6;31089:76;:::i;:::-;31081:84;;30119:1053;;;;;;;;:::o;31178:751::-;31401:4;31439:3;31428:9;31424:19;31416:27;;31453:71;31521:1;31510:9;31506:17;31497:6;31453:71;:::i;:::-;31534:72;31602:2;31591:9;31587:18;31578:6;31534:72;:::i;:::-;31616;31684:2;31673:9;31669:18;31660:6;31616:72;:::i;:::-;31698;31766:2;31755:9;31751:18;31742:6;31698:72;:::i;:::-;31818:9;31812:4;31808:20;31802:3;31791:9;31787:19;31780:49;31846:76;31917:4;31908:6;31846:76;:::i;:::-;31838:84;;31178:751;;;;;;;;:::o;31935:332::-;32056:4;32094:2;32083:9;32079:18;32071:26;;32107:71;32175:1;32164:9;32160:17;32151:6;32107:71;:::i;:::-;32188:72;32256:2;32245:9;32241:18;32232:6;32188:72;:::i;:::-;31935:332;;;;;:::o;32273:373::-;32416:4;32454:2;32443:9;32439:18;32431:26;;32503:9;32497:4;32493:20;32489:1;32478:9;32474:17;32467:47;32531:108;32634:4;32625:6;32531:108;:::i;:::-;32523:116;;32273:373;;;;:::o;32652:634::-;32873:4;32911:2;32900:9;32896:18;32888:26;;32960:9;32954:4;32950:20;32946:1;32935:9;32931:17;32924:47;32988:108;33091:4;33082:6;32988:108;:::i;:::-;32980:116;;33143:9;33137:4;33133:20;33128:2;33117:9;33113:18;33106:48;33171:108;33274:4;33265:6;33171:108;:::i;:::-;33163:116;;32652:634;;;;;:::o;33292:210::-;33379:4;33417:2;33406:9;33402:18;33394:26;;33430:65;33492:1;33481:9;33477:17;33468:6;33430:65;:::i;:::-;33292:210;;;;:::o;33508:545::-;33681:4;33719:3;33708:9;33704:19;33696:27;;33733:71;33801:1;33790:9;33786:17;33777:6;33733:71;:::i;:::-;33814:68;33878:2;33867:9;33863:18;33854:6;33814:68;:::i;:::-;33892:72;33960:2;33949:9;33945:18;33936:6;33892:72;:::i;:::-;33974;34042:2;34031:9;34027:18;34018:6;33974:72;:::i;:::-;33508:545;;;;;;;:::o;34059:313::-;34172:4;34210:2;34199:9;34195:18;34187:26;;34259:9;34253:4;34249:20;34245:1;34234:9;34230:17;34223:47;34287:78;34360:4;34351:6;34287:78;:::i;:::-;34279:86;;34059:313;;;;:::o;34378:419::-;34544:4;34582:2;34571:9;34567:18;34559:26;;34631:9;34625:4;34621:20;34617:1;34606:9;34602:17;34595:47;34659:131;34785:4;34659:131;:::i;:::-;34651:139;;34378:419;;;:::o;34803:::-;34969:4;35007:2;34996:9;34992:18;34984:26;;35056:9;35050:4;35046:20;35042:1;35031:9;35027:17;35020:47;35084:131;35210:4;35084:131;:::i;:::-;35076:139;;34803:419;;;:::o;35228:::-;35394:4;35432:2;35421:9;35417:18;35409:26;;35481:9;35475:4;35471:20;35467:1;35456:9;35452:17;35445:47;35509:131;35635:4;35509:131;:::i;:::-;35501:139;;35228:419;;;:::o;35653:::-;35819:4;35857:2;35846:9;35842:18;35834:26;;35906:9;35900:4;35896:20;35892:1;35881:9;35877:17;35870:47;35934:131;36060:4;35934:131;:::i;:::-;35926:139;;35653:419;;;:::o;36078:::-;36244:4;36282:2;36271:9;36267:18;36259:26;;36331:9;36325:4;36321:20;36317:1;36306:9;36302:17;36295:47;36359:131;36485:4;36359:131;:::i;:::-;36351:139;;36078:419;;;:::o;36503:::-;36669:4;36707:2;36696:9;36692:18;36684:26;;36756:9;36750:4;36746:20;36742:1;36731:9;36727:17;36720:47;36784:131;36910:4;36784:131;:::i;:::-;36776:139;;36503:419;;;:::o;36928:::-;37094:4;37132:2;37121:9;37117:18;37109:26;;37181:9;37175:4;37171:20;37167:1;37156:9;37152:17;37145:47;37209:131;37335:4;37209:131;:::i;:::-;37201:139;;36928:419;;;:::o;37353:::-;37519:4;37557:2;37546:9;37542:18;37534:26;;37606:9;37600:4;37596:20;37592:1;37581:9;37577:17;37570:47;37634:131;37760:4;37634:131;:::i;:::-;37626:139;;37353:419;;;:::o;37778:::-;37944:4;37982:2;37971:9;37967:18;37959:26;;38031:9;38025:4;38021:20;38017:1;38006:9;38002:17;37995:47;38059:131;38185:4;38059:131;:::i;:::-;38051:139;;37778:419;;;:::o;38203:::-;38369:4;38407:2;38396:9;38392:18;38384:26;;38456:9;38450:4;38446:20;38442:1;38431:9;38427:17;38420:47;38484:131;38610:4;38484:131;:::i;:::-;38476:139;;38203:419;;;:::o;38628:::-;38794:4;38832:2;38821:9;38817:18;38809:26;;38881:9;38875:4;38871:20;38867:1;38856:9;38852:17;38845:47;38909:131;39035:4;38909:131;:::i;:::-;38901:139;;38628:419;;;:::o;39053:::-;39219:4;39257:2;39246:9;39242:18;39234:26;;39306:9;39300:4;39296:20;39292:1;39281:9;39277:17;39270:47;39334:131;39460:4;39334:131;:::i;:::-;39326:139;;39053:419;;;:::o;39478:::-;39644:4;39682:2;39671:9;39667:18;39659:26;;39731:9;39725:4;39721:20;39717:1;39706:9;39702:17;39695:47;39759:131;39885:4;39759:131;:::i;:::-;39751:139;;39478:419;;;:::o;39903:::-;40069:4;40107:2;40096:9;40092:18;40084:26;;40156:9;40150:4;40146:20;40142:1;40131:9;40127:17;40120:47;40184:131;40310:4;40184:131;:::i;:::-;40176:139;;39903:419;;;:::o;40328:::-;40494:4;40532:2;40521:9;40517:18;40509:26;;40581:9;40575:4;40571:20;40567:1;40556:9;40552:17;40545:47;40609:131;40735:4;40609:131;:::i;:::-;40601:139;;40328:419;;;:::o;40753:::-;40919:4;40957:2;40946:9;40942:18;40934:26;;41006:9;41000:4;40996:20;40992:1;40981:9;40977:17;40970:47;41034:131;41160:4;41034:131;:::i;:::-;41026:139;;40753:419;;;:::o;41178:::-;41344:4;41382:2;41371:9;41367:18;41359:26;;41431:9;41425:4;41421:20;41417:1;41406:9;41402:17;41395:47;41459:131;41585:4;41459:131;:::i;:::-;41451:139;;41178:419;;;:::o;41603:::-;41769:4;41807:2;41796:9;41792:18;41784:26;;41856:9;41850:4;41846:20;41842:1;41831:9;41827:17;41820:47;41884:131;42010:4;41884:131;:::i;:::-;41876:139;;41603:419;;;:::o;42028:::-;42194:4;42232:2;42221:9;42217:18;42209:26;;42281:9;42275:4;42271:20;42267:1;42256:9;42252:17;42245:47;42309:131;42435:4;42309:131;:::i;:::-;42301:139;;42028:419;;;:::o;42453:::-;42619:4;42657:2;42646:9;42642:18;42634:26;;42706:9;42700:4;42696:20;42692:1;42681:9;42677:17;42670:47;42734:131;42860:4;42734:131;:::i;:::-;42726:139;;42453:419;;;:::o;42878:::-;43044:4;43082:2;43071:9;43067:18;43059:26;;43131:9;43125:4;43121:20;43117:1;43106:9;43102:17;43095:47;43159:131;43285:4;43159:131;:::i;:::-;43151:139;;42878:419;;;:::o;43303:::-;43469:4;43507:2;43496:9;43492:18;43484:26;;43556:9;43550:4;43546:20;43542:1;43531:9;43527:17;43520:47;43584:131;43710:4;43584:131;:::i;:::-;43576:139;;43303:419;;;:::o;43728:::-;43894:4;43932:2;43921:9;43917:18;43909:26;;43981:9;43975:4;43971:20;43967:1;43956:9;43952:17;43945:47;44009:131;44135:4;44009:131;:::i;:::-;44001:139;;43728:419;;;:::o;44153:::-;44319:4;44357:2;44346:9;44342:18;44334:26;;44406:9;44400:4;44396:20;44392:1;44381:9;44377:17;44370:47;44434:131;44560:4;44434:131;:::i;:::-;44426:139;;44153:419;;;:::o;44578:::-;44744:4;44782:2;44771:9;44767:18;44759:26;;44831:9;44825:4;44821:20;44817:1;44806:9;44802:17;44795:47;44859:131;44985:4;44859:131;:::i;:::-;44851:139;;44578:419;;;:::o;45003:::-;45169:4;45207:2;45196:9;45192:18;45184:26;;45256:9;45250:4;45246:20;45242:1;45231:9;45227:17;45220:47;45284:131;45410:4;45284:131;:::i;:::-;45276:139;;45003:419;;;:::o;45428:::-;45594:4;45632:2;45621:9;45617:18;45609:26;;45681:9;45675:4;45671:20;45667:1;45656:9;45652:17;45645:47;45709:131;45835:4;45709:131;:::i;:::-;45701:139;;45428:419;;;:::o;45853:::-;46019:4;46057:2;46046:9;46042:18;46034:26;;46106:9;46100:4;46096:20;46092:1;46081:9;46077:17;46070:47;46134:131;46260:4;46134:131;:::i;:::-;46126:139;;45853:419;;;:::o;46278:::-;46444:4;46482:2;46471:9;46467:18;46459:26;;46531:9;46525:4;46521:20;46517:1;46506:9;46502:17;46495:47;46559:131;46685:4;46559:131;:::i;:::-;46551:139;;46278:419;;;:::o;46703:::-;46869:4;46907:2;46896:9;46892:18;46884:26;;46956:9;46950:4;46946:20;46942:1;46931:9;46927:17;46920:47;46984:131;47110:4;46984:131;:::i;:::-;46976:139;;46703:419;;;:::o;47128:::-;47294:4;47332:2;47321:9;47317:18;47309:26;;47381:9;47375:4;47371:20;47367:1;47356:9;47352:17;47345:47;47409:131;47535:4;47409:131;:::i;:::-;47401:139;;47128:419;;;:::o;47553:::-;47719:4;47757:2;47746:9;47742:18;47734:26;;47806:9;47800:4;47796:20;47792:1;47781:9;47777:17;47770:47;47834:131;47960:4;47834:131;:::i;:::-;47826:139;;47553:419;;;:::o;47978:::-;48144:4;48182:2;48171:9;48167:18;48159:26;;48231:9;48225:4;48221:20;48217:1;48206:9;48202:17;48195:47;48259:131;48385:4;48259:131;:::i;:::-;48251:139;;47978:419;;;:::o;48403:222::-;48496:4;48534:2;48523:9;48519:18;48511:26;;48547:71;48615:1;48604:9;48600:17;48591:6;48547:71;:::i;:::-;48403:222;;;;:::o;48631:332::-;48752:4;48790:2;48779:9;48775:18;48767:26;;48803:71;48871:1;48860:9;48856:17;48847:6;48803:71;:::i;:::-;48884:72;48952:2;48941:9;48937:18;48928:6;48884:72;:::i;:::-;48631:332;;;;;:::o;48969:129::-;49003:6;49030:20;;:::i;:::-;49020:30;;49059:33;49087:4;49079:6;49059:33;:::i;:::-;48969:129;;;:::o;49104:75::-;49137:6;49170:2;49164:9;49154:19;;49104:75;:::o;49185:311::-;49262:4;49352:18;49344:6;49341:30;49338:56;;;49374:18;;:::i;:::-;49338:56;49424:4;49416:6;49412:17;49404:25;;49484:4;49478;49474:15;49466:23;;49185:311;;;:::o;49502:::-;49579:4;49669:18;49661:6;49658:30;49655:56;;;49691:18;;:::i;:::-;49655:56;49741:4;49733:6;49729:17;49721:25;;49801:4;49795;49791:15;49783:23;;49502:311;;;:::o;49819:307::-;49880:4;49970:18;49962:6;49959:30;49956:56;;;49992:18;;:::i;:::-;49956:56;50030:29;50052:6;50030:29;:::i;:::-;50022:37;;50114:4;50108;50104:15;50096:23;;49819:307;;;:::o;50132:308::-;50194:4;50284:18;50276:6;50273:30;50270:56;;;50306:18;;:::i;:::-;50270:56;50344:29;50366:6;50344:29;:::i;:::-;50336:37;;50428:4;50422;50418:15;50410:23;;50132:308;;;:::o;50446:132::-;50513:4;50536:3;50528:11;;50566:4;50561:3;50557:14;50549:22;;50446:132;;;:::o;50584:114::-;50651:6;50685:5;50679:12;50669:22;;50584:114;;;:::o;50704:98::-;50755:6;50789:5;50783:12;50773:22;;50704:98;;;:::o;50808:99::-;50860:6;50894:5;50888:12;50878:22;;50808:99;;;:::o;50913:113::-;50983:4;51015;51010:3;51006:14;50998:22;;50913:113;;;:::o;51032:184::-;51131:11;51165:6;51160:3;51153:19;51205:4;51200:3;51196:14;51181:29;;51032:184;;;;:::o;51222:168::-;51305:11;51339:6;51334:3;51327:19;51379:4;51374:3;51370:14;51355:29;;51222:168;;;;:::o;51396:169::-;51480:11;51514:6;51509:3;51502:19;51554:4;51549:3;51545:14;51530:29;;51396:169;;;;:::o;51571:148::-;51673:11;51710:3;51695:18;;51571:148;;;;:::o;51725:305::-;51765:3;51784:20;51802:1;51784:20;:::i;:::-;51779:25;;51818:20;51836:1;51818:20;:::i;:::-;51813:25;;51972:1;51904:66;51900:74;51897:1;51894:81;51891:107;;;51978:18;;:::i;:::-;51891:107;52022:1;52019;52015:9;52008:16;;51725:305;;;;:::o;52036:348::-;52076:7;52099:20;52117:1;52099:20;:::i;:::-;52094:25;;52133:20;52151:1;52133:20;:::i;:::-;52128:25;;52321:1;52253:66;52249:74;52246:1;52243:81;52238:1;52231:9;52224:17;52220:105;52217:131;;;52328:18;;:::i;:::-;52217:131;52376:1;52373;52369:9;52358:20;;52036:348;;;;:::o;52390:96::-;52427:7;52456:24;52474:5;52456:24;:::i;:::-;52445:35;;52390:96;;;:::o;52492:104::-;52537:7;52566:24;52584:5;52566:24;:::i;:::-;52555:35;;52492:104;;;:::o;52602:90::-;52636:7;52679:5;52672:13;52665:21;52654:32;;52602:90;;;:::o;52698:77::-;52735:7;52764:5;52753:16;;52698:77;;;:::o;52781:149::-;52817:7;52857:66;52850:5;52846:78;52835:89;;52781:149;;;:::o;52936:126::-;52973:7;53013:42;53006:5;53002:54;52991:65;;52936:126;;;:::o;53068:77::-;53105:7;53134:5;53123:16;;53068:77;;;:::o;53151:86::-;53186:7;53226:4;53219:5;53215:16;53204:27;;53151:86;;;:::o;53243:154::-;53327:6;53322:3;53317;53304:30;53389:1;53380:6;53375:3;53371:16;53364:27;53243:154;;;:::o;53403:307::-;53471:1;53481:113;53495:6;53492:1;53489:13;53481:113;;;53580:1;53575:3;53571:11;53565:18;53561:1;53556:3;53552:11;53545:39;53517:2;53514:1;53510:10;53505:15;;53481:113;;;53612:6;53609:1;53606:13;53603:101;;;53692:1;53683:6;53678:3;53674:16;53667:27;53603:101;53452:258;53403:307;;;:::o;53716:320::-;53760:6;53797:1;53791:4;53787:12;53777:22;;53844:1;53838:4;53834:12;53865:18;53855:81;;53921:4;53913:6;53909:17;53899:27;;53855:81;53983:2;53975:6;53972:14;53952:18;53949:38;53946:84;;;54002:18;;:::i;:::-;53946:84;53767:269;53716:320;;;:::o;54042:281::-;54125:27;54147:4;54125:27;:::i;:::-;54117:6;54113:40;54255:6;54243:10;54240:22;54219:18;54207:10;54204:34;54201:62;54198:88;;;54266:18;;:::i;:::-;54198:88;54306:10;54302:2;54295:22;54085:238;54042:281;;:::o;54329:233::-;54368:3;54391:24;54409:5;54391:24;:::i;:::-;54382:33;;54437:66;54430:5;54427:77;54424:103;;;54507:18;;:::i;:::-;54424:103;54554:1;54547:5;54543:13;54536:20;;54329:233;;;:::o;54568:79::-;54607:7;54636:5;54625:16;;54568:79;;;:::o;54653:180::-;54701:77;54698:1;54691:88;54798:4;54795:1;54788:15;54822:4;54819:1;54812:15;54839:180;54887:77;54884:1;54877:88;54984:4;54981:1;54974:15;55008:4;55005:1;54998:15;55025:180;55073:77;55070:1;55063:88;55170:4;55167:1;55160:15;55194:4;55191:1;55184:15;55211:180;55259:77;55256:1;55249:88;55356:4;55353:1;55346:15;55380:4;55377:1;55370:15;55397:180;55445:77;55442:1;55435:88;55542:4;55539:1;55532:15;55566:4;55563:1;55556:15;55583:183;55618:3;55656:1;55638:16;55635:23;55632:128;;;55694:1;55691;55688;55673:23;55716:34;55747:1;55741:8;55716:34;:::i;:::-;55709:41;;55632:128;55583:183;:::o;55772:117::-;55881:1;55878;55871:12;55895:117;56004:1;56001;55994:12;56018:117;56127:1;56124;56117:12;56141:117;56250:1;56247;56240:12;56264:117;56373:1;56370;56363:12;56387:102;56428:6;56479:2;56475:7;56470:2;56463:5;56459:14;56455:28;56445:38;;56387:102;;;:::o;56495:106::-;56539:8;56588:5;56583:3;56579:15;56558:36;;56495:106;;;:::o;56607:174::-;56747:26;56743:1;56735:6;56731:14;56724:50;56607:174;:::o;56787:239::-;56927:34;56923:1;56915:6;56911:14;56904:58;56996:22;56991:2;56983:6;56979:15;56972:47;56787:239;:::o;57032:227::-;57172:34;57168:1;57160:6;57156:14;57149:58;57241:10;57236:2;57228:6;57224:15;57217:35;57032:227;:::o;57265:181::-;57405:33;57401:1;57393:6;57389:14;57382:57;57265:181;:::o;57452:214::-;57592:66;57588:1;57580:6;57576:14;57569:90;57452:214;:::o;57672:230::-;57812:34;57808:1;57800:6;57796:14;57789:58;57881:13;57876:2;57868:6;57864:15;57857:38;57672:230;:::o;57908:225::-;58048:34;58044:1;58036:6;58032:14;58025:58;58117:8;58112:2;58104:6;58100:15;58093:33;57908:225;:::o;58139:164::-;58279:16;58275:1;58267:6;58263:14;58256:40;58139:164;:::o;58309:173::-;58449:25;58445:1;58437:6;58433:14;58426:49;58309:173;:::o;58488:228::-;58628:34;58624:1;58616:6;58612:14;58605:58;58697:11;58692:2;58684:6;58680:15;58673:36;58488:228;:::o;58722:168::-;58862:20;58858:1;58850:6;58846:14;58839:44;58722:168;:::o;58896:166::-;59036:18;59032:1;59024:6;59020:14;59013:42;58896:166;:::o;59068:173::-;59208:25;59204:1;59196:6;59192:14;59185:49;59068:173;:::o;59247:221::-;59387:34;59383:1;59375:6;59371:14;59364:58;59456:4;59451:2;59443:6;59439:15;59432:29;59247:221;:::o;59474:224::-;59614:34;59610:1;59602:6;59598:14;59591:58;59683:7;59678:2;59670:6;59666:15;59659:32;59474:224;:::o;59704:237::-;59844:34;59840:1;59832:6;59828:14;59821:58;59913:20;59908:2;59900:6;59896:15;59889:45;59704:237;:::o;59947:173::-;60087:25;60083:1;60075:6;60071:14;60064:49;59947:173;:::o;60126:221::-;60266:34;60262:1;60254:6;60250:14;60243:58;60335:4;60330:2;60322:6;60318:15;60311:29;60126:221;:::o;60353:169::-;60493:21;60489:1;60481:6;60477:14;60470:45;60353:169;:::o;60528:179::-;60668:31;60664:1;60656:6;60652:14;60645:55;60528:179;:::o;60713:171::-;60853:23;60849:1;60841:6;60837:14;60830:47;60713:171;:::o;60890:229::-;61030:34;61026:1;61018:6;61014:14;61007:58;61099:12;61094:2;61086:6;61082:15;61075:37;60890:229;:::o;61125:168::-;61265:20;61261:1;61253:6;61249:14;61242:44;61125:168;:::o;61299:182::-;61439:34;61435:1;61427:6;61423:14;61416:58;61299:182;:::o;61487:169::-;61627:21;61623:1;61615:6;61611:14;61604:45;61487:169;:::o;61662:163::-;61802:15;61798:1;61790:6;61786:14;61779:39;61662:163;:::o;61831:::-;61971:15;61967:1;61959:6;61955:14;61948:39;61831:163;:::o;62000:176::-;62140:28;62136:1;62128:6;62124:14;62117:52;62000:176;:::o;62182:162::-;62322:14;62318:1;62310:6;62306:14;62299:38;62182:162;:::o;62350:228::-;62490:34;62486:1;62478:6;62474:14;62467:58;62559:11;62554:2;62546:6;62542:15;62535:36;62350:228;:::o;62584:::-;62724:34;62720:1;62712:6;62708:14;62701:58;62793:11;62788:2;62780:6;62776:15;62769:36;62584:228;:::o;62818:227::-;62958:34;62954:1;62946:6;62942:14;62935:58;63027:10;63022:2;63014:6;63010:15;63003:35;62818:227;:::o;63051:220::-;63191:34;63187:1;63179:6;63175:14;63168:58;63260:3;63255:2;63247:6;63243:15;63236:28;63051:220;:::o;63277:181::-;63417:33;63413:1;63405:6;63401:14;63394:57;63277:181;:::o;63464:711::-;63503:3;63541:4;63523:16;63520:26;63517:39;;;63549:5;;63517:39;63578:20;;:::i;:::-;63653:1;63635:16;63631:24;63628:1;63622:4;63607:49;63686:4;63680:11;63785:16;63778:4;63770:6;63766:17;63763:39;63730:18;63722:6;63719:30;63703:113;63700:146;;;63831:5;;;;63700:146;63877:6;63871:4;63867:17;63913:3;63907:10;63940:18;63932:6;63929:30;63926:43;;;63962:5;;;;;;63926:43;64010:6;64003:4;63998:3;63994:14;63990:27;64069:1;64051:16;64047:24;64041:4;64037:35;64032:3;64029:44;64026:57;;;64076:5;;;;;;;64026:57;64093;64141:6;64135:4;64131:17;64123:6;64119:30;64113:4;64093:57;:::i;:::-;64166:3;64159:10;;63507:668;;;;;63464:711;;:::o;64181:122::-;64254:24;64272:5;64254:24;:::i;:::-;64247:5;64244:35;64234:63;;64293:1;64290;64283:12;64234:63;64181:122;:::o;64309:138::-;64390:32;64416:5;64390:32;:::i;:::-;64383:5;64380:43;64370:71;;64437:1;64434;64427:12;64370:71;64309:138;:::o;64453:116::-;64523:21;64538:5;64523:21;:::i;:::-;64516:5;64513:32;64503:60;;64559:1;64556;64549:12;64503:60;64453:116;:::o;64575:122::-;64648:24;64666:5;64648:24;:::i;:::-;64641:5;64638:35;64628:63;;64687:1;64684;64677:12;64628:63;64575:122;:::o;64703:120::-;64775:23;64792:5;64775:23;:::i;:::-;64768:5;64765:34;64755:62;;64813:1;64810;64803:12;64755:62;64703:120;:::o;64829:122::-;64902:24;64920:5;64902:24;:::i;:::-;64895:5;64892:35;64882:63;;64941:1;64938;64931:12;64882:63;64829:122;:::o
Swarm Source
ipfs://31974169a0eae74f1c2d098f724a17b9a7441b7b4ae9987633f2799b008a9278
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.