ERC-721
Overview
Max Total Supply
110 MEB
Holders
71
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 MEBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Mutant
Compiler Version
v0.7.1+commit.f4a555be
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-15 */ // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; // File: @openzeppelin/contracts/utils/Context.sol /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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; } } 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); } 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; } 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); } 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); } 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); } 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 () { // 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; } } 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; } } 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); } } } } 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)); } } 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)))); } } 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); } } library Counters { using SafeMath for uint256; struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { // The {SafeMath} overflow check can be skipped here, see the comment at the top counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } /** * @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_) { _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. 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(address to, uint256 tokenId) internal virtual { require(to == ERC721.ownerOf(tokenId)); // internal owner _beforeTokenTransfer(to, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[to].remove(tokenId); _tokenOwners.remove(tokenId); emit Transfer(to, 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 /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/GameCard.sol abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } abstract contract ERC721Pausable is ERC721, Ownable, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (_msgSender() != owner()) { require(!paused(), "ERC721Pausable: token transfer while paused"); } } } pragma experimental ABIEncoderV2; /** * @title GameCard contract * @dev Extends ERC721 Non-Fungible Token Standard basic implementation */ contract Mutant is Ownable, ERC721Pausable { using SafeMath for uint256; using Strings for uint256; // counter for the tokenid using Counters for Counters.Counter; Counters.Counter private _tokenIds; // map & list with all CARD index, not id uint256 public constant MAX_ELEMENTS = 7777; uint256 public PRICE = 1 * 10**17; uint256 public constant MAX_BY_MINT = 20; uint256 public ownerSupply = 0; uint256 public constant MAX_BY_OWNER = 10; mapping(uint => bool) public ImgStatus; // map with PACK ids event MintPack(address indexed to, uint256 indexed tokenId); constructor(string memory baseURI) ERC721("Mutant Ether Babies", "MEB") { _setBaseURI(baseURI); } modifier saleIsOpen { require(totalSupply() <= MAX_ELEMENTS, "Sale end"); if (_msgSender() != owner()) { require(!paused(), "Pausable: paused"); } _; } /** * Mints a PACK */ function mintPack(string[] memory tokenURI, uint256[] memory mintedImg) public payable saleIsOpen returns (uint256) { require(mintedImg.length <= MAX_BY_MINT, "Exceeds number"); if (_msgSender() == owner()) { require(ownerSupply + mintedImg.length <= MAX_BY_OWNER, "Exceeds max by owner"); } // add PACK id to map for(uint256 j = 0; j < mintedImg.length; j++) { require(!ImgStatus[mintedImg[j]], "This number is existed"); ImgStatus[mintedImg[j]] = true; } for (uint256 i = 0; i < tokenURI.length; i++) { _mintAnElement(msg.sender, tokenURI[i]); } if(owner() == msg.sender) { ownerSupply += mintedImg.length; } emit MintPack(msg.sender, _tokenIds.current()); } function _mintAnElement(address _to, string memory tokenURI) private { _tokenIds.increment(); uint256 newItemId = _tokenIds.current(); _safeMint(_to, newItemId); _setTokenURI(newItemId, tokenURI); } function price(uint256 _count) public view returns (uint256) { return PRICE.mul(_count); } function setPrice(uint256 _price) public onlyOwner { PRICE = _price; } function pause(bool val) public onlyOwner { if (val == true) { _pause(); return; } _unpause(); } function withdrawAll() public onlyOwner { uint256 balance = address(this).balance; require(balance > 0); _widthdraw(owner(), balance); } function _widthdraw(address _address, uint256 _amount) private { (bool success, ) = _address.call{value: _amount}(""); require(success, "Transfer failed."); } receive() external payable { } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MintPack","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ImgStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BY_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BY_OWNER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ELEMENTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","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":"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":[{"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":[{"internalType":"string[]","name":"tokenURI","type":"string[]"},{"internalType":"uint256[]","name":"mintedImg","type":"uint256[]"}],"name":"mintPack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405260405180602001604052806000815250600990805190602001906200002b92919062000350565b5067016345785d8a0000600c556000600d553480156200004a57600080fd5b5060405162004afe38038062004afe833981810160405281019062000070919062000452565b6040518060400160405280601381526020017f4d7574616e7420457468657220426162696573000000000000000000000000008152506040518060400160405280600381526020017f4d45420000000000000000000000000000000000000000000000000000000000815250620000f46301ffc9a760e01b6200025460201b60201c565b81600690805190602001906200010c92919062000350565b5080600790805190602001906200012592919062000350565b506200013e6380ac58cd60e01b6200025460201b60201c565b62000156635b5e139f60e01b6200025460201b60201c565b6200016e63780e9d6360e01b6200025460201b60201c565b50506000620001826200032c60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506000600a60146101000a81548160ff0219169083151502179055506200024d816200033460201b60201c565b506200059d565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002c0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002b790620004d9565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b80600990805190602001906200034c92919062000350565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200039357805160ff1916838001178555620003c4565b82800160010185558215620003c4579182015b82811115620003c3578251825591602001919060010190620003a6565b5b509050620003d39190620003d7565b5090565b5b80821115620003f2576000816000905550600101620003d8565b5090565b600082601f8301126200040857600080fd5b81516200041f620004198262000529565b620004fb565b915080825260208301602083018583830111156200043c57600080fd5b6200044983828462000567565b50505092915050565b6000602082840312156200046557600080fd5b600082015167ffffffffffffffff8111156200048057600080fd5b6200048e84828501620003f6565b91505092915050565b6000620004a6601c8362000556565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b60006020820190508181036000830152620004f48162000497565b9050919050565b6000604051905081810181811067ffffffffffffffff821117156200051f57600080fd5b8060405250919050565b600067ffffffffffffffff8211156200054157600080fd5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b60005b83811015620005875780820151818401526020810190506200056a565b8381111562000597576000848401525b50505050565b61455180620005ad6000396000f3fe6080604052600436106101e75760003560e01c806370a0823111610102578063a22cb46511610095578063c978d21d11610064578063c978d21d14610706578063e985e9c514610743578063f2fde38b14610780578063fc941002146107a9576101ee565b8063a22cb46514610647578063a77cd67914610670578063b88d4fde146106a0578063c87b56dd146106c9576101ee565b80638d859f3e116100d15780638d859f3e1461059d5780638da5cb5b146105c857806391b7f5ed146105f357806395d89b411461061c576101ee565b806370a0823114610507578063715018a614610544578063853828b61461055b5780638ad5de2814610572576101ee565b806326a49e371161017a5780634f6ccce7116101495780634f6ccce7146104375780635c975abb146104745780636352211e1461049f5780636c0360eb146104dc576101ee565b806326a49e37146103695780632f745c59146103a65780633502a716146103e357806342842e0e1461040e576101ee565b8063095ea7b3116101b6578063095ea7b3146102c157806318160ddd146102ea57806323b872dd1461031557806325f96b731461033e576101ee565b806301ffc9a7146101f357806302329a291461023057806306fdde0314610259578063081812fc14610284576101ee565b366101ee57005b600080fd5b3480156101ff57600080fd5b5061021a6004803603810190610215919061324e565b6107d4565b6040516102279190613e5a565b60405180910390f35b34801561023c57600080fd5b5061025760048036038101906102529190613225565b61083b565b005b34801561026557600080fd5b5061026e6108dd565b60405161027b9190613e75565b60405180910390f35b34801561029057600080fd5b506102ab60048036038101906102a691906132a0565b61097f565b6040516102b89190613dd8565b60405180910390f35b3480156102cd57600080fd5b506102e860048036038101906102e3919061317d565b610a04565b005b3480156102f657600080fd5b506102ff610b1c565b60405161030c9190614217565b60405180910390f35b34801561032157600080fd5b5061033c60048036038101906103379190613077565b610b2d565b005b34801561034a57600080fd5b50610353610b8d565b6040516103609190614217565b60405180910390f35b34801561037557600080fd5b50610390600480360381019061038b91906132a0565b610b93565b60405161039d9190614217565b60405180910390f35b3480156103b257600080fd5b506103cd60048036038101906103c8919061317d565b610bb1565b6040516103da9190614217565b60405180910390f35b3480156103ef57600080fd5b506103f8610c0c565b6040516104059190614217565b60405180910390f35b34801561041a57600080fd5b5061043560048036038101906104309190613077565b610c12565b005b34801561044357600080fd5b5061045e600480360381019061045991906132a0565b610c32565b60405161046b9190614217565b60405180910390f35b34801561048057600080fd5b50610489610c55565b6040516104969190613e5a565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c191906132a0565b610c6c565b6040516104d39190613dd8565b60405180910390f35b3480156104e857600080fd5b506104f1610ca3565b6040516104fe9190613e75565b60405180910390f35b34801561051357600080fd5b5061052e60048036038101906105299190613012565b610d45565b60405161053b9190614217565b60405180910390f35b34801561055057600080fd5b50610559610e04565b005b34801561056757600080fd5b50610570610f41565b005b34801561057e57600080fd5b50610587610fe3565b6040516105949190614217565b60405180910390f35b3480156105a957600080fd5b506105b2610fe8565b6040516105bf9190614217565b60405180910390f35b3480156105d457600080fd5b506105dd610fee565b6040516105ea9190613dd8565b60405180910390f35b3480156105ff57600080fd5b5061061a600480360381019061061591906132a0565b611018565b005b34801561062857600080fd5b5061063161109e565b60405161063e9190613e75565b60405180910390f35b34801561065357600080fd5b5061066e60048036038101906106699190613141565b611140565b005b61068a600480360381019061068591906131b9565b6112c1565b6040516106979190614217565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c291906130c6565b61160e565b005b3480156106d557600080fd5b506106f060048036038101906106eb91906132a0565b611670565b6040516106fd9190613e75565b60405180910390f35b34801561071257600080fd5b5061072d600480360381019061072891906132a0565b6117f3565b60405161073a9190613e5a565b60405180910390f35b34801561074f57600080fd5b5061076a6004803603810190610765919061303b565b611813565b6040516107779190613e5a565b60405180910390f35b34801561078c57600080fd5b506107a760048036038101906107a29190613012565b6118a7565b005b3480156107b557600080fd5b506107be611a53565b6040516107cb9190614217565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b610843611a58565b73ffffffffffffffffffffffffffffffffffffffff16610861610fee565b73ffffffffffffffffffffffffffffffffffffffff16146108b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ae90614137565b60405180910390fd5b6001151581151514156108d1576108cc611a60565b6108da565b6108d9611b03565b5b50565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109755780601f1061094a57610100808354040283529160200191610975565b820191906000526020600020905b81548152906001019060200180831161095857829003601f168201915b5050505050905090565b600061098a82611ba5565b6109c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c0906140f7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a0f82610c6c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7790614197565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a9f611a58565b73ffffffffffffffffffffffffffffffffffffffff161480610ace5750610acd81610ac8611a58565b611813565b5b610b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0490614037565b60405180910390fd5b610b178383611bc2565b505050565b6000610b286002611c7b565b905090565b610b3e610b38611a58565b82611c90565b610b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b74906141d7565b60405180910390fd5b610b88838383611d6e565b505050565b600d5481565b6000610baa82600c54611f8590919063ffffffff16565b9050919050565b6000610c0482600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611ff590919063ffffffff16565b905092915050565b611e6181565b610c2d8383836040518060200160405280600081525061160e565b505050565b600080610c4983600261200f90919063ffffffff16565b50905080915050919050565b6000600a60149054906101000a900460ff16905090565b6000610c9c826040518060600160405280602981526020016144f360299139600261203b9092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d3b5780601f10610d1057610100808354040283529160200191610d3b565b820191906000526020600020905b815481529060010190602001808311610d1e57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610db6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dad90614057565b60405180910390fd5b610dfd600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061205a565b9050919050565b610e0c611a58565b73ffffffffffffffffffffffffffffffffffffffff16610e2a610fee565b73ffffffffffffffffffffffffffffffffffffffff1614610e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7790614137565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610f49611a58565b73ffffffffffffffffffffffffffffffffffffffff16610f67610fee565b73ffffffffffffffffffffffffffffffffffffffff1614610fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb490614137565b60405180910390fd5b600047905060008111610fcf57600080fd5b610fe0610fda610fee565b8261206f565b50565b601481565b600c5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611020611a58565b73ffffffffffffffffffffffffffffffffffffffff1661103e610fee565b73ffffffffffffffffffffffffffffffffffffffff1614611094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108b90614137565b60405180910390fd5b80600c8190555050565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111365780601f1061110b57610100808354040283529160200191611136565b820191906000526020600020905b81548152906001019060200180831161111957829003601f168201915b5050505050905090565b611148611a58565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad90613fb7565b60405180910390fd5b80600560006111c3611a58565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611270611a58565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112b59190613e5a565b60405180910390a35050565b6000611e616112ce610b1c565b111561130f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611306906140b7565b60405180910390fd5b611317610fee565b73ffffffffffffffffffffffffffffffffffffffff16611335611a58565b73ffffffffffffffffffffffffffffffffffffffff161461139957611358610c55565b15611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138f90614017565b60405180910390fd5b5b6014825111156113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d590613f17565b60405180910390fd5b6113e6610fee565b73ffffffffffffffffffffffffffffffffffffffff16611404611a58565b73ffffffffffffffffffffffffffffffffffffffff16141561146a57600a8251600d54011115611469576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146090614077565b60405180910390fd5b5b60005b825181101561153657600e600084838151811061148657fe5b6020026020010151815260200190815260200160002060009054906101000a900460ff16156114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190613e97565b60405180910390fd5b6001600e60008584815181106114fc57fe5b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550808060010191505061146d565b5060005b835181101561156d576115603385838151811061155357fe5b6020026020010151612120565b808060010191505061153a565b503373ffffffffffffffffffffffffffffffffffffffff1661158d610fee565b73ffffffffffffffffffffffffffffffffffffffff1614156115bb578151600d600082825401925050819055505b6115c5600b612151565b3373ffffffffffffffffffffffffffffffffffffffff167f774a0b0f514220c25bb32ea2b4557581b30c98b92304f315b967376e33d1777460405160405180910390a392915050565b61161f611619611a58565b83611c90565b61165e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611655906141d7565b60405180910390fd5b61166a8484848461215f565b50505050565b606061167b82611ba5565b6116ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b190614177565b60405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117635780601f1061173857610100808354040283529160200191611763565b820191906000526020600020905b81548152906001019060200180831161174657829003601f168201915b505050505090506060611774610ca3565b905060008151141561178a5781925050506117ee565b6000825111156117bf5780826040516020016117a7929190613d9f565b604051602081830303815290604052925050506117ee565b806117c9856121bb565b6040516020016117da929190613d9f565b604051602081830303815290604052925050505b919050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118af611a58565b73ffffffffffffffffffffffffffffffffffffffff166118cd610fee565b73ffffffffffffffffffffffffffffffffffffffff1614611923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191a90614137565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198a90613f57565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a81565b600033905090565b611a68610c55565b15611aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f90614017565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611aec611a58565b604051611af99190613df3565b60405180910390a1565b611b0b610c55565b611b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4190613ef7565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611b8e611a58565b604051611b9b9190613df3565b60405180910390a1565b6000611bbb82600261230290919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c3583610c6c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c898260000161231c565b9050919050565b6000611c9b82611ba5565b611cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd190613ff7565b60405180910390fd5b6000611ce583610c6c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d5457508373ffffffffffffffffffffffffffffffffffffffff16611d3c8461097f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d655750611d648185611813565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d8e82610c6c565b73ffffffffffffffffffffffffffffffffffffffff1614611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb90614157565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4b90613f97565b60405180910390fd5b611e5f83838361232d565b611e6a600082611bc2565b611ebb81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206123c790919063ffffffff16565b50611f0d81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206123e190919063ffffffff16565b50611f24818360026123fb9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080831415611f985760009050611fef565b6000828402905082848281611fa957fe5b0414611fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe1906140d7565b60405180910390fd5b809150505b92915050565b60006120048360000183612430565b60001c905092915050565b600080600080612022866000018661249d565b915091508160001c8160001c9350935050509250929050565b600061204e846000018460001b84612520565b60001c90509392505050565b6000612068826000016125b1565b9050919050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161209590613dc3565b60006040518083038185875af1925050503d80600081146120d2576040519150601f19603f3d011682016040523d82523d6000602084013e6120d7565b606091505b505090508061211b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612112906141b7565b60405180910390fd5b505050565b61212a600b6125c2565b6000612136600b612151565b905061214283826125d8565b61214c81836125f6565b505050565b600081600001549050919050565b61216a848484611d6e565b6121768484848461266a565b6121b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ac90613f37565b60405180910390fd5b50505050565b60606000821415612203576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506122fd565b600082905060005b6000821461222d578080600101915050600a828161222557fe5b04915061220b565b60608167ffffffffffffffff8111801561224657600080fd5b506040519080825280601f01601f1916602001820160405280156122795781602001600182028036833780820191505090505b50905060006001830390508593505b600084146122f557600a848161229a57fe5b0660300160f81b828280600190039350815181106122b457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816122ed57fe5b049350612288565b819450505050505b919050565b6000612314836000018360001b6127ce565b905092915050565b600081600001805490509050919050565b6123388383836127f1565b612340610fee565b73ffffffffffffffffffffffffffffffffffffffff1661235e611a58565b73ffffffffffffffffffffffffffffffffffffffff16146123c257612381610c55565b156123c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b890613ed7565b60405180910390fd5b5b505050565b60006123d9836000018360001b6127f6565b905092915050565b60006123f3836000018360001b6128de565b905092915050565b6000612427846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b61294e565b90509392505050565b60008183600001805490501161247b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247290613eb7565b60405180910390fd5b82600001828154811061248a57fe5b9060005260206000200154905092915050565b600080828460000180549050116124e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e090614097565b60405180910390fd5b60008460000184815481106124fa57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125799190613e75565b60405180910390fd5b5084600001600182038154811061259557fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6001816000016000828254019250508190555050565b6125f2828260405180602001604052806000815250612a2a565b5050565b6125ff82611ba5565b61263e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263590614117565b60405180910390fd5b80600860008481526020019081526020016000209080519060200190612665929190612d6d565b505050565b600061268b8473ffffffffffffffffffffffffffffffffffffffff16612a85565b61269857600190506127c6565b606061275f63150b7a0260e01b6126ad611a58565b8887876040516024016126c39493929190613e0e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060600160405280603281526020016144c1603291398773ffffffffffffffffffffffffffffffffffffffff16612a989092919063ffffffff16565b90506000818060200190518101906127779190613277565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b600080836001016000848152602001908152602001600020549050600081146128d2576000600182039050600060018660000180549050039050600086600001828154811061284157fe5b906000526020600020015490508087600001848154811061285e57fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061289657fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506128d8565b60009150505b92915050565b60006128ea8383612ab0565b612943578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612948565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156129f557846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050612a23565b82856000016001830381548110612a0857fe5b90600052602060002090600202016001018190555060009150505b9392505050565b612a348383612ad3565b612a41600084848461266a565b612a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7790613f37565b60405180910390fd5b505050565b600080823b905060008111915050919050565b6060612aa78484600085612bf1565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b612adc81611ba5565b15612b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1390613f77565b60405180910390fd5b612b286000838361232d565b612b7981600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206123e190919063ffffffff16565b50612b90818360026123fb9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b606082471015612c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2d90613fd7565b60405180910390fd5b612c3f85612a85565b612c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c75906141f7565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff168587604051612ca89190613d88565b60006040518083038185875af1925050503d8060008114612ce5576040519150601f19603f3d011682016040523d82523d6000602084013e612cea565b606091505b5091509150612cfa828286612d06565b92505050949350505050565b60608315612d1657829050612d66565b600083511115612d295782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5d9190613e75565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612dae57805160ff1916838001178555612ddc565b82800160010185558215612ddc579182015b82811115612ddb578251825591602001919060010190612dc0565b5b509050612de99190612ded565b5090565b5b80821115612e06576000816000905550600101612dee565b5090565b600081359050612e1981614464565b92915050565b600082601f830112612e3057600080fd5b8135612e43612e3e8261425f565b614232565b9150818183526020840193506020810190508360005b83811015612e895781358601612e6f8882612fa9565b845260208401935060208301925050600181019050612e59565b5050505092915050565b600082601f830112612ea457600080fd5b8135612eb7612eb282614287565b614232565b91508181835260208401935060208101905083856020840282011115612edc57600080fd5b60005b83811015612f0c5781612ef28882612ffd565b845260208401935060208301925050600181019050612edf565b5050505092915050565b600081359050612f258161447b565b92915050565b600081359050612f3a81614492565b92915050565b600081519050612f4f81614492565b92915050565b600082601f830112612f6657600080fd5b8135612f79612f74826142af565b614232565b91508082526020830160208301858383011115612f9557600080fd5b612fa0838284614411565b50505092915050565b600082601f830112612fba57600080fd5b8135612fcd612fc8826142db565b614232565b91508082526020830160208301858383011115612fe957600080fd5b612ff4838284614411565b50505092915050565b60008135905061300c816144a9565b92915050565b60006020828403121561302457600080fd5b600061303284828501612e0a565b91505092915050565b6000806040838503121561304e57600080fd5b600061305c85828601612e0a565b925050602061306d85828601612e0a565b9150509250929050565b60008060006060848603121561308c57600080fd5b600061309a86828701612e0a565b93505060206130ab86828701612e0a565b92505060406130bc86828701612ffd565b9150509250925092565b600080600080608085870312156130dc57600080fd5b60006130ea87828801612e0a565b94505060206130fb87828801612e0a565b935050604061310c87828801612ffd565b925050606085013567ffffffffffffffff81111561312957600080fd5b61313587828801612f55565b91505092959194509250565b6000806040838503121561315457600080fd5b600061316285828601612e0a565b925050602061317385828601612f16565b9150509250929050565b6000806040838503121561319057600080fd5b600061319e85828601612e0a565b92505060206131af85828601612ffd565b9150509250929050565b600080604083850312156131cc57600080fd5b600083013567ffffffffffffffff8111156131e657600080fd5b6131f285828601612e1f565b925050602083013567ffffffffffffffff81111561320f57600080fd5b61321b85828601612e93565b9150509250929050565b60006020828403121561323757600080fd5b600061324584828501612f16565b91505092915050565b60006020828403121561326057600080fd5b600061326e84828501612f2b565b91505092915050565b60006020828403121561328957600080fd5b600061329784828501612f40565b91505092915050565b6000602082840312156132b257600080fd5b60006132c084828501612ffd565b91505092915050565b6132d2816143db565b82525050565b6132e181614367565b82525050565b6132f081614355565b82525050565b6132ff81614379565b82525050565b600061331082614307565b61331a818561431d565b935061332a818560208601614420565b61333381614453565b840191505092915050565b600061334982614307565b613353818561432e565b9350613363818560208601614420565b80840191505092915050565b600061337a82614312565b6133848185614339565b9350613394818560208601614420565b61339d81614453565b840191505092915050565b60006133b382614312565b6133bd818561434a565b93506133cd818560208601614420565b80840191505092915050565b60006133e6601683614339565b91507f54686973206e756d6265722069732065786973746564000000000000000000006000830152602082019050919050565b6000613426602283614339565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061348c602b83614339565b91507f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008301527f68696c65207061757365640000000000000000000000000000000000000000006020830152604082019050919050565b60006134f2601483614339565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000613532600e83614339565b91507f45786365656473206e756d6265720000000000000000000000000000000000006000830152602082019050919050565b6000613572603283614339565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006135d8602683614339565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061363e601c83614339565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061367e602483614339565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006136e4601983614339565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613724602683614339565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061378a602c83614339565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006137f0601083614339565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000613830603883614339565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613896602a83614339565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006138fc601483614339565b91507f45786365656473206d6178206279206f776e65720000000000000000000000006000830152602082019050919050565b600061393c602283614339565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139a2600883614339565b91507f53616c6520656e640000000000000000000000000000000000000000000000006000830152602082019050919050565b60006139e2602183614339565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a48602c83614339565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613aae602c83614339565b91507f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613b14602083614339565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613b54602983614339565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bba602f83614339565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613c20602183614339565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c8660008361432e565b9150600082019050919050565b6000613ca0601083614339565b91507f5472616e73666572206661696c65642e000000000000000000000000000000006000830152602082019050919050565b6000613ce0603183614339565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613d46601d83614339565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b613d82816143d1565b82525050565b6000613d94828461333e565b915081905092915050565b6000613dab82856133a8565b9150613db782846133a8565b91508190509392505050565b6000613dce82613c79565b9150819050919050565b6000602082019050613ded60008301846132e7565b92915050565b6000602082019050613e0860008301846132c9565b92915050565b6000608082019050613e2360008301876132d8565b613e3060208301866132e7565b613e3d6040830185613d79565b8181036060830152613e4f8184613305565b905095945050505050565b6000602082019050613e6f60008301846132f6565b92915050565b60006020820190508181036000830152613e8f818461336f565b905092915050565b60006020820190508181036000830152613eb0816133d9565b9050919050565b60006020820190508181036000830152613ed081613419565b9050919050565b60006020820190508181036000830152613ef08161347f565b9050919050565b60006020820190508181036000830152613f10816134e5565b9050919050565b60006020820190508181036000830152613f3081613525565b9050919050565b60006020820190508181036000830152613f5081613565565b9050919050565b60006020820190508181036000830152613f70816135cb565b9050919050565b60006020820190508181036000830152613f9081613631565b9050919050565b60006020820190508181036000830152613fb081613671565b9050919050565b60006020820190508181036000830152613fd0816136d7565b9050919050565b60006020820190508181036000830152613ff081613717565b9050919050565b600060208201905081810360008301526140108161377d565b9050919050565b60006020820190508181036000830152614030816137e3565b9050919050565b6000602082019050818103600083015261405081613823565b9050919050565b6000602082019050818103600083015261407081613889565b9050919050565b60006020820190508181036000830152614090816138ef565b9050919050565b600060208201905081810360008301526140b08161392f565b9050919050565b600060208201905081810360008301526140d081613995565b9050919050565b600060208201905081810360008301526140f0816139d5565b9050919050565b6000602082019050818103600083015261411081613a3b565b9050919050565b6000602082019050818103600083015261413081613aa1565b9050919050565b6000602082019050818103600083015261415081613b07565b9050919050565b6000602082019050818103600083015261417081613b47565b9050919050565b6000602082019050818103600083015261419081613bad565b9050919050565b600060208201905081810360008301526141b081613c13565b9050919050565b600060208201905081810360008301526141d081613c93565b9050919050565b600060208201905081810360008301526141f081613cd3565b9050919050565b6000602082019050818103600083015261421081613d39565b9050919050565b600060208201905061422c6000830184613d79565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561425557600080fd5b8060405250919050565b600067ffffffffffffffff82111561427657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561429e57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156142c657600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156142f257600080fd5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614360826143b1565b9050919050565b6000614372826143b1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006143e6826143ed565b9050919050565b60006143f8826143ff565b9050919050565b600061440a826143b1565b9050919050565b82818337600083830152505050565b60005b8381101561443e578082015181840152602081019050614423565b8381111561444d576000848401525b50505050565b6000601f19601f8301169050919050565b61446d81614355565b811461447857600080fd5b50565b61448481614379565b811461448f57600080fd5b50565b61449b81614385565b81146144a657600080fd5b50565b6144b2816143d1565b81146144bd57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220a9461bc8849de1c22b050dff15394a78d6983cc236781daa764444b1af60cd1164736f6c6343000701003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d657070577a436b68695144433677674a686335376351416734434d4870595270636b565173595969634671322f00000000000000000000
Deployed Bytecode
0x6080604052600436106101e75760003560e01c806370a0823111610102578063a22cb46511610095578063c978d21d11610064578063c978d21d14610706578063e985e9c514610743578063f2fde38b14610780578063fc941002146107a9576101ee565b8063a22cb46514610647578063a77cd67914610670578063b88d4fde146106a0578063c87b56dd146106c9576101ee565b80638d859f3e116100d15780638d859f3e1461059d5780638da5cb5b146105c857806391b7f5ed146105f357806395d89b411461061c576101ee565b806370a0823114610507578063715018a614610544578063853828b61461055b5780638ad5de2814610572576101ee565b806326a49e371161017a5780634f6ccce7116101495780634f6ccce7146104375780635c975abb146104745780636352211e1461049f5780636c0360eb146104dc576101ee565b806326a49e37146103695780632f745c59146103a65780633502a716146103e357806342842e0e1461040e576101ee565b8063095ea7b3116101b6578063095ea7b3146102c157806318160ddd146102ea57806323b872dd1461031557806325f96b731461033e576101ee565b806301ffc9a7146101f357806302329a291461023057806306fdde0314610259578063081812fc14610284576101ee565b366101ee57005b600080fd5b3480156101ff57600080fd5b5061021a6004803603810190610215919061324e565b6107d4565b6040516102279190613e5a565b60405180910390f35b34801561023c57600080fd5b5061025760048036038101906102529190613225565b61083b565b005b34801561026557600080fd5b5061026e6108dd565b60405161027b9190613e75565b60405180910390f35b34801561029057600080fd5b506102ab60048036038101906102a691906132a0565b61097f565b6040516102b89190613dd8565b60405180910390f35b3480156102cd57600080fd5b506102e860048036038101906102e3919061317d565b610a04565b005b3480156102f657600080fd5b506102ff610b1c565b60405161030c9190614217565b60405180910390f35b34801561032157600080fd5b5061033c60048036038101906103379190613077565b610b2d565b005b34801561034a57600080fd5b50610353610b8d565b6040516103609190614217565b60405180910390f35b34801561037557600080fd5b50610390600480360381019061038b91906132a0565b610b93565b60405161039d9190614217565b60405180910390f35b3480156103b257600080fd5b506103cd60048036038101906103c8919061317d565b610bb1565b6040516103da9190614217565b60405180910390f35b3480156103ef57600080fd5b506103f8610c0c565b6040516104059190614217565b60405180910390f35b34801561041a57600080fd5b5061043560048036038101906104309190613077565b610c12565b005b34801561044357600080fd5b5061045e600480360381019061045991906132a0565b610c32565b60405161046b9190614217565b60405180910390f35b34801561048057600080fd5b50610489610c55565b6040516104969190613e5a565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c191906132a0565b610c6c565b6040516104d39190613dd8565b60405180910390f35b3480156104e857600080fd5b506104f1610ca3565b6040516104fe9190613e75565b60405180910390f35b34801561051357600080fd5b5061052e60048036038101906105299190613012565b610d45565b60405161053b9190614217565b60405180910390f35b34801561055057600080fd5b50610559610e04565b005b34801561056757600080fd5b50610570610f41565b005b34801561057e57600080fd5b50610587610fe3565b6040516105949190614217565b60405180910390f35b3480156105a957600080fd5b506105b2610fe8565b6040516105bf9190614217565b60405180910390f35b3480156105d457600080fd5b506105dd610fee565b6040516105ea9190613dd8565b60405180910390f35b3480156105ff57600080fd5b5061061a600480360381019061061591906132a0565b611018565b005b34801561062857600080fd5b5061063161109e565b60405161063e9190613e75565b60405180910390f35b34801561065357600080fd5b5061066e60048036038101906106699190613141565b611140565b005b61068a600480360381019061068591906131b9565b6112c1565b6040516106979190614217565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c291906130c6565b61160e565b005b3480156106d557600080fd5b506106f060048036038101906106eb91906132a0565b611670565b6040516106fd9190613e75565b60405180910390f35b34801561071257600080fd5b5061072d600480360381019061072891906132a0565b6117f3565b60405161073a9190613e5a565b60405180910390f35b34801561074f57600080fd5b5061076a6004803603810190610765919061303b565b611813565b6040516107779190613e5a565b60405180910390f35b34801561078c57600080fd5b506107a760048036038101906107a29190613012565b6118a7565b005b3480156107b557600080fd5b506107be611a53565b6040516107cb9190614217565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b610843611a58565b73ffffffffffffffffffffffffffffffffffffffff16610861610fee565b73ffffffffffffffffffffffffffffffffffffffff16146108b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ae90614137565b60405180910390fd5b6001151581151514156108d1576108cc611a60565b6108da565b6108d9611b03565b5b50565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109755780601f1061094a57610100808354040283529160200191610975565b820191906000526020600020905b81548152906001019060200180831161095857829003601f168201915b5050505050905090565b600061098a82611ba5565b6109c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c0906140f7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a0f82610c6c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7790614197565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a9f611a58565b73ffffffffffffffffffffffffffffffffffffffff161480610ace5750610acd81610ac8611a58565b611813565b5b610b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0490614037565b60405180910390fd5b610b178383611bc2565b505050565b6000610b286002611c7b565b905090565b610b3e610b38611a58565b82611c90565b610b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b74906141d7565b60405180910390fd5b610b88838383611d6e565b505050565b600d5481565b6000610baa82600c54611f8590919063ffffffff16565b9050919050565b6000610c0482600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611ff590919063ffffffff16565b905092915050565b611e6181565b610c2d8383836040518060200160405280600081525061160e565b505050565b600080610c4983600261200f90919063ffffffff16565b50905080915050919050565b6000600a60149054906101000a900460ff16905090565b6000610c9c826040518060600160405280602981526020016144f360299139600261203b9092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d3b5780601f10610d1057610100808354040283529160200191610d3b565b820191906000526020600020905b815481529060010190602001808311610d1e57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610db6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dad90614057565b60405180910390fd5b610dfd600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061205a565b9050919050565b610e0c611a58565b73ffffffffffffffffffffffffffffffffffffffff16610e2a610fee565b73ffffffffffffffffffffffffffffffffffffffff1614610e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7790614137565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610f49611a58565b73ffffffffffffffffffffffffffffffffffffffff16610f67610fee565b73ffffffffffffffffffffffffffffffffffffffff1614610fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb490614137565b60405180910390fd5b600047905060008111610fcf57600080fd5b610fe0610fda610fee565b8261206f565b50565b601481565b600c5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611020611a58565b73ffffffffffffffffffffffffffffffffffffffff1661103e610fee565b73ffffffffffffffffffffffffffffffffffffffff1614611094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108b90614137565b60405180910390fd5b80600c8190555050565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111365780601f1061110b57610100808354040283529160200191611136565b820191906000526020600020905b81548152906001019060200180831161111957829003601f168201915b5050505050905090565b611148611a58565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad90613fb7565b60405180910390fd5b80600560006111c3611a58565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611270611a58565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112b59190613e5a565b60405180910390a35050565b6000611e616112ce610b1c565b111561130f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611306906140b7565b60405180910390fd5b611317610fee565b73ffffffffffffffffffffffffffffffffffffffff16611335611a58565b73ffffffffffffffffffffffffffffffffffffffff161461139957611358610c55565b15611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138f90614017565b60405180910390fd5b5b6014825111156113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d590613f17565b60405180910390fd5b6113e6610fee565b73ffffffffffffffffffffffffffffffffffffffff16611404611a58565b73ffffffffffffffffffffffffffffffffffffffff16141561146a57600a8251600d54011115611469576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146090614077565b60405180910390fd5b5b60005b825181101561153657600e600084838151811061148657fe5b6020026020010151815260200190815260200160002060009054906101000a900460ff16156114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190613e97565b60405180910390fd5b6001600e60008584815181106114fc57fe5b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550808060010191505061146d565b5060005b835181101561156d576115603385838151811061155357fe5b6020026020010151612120565b808060010191505061153a565b503373ffffffffffffffffffffffffffffffffffffffff1661158d610fee565b73ffffffffffffffffffffffffffffffffffffffff1614156115bb578151600d600082825401925050819055505b6115c5600b612151565b3373ffffffffffffffffffffffffffffffffffffffff167f774a0b0f514220c25bb32ea2b4557581b30c98b92304f315b967376e33d1777460405160405180910390a392915050565b61161f611619611a58565b83611c90565b61165e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611655906141d7565b60405180910390fd5b61166a8484848461215f565b50505050565b606061167b82611ba5565b6116ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b190614177565b60405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117635780601f1061173857610100808354040283529160200191611763565b820191906000526020600020905b81548152906001019060200180831161174657829003601f168201915b505050505090506060611774610ca3565b905060008151141561178a5781925050506117ee565b6000825111156117bf5780826040516020016117a7929190613d9f565b604051602081830303815290604052925050506117ee565b806117c9856121bb565b6040516020016117da929190613d9f565b604051602081830303815290604052925050505b919050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118af611a58565b73ffffffffffffffffffffffffffffffffffffffff166118cd610fee565b73ffffffffffffffffffffffffffffffffffffffff1614611923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191a90614137565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198a90613f57565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a81565b600033905090565b611a68610c55565b15611aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f90614017565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611aec611a58565b604051611af99190613df3565b60405180910390a1565b611b0b610c55565b611b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4190613ef7565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611b8e611a58565b604051611b9b9190613df3565b60405180910390a1565b6000611bbb82600261230290919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c3583610c6c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c898260000161231c565b9050919050565b6000611c9b82611ba5565b611cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd190613ff7565b60405180910390fd5b6000611ce583610c6c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d5457508373ffffffffffffffffffffffffffffffffffffffff16611d3c8461097f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d655750611d648185611813565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d8e82610c6c565b73ffffffffffffffffffffffffffffffffffffffff1614611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb90614157565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4b90613f97565b60405180910390fd5b611e5f83838361232d565b611e6a600082611bc2565b611ebb81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206123c790919063ffffffff16565b50611f0d81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206123e190919063ffffffff16565b50611f24818360026123fb9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080831415611f985760009050611fef565b6000828402905082848281611fa957fe5b0414611fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe1906140d7565b60405180910390fd5b809150505b92915050565b60006120048360000183612430565b60001c905092915050565b600080600080612022866000018661249d565b915091508160001c8160001c9350935050509250929050565b600061204e846000018460001b84612520565b60001c90509392505050565b6000612068826000016125b1565b9050919050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161209590613dc3565b60006040518083038185875af1925050503d80600081146120d2576040519150601f19603f3d011682016040523d82523d6000602084013e6120d7565b606091505b505090508061211b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612112906141b7565b60405180910390fd5b505050565b61212a600b6125c2565b6000612136600b612151565b905061214283826125d8565b61214c81836125f6565b505050565b600081600001549050919050565b61216a848484611d6e565b6121768484848461266a565b6121b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ac90613f37565b60405180910390fd5b50505050565b60606000821415612203576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506122fd565b600082905060005b6000821461222d578080600101915050600a828161222557fe5b04915061220b565b60608167ffffffffffffffff8111801561224657600080fd5b506040519080825280601f01601f1916602001820160405280156122795781602001600182028036833780820191505090505b50905060006001830390508593505b600084146122f557600a848161229a57fe5b0660300160f81b828280600190039350815181106122b457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816122ed57fe5b049350612288565b819450505050505b919050565b6000612314836000018360001b6127ce565b905092915050565b600081600001805490509050919050565b6123388383836127f1565b612340610fee565b73ffffffffffffffffffffffffffffffffffffffff1661235e611a58565b73ffffffffffffffffffffffffffffffffffffffff16146123c257612381610c55565b156123c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b890613ed7565b60405180910390fd5b5b505050565b60006123d9836000018360001b6127f6565b905092915050565b60006123f3836000018360001b6128de565b905092915050565b6000612427846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b61294e565b90509392505050565b60008183600001805490501161247b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247290613eb7565b60405180910390fd5b82600001828154811061248a57fe5b9060005260206000200154905092915050565b600080828460000180549050116124e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e090614097565b60405180910390fd5b60008460000184815481106124fa57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125799190613e75565b60405180910390fd5b5084600001600182038154811061259557fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6001816000016000828254019250508190555050565b6125f2828260405180602001604052806000815250612a2a565b5050565b6125ff82611ba5565b61263e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263590614117565b60405180910390fd5b80600860008481526020019081526020016000209080519060200190612665929190612d6d565b505050565b600061268b8473ffffffffffffffffffffffffffffffffffffffff16612a85565b61269857600190506127c6565b606061275f63150b7a0260e01b6126ad611a58565b8887876040516024016126c39493929190613e0e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060600160405280603281526020016144c1603291398773ffffffffffffffffffffffffffffffffffffffff16612a989092919063ffffffff16565b90506000818060200190518101906127779190613277565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b600080836001016000848152602001908152602001600020549050600081146128d2576000600182039050600060018660000180549050039050600086600001828154811061284157fe5b906000526020600020015490508087600001848154811061285e57fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061289657fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506128d8565b60009150505b92915050565b60006128ea8383612ab0565b612943578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612948565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156129f557846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050612a23565b82856000016001830381548110612a0857fe5b90600052602060002090600202016001018190555060009150505b9392505050565b612a348383612ad3565b612a41600084848461266a565b612a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7790613f37565b60405180910390fd5b505050565b600080823b905060008111915050919050565b6060612aa78484600085612bf1565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b612adc81611ba5565b15612b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1390613f77565b60405180910390fd5b612b286000838361232d565b612b7981600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206123e190919063ffffffff16565b50612b90818360026123fb9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b606082471015612c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2d90613fd7565b60405180910390fd5b612c3f85612a85565b612c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c75906141f7565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff168587604051612ca89190613d88565b60006040518083038185875af1925050503d8060008114612ce5576040519150601f19603f3d011682016040523d82523d6000602084013e612cea565b606091505b5091509150612cfa828286612d06565b92505050949350505050565b60608315612d1657829050612d66565b600083511115612d295782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5d9190613e75565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612dae57805160ff1916838001178555612ddc565b82800160010185558215612ddc579182015b82811115612ddb578251825591602001919060010190612dc0565b5b509050612de99190612ded565b5090565b5b80821115612e06576000816000905550600101612dee565b5090565b600081359050612e1981614464565b92915050565b600082601f830112612e3057600080fd5b8135612e43612e3e8261425f565b614232565b9150818183526020840193506020810190508360005b83811015612e895781358601612e6f8882612fa9565b845260208401935060208301925050600181019050612e59565b5050505092915050565b600082601f830112612ea457600080fd5b8135612eb7612eb282614287565b614232565b91508181835260208401935060208101905083856020840282011115612edc57600080fd5b60005b83811015612f0c5781612ef28882612ffd565b845260208401935060208301925050600181019050612edf565b5050505092915050565b600081359050612f258161447b565b92915050565b600081359050612f3a81614492565b92915050565b600081519050612f4f81614492565b92915050565b600082601f830112612f6657600080fd5b8135612f79612f74826142af565b614232565b91508082526020830160208301858383011115612f9557600080fd5b612fa0838284614411565b50505092915050565b600082601f830112612fba57600080fd5b8135612fcd612fc8826142db565b614232565b91508082526020830160208301858383011115612fe957600080fd5b612ff4838284614411565b50505092915050565b60008135905061300c816144a9565b92915050565b60006020828403121561302457600080fd5b600061303284828501612e0a565b91505092915050565b6000806040838503121561304e57600080fd5b600061305c85828601612e0a565b925050602061306d85828601612e0a565b9150509250929050565b60008060006060848603121561308c57600080fd5b600061309a86828701612e0a565b93505060206130ab86828701612e0a565b92505060406130bc86828701612ffd565b9150509250925092565b600080600080608085870312156130dc57600080fd5b60006130ea87828801612e0a565b94505060206130fb87828801612e0a565b935050604061310c87828801612ffd565b925050606085013567ffffffffffffffff81111561312957600080fd5b61313587828801612f55565b91505092959194509250565b6000806040838503121561315457600080fd5b600061316285828601612e0a565b925050602061317385828601612f16565b9150509250929050565b6000806040838503121561319057600080fd5b600061319e85828601612e0a565b92505060206131af85828601612ffd565b9150509250929050565b600080604083850312156131cc57600080fd5b600083013567ffffffffffffffff8111156131e657600080fd5b6131f285828601612e1f565b925050602083013567ffffffffffffffff81111561320f57600080fd5b61321b85828601612e93565b9150509250929050565b60006020828403121561323757600080fd5b600061324584828501612f16565b91505092915050565b60006020828403121561326057600080fd5b600061326e84828501612f2b565b91505092915050565b60006020828403121561328957600080fd5b600061329784828501612f40565b91505092915050565b6000602082840312156132b257600080fd5b60006132c084828501612ffd565b91505092915050565b6132d2816143db565b82525050565b6132e181614367565b82525050565b6132f081614355565b82525050565b6132ff81614379565b82525050565b600061331082614307565b61331a818561431d565b935061332a818560208601614420565b61333381614453565b840191505092915050565b600061334982614307565b613353818561432e565b9350613363818560208601614420565b80840191505092915050565b600061337a82614312565b6133848185614339565b9350613394818560208601614420565b61339d81614453565b840191505092915050565b60006133b382614312565b6133bd818561434a565b93506133cd818560208601614420565b80840191505092915050565b60006133e6601683614339565b91507f54686973206e756d6265722069732065786973746564000000000000000000006000830152602082019050919050565b6000613426602283614339565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061348c602b83614339565b91507f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008301527f68696c65207061757365640000000000000000000000000000000000000000006020830152604082019050919050565b60006134f2601483614339565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000613532600e83614339565b91507f45786365656473206e756d6265720000000000000000000000000000000000006000830152602082019050919050565b6000613572603283614339565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006135d8602683614339565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061363e601c83614339565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061367e602483614339565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006136e4601983614339565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613724602683614339565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061378a602c83614339565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006137f0601083614339565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000613830603883614339565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613896602a83614339565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006138fc601483614339565b91507f45786365656473206d6178206279206f776e65720000000000000000000000006000830152602082019050919050565b600061393c602283614339565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139a2600883614339565b91507f53616c6520656e640000000000000000000000000000000000000000000000006000830152602082019050919050565b60006139e2602183614339565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a48602c83614339565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613aae602c83614339565b91507f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613b14602083614339565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613b54602983614339565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bba602f83614339565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613c20602183614339565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c8660008361432e565b9150600082019050919050565b6000613ca0601083614339565b91507f5472616e73666572206661696c65642e000000000000000000000000000000006000830152602082019050919050565b6000613ce0603183614339565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613d46601d83614339565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b613d82816143d1565b82525050565b6000613d94828461333e565b915081905092915050565b6000613dab82856133a8565b9150613db782846133a8565b91508190509392505050565b6000613dce82613c79565b9150819050919050565b6000602082019050613ded60008301846132e7565b92915050565b6000602082019050613e0860008301846132c9565b92915050565b6000608082019050613e2360008301876132d8565b613e3060208301866132e7565b613e3d6040830185613d79565b8181036060830152613e4f8184613305565b905095945050505050565b6000602082019050613e6f60008301846132f6565b92915050565b60006020820190508181036000830152613e8f818461336f565b905092915050565b60006020820190508181036000830152613eb0816133d9565b9050919050565b60006020820190508181036000830152613ed081613419565b9050919050565b60006020820190508181036000830152613ef08161347f565b9050919050565b60006020820190508181036000830152613f10816134e5565b9050919050565b60006020820190508181036000830152613f3081613525565b9050919050565b60006020820190508181036000830152613f5081613565565b9050919050565b60006020820190508181036000830152613f70816135cb565b9050919050565b60006020820190508181036000830152613f9081613631565b9050919050565b60006020820190508181036000830152613fb081613671565b9050919050565b60006020820190508181036000830152613fd0816136d7565b9050919050565b60006020820190508181036000830152613ff081613717565b9050919050565b600060208201905081810360008301526140108161377d565b9050919050565b60006020820190508181036000830152614030816137e3565b9050919050565b6000602082019050818103600083015261405081613823565b9050919050565b6000602082019050818103600083015261407081613889565b9050919050565b60006020820190508181036000830152614090816138ef565b9050919050565b600060208201905081810360008301526140b08161392f565b9050919050565b600060208201905081810360008301526140d081613995565b9050919050565b600060208201905081810360008301526140f0816139d5565b9050919050565b6000602082019050818103600083015261411081613a3b565b9050919050565b6000602082019050818103600083015261413081613aa1565b9050919050565b6000602082019050818103600083015261415081613b07565b9050919050565b6000602082019050818103600083015261417081613b47565b9050919050565b6000602082019050818103600083015261419081613bad565b9050919050565b600060208201905081810360008301526141b081613c13565b9050919050565b600060208201905081810360008301526141d081613c93565b9050919050565b600060208201905081810360008301526141f081613cd3565b9050919050565b6000602082019050818103600083015261421081613d39565b9050919050565b600060208201905061422c6000830184613d79565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561425557600080fd5b8060405250919050565b600067ffffffffffffffff82111561427657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561429e57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156142c657600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156142f257600080fd5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614360826143b1565b9050919050565b6000614372826143b1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006143e6826143ed565b9050919050565b60006143f8826143ff565b9050919050565b600061440a826143b1565b9050919050565b82818337600083830152505050565b60005b8381101561443e578082015181840152602081019050614423565b8381111561444d576000848401525b50505050565b6000601f19601f8301169050919050565b61446d81614355565b811461447857600080fd5b50565b61448481614379565b811461448f57600080fd5b50565b61449b81614385565b81146144a657600080fd5b50565b6144b2816143d1565b81146144bd57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220a9461bc8849de1c22b050dff15394a78d6983cc236781daa764444b1af60cd1164736f6c63430007010033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d657070577a436b68695144433677674a686335376351416734434d4870595270636b565173595969634671322f00000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): ipfs://QmeppWzCkhiQDC6wgJhc57cQAg4CMHpYRpckVQsYYicFq2/
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d657070577a436b68695144433677674a68633537635141
Arg [3] : 6734434d4870595270636b565173595969634671322f00000000000000000000
Deployed Bytecode Sourcemap
65732:2980:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8614:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68143:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48067:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50831:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50361:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49839:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51721:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66178:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67935:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49601:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66035:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52097:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50127:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63844:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47823:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49420:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47540:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62719:148;;;;;;;;;;;;;:::i;:::-;;68309:168;;;;;;;;;;;;;:::i;:::-;;66125:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66085:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62068:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68047:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48236:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51124:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66805:861;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52319:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48411:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66269:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51490:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63022:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66215:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8614:150;8699:4;8723:20;:33;8744:11;8723:33;;;;;;;;;;;;;;;;;;;;;;;;;;;8716:40;;8614:150;;;:::o;68143:154::-;62299:12;:10;:12::i;:::-;62288:23;;:7;:5;:7::i;:::-;:23;;;62280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68207:4:::1;68200:11;;:3;:11;;;68196:73;;;68228:8;:6;:8::i;:::-;68251:7;;68196:73;68279:10;:8;:10::i;:::-;62359:1;68143:154:::0;:::o;48067:100::-;48121:13;48154:5;48147:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48067:100;:::o;50831:221::-;50907:7;50935:16;50943:7;50935;:16::i;:::-;50927:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;51020:15;:24;51036:7;51020:24;;;;;;;;;;;;;;;;;;;;;51013:31;;50831:221;;;:::o;50361:404::-;50442:13;50458:23;50473:7;50458:14;:23::i;:::-;50442:39;;50506:5;50500:11;;:2;:11;;;;50492:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50586:5;50570:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;50595:44;50619:5;50626:12;:10;:12::i;:::-;50595:23;:44::i;:::-;50570:69;50562:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;50736:21;50745:2;50749:7;50736:8;:21::i;:::-;50361:404;;;:::o;49839:211::-;49900:7;50021:21;:12;:19;:21::i;:::-;50014:28;;49839:211;:::o;51721:305::-;51882:41;51901:12;:10;:12::i;:::-;51915:7;51882:18;:41::i;:::-;51874:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;51990:28;52000:4;52006:2;52010:7;51990:9;:28::i;:::-;51721:305;;;:::o;66178:30::-;;;;:::o;67935:104::-;67987:7;68014:17;68024:6;68014:5;;:9;;:17;;;;:::i;:::-;68007:24;;67935:104;;;:::o;49601:162::-;49698:7;49725:30;49749:5;49725:13;:20;49739:5;49725:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;49718:37;;49601:162;;;;:::o;66035:43::-;66074:4;66035:43;:::o;52097:151::-;52201:39;52218:4;52224:2;52228:7;52201:39;;;;;;;;;;;;:16;:39::i;:::-;52097:151;;;:::o;50127:172::-;50202:7;50223:15;50244:22;50260:5;50244:12;:15;;:22;;;;:::i;:::-;50222:44;;;50284:7;50277:14;;;50127:172;;;:::o;63844:86::-;63891:4;63915:7;;;;;;;;;;;63908:14;;63844:86;:::o;47823:177::-;47895:7;47922:70;47939:7;47922:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;47915:77;;47823:177;;;:::o;49420:97::-;49468:13;49501:8;49494:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49420:97;:::o;47540:221::-;47612:7;47657:1;47640:19;;:5;:19;;;;47632:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;47724:29;:13;:20;47738:5;47724:20;;;;;;;;;;;;;;;:27;:29::i;:::-;47717:36;;47540:221;;;:::o;62719:148::-;62299:12;:10;:12::i;:::-;62288:23;;:7;:5;:7::i;:::-;:23;;;62280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62826:1:::1;62789:40;;62810:6;;;;;;;;;;;62789:40;;;;;;;;;;;;62857:1;62840:6;;:19;;;;;;;;;;;;;;;;;;62719:148::o:0;68309:168::-;62299:12;:10;:12::i;:::-;62288:23;;:7;:5;:7::i;:::-;:23;;;62280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68360:15:::1;68378:21;68360:39;;68428:1;68418:7;:11;68410:20;;;::::0;::::1;;68441:28;68452:7;:5;:7::i;:::-;68461;68441:10;:28::i;:::-;62359:1;68309:168::o:0;66125:40::-;66163:2;66125:40;:::o;66085:33::-;;;;:::o;62068:87::-;62114:7;62141:6;;;;;;;;;;;62134:13;;62068:87;:::o;68047:84::-;62299:12;:10;:12::i;:::-;62288:23;;:7;:5;:7::i;:::-;:23;;;62280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68117:6:::1;68109:5;:14;;;;68047:84:::0;:::o;48236:104::-;48292:13;48325:7;48318:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48236:104;:::o;51124:295::-;51239:12;:10;:12::i;:::-;51227:24;;:8;:24;;;;51219:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51339:8;51294:18;:32;51313:12;:10;:12::i;:::-;51294:32;;;;;;;;;;;;;;;:42;51327:8;51294:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;51392:8;51363:48;;51378:12;:10;:12::i;:::-;51363:48;;;51402:8;51363:48;;;;;;:::i;:::-;;;;;;;;51124:295;;:::o;66805:861::-;66912:7;66074:4;66588:13;:11;:13::i;:::-;:29;;66580:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;66661:7;:5;:7::i;:::-;66645:23;;:12;:10;:12::i;:::-;:23;;;66641:94;;66694:8;:6;:8::i;:::-;66693:9;66685:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;66641:94;66163:2:::1;66940:9;:16;:31;;66932:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;67021:7;:5;:7::i;:::-;67005:23;;:12;:10;:12::i;:::-;:23;;;67001:135;;;66254:2;67067:9;:16;67053:11;;:30;:46;;67045:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;67001:135;67191:9;67187:177;67210:9;:16;67206:1;:20;67187:177;;;67257:9;:23;67267:9;67277:1;67267:12;;;;;;;;;;;;;;67257:23;;;;;;;;;;;;;;;;;;;;;67256:24;67248:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;67348:4;67322:9;:23;67332:9;67342:1;67332:12;;;;;;;;;;;;;;67322:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;67228:3;;;;;;;67187:177;;;;67389:9;67384:112;67408:8;:15;67404:1;:19;67384:112;;;67445:39;67460:10;67472:8;67481:1;67472:11;;;;;;;;;;;;;;67445:14;:39::i;:::-;67425:3;;;;;;;67384:112;;;;67530:10;67519:21;;:7;:5;:7::i;:::-;:21;;;67516:84;;;67572:9;:16;67557:11;;:31;;;;;;;;;;;67516:84;67638:19;:9;:17;:19::i;:::-;67626:10;67617:41;;;;;;;;;;;;66805:861:::0;;;;:::o;52319:285::-;52451:41;52470:12;:10;:12::i;:::-;52484:7;52451:18;:41::i;:::-;52443:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;52557:39;52571:4;52577:2;52581:7;52590:5;52557:13;:39::i;:::-;52319:285;;;;:::o;48411:792::-;48484:13;48518:16;48526:7;48518;:16::i;:::-;48510:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;48599:23;48625:10;:19;48636:7;48625:19;;;;;;;;;;;48599:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48655:18;48676:9;:7;:9::i;:::-;48655:30;;48783:1;48767:4;48761:18;:23;48757:72;;;48808:9;48801:16;;;;;;48757:72;48959:1;48939:9;48933:23;:27;48929:108;;;49008:4;49014:9;48991:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48977:48;;;;;;48929:108;49169:4;49175:18;:7;:16;:18::i;:::-;49152:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49138:57;;;;48411:792;;;;:::o;66269:38::-;;;;;;;;;;;;;;;;;;;;;;:::o;51490:164::-;51587:4;51611:18;:25;51630:5;51611:25;;;;;;;;;;;;;;;:35;51637:8;51611:35;;;;;;;;;;;;;;;;;;;;;;;;;51604:42;;51490:164;;;;:::o;63022:244::-;62299:12;:10;:12::i;:::-;62288:23;;:7;:5;:7::i;:::-;:23;;;62280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63131:1:::1;63111:22;;:8;:22;;;;63103:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;63221:8;63192:38;;63213:6;;;;;;;;;;;63192:38;;;;;;;;;;;;63250:8;63241:6;;:17;;;;;;;;;;;;;;;;;;63022:244:::0;:::o;66215:41::-;66254:2;66215:41;:::o;665:106::-;718:15;753:10;746:17;;665:106;:::o;64644:118::-;64170:8;:6;:8::i;:::-;64169:9;64161:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;64714:4:::1;64704:7;;:14;;;;;;;;;;;;;;;;;;64734:20;64741:12;:10;:12::i;:::-;64734:20;;;;;;:::i;:::-;;;;;;;;64644:118::o:0;64903:120::-;64447:8;:6;:8::i;:::-;64439:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;64972:5:::1;64962:7;;:15;;;;;;;;;;;;;;;;;;64993:22;65002:12;:10;:12::i;:::-;64993:22;;;;;;:::i;:::-;;;;;;;;64903:120::o:0;54071:127::-;54136:4;54160:30;54182:7;54160:12;:21;;:30;;;;:::i;:::-;54153:37;;54071:127;;;:::o;60098:192::-;60200:2;60173:15;:24;60189:7;60173:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;60256:7;60252:2;60218:46;;60227:23;60242:7;60227:14;:23::i;:::-;60218:46;;;;;;;;;;;;60098:192;;:::o;40184:123::-;40253:7;40280:19;40288:3;:10;;40280:7;:19::i;:::-;40273:26;;40184:123;;;:::o;54365:355::-;54458:4;54483:16;54491:7;54483;:16::i;:::-;54475:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54559:13;54575:23;54590:7;54575:14;:23::i;:::-;54559:39;;54628:5;54617:16;;:7;:16;;;:51;;;;54661:7;54637:31;;:20;54649:7;54637:11;:20::i;:::-;:31;;;54617:51;:94;;;;54672:39;54696:5;54703:7;54672:23;:39::i;:::-;54617:94;54609:103;;;54365:355;;;;:::o;57506:599::-;57631:4;57604:31;;:23;57619:7;57604:14;:23::i;:::-;:31;;;57596:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;57732:1;57718:16;;:2;:16;;;;57710:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57788:39;57809:4;57815:2;57819:7;57788:20;:39::i;:::-;57892:29;57909:1;57913:7;57892:8;:29::i;:::-;57934:35;57961:7;57934:13;:19;57948:4;57934:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;57980:30;58002:7;57980:13;:17;57994:2;57980:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;58023:29;58040:7;58049:2;58023:12;:16;;:29;;;;;:::i;:::-;;58089:7;58085:2;58070:27;;58079:4;58070:27;;;;;;;;;;;;57506:599;;;:::o;12385:220::-;12443:7;12472:1;12467;:6;12463:20;;;12482:1;12475:8;;;;12463:20;12494:9;12510:1;12506;:5;12494:17;;12539:1;12534;12530;:5;;;;;;:10;12522:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;12596:1;12589:8;;;12385:220;;;;;:::o;32804:137::-;32875:7;32910:22;32914:3;:10;;32926:5;32910:3;:22::i;:::-;32902:31;;32895:38;;32804:137;;;;:::o;40646:236::-;40726:7;40735;40756:11;40769:13;40786:22;40790:3;:10;;40802:5;40786:3;:22::i;:::-;40755:53;;;;40835:3;40827:12;;40865:5;40857:14;;40819:55;;;;;;40646:236;;;;;:::o;41932:213::-;42039:7;42090:44;42095:3;:10;;42115:3;42107:12;;42121;42090:4;:44::i;:::-;42082:53;;42059:78;;41932:213;;;;;:::o;32346:114::-;32406:7;32433:19;32441:3;:10;;32433:7;:19::i;:::-;32426:26;;32346:114;;;:::o;68485:181::-;68560:12;68578:8;:13;;68599:7;68578:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68559:52;;;68630:7;68622:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;68485:181;;;:::o;67678:249::-;67758:21;:9;:19;:21::i;:::-;67790:17;67810:19;:9;:17;:19::i;:::-;67790:39;;67850:25;67860:3;67865:9;67850;:25::i;:::-;67886:33;67899:9;67910:8;67886:12;:33::i;:::-;67678:249;;;:::o;43466:114::-;43531:7;43558;:14;;;43551:21;;43466:114;;;:::o;53486:272::-;53600:28;53610:4;53616:2;53620:7;53600:9;:28::i;:::-;53647:48;53670:4;53676:2;53680:7;53689:5;53647:22;:48::i;:::-;53639:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;53486:272;;;;:::o;42265:746::-;42321:13;42551:1;42542:5;:10;42538:53;;;42569:10;;;;;;;;;;;;;;;;;;;;;42538:53;42601:12;42616:5;42601:20;;42632:14;42657:78;42672:1;42664:4;:9;42657:78;;42690:8;;;;;;;42721:2;42713:10;;;;;;;;;42657:78;;;42745:19;42777:6;42767:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42745:39;;42795:13;42820:1;42811:6;:10;42795:26;;42839:5;42832:12;;42855:117;42870:1;42862:4;:9;42855:117;;42931:2;42924:4;:9;;;;;;42919:2;:14;42906:29;;42888:6;42895:7;;;;;;;42888:15;;;;;;;;;;;:47;;;;;;;;;;;42958:2;42950:10;;;;;;;;;42855:117;;;42996:6;42982:21;;;;;;42265:746;;;;:::o;39945:151::-;40029:4;40053:35;40063:3;:10;;40083:3;40075:12;;40053:9;:35::i;:::-;40046:42;;39945:151;;;;:::o;36763:110::-;36819:7;36846:3;:12;;:19;;;;36839:26;;36763:110;;;:::o;65246:328::-;65390:45;65417:4;65423:2;65427:7;65390:26;:45::i;:::-;65466:7;:5;:7::i;:::-;65450:23;;:12;:10;:12::i;:::-;:23;;;65446:121;;65499:8;:6;:8::i;:::-;65498:9;65490:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;65446:121;65246:328;;;:::o;31891:137::-;31961:4;31985:35;31993:3;:10;;32013:5;32005:14;;31985:7;:35::i;:::-;31978:42;;31891:137;;;;:::o;31584:131::-;31651:4;31675:32;31680:3;:10;;31700:5;31692:14;;31675:4;:32::i;:::-;31668:39;;31584:131;;;;:::o;39368:185::-;39457:4;39481:64;39486:3;:10;;39506:3;39498:12;;39536:5;39520:23;;39512:32;;39481:4;:64::i;:::-;39474:71;;39368:185;;;;;:::o;27842:204::-;27909:7;27958:5;27937:3;:11;;:18;;;;:26;27929:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28020:3;:11;;28032:5;28020:18;;;;;;;;;;;;;;;;28013:25;;27842:204;;;;:::o;37228:279::-;37295:7;37304;37354:5;37332:3;:12;;:19;;;;:27;37324:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;37411:22;37436:3;:12;;37449:5;37436:19;;;;;;;;;;;;;;;;;;37411:44;;37474:5;:10;;;37486:5;:12;;;37466:33;;;;;37228:279;;;;;:::o;38725:319::-;38819:7;38839:16;38858:3;:12;;:17;38871:3;38858:17;;;;;;;;;;;;38839:36;;38906:1;38894:8;:13;;38909:12;38886:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;38976:3;:12;;39000:1;38989:8;:12;38976:26;;;;;;;;;;;;;;;;;;:33;;;38969:40;;;38725:319;;;;;:::o;27389:109::-;27445:7;27472:3;:11;;:18;;;;27465:25;;27389:109;;;:::o;43588:181::-;43760:1;43742:7;:14;;;:19;;;;;;;;;;;43588:181;:::o;55063:110::-;55139:26;55149:2;55153:7;55139:26;;;;;;;;;;;;:9;:26::i;:::-;55063:110;;:::o;58261:215::-;58361:16;58369:7;58361;:16::i;:::-;58353:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58459:9;58437:10;:19;58448:7;58437:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;58261:215;;:::o;59375:604::-;59496:4;59523:15;:2;:13;;;:15::i;:::-;59518:60;;59562:4;59555:11;;;;59518:60;59588:23;59614:252;59667:45;;;59727:12;:10;:12::i;:::-;59754:4;59773:7;59795:5;59630:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59614:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;59588:278;;59877:13;59904:10;59893:32;;;;;;;;;;;;:::i;:::-;59877:48;;44539:10;59954:16;;59944:26;;;:6;:26;;;;59936:35;;;;59375:604;;;;;;;:::o;36543:125::-;36614:4;36659:1;36638:3;:12;;:17;36651:3;36638:17;;;;;;;;;;;;:22;;36631:29;;36543:125;;;;:::o;60903:93::-;;;;:::o;25544:1544::-;25610:4;25728:18;25749:3;:12;;:19;25762:5;25749:19;;;;;;;;;;;;25728:40;;25799:1;25785:10;:15;25781:1300;;26147:21;26184:1;26171:10;:14;26147:38;;26200:17;26241:1;26220:3;:11;;:18;;;;:22;26200:42;;26487:17;26507:3;:11;;26519:9;26507:22;;;;;;;;;;;;;;;;26487:42;;26653:9;26624:3;:11;;26636:13;26624:26;;;;;;;;;;;;;;;:38;;;;26772:1;26756:13;:17;26730:3;:12;;:23;26743:9;26730:23;;;;;;;;;;;:43;;;;26882:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;26977:3;:12;;:19;26990:5;26977:19;;;;;;;;;;;26970:26;;;27020:4;27013:11;;;;;;;;25781:1300;27064:5;27057:12;;;25544:1544;;;;;:::o;24954:414::-;25017:4;25039:21;25049:3;25054:5;25039:9;:21::i;:::-;25034:327;;25077:3;:11;;25094:5;25077:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25260:3;:11;;:18;;;;25238:3;:12;;:19;25251:5;25238:19;;;;;;;;;;;:40;;;;25300:4;25293:11;;;;25034:327;25344:5;25337:12;;24954:414;;;;;:::o;34043:692::-;34119:4;34235:16;34254:3;:12;;:17;34267:3;34254:17;;;;;;;;;;;;34235:36;;34300:1;34288:8;:13;34284:444;;;34355:3;:12;;34373:38;;;;;;;;34390:3;34373:38;;;;34403:5;34373:38;;;34355:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34570:3;:12;;:19;;;;34550:3;:12;;:17;34563:3;34550:17;;;;;;;;;;;:39;;;;34611:4;34604:11;;;;;34284:444;34684:5;34648:3;:12;;34672:1;34661:8;:12;34648:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;34711:5;34704:12;;;34043:692;;;;;;:::o;55400:250::-;55496:18;55502:2;55506:7;55496:5;:18::i;:::-;55533:54;55564:1;55568:2;55572:7;55581:5;55533:22;:54::i;:::-;55525:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;55400:250;;;:::o;16783:422::-;16843:4;17051:12;17162:7;17150:20;17142:28;;17196:1;17189:4;:8;17182:15;;;16783:422;;;:::o;19701:195::-;19804:12;19836:52;19858:6;19866:4;19872:1;19875:12;19836:21;:52::i;:::-;19829:59;;19701:195;;;;;:::o;27174:129::-;27247:4;27294:1;27271:3;:12;;:19;27284:5;27271:19;;;;;;;;;;;;:24;;27264:31;;27174:129;;;;:::o;55986:407::-;56142:16;56150:7;56142;:16::i;:::-;56141:17;56133:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56204:45;56233:1;56237:2;56241:7;56204:20;:45::i;:::-;56262:30;56284:7;56262:13;:17;56276:2;56262:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;56305:29;56322:7;56331:2;56305:12;:16;;:29;;;;;:::i;:::-;;56377:7;56373:2;56352:33;;56369:1;56352:33;;;;;;;;;;;;55986:407;;:::o;20753:530::-;20880:12;20938:5;20913:21;:30;;20905:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;21005:18;21016:6;21005:10;:18::i;:::-;20997:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;21131:12;21145:23;21172:6;:11;;21192:5;21200:4;21172:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21130:75;;;;21223:52;21241:7;21250:10;21262:12;21223:17;:52::i;:::-;21216:59;;;;20753:530;;;;;;:::o;23293:742::-;23408:12;23437:7;23433:595;;;23468:10;23461:17;;;;23433:595;23602:1;23582:10;:17;:21;23578:439;;;23845:10;23839:17;23906:15;23893:10;23889:2;23885:19;23878:44;23793:148;23988:12;23981:20;;;;;;;;;;;:::i;:::-;;;;;;;;23293:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;159:708::-;;286:3;279:4;271:6;267:17;263:27;253:2;;304:1;301;294:12;253:2;341:6;328:20;363:90;378:74;445:6;378:74;:::i;:::-;363:90;:::i;:::-;354:99;;470:5;495:6;488:5;481:21;525:4;517:6;513:17;503:27;;547:4;542:3;538:14;531:21;;600:6;633:1;618:243;643:6;640:1;637:13;618:243;;;726:3;713:17;705:6;701:30;750:47;793:3;781:10;750:47;:::i;:::-;745:3;738:60;821:4;816:3;812:14;805:21;;849:4;844:3;840:14;833:21;;675:186;665:1;662;658:9;653:14;;618:243;;;622:14;246:621;;;;;;;:::o;893:707::-;;1010:3;1003:4;995:6;991:17;987:27;977:2;;1028:1;1025;1018:12;977:2;1065:6;1052:20;1087:80;1102:64;1159:6;1102:64;:::i;:::-;1087:80;:::i;:::-;1078:89;;1184:5;1209:6;1202:5;1195:21;1239:4;1231:6;1227:17;1217:27;;1261:4;1256:3;1252:14;1245:21;;1314:6;1361:3;1353:4;1345:6;1341:17;1336:3;1332:27;1329:36;1326:2;;;1378:1;1375;1368:12;1326:2;1403:1;1388:206;1413:6;1410:1;1407:13;1388:206;;;1471:3;1493:37;1526:3;1514:10;1493:37;:::i;:::-;1488:3;1481:50;1554:4;1549:3;1545:14;1538:21;;1582:4;1577:3;1573:14;1566:21;;1445:149;1435:1;1432;1428:9;1423:14;;1388:206;;;1392:14;970:630;;;;;;;:::o;1608:124::-;;1685:6;1672:20;1663:29;;1697:30;1721:5;1697:30;:::i;:::-;1657:75;;;;:::o;1739:128::-;;1818:6;1805:20;1796:29;;1830:32;1856:5;1830:32;:::i;:::-;1790:77;;;;:::o;1874:132::-;;1957:6;1951:13;1942:22;;1969:32;1995:5;1969:32;:::i;:::-;1936:70;;;;:::o;2014:440::-;;2115:3;2108:4;2100:6;2096:17;2092:27;2082:2;;2133:1;2130;2123:12;2082:2;2170:6;2157:20;2192:64;2207:48;2248:6;2207:48;:::i;:::-;2192:64;:::i;:::-;2183:73;;2276:6;2269:5;2262:21;2312:4;2304:6;2300:17;2345:4;2338:5;2334:16;2380:3;2371:6;2366:3;2362:16;2359:25;2356:2;;;2397:1;2394;2387:12;2356:2;2407:41;2441:6;2436:3;2431;2407:41;:::i;:::-;2075:379;;;;;;;:::o;2463:442::-;;2565:3;2558:4;2550:6;2546:17;2542:27;2532:2;;2583:1;2580;2573:12;2532:2;2620:6;2607:20;2642:65;2657:49;2699:6;2657:49;:::i;:::-;2642:65;:::i;:::-;2633:74;;2727:6;2720:5;2713:21;2763:4;2755:6;2751:17;2796:4;2789:5;2785:16;2831:3;2822:6;2817:3;2813:16;2810:25;2807:2;;;2848:1;2845;2838:12;2807:2;2858:41;2892:6;2887:3;2882;2858:41;:::i;:::-;2525:380;;;;;;;:::o;2913:130::-;;2993:6;2980:20;2971:29;;3005:33;3032:5;3005:33;:::i;:::-;2965:78;;;;:::o;3050:241::-;;3154:2;3142:9;3133:7;3129:23;3125:32;3122:2;;;3170:1;3167;3160:12;3122:2;3205:1;3222:53;3267:7;3258:6;3247:9;3243:22;3222:53;:::i;:::-;3212:63;;3184:97;3116:175;;;;:::o;3298:366::-;;;3419:2;3407:9;3398:7;3394:23;3390:32;3387:2;;;3435:1;3432;3425:12;3387:2;3470:1;3487:53;3532:7;3523:6;3512:9;3508:22;3487:53;:::i;:::-;3477:63;;3449:97;3577:2;3595:53;3640:7;3631:6;3620:9;3616:22;3595:53;:::i;:::-;3585:63;;3556:98;3381:283;;;;;:::o;3671:491::-;;;;3809:2;3797:9;3788:7;3784:23;3780:32;3777:2;;;3825:1;3822;3815:12;3777:2;3860:1;3877:53;3922:7;3913:6;3902:9;3898:22;3877:53;:::i;:::-;3867:63;;3839:97;3967:2;3985:53;4030:7;4021:6;4010:9;4006:22;3985:53;:::i;:::-;3975:63;;3946:98;4075:2;4093:53;4138:7;4129:6;4118:9;4114:22;4093:53;:::i;:::-;4083:63;;4054:98;3771:391;;;;;:::o;4169:721::-;;;;;4333:3;4321:9;4312:7;4308:23;4304:33;4301:2;;;4350:1;4347;4340:12;4301:2;4385:1;4402:53;4447:7;4438:6;4427:9;4423:22;4402:53;:::i;:::-;4392:63;;4364:97;4492:2;4510:53;4555:7;4546:6;4535:9;4531:22;4510:53;:::i;:::-;4500:63;;4471:98;4600:2;4618:53;4663:7;4654:6;4643:9;4639:22;4618:53;:::i;:::-;4608:63;;4579:98;4736:2;4725:9;4721:18;4708:32;4760:18;4752:6;4749:30;4746:2;;;4792:1;4789;4782:12;4746:2;4812:62;4866:7;4857:6;4846:9;4842:22;4812:62;:::i;:::-;4802:72;;4687:193;4295:595;;;;;;;:::o;4897:360::-;;;5015:2;5003:9;4994:7;4990:23;4986:32;4983:2;;;5031:1;5028;5021:12;4983:2;5066:1;5083:53;5128:7;5119:6;5108:9;5104:22;5083:53;:::i;:::-;5073:63;;5045:97;5173:2;5191:50;5233:7;5224:6;5213:9;5209:22;5191:50;:::i;:::-;5181:60;;5152:95;4977:280;;;;;:::o;5264:366::-;;;5385:2;5373:9;5364:7;5360:23;5356:32;5353:2;;;5401:1;5398;5391:12;5353:2;5436:1;5453:53;5498:7;5489:6;5478:9;5474:22;5453:53;:::i;:::-;5443:63;;5415:97;5543:2;5561:53;5606:7;5597:6;5586:9;5582:22;5561:53;:::i;:::-;5551:63;;5522:98;5347:283;;;;;:::o;5637:658::-;;;5818:2;5806:9;5797:7;5793:23;5789:32;5786:2;;;5834:1;5831;5824:12;5786:2;5897:1;5886:9;5882:17;5869:31;5920:18;5912:6;5909:30;5906:2;;;5952:1;5949;5942:12;5906:2;5972:88;6052:7;6043:6;6032:9;6028:22;5972:88;:::i;:::-;5962:98;;5848:218;6125:2;6114:9;6110:18;6097:32;6149:18;6141:6;6138:30;6135:2;;;6181:1;6178;6171:12;6135:2;6201:78;6271:7;6262:6;6251:9;6247:22;6201:78;:::i;:::-;6191:88;;6076:209;5780:515;;;;;:::o;6302:235::-;;6403:2;6391:9;6382:7;6378:23;6374:32;6371:2;;;6419:1;6416;6409:12;6371:2;6454:1;6471:50;6513:7;6504:6;6493:9;6489:22;6471:50;:::i;:::-;6461:60;;6433:94;6365:172;;;;:::o;6544:239::-;;6647:2;6635:9;6626:7;6622:23;6618:32;6615:2;;;6663:1;6660;6653:12;6615:2;6698:1;6715:52;6759:7;6750:6;6739:9;6735:22;6715:52;:::i;:::-;6705:62;;6677:96;6609:174;;;;:::o;6790:261::-;;6904:2;6892:9;6883:7;6879:23;6875:32;6872:2;;;6920:1;6917;6910:12;6872:2;6955:1;6972:63;7027:7;7018:6;7007:9;7003:22;6972:63;:::i;:::-;6962:73;;6934:107;6866:185;;;;:::o;7058:241::-;;7162:2;7150:9;7141:7;7137:23;7133:32;7130:2;;;7178:1;7175;7168:12;7130:2;7213:1;7230:53;7275:7;7266:6;7255:9;7251:22;7230:53;:::i;:::-;7220:63;;7192:97;7124:175;;;;:::o;7306:142::-;7397:45;7436:5;7397:45;:::i;:::-;7392:3;7385:58;7379:69;;:::o;7455:137::-;7554:32;7580:5;7554:32;:::i;:::-;7549:3;7542:45;7536:56;;:::o;7599:113::-;7682:24;7700:5;7682:24;:::i;:::-;7677:3;7670:37;7664:48;;:::o;7719:104::-;7796:21;7811:5;7796:21;:::i;:::-;7791:3;7784:34;7778:45;;:::o;7830:343::-;;7940:38;7972:5;7940:38;:::i;:::-;7990:70;8053:6;8048:3;7990:70;:::i;:::-;7983:77;;8065:52;8110:6;8105:3;8098:4;8091:5;8087:16;8065:52;:::i;:::-;8138:29;8160:6;8138:29;:::i;:::-;8133:3;8129:39;8122:46;;7920:253;;;;;:::o;8180:356::-;;8308:38;8340:5;8308:38;:::i;:::-;8358:88;8439:6;8434:3;8358:88;:::i;:::-;8351:95;;8451:52;8496:6;8491:3;8484:4;8477:5;8473:16;8451:52;:::i;:::-;8524:6;8519:3;8515:16;8508:23;;8288:248;;;;;:::o;8543:347::-;;8655:39;8688:5;8655:39;:::i;:::-;8706:71;8770:6;8765:3;8706:71;:::i;:::-;8699:78;;8782:52;8827:6;8822:3;8815:4;8808:5;8804:16;8782:52;:::i;:::-;8855:29;8877:6;8855:29;:::i;:::-;8850:3;8846:39;8839:46;;8635:255;;;;;:::o;8897:360::-;;9027:39;9060:5;9027:39;:::i;:::-;9078:89;9160:6;9155:3;9078:89;:::i;:::-;9071:96;;9172:52;9217:6;9212:3;9205:4;9198:5;9194:16;9172:52;:::i;:::-;9245:6;9240:3;9236:16;9229:23;;9007:250;;;;;:::o;9265:322::-;;9425:67;9489:2;9484:3;9425:67;:::i;:::-;9418:74;;9525:24;9521:1;9516:3;9512:11;9505:45;9578:2;9573:3;9569:12;9562:19;;9411:176;;;:::o;9596:371::-;;9756:67;9820:2;9815:3;9756:67;:::i;:::-;9749:74;;9856:34;9852:1;9847:3;9843:11;9836:55;9925:4;9920:2;9915:3;9911:12;9904:26;9958:2;9953:3;9949:12;9942:19;;9742:225;;;:::o;9976:380::-;;10136:67;10200:2;10195:3;10136:67;:::i;:::-;10129:74;;10236:34;10232:1;10227:3;10223:11;10216:55;10305:13;10300:2;10295:3;10291:12;10284:35;10347:2;10342:3;10338:12;10331:19;;10122:234;;;:::o;10365:320::-;;10525:67;10589:2;10584:3;10525:67;:::i;:::-;10518:74;;10625:22;10621:1;10616:3;10612:11;10605:43;10676:2;10671:3;10667:12;10660:19;;10511:174;;;:::o;10694:314::-;;10854:67;10918:2;10913:3;10854:67;:::i;:::-;10847:74;;10954:16;10950:1;10945:3;10941:11;10934:37;10999:2;10994:3;10990:12;10983:19;;10840:168;;;:::o;11017:387::-;;11177:67;11241:2;11236:3;11177:67;:::i;:::-;11170:74;;11277:34;11273:1;11268:3;11264:11;11257:55;11346:20;11341:2;11336:3;11332:12;11325:42;11395:2;11390:3;11386:12;11379:19;;11163:241;;;:::o;11413:375::-;;11573:67;11637:2;11632:3;11573:67;:::i;:::-;11566:74;;11673:34;11669:1;11664:3;11660:11;11653:55;11742:8;11737:2;11732:3;11728:12;11721:30;11779:2;11774:3;11770:12;11763:19;;11559:229;;;:::o;11797:328::-;;11957:67;12021:2;12016:3;11957:67;:::i;:::-;11950:74;;12057:30;12053:1;12048:3;12044:11;12037:51;12116:2;12111:3;12107:12;12100:19;;11943:182;;;:::o;12134:373::-;;12294:67;12358:2;12353:3;12294:67;:::i;:::-;12287:74;;12394:34;12390:1;12385:3;12381:11;12374:55;12463:6;12458:2;12453:3;12449:12;12442:28;12498:2;12493:3;12489:12;12482:19;;12280:227;;;:::o;12516:325::-;;12676:67;12740:2;12735:3;12676:67;:::i;:::-;12669:74;;12776:27;12772:1;12767:3;12763:11;12756:48;12832:2;12827:3;12823:12;12816:19;;12662:179;;;:::o;12850:375::-;;13010:67;13074:2;13069:3;13010:67;:::i;:::-;13003:74;;13110:34;13106:1;13101:3;13097:11;13090:55;13179:8;13174:2;13169:3;13165:12;13158:30;13216:2;13211:3;13207:12;13200:19;;12996:229;;;:::o;13234:381::-;;13394:67;13458:2;13453:3;13394:67;:::i;:::-;13387:74;;13494:34;13490:1;13485:3;13481:11;13474:55;13563:14;13558:2;13553:3;13549:12;13542:36;13606:2;13601:3;13597:12;13590:19;;13380:235;;;:::o;13624:316::-;;13784:67;13848:2;13843:3;13784:67;:::i;:::-;13777:74;;13884:18;13880:1;13875:3;13871:11;13864:39;13931:2;13926:3;13922:12;13915:19;;13770:170;;;:::o;13949:393::-;;14109:67;14173:2;14168:3;14109:67;:::i;:::-;14102:74;;14209:34;14205:1;14200:3;14196:11;14189:55;14278:26;14273:2;14268:3;14264:12;14257:48;14333:2;14328:3;14324:12;14317:19;;14095:247;;;:::o;14351:379::-;;14511:67;14575:2;14570:3;14511:67;:::i;:::-;14504:74;;14611:34;14607:1;14602:3;14598:11;14591:55;14680:12;14675:2;14670:3;14666:12;14659:34;14721:2;14716:3;14712:12;14705:19;;14497:233;;;:::o;14739:320::-;;14899:67;14963:2;14958:3;14899:67;:::i;:::-;14892:74;;14999:22;14995:1;14990:3;14986:11;14979:43;15050:2;15045:3;15041:12;15034:19;;14885:174;;;:::o;15068:371::-;;15228:67;15292:2;15287:3;15228:67;:::i;:::-;15221:74;;15328:34;15324:1;15319:3;15315:11;15308:55;15397:4;15392:2;15387:3;15383:12;15376:26;15430:2;15425:3;15421:12;15414:19;;15214:225;;;:::o;15448:307::-;;15608:66;15672:1;15667:3;15608:66;:::i;:::-;15601:73;;15707:10;15703:1;15698:3;15694:11;15687:31;15746:2;15741:3;15737:12;15730:19;;15594:161;;;:::o;15764:370::-;;15924:67;15988:2;15983:3;15924:67;:::i;:::-;15917:74;;16024:34;16020:1;16015:3;16011:11;16004:55;16093:3;16088:2;16083:3;16079:12;16072:25;16125:2;16120:3;16116:12;16109:19;;15910:224;;;:::o;16143:381::-;;16303:67;16367:2;16362:3;16303:67;:::i;:::-;16296:74;;16403:34;16399:1;16394:3;16390:11;16383:55;16472:14;16467:2;16462:3;16458:12;16451:36;16515:2;16510:3;16506:12;16499:19;;16289:235;;;:::o;16533:381::-;;16693:67;16757:2;16752:3;16693:67;:::i;:::-;16686:74;;16793:34;16789:1;16784:3;16780:11;16773:55;16862:14;16857:2;16852:3;16848:12;16841:36;16905:2;16900:3;16896:12;16889:19;;16679:235;;;:::o;16923:332::-;;17083:67;17147:2;17142:3;17083:67;:::i;:::-;17076:74;;17183:34;17179:1;17174:3;17170:11;17163:55;17246:2;17241:3;17237:12;17230:19;;17069:186;;;:::o;17264:378::-;;17424:67;17488:2;17483:3;17424:67;:::i;:::-;17417:74;;17524:34;17520:1;17515:3;17511:11;17504:55;17593:11;17588:2;17583:3;17579:12;17572:33;17633:2;17628:3;17624:12;17617:19;;17410:232;;;:::o;17651:384::-;;17811:67;17875:2;17870:3;17811:67;:::i;:::-;17804:74;;17911:34;17907:1;17902:3;17898:11;17891:55;17980:17;17975:2;17970:3;17966:12;17959:39;18026:2;18021:3;18017:12;18010:19;;17797:238;;;:::o;18044:370::-;;18204:67;18268:2;18263:3;18204:67;:::i;:::-;18197:74;;18304:34;18300:1;18295:3;18291:11;18284:55;18373:3;18368:2;18363:3;18359:12;18352:25;18405:2;18400:3;18396:12;18389:19;;18190:224;;;:::o;18423:296::-;;18600:83;18681:1;18676:3;18600:83;:::i;:::-;18593:90;;18711:1;18706:3;18702:11;18695:18;;18586:133;;;:::o;18728:316::-;;18888:67;18952:2;18947:3;18888:67;:::i;:::-;18881:74;;18988:18;18984:1;18979:3;18975:11;18968:39;19035:2;19030:3;19026:12;19019:19;;18874:170;;;:::o;19053:386::-;;19213:67;19277:2;19272:3;19213:67;:::i;:::-;19206:74;;19313:34;19309:1;19304:3;19300:11;19293:55;19382:19;19377:2;19372:3;19368:12;19361:41;19430:2;19425:3;19421:12;19414:19;;19199:240;;;:::o;19448:329::-;;19608:67;19672:2;19667:3;19608:67;:::i;:::-;19601:74;;19708:31;19704:1;19699:3;19695:11;19688:52;19768:2;19763:3;19759:12;19752:19;;19594:183;;;:::o;19785:113::-;19868:24;19886:5;19868:24;:::i;:::-;19863:3;19856:37;19850:48;;:::o;19905:271::-;;20058:93;20147:3;20138:6;20058:93;:::i;:::-;20051:100;;20168:3;20161:10;;20039:137;;;;:::o;20183:436::-;;20386:95;20477:3;20468:6;20386:95;:::i;:::-;20379:102;;20499:95;20590:3;20581:6;20499:95;:::i;:::-;20492:102;;20611:3;20604:10;;20367:252;;;;;:::o;20626:379::-;;20833:147;20976:3;20833:147;:::i;:::-;20826:154;;20997:3;20990:10;;20814:191;;;:::o;21012:222::-;;21139:2;21128:9;21124:18;21116:26;;21153:71;21221:1;21210:9;21206:17;21197:6;21153:71;:::i;:::-;21110:124;;;;:::o;21241:238::-;;21376:2;21365:9;21361:18;21353:26;;21390:79;21466:1;21455:9;21451:17;21442:6;21390:79;:::i;:::-;21347:132;;;;:::o;21486:672::-;;21731:3;21720:9;21716:19;21708:27;;21746:87;21830:1;21819:9;21815:17;21806:6;21746:87;:::i;:::-;21844:72;21912:2;21901:9;21897:18;21888:6;21844:72;:::i;:::-;21927;21995:2;21984:9;21980:18;21971:6;21927:72;:::i;:::-;22047:9;22041:4;22037:20;22032:2;22021:9;22017:18;22010:48;22072:76;22143:4;22134:6;22072:76;:::i;:::-;22064:84;;21702:456;;;;;;;:::o;22165:210::-;;22286:2;22275:9;22271:18;22263:26;;22300:65;22362:1;22351:9;22347:17;22338:6;22300:65;:::i;:::-;22257:118;;;;:::o;22382:310::-;;22529:2;22518:9;22514:18;22506:26;;22579:9;22573:4;22569:20;22565:1;22554:9;22550:17;22543:47;22604:78;22677:4;22668:6;22604:78;:::i;:::-;22596:86;;22500:192;;;;:::o;22699:416::-;;22899:2;22888:9;22884:18;22876:26;;22949:9;22943:4;22939:20;22935:1;22924:9;22920:17;22913:47;22974:131;23100:4;22974:131;:::i;:::-;22966:139;;22870:245;;;:::o;23122:416::-;;23322:2;23311:9;23307:18;23299:26;;23372:9;23366:4;23362:20;23358:1;23347:9;23343:17;23336:47;23397:131;23523:4;23397:131;:::i;:::-;23389:139;;23293:245;;;:::o;23545:416::-;;23745:2;23734:9;23730:18;23722:26;;23795:9;23789:4;23785:20;23781:1;23770:9;23766:17;23759:47;23820:131;23946:4;23820:131;:::i;:::-;23812:139;;23716:245;;;:::o;23968:416::-;;24168:2;24157:9;24153:18;24145:26;;24218:9;24212:4;24208:20;24204:1;24193:9;24189:17;24182:47;24243:131;24369:4;24243:131;:::i;:::-;24235:139;;24139:245;;;:::o;24391:416::-;;24591:2;24580:9;24576:18;24568:26;;24641:9;24635:4;24631:20;24627:1;24616:9;24612:17;24605:47;24666:131;24792:4;24666:131;:::i;:::-;24658:139;;24562:245;;;:::o;24814:416::-;;25014:2;25003:9;24999:18;24991:26;;25064:9;25058:4;25054:20;25050:1;25039:9;25035:17;25028:47;25089:131;25215:4;25089:131;:::i;:::-;25081:139;;24985:245;;;:::o;25237:416::-;;25437:2;25426:9;25422:18;25414:26;;25487:9;25481:4;25477:20;25473:1;25462:9;25458:17;25451:47;25512:131;25638:4;25512:131;:::i;:::-;25504:139;;25408:245;;;:::o;25660:416::-;;25860:2;25849:9;25845:18;25837:26;;25910:9;25904:4;25900:20;25896:1;25885:9;25881:17;25874:47;25935:131;26061:4;25935:131;:::i;:::-;25927:139;;25831:245;;;:::o;26083:416::-;;26283:2;26272:9;26268:18;26260:26;;26333:9;26327:4;26323:20;26319:1;26308:9;26304:17;26297:47;26358:131;26484:4;26358:131;:::i;:::-;26350:139;;26254:245;;;:::o;26506:416::-;;26706:2;26695:9;26691:18;26683:26;;26756:9;26750:4;26746:20;26742:1;26731:9;26727:17;26720:47;26781:131;26907:4;26781:131;:::i;:::-;26773:139;;26677:245;;;:::o;26929:416::-;;27129:2;27118:9;27114:18;27106:26;;27179:9;27173:4;27169:20;27165:1;27154:9;27150:17;27143:47;27204:131;27330:4;27204:131;:::i;:::-;27196:139;;27100:245;;;:::o;27352:416::-;;27552:2;27541:9;27537:18;27529:26;;27602:9;27596:4;27592:20;27588:1;27577:9;27573:17;27566:47;27627:131;27753:4;27627:131;:::i;:::-;27619:139;;27523:245;;;:::o;27775:416::-;;27975:2;27964:9;27960:18;27952:26;;28025:9;28019:4;28015:20;28011:1;28000:9;27996:17;27989:47;28050:131;28176:4;28050:131;:::i;:::-;28042:139;;27946:245;;;:::o;28198:416::-;;28398:2;28387:9;28383:18;28375:26;;28448:9;28442:4;28438:20;28434:1;28423:9;28419:17;28412:47;28473:131;28599:4;28473:131;:::i;:::-;28465:139;;28369:245;;;:::o;28621:416::-;;28821:2;28810:9;28806:18;28798:26;;28871:9;28865:4;28861:20;28857:1;28846:9;28842:17;28835:47;28896:131;29022:4;28896:131;:::i;:::-;28888:139;;28792:245;;;:::o;29044:416::-;;29244:2;29233:9;29229:18;29221:26;;29294:9;29288:4;29284:20;29280:1;29269:9;29265:17;29258:47;29319:131;29445:4;29319:131;:::i;:::-;29311:139;;29215:245;;;:::o;29467:416::-;;29667:2;29656:9;29652:18;29644:26;;29717:9;29711:4;29707:20;29703:1;29692:9;29688:17;29681:47;29742:131;29868:4;29742:131;:::i;:::-;29734:139;;29638:245;;;:::o;29890:416::-;;30090:2;30079:9;30075:18;30067:26;;30140:9;30134:4;30130:20;30126:1;30115:9;30111:17;30104:47;30165:131;30291:4;30165:131;:::i;:::-;30157:139;;30061:245;;;:::o;30313:416::-;;30513:2;30502:9;30498:18;30490:26;;30563:9;30557:4;30553:20;30549:1;30538:9;30534:17;30527:47;30588:131;30714:4;30588:131;:::i;:::-;30580:139;;30484:245;;;:::o;30736:416::-;;30936:2;30925:9;30921:18;30913:26;;30986:9;30980:4;30976:20;30972:1;30961:9;30957:17;30950:47;31011:131;31137:4;31011:131;:::i;:::-;31003:139;;30907:245;;;:::o;31159:416::-;;31359:2;31348:9;31344:18;31336:26;;31409:9;31403:4;31399:20;31395:1;31384:9;31380:17;31373:47;31434:131;31560:4;31434:131;:::i;:::-;31426:139;;31330:245;;;:::o;31582:416::-;;31782:2;31771:9;31767:18;31759:26;;31832:9;31826:4;31822:20;31818:1;31807:9;31803:17;31796:47;31857:131;31983:4;31857:131;:::i;:::-;31849:139;;31753:245;;;:::o;32005:416::-;;32205:2;32194:9;32190:18;32182:26;;32255:9;32249:4;32245:20;32241:1;32230:9;32226:17;32219:47;32280:131;32406:4;32280:131;:::i;:::-;32272:139;;32176:245;;;:::o;32428:416::-;;32628:2;32617:9;32613:18;32605:26;;32678:9;32672:4;32668:20;32664:1;32653:9;32649:17;32642:47;32703:131;32829:4;32703:131;:::i;:::-;32695:139;;32599:245;;;:::o;32851:416::-;;33051:2;33040:9;33036:18;33028:26;;33101:9;33095:4;33091:20;33087:1;33076:9;33072:17;33065:47;33126:131;33252:4;33126:131;:::i;:::-;33118:139;;33022:245;;;:::o;33274:416::-;;33474:2;33463:9;33459:18;33451:26;;33524:9;33518:4;33514:20;33510:1;33499:9;33495:17;33488:47;33549:131;33675:4;33549:131;:::i;:::-;33541:139;;33445:245;;;:::o;33697:416::-;;33897:2;33886:9;33882:18;33874:26;;33947:9;33941:4;33937:20;33933:1;33922:9;33918:17;33911:47;33972:131;34098:4;33972:131;:::i;:::-;33964:139;;33868:245;;;:::o;34120:416::-;;34320:2;34309:9;34305:18;34297:26;;34370:9;34364:4;34360:20;34356:1;34345:9;34341:17;34334:47;34395:131;34521:4;34395:131;:::i;:::-;34387:139;;34291:245;;;:::o;34543:222::-;;34670:2;34659:9;34655:18;34647:26;;34684:71;34752:1;34741:9;34737:17;34728:6;34684:71;:::i;:::-;34641:124;;;;:::o;34772:256::-;;34834:2;34828:9;34818:19;;34872:4;34864:6;34860:17;34971:6;34959:10;34956:22;34935:18;34923:10;34920:34;34917:62;34914:2;;;34992:1;34989;34982:12;34914:2;35012:10;35008:2;35001:22;34812:216;;;;:::o;35035:314::-;;35204:18;35196:6;35193:30;35190:2;;;35236:1;35233;35226:12;35190:2;35271:4;35263:6;35259:17;35251:25;;35334:4;35328;35324:15;35316:23;;35127:222;;;:::o;35356:304::-;;35515:18;35507:6;35504:30;35501:2;;;35547:1;35544;35537:12;35501:2;35582:4;35574:6;35570:17;35562:25;;35645:4;35639;35635:15;35627:23;;35438:222;;;:::o;35667:321::-;;35810:18;35802:6;35799:30;35796:2;;;35842:1;35839;35832:12;35796:2;35909:4;35905:9;35898:4;35890:6;35886:17;35882:33;35874:41;;35973:4;35967;35963:15;35955:23;;35733:255;;;:::o;35995:322::-;;36139:18;36131:6;36128:30;36125:2;;;36171:1;36168;36161:12;36125:2;36238:4;36234:9;36227:4;36219:6;36215:17;36211:33;36203:41;;36302:4;36296;36292:15;36284:23;;36062:255;;;:::o;36324:121::-;;36417:5;36411:12;36401:22;;36382:63;;;:::o;36452:122::-;;36546:5;36540:12;36530:22;;36511:63;;;:::o;36582:162::-;;36696:6;36691:3;36684:19;36733:4;36728:3;36724:14;36709:29;;36677:67;;;;:::o;36753:144::-;;36888:3;36873:18;;36866:31;;;;:::o;36906:163::-;;37021:6;37016:3;37009:19;37058:4;37053:3;37049:14;37034:29;;37002:67;;;;:::o;37078:145::-;;37214:3;37199:18;;37192:31;;;;:::o;37231:91::-;;37293:24;37311:5;37293:24;:::i;:::-;37282:35;;37276:46;;;:::o;37329:99::-;;37399:24;37417:5;37399:24;:::i;:::-;37388:35;;37382:46;;;:::o;37435:85::-;;37508:5;37501:13;37494:21;37483:32;;37477:43;;;:::o;37527:144::-;;37599:66;37592:5;37588:78;37577:89;;37571:100;;;:::o;37678:121::-;;37751:42;37744:5;37740:54;37729:65;;37723:76;;;:::o;37806:72::-;;37868:5;37857:16;;37851:27;;;:::o;37885:129::-;;37972:37;38003:5;37972:37;:::i;:::-;37959:50;;37953:61;;;:::o;38021:121::-;;38100:37;38131:5;38100:37;:::i;:::-;38087:50;;38081:61;;;:::o;38149:108::-;;38228:24;38246:5;38228:24;:::i;:::-;38215:37;;38209:48;;;:::o;38265:145::-;38346:6;38341:3;38336;38323:30;38402:1;38393:6;38388:3;38384:16;38377:27;38316:94;;;:::o;38419:268::-;38484:1;38491:101;38505:6;38502:1;38499:13;38491:101;;;38581:1;38576:3;38572:11;38566:18;38562:1;38557:3;38553:11;38546:39;38527:2;38524:1;38520:10;38515:15;;38491:101;;;38607:6;38604:1;38601:13;38598:2;;;38672:1;38663:6;38658:3;38654:16;38647:27;38598:2;38468:219;;;;:::o;38695:97::-;;38783:2;38779:7;38774:2;38767:5;38763:14;38759:28;38749:38;;38743:49;;;:::o;38800:117::-;38869:24;38887:5;38869:24;:::i;:::-;38862:5;38859:35;38849:2;;38908:1;38905;38898:12;38849:2;38843:74;:::o;38924:111::-;38990:21;39005:5;38990:21;:::i;:::-;38983:5;38980:32;38970:2;;39026:1;39023;39016:12;38970:2;38964:71;:::o;39042:115::-;39110:23;39127:5;39110:23;:::i;:::-;39103:5;39100:34;39090:2;;39148:1;39145;39138:12;39090:2;39084:73;:::o;39164:117::-;39233:24;39251:5;39233:24;:::i;:::-;39226:5;39223:35;39213:2;;39272:1;39269;39262:12;39213:2;39207:74;:::o
Swarm Source
ipfs://a9461bc8849de1c22b050dff15394a78d6983cc236781daa764444b1af60cd11
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.