ERC-721
Overview
Max Total Supply
569 VA
Holders
207
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 VALoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
VoidAttractors
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-07-30 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Context.sol pragma solidity >=0.6.0 <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 GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/introspection/IERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: @openzeppelin/contracts/introspection/ERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity >=0.6.2 <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; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/EnumerableSet.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts/utils/EnumerableMap.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping (bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({ _key: key, _value: value })); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require(map._entries.length > index, "EnumerableMap: index out of bounds"); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key) return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage)))); } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = bytes1(uint8(48 + temp % 10)); temp /= 10; } return string(buffer); } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping (address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token"); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view virtual returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _tokenOwners.contains(tokenId); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); // internal owner _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(tokenId); emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (!to.isContract()) { return true; } bytes memory returndata = to.functionCall(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer"); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity >=0.6.0 <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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // ============================================================= VOID ATTRACTORS ============================================================================ // pragma solidity ^0.7.0; pragma abicoder v2; contract VoidAttractors is ERC721, Ownable { using SafeMath for uint256; // price of a VA uint256 public constant attractorPrice = 89000000000000000; // 0.089 ETH // max number of VA to purchase uint public constant MAX_ATTRACTOR_PURCHASE = 11; // max number of VA overall uint256 public constant MAX_ATTRACTORS = 569; // is sale active? bool public saleIsActive = false; // token name string private _name; // reconstructed code string public vaReconstructedCode; bool public isReconstructed = false; // mapping from token ID to name mapping (uint256 => string) public attractorNames; // mapping from tokenid mapping (uint256 => bool) public mintedTokens; // mapping from tokenid mapping (uint256 => bool) public nameSet; // event for setting name of a VA event NameChange (uint256 indexed nameIndex, string newName); // Reserve 25 attractors for promotional purposes uint public ATTRACTOR_RESERVE = 25; constructor() ERC721("Void Attractors", "VA") { } function withdraw() public onlyOwner { uint balance = address(this).balance; msg.sender.transfer(balance); } function reserveAttractors(address _to, uint256 _reserveAmount) public onlyOwner { uint supply = totalSupply(); require(_reserveAmount > 0 && _reserveAmount <= ATTRACTOR_RESERVE, "Not enough reserve left for team"); for (uint i = 0; i < _reserveAmount; i++) { _safeMint(_to, supply + i); } ATTRACTOR_RESERVE = ATTRACTOR_RESERVE.sub(_reserveAmount); } function setBaseURI(string memory baseURI) public onlyOwner { _setBaseURI(baseURI); } function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function tokensOfOwner(address _owner) external view returns(uint256[] memory ) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { // Return an empty array return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } function setAttractorName(uint256 _tokenId, string calldata _currName) public { address owner = ownerOf(_tokenId); require(msg.sender == owner, "not the owner"); require(nameSet[_tokenId] == false, "name already set"); nameSet[_tokenId] = true; attractorNames[_tokenId] = _currName; emit NameChange(_tokenId, _currName); // user can set any name. } function viewAttractorName(uint _tokenId) public view returns(string memory){ require( _tokenId < totalSupply(), "choose an attractor within range" ); return attractorNames[_tokenId]; } function setReconstructedCode(string calldata _currName) public onlyOwner { require(isReconstructed == false, "already reconstructed"); isReconstructed = true; vaReconstructedCode = _currName; } function viewReconstructedCode() public view returns(string memory) { return vaReconstructedCode; } function viewMatrixSet() public pure returns(string memory) { return "Matrix M_x or M_y: from -pi to pi resolved by Horizontal or Vertical Wrapping"; } function viewVectorSet() public pure returns(string memory) { return "Used: sin(M_x*Latitude) and cos(M_y*Longitude) or tan(.) and combinations thereof"; } function viewParameterSet() public pure returns(string memory) { return "Parameters: Function Combination, Latitude, Longitude, Horizontal Wrapping, Vertical Wrapping, Width, Scale, Size, Frame"; } function viewColorSet() public pure returns(string memory) { return "Color: Background and Front in RGB channels twice. Frame: min(RGB) divided by 2.5"; } function mintAttractor(uint _numberOfTokens) public payable { require(saleIsActive, "wait for sale start uwu"); require(_numberOfTokens > 0 && _numberOfTokens <= MAX_ATTRACTOR_PURCHASE, "you can mint only 11 honey"); require(totalSupply().add(_numberOfTokens) <= MAX_ATTRACTORS, "no no, supply exceeded"); require(msg.value >= attractorPrice.mul(_numberOfTokens), "insufficient eth baby"); for(uint i = 0; i < _numberOfTokens; i++) { uint mintIndex = totalSupply(); if (totalSupply() < MAX_ATTRACTORS) { _safeMint(msg.sender, mintIndex); mintedTokens[mintIndex] = true; } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nameIndex","type":"uint256"},{"indexed":false,"internalType":"string","name":"newName","type":"string"}],"name":"NameChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ATTRACTOR_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ATTRACTORS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ATTRACTOR_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"attractorNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"attractorPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isReconstructed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfTokens","type":"uint256"}],"name":"mintAttractor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nameSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveAttractors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","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":"_tokenId","type":"uint256"},{"internalType":"string","name":"_currName","type":"string"}],"name":"setAttractorName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_currName","type":"string"}],"name":"setReconstructedCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaReconstructedCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"viewAttractorName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewColorSet","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"viewMatrixSet","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"viewParameterSet","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"viewReconstructedCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewVectorSet","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600a60146101000a81548160ff0219169083151502179055506000600d60006101000a81548160ff02191690831515021790555060196011553480156200004c57600080fd5b506040518060400160405280600f81526020017f566f696420417474726163746f727300000000000000000000000000000000008152506040518060400160405280600281526020017f5641000000000000000000000000000000000000000000000000000000000000815250620000d16301ffc9a760e01b6200020460201b60201c565b8160069080519060200190620000e9929190620002e4565b50806007908051906020019062000102929190620002e4565b506200011b6380ac58cd60e01b6200020460201b60201c565b62000133635b5e139f60e01b6200020460201b60201c565b6200014b63780e9d6360e01b6200020460201b60201c565b505060006200015f620002dc60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200040f565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000270576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200026790620003dc565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200031c576000855562000368565b82601f106200033757805160ff191683800117855562000368565b8280016001018555821562000368579182015b82811115620003675782518255916020019190600101906200034a565b5b5090506200037791906200037b565b5090565b5b80821115620003965760008160009055506001016200037c565b5090565b6000620003a9601c83620003fe565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b60006020820190508181036000830152620003f7816200039a565b9050919050565b600082825260208201905092915050565b614f62806200041f6000396000f3fe6080604052600436106102675760003560e01c80636352211e11610144578063a22cb465116100b6578063e985e9c51161007a578063e985e9c514610939578063eb8d244414610976578063f2fde38b146109a1578063f3fc64db146109ca578063f62ddca6146109f3578063fb918f0314610a3057610267565b8063a22cb46514610856578063b87058431461087f578063b88d4fde146108aa578063c87b56dd146108d3578063d10cbd8c1461091057610267565b806372a16e5a1161010857806372a16e5a1461071e5780637ef758d41461075b5780638462151c146107985780638da5cb5b146107d557806395d89b4114610800578063991049ba1461082b57610267565b80636352211e146106255780636adcac91146106625780636c0360eb1461069f57806370a08231146106ca578063715018a61461070757610267565b806334918dfd116101dd5780634aa30d7e116101a15780634aa30d7e146105225780634f6ccce71461054d5780635058632e1461058a57806351ade075146105b557806355f804b3146105e05780635e13103b1461060957610267565b806334918dfd146104755780633ccfd60b1461048c5780633d01afb5146104a357806342842e0e146104ce578063467f0b72146104f757610267565b80631831002e1161022f5780631831002e146103655780631dce92091461039057806323728377146103bb57806323b872dd146103e657806325bf32da1461040f5780632f745c591461043857610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b31461031157806318160ddd1461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e91906138e6565b610a5b565b6040516102a091906146bf565b60405180910390f35b3480156102b557600080fd5b506102be610ac2565b6040516102cb91906146fe565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f691906139be565b610b64565b6040516103089190614636565b60405180910390f35b34801561031d57600080fd5b50610338600480360381019061033391906138aa565b610be9565b005b34801561034657600080fd5b5061034f610d01565b60405161035c9190614b00565b60405180910390f35b34801561037157600080fd5b5061037a610d12565b6040516103879190614b00565b60405180910390f35b34801561039c57600080fd5b506103a5610d1e565b6040516103b29190614b00565b60405180910390f35b3480156103c757600080fd5b506103d0610d23565b6040516103dd91906146fe565b60405180910390f35b3480156103f257600080fd5b5061040d600480360381019061040891906137a4565b610d43565b005b34801561041b57600080fd5b5061043660048036038101906104319190613938565b610da3565b005b34801561044457600080fd5b5061045f600480360381019061045a91906138aa565b610ea6565b60405161046c9190614b00565b60405180910390f35b34801561048157600080fd5b5061048a610f01565b005b34801561049857600080fd5b506104a1610fa9565b005b3480156104af57600080fd5b506104b8611074565b6040516104c591906146bf565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f091906137a4565b611087565b005b34801561050357600080fd5b5061050c6110a7565b60405161051991906146fe565b60405180910390f35b34801561052e57600080fd5b506105376110c7565b6040516105449190614b00565b60405180910390f35b34801561055957600080fd5b50610574600480360381019061056f91906139be565b6110cd565b6040516105819190614b00565b60405180910390f35b34801561059657600080fd5b5061059f6110f0565b6040516105ac9190614b00565b60405180910390f35b3480156105c157600080fd5b506105ca6110f6565b6040516105d791906146fe565b60405180910390f35b3480156105ec57600080fd5b506106076004803603810190610602919061397d565b611194565b005b610623600480360381019061061e91906139be565b61121c565b005b34801561063157600080fd5b5061064c600480360381019061064791906139be565b6113e7565b6040516106599190614636565b60405180910390f35b34801561066e57600080fd5b50610689600480360381019061068491906139be565b61141e565b60405161069691906146fe565b60405180910390f35b3480156106ab57600080fd5b506106b46114ce565b6040516106c191906146fe565b60405180910390f35b3480156106d657600080fd5b506106f160048036038101906106ec919061373f565b611570565b6040516106fe9190614b00565b60405180910390f35b34801561071357600080fd5b5061071c61162f565b005b34801561072a57600080fd5b50610745600480360381019061074091906139be565b61176c565b60405161075291906146bf565b60405180910390f35b34801561076757600080fd5b50610782600480360381019061077d91906139be565b61178c565b60405161078f91906146bf565b60405180910390f35b3480156107a457600080fd5b506107bf60048036038101906107ba919061373f565b6117ac565b6040516107cc919061469d565b60405180910390f35b3480156107e157600080fd5b506107ea6118a5565b6040516107f79190614636565b60405180910390f35b34801561080c57600080fd5b506108156118cf565b60405161082291906146fe565b60405180910390f35b34801561083757600080fd5b50610840611971565b60405161084d91906146fe565b60405180910390f35b34801561086257600080fd5b5061087d6004803603810190610878919061386e565b611a13565b005b34801561088b57600080fd5b50610894611b94565b6040516108a191906146fe565b60405180910390f35b3480156108b657600080fd5b506108d160048036038101906108cc91906137f3565b611bb4565b005b3480156108df57600080fd5b506108fa60048036038101906108f591906139be565b611c16565b60405161090791906146fe565b60405180910390f35b34801561091c57600080fd5b50610937600480360381019061093291906139e7565b611d99565b005b34801561094557600080fd5b50610960600480360381019061095b9190613768565b611f0a565b60405161096d91906146bf565b60405180910390f35b34801561098257600080fd5b5061098b611f9e565b60405161099891906146bf565b60405180910390f35b3480156109ad57600080fd5b506109c860048036038101906109c3919061373f565b611fb1565b005b3480156109d657600080fd5b506109f160048036038101906109ec91906138aa565b61215d565b005b3480156109ff57600080fd5b50610a1a6004803603810190610a1591906139be565b61227b565b604051610a2791906146fe565b60405180910390f35b348015610a3c57600080fd5b50610a45612379565b604051610a5291906146fe565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b5a5780601f10610b2f57610100808354040283529160200191610b5a565b820191906000526020600020905b815481529060010190602001808311610b3d57829003601f168201915b5050505050905090565b6000610b6f82612399565b610bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba5906149e0565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bf4826113e7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90614a60565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c846123b6565b73ffffffffffffffffffffffffffffffffffffffff161480610cb35750610cb281610cad6123b6565b611f0a565b5b610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce990614940565b60405180910390fd5b610cfc83836123be565b505050565b6000610d0d6002612477565b905090565b67013c31074902800081565b600b81565b6060604051806080016040528060518152602001614edc60519139905090565b610d54610d4e6123b6565b8261248c565b610d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8a90614a80565b60405180910390fd5b610d9e83838361256a565b505050565b610dab6123b6565b73ffffffffffffffffffffffffffffffffffffffff16610dc96118a5565b73ffffffffffffffffffffffffffffffffffffffff1614610e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1690614a00565b60405180910390fd5b60001515600d60009054906101000a900460ff16151514610e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6c90614ac0565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055508181600c9190610ea1929190613483565b505050565b6000610ef982600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061278190919063ffffffff16565b905092915050565b610f096123b6565b73ffffffffffffffffffffffffffffffffffffffff16610f276118a5565b73ffffffffffffffffffffffffffffffffffffffff1614610f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7490614a00565b60405180910390fd5b600a60149054906101000a900460ff1615600a60146101000a81548160ff021916908315150217905550565b610fb16123b6565b73ffffffffffffffffffffffffffffffffffffffff16610fcf6118a5565b73ffffffffffffffffffffffffffffffffffffffff1614611025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101c90614a00565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611070573d6000803e3d6000fd5b5050565b600d60009054906101000a900460ff1681565b6110a283838360405180602001604052806000815250611bb4565b505050565b6060604051806080016040528060518152602001614e8b60519139905090565b60115481565b6000806110e483600261279b90919063ffffffff16565b50905080915050919050565b61023981565b600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561118c5780601f106111615761010080835404028352916020019161118c565b820191906000526020600020905b81548152906001019060200180831161116f57829003601f168201915b505050505081565b61119c6123b6565b73ffffffffffffffffffffffffffffffffffffffff166111ba6118a5565b73ffffffffffffffffffffffffffffffffffffffff1614611210576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120790614a00565b60405180910390fd5b611219816127c7565b50565b600a60149054906101000a900460ff1661126b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126290614780565b60405180910390fd5b60008111801561127c5750600b8111155b6112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290614ae0565b60405180910390fd5b6102396112d8826112ca610d01565b6127e190919063ffffffff16565b1115611319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131090614900565b60405180910390fd5b6113348167013c31074902800061283690919063ffffffff16565b341015611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136d90614880565b60405180910390fd5b60005b818110156113e357600061138b610d01565b9050610239611398610d01565b10156113d5576113a833826128a6565b6001600f600083815260200190815260200160002060006101000a81548160ff0219169083151502179055505b508080600101915050611379565b5050565b600061141782604051806060016040528060298152602001614e156029913960026128c49092919063ffffffff16565b9050919050565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c65780601f1061149b576101008083540402835291602001916114c6565b820191906000526020600020905b8154815290600101906020018083116114a957829003601f168201915b505050505081565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115665780601f1061153b57610100808354040283529160200191611566565b820191906000526020600020905b81548152906001019060200180831161154957829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d890614960565b60405180910390fd5b611628600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206128e3565b9050919050565b6116376123b6565b73ffffffffffffffffffffffffffffffffffffffff166116556118a5565b73ffffffffffffffffffffffffffffffffffffffff16146116ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a290614a00565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60106020528060005260406000206000915054906101000a900460ff1681565b600f6020528060005260406000206000915054906101000a900460ff1681565b606060006117b983611570565b9050600081141561181457600067ffffffffffffffff811180156117dc57600080fd5b5060405190808252806020026020018201604052801561180b5781602001602082028036833780820191505090505b509150506118a0565b60008167ffffffffffffffff8111801561182d57600080fd5b5060405190808252806020026020018201604052801561185c5781602001602082028036833780820191505090505b50905060005b82811015611899576118748582610ea6565b82828151811061188057fe5b6020026020010181815250508080600101915050611862565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119675780601f1061193c57610100808354040283529160200191611967565b820191906000526020600020905b81548152906001019060200180831161194a57829003601f168201915b5050505050905090565b6060600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a095780601f106119de57610100808354040283529160200191611a09565b820191906000526020600020905b8154815290600101906020018083116119ec57829003601f168201915b5050505050905090565b611a1b6123b6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8090614860565b60405180910390fd5b8060056000611a966123b6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b436123b6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b8891906146bf565b60405180910390a35050565b60606040518060a0016040528060788152602001614d9d60789139905090565b611bc5611bbf6123b6565b8361248c565b611c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfb90614a80565b60405180910390fd5b611c10848484846128f8565b50505050565b6060611c2182612399565b611c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5790614a40565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d095780601f10611cde57610100808354040283529160200191611d09565b820191906000526020600020905b815481529060010190602001808311611cec57829003601f168201915b505050505090506000611d1a6114ce565b9050600081511415611d30578192505050611d94565b600082511115611d65578082604051602001611d4d929190614612565b60405160208183030381529060405292505050611d94565b80611d6f85612954565b604051602001611d80929190614612565b604051602081830303815290604052925050505b919050565b6000611da4846113e7565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0b90614740565b60405180910390fd5b600015156010600086815260200190815260200160002060009054906101000a900460ff16151514611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7290614920565b60405180910390fd5b60016010600086815260200190815260200160002060006101000a81548160ff0219169083151502179055508282600e60008781526020019081526020016000209190611ec9929190613483565b50837f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b8484604051611efc9291906146da565b60405180910390a250505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a60149054906101000a900460ff1681565b611fb96123b6565b73ffffffffffffffffffffffffffffffffffffffff16611fd76118a5565b73ffffffffffffffffffffffffffffffffffffffff161461202d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202490614a00565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561209d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612094906147c0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6121656123b6565b73ffffffffffffffffffffffffffffffffffffffff166121836118a5565b73ffffffffffffffffffffffffffffffffffffffff16146121d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d090614a00565b60405180910390fd5b60006121e3610d01565b90506000821180156121f757506011548211155b612236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222d90614820565b60405180910390fd5b60005b8281101561225a5761224d848284016128a6565b8080600101915050612239565b5061227082601154612a9b90919063ffffffff16565b601181905550505050565b6060612285610d01565b82106122c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bd90614760565b60405180910390fd5b600e60008381526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561236d5780601f106123425761010080835404028352916020019161236d565b820191906000526020600020905b81548152906001019060200180831161235057829003601f168201915b50505050509050919050565b60606040518060800160405280604d8152602001614e3e604d9139905090565b60006123af826002612aeb90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612431836113e7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061248582600001612b05565b9050919050565b600061249782612399565b6124d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cd906148e0565b60405180910390fd5b60006124e1836113e7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061255057508373ffffffffffffffffffffffffffffffffffffffff1661253884610b64565b73ffffffffffffffffffffffffffffffffffffffff16145b8061256157506125608185611f0a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661258a826113e7565b73ffffffffffffffffffffffffffffffffffffffff16146125e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d790614a20565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612650576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264790614840565b60405180910390fd5b61265b838383612b16565b6126666000826123be565b6126b781600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612b1b90919063ffffffff16565b5061270981600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612b3590919063ffffffff16565b5061272081836002612b4f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006127908360000183612b84565b60001c905092915050565b6000806000806127ae8660000186612bf1565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906127dd929190613511565b5050565b60008082840190508381101561282c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282390614800565b60405180910390fd5b8091505092915050565b60008083141561284957600090506128a0565b600082840290508284828161285a57fe5b041461289b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612892906149c0565b60405180910390fd5b809150505b92915050565b6128c0828260405180602001604052806000815250612c74565b5050565b60006128d7846000018460001b84612ccf565b60001c90509392505050565b60006128f182600001612d60565b9050919050565b61290384848461256a565b61290f84848484612d71565b61294e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612945906147a0565b60405180910390fd5b50505050565b6060600082141561299c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a96565b600082905060005b600082146129c6578080600101915050600a82816129be57fe5b0491506129a4565b60008167ffffffffffffffff811180156129df57600080fd5b506040519080825280601f01601f191660200182016040528015612a125781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612a8e57600a8481612a3357fe5b0660300160f81b82828060019003935081518110612a4d57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612a8657fe5b049350612a21565b819450505050505b919050565b600082821115612ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad7906148a0565b60405180910390fd5b818303905092915050565b6000612afd836000018360001b612ed5565b905092915050565b600081600001805490509050919050565b505050565b6000612b2d836000018360001b612ef8565b905092915050565b6000612b47836000018360001b612fe0565b905092915050565b6000612b7b846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613050565b90509392505050565b600081836000018054905011612bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc690614720565b60405180910390fd5b826000018281548110612bde57fe5b9060005260206000200154905092915050565b60008082846000018054905011612c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3490614980565b60405180910390fd5b6000846000018481548110612c4e57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b612c7e838361312c565b612c8b6000848484612d71565b612cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc1906147a0565b60405180910390fd5b505050565b60008084600101600085815260200190815260200160002054905060008114158390612d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2891906146fe565b60405180910390fd5b50846000016001820381548110612d4457fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612d928473ffffffffffffffffffffffffffffffffffffffff166132ba565b612d9f5760019050612ecd565b6000612e6663150b7a0260e01b612db46123b6565b888787604051602401612dca9493929190614651565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001614d6b603291398773ffffffffffffffffffffffffffffffffffffffff166132cd9092919063ffffffff16565b9050600081806020019051810190612e7e919061390f565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114612fd45760006001820390506000600186600001805490500390506000866000018281548110612f4357fe5b9060005260206000200154905080876000018481548110612f6057fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480612f9857fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612fda565b60009150505b92915050565b6000612fec83836132e5565b61304557826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061304a565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156130f757846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613125565b8285600001600183038154811061310a57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561319c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613193906149a0565b60405180910390fd5b6131a581612399565b156131e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131dc906147e0565b60405180910390fd5b6131f160008383612b16565b61324281600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612b3590919063ffffffff16565b5061325981836002612b4f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606132dc8484600085613308565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b60608247101561334d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613344906148c0565b60405180910390fd5b613356856132ba565b613395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338c90614aa0565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516133be91906145fb565b60006040518083038185875af1925050503d80600081146133fb576040519150601f19603f3d011682016040523d82523d6000602084013e613400565b606091505b509150915061341082828661341c565b92505050949350505050565b6060831561342c5782905061347c565b60008351111561343f5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347391906146fe565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826134b95760008555613500565b82601f106134d257803560ff1916838001178555613500565b82800160010185558215613500579182015b828111156134ff5782358255916020019190600101906134e4565b5b50905061350d919061359f565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613547576000855561358e565b82601f1061356057805160ff191683800117855561358e565b8280016001018555821561358e579182015b8281111561358d578251825591602001919060010190613572565b5b50905061359b919061359f565b5090565b5b808211156135b85760008160009055506001016135a0565b5090565b60006135cf6135ca84614b4c565b614b1b565b9050828152602081018484840111156135e757600080fd5b6135f2848285614cb9565b509392505050565b600061360d61360884614b7c565b614b1b565b90508281526020810184848401111561362557600080fd5b613630848285614cb9565b509392505050565b60008135905061364781614d0e565b92915050565b60008135905061365c81614d25565b92915050565b60008135905061367181614d3c565b92915050565b60008151905061368681614d3c565b92915050565b600082601f83011261369d57600080fd5b81356136ad8482602086016135bc565b91505092915050565b60008083601f8401126136c857600080fd5b8235905067ffffffffffffffff8111156136e157600080fd5b6020830191508360018202830111156136f957600080fd5b9250929050565b600082601f83011261371157600080fd5b81356137218482602086016135fa565b91505092915050565b60008135905061373981614d53565b92915050565b60006020828403121561375157600080fd5b600061375f84828501613638565b91505092915050565b6000806040838503121561377b57600080fd5b600061378985828601613638565b925050602061379a85828601613638565b9150509250929050565b6000806000606084860312156137b957600080fd5b60006137c786828701613638565b93505060206137d886828701613638565b92505060406137e98682870161372a565b9150509250925092565b6000806000806080858703121561380957600080fd5b600061381787828801613638565b945050602061382887828801613638565b93505060406138398782880161372a565b925050606085013567ffffffffffffffff81111561385657600080fd5b6138628782880161368c565b91505092959194509250565b6000806040838503121561388157600080fd5b600061388f85828601613638565b92505060206138a08582860161364d565b9150509250929050565b600080604083850312156138bd57600080fd5b60006138cb85828601613638565b92505060206138dc8582860161372a565b9150509250929050565b6000602082840312156138f857600080fd5b600061390684828501613662565b91505092915050565b60006020828403121561392157600080fd5b600061392f84828501613677565b91505092915050565b6000806020838503121561394b57600080fd5b600083013567ffffffffffffffff81111561396557600080fd5b613971858286016136b6565b92509250509250929050565b60006020828403121561398f57600080fd5b600082013567ffffffffffffffff8111156139a957600080fd5b6139b584828501613700565b91505092915050565b6000602082840312156139d057600080fd5b60006139de8482850161372a565b91505092915050565b6000806000604084860312156139fc57600080fd5b6000613a0a8682870161372a565b935050602084013567ffffffffffffffff811115613a2757600080fd5b613a33868287016136b6565b92509250509250925092565b6000613a4b83836145dd565b60208301905092915050565b613a6081614c45565b82525050565b613a6f81614c33565b82525050565b6000613a8082614bbc565b613a8a8185614bea565b9350613a9583614bac565b8060005b83811015613ac6578151613aad8882613a3f565b9750613ab883614bdd565b925050600181019050613a99565b5085935050505092915050565b613adc81614c57565b82525050565b6000613aed82614bc7565b613af78185614bfb565b9350613b07818560208601614cc8565b613b1081614cfd565b840191505092915050565b6000613b2682614bc7565b613b308185614c0c565b9350613b40818560208601614cc8565b80840191505092915050565b6000613b588385614c17565b9350613b65838584614cb9565b613b6e83614cfd565b840190509392505050565b6000613b8482614bd2565b613b8e8185614c17565b9350613b9e818560208601614cc8565b613ba781614cfd565b840191505092915050565b6000613bbd82614bd2565b613bc78185614c28565b9350613bd7818560208601614cc8565b80840191505092915050565b6000613bf0602283614c17565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c56600d83614c17565b91507f6e6f7420746865206f776e6572000000000000000000000000000000000000006000830152602082019050919050565b6000613c96602083614c17565b91507f63686f6f736520616e20617474726163746f722077697468696e2072616e67656000830152602082019050919050565b6000613cd6601783614c17565b91507f7761697420666f722073616c65207374617274207577750000000000000000006000830152602082019050919050565b6000613d16603283614c17565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613d7c602683614c17565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613de2601c83614c17565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613e22601b83614c17565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000613e62602083614c17565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b6000613ea2602483614c17565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f08601983614c17565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613f48601583614c17565b91507f696e73756666696369656e7420657468206261627900000000000000000000006000830152602082019050919050565b6000613f88601e83614c17565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b6000613fc8602683614c17565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061402e602c83614c17565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614094601683614c17565b91507f6e6f206e6f2c20737570706c79206578636565646564000000000000000000006000830152602082019050919050565b60006140d4601083614c17565b91507f6e616d6520616c726561647920736574000000000000000000000000000000006000830152602082019050919050565b6000614114603883614c17565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061417a602a83614c17565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006141e0602283614c17565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614246602083614c17565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614286602183614c17565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142ec602c83614c17565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614352602083614c17565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614392602983614c17565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006143f8602f83614c17565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061445e602183614c17565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144c4603183614c17565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061452a601d83614c17565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b600061456a601583614c17565b91507f616c7265616479207265636f6e737472756374656400000000000000000000006000830152602082019050919050565b60006145aa601a83614c17565b91507f796f752063616e206d696e74206f6e6c7920313120686f6e65790000000000006000830152602082019050919050565b6145e681614caf565b82525050565b6145f581614caf565b82525050565b60006146078284613b1b565b915081905092915050565b600061461e8285613bb2565b915061462a8284613bb2565b91508190509392505050565b600060208201905061464b6000830184613a66565b92915050565b60006080820190506146666000830187613a57565b6146736020830186613a66565b61468060408301856145ec565b81810360608301526146928184613ae2565b905095945050505050565b600060208201905081810360008301526146b78184613a75565b905092915050565b60006020820190506146d46000830184613ad3565b92915050565b600060208201905081810360008301526146f5818486613b4c565b90509392505050565b600060208201905081810360008301526147188184613b79565b905092915050565b6000602082019050818103600083015261473981613be3565b9050919050565b6000602082019050818103600083015261475981613c49565b9050919050565b6000602082019050818103600083015261477981613c89565b9050919050565b6000602082019050818103600083015261479981613cc9565b9050919050565b600060208201905081810360008301526147b981613d09565b9050919050565b600060208201905081810360008301526147d981613d6f565b9050919050565b600060208201905081810360008301526147f981613dd5565b9050919050565b6000602082019050818103600083015261481981613e15565b9050919050565b6000602082019050818103600083015261483981613e55565b9050919050565b6000602082019050818103600083015261485981613e95565b9050919050565b6000602082019050818103600083015261487981613efb565b9050919050565b6000602082019050818103600083015261489981613f3b565b9050919050565b600060208201905081810360008301526148b981613f7b565b9050919050565b600060208201905081810360008301526148d981613fbb565b9050919050565b600060208201905081810360008301526148f981614021565b9050919050565b6000602082019050818103600083015261491981614087565b9050919050565b60006020820190508181036000830152614939816140c7565b9050919050565b6000602082019050818103600083015261495981614107565b9050919050565b600060208201905081810360008301526149798161416d565b9050919050565b60006020820190508181036000830152614999816141d3565b9050919050565b600060208201905081810360008301526149b981614239565b9050919050565b600060208201905081810360008301526149d981614279565b9050919050565b600060208201905081810360008301526149f9816142df565b9050919050565b60006020820190508181036000830152614a1981614345565b9050919050565b60006020820190508181036000830152614a3981614385565b9050919050565b60006020820190508181036000830152614a59816143eb565b9050919050565b60006020820190508181036000830152614a7981614451565b9050919050565b60006020820190508181036000830152614a99816144b7565b9050919050565b60006020820190508181036000830152614ab98161451d565b9050919050565b60006020820190508181036000830152614ad98161455d565b9050919050565b60006020820190508181036000830152614af98161459d565b9050919050565b6000602082019050614b1560008301846145ec565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614b4257614b41614cfb565b5b8060405250919050565b600067ffffffffffffffff821115614b6757614b66614cfb565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614b9757614b96614cfb565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c3e82614c8f565b9050919050565b6000614c5082614c8f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614ce6578082015181840152602081019050614ccb565b83811115614cf5576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b614d1781614c33565b8114614d2257600080fd5b50565b614d2e81614c57565b8114614d3957600080fd5b50565b614d4581614c63565b8114614d5057600080fd5b50565b614d5c81614caf565b8114614d6757600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572506172616d65746572733a2046756e6374696f6e20436f6d62696e6174696f6e2c204c617469747564652c204c6f6e6769747564652c20486f72697a6f6e74616c205772617070696e672c20566572746963616c205772617070696e672c2057696474682c205363616c652c2053697a652c204672616d654552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e4d6174726978204d5f78206f72204d5f793a2066726f6d202d706920746f207069207265736f6c76656420627920486f72697a6f6e74616c206f7220566572746963616c205772617070696e67436f6c6f723a204261636b67726f756e6420616e642046726f6e7420696e20524742206368616e6e656c732074776963652e204672616d653a206d696e2852474229206469766964656420627920322e35557365643a2073696e284d5f782a4c617469747564652920616e6420636f73284d5f792a4c6f6e67697475646529206f722074616e282e2920616e6420636f6d62696e6174696f6e732074686572656f66a2646970667358221220576f47332f21c75deff0edbb7321b8d56ab1e8515d2b60a86ebbd1712b8b720e64736f6c63430007060033
Deployed Bytecode
0x6080604052600436106102675760003560e01c80636352211e11610144578063a22cb465116100b6578063e985e9c51161007a578063e985e9c514610939578063eb8d244414610976578063f2fde38b146109a1578063f3fc64db146109ca578063f62ddca6146109f3578063fb918f0314610a3057610267565b8063a22cb46514610856578063b87058431461087f578063b88d4fde146108aa578063c87b56dd146108d3578063d10cbd8c1461091057610267565b806372a16e5a1161010857806372a16e5a1461071e5780637ef758d41461075b5780638462151c146107985780638da5cb5b146107d557806395d89b4114610800578063991049ba1461082b57610267565b80636352211e146106255780636adcac91146106625780636c0360eb1461069f57806370a08231146106ca578063715018a61461070757610267565b806334918dfd116101dd5780634aa30d7e116101a15780634aa30d7e146105225780634f6ccce71461054d5780635058632e1461058a57806351ade075146105b557806355f804b3146105e05780635e13103b1461060957610267565b806334918dfd146104755780633ccfd60b1461048c5780633d01afb5146104a357806342842e0e146104ce578063467f0b72146104f757610267565b80631831002e1161022f5780631831002e146103655780631dce92091461039057806323728377146103bb57806323b872dd146103e657806325bf32da1461040f5780632f745c591461043857610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b31461031157806318160ddd1461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e91906138e6565b610a5b565b6040516102a091906146bf565b60405180910390f35b3480156102b557600080fd5b506102be610ac2565b6040516102cb91906146fe565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f691906139be565b610b64565b6040516103089190614636565b60405180910390f35b34801561031d57600080fd5b50610338600480360381019061033391906138aa565b610be9565b005b34801561034657600080fd5b5061034f610d01565b60405161035c9190614b00565b60405180910390f35b34801561037157600080fd5b5061037a610d12565b6040516103879190614b00565b60405180910390f35b34801561039c57600080fd5b506103a5610d1e565b6040516103b29190614b00565b60405180910390f35b3480156103c757600080fd5b506103d0610d23565b6040516103dd91906146fe565b60405180910390f35b3480156103f257600080fd5b5061040d600480360381019061040891906137a4565b610d43565b005b34801561041b57600080fd5b5061043660048036038101906104319190613938565b610da3565b005b34801561044457600080fd5b5061045f600480360381019061045a91906138aa565b610ea6565b60405161046c9190614b00565b60405180910390f35b34801561048157600080fd5b5061048a610f01565b005b34801561049857600080fd5b506104a1610fa9565b005b3480156104af57600080fd5b506104b8611074565b6040516104c591906146bf565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f091906137a4565b611087565b005b34801561050357600080fd5b5061050c6110a7565b60405161051991906146fe565b60405180910390f35b34801561052e57600080fd5b506105376110c7565b6040516105449190614b00565b60405180910390f35b34801561055957600080fd5b50610574600480360381019061056f91906139be565b6110cd565b6040516105819190614b00565b60405180910390f35b34801561059657600080fd5b5061059f6110f0565b6040516105ac9190614b00565b60405180910390f35b3480156105c157600080fd5b506105ca6110f6565b6040516105d791906146fe565b60405180910390f35b3480156105ec57600080fd5b506106076004803603810190610602919061397d565b611194565b005b610623600480360381019061061e91906139be565b61121c565b005b34801561063157600080fd5b5061064c600480360381019061064791906139be565b6113e7565b6040516106599190614636565b60405180910390f35b34801561066e57600080fd5b50610689600480360381019061068491906139be565b61141e565b60405161069691906146fe565b60405180910390f35b3480156106ab57600080fd5b506106b46114ce565b6040516106c191906146fe565b60405180910390f35b3480156106d657600080fd5b506106f160048036038101906106ec919061373f565b611570565b6040516106fe9190614b00565b60405180910390f35b34801561071357600080fd5b5061071c61162f565b005b34801561072a57600080fd5b50610745600480360381019061074091906139be565b61176c565b60405161075291906146bf565b60405180910390f35b34801561076757600080fd5b50610782600480360381019061077d91906139be565b61178c565b60405161078f91906146bf565b60405180910390f35b3480156107a457600080fd5b506107bf60048036038101906107ba919061373f565b6117ac565b6040516107cc919061469d565b60405180910390f35b3480156107e157600080fd5b506107ea6118a5565b6040516107f79190614636565b60405180910390f35b34801561080c57600080fd5b506108156118cf565b60405161082291906146fe565b60405180910390f35b34801561083757600080fd5b50610840611971565b60405161084d91906146fe565b60405180910390f35b34801561086257600080fd5b5061087d6004803603810190610878919061386e565b611a13565b005b34801561088b57600080fd5b50610894611b94565b6040516108a191906146fe565b60405180910390f35b3480156108b657600080fd5b506108d160048036038101906108cc91906137f3565b611bb4565b005b3480156108df57600080fd5b506108fa60048036038101906108f591906139be565b611c16565b60405161090791906146fe565b60405180910390f35b34801561091c57600080fd5b50610937600480360381019061093291906139e7565b611d99565b005b34801561094557600080fd5b50610960600480360381019061095b9190613768565b611f0a565b60405161096d91906146bf565b60405180910390f35b34801561098257600080fd5b5061098b611f9e565b60405161099891906146bf565b60405180910390f35b3480156109ad57600080fd5b506109c860048036038101906109c3919061373f565b611fb1565b005b3480156109d657600080fd5b506109f160048036038101906109ec91906138aa565b61215d565b005b3480156109ff57600080fd5b50610a1a6004803603810190610a1591906139be565b61227b565b604051610a2791906146fe565b60405180910390f35b348015610a3c57600080fd5b50610a45612379565b604051610a5291906146fe565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b5a5780601f10610b2f57610100808354040283529160200191610b5a565b820191906000526020600020905b815481529060010190602001808311610b3d57829003601f168201915b5050505050905090565b6000610b6f82612399565b610bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba5906149e0565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bf4826113e7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90614a60565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c846123b6565b73ffffffffffffffffffffffffffffffffffffffff161480610cb35750610cb281610cad6123b6565b611f0a565b5b610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce990614940565b60405180910390fd5b610cfc83836123be565b505050565b6000610d0d6002612477565b905090565b67013c31074902800081565b600b81565b6060604051806080016040528060518152602001614edc60519139905090565b610d54610d4e6123b6565b8261248c565b610d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8a90614a80565b60405180910390fd5b610d9e83838361256a565b505050565b610dab6123b6565b73ffffffffffffffffffffffffffffffffffffffff16610dc96118a5565b73ffffffffffffffffffffffffffffffffffffffff1614610e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1690614a00565b60405180910390fd5b60001515600d60009054906101000a900460ff16151514610e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6c90614ac0565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055508181600c9190610ea1929190613483565b505050565b6000610ef982600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061278190919063ffffffff16565b905092915050565b610f096123b6565b73ffffffffffffffffffffffffffffffffffffffff16610f276118a5565b73ffffffffffffffffffffffffffffffffffffffff1614610f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7490614a00565b60405180910390fd5b600a60149054906101000a900460ff1615600a60146101000a81548160ff021916908315150217905550565b610fb16123b6565b73ffffffffffffffffffffffffffffffffffffffff16610fcf6118a5565b73ffffffffffffffffffffffffffffffffffffffff1614611025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101c90614a00565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611070573d6000803e3d6000fd5b5050565b600d60009054906101000a900460ff1681565b6110a283838360405180602001604052806000815250611bb4565b505050565b6060604051806080016040528060518152602001614e8b60519139905090565b60115481565b6000806110e483600261279b90919063ffffffff16565b50905080915050919050565b61023981565b600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561118c5780601f106111615761010080835404028352916020019161118c565b820191906000526020600020905b81548152906001019060200180831161116f57829003601f168201915b505050505081565b61119c6123b6565b73ffffffffffffffffffffffffffffffffffffffff166111ba6118a5565b73ffffffffffffffffffffffffffffffffffffffff1614611210576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120790614a00565b60405180910390fd5b611219816127c7565b50565b600a60149054906101000a900460ff1661126b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126290614780565b60405180910390fd5b60008111801561127c5750600b8111155b6112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290614ae0565b60405180910390fd5b6102396112d8826112ca610d01565b6127e190919063ffffffff16565b1115611319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131090614900565b60405180910390fd5b6113348167013c31074902800061283690919063ffffffff16565b341015611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136d90614880565b60405180910390fd5b60005b818110156113e357600061138b610d01565b9050610239611398610d01565b10156113d5576113a833826128a6565b6001600f600083815260200190815260200160002060006101000a81548160ff0219169083151502179055505b508080600101915050611379565b5050565b600061141782604051806060016040528060298152602001614e156029913960026128c49092919063ffffffff16565b9050919050565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c65780601f1061149b576101008083540402835291602001916114c6565b820191906000526020600020905b8154815290600101906020018083116114a957829003601f168201915b505050505081565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115665780601f1061153b57610100808354040283529160200191611566565b820191906000526020600020905b81548152906001019060200180831161154957829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d890614960565b60405180910390fd5b611628600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206128e3565b9050919050565b6116376123b6565b73ffffffffffffffffffffffffffffffffffffffff166116556118a5565b73ffffffffffffffffffffffffffffffffffffffff16146116ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a290614a00565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60106020528060005260406000206000915054906101000a900460ff1681565b600f6020528060005260406000206000915054906101000a900460ff1681565b606060006117b983611570565b9050600081141561181457600067ffffffffffffffff811180156117dc57600080fd5b5060405190808252806020026020018201604052801561180b5781602001602082028036833780820191505090505b509150506118a0565b60008167ffffffffffffffff8111801561182d57600080fd5b5060405190808252806020026020018201604052801561185c5781602001602082028036833780820191505090505b50905060005b82811015611899576118748582610ea6565b82828151811061188057fe5b6020026020010181815250508080600101915050611862565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119675780601f1061193c57610100808354040283529160200191611967565b820191906000526020600020905b81548152906001019060200180831161194a57829003601f168201915b5050505050905090565b6060600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a095780601f106119de57610100808354040283529160200191611a09565b820191906000526020600020905b8154815290600101906020018083116119ec57829003601f168201915b5050505050905090565b611a1b6123b6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8090614860565b60405180910390fd5b8060056000611a966123b6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b436123b6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b8891906146bf565b60405180910390a35050565b60606040518060a0016040528060788152602001614d9d60789139905090565b611bc5611bbf6123b6565b8361248c565b611c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfb90614a80565b60405180910390fd5b611c10848484846128f8565b50505050565b6060611c2182612399565b611c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5790614a40565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d095780601f10611cde57610100808354040283529160200191611d09565b820191906000526020600020905b815481529060010190602001808311611cec57829003601f168201915b505050505090506000611d1a6114ce565b9050600081511415611d30578192505050611d94565b600082511115611d65578082604051602001611d4d929190614612565b60405160208183030381529060405292505050611d94565b80611d6f85612954565b604051602001611d80929190614612565b604051602081830303815290604052925050505b919050565b6000611da4846113e7565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0b90614740565b60405180910390fd5b600015156010600086815260200190815260200160002060009054906101000a900460ff16151514611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7290614920565b60405180910390fd5b60016010600086815260200190815260200160002060006101000a81548160ff0219169083151502179055508282600e60008781526020019081526020016000209190611ec9929190613483565b50837f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b8484604051611efc9291906146da565b60405180910390a250505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a60149054906101000a900460ff1681565b611fb96123b6565b73ffffffffffffffffffffffffffffffffffffffff16611fd76118a5565b73ffffffffffffffffffffffffffffffffffffffff161461202d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202490614a00565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561209d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612094906147c0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6121656123b6565b73ffffffffffffffffffffffffffffffffffffffff166121836118a5565b73ffffffffffffffffffffffffffffffffffffffff16146121d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d090614a00565b60405180910390fd5b60006121e3610d01565b90506000821180156121f757506011548211155b612236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222d90614820565b60405180910390fd5b60005b8281101561225a5761224d848284016128a6565b8080600101915050612239565b5061227082601154612a9b90919063ffffffff16565b601181905550505050565b6060612285610d01565b82106122c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bd90614760565b60405180910390fd5b600e60008381526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561236d5780601f106123425761010080835404028352916020019161236d565b820191906000526020600020905b81548152906001019060200180831161235057829003601f168201915b50505050509050919050565b60606040518060800160405280604d8152602001614e3e604d9139905090565b60006123af826002612aeb90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612431836113e7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061248582600001612b05565b9050919050565b600061249782612399565b6124d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cd906148e0565b60405180910390fd5b60006124e1836113e7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061255057508373ffffffffffffffffffffffffffffffffffffffff1661253884610b64565b73ffffffffffffffffffffffffffffffffffffffff16145b8061256157506125608185611f0a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661258a826113e7565b73ffffffffffffffffffffffffffffffffffffffff16146125e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d790614a20565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612650576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264790614840565b60405180910390fd5b61265b838383612b16565b6126666000826123be565b6126b781600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612b1b90919063ffffffff16565b5061270981600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612b3590919063ffffffff16565b5061272081836002612b4f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006127908360000183612b84565b60001c905092915050565b6000806000806127ae8660000186612bf1565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906127dd929190613511565b5050565b60008082840190508381101561282c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282390614800565b60405180910390fd5b8091505092915050565b60008083141561284957600090506128a0565b600082840290508284828161285a57fe5b041461289b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612892906149c0565b60405180910390fd5b809150505b92915050565b6128c0828260405180602001604052806000815250612c74565b5050565b60006128d7846000018460001b84612ccf565b60001c90509392505050565b60006128f182600001612d60565b9050919050565b61290384848461256a565b61290f84848484612d71565b61294e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612945906147a0565b60405180910390fd5b50505050565b6060600082141561299c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a96565b600082905060005b600082146129c6578080600101915050600a82816129be57fe5b0491506129a4565b60008167ffffffffffffffff811180156129df57600080fd5b506040519080825280601f01601f191660200182016040528015612a125781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612a8e57600a8481612a3357fe5b0660300160f81b82828060019003935081518110612a4d57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612a8657fe5b049350612a21565b819450505050505b919050565b600082821115612ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad7906148a0565b60405180910390fd5b818303905092915050565b6000612afd836000018360001b612ed5565b905092915050565b600081600001805490509050919050565b505050565b6000612b2d836000018360001b612ef8565b905092915050565b6000612b47836000018360001b612fe0565b905092915050565b6000612b7b846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613050565b90509392505050565b600081836000018054905011612bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc690614720565b60405180910390fd5b826000018281548110612bde57fe5b9060005260206000200154905092915050565b60008082846000018054905011612c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3490614980565b60405180910390fd5b6000846000018481548110612c4e57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b612c7e838361312c565b612c8b6000848484612d71565b612cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc1906147a0565b60405180910390fd5b505050565b60008084600101600085815260200190815260200160002054905060008114158390612d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2891906146fe565b60405180910390fd5b50846000016001820381548110612d4457fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612d928473ffffffffffffffffffffffffffffffffffffffff166132ba565b612d9f5760019050612ecd565b6000612e6663150b7a0260e01b612db46123b6565b888787604051602401612dca9493929190614651565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001614d6b603291398773ffffffffffffffffffffffffffffffffffffffff166132cd9092919063ffffffff16565b9050600081806020019051810190612e7e919061390f565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114612fd45760006001820390506000600186600001805490500390506000866000018281548110612f4357fe5b9060005260206000200154905080876000018481548110612f6057fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480612f9857fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612fda565b60009150505b92915050565b6000612fec83836132e5565b61304557826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061304a565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156130f757846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613125565b8285600001600183038154811061310a57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561319c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613193906149a0565b60405180910390fd5b6131a581612399565b156131e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131dc906147e0565b60405180910390fd5b6131f160008383612b16565b61324281600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612b3590919063ffffffff16565b5061325981836002612b4f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606132dc8484600085613308565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b60608247101561334d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613344906148c0565b60405180910390fd5b613356856132ba565b613395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338c90614aa0565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516133be91906145fb565b60006040518083038185875af1925050503d80600081146133fb576040519150601f19603f3d011682016040523d82523d6000602084013e613400565b606091505b509150915061341082828661341c565b92505050949350505050565b6060831561342c5782905061347c565b60008351111561343f5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347391906146fe565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826134b95760008555613500565b82601f106134d257803560ff1916838001178555613500565b82800160010185558215613500579182015b828111156134ff5782358255916020019190600101906134e4565b5b50905061350d919061359f565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613547576000855561358e565b82601f1061356057805160ff191683800117855561358e565b8280016001018555821561358e579182015b8281111561358d578251825591602001919060010190613572565b5b50905061359b919061359f565b5090565b5b808211156135b85760008160009055506001016135a0565b5090565b60006135cf6135ca84614b4c565b614b1b565b9050828152602081018484840111156135e757600080fd5b6135f2848285614cb9565b509392505050565b600061360d61360884614b7c565b614b1b565b90508281526020810184848401111561362557600080fd5b613630848285614cb9565b509392505050565b60008135905061364781614d0e565b92915050565b60008135905061365c81614d25565b92915050565b60008135905061367181614d3c565b92915050565b60008151905061368681614d3c565b92915050565b600082601f83011261369d57600080fd5b81356136ad8482602086016135bc565b91505092915050565b60008083601f8401126136c857600080fd5b8235905067ffffffffffffffff8111156136e157600080fd5b6020830191508360018202830111156136f957600080fd5b9250929050565b600082601f83011261371157600080fd5b81356137218482602086016135fa565b91505092915050565b60008135905061373981614d53565b92915050565b60006020828403121561375157600080fd5b600061375f84828501613638565b91505092915050565b6000806040838503121561377b57600080fd5b600061378985828601613638565b925050602061379a85828601613638565b9150509250929050565b6000806000606084860312156137b957600080fd5b60006137c786828701613638565b93505060206137d886828701613638565b92505060406137e98682870161372a565b9150509250925092565b6000806000806080858703121561380957600080fd5b600061381787828801613638565b945050602061382887828801613638565b93505060406138398782880161372a565b925050606085013567ffffffffffffffff81111561385657600080fd5b6138628782880161368c565b91505092959194509250565b6000806040838503121561388157600080fd5b600061388f85828601613638565b92505060206138a08582860161364d565b9150509250929050565b600080604083850312156138bd57600080fd5b60006138cb85828601613638565b92505060206138dc8582860161372a565b9150509250929050565b6000602082840312156138f857600080fd5b600061390684828501613662565b91505092915050565b60006020828403121561392157600080fd5b600061392f84828501613677565b91505092915050565b6000806020838503121561394b57600080fd5b600083013567ffffffffffffffff81111561396557600080fd5b613971858286016136b6565b92509250509250929050565b60006020828403121561398f57600080fd5b600082013567ffffffffffffffff8111156139a957600080fd5b6139b584828501613700565b91505092915050565b6000602082840312156139d057600080fd5b60006139de8482850161372a565b91505092915050565b6000806000604084860312156139fc57600080fd5b6000613a0a8682870161372a565b935050602084013567ffffffffffffffff811115613a2757600080fd5b613a33868287016136b6565b92509250509250925092565b6000613a4b83836145dd565b60208301905092915050565b613a6081614c45565b82525050565b613a6f81614c33565b82525050565b6000613a8082614bbc565b613a8a8185614bea565b9350613a9583614bac565b8060005b83811015613ac6578151613aad8882613a3f565b9750613ab883614bdd565b925050600181019050613a99565b5085935050505092915050565b613adc81614c57565b82525050565b6000613aed82614bc7565b613af78185614bfb565b9350613b07818560208601614cc8565b613b1081614cfd565b840191505092915050565b6000613b2682614bc7565b613b308185614c0c565b9350613b40818560208601614cc8565b80840191505092915050565b6000613b588385614c17565b9350613b65838584614cb9565b613b6e83614cfd565b840190509392505050565b6000613b8482614bd2565b613b8e8185614c17565b9350613b9e818560208601614cc8565b613ba781614cfd565b840191505092915050565b6000613bbd82614bd2565b613bc78185614c28565b9350613bd7818560208601614cc8565b80840191505092915050565b6000613bf0602283614c17565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c56600d83614c17565b91507f6e6f7420746865206f776e6572000000000000000000000000000000000000006000830152602082019050919050565b6000613c96602083614c17565b91507f63686f6f736520616e20617474726163746f722077697468696e2072616e67656000830152602082019050919050565b6000613cd6601783614c17565b91507f7761697420666f722073616c65207374617274207577750000000000000000006000830152602082019050919050565b6000613d16603283614c17565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613d7c602683614c17565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613de2601c83614c17565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613e22601b83614c17565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000613e62602083614c17565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b6000613ea2602483614c17565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f08601983614c17565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613f48601583614c17565b91507f696e73756666696369656e7420657468206261627900000000000000000000006000830152602082019050919050565b6000613f88601e83614c17565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b6000613fc8602683614c17565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061402e602c83614c17565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614094601683614c17565b91507f6e6f206e6f2c20737570706c79206578636565646564000000000000000000006000830152602082019050919050565b60006140d4601083614c17565b91507f6e616d6520616c726561647920736574000000000000000000000000000000006000830152602082019050919050565b6000614114603883614c17565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061417a602a83614c17565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006141e0602283614c17565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614246602083614c17565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614286602183614c17565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142ec602c83614c17565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614352602083614c17565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614392602983614c17565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006143f8602f83614c17565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061445e602183614c17565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144c4603183614c17565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061452a601d83614c17565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b600061456a601583614c17565b91507f616c7265616479207265636f6e737472756374656400000000000000000000006000830152602082019050919050565b60006145aa601a83614c17565b91507f796f752063616e206d696e74206f6e6c7920313120686f6e65790000000000006000830152602082019050919050565b6145e681614caf565b82525050565b6145f581614caf565b82525050565b60006146078284613b1b565b915081905092915050565b600061461e8285613bb2565b915061462a8284613bb2565b91508190509392505050565b600060208201905061464b6000830184613a66565b92915050565b60006080820190506146666000830187613a57565b6146736020830186613a66565b61468060408301856145ec565b81810360608301526146928184613ae2565b905095945050505050565b600060208201905081810360008301526146b78184613a75565b905092915050565b60006020820190506146d46000830184613ad3565b92915050565b600060208201905081810360008301526146f5818486613b4c565b90509392505050565b600060208201905081810360008301526147188184613b79565b905092915050565b6000602082019050818103600083015261473981613be3565b9050919050565b6000602082019050818103600083015261475981613c49565b9050919050565b6000602082019050818103600083015261477981613c89565b9050919050565b6000602082019050818103600083015261479981613cc9565b9050919050565b600060208201905081810360008301526147b981613d09565b9050919050565b600060208201905081810360008301526147d981613d6f565b9050919050565b600060208201905081810360008301526147f981613dd5565b9050919050565b6000602082019050818103600083015261481981613e15565b9050919050565b6000602082019050818103600083015261483981613e55565b9050919050565b6000602082019050818103600083015261485981613e95565b9050919050565b6000602082019050818103600083015261487981613efb565b9050919050565b6000602082019050818103600083015261489981613f3b565b9050919050565b600060208201905081810360008301526148b981613f7b565b9050919050565b600060208201905081810360008301526148d981613fbb565b9050919050565b600060208201905081810360008301526148f981614021565b9050919050565b6000602082019050818103600083015261491981614087565b9050919050565b60006020820190508181036000830152614939816140c7565b9050919050565b6000602082019050818103600083015261495981614107565b9050919050565b600060208201905081810360008301526149798161416d565b9050919050565b60006020820190508181036000830152614999816141d3565b9050919050565b600060208201905081810360008301526149b981614239565b9050919050565b600060208201905081810360008301526149d981614279565b9050919050565b600060208201905081810360008301526149f9816142df565b9050919050565b60006020820190508181036000830152614a1981614345565b9050919050565b60006020820190508181036000830152614a3981614385565b9050919050565b60006020820190508181036000830152614a59816143eb565b9050919050565b60006020820190508181036000830152614a7981614451565b9050919050565b60006020820190508181036000830152614a99816144b7565b9050919050565b60006020820190508181036000830152614ab98161451d565b9050919050565b60006020820190508181036000830152614ad98161455d565b9050919050565b60006020820190508181036000830152614af98161459d565b9050919050565b6000602082019050614b1560008301846145ec565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614b4257614b41614cfb565b5b8060405250919050565b600067ffffffffffffffff821115614b6757614b66614cfb565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614b9757614b96614cfb565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c3e82614c8f565b9050919050565b6000614c5082614c8f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614ce6578082015181840152602081019050614ccb565b83811115614cf5576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b614d1781614c33565b8114614d2257600080fd5b50565b614d2e81614c57565b8114614d3957600080fd5b50565b614d4581614c63565b8114614d5057600080fd5b50565b614d5c81614caf565b8114614d6757600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572506172616d65746572733a2046756e6374696f6e20436f6d62696e6174696f6e2c204c617469747564652c204c6f6e6769747564652c20486f72697a6f6e74616c205772617070696e672c20566572746963616c205772617070696e672c2057696474682c205363616c652c2053697a652c204672616d654552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e4d6174726978204d5f78206f72204d5f793a2066726f6d202d706920746f207069207265736f6c76656420627920486f72697a6f6e74616c206f7220566572746963616c205772617070696e67436f6c6f723a204261636b67726f756e6420616e642046726f6e7420696e20524742206368616e6e656c732074776963652e204672616d653a206d696e2852474229206469766964656420627920322e35557365643a2073696e284d5f782a4c617469747564652920616e6420636f73284d5f792a4c6f6e67697475646529206f722074616e282e2920616e6420636f6d62696e6174696f6e732074686572656f66a2646970667358221220576f47332f21c75deff0edbb7321b8d56ab1e8515d2b60a86ebbd1712b8b720e64736f6c63430007060033
Deployed Bytecode Sourcemap
66998:4880:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10234:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51519:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54305:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53835:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53313:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67106:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67219:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70577:169;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55195:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70049:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53075:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68765:89;;;;;;;;;;;;;:::i;:::-;;68086:131;;;;;;;;;;;;;:::i;:::-;;67526:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55571:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70973:168;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67982:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53601:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67305:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67486:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68658:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71149:720;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51275:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67604:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52894:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50992:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66230:148;;;;;;;;;;;;;:::i;:::-;;67770:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67687:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68866:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65579:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51688:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70283:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54598:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70754:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55793:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51863:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69414:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54964:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67378:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66533:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68229:421;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69833:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70404:165;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10234:150;10319:4;10343:20;:33;10364:11;10343:33;;;;;;;;;;;;;;;;;;;;;;;;;;;10336:40;;10234:150;;;:::o;51519:100::-;51573:13;51606:5;51599:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51519:100;:::o;54305:221::-;54381:7;54409:16;54417:7;54409;:16::i;:::-;54401:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54494:15;:24;54510:7;54494:24;;;;;;;;;;;;;;;;;;;;;54487:31;;54305:221;;;:::o;53835:404::-;53916:13;53932:23;53947:7;53932:14;:23::i;:::-;53916:39;;53980:5;53974:11;;:2;:11;;;;53966:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54060:5;54044:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;54069:44;54093:5;54100:12;:10;:12::i;:::-;54069:23;:44::i;:::-;54044:69;54036:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;54210:21;54219:2;54223:7;54210:8;:21::i;:::-;53835:404;;;:::o;53313:211::-;53374:7;53495:21;:12;:19;:21::i;:::-;53488:28;;53313:211;:::o;67106:58::-;67147:17;67106:58;:::o;67219:48::-;67265:2;67219:48;:::o;70577:169::-;70622:13;70648:90;;;;;;;;;;;;;;;;;;;70577:169;:::o;55195:305::-;55356:41;55375:12;:10;:12::i;:::-;55389:7;55356:18;:41::i;:::-;55348:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;55464:28;55474:4;55480:2;55484:7;55464:9;:28::i;:::-;55195:305;;;:::o;70049:226::-;65810:12;:10;:12::i;:::-;65799:23;;:7;:5;:7::i;:::-;:23;;;65791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70161:5:::1;70142:24;;:15;;;;;;;;;;;:24;;;70134:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;70221:4;70203:15;;:22;;;;;;;;;;;;;;;;;;70258:9;;70236:19;:31;;;;;;;:::i;:::-;;70049:226:::0;;:::o;53075:162::-;53172:7;53199:30;53223:5;53199:13;:20;53213:5;53199:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;53192:37;;53075:162;;;;:::o;68765:89::-;65810:12;:10;:12::i;:::-;65799:23;;:7;:5;:7::i;:::-;:23;;;65791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68834:12:::1;;;;;;;;;;;68833:13;68818:12;;:28;;;;;;;;;;;;;;;;;;68765:89::o:0;68086:131::-;65810:12;:10;:12::i;:::-;65799:23;;:7;:5;:7::i;:::-;:23;;;65791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68134:12:::1;68149:21;68134:36;;68181:10;:19;;:28;68201:7;68181:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;65870:1;68086:131::o:0;67526:35::-;;;;;;;;;;;;;:::o;55571:151::-;55675:39;55692:4;55698:2;55702:7;55675:39;;;;;;;;;;;;:16;:39::i;:::-;55571:151;;;:::o;70973:168::-;71017:13;71043:90;;;;;;;;;;;;;;;;;;;70973:168;:::o;67982:34::-;;;;:::o;53601:172::-;53676:7;53697:15;53718:22;53734:5;53718:12;:15;;:22;;;;:::i;:::-;53696:44;;;53758:7;53751:14;;;53601:172;;;:::o;67305:44::-;67346:3;67305:44;:::o;67486:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68658:99::-;65810:12;:10;:12::i;:::-;65799:23;;:7;:5;:7::i;:::-;:23;;;65791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68729:20:::1;68741:7;68729:11;:20::i;:::-;68658:99:::0;:::o;71149:720::-;71229:12;;;;;;;;;;;71221:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;71306:1;71288:15;:19;:64;;;;;67265:2;71311:15;:41;;71288:64;71280:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;67346:3;71402:34;71420:15;71402:13;:11;:13::i;:::-;:17;;:34;;;;:::i;:::-;:52;;71394:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;71513:35;71532:15;67147:17;71513:18;;:35;;;;:::i;:::-;71500:9;:48;;71492:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;71599:6;71595:265;71615:15;71611:1;:19;71595:265;;;71652:14;71669:13;:11;:13::i;:::-;71652:30;;67346:3;71701:13;:11;:13::i;:::-;:30;71697:152;;;71752:32;71762:10;71774:9;71752;:32::i;:::-;71829:4;71803:12;:23;71816:9;71803:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;71697:152;71595:265;71632:3;;;;;;;71595:265;;;;71149:720;:::o;51275:177::-;51347:7;51374:70;51391:7;51374:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;51367:77;;51275:177;;;:::o;67604:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52894:97::-;52942:13;52975:8;52968:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52894:97;:::o;50992:221::-;51064:7;51109:1;51092:19;;:5;:19;;;;51084:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51176:29;:13;:20;51190:5;51176:20;;;;;;;;;;;;;;;:27;:29::i;:::-;51169:36;;50992:221;;;:::o;66230:148::-;65810:12;:10;:12::i;:::-;65799:23;;:7;:5;:7::i;:::-;:23;;;65791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66337:1:::1;66300:40;;66321:6;;;;;;;;;;;66300:40;;;;;;;;;;;;66368:1;66351:6;;:19;;;;;;;;;;;;;;;;;;66230:148::o:0;67770:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;67687:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;68866:540::-;68927:16;68957:18;68978:17;68988:6;68978:9;:17::i;:::-;68957:38;;69024:1;69010:10;:15;69006:393;;;69101:1;69087:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69080:23;;;;;69006:393;69136:23;69176:10;69162:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69136:51;;69202:13;69230:130;69254:10;69246:5;:18;69230:130;;;69310:34;69330:6;69338:5;69310:19;:34::i;:::-;69294:6;69301:5;69294:13;;;;;;;;;;;;;:50;;;;;69266:7;;;;;;;69230:130;;;69381:6;69374:13;;;;;68866:540;;;;:::o;65579:87::-;65625:7;65652:6;;;;;;;;;;;65645:13;;65579:87;:::o;51688:104::-;51744:13;51777:7;51770:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51688:104;:::o;70283:113::-;70336:13;70369:19;70362:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70283:113;:::o;54598:295::-;54713:12;:10;:12::i;:::-;54701:24;;:8;:24;;;;54693:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;54813:8;54768:18;:32;54787:12;:10;:12::i;:::-;54768:32;;;;;;;;;;;;;;;:42;54801:8;54768:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;54866:8;54837:48;;54852:12;:10;:12::i;:::-;54837:48;;;54876:8;54837:48;;;;;;:::i;:::-;;;;;;;;54598:295;;:::o;70754:211::-;70802:13;70828:129;;;;;;;;;;;;;;;;;;;70754:211;:::o;55793:285::-;55925:41;55944:12;:10;:12::i;:::-;55958:7;55925:18;:41::i;:::-;55917:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56031:39;56045:4;56051:2;56055:7;56064:5;56031:13;:39::i;:::-;55793:285;;;;:::o;51863:792::-;51936:13;51970:16;51978:7;51970;:16::i;:::-;51962:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52051:23;52077:10;:19;52088:7;52077:19;;;;;;;;;;;52051:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52107:18;52128:9;:7;:9::i;:::-;52107:30;;52235:1;52219:4;52213:18;:23;52209:72;;;52260:9;52253:16;;;;;;52209:72;52411:1;52391:9;52385:23;:27;52381:108;;;52460:4;52466:9;52443:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52429:48;;;;;;52381:108;52621:4;52627:18;:7;:16;:18::i;:::-;52604:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52590:57;;;;51863:792;;;;:::o;69414:411::-;69503:13;69519:17;69527:8;69519:7;:17::i;:::-;69503:33;;69569:5;69555:19;;:10;:19;;;69547:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;69633:5;69612:26;;:7;:17;69620:8;69612:17;;;;;;;;;;;;;;;;;;;;;:26;;;69604:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;69691:4;69671:7;:17;69679:8;69671:17;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;69733:9;;69706:14;:24;69721:8;69706:24;;;;;;;;;;;:36;;;;;;;:::i;:::-;;69770:8;69759:31;69780:9;;69759:31;;;;;;;:::i;:::-;;;;;;;;69414:411;;;;:::o;54964:164::-;55061:4;55085:18;:25;55104:5;55085:25;;;;;;;;;;;;;;;:35;55111:8;55085:35;;;;;;;;;;;;;;;;;;;;;;;;;55078:42;;54964:164;;;;:::o;67378:32::-;;;;;;;;;;;;;:::o;66533:244::-;65810:12;:10;:12::i;:::-;65799:23;;:7;:5;:7::i;:::-;:23;;;65791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66642:1:::1;66622:22;;:8;:22;;;;66614:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;66732:8;66703:38;;66724:6;;;;;;;;;;;66703:38;;;;;;;;;;;;66761:8;66752:6;;:17;;;;;;;;;;;;;;;;;;66533:244:::0;:::o;68229:421::-;65810:12;:10;:12::i;:::-;65799:23;;:7;:5;:7::i;:::-;:23;;;65791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68329:11:::1;68343:13;:11;:13::i;:::-;68329:27;;68392:1;68375:14;:18;:57;;;;;68415:17;;68397:14;:35;;68375:57;68367:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;68485:6;68480:95;68501:14;68497:1;:18;68480:95;;;68537:26;68547:3;68561:1;68552:6;:10;68537:9;:26::i;:::-;68517:3;;;;;;;68480:95;;;;68605:37;68627:14;68605:17;;:21;;:37;;;;:::i;:::-;68585:17;:57;;;;65870:1;68229:421:::0;;:::o;69833:208::-;69895:13;69940;:11;:13::i;:::-;69929:8;:24;69920:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;70009:14;:24;70024:8;70009:24;;;;;;;;;;;70002:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69833:208;;;:::o;70404:165::-;70449:13;70475:86;;;;;;;;;;;;;;;;;;;70404:165;:::o;57545:127::-;57610:4;57634:30;57656:7;57634:12;:21;;:30;;;;:::i;:::-;57627:37;;57545:127;;;:::o;666:106::-;719:15;754:10;747:17;;666:106;:::o;63563:192::-;63665:2;63638:15;:24;63654:7;63638:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;63721:7;63717:2;63683:46;;63692:23;63707:7;63692:14;:23::i;:::-;63683:46;;;;;;;;;;;;63563:192;;:::o;44277:123::-;44346:7;44373:19;44381:3;:10;;44373:7;:19::i;:::-;44366:26;;44277:123;;;:::o;57839:355::-;57932:4;57957:16;57965:7;57957;:16::i;:::-;57949:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58033:13;58049:23;58064:7;58049:14;:23::i;:::-;58033:39;;58102:5;58091:16;;:7;:16;;;:51;;;;58135:7;58111:31;;:20;58123:7;58111:11;:20::i;:::-;:31;;;58091:51;:94;;;;58146:39;58170:5;58177:7;58146:23;:39::i;:::-;58091:94;58083:103;;;57839:355;;;;:::o;60975:599::-;61100:4;61073:31;;:23;61088:7;61073:14;:23::i;:::-;:31;;;61065:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;61201:1;61187:16;;:2;:16;;;;61179:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;61257:39;61278:4;61284:2;61288:7;61257:20;:39::i;:::-;61361:29;61378:1;61382:7;61361:8;:29::i;:::-;61403:35;61430:7;61403:13;:19;61417:4;61403:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;61449:30;61471:7;61449:13;:17;61463:2;61449:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;61492:29;61509:7;61518:2;61492:12;:16;;:29;;;;;:::i;:::-;;61558:7;61554:2;61539:27;;61548:4;61539:27;;;;;;;;;;;;60975:599;;;:::o;36068:137::-;36139:7;36174:22;36178:3;:10;;36190:5;36174:3;:22::i;:::-;36166:31;;36159:38;;36068:137;;;;:::o;44739:236::-;44819:7;44828;44849:11;44862:13;44879:22;44883:3;:10;;44895:5;44879:3;:22::i;:::-;44848:53;;;;44928:3;44920:12;;44958:5;44950:14;;44912:55;;;;;;44739:236;;;;;:::o;62175:100::-;62259:8;62248;:19;;;;;;;;;;;;:::i;:::-;;62175:100;:::o;13796:179::-;13854:7;13874:9;13890:1;13886;:5;13874:17;;13915:1;13910;:6;;13902:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;13966:1;13959:8;;;13796:179;;;;:::o;14675:220::-;14733:7;14762:1;14757;:6;14753:20;;;14772:1;14765:8;;;;14753:20;14784:9;14800:1;14796;:5;14784:17;;14829:1;14824;14820;:5;;;;;;:10;14812:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;14886:1;14879:8;;;14675:220;;;;;:::o;58537:110::-;58613:26;58623:2;58627:7;58613:26;;;;;;;;;;;;:9;:26::i;:::-;58537:110;;:::o;46025:213::-;46132:7;46183:44;46188:3;:10;;46208:3;46200:12;;46214;46183:4;:44::i;:::-;46175:53;;46152:78;;46025:213;;;;;:::o;35610:114::-;35670:7;35697:19;35705:3;:10;;35697:7;:19::i;:::-;35690:26;;35610:114;;;:::o;56960:272::-;57074:28;57084:4;57090:2;57094:7;57074:9;:28::i;:::-;57121:48;57144:4;57150:2;57154:7;57163:5;57121:22;:48::i;:::-;57113:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;56960:272;;;;:::o;46489:746::-;46545:13;46775:1;46766:5;:10;46762:53;;;46793:10;;;;;;;;;;;;;;;;;;;;;46762:53;46825:12;46840:5;46825:20;;46856:14;46881:78;46896:1;46888:4;:9;46881:78;;46914:8;;;;;;;46945:2;46937:10;;;;;;;;;46881:78;;;46969:19;47001:6;46991:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46969:39;;47019:13;47044:1;47035:6;:10;47019:26;;47063:5;47056:12;;47079:117;47094:1;47086:4;:9;47079:117;;47155:2;47148:4;:9;;;;;;47143:2;:14;47130:29;;47112:6;47119:7;;;;;;;47112:15;;;;;;;;;;;:47;;;;;;;;;;;47182:2;47174:10;;;;;;;;;47079:117;;;47220:6;47206:21;;;;;;46489:746;;;;:::o;14258:158::-;14316:7;14349:1;14344;:6;;14336:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;14407:1;14403;:5;14396:12;;14258:158;;;;:::o;44038:151::-;44122:4;44146:35;44156:3;:10;;44176:3;44168:12;;44146:9;:35::i;:::-;44139:42;;44038:151;;;;:::o;40856:110::-;40912:7;40939:3;:12;;:19;;;;40932:26;;40856:110;;;:::o;64368:93::-;;;;:::o;35155:137::-;35225:4;35249:35;35257:3;:10;;35277:5;35269:14;;35249:7;:35::i;:::-;35242:42;;35155:137;;;;:::o;34848:131::-;34915:4;34939:32;34944:3;:10;;34964:5;34956:14;;34939:4;:32::i;:::-;34932:39;;34848:131;;;;:::o;43461:185::-;43550:4;43574:64;43579:3;:10;;43599:3;43591:12;;43629:5;43613:23;;43605:32;;43574:4;:64::i;:::-;43567:71;;43461:185;;;;;:::o;31106:204::-;31173:7;31222:5;31201:3;:11;;:18;;;;:26;31193:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31284:3;:11;;31296:5;31284:18;;;;;;;;;;;;;;;;31277:25;;31106:204;;;;:::o;41321:279::-;41388:7;41397;41447:5;41425:3;:12;;:19;;;;:27;41417:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41504:22;41529:3;:12;;41542:5;41529:19;;;;;;;;;;;;;;;;;;41504:44;;41567:5;:10;;;41579:5;:12;;;41559:33;;;;;41321:279;;;;;:::o;58874:250::-;58970:18;58976:2;58980:7;58970:5;:18::i;:::-;59007:54;59038:1;59042:2;59046:7;59055:5;59007:22;:54::i;:::-;58999:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;58874:250;;;:::o;42818:319::-;42912:7;42932:16;42951:3;:12;;:17;42964:3;42951:17;;;;;;;;;;;;42932:36;;42999:1;42987:8;:13;;43002:12;42979:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43069:3;:12;;43093:1;43082:8;:12;43069:26;;;;;;;;;;;;;;;;;;:33;;;43062:40;;;42818:319;;;;;:::o;30653:109::-;30709:7;30736:3;:11;;:18;;;;30729:25;;30653:109;;;:::o;62840:604::-;62961:4;62988:15;:2;:13;;;:15::i;:::-;62983:60;;63027:4;63020:11;;;;62983:60;63053:23;63079:252;63132:45;;;63192:12;:10;:12::i;:::-;63219:4;63238:7;63260:5;63095:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63079:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;63053:278;;63342:13;63369:10;63358:32;;;;;;;;;;;;:::i;:::-;63342:48;;47989:10;63419:16;;63409:26;;;:6;:26;;;;63401:35;;;;62840:604;;;;;;;:::o;40636:125::-;40707:4;40752:1;40731:3;:12;;:17;40744:3;40731:17;;;;;;;;;;;;:22;;40724:29;;40636:125;;;;:::o;28808:1544::-;28874:4;28992:18;29013:3;:12;;:19;29026:5;29013:19;;;;;;;;;;;;28992:40;;29063:1;29049:10;:15;29045:1300;;29411:21;29448:1;29435:10;:14;29411:38;;29464:17;29505:1;29484:3;:11;;:18;;;;:22;29464:42;;29751:17;29771:3;:11;;29783:9;29771:22;;;;;;;;;;;;;;;;29751:42;;29917:9;29888:3;:11;;29900:13;29888:26;;;;;;;;;;;;;;;:38;;;;30036:1;30020:13;:17;29994:3;:12;;:23;30007:9;29994:23;;;;;;;;;;;:43;;;;30146:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;30241:3;:12;;:19;30254:5;30241:19;;;;;;;;;;;30234:26;;;30284:4;30277:11;;;;;;;;29045:1300;30328:5;30321:12;;;28808:1544;;;;;:::o;28218:414::-;28281:4;28303:21;28313:3;28318:5;28303:9;:21::i;:::-;28298:327;;28341:3;:11;;28358:5;28341:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28524:3;:11;;:18;;;;28502:3;:12;;:19;28515:5;28502:19;;;;;;;;;;;:40;;;;28564:4;28557:11;;;;28298:327;28608:5;28601:12;;28218:414;;;;;:::o;38136:692::-;38212:4;38328:16;38347:3;:12;;:17;38360:3;38347:17;;;;;;;;;;;;38328:36;;38393:1;38381:8;:13;38377:444;;;38448:3;:12;;38466:38;;;;;;;;38483:3;38466:38;;;;38496:5;38466:38;;;38448:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38663:3;:12;;:19;;;;38643:3;:12;;:17;38656:3;38643:17;;;;;;;;;;;:39;;;;38704:4;38697:11;;;;;38377:444;38777:5;38741:3;:12;;38765:1;38754:8;:12;38741:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;38804:5;38797:12;;;38136:692;;;;;;:::o;59460:404::-;59554:1;59540:16;;:2;:16;;;;59532:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;59613:16;59621:7;59613;:16::i;:::-;59612:17;59604:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59675:45;59704:1;59708:2;59712:7;59675:20;:45::i;:::-;59733:30;59755:7;59733:13;:17;59747:2;59733:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;59776:29;59793:7;59802:2;59776:12;:16;;:29;;;;;:::i;:::-;;59848:7;59844:2;59823:33;;59840:1;59823:33;;;;;;;;;;;;59460:404;;:::o;19237:422::-;19297:4;19505:12;19616:7;19604:20;19596:28;;19650:1;19643:4;:8;19636:15;;;19237:422;;;:::o;22155:195::-;22258:12;22290:52;22312:6;22320:4;22326:1;22329:12;22290:21;:52::i;:::-;22283:59;;22155:195;;;;;:::o;30438:129::-;30511:4;30558:1;30535:3;:12;;:19;30548:5;30535:19;;;;;;;;;;;;:24;;30528:31;;30438:129;;;;:::o;23207:530::-;23334:12;23392:5;23367:21;:30;;23359:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;23459:18;23470:6;23459:10;:18::i;:::-;23451:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23585:12;23599:23;23626:6;:11;;23646:5;23654:4;23626:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23584:75;;;;23677:52;23695:7;23704:10;23716:12;23677:17;:52::i;:::-;23670:59;;;;23207:530;;;;;;:::o;25747:742::-;25862:12;25891:7;25887:595;;;25922:10;25915:17;;;;25887:595;26056:1;26036:10;:17;:21;26032:439;;;26299:10;26293:17;26360:15;26347:10;26343:2;26339:19;26332:44;26247:148;26442:12;26435:20;;;;;;;;;;;:::i;:::-;;;;;;;;25747:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:352::-;;;1701:3;1694:4;1686:6;1682:17;1678:27;1668:2;;1719:1;1716;1709:12;1668:2;1755:6;1742:20;1732:30;;1785:18;1777:6;1774:30;1771:2;;;1817:1;1814;1807:12;1771:2;1854:4;1846:6;1842:17;1830:29;;1908:3;1900:4;1892:6;1888:17;1878:8;1874:32;1871:41;1868:2;;;1925:1;1922;1915:12;1868:2;1658:277;;;;;:::o;1955:273::-;;2060:3;2053:4;2045:6;2041:17;2037:27;2027:2;;2078:1;2075;2068:12;2027:2;2118:6;2105:20;2143:79;2218:3;2210:6;2203:4;2195:6;2191:17;2143:79;:::i;:::-;2134:88;;2017:211;;;;;:::o;2234:139::-;;2318:6;2305:20;2296:29;;2334:33;2361:5;2334:33;:::i;:::-;2286:87;;;;:::o;2379:262::-;;2487:2;2475:9;2466:7;2462:23;2458:32;2455:2;;;2503:1;2500;2493:12;2455:2;2546:1;2571:53;2616:7;2607:6;2596:9;2592:22;2571:53;:::i;:::-;2561:63;;2517:117;2445:196;;;;:::o;2647:407::-;;;2772:2;2760:9;2751:7;2747:23;2743:32;2740:2;;;2788:1;2785;2778:12;2740:2;2831:1;2856:53;2901:7;2892:6;2881:9;2877:22;2856:53;:::i;:::-;2846:63;;2802:117;2958:2;2984:53;3029:7;3020:6;3009:9;3005:22;2984:53;:::i;:::-;2974:63;;2929:118;2730:324;;;;;:::o;3060:552::-;;;;3202:2;3190:9;3181:7;3177:23;3173:32;3170:2;;;3218:1;3215;3208:12;3170:2;3261:1;3286:53;3331:7;3322:6;3311:9;3307:22;3286:53;:::i;:::-;3276:63;;3232:117;3388:2;3414:53;3459:7;3450:6;3439:9;3435:22;3414:53;:::i;:::-;3404:63;;3359:118;3516:2;3542:53;3587:7;3578:6;3567:9;3563:22;3542:53;:::i;:::-;3532:63;;3487:118;3160:452;;;;;:::o;3618:809::-;;;;;3786:3;3774:9;3765:7;3761:23;3757:33;3754:2;;;3803:1;3800;3793:12;3754:2;3846:1;3871:53;3916:7;3907:6;3896:9;3892:22;3871:53;:::i;:::-;3861:63;;3817:117;3973:2;3999:53;4044:7;4035:6;4024:9;4020:22;3999:53;:::i;:::-;3989:63;;3944:118;4101:2;4127:53;4172:7;4163:6;4152:9;4148:22;4127:53;:::i;:::-;4117:63;;4072:118;4257:2;4246:9;4242:18;4229:32;4288:18;4280:6;4277:30;4274:2;;;4320:1;4317;4310:12;4274:2;4348:62;4402:7;4393:6;4382:9;4378:22;4348:62;:::i;:::-;4338:72;;4200:220;3744:683;;;;;;;:::o;4433:401::-;;;4555:2;4543:9;4534:7;4530:23;4526:32;4523:2;;;4571:1;4568;4561:12;4523:2;4614:1;4639:53;4684:7;4675:6;4664:9;4660:22;4639:53;:::i;:::-;4629:63;;4585:117;4741:2;4767:50;4809:7;4800:6;4789:9;4785:22;4767:50;:::i;:::-;4757:60;;4712:115;4513:321;;;;;:::o;4840:407::-;;;4965:2;4953:9;4944:7;4940:23;4936:32;4933:2;;;4981:1;4978;4971:12;4933:2;5024:1;5049:53;5094:7;5085:6;5074:9;5070:22;5049:53;:::i;:::-;5039:63;;4995:117;5151:2;5177:53;5222:7;5213:6;5202:9;5198:22;5177:53;:::i;:::-;5167:63;;5122:118;4923:324;;;;;:::o;5253:260::-;;5360:2;5348:9;5339:7;5335:23;5331:32;5328:2;;;5376:1;5373;5366:12;5328:2;5419:1;5444:52;5488:7;5479:6;5468:9;5464:22;5444:52;:::i;:::-;5434:62;;5390:116;5318:195;;;;:::o;5519:282::-;;5637:2;5625:9;5616:7;5612:23;5608:32;5605:2;;;5653:1;5650;5643:12;5605:2;5696:1;5721:63;5776:7;5767:6;5756:9;5752:22;5721:63;:::i;:::-;5711:73;;5667:127;5595:206;;;;:::o;5807:395::-;;;5935:2;5923:9;5914:7;5910:23;5906:32;5903:2;;;5951:1;5948;5941:12;5903:2;6022:1;6011:9;6007:17;5994:31;6052:18;6044:6;6041:30;6038:2;;;6084:1;6081;6074:12;6038:2;6120:65;6177:7;6168:6;6157:9;6153:22;6120:65;:::i;:::-;6102:83;;;;5965:230;5893:309;;;;;:::o;6208:375::-;;6326:2;6314:9;6305:7;6301:23;6297:32;6294:2;;;6342:1;6339;6332:12;6294:2;6413:1;6402:9;6398:17;6385:31;6443:18;6435:6;6432:30;6429:2;;;6475:1;6472;6465:12;6429:2;6503:63;6558:7;6549:6;6538:9;6534:22;6503:63;:::i;:::-;6493:73;;6356:220;6284:299;;;;:::o;6589:262::-;;6697:2;6685:9;6676:7;6672:23;6668:32;6665:2;;;6713:1;6710;6703:12;6665:2;6756:1;6781:53;6826:7;6817:6;6806:9;6802:22;6781:53;:::i;:::-;6771:63;;6727:117;6655:196;;;;:::o;6857:540::-;;;;7002:2;6990:9;6981:7;6977:23;6973:32;6970:2;;;7018:1;7015;7008:12;6970:2;7061:1;7086:53;7131:7;7122:6;7111:9;7107:22;7086:53;:::i;:::-;7076:63;;7032:117;7216:2;7205:9;7201:18;7188:32;7247:18;7239:6;7236:30;7233:2;;;7279:1;7276;7269:12;7233:2;7315:65;7372:7;7363:6;7352:9;7348:22;7315:65;:::i;:::-;7297:83;;;;7159:231;6960:437;;;;;:::o;7403:179::-;;7493:46;7535:3;7527:6;7493:46;:::i;:::-;7571:4;7566:3;7562:14;7548:28;;7483:99;;;;:::o;7588:142::-;7691:32;7717:5;7691:32;:::i;:::-;7686:3;7679:45;7669:61;;:::o;7736:118::-;7823:24;7841:5;7823:24;:::i;:::-;7818:3;7811:37;7801:53;;:::o;7890:732::-;;8038:54;8086:5;8038:54;:::i;:::-;8108:86;8187:6;8182:3;8108:86;:::i;:::-;8101:93;;8218:56;8268:5;8218:56;:::i;:::-;8297:7;8328:1;8313:284;8338:6;8335:1;8332:13;8313:284;;;8414:6;8408:13;8441:63;8500:3;8485:13;8441:63;:::i;:::-;8434:70;;8527:60;8580:6;8527:60;:::i;:::-;8517:70;;8373:224;8360:1;8357;8353:9;8348:14;;8313:284;;;8317:14;8613:3;8606:10;;8014:608;;;;;;;:::o;8628:109::-;8709:21;8724:5;8709:21;:::i;:::-;8704:3;8697:34;8687:50;;:::o;8743:360::-;;8857:38;8889:5;8857:38;:::i;:::-;8911:70;8974:6;8969:3;8911:70;:::i;:::-;8904:77;;8990:52;9035:6;9030:3;9023:4;9016:5;9012:16;8990:52;:::i;:::-;9067:29;9089:6;9067:29;:::i;:::-;9062:3;9058:39;9051:46;;8833:270;;;;;:::o;9109:373::-;;9241:38;9273:5;9241:38;:::i;:::-;9295:88;9376:6;9371:3;9295:88;:::i;:::-;9288:95;;9392:52;9437:6;9432:3;9425:4;9418:5;9414:16;9392:52;:::i;:::-;9469:6;9464:3;9460:16;9453:23;;9217:265;;;;;:::o;9512:304::-;;9631:71;9695:6;9690:3;9631:71;:::i;:::-;9624:78;;9712:43;9748:6;9743:3;9736:5;9712:43;:::i;:::-;9780:29;9802:6;9780:29;:::i;:::-;9775:3;9771:39;9764:46;;9614:202;;;;;:::o;9822:364::-;;9938:39;9971:5;9938:39;:::i;:::-;9993:71;10057:6;10052:3;9993:71;:::i;:::-;9986:78;;10073:52;10118:6;10113:3;10106:4;10099:5;10095:16;10073:52;:::i;:::-;10150:29;10172:6;10150:29;:::i;:::-;10145:3;10141:39;10134:46;;9914:272;;;;;:::o;10192:377::-;;10326:39;10359:5;10326:39;:::i;:::-;10381:89;10463:6;10458:3;10381:89;:::i;:::-;10374:96;;10479:52;10524:6;10519:3;10512:4;10505:5;10501:16;10479:52;:::i;:::-;10556:6;10551:3;10547:16;10540:23;;10302:267;;;;;:::o;10575:366::-;;10738:67;10802:2;10797:3;10738:67;:::i;:::-;10731:74;;10835:34;10831:1;10826:3;10822:11;10815:55;10901:4;10896:2;10891:3;10887:12;10880:26;10932:2;10927:3;10923:12;10916:19;;10721:220;;;:::o;10947:311::-;;11110:67;11174:2;11169:3;11110:67;:::i;:::-;11103:74;;11207:15;11203:1;11198:3;11194:11;11187:36;11249:2;11244:3;11240:12;11233:19;;11093:165;;;:::o;11264:330::-;;11427:67;11491:2;11486:3;11427:67;:::i;:::-;11420:74;;11524:34;11520:1;11515:3;11511:11;11504:55;11585:2;11580:3;11576:12;11569:19;;11410:184;;;:::o;11600:321::-;;11763:67;11827:2;11822:3;11763:67;:::i;:::-;11756:74;;11860:25;11856:1;11851:3;11847:11;11840:46;11912:2;11907:3;11903:12;11896:19;;11746:175;;;:::o;11927:382::-;;12090:67;12154:2;12149:3;12090:67;:::i;:::-;12083:74;;12187:34;12183:1;12178:3;12174:11;12167:55;12253:20;12248:2;12243:3;12239:12;12232:42;12300:2;12295:3;12291:12;12284:19;;12073:236;;;:::o;12315:370::-;;12478:67;12542:2;12537:3;12478:67;:::i;:::-;12471:74;;12575:34;12571:1;12566:3;12562:11;12555:55;12641:8;12636:2;12631:3;12627:12;12620:30;12676:2;12671:3;12667:12;12660:19;;12461:224;;;:::o;12691:326::-;;12854:67;12918:2;12913:3;12854:67;:::i;:::-;12847:74;;12951:30;12947:1;12942:3;12938:11;12931:51;13008:2;13003:3;12999:12;12992:19;;12837:180;;;:::o;13023:325::-;;13186:67;13250:2;13245:3;13186:67;:::i;:::-;13179:74;;13283:29;13279:1;13274:3;13270:11;13263:50;13339:2;13334:3;13330:12;13323:19;;13169:179;;;:::o;13354:330::-;;13517:67;13581:2;13576:3;13517:67;:::i;:::-;13510:74;;13614:34;13610:1;13605:3;13601:11;13594:55;13675:2;13670:3;13666:12;13659:19;;13500:184;;;:::o;13690:368::-;;13853:67;13917:2;13912:3;13853:67;:::i;:::-;13846:74;;13950:34;13946:1;13941:3;13937:11;13930:55;14016:6;14011:2;14006:3;14002:12;13995:28;14049:2;14044:3;14040:12;14033:19;;13836:222;;;:::o;14064:323::-;;14227:67;14291:2;14286:3;14227:67;:::i;:::-;14220:74;;14324:27;14320:1;14315:3;14311:11;14304:48;14378:2;14373:3;14369:12;14362:19;;14210:177;;;:::o;14393:319::-;;14556:67;14620:2;14615:3;14556:67;:::i;:::-;14549:74;;14653:23;14649:1;14644:3;14640:11;14633:44;14703:2;14698:3;14694:12;14687:19;;14539:173;;;:::o;14718:328::-;;14881:67;14945:2;14940:3;14881:67;:::i;:::-;14874:74;;14978:32;14974:1;14969:3;14965:11;14958:53;15037:2;15032:3;15028:12;15021:19;;14864:182;;;:::o;15052:370::-;;15215:67;15279:2;15274:3;15215:67;:::i;:::-;15208:74;;15312:34;15308:1;15303:3;15299:11;15292:55;15378:8;15373:2;15368:3;15364:12;15357:30;15413:2;15408:3;15404:12;15397:19;;15198:224;;;:::o;15428:376::-;;15591:67;15655:2;15650:3;15591:67;:::i;:::-;15584:74;;15688:34;15684:1;15679:3;15675:11;15668:55;15754:14;15749:2;15744:3;15740:12;15733:36;15795:2;15790:3;15786:12;15779:19;;15574:230;;;:::o;15810:320::-;;15973:67;16037:2;16032:3;15973:67;:::i;:::-;15966:74;;16070:24;16066:1;16061:3;16057:11;16050:45;16121:2;16116:3;16112:12;16105:19;;15956:174;;;:::o;16136:314::-;;16299:67;16363:2;16358:3;16299:67;:::i;:::-;16292:74;;16396:18;16392:1;16387:3;16383:11;16376:39;16441:2;16436:3;16432:12;16425:19;;16282:168;;;:::o;16456:388::-;;16619:67;16683:2;16678:3;16619:67;:::i;:::-;16612:74;;16716:34;16712:1;16707:3;16703:11;16696:55;16782:26;16777:2;16772:3;16768:12;16761:48;16835:2;16830:3;16826:12;16819:19;;16602:242;;;:::o;16850:374::-;;17013:67;17077:2;17072:3;17013:67;:::i;:::-;17006:74;;17110:34;17106:1;17101:3;17097:11;17090:55;17176:12;17171:2;17166:3;17162:12;17155:34;17215:2;17210:3;17206:12;17199:19;;16996:228;;;:::o;17230:366::-;;17393:67;17457:2;17452:3;17393:67;:::i;:::-;17386:74;;17490:34;17486:1;17481:3;17477:11;17470:55;17556:4;17551:2;17546:3;17542:12;17535:26;17587:2;17582:3;17578:12;17571:19;;17376:220;;;:::o;17602:330::-;;17765:67;17829:2;17824:3;17765:67;:::i;:::-;17758:74;;17862:34;17858:1;17853:3;17849:11;17842:55;17923:2;17918:3;17914:12;17907:19;;17748:184;;;:::o;17938:365::-;;18101:67;18165:2;18160:3;18101:67;:::i;:::-;18094:74;;18198:34;18194:1;18189:3;18185:11;18178:55;18264:3;18259:2;18254:3;18250:12;18243:25;18294:2;18289:3;18285:12;18278:19;;18084:219;;;:::o;18309:376::-;;18472:67;18536:2;18531:3;18472:67;:::i;:::-;18465:74;;18569:34;18565:1;18560:3;18556:11;18549:55;18635:14;18630:2;18625:3;18621:12;18614:36;18676:2;18671:3;18667:12;18660:19;;18455:230;;;:::o;18691:330::-;;18854:67;18918:2;18913:3;18854:67;:::i;:::-;18847:74;;18951:34;18947:1;18942:3;18938:11;18931:55;19012:2;19007:3;19003:12;18996:19;;18837:184;;;:::o;19027:373::-;;19190:67;19254:2;19249:3;19190:67;:::i;:::-;19183:74;;19287:34;19283:1;19278:3;19274:11;19267:55;19353:11;19348:2;19343:3;19339:12;19332:33;19391:2;19386:3;19382:12;19375:19;;19173:227;;;:::o;19406:379::-;;19569:67;19633:2;19628:3;19569:67;:::i;:::-;19562:74;;19666:34;19662:1;19657:3;19653:11;19646:55;19732:17;19727:2;19722:3;19718:12;19711:39;19776:2;19771:3;19767:12;19760:19;;19552:233;;;:::o;19791:365::-;;19954:67;20018:2;20013:3;19954:67;:::i;:::-;19947:74;;20051:34;20047:1;20042:3;20038:11;20031:55;20117:3;20112:2;20107:3;20103:12;20096:25;20147:2;20142:3;20138:12;20131:19;;19937:219;;;:::o;20162:381::-;;20325:67;20389:2;20384:3;20325:67;:::i;:::-;20318:74;;20422:34;20418:1;20413:3;20409:11;20402:55;20488:19;20483:2;20478:3;20474:12;20467:41;20534:2;20529:3;20525:12;20518:19;;20308:235;;;:::o;20549:327::-;;20712:67;20776:2;20771:3;20712:67;:::i;:::-;20705:74;;20809:31;20805:1;20800:3;20796:11;20789:52;20867:2;20862:3;20858:12;20851:19;;20695:181;;;:::o;20882:319::-;;21045:67;21109:2;21104:3;21045:67;:::i;:::-;21038:74;;21142:23;21138:1;21133:3;21129:11;21122:44;21192:2;21187:3;21183:12;21176:19;;21028:173;;;:::o;21207:324::-;;21370:67;21434:2;21429:3;21370:67;:::i;:::-;21363:74;;21467:28;21463:1;21458:3;21454:11;21447:49;21522:2;21517:3;21513:12;21506:19;;21353:178;;;:::o;21537:108::-;21614:24;21632:5;21614:24;:::i;:::-;21609:3;21602:37;21592:53;;:::o;21651:118::-;21738:24;21756:5;21738:24;:::i;:::-;21733:3;21726:37;21716:53;;:::o;21775:271::-;;21927:93;22016:3;22007:6;21927:93;:::i;:::-;21920:100;;22037:3;22030:10;;21909:137;;;;:::o;22052:435::-;;22254:95;22345:3;22336:6;22254:95;:::i;:::-;22247:102;;22366:95;22457:3;22448:6;22366:95;:::i;:::-;22359:102;;22478:3;22471:10;;22236:251;;;;;:::o;22493:222::-;;22624:2;22613:9;22609:18;22601:26;;22637:71;22705:1;22694:9;22690:17;22681:6;22637:71;:::i;:::-;22591:124;;;;:::o;22721:672::-;;22970:3;22959:9;22955:19;22947:27;;22984:87;23068:1;23057:9;23053:17;23044:6;22984:87;:::i;:::-;23081:72;23149:2;23138:9;23134:18;23125:6;23081:72;:::i;:::-;23163;23231:2;23220:9;23216:18;23207:6;23163:72;:::i;:::-;23282:9;23276:4;23272:20;23267:2;23256:9;23252:18;23245:48;23310:76;23381:4;23372:6;23310:76;:::i;:::-;23302:84;;22937:456;;;;;;;:::o;23399:373::-;;23580:2;23569:9;23565:18;23557:26;;23629:9;23623:4;23619:20;23615:1;23604:9;23600:17;23593:47;23657:108;23760:4;23751:6;23657:108;:::i;:::-;23649:116;;23547:225;;;;:::o;23778:210::-;;23903:2;23892:9;23888:18;23880:26;;23916:65;23978:1;23967:9;23963:17;23954:6;23916:65;:::i;:::-;23870:118;;;;:::o;23994:333::-;;24155:2;24144:9;24140:18;24132:26;;24204:9;24198:4;24194:20;24190:1;24179:9;24175:17;24168:47;24232:88;24315:4;24306:6;24298;24232:88;:::i;:::-;24224:96;;24122:205;;;;;:::o;24333:313::-;;24484:2;24473:9;24469:18;24461:26;;24533:9;24527:4;24523:20;24519:1;24508:9;24504:17;24497:47;24561:78;24634:4;24625:6;24561:78;:::i;:::-;24553:86;;24451:195;;;;:::o;24652:419::-;;24856:2;24845:9;24841:18;24833:26;;24905:9;24899:4;24895:20;24891:1;24880:9;24876:17;24869:47;24933:131;25059:4;24933:131;:::i;:::-;24925:139;;24823:248;;;:::o;25077:419::-;;25281:2;25270:9;25266:18;25258:26;;25330:9;25324:4;25320:20;25316:1;25305:9;25301:17;25294:47;25358:131;25484:4;25358:131;:::i;:::-;25350:139;;25248:248;;;:::o;25502:419::-;;25706:2;25695:9;25691:18;25683:26;;25755:9;25749:4;25745:20;25741:1;25730:9;25726:17;25719:47;25783:131;25909:4;25783:131;:::i;:::-;25775:139;;25673:248;;;:::o;25927:419::-;;26131:2;26120:9;26116:18;26108:26;;26180:9;26174:4;26170:20;26166:1;26155:9;26151:17;26144:47;26208:131;26334:4;26208:131;:::i;:::-;26200:139;;26098:248;;;:::o;26352:419::-;;26556:2;26545:9;26541:18;26533:26;;26605:9;26599:4;26595:20;26591:1;26580:9;26576:17;26569:47;26633:131;26759:4;26633:131;:::i;:::-;26625:139;;26523:248;;;:::o;26777:419::-;;26981:2;26970:9;26966:18;26958:26;;27030:9;27024:4;27020:20;27016:1;27005:9;27001:17;26994:47;27058:131;27184:4;27058:131;:::i;:::-;27050:139;;26948:248;;;:::o;27202:419::-;;27406:2;27395:9;27391:18;27383:26;;27455:9;27449:4;27445:20;27441:1;27430:9;27426:17;27419:47;27483:131;27609:4;27483:131;:::i;:::-;27475:139;;27373:248;;;:::o;27627:419::-;;27831:2;27820:9;27816:18;27808:26;;27880:9;27874:4;27870:20;27866:1;27855:9;27851:17;27844:47;27908:131;28034:4;27908:131;:::i;:::-;27900:139;;27798:248;;;:::o;28052:419::-;;28256:2;28245:9;28241:18;28233:26;;28305:9;28299:4;28295:20;28291:1;28280:9;28276:17;28269:47;28333:131;28459:4;28333:131;:::i;:::-;28325:139;;28223:248;;;:::o;28477:419::-;;28681:2;28670:9;28666:18;28658:26;;28730:9;28724:4;28720:20;28716:1;28705:9;28701:17;28694:47;28758:131;28884:4;28758:131;:::i;:::-;28750:139;;28648:248;;;:::o;28902:419::-;;29106:2;29095:9;29091:18;29083:26;;29155:9;29149:4;29145:20;29141:1;29130:9;29126:17;29119:47;29183:131;29309:4;29183:131;:::i;:::-;29175:139;;29073:248;;;:::o;29327:419::-;;29531:2;29520:9;29516:18;29508:26;;29580:9;29574:4;29570:20;29566:1;29555:9;29551:17;29544:47;29608:131;29734:4;29608:131;:::i;:::-;29600:139;;29498:248;;;:::o;29752:419::-;;29956:2;29945:9;29941:18;29933:26;;30005:9;29999:4;29995:20;29991:1;29980:9;29976:17;29969:47;30033:131;30159:4;30033:131;:::i;:::-;30025:139;;29923:248;;;:::o;30177:419::-;;30381:2;30370:9;30366:18;30358:26;;30430:9;30424:4;30420:20;30416:1;30405:9;30401:17;30394:47;30458:131;30584:4;30458:131;:::i;:::-;30450:139;;30348:248;;;:::o;30602:419::-;;30806:2;30795:9;30791:18;30783:26;;30855:9;30849:4;30845:20;30841:1;30830:9;30826:17;30819:47;30883:131;31009:4;30883:131;:::i;:::-;30875:139;;30773:248;;;:::o;31027:419::-;;31231:2;31220:9;31216:18;31208:26;;31280:9;31274:4;31270:20;31266:1;31255:9;31251:17;31244:47;31308:131;31434:4;31308:131;:::i;:::-;31300:139;;31198:248;;;:::o;31452:419::-;;31656:2;31645:9;31641:18;31633:26;;31705:9;31699:4;31695:20;31691:1;31680:9;31676:17;31669:47;31733:131;31859:4;31733:131;:::i;:::-;31725:139;;31623:248;;;:::o;31877:419::-;;32081:2;32070:9;32066:18;32058:26;;32130:9;32124:4;32120:20;32116:1;32105:9;32101:17;32094:47;32158:131;32284:4;32158:131;:::i;:::-;32150:139;;32048:248;;;:::o;32302:419::-;;32506:2;32495:9;32491:18;32483:26;;32555:9;32549:4;32545:20;32541:1;32530:9;32526:17;32519:47;32583:131;32709:4;32583:131;:::i;:::-;32575:139;;32473:248;;;:::o;32727:419::-;;32931:2;32920:9;32916:18;32908:26;;32980:9;32974:4;32970:20;32966:1;32955:9;32951:17;32944:47;33008:131;33134:4;33008:131;:::i;:::-;33000:139;;32898:248;;;:::o;33152:419::-;;33356:2;33345:9;33341:18;33333:26;;33405:9;33399:4;33395:20;33391:1;33380:9;33376:17;33369:47;33433:131;33559:4;33433:131;:::i;:::-;33425:139;;33323:248;;;:::o;33577:419::-;;33781:2;33770:9;33766:18;33758:26;;33830:9;33824:4;33820:20;33816:1;33805:9;33801:17;33794:47;33858:131;33984:4;33858:131;:::i;:::-;33850:139;;33748:248;;;:::o;34002:419::-;;34206:2;34195:9;34191:18;34183:26;;34255:9;34249:4;34245:20;34241:1;34230:9;34226:17;34219:47;34283:131;34409:4;34283:131;:::i;:::-;34275:139;;34173:248;;;:::o;34427:419::-;;34631:2;34620:9;34616:18;34608:26;;34680:9;34674:4;34670:20;34666:1;34655:9;34651:17;34644:47;34708:131;34834:4;34708:131;:::i;:::-;34700:139;;34598:248;;;:::o;34852:419::-;;35056:2;35045:9;35041:18;35033:26;;35105:9;35099:4;35095:20;35091:1;35080:9;35076:17;35069:47;35133:131;35259:4;35133:131;:::i;:::-;35125:139;;35023:248;;;:::o;35277:419::-;;35481:2;35470:9;35466:18;35458:26;;35530:9;35524:4;35520:20;35516:1;35505:9;35501:17;35494:47;35558:131;35684:4;35558:131;:::i;:::-;35550:139;;35448:248;;;:::o;35702:419::-;;35906:2;35895:9;35891:18;35883:26;;35955:9;35949:4;35945:20;35941:1;35930:9;35926:17;35919:47;35983:131;36109:4;35983:131;:::i;:::-;35975:139;;35873:248;;;:::o;36127:419::-;;36331:2;36320:9;36316:18;36308:26;;36380:9;36374:4;36370:20;36366:1;36355:9;36351:17;36344:47;36408:131;36534:4;36408:131;:::i;:::-;36400:139;;36298:248;;;:::o;36552:419::-;;36756:2;36745:9;36741:18;36733:26;;36805:9;36799:4;36795:20;36791:1;36780:9;36776:17;36769:47;36833:131;36959:4;36833:131;:::i;:::-;36825:139;;36723:248;;;:::o;36977:419::-;;37181:2;37170:9;37166:18;37158:26;;37230:9;37224:4;37220:20;37216:1;37205:9;37201:17;37194:47;37258:131;37384:4;37258:131;:::i;:::-;37250:139;;37148:248;;;:::o;37402:419::-;;37606:2;37595:9;37591:18;37583:26;;37655:9;37649:4;37645:20;37641:1;37630:9;37626:17;37619:47;37683:131;37809:4;37683:131;:::i;:::-;37675:139;;37573:248;;;:::o;37827:222::-;;37958:2;37947:9;37943:18;37935:26;;37971:71;38039:1;38028:9;38024:17;38015:6;37971:71;:::i;:::-;37925:124;;;;:::o;38055:278::-;;38121:2;38115:9;38105:19;;38163:4;38155:6;38151:17;38270:6;38258:10;38255:22;38234:18;38222:10;38219:34;38216:62;38213:2;;;38281:13;;:::i;:::-;38213:2;38316:10;38312:2;38305:22;38095:238;;;;:::o;38339:326::-;;38490:18;38482:6;38479:30;38476:2;;;38512:13;;:::i;:::-;38476:2;38592:4;38588:9;38581:4;38573:6;38569:17;38565:33;38557:41;;38653:4;38647;38643:15;38635:23;;38405:260;;;:::o;38671:327::-;;38823:18;38815:6;38812:30;38809:2;;;38845:13;;:::i;:::-;38809:2;38925:4;38921:9;38914:4;38906:6;38902:17;38898:33;38890:41;;38986:4;38980;38976:15;38968:23;;38738:260;;;:::o;39004:132::-;;39094:3;39086:11;;39124:4;39119:3;39115:14;39107:22;;39076:60;;;:::o;39142:114::-;;39243:5;39237:12;39227:22;;39216:40;;;:::o;39262:98::-;;39347:5;39341:12;39331:22;;39320:40;;;:::o;39366:99::-;;39452:5;39446:12;39436:22;;39425:40;;;:::o;39471:113::-;;39573:4;39568:3;39564:14;39556:22;;39546:38;;;:::o;39590:184::-;;39723:6;39718:3;39711:19;39763:4;39758:3;39754:14;39739:29;;39701:73;;;;:::o;39780:168::-;;39897:6;39892:3;39885:19;39937:4;39932:3;39928:14;39913:29;;39875:73;;;;:::o;39954:147::-;;40092:3;40077:18;;40067:34;;;;:::o;40107:169::-;;40225:6;40220:3;40213:19;40265:4;40260:3;40256:14;40241:29;;40203:73;;;;:::o;40282:148::-;;40421:3;40406:18;;40396:34;;;;:::o;40436:96::-;;40502:24;40520:5;40502:24;:::i;:::-;40491:35;;40481:51;;;:::o;40538:104::-;;40612:24;40630:5;40612:24;:::i;:::-;40601:35;;40591:51;;;:::o;40648:90::-;;40725:5;40718:13;40711:21;40700:32;;40690:48;;;:::o;40744:149::-;;40820:66;40813:5;40809:78;40798:89;;40788:105;;;:::o;40899:126::-;;40976:42;40969:5;40965:54;40954:65;;40944:81;;;:::o;41031:77::-;;41097:5;41086:16;;41076:32;;;:::o;41114:154::-;41198:6;41193:3;41188;41175:30;41260:1;41251:6;41246:3;41242:16;41235:27;41165:103;;;:::o;41274:307::-;41342:1;41352:113;41366:6;41363:1;41360:13;41352:113;;;41451:1;41446:3;41442:11;41436:18;41432:1;41427:3;41423:11;41416:39;41388:2;41385:1;41381:10;41376:15;;41352:113;;;41483:6;41480:1;41477:13;41474:2;;;41563:1;41554:6;41549:3;41545:16;41538:27;41474:2;41323:258;;;;:::o;41587:48::-;41620:9;41641:102;;41733:2;41729:7;41724:2;41717:5;41713:14;41709:28;41699:38;;41689:54;;;:::o;41749:122::-;41822:24;41840:5;41822:24;:::i;:::-;41815:5;41812:35;41802:2;;41861:1;41858;41851:12;41802:2;41792:79;:::o;41877:116::-;41947:21;41962:5;41947:21;:::i;:::-;41940:5;41937:32;41927:2;;41983:1;41980;41973:12;41927:2;41917:76;:::o;41999:120::-;42071:23;42088:5;42071:23;:::i;:::-;42064:5;42061:34;42051:2;;42109:1;42106;42099:12;42051:2;42041:78;:::o;42125:122::-;42198:24;42216:5;42198:24;:::i;:::-;42191:5;42188:35;42178:2;;42237:1;42234;42227:12;42178:2;42168:79;:::o
Swarm Source
ipfs://576f47332f21c75deff0edbb7321b8d56ab1e8515d2b60a86ebbd1712b8b720e
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.