Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
7,026 FLYZ
Holders
2,924
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 FLYZLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CryptoFlyz
Compiler Version
v0.7.0+commit.9e61f92b
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-15 */ /* SPDX-License-Identifier: GPL-3.0 @@@@@@@@@@@@@@@@@@@@@@ @@@@ @@@@@@@@@@@@@@@@@@@@ @@@@ @@@@ *** @@@@ /@@@@ @@@@ *** @@ /@@ @@@@@ *** @@ @@@@@@@@@@@@@@@@@@ *** @@ @@@@@@ @@@@@@**. ** @@ @@ @@@@#****** @@@@ @@@@@ @@@@@@@@@@@@@@ @@ @@ @@ @@@@/ @@@@@ @@ @@@@@@ @@@@@ @@@@@ @@@@@@@@@@@ @@@@@ @@@@@ @@@@ @@@@@ @@@@@@@@@@@@@@@@@@@@@@@@ /@@@@@@@@ @@@@@@@ @@@@@@@@@ @@@@@@@@@ @@ @@@@@@@@@ @@@@@@@@@ @@ @@ @@@@@ @@@@ @@@@@@@ @@@@@@@ */ // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/utils/Strings.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = bytes1(uint8(48 + temp % 10)); temp /= 10; } return string(buffer); } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/utils/EnumerableMap.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping (bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({ _key: key, _value: value })); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require(map._entries.length > index, "EnumerableMap: index out of bounds"); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key) return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage)))); } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/utils/EnumerableSet.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/utils/Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/token/ERC721/IERC721Receiver.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/introspection/IERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/introspection/ERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/token/ERC721/IERC721.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/token/ERC721/IERC721Enumerable.sol pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/token/ERC721/IERC721Metadata.sol pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/utils/Context.sol pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/payment/PaymentSplitter.sol pragma solidity >=0.6.0 <0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. */ contract PaymentSplitter is Context { using SafeMath for uint256; event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor () public payable {} /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive () external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance.add(_totalReleased); uint256 payment = totalReceived.mul(_shares[account]).div(_totalShares).sub(_released[account]); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] = _released[account].add(payment); _totalReleased = _totalReleased.add(payment); Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) internal { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares.add(shares_); emit PayeeAdded(account, shares_); } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/access/Ownable.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/token/ERC721/ERC721.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping (address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token"); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view virtual returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _tokenOwners.contains(tokenId); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); // internal owner _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(tokenId); emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (!to.isContract()) { return true; } bytes memory returndata = to.functionCall(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer"); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } function _approve(address to, uint256 tokenId) private { _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: contracts/CryptoFlyz.sol /* @@@@@@@@@@@@@@@@@@@@@@ @@@@ @@@@@@@@@@@@@@@@@@@@ @@@@ @@@@ *** @@@@ /@@@@ @@@@ *** @@ /@@ @@@@@ *** @@ @@@@@@@@@@@@@@@@@@ *** @@ @@@@@@ @@@@@@**. ** @@ @@ @@@@#****** @@@@ @@@@@ @@@@@@@@@@@@@@ @@ @@ @@ @@@@/ @@@@@ @@ @@@@@@ @@@@@ @@@@@ @@@@@@@@@@@ @@@@@ @@@@@ @@@@ @@@@@ @@@@@@@@@@@@@@@@@@@@@@@@ /@@@@@@@@ @@@@@@@ @@@@@@@@@ @@@@@@@@@ @@ @@@@@@@@@ @@@@@@@@@ @@ @@ @@@@@ @@@@ @@@@@@@ @@@@@@@ */ pragma solidity >=0.6.0 <0.8.0; interface nftInterface { function ownerOf(uint256 tokenId) external view returns (address owner); function balanceOf(address owner) external view virtual returns (uint256); function tokenOfOwnerByIndex(address owner, uint256 index) external view virtual returns (uint256); } pragma solidity >=0.6.0 <0.8.0; /** * @title CryptoFlyz contract * @dev Extends ERC721 Non-Fungible Token Standard basic implementation */ contract CryptoFlyz is ERC721, Ownable, PaymentSplitter { bool public mintIsActive = true; uint256 public tokenPrice = 0; uint256 public publicTokenPrice = 42000000000000000; uint256 public constant maxTokens = 7025; uint256 public constant maxMintsPerTx = 10; string private _contractURI; uint256 public tokenCount=1; bool public devMintLocked = false; bool private initialized = false; bool public publicMintLocked = true; //Parent NFT Contract //mainnet address address public nftAddress = 0x1CB1A5e65610AEFF2551A50f76a87a7d3fB649C6; //rinkeby address //address public nftAddress = 0x70BC4cCb9bC9eF1B7E9dc465a38EEbc5d73740FB; nftInterface nftContract = nftInterface(nftAddress); constructor() public ERC721("CryptoFlyz", "FLYZ") {} function initializePaymentSplitter (address[] memory payees, uint256[] memory shares_) external onlyOwner { require (!initialized, "Payment Split Already Initialized!"); require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } initialized=true; } //Set Base URI function setBaseURI(string memory _baseURI) external onlyOwner { _setBaseURI(_baseURI); } function flipMintState() public onlyOwner { mintIsActive = !mintIsActive; } function setContractURI(string memory contractURI_) external onlyOwner { _contractURI = contractURI_; } function contractURI() public view returns (string memory) { return _contractURI; } //Private sale minting (reserved for Toadz) function mintWithToad(uint256 nftId) external { require(mintIsActive, "CryptoFlyz must be active to mint"); require(tokenCount - 1 + 1 <= maxTokens, "Minting would exceed supply"); require(nftContract.ownerOf(nftId) == msg.sender, "Not the owner of this Toad"); if (nftId >= 1000000) { uint256 newID = SafeMath.div(nftId, 1000000); newID = SafeMath.add(newID, 6969); require(!_exists(newID), "This Toad has already been used."); _safeMint(msg.sender, newID); tokenCount++; } else { require(!_exists(nftId), "This Toad has already been used."); _safeMint(msg.sender, nftId); tokenCount++; } } function multiMintWithnft(uint256 [] memory nftIds) public { require(mintIsActive, "CryptoFlyz must be active to mint"); for (uint i=0; i< nftIds.length; i++) { require(nftContract.ownerOf(nftIds[i]) == msg.sender, "Not the owner of this Toad"); if (nftIds[i] >= 1000000) { uint256 newID = SafeMath.div(nftIds[i], 1000000); newID = SafeMath.add(newID, 6969); if(_exists(newID)) { continue; } else { _mint(msg.sender, newID); tokenCount++; } } else { if(_exists(nftIds[i])) { continue; } else { _mint(msg.sender, nftIds[i]); tokenCount++; } } } } function mintAllToadz() external { require(mintIsActive, "CryptoFlyz must be active to mint"); uint256 balance = nftContract.balanceOf(msg.sender); uint256 [] storage lot; for (uint i = 0; i < balance; i++) { lot.push(nftContract.tokenOfOwnerByIndex(msg.sender, i)); } multiMintWithnft(lot); } //Dev mint special tokens function mintSpecial(uint256 [] memory specialId) external onlyOwner { require (!devMintLocked, "Dev Mint Permanently Locked"); for (uint256 i = 0; i < specialId.length; i++) { require (specialId[i]!=0); _mint(msg.sender,specialId[i]); } } function lockDevMint() public onlyOwner { devMintLocked = true; } function unlockPublicMint() public onlyOwner { publicMintLocked = false; } function updatePublicPrice(uint256 newPrice) public onlyOwner { publicTokenPrice = newPrice; } function mintPublic(uint256 quantity) external payable { require(quantity <= maxMintsPerTx, "trying to mint too many at a time!"); require(tokenCount - 1 + quantity <= maxTokens, "minting this many would exceed supply"); require(msg.value >= publicTokenPrice * quantity, "not enough ether sent!"); require(msg.sender == tx.origin, "no contracts please!"); require(!publicMintLocked, "minting is not open to the public yet!"); uint256 i = 0; for (uint256 j = 1; j < maxTokens + 1; j++) { if (i == quantity) { break; } else { if (!_exists(j) && i < quantity) { _safeMint(msg.sender, j); i++; tokenCount++; } } } } function multiMintPublic(uint256 [] memory nftIds, uint256 quantity) external payable { require(quantity <= maxMintsPerTx, "trying to mint too many at a time!"); require(tokenCount - 1 + quantity <= maxTokens, "minting this many would exceed supply"); require(msg.value >= publicTokenPrice * quantity, "not enough ether sent!"); require(msg.sender == tx.origin, "no contracts please!"); require(!publicMintLocked, "minting is not open to the public yet!"); for (uint i=0; i< nftIds.length; i++) { if (nftIds[i] >= 1000000) { uint256 newID = SafeMath.div(nftIds[i], 1000000); newID = SafeMath.add(newID, 6969); if(_exists(newID)) { continue; } else { _safeMint(msg.sender, newID); tokenCount++; } } else { if(_exists(nftIds[i])) { continue; } else { _safeMint(msg.sender, nftIds[i]); tokenCount++; } } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devMintLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares_","type":"uint256[]"}],"name":"initializePaymentSplitter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDevMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMintsPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintAllToadz","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"specialId","type":"uint256[]"}],"name":"mintSpecial","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"mintWithToad","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"multiMintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"multiMintWithnft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","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":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractURI_","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"tokenCount","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":[],"name":"tokenPrice","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":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"updatePublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526010805460ff191660019081179091556000601155669536c70891000060125560145560158054761cb1a5e65610aeff2551a50f76a87a7d3fb649c60000006301000000600160b81b031962ffffff199092166201000017919091161790819055601680546001600160a01b03191663010000009092046001600160a01b03169190911790553480156200009757600080fd5b50604080518082018252600a81526921b93cb83a37a3363cbd60b11b6020808301919091528251808401909352600483526323262cad60e11b9083015290620000e76301ffc9a760e01b620001ac565b8151620000fc90600690602085019062000235565b5080516200011290600790602084019062000235565b50620001256380ac58cd60e01b620001ac565b62000137635b5e139f60e01b620001ac565b6200014963780e9d6360e01b620001ac565b50600090506200015862000231565b600a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620002d1565b6001600160e01b031980821614156200020c576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b3390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200027857805160ff1916838001178555620002a8565b82800160010185558215620002a8579182015b82811115620002a85782518255916020019190600101906200028b565b50620002b6929150620002ba565b5090565b5b80821115620002b65760008155600101620002bb565b61401380620002e16000396000f3fe6080604052600436106102b25760003560e01c80636e260c1e11610175578063b3115513116100dc578063dc30158b11610095578063e8a3d4851161006f578063e8a3d48514610e34578063e985e9c514610e49578063efd0cbf914610e84578063f2fde38b14610ea157610302565b8063dc30158b14610df5578063e33b7de314610e0a578063e831574214610e1f57610302565b8063b311551314610bfa578063b88d4fde14610c9d578063c1602fb514610d6e578063c87b56dd14610d83578063caf5601114610dad578063ce7c2ac214610dc257610302565b8063938e3d7b1161012e578063938e3d7b14610a9c57806395d89b4114610b4d5780639852595c14610b625780639a7c8e6914610b955780639f181b5e14610baa578063a22cb46514610bbf57610302565b80636e260c1e146108d057806370a0823114610a00578063715018a614610a335780637ff9b59614610a485780638b83209b14610a5d5780638da5cb5b14610a8757610302565b80632f745c591161021957806355f804b3116101d257806355f804b3146107a157806359c74f29146108525780635bf8633a1461086757806361e0d0621461087c5780636352211e146108915780636c0360eb146108bb57610302565b80632f745c59146106bc5780633a98ef39146106f557806342842e0e1461070a578063471a42941461074d5780634c10337c146107625780634f6ccce71461077757610302565b806318160ddd1161026b57806318160ddd1461049957806319165587146104c05780631e03934c146104f35780631f65d7431461051d57806323b872dd146105cb57806324ef19181461060e57610302565b806301ffc9a71461030757806306fd51331461034f57806306fdde0314610366578063081812fc146103f0578063095ea7b31461043657806316e0a2001461046f57610302565b36610302577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102e0610ed4565b604080516001600160a01b0390921682523460208301528051918290030190a1005b600080fd5b34801561031357600080fd5b5061033b6004803603602081101561032a57600080fd5b50356001600160e01b031916610ed8565b604080519115158252519081900360200190f35b34801561035b57600080fd5b50610364610efb565b005b34801561037257600080fd5b5061037b610f6c565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103b557818101518382015260200161039d565b50505050905090810190601f1680156103e25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103fc57600080fd5b5061041a6004803603602081101561041357600080fd5b5035611002565b604080516001600160a01b039092168252519081900360200190f35b34801561044257600080fd5b506103646004803603604081101561045957600080fd5b506001600160a01b038135169060200135611064565b34801561047b57600080fd5b506103646004803603602081101561049257600080fd5b503561113f565b3480156104a557600080fd5b506104ae6111a6565b60408051918252519081900360200190f35b3480156104cc57600080fd5b50610364600480360360208110156104e357600080fd5b50356001600160a01b03166111b7565b3480156104ff57600080fd5b506103646004803603602081101561051657600080fd5b503561134c565b34801561052957600080fd5b506103646004803603602081101561054057600080fd5b810190602081018135600160201b81111561055a57600080fd5b82018360208201111561056c57600080fd5b803590602001918460208302840111600160201b8311171561058d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506115c7945050505050565b3480156105d757600080fd5b50610364600480360360608110156105ee57600080fd5b506001600160a01b038135811691602081013590911690604001356116d7565b34801561061a57600080fd5b506103646004803603602081101561063157600080fd5b810190602081018135600160201b81111561064b57600080fd5b82018360208201111561065d57600080fd5b803590602001918460208302840111600160201b8311171561067e57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061172e945050505050565b3480156106c857600080fd5b506104ae600480360360408110156106df57600080fd5b506001600160a01b038135169060200135611925565b34801561070157600080fd5b506104ae611950565b34801561071657600080fd5b506103646004803603606081101561072d57600080fd5b506001600160a01b03813581169160208101359091169060400135611956565b34801561075957600080fd5b5061033b611971565b34801561076e57600080fd5b506104ae61197a565b34801561078357600080fd5b506104ae6004803603602081101561079a57600080fd5b5035611980565b3480156107ad57600080fd5b50610364600480360360208110156107c457600080fd5b810190602081018135600160201b8111156107de57600080fd5b8201836020820111156107f057600080fd5b803590602001918460018302840111600160201b8311171561081157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611996945050505050565b34801561085e57600080fd5b50610364611a01565b34801561087357600080fd5b5061041a611a77565b34801561088857600080fd5b50610364611a8d565b34801561089d57600080fd5b5061041a600480360360208110156108b457600080fd5b5035611c44565b3480156108c757600080fd5b5061037b611c6c565b3480156108dc57600080fd5b50610364600480360360408110156108f357600080fd5b810190602081018135600160201b81111561090d57600080fd5b82018360208201111561091f57600080fd5b803590602001918460208302840111600160201b8311171561094057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561098f57600080fd5b8201836020820111156109a157600080fd5b803590602001918460208302840111600160201b831117156109c257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611ccd945050505050565b348015610a0c57600080fd5b506104ae60048036036020811015610a2357600080fd5b50356001600160a01b0316611e64565b348015610a3f57600080fd5b50610364611ecc565b348015610a5457600080fd5b506104ae611f78565b348015610a6957600080fd5b5061041a60048036036020811015610a8057600080fd5b5035611f7e565b348015610a9357600080fd5b5061041a611fa8565b348015610aa857600080fd5b5061036460048036036020811015610abf57600080fd5b810190602081018135600160201b811115610ad957600080fd5b820183602082011115610aeb57600080fd5b803590602001918460018302840111600160201b83111715610b0c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611fb7945050505050565b348015610b5957600080fd5b5061037b61202c565b348015610b6e57600080fd5b506104ae60048036036020811015610b8557600080fd5b50356001600160a01b031661208d565b348015610ba157600080fd5b5061033b6120a8565b348015610bb657600080fd5b506104ae6120b1565b348015610bcb57600080fd5b5061036460048036036040811015610be257600080fd5b506001600160a01b03813516906020013515156120b7565b61036460048036036040811015610c1057600080fd5b810190602081018135600160201b811115610c2a57600080fd5b820183602082011115610c3c57600080fd5b803590602001918460208302840111600160201b83111715610c5d57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050913592506121bc915050565b348015610ca957600080fd5b5061036460048036036080811015610cc057600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610cfa57600080fd5b820183602082011115610d0c57600080fd5b803590602001918460018302840111600160201b83111715610d2d57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506123e8945050505050565b348015610d7a57600080fd5b50610364612446565b348015610d8f57600080fd5b5061037b60048036036020811015610da657600080fd5b50356124b6565b348015610db957600080fd5b5061033b612739565b348015610dce57600080fd5b506104ae60048036036020811015610de557600080fd5b50356001600160a01b0316612748565b348015610e0157600080fd5b506104ae612763565b348015610e1657600080fd5b506104ae612768565b348015610e2b57600080fd5b506104ae61276e565b348015610e4057600080fd5b5061037b612774565b348015610e5557600080fd5b5061033b60048036036040811015610e6c57600080fd5b506001600160a01b03813581169160200135166127d5565b61036460048036036020811015610e9a57600080fd5b5035612803565b348015610ead57600080fd5b5061036460048036036020811015610ec457600080fd5b50356001600160a01b03166129c9565b3390565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b610f03610ed4565b6001600160a01b0316610f14611fa8565b6001600160a01b031614610f5d576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b6015805460ff19166001179055565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ff85780601f10610fcd57610100808354040283529160200191610ff8565b820191906000526020600020905b815481529060010190602001808311610fdb57829003601f168201915b5050505050905090565b600061100d82612acc565b6110485760405162461bcd60e51b815260040180806020018281038252602c815260200180613e66602c913960400191505060405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061106f82611c44565b9050806001600160a01b0316836001600160a01b031614156110c25760405162461bcd60e51b8152600401808060200182810382526021815260200180613f616021913960400191505060405180910390fd5b806001600160a01b03166110d4610ed4565b6001600160a01b031614806110f557506110f5816110f0610ed4565b6127d5565b6111305760405162461bcd60e51b8152600401808060200182810382526038815260200180613d986038913960400191505060405180910390fd5b61113a8383612ad9565b505050565b611147610ed4565b6001600160a01b0316611158611fa8565b6001600160a01b0316146111a1576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b601255565b60006111b26002612b47565b905090565b6001600160a01b0381166000908152600d602052604090205461120b5760405162461bcd60e51b8152600401808060200182810382526026815260200180613c586026913960400191505060405180910390fd5b6000611222600c5447612b5290919063ffffffff16565b6001600160a01b0383166000908152600e6020908152604080832054600b54600d90935290832054939450919261126f929161126991611263908790612bac565b90612c05565b90612c6c565b9050806112ad5760405162461bcd60e51b815260040180806020018281038252602b815260200180613d4b602b913960400191505060405180910390fd5b6001600160a01b0383166000908152600e60205260409020546112d09082612b52565b6001600160a01b0384166000908152600e6020526040902055600c546112f69082612b52565b600c556113038382612cc9565b604080516001600160a01b03851681526020810183905281517fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056929181900390910190a1505050565b60105460ff1661138d5760405162461bcd60e51b8152600401808060200182810382526021815260200180613cfe6021913960400191505060405180910390fd5b601454611b7110156113e6576040805162461bcd60e51b815260206004820152601b60248201527f4d696e74696e6720776f756c642065786365656420737570706c790000000000604482015290519081900360640190fd5b601654604080516331a9108f60e11b815260048101849052905133926001600160a01b031691636352211e916024808301926020929190829003018186803b15801561143157600080fd5b505afa158015611445573d6000803e3d6000fd5b505050506040513d602081101561145b57600080fd5b50516001600160a01b0316146114b8576040805162461bcd60e51b815260206004820152601a60248201527f4e6f7420746865206f776e6572206f66207468697320546f6164000000000000604482015290519081900360640190fd5b620f424081106115555760006114d182620f4240612c05565b90506114df81611b39612b52565b90506114ea81612acc565b1561153c576040805162461bcd60e51b815260206004820181905260248201527f5468697320546f61642068617320616c7265616479206265656e20757365642e604482015290519081900360640190fd5b6115463382612dae565b506014805460010190556115c4565b61155e81612acc565b156115b0576040805162461bcd60e51b815260206004820181905260248201527f5468697320546f61642068617320616c7265616479206265656e20757365642e604482015290519081900360640190fd5b6115ba3382612dae565b6014805460010190555b50565b6115cf610ed4565b6001600160a01b03166115e0611fa8565b6001600160a01b031614611629576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b60155460ff1615611681576040805162461bcd60e51b815260206004820152601b60248201527f446576204d696e74205065726d616e656e746c79204c6f636b65640000000000604482015290519081900360640190fd5b60005b81518110156116d35781818151811061169957fe5b6020026020010151600014156116ae57600080fd5b6116cb338383815181106116be57fe5b6020026020010151612dc8565b600101611684565b5050565b6116e86116e2610ed4565b82612ef6565b6117235760405162461bcd60e51b8152600401808060200182810382526031815260200180613f826031913960400191505060405180910390fd5b61113a838383612f9a565b60105460ff1661176f5760405162461bcd60e51b8152600401808060200182810382526021815260200180613cfe6021913960400191505060405180910390fd5b60005b81518110156116d357601654825133916001600160a01b031690636352211e9085908590811061179e57fe5b60200260200101516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156117da57600080fd5b505afa1580156117ee573d6000803e3d6000fd5b505050506040513d602081101561180457600080fd5b50516001600160a01b031614611861576040805162461bcd60e51b815260206004820152601a60248201527f4e6f7420746865206f776e6572206f66207468697320546f6164000000000000604482015290519081900360640190fd5b620f424082828151811061187157fe5b6020026020010151106118dd5760006118a083838151811061188f57fe5b6020026020010151620f4240612c05565b90506118ae81611b39612b52565b90506118b981612acc565b156118c4575061191d565b6118ce3382612dc8565b6014805460010190555061191d565b6118f98282815181106118ec57fe5b6020026020010151612acc565b156119035761191d565b611913338383815181106116be57fe5b6014805460010190555b600101611772565b6001600160a01b038216600090815260016020526040812061194790836130e6565b90505b92915050565b600b5490565b61113a838383604051806020016040528060008152506123e8565b60105460ff1681565b60125481565b60008061198e6002846130f2565b509392505050565b61199e610ed4565b6001600160a01b03166119af611fa8565b6001600160a01b0316146119f8576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b6115c48161310e565b611a09610ed4565b6001600160a01b0316611a1a611fa8565b6001600160a01b031614611a63576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b6010805460ff19811660ff90911615179055565b601554630100000090046001600160a01b031681565b60105460ff16611ace5760405162461bcd60e51b8152600401808060200182810382526021815260200180613cfe6021913960400191505060405180910390fd5b601654604080516370a0823160e01b815233600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611b1957600080fd5b505afa158015611b2d573d6000803e3d6000fd5b505050506040513d6020811015611b4357600080fd5b505190506000805b82811015611beb5760165460408051632f745c5960e01b815233600482015260248101849052905184926001600160a01b031691632f745c59916044808301926020929190829003018186803b158015611ba457600080fd5b505afa158015611bb8573d6000803e3d6000fd5b505050506040513d6020811015611bce57600080fd5b505181546001818101845560009384526020909320015501611b4b565b506116d381805480602002602001604051908101604052809291908181526020018280548015611c3a57602002820191906000526020600020905b815481526020019060010190808311611c26575b505050505061172e565b600061194a82604051806060016040528060298152602001613dfa6029913960029190613121565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ff85780601f10610fcd57610100808354040283529160200191610ff8565b611cd5610ed4565b6001600160a01b0316611ce6611fa8565b6001600160a01b031614611d2f576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b601554610100900460ff1615611d765760405162461bcd60e51b8152600401808060200182810382526022815260200180613ca26022913960400191505060405180910390fd5b8051825114611db65760405162461bcd60e51b8152600401808060200182810382526032815260200180613f2f6032913960400191505060405180910390fd5b6000825111611e0c576040805162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015290519081900360640190fd5b60005b8251811015611e5057611e48838281518110611e2757fe5b6020026020010151838381518110611e3b57fe5b6020026020010151613138565b600101611e0f565b50506015805461ff00191661010017905550565b60006001600160a01b038216611eab5760405162461bcd60e51b815260040180806020018281038252602a815260200180613dd0602a913960400191505060405180910390fd5b6001600160a01b038216600090815260016020526040902061194a90612b47565b611ed4610ed4565b6001600160a01b0316611ee5611fa8565b6001600160a01b031614611f2e576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b60115481565b6000600f8281548110611f8d57fe5b6000918252602090912001546001600160a01b031692915050565b600a546001600160a01b031690565b611fbf610ed4565b6001600160a01b0316611fd0611fa8565b6001600160a01b031614612019576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b80516116d3906013906020840190613af8565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ff85780601f10610fcd57610100808354040283529160200191610ff8565b6001600160a01b03166000908152600e602052604090205490565b60155460ff1681565b60145481565b6120bf610ed4565b6001600160a01b0316826001600160a01b03161415612125576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060056000612132610ed4565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155612176610ed4565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b600a8111156121fc5760405162461bcd60e51b8152600401808060200182810382526022815260200180613d766022913960400191505060405180910390fd5b611b71816001601454030111156122445760405162461bcd60e51b8152600401808060200182810382526025815260200180613eb26025913960400191505060405180910390fd5b8060125402341015612296576040805162461bcd60e51b81526020600482015260166024820152756e6f7420656e6f7567682065746865722073656e742160501b604482015290519081900360640190fd5b3332146122e1576040805162461bcd60e51b81526020600482015260146024820152736e6f20636f6e74726163747320706c656173652160601b604482015290519081900360640190fd5b60155462010000900460ff16156123295760405162461bcd60e51b8152600401808060200182810382526026815260200180613c326026913960400191505060405180910390fd5b60005b825181101561113a57620f424083828151811061234557fe5b6020026020010151106123a057600061236384838151811061188f57fe5b905061237181611b39612b52565b905061237c81612acc565b1561238757506123e0565b6123913382612dae565b601480546001019055506123e0565b6123af8382815181106118ec57fe5b156123b9576123e0565b6123d6338483815181106123c957fe5b6020026020010151612dae565b6014805460010190555b60010161232c565b6123f96123f3610ed4565b83612ef6565b6124345760405162461bcd60e51b8152600401808060200182810382526031815260200180613f826031913960400191505060405180910390fd5b612440848484846132d9565b50505050565b61244e610ed4565b6001600160a01b031661245f611fa8565b6001600160a01b0316146124a8576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b6015805462ff000019169055565b60606124c182612acc565b6124fc5760405162461bcd60e51b815260040180806020018281038252602f815260200180613f00602f913960400191505060405180910390fd5b60008281526008602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156125915780601f1061256657610100808354040283529160200191612591565b820191906000526020600020905b81548152906001019060200180831161257457829003601f168201915b5050505050905060606125a2611c6c565b90508051600014156125b657509050610ef6565b8151156126775780826040516020018083805190602001908083835b602083106125f15780518252601f1990920191602091820191016125d2565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106126395780518252601f19909201916020918201910161261a565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050610ef6565b806126818561332b565b6040516020018083805190602001908083835b602083106126b35780518252601f199092019160209182019101612694565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106126fb5780518252601f1990920191602091820191016126dc565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050919050565b60155462010000900460ff1681565b6001600160a01b03166000908152600d602052604090205490565b600a81565b600c5490565b611b7181565b60138054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ff85780601f10610fcd57610100808354040283529160200191610ff8565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600a8111156128435760405162461bcd60e51b8152600401808060200182810382526022815260200180613d766022913960400191505060405180910390fd5b611b718160016014540301111561288b5760405162461bcd60e51b8152600401808060200182810382526025815260200180613eb26025913960400191505060405180910390fd5b80601254023410156128dd576040805162461bcd60e51b81526020600482015260166024820152756e6f7420656e6f7567682065746865722073656e742160501b604482015290519081900360640190fd5b333214612928576040805162461bcd60e51b81526020600482015260146024820152736e6f20636f6e74726163747320706c656173652160601b604482015290519081900360640190fd5b60155462010000900460ff16156129705760405162461bcd60e51b8152600401808060200182810382526026815260200180613c326026913960400191505060405180910390fd5b600060015b611b7281101561113a578282141561298c5761113a565b61299581612acc565b1580156129a157508282105b156129c1576129b03382612dae565b601480546001908101909155909101905b600101612975565b6129d1610ed4565b6001600160a01b03166129e2611fa8565b6001600160a01b031614612a2b576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b6001600160a01b038116612a705760405162461bcd60e51b8152600401808060200182810382526026815260200180613c0c6026913960400191505060405180910390fd5b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600061194a600283613406565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612b0e82611c44565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061194a82613412565b600082820183811015611947576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082612bbb5750600061194a565b82820282848281612bc857fe5b04146119475760405162461bcd60e51b8152600401808060200182810382526021815260200180613e456021913960400191505060405180910390fd5b6000808211612c5b576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612c6457fe5b049392505050565b600082821115612cc3576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b80471015612d1e576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d8060008114612d69576040519150601f19603f3d011682016040523d82523d6000602084013e612d6e565b606091505b505090508061113a5760405162461bcd60e51b815260040180806020018281038252603a815260200180613cc4603a913960400191505060405180910390fd5b6116d3828260405180602001604052806000815250613416565b6001600160a01b038216612e23576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b612e2c81612acc565b15612e7e576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b612e8a6000838361113a565b6001600160a01b0382166000908152600160205260409020612eac9082613468565b50612eb960028284613474565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612f0182612acc565b612f3c5760405162461bcd60e51b815260040180806020018281038252602c815260200180613d1f602c913960400191505060405180910390fd5b6000612f4783611c44565b9050806001600160a01b0316846001600160a01b03161480612f825750836001600160a01b0316612f7784611002565b6001600160a01b0316145b80612f925750612f9281856127d5565b949350505050565b826001600160a01b0316612fad82611c44565b6001600160a01b031614612ff25760405162461bcd60e51b8152600401808060200182810382526029815260200180613ed76029913960400191505060405180910390fd5b6001600160a01b0382166130375760405162461bcd60e51b8152600401808060200182810382526024815260200180613c7e6024913960400191505060405180910390fd5b61304283838361113a565b61304d600082612ad9565b6001600160a01b038316600090815260016020526040902061306f908261348a565b506001600160a01b03821660009081526001602052604090206130929082613468565b5061309f60028284613474565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006119478383613496565b600080808061310186866134fa565b9097909650945050505050565b80516116d3906009906020840190613af8565b600061312e848484613575565b90505b9392505050565b6001600160a01b03821661317d5760405162461bcd60e51b815260040180806020018281038252602c815260200180613be0602c913960400191505060405180910390fd5b600081116131d2576040805162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015290519081900360640190fd5b6001600160a01b0382166000908152600d6020526040902054156132275760405162461bcd60e51b815260040180806020018281038252602b815260200180613fb3602b913960400191505060405180910390fd5b600f8054600181019091557f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b0319166001600160a01b0384169081179091556000908152600d60205260409020819055600b5461328e9082612b52565b600b55604080516001600160a01b03841681526020810183905281517f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac929181900390910190a15050565b6132e4848484612f9a565b6132f08484848461363f565b6124405760405162461bcd60e51b8152600401808060200182810382526032815260200180613bae6032913960400191505060405180910390fd5b60608161335057506040805180820190915260018152600360fc1b6020820152610ef6565b8160005b811561336857600101600a82049150613354565b60608167ffffffffffffffff8111801561338157600080fd5b506040519080825280601f01601f1916602001820160405280156133ac576020820181803683370190505b50859350905060001982015b83156133fd57600a840660300160f81b828280600190039350815181106133db57fe5b60200101906001600160f81b031916908160001a905350600a840493506133b8565b50949350505050565b600061194783836137a7565b5490565b6134208383612dc8565b61342d600084848461363f565b61113a5760405162461bcd60e51b8152600401808060200182810382526032815260200180613bae6032913960400191505060405180910390fd5b600061194783836137bf565b600061312e84846001600160a01b038516613809565b600061194783836138a0565b815460009082106134d85760405162461bcd60e51b8152600401808060200182810382526022815260200180613b8c6022913960400191505060405180910390fd5b8260000182815481106134e757fe5b9060005260206000200154905092915050565b81546000908190831061353e5760405162461bcd60e51b8152600401808060200182810382526022815260200180613e236022913960400191505060405180910390fd5b600084600001848154811061354f57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816136105760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156135d55781810151838201526020016135bd565b50505050905090810190601f1680156136025780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061362357fe5b9060005260206000209060020201600101549150509392505050565b6000613653846001600160a01b0316613966565b61365f57506001612f92565b606061376d630a85bd0160e11b613674610ed4565b88878760405160240180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156136db5781810151838201526020016136c3565b50505050905090810190601f1680156137085780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001613bae603291396001600160a01b038816919061396c565b9050600081806020019051602081101561378657600080fd5b50516001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b60006137cb83836137a7565b6138015750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561194a565b50600061194a565b60008281526001840160205260408120548061386e575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055613131565b8285600001600183038154811061388157fe5b9060005260206000209060020201600101819055506000915050613131565b6000818152600183016020526040812054801561395c57835460001980830191908101906000908790839081106138d357fe5b90600052602060002001549050808760000184815481106138f057fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061392057fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061194a565b600091505061194a565b3b151590565b606061312e84846000858561398085613966565b6139d1576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613a105780518252601f1990920191602091820191016139f1565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613a72576040519150601f19603f3d011682016040523d82523d6000602084013e613a77565b606091505b5091509150613a87828286613a92565b979650505050505050565b60608315613aa1575081613131565b825115613ab15782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156135d55781810151838201526020016135bd565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b3957805160ff1916838001178555613b66565b82800160010185558215613b66579182015b82811115613b66578251825591602001919060010190613b4b565b50613b72929150613b76565b5090565b5b80821115613b725760008155600101613b7756fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465725061796d656e7453706c69747465723a206163636f756e7420697320746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573736d696e74696e67206973206e6f74206f70656e20746f20746865207075626c696320796574215061796d656e7453706c69747465723a206163636f756e7420686173206e6f207368617265734552433732313a207472616e7366657220746f20746865207a65726f20616464726573735061796d656e742053706c697420416c726561647920496e697469616c697a656421416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d6179206861766520726576657274656443727970746f466c797a206d7573742062652061637469766520746f206d696e744552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e5061796d656e7453706c69747465723a206163636f756e74206973206e6f7420647565207061796d656e74747279696e6720746f206d696e7420746f6f206d616e7920617420612074696d65214552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e6473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726d696e74696e672074686973206d616e7920776f756c642065786365656420737570706c794552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e5061796d656e7453706c69747465723a2070617965657320616e6420736861726573206c656e677468206d69736d617463684552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665645061796d656e7453706c69747465723a206163636f756e7420616c72656164792068617320736861726573a2646970667358221220c83f05d10f4d67e960921b7beff1b288fe5c1c459ddb7efbdeaa2f08dbc03c4d64736f6c63430007000033
Deployed Bytecode
0x6080604052600436106102b25760003560e01c80636e260c1e11610175578063b3115513116100dc578063dc30158b11610095578063e8a3d4851161006f578063e8a3d48514610e34578063e985e9c514610e49578063efd0cbf914610e84578063f2fde38b14610ea157610302565b8063dc30158b14610df5578063e33b7de314610e0a578063e831574214610e1f57610302565b8063b311551314610bfa578063b88d4fde14610c9d578063c1602fb514610d6e578063c87b56dd14610d83578063caf5601114610dad578063ce7c2ac214610dc257610302565b8063938e3d7b1161012e578063938e3d7b14610a9c57806395d89b4114610b4d5780639852595c14610b625780639a7c8e6914610b955780639f181b5e14610baa578063a22cb46514610bbf57610302565b80636e260c1e146108d057806370a0823114610a00578063715018a614610a335780637ff9b59614610a485780638b83209b14610a5d5780638da5cb5b14610a8757610302565b80632f745c591161021957806355f804b3116101d257806355f804b3146107a157806359c74f29146108525780635bf8633a1461086757806361e0d0621461087c5780636352211e146108915780636c0360eb146108bb57610302565b80632f745c59146106bc5780633a98ef39146106f557806342842e0e1461070a578063471a42941461074d5780634c10337c146107625780634f6ccce71461077757610302565b806318160ddd1161026b57806318160ddd1461049957806319165587146104c05780631e03934c146104f35780631f65d7431461051d57806323b872dd146105cb57806324ef19181461060e57610302565b806301ffc9a71461030757806306fd51331461034f57806306fdde0314610366578063081812fc146103f0578063095ea7b31461043657806316e0a2001461046f57610302565b36610302577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102e0610ed4565b604080516001600160a01b0390921682523460208301528051918290030190a1005b600080fd5b34801561031357600080fd5b5061033b6004803603602081101561032a57600080fd5b50356001600160e01b031916610ed8565b604080519115158252519081900360200190f35b34801561035b57600080fd5b50610364610efb565b005b34801561037257600080fd5b5061037b610f6c565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103b557818101518382015260200161039d565b50505050905090810190601f1680156103e25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103fc57600080fd5b5061041a6004803603602081101561041357600080fd5b5035611002565b604080516001600160a01b039092168252519081900360200190f35b34801561044257600080fd5b506103646004803603604081101561045957600080fd5b506001600160a01b038135169060200135611064565b34801561047b57600080fd5b506103646004803603602081101561049257600080fd5b503561113f565b3480156104a557600080fd5b506104ae6111a6565b60408051918252519081900360200190f35b3480156104cc57600080fd5b50610364600480360360208110156104e357600080fd5b50356001600160a01b03166111b7565b3480156104ff57600080fd5b506103646004803603602081101561051657600080fd5b503561134c565b34801561052957600080fd5b506103646004803603602081101561054057600080fd5b810190602081018135600160201b81111561055a57600080fd5b82018360208201111561056c57600080fd5b803590602001918460208302840111600160201b8311171561058d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506115c7945050505050565b3480156105d757600080fd5b50610364600480360360608110156105ee57600080fd5b506001600160a01b038135811691602081013590911690604001356116d7565b34801561061a57600080fd5b506103646004803603602081101561063157600080fd5b810190602081018135600160201b81111561064b57600080fd5b82018360208201111561065d57600080fd5b803590602001918460208302840111600160201b8311171561067e57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061172e945050505050565b3480156106c857600080fd5b506104ae600480360360408110156106df57600080fd5b506001600160a01b038135169060200135611925565b34801561070157600080fd5b506104ae611950565b34801561071657600080fd5b506103646004803603606081101561072d57600080fd5b506001600160a01b03813581169160208101359091169060400135611956565b34801561075957600080fd5b5061033b611971565b34801561076e57600080fd5b506104ae61197a565b34801561078357600080fd5b506104ae6004803603602081101561079a57600080fd5b5035611980565b3480156107ad57600080fd5b50610364600480360360208110156107c457600080fd5b810190602081018135600160201b8111156107de57600080fd5b8201836020820111156107f057600080fd5b803590602001918460018302840111600160201b8311171561081157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611996945050505050565b34801561085e57600080fd5b50610364611a01565b34801561087357600080fd5b5061041a611a77565b34801561088857600080fd5b50610364611a8d565b34801561089d57600080fd5b5061041a600480360360208110156108b457600080fd5b5035611c44565b3480156108c757600080fd5b5061037b611c6c565b3480156108dc57600080fd5b50610364600480360360408110156108f357600080fd5b810190602081018135600160201b81111561090d57600080fd5b82018360208201111561091f57600080fd5b803590602001918460208302840111600160201b8311171561094057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561098f57600080fd5b8201836020820111156109a157600080fd5b803590602001918460208302840111600160201b831117156109c257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611ccd945050505050565b348015610a0c57600080fd5b506104ae60048036036020811015610a2357600080fd5b50356001600160a01b0316611e64565b348015610a3f57600080fd5b50610364611ecc565b348015610a5457600080fd5b506104ae611f78565b348015610a6957600080fd5b5061041a60048036036020811015610a8057600080fd5b5035611f7e565b348015610a9357600080fd5b5061041a611fa8565b348015610aa857600080fd5b5061036460048036036020811015610abf57600080fd5b810190602081018135600160201b811115610ad957600080fd5b820183602082011115610aeb57600080fd5b803590602001918460018302840111600160201b83111715610b0c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611fb7945050505050565b348015610b5957600080fd5b5061037b61202c565b348015610b6e57600080fd5b506104ae60048036036020811015610b8557600080fd5b50356001600160a01b031661208d565b348015610ba157600080fd5b5061033b6120a8565b348015610bb657600080fd5b506104ae6120b1565b348015610bcb57600080fd5b5061036460048036036040811015610be257600080fd5b506001600160a01b03813516906020013515156120b7565b61036460048036036040811015610c1057600080fd5b810190602081018135600160201b811115610c2a57600080fd5b820183602082011115610c3c57600080fd5b803590602001918460208302840111600160201b83111715610c5d57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050913592506121bc915050565b348015610ca957600080fd5b5061036460048036036080811015610cc057600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610cfa57600080fd5b820183602082011115610d0c57600080fd5b803590602001918460018302840111600160201b83111715610d2d57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506123e8945050505050565b348015610d7a57600080fd5b50610364612446565b348015610d8f57600080fd5b5061037b60048036036020811015610da657600080fd5b50356124b6565b348015610db957600080fd5b5061033b612739565b348015610dce57600080fd5b506104ae60048036036020811015610de557600080fd5b50356001600160a01b0316612748565b348015610e0157600080fd5b506104ae612763565b348015610e1657600080fd5b506104ae612768565b348015610e2b57600080fd5b506104ae61276e565b348015610e4057600080fd5b5061037b612774565b348015610e5557600080fd5b5061033b60048036036040811015610e6c57600080fd5b506001600160a01b03813581169160200135166127d5565b61036460048036036020811015610e9a57600080fd5b5035612803565b348015610ead57600080fd5b5061036460048036036020811015610ec457600080fd5b50356001600160a01b03166129c9565b3390565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b610f03610ed4565b6001600160a01b0316610f14611fa8565b6001600160a01b031614610f5d576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b6015805460ff19166001179055565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ff85780601f10610fcd57610100808354040283529160200191610ff8565b820191906000526020600020905b815481529060010190602001808311610fdb57829003601f168201915b5050505050905090565b600061100d82612acc565b6110485760405162461bcd60e51b815260040180806020018281038252602c815260200180613e66602c913960400191505060405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061106f82611c44565b9050806001600160a01b0316836001600160a01b031614156110c25760405162461bcd60e51b8152600401808060200182810382526021815260200180613f616021913960400191505060405180910390fd5b806001600160a01b03166110d4610ed4565b6001600160a01b031614806110f557506110f5816110f0610ed4565b6127d5565b6111305760405162461bcd60e51b8152600401808060200182810382526038815260200180613d986038913960400191505060405180910390fd5b61113a8383612ad9565b505050565b611147610ed4565b6001600160a01b0316611158611fa8565b6001600160a01b0316146111a1576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b601255565b60006111b26002612b47565b905090565b6001600160a01b0381166000908152600d602052604090205461120b5760405162461bcd60e51b8152600401808060200182810382526026815260200180613c586026913960400191505060405180910390fd5b6000611222600c5447612b5290919063ffffffff16565b6001600160a01b0383166000908152600e6020908152604080832054600b54600d90935290832054939450919261126f929161126991611263908790612bac565b90612c05565b90612c6c565b9050806112ad5760405162461bcd60e51b815260040180806020018281038252602b815260200180613d4b602b913960400191505060405180910390fd5b6001600160a01b0383166000908152600e60205260409020546112d09082612b52565b6001600160a01b0384166000908152600e6020526040902055600c546112f69082612b52565b600c556113038382612cc9565b604080516001600160a01b03851681526020810183905281517fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056929181900390910190a1505050565b60105460ff1661138d5760405162461bcd60e51b8152600401808060200182810382526021815260200180613cfe6021913960400191505060405180910390fd5b601454611b7110156113e6576040805162461bcd60e51b815260206004820152601b60248201527f4d696e74696e6720776f756c642065786365656420737570706c790000000000604482015290519081900360640190fd5b601654604080516331a9108f60e11b815260048101849052905133926001600160a01b031691636352211e916024808301926020929190829003018186803b15801561143157600080fd5b505afa158015611445573d6000803e3d6000fd5b505050506040513d602081101561145b57600080fd5b50516001600160a01b0316146114b8576040805162461bcd60e51b815260206004820152601a60248201527f4e6f7420746865206f776e6572206f66207468697320546f6164000000000000604482015290519081900360640190fd5b620f424081106115555760006114d182620f4240612c05565b90506114df81611b39612b52565b90506114ea81612acc565b1561153c576040805162461bcd60e51b815260206004820181905260248201527f5468697320546f61642068617320616c7265616479206265656e20757365642e604482015290519081900360640190fd5b6115463382612dae565b506014805460010190556115c4565b61155e81612acc565b156115b0576040805162461bcd60e51b815260206004820181905260248201527f5468697320546f61642068617320616c7265616479206265656e20757365642e604482015290519081900360640190fd5b6115ba3382612dae565b6014805460010190555b50565b6115cf610ed4565b6001600160a01b03166115e0611fa8565b6001600160a01b031614611629576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b60155460ff1615611681576040805162461bcd60e51b815260206004820152601b60248201527f446576204d696e74205065726d616e656e746c79204c6f636b65640000000000604482015290519081900360640190fd5b60005b81518110156116d35781818151811061169957fe5b6020026020010151600014156116ae57600080fd5b6116cb338383815181106116be57fe5b6020026020010151612dc8565b600101611684565b5050565b6116e86116e2610ed4565b82612ef6565b6117235760405162461bcd60e51b8152600401808060200182810382526031815260200180613f826031913960400191505060405180910390fd5b61113a838383612f9a565b60105460ff1661176f5760405162461bcd60e51b8152600401808060200182810382526021815260200180613cfe6021913960400191505060405180910390fd5b60005b81518110156116d357601654825133916001600160a01b031690636352211e9085908590811061179e57fe5b60200260200101516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156117da57600080fd5b505afa1580156117ee573d6000803e3d6000fd5b505050506040513d602081101561180457600080fd5b50516001600160a01b031614611861576040805162461bcd60e51b815260206004820152601a60248201527f4e6f7420746865206f776e6572206f66207468697320546f6164000000000000604482015290519081900360640190fd5b620f424082828151811061187157fe5b6020026020010151106118dd5760006118a083838151811061188f57fe5b6020026020010151620f4240612c05565b90506118ae81611b39612b52565b90506118b981612acc565b156118c4575061191d565b6118ce3382612dc8565b6014805460010190555061191d565b6118f98282815181106118ec57fe5b6020026020010151612acc565b156119035761191d565b611913338383815181106116be57fe5b6014805460010190555b600101611772565b6001600160a01b038216600090815260016020526040812061194790836130e6565b90505b92915050565b600b5490565b61113a838383604051806020016040528060008152506123e8565b60105460ff1681565b60125481565b60008061198e6002846130f2565b509392505050565b61199e610ed4565b6001600160a01b03166119af611fa8565b6001600160a01b0316146119f8576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b6115c48161310e565b611a09610ed4565b6001600160a01b0316611a1a611fa8565b6001600160a01b031614611a63576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b6010805460ff19811660ff90911615179055565b601554630100000090046001600160a01b031681565b60105460ff16611ace5760405162461bcd60e51b8152600401808060200182810382526021815260200180613cfe6021913960400191505060405180910390fd5b601654604080516370a0823160e01b815233600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611b1957600080fd5b505afa158015611b2d573d6000803e3d6000fd5b505050506040513d6020811015611b4357600080fd5b505190506000805b82811015611beb5760165460408051632f745c5960e01b815233600482015260248101849052905184926001600160a01b031691632f745c59916044808301926020929190829003018186803b158015611ba457600080fd5b505afa158015611bb8573d6000803e3d6000fd5b505050506040513d6020811015611bce57600080fd5b505181546001818101845560009384526020909320015501611b4b565b506116d381805480602002602001604051908101604052809291908181526020018280548015611c3a57602002820191906000526020600020905b815481526020019060010190808311611c26575b505050505061172e565b600061194a82604051806060016040528060298152602001613dfa6029913960029190613121565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ff85780601f10610fcd57610100808354040283529160200191610ff8565b611cd5610ed4565b6001600160a01b0316611ce6611fa8565b6001600160a01b031614611d2f576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b601554610100900460ff1615611d765760405162461bcd60e51b8152600401808060200182810382526022815260200180613ca26022913960400191505060405180910390fd5b8051825114611db65760405162461bcd60e51b8152600401808060200182810382526032815260200180613f2f6032913960400191505060405180910390fd5b6000825111611e0c576040805162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015290519081900360640190fd5b60005b8251811015611e5057611e48838281518110611e2757fe5b6020026020010151838381518110611e3b57fe5b6020026020010151613138565b600101611e0f565b50506015805461ff00191661010017905550565b60006001600160a01b038216611eab5760405162461bcd60e51b815260040180806020018281038252602a815260200180613dd0602a913960400191505060405180910390fd5b6001600160a01b038216600090815260016020526040902061194a90612b47565b611ed4610ed4565b6001600160a01b0316611ee5611fa8565b6001600160a01b031614611f2e576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b60115481565b6000600f8281548110611f8d57fe5b6000918252602090912001546001600160a01b031692915050565b600a546001600160a01b031690565b611fbf610ed4565b6001600160a01b0316611fd0611fa8565b6001600160a01b031614612019576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b80516116d3906013906020840190613af8565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ff85780601f10610fcd57610100808354040283529160200191610ff8565b6001600160a01b03166000908152600e602052604090205490565b60155460ff1681565b60145481565b6120bf610ed4565b6001600160a01b0316826001600160a01b03161415612125576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060056000612132610ed4565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155612176610ed4565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b600a8111156121fc5760405162461bcd60e51b8152600401808060200182810382526022815260200180613d766022913960400191505060405180910390fd5b611b71816001601454030111156122445760405162461bcd60e51b8152600401808060200182810382526025815260200180613eb26025913960400191505060405180910390fd5b8060125402341015612296576040805162461bcd60e51b81526020600482015260166024820152756e6f7420656e6f7567682065746865722073656e742160501b604482015290519081900360640190fd5b3332146122e1576040805162461bcd60e51b81526020600482015260146024820152736e6f20636f6e74726163747320706c656173652160601b604482015290519081900360640190fd5b60155462010000900460ff16156123295760405162461bcd60e51b8152600401808060200182810382526026815260200180613c326026913960400191505060405180910390fd5b60005b825181101561113a57620f424083828151811061234557fe5b6020026020010151106123a057600061236384838151811061188f57fe5b905061237181611b39612b52565b905061237c81612acc565b1561238757506123e0565b6123913382612dae565b601480546001019055506123e0565b6123af8382815181106118ec57fe5b156123b9576123e0565b6123d6338483815181106123c957fe5b6020026020010151612dae565b6014805460010190555b60010161232c565b6123f96123f3610ed4565b83612ef6565b6124345760405162461bcd60e51b8152600401808060200182810382526031815260200180613f826031913960400191505060405180910390fd5b612440848484846132d9565b50505050565b61244e610ed4565b6001600160a01b031661245f611fa8565b6001600160a01b0316146124a8576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b6015805462ff000019169055565b60606124c182612acc565b6124fc5760405162461bcd60e51b815260040180806020018281038252602f815260200180613f00602f913960400191505060405180910390fd5b60008281526008602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156125915780601f1061256657610100808354040283529160200191612591565b820191906000526020600020905b81548152906001019060200180831161257457829003601f168201915b5050505050905060606125a2611c6c565b90508051600014156125b657509050610ef6565b8151156126775780826040516020018083805190602001908083835b602083106125f15780518252601f1990920191602091820191016125d2565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106126395780518252601f19909201916020918201910161261a565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050610ef6565b806126818561332b565b6040516020018083805190602001908083835b602083106126b35780518252601f199092019160209182019101612694565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106126fb5780518252601f1990920191602091820191016126dc565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050919050565b60155462010000900460ff1681565b6001600160a01b03166000908152600d602052604090205490565b600a81565b600c5490565b611b7181565b60138054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ff85780601f10610fcd57610100808354040283529160200191610ff8565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600a8111156128435760405162461bcd60e51b8152600401808060200182810382526022815260200180613d766022913960400191505060405180910390fd5b611b718160016014540301111561288b5760405162461bcd60e51b8152600401808060200182810382526025815260200180613eb26025913960400191505060405180910390fd5b80601254023410156128dd576040805162461bcd60e51b81526020600482015260166024820152756e6f7420656e6f7567682065746865722073656e742160501b604482015290519081900360640190fd5b333214612928576040805162461bcd60e51b81526020600482015260146024820152736e6f20636f6e74726163747320706c656173652160601b604482015290519081900360640190fd5b60155462010000900460ff16156129705760405162461bcd60e51b8152600401808060200182810382526026815260200180613c326026913960400191505060405180910390fd5b600060015b611b7281101561113a578282141561298c5761113a565b61299581612acc565b1580156129a157508282105b156129c1576129b03382612dae565b601480546001908101909155909101905b600101612975565b6129d1610ed4565b6001600160a01b03166129e2611fa8565b6001600160a01b031614612a2b576040805162461bcd60e51b81526020600482018190526024820152600080516020613e92833981519152604482015290519081900360640190fd5b6001600160a01b038116612a705760405162461bcd60e51b8152600401808060200182810382526026815260200180613c0c6026913960400191505060405180910390fd5b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600061194a600283613406565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612b0e82611c44565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061194a82613412565b600082820183811015611947576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082612bbb5750600061194a565b82820282848281612bc857fe5b04146119475760405162461bcd60e51b8152600401808060200182810382526021815260200180613e456021913960400191505060405180910390fd5b6000808211612c5b576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612c6457fe5b049392505050565b600082821115612cc3576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b80471015612d1e576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d8060008114612d69576040519150601f19603f3d011682016040523d82523d6000602084013e612d6e565b606091505b505090508061113a5760405162461bcd60e51b815260040180806020018281038252603a815260200180613cc4603a913960400191505060405180910390fd5b6116d3828260405180602001604052806000815250613416565b6001600160a01b038216612e23576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b612e2c81612acc565b15612e7e576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b612e8a6000838361113a565b6001600160a01b0382166000908152600160205260409020612eac9082613468565b50612eb960028284613474565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612f0182612acc565b612f3c5760405162461bcd60e51b815260040180806020018281038252602c815260200180613d1f602c913960400191505060405180910390fd5b6000612f4783611c44565b9050806001600160a01b0316846001600160a01b03161480612f825750836001600160a01b0316612f7784611002565b6001600160a01b0316145b80612f925750612f9281856127d5565b949350505050565b826001600160a01b0316612fad82611c44565b6001600160a01b031614612ff25760405162461bcd60e51b8152600401808060200182810382526029815260200180613ed76029913960400191505060405180910390fd5b6001600160a01b0382166130375760405162461bcd60e51b8152600401808060200182810382526024815260200180613c7e6024913960400191505060405180910390fd5b61304283838361113a565b61304d600082612ad9565b6001600160a01b038316600090815260016020526040902061306f908261348a565b506001600160a01b03821660009081526001602052604090206130929082613468565b5061309f60028284613474565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006119478383613496565b600080808061310186866134fa565b9097909650945050505050565b80516116d3906009906020840190613af8565b600061312e848484613575565b90505b9392505050565b6001600160a01b03821661317d5760405162461bcd60e51b815260040180806020018281038252602c815260200180613be0602c913960400191505060405180910390fd5b600081116131d2576040805162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015290519081900360640190fd5b6001600160a01b0382166000908152600d6020526040902054156132275760405162461bcd60e51b815260040180806020018281038252602b815260200180613fb3602b913960400191505060405180910390fd5b600f8054600181019091557f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b0319166001600160a01b0384169081179091556000908152600d60205260409020819055600b5461328e9082612b52565b600b55604080516001600160a01b03841681526020810183905281517f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac929181900390910190a15050565b6132e4848484612f9a565b6132f08484848461363f565b6124405760405162461bcd60e51b8152600401808060200182810382526032815260200180613bae6032913960400191505060405180910390fd5b60608161335057506040805180820190915260018152600360fc1b6020820152610ef6565b8160005b811561336857600101600a82049150613354565b60608167ffffffffffffffff8111801561338157600080fd5b506040519080825280601f01601f1916602001820160405280156133ac576020820181803683370190505b50859350905060001982015b83156133fd57600a840660300160f81b828280600190039350815181106133db57fe5b60200101906001600160f81b031916908160001a905350600a840493506133b8565b50949350505050565b600061194783836137a7565b5490565b6134208383612dc8565b61342d600084848461363f565b61113a5760405162461bcd60e51b8152600401808060200182810382526032815260200180613bae6032913960400191505060405180910390fd5b600061194783836137bf565b600061312e84846001600160a01b038516613809565b600061194783836138a0565b815460009082106134d85760405162461bcd60e51b8152600401808060200182810382526022815260200180613b8c6022913960400191505060405180910390fd5b8260000182815481106134e757fe5b9060005260206000200154905092915050565b81546000908190831061353e5760405162461bcd60e51b8152600401808060200182810382526022815260200180613e236022913960400191505060405180910390fd5b600084600001848154811061354f57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816136105760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156135d55781810151838201526020016135bd565b50505050905090810190601f1680156136025780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061362357fe5b9060005260206000209060020201600101549150509392505050565b6000613653846001600160a01b0316613966565b61365f57506001612f92565b606061376d630a85bd0160e11b613674610ed4565b88878760405160240180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156136db5781810151838201526020016136c3565b50505050905090810190601f1680156137085780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001613bae603291396001600160a01b038816919061396c565b9050600081806020019051602081101561378657600080fd5b50516001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b60006137cb83836137a7565b6138015750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561194a565b50600061194a565b60008281526001840160205260408120548061386e575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055613131565b8285600001600183038154811061388157fe5b9060005260206000209060020201600101819055506000915050613131565b6000818152600183016020526040812054801561395c57835460001980830191908101906000908790839081106138d357fe5b90600052602060002001549050808760000184815481106138f057fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061392057fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061194a565b600091505061194a565b3b151590565b606061312e84846000858561398085613966565b6139d1576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613a105780518252601f1990920191602091820191016139f1565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613a72576040519150601f19603f3d011682016040523d82523d6000602084013e613a77565b606091505b5091509150613a87828286613a92565b979650505050505050565b60608315613aa1575081613131565b825115613ab15782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156135d55781810151838201526020016135bd565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b3957805160ff1916838001178555613b66565b82800160010185558215613b66579182015b82811115613b66578251825591602001919060010190613b4b565b50613b72929150613b76565b5090565b5b80821115613b725760008155600101613b7756fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465725061796d656e7453706c69747465723a206163636f756e7420697320746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573736d696e74696e67206973206e6f74206f70656e20746f20746865207075626c696320796574215061796d656e7453706c69747465723a206163636f756e7420686173206e6f207368617265734552433732313a207472616e7366657220746f20746865207a65726f20616464726573735061796d656e742053706c697420416c726561647920496e697469616c697a656421416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d6179206861766520726576657274656443727970746f466c797a206d7573742062652061637469766520746f206d696e744552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e5061796d656e7453706c69747465723a206163636f756e74206973206e6f7420647565207061796d656e74747279696e6720746f206d696e7420746f6f206d616e7920617420612074696d65214552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e6473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726d696e74696e672074686973206d616e7920776f756c642065786365656420737570706c794552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e5061796d656e7453706c69747465723a2070617965657320616e6420736861726573206c656e677468206d69736d617463684552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665645061796d656e7453706c69747465723a206163636f756e7420616c72656164792068617320736861726573a2646970667358221220c83f05d10f4d67e960921b7beff1b288fe5c1c459ddb7efbdeaa2f08dbc03c4d64736f6c63430007000033
Deployed Bytecode Sourcemap
75890:6561:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51784:40;51800:12;:10;:12::i;:::-;51784:40;;;-1:-1:-1;;;;;51784:40:0;;;;;51814:9;51784:40;;;;;;;;;;;;;75890:6561;;;;;40967:150;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40967:150:0;-1:-1:-1;;;;;;40967:150:0;;:::i;:::-;;;;;;;;;;;;;;;;;;80106:79;;;;;;;;;;;;;:::i;:::-;;61013:100;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63799:221;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63799:221:0;;:::i;:::-;;;;-1:-1:-1;;;;;63799:221:0;;;;;;;;;;;;;;63329:404;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;63329:404:0;;;;;;;;:::i;80289:108::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;80289:108:0;;:::i;62807:211::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;52990:629;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52990:629:0;-1:-1:-1;;;;;52990:629:0;;:::i;77728:754::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77728:754:0;;:::i;79793:305::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;79793:305:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;79793:305:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79793:305:0;;-1:-1:-1;79793:305:0;;-1:-1:-1;;;;;79793:305:0:i;64689:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;64689:305:0;;;;;;;;;;;;;;;;;:::i;78490:891::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;78490:891:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;78490:891:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78490:891:0;;-1:-1:-1;78490:891:0;;-1:-1:-1;;;;;78490:891:0:i;62569:162::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;62569:162:0;;;;;;;;:::i;51915:91::-;;;;;;;;;;;;;:::i;65065:151::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;65065:151:0;;;;;;;;;;;;;;;;;:::i;75955:31::-;;;;;;;;;;;;;:::i;76029:51::-;;;;;;;;;;;;;:::i;63095:172::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63095:172:0;;:::i;77241:103::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;77241:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;77241:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77241:103:0;;-1:-1:-1;77241:103:0;;-1:-1:-1;;;;;77241:103:0:i;77352:89::-;;;;;;;;;;;;;:::i;76421:70::-;;;;;;;;;;;;;:::i;79389:365::-;;;;;;;;;;;;;:::i;60769:177::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60769:177:0;;:::i;62388:97::-;;;;;;;;;;;;;:::i;76714:499::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;76714:499:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;76714:499:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76714:499:0;;;;;;;;-1:-1:-1;76714:499:0;;-1:-1:-1;;;;;76714:499:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;76714:499:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76714:499:0;;-1:-1:-1;76714:499:0;;-1:-1:-1;;;;;76714:499:0:i;60486:221::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60486:221:0;-1:-1:-1;;;;;60486:221:0;;:::i;56110:148::-;;;;;;;;;;;;;:::i;75993:29::-;;;;;;;;;;;;;:::i;52690:100::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52690:100:0;;:::i;55459:87::-;;;;;;;;;;;;;:::i;77449:117::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;77449:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;77449:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77449:117:0;;-1:-1:-1;77449:117:0;;-1:-1:-1;;;;;77449:117:0:i;61182:104::-;;;;;;;;;;;;;:::i;52490:109::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52490:109:0;-1:-1:-1;;;;;52490:109:0;;:::i;76251:33::-;;;;;;;;;;;;;:::i;76217:27::-;;;;;;;;;;;;;:::i;64092:295::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;64092:295:0;;;;;;;;;;:::i;81273:1173::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;81273:1173:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;81273:1173:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;81273:1173:0;;-1:-1:-1;;81273:1173:0;;;-1:-1:-1;81273:1173:0;;-1:-1:-1;;81273:1173:0:i;65287:285::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65287:285:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65287:285:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65287:285:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65287:285:0;;-1:-1:-1;65287:285:0;;-1:-1:-1;;;;;65287:285:0:i;80193:88::-;;;;;;;;;;;;;:::i;61357:792::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61357:792:0;;:::i;76330:35::-;;;;;;;;;;;;;:::i;52286:105::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52286:105:0;-1:-1:-1;;;;;52286:105:0;;:::i;76134:42::-;;;;;;;;;;;;;:::i;52100:95::-;;;;;;;;;;;;;:::i;76087:40::-;;;;;;;;;;;;;:::i;77574:97::-;;;;;;;;;;;;;:::i;64458:164::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;64458:164:0;;;;;;;;;;:::i;80405:856::-;;;;;;;;;;;;;;;;-1:-1:-1;80405:856:0;;:::i;56413:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56413:244:0;-1:-1:-1;;;;;56413:244:0;;:::i;49012:106::-;49100:10;49012:106;:::o;40967:150::-;-1:-1:-1;;;;;;41076:33:0;;41052:4;41076:33;;;;;;;;;;;;;40967:150;;;;:::o;80106:79::-;55690:12;:10;:12::i;:::-;-1:-1:-1;;;;;55679:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;55679:23:0;;55671:68;;;;;-1:-1:-1;;;55671:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;55671:68:0;;;;;;;;;;;;;;;80157:13:::1;:20:::0;;-1:-1:-1;;80157:20:0::1;80173:4;80157:20;::::0;;80106:79::o;61013:100::-;61100:5;61093:12;;;;;;;;-1:-1:-1;;61093:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61067:13;;61093:12;;61100:5;;61093:12;;61100:5;61093:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61013:100;:::o;63799:221::-;63875:7;63903:16;63911:7;63903;:16::i;:::-;63895:73;;;;-1:-1:-1;;;63895:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63988:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;63988:24:0;;63799:221::o;63329:404::-;63410:13;63426:23;63441:7;63426:14;:23::i;:::-;63410:39;;63474:5;-1:-1:-1;;;;;63468:11:0;:2;-1:-1:-1;;;;;63468:11:0;;;63460:57;;;;-1:-1:-1;;;63460:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63554:5;-1:-1:-1;;;;;63538:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;63538:21:0;;:69;;;;63563:44;63587:5;63594:12;:10;:12::i;:::-;63563:23;:44::i;:::-;63530:161;;;;-1:-1:-1;;;63530:161:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63704:21;63713:2;63717:7;63704:8;:21::i;:::-;63329:404;;;:::o;80289:108::-;55690:12;:10;:12::i;:::-;-1:-1:-1;;;;;55679:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;55679:23:0;;55671:68;;;;;-1:-1:-1;;;55671:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;55671:68:0;;;;;;;;;;;;;;;80362:16:::1;:27:::0;80289:108::o;62807:211::-;62868:7;62989:21;:12;:19;:21::i;:::-;62982:28;;62807:211;:::o;52990:629::-;-1:-1:-1;;;;;53066:16:0;;53085:1;53066:16;;;:7;:16;;;;;;53058:71;;;;-1:-1:-1;;;53058:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53142:21;53166:41;53192:14;;53166:21;:25;;:41;;;;:::i;:::-;-1:-1:-1;;;;;53294:18:0;;53218:15;53294:18;;;:9;:18;;;;;;;;;53276:12;;53254:7;:16;;;;;;;53142:65;;-1:-1:-1;53218:15:0;;53236:77;;53294:18;53236:53;;:35;;53142:65;;53236:17;:35::i;:::-;:39;;:53::i;:::-;:57;;:77::i;:::-;53218:95;-1:-1:-1;53334:12:0;53326:68;;;;-1:-1:-1;;;53326:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53428:18:0;;;;;;:9;:18;;;;;;:31;;53451:7;53428:22;:31::i;:::-;-1:-1:-1;;;;;53407:18:0;;;;;;:9;:18;;;;;:52;53487:14;;:27;;53506:7;53487:18;:27::i;:::-;53470:14;:44;53527:35;53545:7;53554;53527:17;:35::i;:::-;53578:33;;;-1:-1:-1;;;;;53578:33:0;;;;;;;;;;;;;;;;;;;;;;;52990:629;;;:::o;77728:754::-;77793:12;;;;77785:58;;;;-1:-1:-1;;;77785:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77862:10;;76123:4;-1:-1:-1;77862:31:0;77854:71;;;;;-1:-1:-1;;;77854:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;77944:11;;:26;;;-1:-1:-1;;;77944:26:0;;;;;;;;;;77974:10;;-1:-1:-1;;;;;77944:11:0;;:19;;:26;;;;;;;;;;;;;;:11;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77944:26:0;-1:-1:-1;;;;;77944:40:0;;77936:79;;;;;-1:-1:-1;;;77936:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;78039:7;78030:5;:16;78026:449;;78063:13;78079:28;78092:5;78099:7;78079:12;:28::i;:::-;78063:44;;78130:25;78143:5;78150:4;78130:12;:25::i;:::-;78122:33;;78179:14;78187:5;78179:7;:14::i;:::-;78178:15;78170:60;;;;;-1:-1:-1;;;78170:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78245:28;78255:10;78267:5;78245:9;:28::i;:::-;-1:-1:-1;78288:10:0;:12;;;;;;78026:449;;;78342:14;78350:5;78342:7;:14::i;:::-;78341:15;78333:60;;;;;-1:-1:-1;;;78333:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78408:28;78418:10;78430:5;78408:9;:28::i;:::-;78451:10;:12;;;;;;78026:449;77728:754;:::o;79793:305::-;55690:12;:10;:12::i;:::-;-1:-1:-1;;;;;55679:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;55679:23:0;;55671:68;;;;;-1:-1:-1;;;55671:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;55671:68:0;;;;;;;;;;;;;;;79891:13:::1;::::0;::::1;;79890:14;79881:55;;;::::0;;-1:-1:-1;;;79881:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;79952:9;79947:144;79971:9;:16;79967:1;:20;79947:144;;;80018:9;80028:1;80018:12;;;;;;;;;;;;;;80032:1;80018:15;;80009:25;;;::::0;::::1;;80049:30;80055:10;80066:9;80076:1;80066:12;;;;;;;;;;;;;;80049:5;:30::i;:::-;79989:3;;79947:144;;;;79793:305:::0;:::o;64689:::-;64850:41;64869:12;:10;:12::i;:::-;64883:7;64850:18;:41::i;:::-;64842:103;;;;-1:-1:-1;;;64842:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64958:28;64968:4;64974:2;64978:7;64958:9;:28::i;78490:891::-;78568:12;;;;78560:58;;;;-1:-1:-1;;;78560:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78634:6;78629:745;78647:6;:13;78644:1;:16;78629:745;;;78690:11;;78710:9;;78724:10;;-1:-1:-1;;;;;78690:11:0;;:19;;78710:6;;78717:1;;78710:9;;;;;;;;;;;;78690:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78690:30:0;-1:-1:-1;;;;;78690:44:0;;78682:83;;;;;-1:-1:-1;;;78682:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;78797:7;78784:6;78791:1;78784:9;;;;;;;;;;;;;;:20;78780:583;;78825:13;78841:32;78854:6;78861:1;78854:9;;;;;;;;;;;;;;78865:7;78841:12;:32::i;:::-;78825:48;;78900:25;78913:5;78920:4;78900:12;:25::i;:::-;78892:33;;78947:14;78955:5;78947:7;:14::i;:::-;78944:178;;;78986:8;;;78944:178;79043:24;79049:10;79061:5;79043;:24::i;:::-;79090:10;:12;;;;;;78780:583;;;;79165:18;79173:6;79180:1;79173:9;;;;;;;;;;;;;;79165:7;:18::i;:::-;79162:186;;;79208:8;;79162:186;79265:28;79271:10;79283:6;79290:1;79283:9;;;;;;;79265:28;79316:10;:12;;;;;;79162:186;78662:3;;78629:745;;62569:162;-1:-1:-1;;;;;62693:20:0;;62666:7;62693:20;;;:13;:20;;;;;:30;;62717:5;62693:23;:30::i;:::-;62686:37;;62569:162;;;;;:::o;51915:91::-;51986:12;;51915:91;:::o;65065:151::-;65169:39;65186:4;65192:2;65196:7;65169:39;;;;;;;;;;;;:16;:39::i;75955:31::-;;;;;;:::o;76029:51::-;;;;:::o;63095:172::-;63170:7;;63212:22;:12;63228:5;63212:15;:22::i;:::-;-1:-1:-1;63190:44:0;63095:172;-1:-1:-1;;;63095:172:0:o;77241:103::-;55690:12;:10;:12::i;:::-;-1:-1:-1;;;;;55679:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;55679:23:0;;55671:68;;;;;-1:-1:-1;;;55671:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;55671:68:0;;;;;;;;;;;;;;;77315:21:::1;77327:8;77315:11;:21::i;77352:89::-:0;55690:12;:10;:12::i;:::-;-1:-1:-1;;;;;55679:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;55679:23:0;;55671:68;;;;;-1:-1:-1;;;55671:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;55671:68:0;;;;;;;;;;;;;;;77421:12:::1;::::0;;-1:-1:-1;;77405:28:0;::::1;77421:12;::::0;;::::1;77420:13;77405:28;::::0;;77352:89::o;76421:70::-;;;;;;-1:-1:-1;;;;;76421:70:0;;:::o;79389:365::-;79441:12;;;;79433:58;;;;-1:-1:-1;;;79433:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79520:11;;:33;;;-1:-1:-1;;;79520:33:0;;79542:10;79520:33;;;;;;79502:15;;-1:-1:-1;;;;;79520:11:0;;:21;;:33;;;;;;;;;;;;;;:11;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79520:33:0;;-1:-1:-1;79564:22:0;;79597:118;79618:7;79614:1;:11;79597:118;;;79656:11;;:46;;;-1:-1:-1;;;79656:46:0;;79688:10;79656:46;;;;;;;;;;;;79647:3;;-1:-1:-1;;;;;79656:11:0;;:31;;:46;;;;;;;;;;;;;;:11;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79656:46:0;79647:56;;;;;;;;-1:-1:-1;79647:56:0;;;79656:46;79647:56;;;;;79627:3;79597:118;;;;79725:21;79742:3;79725:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:21::i;60769:177::-;60841:7;60868:70;60885:7;60868:70;;;;;;;;;;;;;;;;;:12;;:70;:16;:70::i;62388:97::-;62469:8;62462:15;;;;;;;;-1:-1:-1;;62462:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62436:13;;62462:15;;62469:8;;62462:15;;62469:8;62462:15;;;;;;;;;;;;;;;;;;;;;;;;76714:499;55690:12;:10;:12::i;:::-;-1:-1:-1;;;;;55679:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;55679:23:0;;55671:68;;;;;-1:-1:-1;;;55671:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;55671:68:0;;;;;;;;;;;;;;;76841:11:::1;::::0;::::1;::::0;::::1;;;76840:12;76831:60;;;;-1:-1:-1::0;;;76831:60:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76927:7;:14;76910:6;:13;:31;76902:94;;;;-1:-1:-1::0;;;76902:94:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77031:1;77015:6;:13;:17;77007:56;;;::::0;;-1:-1:-1;;;77007:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;77081:9;77076:103;77100:6;:13;77096:1;:17;77076:103;;;77135:32;77145:6;77152:1;77145:9;;;;;;;;;;;;;;77156:7;77164:1;77156:10;;;;;;;;;;;;;;77135:9;:32::i;:::-;77115:3;;77076:103;;;-1:-1:-1::0;;77189:11:0::1;:16:::0;;-1:-1:-1;;77189:16:0::1;;;::::0;;-1:-1:-1;76714:499:0:o;60486:221::-;60558:7;-1:-1:-1;;;;;60586:19:0;;60578:74;;;;-1:-1:-1;;;60578:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60670:20:0;;;;;;:13;:20;;;;;:29;;:27;:29::i;56110:148::-;55690:12;:10;:12::i;:::-;-1:-1:-1;;;;;55679:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;55679:23:0;;55671:68;;;;;-1:-1:-1;;;55671:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;55671:68:0;;;;;;;;;;;;;;;56201:6:::1;::::0;56180:40:::1;::::0;56217:1:::1;::::0;-1:-1:-1;;;;;56201:6:0::1;::::0;56180:40:::1;::::0;56217:1;;56180:40:::1;56231:6;:19:::0;;-1:-1:-1;;;;;;56231:19:0::1;::::0;;56110:148::o;75993:29::-;;;;:::o;52690:100::-;52741:7;52768;52776:5;52768:14;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52768:14:0;;52690:100;-1:-1:-1;;52690:100:0:o;55459:87::-;55532:6;;-1:-1:-1;;;;;55532:6:0;55459:87;:::o;77449:117::-;55690:12;:10;:12::i;:::-;-1:-1:-1;;;;;55679:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;55679:23:0;;55671:68;;;;;-1:-1:-1;;;55671:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;55671:68:0;;;;;;;;;;;;;;;77531:27;;::::1;::::0;:12:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;61182:104::-:0;61271:7;61264:14;;;;;;;;-1:-1:-1;;61264:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61238:13;;61264:14;;61271:7;;61264:14;;61271:7;61264:14;;;;;;;;;;;;;;;;;;;;;;;;52490:109;-1:-1:-1;;;;;52573:18:0;52546:7;52573:18;;;:9;:18;;;;;;;52490:109::o;76251:33::-;;;;;;:::o;76217:27::-;;;;:::o;64092:295::-;64207:12;:10;:12::i;:::-;-1:-1:-1;;;;;64195:24:0;:8;-1:-1:-1;;;;;64195:24:0;;;64187:62;;;;;-1:-1:-1;;;64187:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;64307:8;64262:18;:32;64281:12;:10;:12::i;:::-;-1:-1:-1;;;;;64262:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;64262:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;64262:53:0;;;;;;;;;;;64346:12;:10;:12::i;:::-;-1:-1:-1;;;;;64331:48:0;;64370:8;64331:48;;;;;;;;;;;;;;;;;;;;64092:295;;:::o;81273:1173::-;76174:2;81378:8;:25;;81370:72;;;;-1:-1:-1;;;81370:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76123:4;81478:8;81474:1;81461:10;;:14;:25;:38;;81453:88;;;;-1:-1:-1;;;81453:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81592:8;81573:16;;:27;81560:9;:40;;81552:75;;;;;-1:-1:-1;;;81552:75:0;;;;;;;;;;;;-1:-1:-1;;;81552:75:0;;;;;;;;;;;;;;;81646:10;81660:9;81646:23;81638:56;;;;;-1:-1:-1;;;81638:56:0;;;;;;;;;;;;-1:-1:-1;;;81638:56:0;;;;;;;;;;;;;;;81714:16;;;;;;;81713:17;81705:68;;;;-1:-1:-1;;;81705:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81789:6;81784:655;81802:6;:13;81799:1;:16;81784:655;;;81854:7;81841:6;81848:1;81841:9;;;;;;;;;;;;;;:20;81837:591;;81882:13;81898:32;81911:6;81918:1;81911:9;;;;;;;81898:32;81882:48;;81957:25;81970:5;81977:4;81957:12;:25::i;:::-;81949:33;;82004:14;82012:5;82004:7;:14::i;:::-;82001:182;;;82043:8;;;82001:182;82100:28;82110:10;82122:5;82100:9;:28::i;:::-;82151:10;:12;;;;;;81837:591;;;;82226:18;82234:6;82241:1;82234:9;;;;;;;82226:18;82223:190;;;82269:8;;82223:190;82326:32;82336:10;82348:6;82355:1;82348:9;;;;;;;;;;;;;;82326;:32::i;:::-;82381:10;:12;;;;;;82223:190;81817:3;;81784:655;;65287:285;65419:41;65438:12;:10;:12::i;:::-;65452:7;65419:18;:41::i;:::-;65411:103;;;;-1:-1:-1;;;65411:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65525:39;65539:4;65545:2;65549:7;65558:5;65525:13;:39::i;:::-;65287:285;;;;:::o;80193:88::-;55690:12;:10;:12::i;:::-;-1:-1:-1;;;;;55679:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;55679:23:0;;55671:68;;;;;-1:-1:-1;;;55671:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;55671:68:0;;;;;;;;;;;;;;;80249:16:::1;:24:::0;;-1:-1:-1;;80249:24:0::1;::::0;;80193:88::o;61357:792::-;61430:13;61464:16;61472:7;61464;:16::i;:::-;61456:76;;;;-1:-1:-1;;;61456:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61571:19;;;;:10;:19;;;;;;;;;61545:45;;;;;;-1:-1:-1;;61545:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;:45;;;61571:19;61545:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61601:18;61622:9;:7;:9::i;:::-;61601:30;;61713:4;61707:18;61729:1;61707:23;61703:72;;;-1:-1:-1;61754:9:0;-1:-1:-1;61747:16:0;;61703:72;61879:23;;:27;61875:108;;61954:4;61960:9;61937:33;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61937:33:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61937:33:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61937:33:0;;;;;;;;;;;;;-1:-1:-1;;61937:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61923:48;;;;;;61875:108;62115:4;62121:18;:7;:16;:18::i;:::-;62098:42;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62098:42:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62098:42:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62098:42:0;;;;;;;;;;;;;-1:-1:-1;;62098:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62084:57;;;;61357:792;;;:::o;76330:35::-;;;;;;;;;:::o;52286:105::-;-1:-1:-1;;;;;52367:16:0;52340:7;52367:16;;;:7;:16;;;;;;;52286:105::o;76134:42::-;76174:2;76134:42;:::o;52100:95::-;52173:14;;52100:95;:::o;76087:40::-;76123:4;76087:40;:::o;77574:97::-;77651:12;77644:19;;;;;;;;-1:-1:-1;;77644:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77618:13;;77644:19;;77651:12;;77644:19;;77651:12;77644:19;;;;;;;;;;;;;;;;;;;;;;;;64458:164;-1:-1:-1;;;;;64579:25:0;;;64555:4;64579:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;64458:164::o;80405:856::-;76174:2;80479:8;:25;;80471:72;;;;-1:-1:-1;;;80471:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76123:4;80579:8;80575:1;80562:10;;:14;:25;:38;;80554:88;;;;-1:-1:-1;;;80554:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80693:8;80674:16;;:27;80661:9;:40;;80653:75;;;;;-1:-1:-1;;;80653:75:0;;;;;;;;;;;;-1:-1:-1;;;80653:75:0;;;;;;;;;;;;;;;80747:10;80761:9;80747:23;80739:56;;;;;-1:-1:-1;;;80739:56:0;;;;;;;;;;;;-1:-1:-1;;;80739:56:0;;;;;;;;;;;;;;;80815:16;;;;;;;80814:17;80806:68;;;;-1:-1:-1;;;80806:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80887:9;80928:1;80911:343;80935:13;80931:17;;80911:343;;;80979:8;80974:1;:13;80970:273;;;81008:5;;80970:273;81072:10;81080:1;81072:7;:10::i;:::-;81071:11;:27;;;;;81090:8;81086:1;:12;81071:27;81067:161;;;81123:24;81133:10;81145:1;81123:9;:24::i;:::-;81196:10;:12;;81170:3;81196:12;;;;;;81170:3;;;;81067:161;80950:3;;80911:343;;56413:244;55690:12;:10;:12::i;:::-;-1:-1:-1;;;;;55679:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;55679:23:0;;55671:68;;;;;-1:-1:-1;;;55671:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;55671:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;56502:22:0;::::1;56494:73;;;;-1:-1:-1::0;;;56494:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56604:6;::::0;56583:38:::1;::::0;-1:-1:-1;;;;;56583:38:0;;::::1;::::0;56604:6:::1;::::0;56583:38:::1;::::0;56604:6:::1;::::0;56583:38:::1;56632:6;:17:::0;;-1:-1:-1;;;;;;56632:17:0::1;-1:-1:-1::0;;;;;56632:17:0;;;::::1;::::0;;;::::1;::::0;;56413:244::o;67039:127::-;67104:4;67128:30;:12;67150:7;67128:21;:30::i;72946:183::-;73012:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;73012:29:0;-1:-1:-1;;;;;73012:29:0;;;;;;;;:24;;73066:23;73012:24;73066:14;:23::i;:::-;-1:-1:-1;;;;;73057:46:0;;;;;;;;;;;72946:183;;:::o;10695:123::-;10764:7;10791:19;10799:3;10791:7;:19::i;33368:179::-;33426:7;33458:5;;;33482:6;;;;33474:46;;;;;-1:-1:-1;;;33474:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;34247:220;34305:7;34329:6;34325:20;;-1:-1:-1;34344:1:0;34337:8;;34325:20;34368:5;;;34372:1;34368;:5;:1;34392:5;;;;;:10;34384:56;;;;-1:-1:-1;;;34384:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34945:153;35003:7;35035:1;35031;:5;35023:44;;;;;-1:-1:-1;;;35023:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35089:1;35085;:5;;;;;;;34945:153;-1:-1:-1;;;34945:153:0:o;33830:158::-;33888:7;33921:1;33916;:6;;33908:49;;;;;-1:-1:-1;;;33908:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33975:5:0;;;33830:158::o;24616:397::-;24731:6;24706:21;:31;;24698:73;;;;;-1:-1:-1;;;24698:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24881:35;;24863:12;;-1:-1:-1;;;;;24881:14:0;;;24904:6;;24863:12;24881:35;24863:12;24881:35;24904:6;24881:14;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24862:54;;;24935:7;24927:78;;;;-1:-1:-1;;;24927:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68031:110;68107:26;68117:2;68121:7;68107:26;;;;;;;;;;;;:9;:26::i;68954:404::-;-1:-1:-1;;;;;69034:16:0;;69026:61;;;;;-1:-1:-1;;;69026:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69107:16;69115:7;69107;:16::i;:::-;69106:17;69098:58;;;;;-1:-1:-1;;;69098:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;69169:45;69198:1;69202:2;69206:7;69169:20;:45::i;:::-;-1:-1:-1;;;;;69227:17:0;;;;;;:13;:17;;;;;:30;;69249:7;69227:21;:30::i;:::-;-1:-1:-1;69270:29:0;:12;69287:7;69296:2;69270:16;:29::i;:::-;-1:-1:-1;69317:33:0;;69342:7;;-1:-1:-1;;;;;69317:33:0;;;69334:1;;69317:33;;69334:1;;69317:33;68954:404;;:::o;67333:355::-;67426:4;67451:16;67459:7;67451;:16::i;:::-;67443:73;;;;-1:-1:-1;;;67443:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67527:13;67543:23;67558:7;67543:14;:23::i;:::-;67527:39;;67596:5;-1:-1:-1;;;;;67585:16:0;:7;-1:-1:-1;;;;;67585:16:0;;:51;;;;67629:7;-1:-1:-1;;;;;67605:31:0;:20;67617:7;67605:11;:20::i;:::-;-1:-1:-1;;;;;67605:31:0;;67585:51;:94;;;;67640:39;67664:5;67671:7;67640:23;:39::i;:::-;67577:103;67333:355;-1:-1:-1;;;;67333:355:0:o;70469:599::-;70594:4;-1:-1:-1;;;;;70567:31:0;:23;70582:7;70567:14;:23::i;:::-;-1:-1:-1;;;;;70567:31:0;;70559:85;;;;-1:-1:-1;;;70559:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;70681:16:0;;70673:65;;;;-1:-1:-1;;;70673:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70751:39;70772:4;70778:2;70782:7;70751:20;:39::i;:::-;70855:29;70872:1;70876:7;70855:8;:29::i;:::-;-1:-1:-1;;;;;70897:19:0;;;;;;:13;:19;;;;;:35;;70924:7;70897:26;:35::i;:::-;-1:-1:-1;;;;;;70943:17:0;;;;;;:13;:17;;;;;:30;;70965:7;70943:21;:30::i;:::-;-1:-1:-1;70986:29:0;:12;71003:7;71012:2;70986:16;:29::i;:::-;;71052:7;71048:2;-1:-1:-1;;;;;71033:27:0;71042:4;-1:-1:-1;;;;;71033:27:0;;;;;;;;;;;70469:599;;;:::o;22288:137::-;22359:7;22394:22;22398:3;22410:5;22394:3;:22::i;11157:236::-;11237:7;;;;11297:22;11301:3;11313:5;11297:3;:22::i;:::-;11266:53;;;;-1:-1:-1;11157:236:0;-1:-1:-1;;;;;11157:236:0:o;71669:100::-;71742:19;;;;:8;;:19;;;;;:::i;12443:213::-;12550:7;12601:44;12606:3;12626;12632:12;12601:4;:44::i;:::-;12593:53;-1:-1:-1;12443:213:0;;;;;;:::o;53811:477::-;-1:-1:-1;;;;;53892:21:0;;53884:78;;;;-1:-1:-1;;;53884:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53991:1;53981:7;:11;53973:53;;;;;-1:-1:-1;;;53973:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54045:16:0;;;;;;:7;:16;;;;;;:21;54037:77;;;;-1:-1:-1;;;54037:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54127:7;:21;;;;;;;;;;;;-1:-1:-1;;;;;;54127:21:0;-1:-1:-1;;;;;54127:21:0;;;;;;;;-1:-1:-1;54159:16:0;;;:7;54127:21;54159:16;;;;:26;;;54211:12;;:25;;54159:26;54211:16;:25::i;:::-;54196:12;:40;54252:28;;;-1:-1:-1;;;;;54252:28:0;;;;;;;;;;;;;;;;;;;;;;;53811:477;;:::o;66454:272::-;66568:28;66578:4;66584:2;66588:7;66568:9;:28::i;:::-;66615:48;66638:4;66644:2;66648:7;66657:5;66615:22;:48::i;:::-;66607:111;;;;-1:-1:-1;;;66607:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1824:746;1880:13;2101:10;2097:53;;-1:-1:-1;2128:10:0;;;;;;;;;;;;-1:-1:-1;;;2128:10:0;;;;;;2097:53;2175:5;2160:12;2216:78;2223:9;;2216:78;;2249:8;;2280:2;2272:10;;;;2216:78;;;2304:19;2336:6;2326:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2326:17:0;-1:-1:-1;2398:5:0;;-1:-1:-1;2304:39:0;-1:-1:-1;;;2370:10:0;;2414:117;2421:9;;2414:117;;2490:2;2483:4;:9;2478:2;:14;2465:29;;2447:6;2454:7;;;;;;;2447:15;;;;;;;;;;;:47;-1:-1:-1;;;;;2447:47:0;;;;;;;;-1:-1:-1;2517:2:0;2509:10;;;;2414:117;;;-1:-1:-1;2555:6:0;1824:746;-1:-1:-1;;;;1824:746:0:o;10456:151::-;10540:4;10564:35;10574:3;10594;10564:9;:35::i;7274:110::-;7357:19;;7274:110::o;68368:250::-;68464:18;68470:2;68474:7;68464:5;:18::i;:::-;68501:54;68532:1;68536:2;68540:7;68549:5;68501:22;:54::i;:::-;68493:117;;;;-1:-1:-1;;;68493:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21068:131;21135:4;21159:32;21164:3;21184:5;21159:4;:32::i;9879:185::-;9968:4;9992:64;9997:3;10017;-1:-1:-1;;;;;10031:23:0;;9992:4;:64::i;21375:137::-;21445:4;21469:35;21477:3;21497:5;21469:7;:35::i;17326:204::-;17421:18;;17393:7;;17421:26;-1:-1:-1;17413:73:0;;;;-1:-1:-1;;;17413:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17504:3;:11;;17516:5;17504:18;;;;;;;;;;;;;;;;17497:25;;17326:204;;;;:::o;7739:279::-;7843:19;;7806:7;;;;7843:27;-1:-1:-1;7835:74:0;;;;-1:-1:-1;;;7835:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7922:22;7947:3;:12;;7960:5;7947:19;;;;;;;;;;;;;;;;;;7922:44;;7985:5;:10;;;7997:5;:12;;;7977:33;;;;;7739:279;;;;;:::o;9236:319::-;9330:7;9369:17;;;:12;;;:17;;;;;;9420:12;9405:13;9397:36;;;;-1:-1:-1;;;9397:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9487:3;:12;;9511:1;9500:8;:12;9487:26;;;;;;;;;;;;;;;;;;:33;;;9480:40;;;9236:319;;;;;:::o;72334:604::-;72455:4;72482:15;:2;-1:-1:-1;;;;;72482:13:0;;:15::i;:::-;72477:60;;-1:-1:-1;72521:4:0;72514:11;;72477:60;72547:23;72573:252;-1:-1:-1;;;72686:12:0;:10;:12::i;:::-;72713:4;72732:7;72754:5;72589:181;;;;;;-1:-1:-1;;;;;72589:181:0;;;;;;-1:-1:-1;;;;;72589:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;72589:181:0;;;;;;;-1:-1:-1;;;;;72589:181:0;;;;;;;;;;;72573:252;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;72573:15:0;;;:252;:15;:252::i;:::-;72547:278;;72836:13;72863:10;72852:32;;;;;;;;;;;;;;;-1:-1:-1;72852:32:0;-1:-1:-1;;;;;;72903:26:0;-1:-1:-1;;;72903:26:0;;-1:-1:-1;;;72334:604:0;;;;;;:::o;7054:125::-;7125:4;7149:17;;;:12;;;;;:17;;;;;;:22;;;7054:125::o;14438:414::-;14501:4;14523:21;14533:3;14538:5;14523:9;:21::i;:::-;14518:327;;-1:-1:-1;14561:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;14744:18;;14722:19;;;:12;;;:19;;;;;;:40;;;;14777:11;;14518:327;-1:-1:-1;14828:5:0;14821:12;;4554:692;4630:4;4765:17;;;:12;;;:17;;;;;;4799:13;4795:444;;-1:-1:-1;;4884:38:0;;;;;;;;;;;;;;;;;;4866:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;5081:19;;5061:17;;;:12;;;:17;;;;;;;:39;5115:11;;4795:444;5195:5;5159:3;:12;;5183:1;5172:8;:12;5159:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;5222:5;5215:12;;;;;15028:1544;15094:4;15233:19;;;:12;;;:19;;;;;;15269:15;;15265:1300;;15704:18;;-1:-1:-1;;15655:14:0;;;;15704:22;;;;15631:21;;15704:3;;:22;;15991;;;;;;;;;;;;;;15971:42;;16137:9;16108:3;:11;;16120:13;16108:26;;;;;;;;;;;;;;;;;;;:38;;;;16214:23;;;16256:1;16214:12;;;:23;;;;;;16240:17;;;16214:43;;16366:17;;16214:3;;16366:17;;;;;;;;;;;;;;;;;;;;;;16461:3;:12;;:19;16474:5;16461:19;;;;;;;;;;;16454:26;;;16504:4;16497:11;;;;;;;;15265:1300;16548:5;16541:12;;;;;23259:422;23626:20;23665:8;;;23259:422::o;26177:195::-;26280:12;26312:52;26334:6;26342:4;26348:1;26351:12;26280;27481:18;27492:6;27481:10;:18::i;:::-;27473:60;;;;;-1:-1:-1;;;27473:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27607:12;27621:23;27648:6;-1:-1:-1;;;;;27648:11:0;27668:5;27676:4;27648:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27648:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27606:75;;;;27699:52;27717:7;27726:10;27738:12;27699:17;:52::i;:::-;27692:59;27229:530;-1:-1:-1;;;;;;;27229:530:0:o;29769:742::-;29884:12;29913:7;29909:595;;;-1:-1:-1;29944:10:0;29937:17;;29909:595;30058:17;;:21;30054:439;;30321:10;30315:17;30382:15;30369:10;30365:2;30361:19;30354:44;30269:148;30457:20;;-1:-1:-1;;;30457:20:0;;;;;;;;;;;;;;;;;30464:12;;30457:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://c83f05d10f4d67e960921b7beff1b288fe5c1c459ddb7efbdeaa2f08dbc03c4d
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.