Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
6,763,110,367.70679 BLKAT
Holders
37
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.881363256193208545 BLKATValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BlackCat
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-04 */ // File: @openzeppelin/[email protected]/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/[email protected]/interfaces/IERC5267.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol) pragma solidity ^0.8.0; interface IERC5267 { /** * @dev MAY be emitted to signal that the domain could have changed. */ event EIP712DomainChanged(); /** * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712 * signature. */ function eip712Domain() external view returns ( bytes1 fields, string memory name, string memory version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] memory extensions ); } // File: @openzeppelin/[email protected]/utils/StorageSlot.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ```solidity * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._ * _Available since v4.9 for `string`, `bytes`._ */ library StorageSlot { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } } // File: @openzeppelin/[email protected]/utils/ShortStrings.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/ShortStrings.sol) pragma solidity ^0.8.8; // | string | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | // | length | 0x BB | type ShortString is bytes32; /** * @dev This library provides functions to convert short memory strings * into a `ShortString` type that can be used as an immutable variable. * * Strings of arbitrary length can be optimized using this library if * they are short enough (up to 31 bytes) by packing them with their * length (1 byte) in a single EVM word (32 bytes). Additionally, a * fallback mechanism can be used for every other case. * * Usage example: * * ```solidity * contract Named { * using ShortStrings for *; * * ShortString private immutable _name; * string private _nameFallback; * * constructor(string memory contractName) { * _name = contractName.toShortStringWithFallback(_nameFallback); * } * * function name() external view returns (string memory) { * return _name.toStringWithFallback(_nameFallback); * } * } * ``` */ library ShortStrings { // Used as an identifier for strings longer than 31 bytes. bytes32 private constant _FALLBACK_SENTINEL = 0x00000000000000000000000000000000000000000000000000000000000000FF; error StringTooLong(string str); error InvalidShortString(); /** * @dev Encode a string of at most 31 chars into a `ShortString`. * * This will trigger a `StringTooLong` error is the input string is too long. */ function toShortString(string memory str) internal pure returns (ShortString) { bytes memory bstr = bytes(str); if (bstr.length > 31) { revert StringTooLong(str); } return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length)); } /** * @dev Decode a `ShortString` back to a "normal" string. */ function toString(ShortString sstr) internal pure returns (string memory) { uint256 len = byteLength(sstr); // using `new string(len)` would work locally but is not memory safe. string memory str = new string(32); /// @solidity memory-safe-assembly assembly { mstore(str, len) mstore(add(str, 0x20), sstr) } return str; } /** * @dev Return the length of a `ShortString`. */ function byteLength(ShortString sstr) internal pure returns (uint256) { uint256 result = uint256(ShortString.unwrap(sstr)) & 0xFF; if (result > 31) { revert InvalidShortString(); } return result; } /** * @dev Encode a string into a `ShortString`, or write it to storage if it is too long. */ function toShortStringWithFallback(string memory value, string storage store) internal returns (ShortString) { if (bytes(value).length < 32) { return toShortString(value); } else { StorageSlot.getStringSlot(store).value = value; return ShortString.wrap(_FALLBACK_SENTINEL); } } /** * @dev Decode a string that was encoded to `ShortString` or written to storage using {setWithFallback}. */ function toStringWithFallback(ShortString value, string storage store) internal pure returns (string memory) { if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) { return toString(value); } else { return store; } } /** * @dev Return the length of a string that was encoded to `ShortString` or written to storage using {setWithFallback}. * * WARNING: This will return the "byte length" of the string. This may not reflect the actual length in terms of * actual characters as the UTF-8 encoding of a single character can span over multiple bytes. */ function byteLengthWithFallback(ShortString value, string storage store) internal view returns (uint256) { if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) { return byteLength(value); } else { return bytes(store).length; } } } // File: @openzeppelin/[email protected]/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/[email protected]/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // File: @openzeppelin/[email protected]/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/[email protected]/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } } // File: @openzeppelin/[email protected]/utils/cryptography/EIP712.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/EIP712.sol) pragma solidity ^0.8.8; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain * separator of the implementation contract. This will cause the `_domainSeparatorV4` function to always rebuild the * separator from the immutable values, which is cheaper than accessing a cached version in cold storage. * * _Available since v3.4._ * * @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment */ abstract contract EIP712 is IERC5267 { using ShortStrings for *; bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _cachedDomainSeparator; uint256 private immutable _cachedChainId; address private immutable _cachedThis; bytes32 private immutable _hashedName; bytes32 private immutable _hashedVersion; ShortString private immutable _name; ShortString private immutable _version; string private _nameFallback; string private _versionFallback; /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { _name = name.toShortStringWithFallback(_nameFallback); _version = version.toShortStringWithFallback(_versionFallback); _hashedName = keccak256(bytes(name)); _hashedVersion = keccak256(bytes(version)); _cachedChainId = block.chainid; _cachedDomainSeparator = _buildDomainSeparator(); _cachedThis = address(this); } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _cachedThis && block.chainid == _cachedChainId) { return _cachedDomainSeparator; } else { return _buildDomainSeparator(); } } function _buildDomainSeparator() private view returns (bytes32) { return keccak256(abi.encode(_TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } /** * @dev See {EIP-5267}. * * _Available since v4.9._ */ function eip712Domain() public view virtual override returns ( bytes1 fields, string memory name, string memory version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] memory extensions ) { return ( hex"0f", // 01111 _name.toStringWithFallback(_nameFallback), _version.toStringWithFallback(_versionFallback), block.chainid, address(this), bytes32(0), new uint256[](0) ); } } // File: @openzeppelin/[email protected]/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/[email protected]/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/[email protected]/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File: @openzeppelin/[email protected]/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/[email protected]/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } // File: @openzeppelin/[email protected]/token/ERC20/extensions/ERC20Permit.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * _Available since v3.4._ */ abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // solhint-disable-next-line var-name-mixedcase bytes32 private constant _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); /** * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`. * However, to ensure consistency with the upgradeable transpiler, we will continue * to reserve a slot. * @custom:oz-renamed-from _PERMIT_TYPEHASH */ // solhint-disable-next-line var-name-mixedcase bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT; /** * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. * * It's a good idea to use the same `name` that is defined as the ERC20 token name. */ constructor(string memory name) EIP712(name, "1") {} /** * @dev See {IERC20Permit-permit}. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); bytes32 hash = _hashTypedDataV4(structHash); address signer = ECDSA.recover(hash, v, r, s); require(signer == owner, "ERC20Permit: invalid signature"); _approve(owner, spender, value); } /** * @dev See {IERC20Permit-nonces}. */ function nonces(address owner) public view virtual override returns (uint256) { return _nonces[owner].current(); } /** * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } /** * @dev "Consume a nonce": return the current value and increment. * * _Available since v4.1._ */ function _useNonce(address owner) internal virtual returns (uint256 current) { Counters.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } } // File: @openzeppelin/[email protected]/token/ERC20/extensions/draft-ERC20Permit.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/draft-ERC20Permit.sol) pragma solidity ^0.8.0; // EIP-2612 is Final as of 2022-11-01. This file is deprecated. // File: @openzeppelin/[email protected]/token/ERC20/extensions/ERC20Burnable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } // File: BlackCat.sol pragma solidity ^0.8.9; contract BlackCat is ERC20, ERC20Burnable, ERC20Permit { constructor() ERC20("Black Cat", "BLKAT") ERC20Permit("Black Cat") { _mint(msg.sender, 10000000000 * 10 ** decimals()); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidShortString","type":"error"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101606040523480156200001257600080fd5b506040518060400160405280600981526020017f426c61636b204361740000000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f426c61636b2043617400000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f424c4b41540000000000000000000000000000000000000000000000000000008152508160039081620000fd91906200073f565b5080600490816200010f91906200073f565b5050506200012d6005836200021460201b6200099e1790919060201c565b6101208181525050620001506006826200021460201b6200099e1790919060201c565b6101408181525050818051906020012060e08181525050808051906020012061010081815250504660a081815250506200018f6200027160201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250505050506200020e33620001e2620002ce60201b60201c565b600a620001f09190620009b6565b6402540be40062000202919062000a07565b620002d760201b60201c565b62000d3f565b60006020835110156200023a5762000232836200044460201b60201c565b90506200026b565b826200025183620004b160201b620009e21760201c565b60000190816200026291906200073f565b5060ff60001b90505b92915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60e051610100514630604051602001620002b395949392919062000ac3565b60405160208183030381529060405280519060200120905090565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000349576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003409062000b81565b60405180910390fd5b6200035d60008383620004bb60201b60201c565b806002600082825462000371919062000ba3565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000424919062000bde565b60405180910390a36200044060008383620004c060201b60201c565b5050565b600080829050601f815111156200049457826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016200048b919062000c79565b60405180910390fd5b805181620004a29062000ccf565b60001c1760001b915050919050565b6000819050919050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200054757607f821691505b6020821081036200055d576200055c620004ff565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005c77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000588565b620005d3868362000588565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620006206200061a6200061484620005eb565b620005f5565b620005eb565b9050919050565b6000819050919050565b6200063c83620005ff565b620006546200064b8262000627565b84845462000595565b825550505050565b600090565b6200066b6200065c565b6200067881848462000631565b505050565b5b81811015620006a0576200069460008262000661565b6001810190506200067e565b5050565b601f821115620006ef57620006b98162000563565b620006c48462000578565b81016020851015620006d4578190505b620006ec620006e38562000578565b8301826200067d565b50505b505050565b600082821c905092915050565b60006200071460001984600802620006f4565b1980831691505092915050565b60006200072f838362000701565b9150826002028217905092915050565b6200074a82620004c5565b67ffffffffffffffff811115620007665762000765620004d0565b5b6200077282546200052e565b6200077f828285620006a4565b600060209050601f831160018114620007b75760008415620007a2578287015190505b620007ae858262000721565b8655506200081e565b601f198416620007c78662000563565b60005b82811015620007f157848901518255600182019150602085019450602081019050620007ca565b868310156200081157848901516200080d601f89168262000701565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115620008b4578086048111156200088c576200088b62000826565b5b60018516156200089c5780820291505b8081029050620008ac8562000855565b94506200086c565b94509492505050565b600082620008cf5760019050620009a2565b81620008df5760009050620009a2565b8160018114620008f85760028114620009035762000939565b6001915050620009a2565b60ff84111562000918576200091762000826565b5b8360020a91508482111562000932576200093162000826565b5b50620009a2565b5060208310610133831016604e8410600b8410161715620009735782820a9050838111156200096d576200096c62000826565b5b620009a2565b62000982848484600162000862565b925090508184048111156200099c576200099b62000826565b5b81810290505b9392505050565b600060ff82169050919050565b6000620009c382620005eb565b9150620009d083620009a9565b9250620009ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620008bd565b905092915050565b600062000a1482620005eb565b915062000a2183620005eb565b925082820262000a3181620005eb565b9150828204841483151762000a4b5762000a4a62000826565b5b5092915050565b6000819050919050565b62000a678162000a52565b82525050565b62000a7881620005eb565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000aab8262000a7e565b9050919050565b62000abd8162000a9e565b82525050565b600060a08201905062000ada600083018862000a5c565b62000ae9602083018762000a5c565b62000af8604083018662000a5c565b62000b07606083018562000a6d565b62000b16608083018462000ab2565b9695505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000b69601f8362000b20565b915062000b768262000b31565b602082019050919050565b6000602082019050818103600083015262000b9c8162000b5a565b9050919050565b600062000bb082620005eb565b915062000bbd83620005eb565b925082820190508082111562000bd85762000bd762000826565b5b92915050565b600060208201905062000bf5600083018462000a6d565b92915050565b60005b8381101562000c1b57808201518184015260208101905062000bfe565b60008484015250505050565b6000601f19601f8301169050919050565b600062000c4582620004c5565b62000c51818562000b20565b935062000c6381856020860162000bfb565b62000c6e8162000c27565b840191505092915050565b6000602082019050818103600083015262000c95818462000c38565b905092915050565b600081519050919050565b6000819050602082019050919050565b600062000cc6825162000a52565b80915050919050565b600062000cdc8262000c9d565b8262000ce88462000ca8565b905062000cf58162000cb8565b9250602082101562000d385762000d337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360200360080262000588565b831692505b5050919050565b60805160a05160c05160e05161010051610120516101405161297b62000d9a60003960006105ee015260006105ba0152600061135c0152600061133b01526000610ec301526000610f1901526000610f42015261297b6000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a257806395d89b411161007157806395d89b41146102d4578063a457c2d7146102f2578063a9059cbb14610322578063d505accf14610352578063dd62ed3e1461036e5761010b565b806370a082311461023457806379cc6790146102645780637ecebe001461028057806384b0196e146102b05761010b565b8063313ce567116100de578063313ce567146101ac5780633644e515146101ca57806339509351146101e857806342966c68146102185761010b565b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015e57806323b872dd1461017c575b600080fd5b61011861039e565b604051610125919061179f565b60405180910390f35b6101486004803603810190610143919061185a565b610430565b60405161015591906118b5565b60405180910390f35b610166610453565b60405161017391906118df565b60405180910390f35b610196600480360381019061019191906118fa565b61045d565b6040516101a391906118b5565b60405180910390f35b6101b461048c565b6040516101c19190611969565b60405180910390f35b6101d2610495565b6040516101df919061199d565b60405180910390f35b61020260048036038101906101fd919061185a565b6104a4565b60405161020f91906118b5565b60405180910390f35b610232600480360381019061022d91906119b8565b6104db565b005b61024e600480360381019061024991906119e5565b6104ef565b60405161025b91906118df565b60405180910390f35b61027e6004803603810190610279919061185a565b610537565b005b61029a600480360381019061029591906119e5565b610557565b6040516102a791906118df565b60405180910390f35b6102b86105a7565b6040516102cb9796959493929190611b1a565b60405180910390f35b6102dc6106a9565b6040516102e9919061179f565b60405180910390f35b61030c6004803603810190610307919061185a565b61073b565b60405161031991906118b5565b60405180910390f35b61033c6004803603810190610337919061185a565b6107b2565b60405161034991906118b5565b60405180910390f35b61036c60048036038101906103679190611bf6565b6107d5565b005b61038860048036038101906103839190611c98565b610917565b60405161039591906118df565b60405180910390f35b6060600380546103ad90611d07565b80601f01602080910402602001604051908101604052809291908181526020018280546103d990611d07565b80156104265780601f106103fb57610100808354040283529160200191610426565b820191906000526020600020905b81548152906001019060200180831161040957829003601f168201915b5050505050905090565b60008061043b6109ec565b90506104488185856109f4565b600191505092915050565b6000600254905090565b6000806104686109ec565b9050610475858285610bbd565b610480858585610c49565b60019150509392505050565b60006012905090565b600061049f610ebf565b905090565b6000806104af6109ec565b90506104d08185856104c18589610917565b6104cb9190611d67565b6109f4565b600191505092915050565b6104ec6104e66109ec565b82610f76565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610549826105436109ec565b83610bbd565b6105538282610f76565b5050565b60006105a0600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611143565b9050919050565b6000606080600080600060606105e760057f000000000000000000000000000000000000000000000000000000000000000061115190919063ffffffff16565b61061b60067f000000000000000000000000000000000000000000000000000000000000000061115190919063ffffffff16565b46306000801b600067ffffffffffffffff81111561063c5761063b611d9b565b5b60405190808252806020026020018201604052801561066a5781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b6060600480546106b890611d07565b80601f01602080910402602001604051908101604052809291908181526020018280546106e490611d07565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b5050505050905090565b6000806107466109ec565b905060006107548286610917565b905083811015610799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079090611e3c565b60405180910390fd5b6107a682868684036109f4565b60019250505092915050565b6000806107bd6109ec565b90506107ca818585610c49565b600191505092915050565b83421115610818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080f90611ea8565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886108478c611201565b8960405160200161085d96959493929190611ec8565b60405160208183030381529060405280519060200120905060006108808261125f565b9050600061089082878787611279565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f790611f75565b60405180910390fd5b61090b8a8a8a6109f4565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006020835110156109ba576109b3836112a4565b90506109dc565b826109c4836109e2565b60000190816109d39190612141565b5060ff60001b90505b92915050565b6000819050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5a90612285565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac990612317565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610bb091906118df565b60405180910390a3505050565b6000610bc98484610917565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c435781811015610c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2c90612383565b60405180910390fd5b610c4284848484036109f4565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caf90612415565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e906124a7565b60405180910390fd5b610d3283838361130c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daf90612539565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610ea691906118df565b60405180910390a3610eb9848484611311565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610f3b57507f000000000000000000000000000000000000000000000000000000000000000046145b15610f68577f00000000000000000000000000000000000000000000000000000000000000009050610f73565b610f70611316565b90505b90565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdc906125cb565b60405180910390fd5b610ff18260008361130c565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106e9061265d565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161112a91906118df565b60405180910390a361113e83600084611311565b505050565b600081600001549050919050565b606060ff60001b831461116e57611167836113ac565b90506111fb565b81805461117a90611d07565b80601f01602080910402602001604051908101604052809291908181526020018280546111a690611d07565b80156111f35780601f106111c8576101008083540402835291602001916111f3565b820191906000526020600020905b8154815290600101906020018083116111d657829003601f168201915b505050505090505b92915050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061124e81611143565b915061125981611420565b50919050565b600061127261126c610ebf565b83611436565b9050919050565b600080600061128a87878787611477565b9150915061129781611559565b8192505050949350505050565b600080829050601f815111156112f157826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016112e8919061179f565b60405180910390fd5b8051816112fd906126ad565b60001c1760001b915050919050565b505050565b505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000004630604051602001611391959493929190612714565b60405160208183030381529060405280519060200120905090565b606060006113b9836116bf565b90506000602067ffffffffffffffff8111156113d8576113d7611d9b565b5b6040519080825280601f01601f19166020018201604052801561140a5781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b6001816000016000828254019250508190555050565b60006040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156114b2576000600391509150611550565b6000600187878787604051600081526020016040526040516114d79493929190612767565b6020604051602081039080840390855afa1580156114f9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361154757600060019250925050611550565b80600092509250505b94509492505050565b6000600481111561156d5761156c6127ac565b5b8160048111156115805761157f6127ac565b5b03156116bc576001600481111561159a576115996127ac565b5b8160048111156115ad576115ac6127ac565b5b036115ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e490612827565b60405180910390fd5b60026004811115611601576116006127ac565b5b816004811115611614576116136127ac565b5b03611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b90612893565b60405180910390fd5b60036004811115611668576116676127ac565b5b81600481111561167b5761167a6127ac565b5b036116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b290612925565b60405180910390fd5b5b50565b60008060ff8360001c169050601f811115611706576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561174957808201518184015260208101905061172e565b60008484015250505050565b6000601f19601f8301169050919050565b60006117718261170f565b61177b818561171a565b935061178b81856020860161172b565b61179481611755565b840191505092915050565b600060208201905081810360008301526117b98184611766565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117f1826117c6565b9050919050565b611801816117e6565b811461180c57600080fd5b50565b60008135905061181e816117f8565b92915050565b6000819050919050565b61183781611824565b811461184257600080fd5b50565b6000813590506118548161182e565b92915050565b60008060408385031215611871576118706117c1565b5b600061187f8582860161180f565b925050602061189085828601611845565b9150509250929050565b60008115159050919050565b6118af8161189a565b82525050565b60006020820190506118ca60008301846118a6565b92915050565b6118d981611824565b82525050565b60006020820190506118f460008301846118d0565b92915050565b600080600060608486031215611913576119126117c1565b5b60006119218682870161180f565b93505060206119328682870161180f565b925050604061194386828701611845565b9150509250925092565b600060ff82169050919050565b6119638161194d565b82525050565b600060208201905061197e600083018461195a565b92915050565b6000819050919050565b61199781611984565b82525050565b60006020820190506119b2600083018461198e565b92915050565b6000602082840312156119ce576119cd6117c1565b5b60006119dc84828501611845565b91505092915050565b6000602082840312156119fb576119fa6117c1565b5b6000611a098482850161180f565b91505092915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b611a4781611a12565b82525050565b611a56816117e6565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611a9181611824565b82525050565b6000611aa38383611a88565b60208301905092915050565b6000602082019050919050565b6000611ac782611a5c565b611ad18185611a67565b9350611adc83611a78565b8060005b83811015611b0d578151611af48882611a97565b9750611aff83611aaf565b925050600181019050611ae0565b5085935050505092915050565b600060e082019050611b2f600083018a611a3e565b8181036020830152611b418189611766565b90508181036040830152611b558188611766565b9050611b6460608301876118d0565b611b716080830186611a4d565b611b7e60a083018561198e565b81810360c0830152611b908184611abc565b905098975050505050505050565b611ba78161194d565b8114611bb257600080fd5b50565b600081359050611bc481611b9e565b92915050565b611bd381611984565b8114611bde57600080fd5b50565b600081359050611bf081611bca565b92915050565b600080600080600080600060e0888a031215611c1557611c146117c1565b5b6000611c238a828b0161180f565b9750506020611c348a828b0161180f565b9650506040611c458a828b01611845565b9550506060611c568a828b01611845565b9450506080611c678a828b01611bb5565b93505060a0611c788a828b01611be1565b92505060c0611c898a828b01611be1565b91505092959891949750929550565b60008060408385031215611caf57611cae6117c1565b5b6000611cbd8582860161180f565b9250506020611cce8582860161180f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611d1f57607f821691505b602082108103611d3257611d31611cd8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611d7282611824565b9150611d7d83611824565b9250828201905080821115611d9557611d94611d38565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611e2660258361171a565b9150611e3182611dca565b604082019050919050565b60006020820190508181036000830152611e5581611e19565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000611e92601d8361171a565b9150611e9d82611e5c565b602082019050919050565b60006020820190508181036000830152611ec181611e85565b9050919050565b600060c082019050611edd600083018961198e565b611eea6020830188611a4d565b611ef76040830187611a4d565b611f0460608301866118d0565b611f1160808301856118d0565b611f1e60a08301846118d0565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000611f5f601e8361171a565b9150611f6a82611f29565b602082019050919050565b60006020820190508181036000830152611f8e81611f52565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611ff77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611fba565b6120018683611fba565b95508019841693508086168417925050509392505050565b6000819050919050565b600061203e61203961203484611824565b612019565b611824565b9050919050565b6000819050919050565b61205883612023565b61206c61206482612045565b848454611fc7565b825550505050565b600090565b612081612074565b61208c81848461204f565b505050565b5b818110156120b0576120a5600082612079565b600181019050612092565b5050565b601f8211156120f5576120c681611f95565b6120cf84611faa565b810160208510156120de578190505b6120f26120ea85611faa565b830182612091565b50505b505050565b600082821c905092915050565b6000612118600019846008026120fa565b1980831691505092915050565b60006121318383612107565b9150826002028217905092915050565b61214a8261170f565b67ffffffffffffffff81111561216357612162611d9b565b5b61216d8254611d07565b6121788282856120b4565b600060209050601f8311600181146121ab5760008415612199578287015190505b6121a38582612125565b86555061220b565b601f1984166121b986611f95565b60005b828110156121e1578489015182556001820191506020850194506020810190506121bc565b868310156121fe57848901516121fa601f891682612107565b8355505b6001600288020188555050505b505050505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061226f60248361171a565b915061227a82612213565b604082019050919050565b6000602082019050818103600083015261229e81612262565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061230160228361171a565b915061230c826122a5565b604082019050919050565b60006020820190508181036000830152612330816122f4565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061236d601d8361171a565b915061237882612337565b602082019050919050565b6000602082019050818103600083015261239c81612360565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006123ff60258361171a565b915061240a826123a3565b604082019050919050565b6000602082019050818103600083015261242e816123f2565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061249160238361171a565b915061249c82612435565b604082019050919050565b600060208201905081810360008301526124c081612484565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061252360268361171a565b915061252e826124c7565b604082019050919050565b6000602082019050818103600083015261255281612516565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006125b560218361171a565b91506125c082612559565b604082019050919050565b600060208201905081810360008301526125e4816125a8565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061264760228361171a565b9150612652826125eb565b604082019050919050565b600060208201905081810360008301526126768161263a565b9050919050565b600081519050919050565b6000819050602082019050919050565b60006126a48251611984565b80915050919050565b60006126b88261267d565b826126c284612688565b90506126cd81612698565b9250602082101561270d576127087fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802611fba565b831692505b5050919050565b600060a082019050612729600083018861198e565b612736602083018761198e565b612743604083018661198e565b61275060608301856118d0565b61275d6080830184611a4d565b9695505050505050565b600060808201905061277c600083018761198e565b612789602083018661195a565b612796604083018561198e565b6127a3606083018461198e565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b600061281160188361171a565b915061281c826127db565b602082019050919050565b6000602082019050818103600083015261284081612804565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061287d601f8361171a565b915061288882612847565b602082019050919050565b600060208201905081810360008301526128ac81612870565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061290f60228361171a565b915061291a826128b3565b604082019050919050565b6000602082019050818103600083015261293e81612902565b905091905056fea264697066735822122022a124a435fec57e6b7150738f5f9c05eb1de8c3ee0a3a4f470183000d67188f64736f6c63430008120033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a257806395d89b411161007157806395d89b41146102d4578063a457c2d7146102f2578063a9059cbb14610322578063d505accf14610352578063dd62ed3e1461036e5761010b565b806370a082311461023457806379cc6790146102645780637ecebe001461028057806384b0196e146102b05761010b565b8063313ce567116100de578063313ce567146101ac5780633644e515146101ca57806339509351146101e857806342966c68146102185761010b565b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015e57806323b872dd1461017c575b600080fd5b61011861039e565b604051610125919061179f565b60405180910390f35b6101486004803603810190610143919061185a565b610430565b60405161015591906118b5565b60405180910390f35b610166610453565b60405161017391906118df565b60405180910390f35b610196600480360381019061019191906118fa565b61045d565b6040516101a391906118b5565b60405180910390f35b6101b461048c565b6040516101c19190611969565b60405180910390f35b6101d2610495565b6040516101df919061199d565b60405180910390f35b61020260048036038101906101fd919061185a565b6104a4565b60405161020f91906118b5565b60405180910390f35b610232600480360381019061022d91906119b8565b6104db565b005b61024e600480360381019061024991906119e5565b6104ef565b60405161025b91906118df565b60405180910390f35b61027e6004803603810190610279919061185a565b610537565b005b61029a600480360381019061029591906119e5565b610557565b6040516102a791906118df565b60405180910390f35b6102b86105a7565b6040516102cb9796959493929190611b1a565b60405180910390f35b6102dc6106a9565b6040516102e9919061179f565b60405180910390f35b61030c6004803603810190610307919061185a565b61073b565b60405161031991906118b5565b60405180910390f35b61033c6004803603810190610337919061185a565b6107b2565b60405161034991906118b5565b60405180910390f35b61036c60048036038101906103679190611bf6565b6107d5565b005b61038860048036038101906103839190611c98565b610917565b60405161039591906118df565b60405180910390f35b6060600380546103ad90611d07565b80601f01602080910402602001604051908101604052809291908181526020018280546103d990611d07565b80156104265780601f106103fb57610100808354040283529160200191610426565b820191906000526020600020905b81548152906001019060200180831161040957829003601f168201915b5050505050905090565b60008061043b6109ec565b90506104488185856109f4565b600191505092915050565b6000600254905090565b6000806104686109ec565b9050610475858285610bbd565b610480858585610c49565b60019150509392505050565b60006012905090565b600061049f610ebf565b905090565b6000806104af6109ec565b90506104d08185856104c18589610917565b6104cb9190611d67565b6109f4565b600191505092915050565b6104ec6104e66109ec565b82610f76565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610549826105436109ec565b83610bbd565b6105538282610f76565b5050565b60006105a0600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611143565b9050919050565b6000606080600080600060606105e760057f426c61636b20436174000000000000000000000000000000000000000000000961115190919063ffffffff16565b61061b60067f310000000000000000000000000000000000000000000000000000000000000161115190919063ffffffff16565b46306000801b600067ffffffffffffffff81111561063c5761063b611d9b565b5b60405190808252806020026020018201604052801561066a5781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b6060600480546106b890611d07565b80601f01602080910402602001604051908101604052809291908181526020018280546106e490611d07565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b5050505050905090565b6000806107466109ec565b905060006107548286610917565b905083811015610799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079090611e3c565b60405180910390fd5b6107a682868684036109f4565b60019250505092915050565b6000806107bd6109ec565b90506107ca818585610c49565b600191505092915050565b83421115610818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080f90611ea8565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886108478c611201565b8960405160200161085d96959493929190611ec8565b60405160208183030381529060405280519060200120905060006108808261125f565b9050600061089082878787611279565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f790611f75565b60405180910390fd5b61090b8a8a8a6109f4565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006020835110156109ba576109b3836112a4565b90506109dc565b826109c4836109e2565b60000190816109d39190612141565b5060ff60001b90505b92915050565b6000819050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5a90612285565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac990612317565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610bb091906118df565b60405180910390a3505050565b6000610bc98484610917565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c435781811015610c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2c90612383565b60405180910390fd5b610c4284848484036109f4565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caf90612415565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e906124a7565b60405180910390fd5b610d3283838361130c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daf90612539565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610ea691906118df565b60405180910390a3610eb9848484611311565b50505050565b60007f00000000000000000000000055e4e0916babaf9853f57e9d3e80488a5155dd6773ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610f3b57507f000000000000000000000000000000000000000000000000000000000000000146145b15610f68577facb597e8c4c842352945e3d03f5488065d84c9f4307c48f1d342640808326e8d9050610f73565b610f70611316565b90505b90565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdc906125cb565b60405180910390fd5b610ff18260008361130c565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106e9061265d565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161112a91906118df565b60405180910390a361113e83600084611311565b505050565b600081600001549050919050565b606060ff60001b831461116e57611167836113ac565b90506111fb565b81805461117a90611d07565b80601f01602080910402602001604051908101604052809291908181526020018280546111a690611d07565b80156111f35780601f106111c8576101008083540402835291602001916111f3565b820191906000526020600020905b8154815290600101906020018083116111d657829003601f168201915b505050505090505b92915050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061124e81611143565b915061125981611420565b50919050565b600061127261126c610ebf565b83611436565b9050919050565b600080600061128a87878787611477565b9150915061129781611559565b8192505050949350505050565b600080829050601f815111156112f157826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016112e8919061179f565b60405180910390fd5b8051816112fd906126ad565b60001c1760001b915050919050565b505050565b505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f04788ba7c2c3eac143d61a7b8f687a797fd48c31c09a598d2a9fe206763fabf57fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001611391959493929190612714565b60405160208183030381529060405280519060200120905090565b606060006113b9836116bf565b90506000602067ffffffffffffffff8111156113d8576113d7611d9b565b5b6040519080825280601f01601f19166020018201604052801561140a5781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b6001816000016000828254019250508190555050565b60006040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156114b2576000600391509150611550565b6000600187878787604051600081526020016040526040516114d79493929190612767565b6020604051602081039080840390855afa1580156114f9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361154757600060019250925050611550565b80600092509250505b94509492505050565b6000600481111561156d5761156c6127ac565b5b8160048111156115805761157f6127ac565b5b03156116bc576001600481111561159a576115996127ac565b5b8160048111156115ad576115ac6127ac565b5b036115ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e490612827565b60405180910390fd5b60026004811115611601576116006127ac565b5b816004811115611614576116136127ac565b5b03611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b90612893565b60405180910390fd5b60036004811115611668576116676127ac565b5b81600481111561167b5761167a6127ac565b5b036116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b290612925565b60405180910390fd5b5b50565b60008060ff8360001c169050601f811115611706576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561174957808201518184015260208101905061172e565b60008484015250505050565b6000601f19601f8301169050919050565b60006117718261170f565b61177b818561171a565b935061178b81856020860161172b565b61179481611755565b840191505092915050565b600060208201905081810360008301526117b98184611766565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117f1826117c6565b9050919050565b611801816117e6565b811461180c57600080fd5b50565b60008135905061181e816117f8565b92915050565b6000819050919050565b61183781611824565b811461184257600080fd5b50565b6000813590506118548161182e565b92915050565b60008060408385031215611871576118706117c1565b5b600061187f8582860161180f565b925050602061189085828601611845565b9150509250929050565b60008115159050919050565b6118af8161189a565b82525050565b60006020820190506118ca60008301846118a6565b92915050565b6118d981611824565b82525050565b60006020820190506118f460008301846118d0565b92915050565b600080600060608486031215611913576119126117c1565b5b60006119218682870161180f565b93505060206119328682870161180f565b925050604061194386828701611845565b9150509250925092565b600060ff82169050919050565b6119638161194d565b82525050565b600060208201905061197e600083018461195a565b92915050565b6000819050919050565b61199781611984565b82525050565b60006020820190506119b2600083018461198e565b92915050565b6000602082840312156119ce576119cd6117c1565b5b60006119dc84828501611845565b91505092915050565b6000602082840312156119fb576119fa6117c1565b5b6000611a098482850161180f565b91505092915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b611a4781611a12565b82525050565b611a56816117e6565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611a9181611824565b82525050565b6000611aa38383611a88565b60208301905092915050565b6000602082019050919050565b6000611ac782611a5c565b611ad18185611a67565b9350611adc83611a78565b8060005b83811015611b0d578151611af48882611a97565b9750611aff83611aaf565b925050600181019050611ae0565b5085935050505092915050565b600060e082019050611b2f600083018a611a3e565b8181036020830152611b418189611766565b90508181036040830152611b558188611766565b9050611b6460608301876118d0565b611b716080830186611a4d565b611b7e60a083018561198e565b81810360c0830152611b908184611abc565b905098975050505050505050565b611ba78161194d565b8114611bb257600080fd5b50565b600081359050611bc481611b9e565b92915050565b611bd381611984565b8114611bde57600080fd5b50565b600081359050611bf081611bca565b92915050565b600080600080600080600060e0888a031215611c1557611c146117c1565b5b6000611c238a828b0161180f565b9750506020611c348a828b0161180f565b9650506040611c458a828b01611845565b9550506060611c568a828b01611845565b9450506080611c678a828b01611bb5565b93505060a0611c788a828b01611be1565b92505060c0611c898a828b01611be1565b91505092959891949750929550565b60008060408385031215611caf57611cae6117c1565b5b6000611cbd8582860161180f565b9250506020611cce8582860161180f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611d1f57607f821691505b602082108103611d3257611d31611cd8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611d7282611824565b9150611d7d83611824565b9250828201905080821115611d9557611d94611d38565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611e2660258361171a565b9150611e3182611dca565b604082019050919050565b60006020820190508181036000830152611e5581611e19565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000611e92601d8361171a565b9150611e9d82611e5c565b602082019050919050565b60006020820190508181036000830152611ec181611e85565b9050919050565b600060c082019050611edd600083018961198e565b611eea6020830188611a4d565b611ef76040830187611a4d565b611f0460608301866118d0565b611f1160808301856118d0565b611f1e60a08301846118d0565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000611f5f601e8361171a565b9150611f6a82611f29565b602082019050919050565b60006020820190508181036000830152611f8e81611f52565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611ff77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611fba565b6120018683611fba565b95508019841693508086168417925050509392505050565b6000819050919050565b600061203e61203961203484611824565b612019565b611824565b9050919050565b6000819050919050565b61205883612023565b61206c61206482612045565b848454611fc7565b825550505050565b600090565b612081612074565b61208c81848461204f565b505050565b5b818110156120b0576120a5600082612079565b600181019050612092565b5050565b601f8211156120f5576120c681611f95565b6120cf84611faa565b810160208510156120de578190505b6120f26120ea85611faa565b830182612091565b50505b505050565b600082821c905092915050565b6000612118600019846008026120fa565b1980831691505092915050565b60006121318383612107565b9150826002028217905092915050565b61214a8261170f565b67ffffffffffffffff81111561216357612162611d9b565b5b61216d8254611d07565b6121788282856120b4565b600060209050601f8311600181146121ab5760008415612199578287015190505b6121a38582612125565b86555061220b565b601f1984166121b986611f95565b60005b828110156121e1578489015182556001820191506020850194506020810190506121bc565b868310156121fe57848901516121fa601f891682612107565b8355505b6001600288020188555050505b505050505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061226f60248361171a565b915061227a82612213565b604082019050919050565b6000602082019050818103600083015261229e81612262565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061230160228361171a565b915061230c826122a5565b604082019050919050565b60006020820190508181036000830152612330816122f4565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061236d601d8361171a565b915061237882612337565b602082019050919050565b6000602082019050818103600083015261239c81612360565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006123ff60258361171a565b915061240a826123a3565b604082019050919050565b6000602082019050818103600083015261242e816123f2565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061249160238361171a565b915061249c82612435565b604082019050919050565b600060208201905081810360008301526124c081612484565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061252360268361171a565b915061252e826124c7565b604082019050919050565b6000602082019050818103600083015261255281612516565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006125b560218361171a565b91506125c082612559565b604082019050919050565b600060208201905081810360008301526125e4816125a8565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061264760228361171a565b9150612652826125eb565b604082019050919050565b600060208201905081810360008301526126768161263a565b9050919050565b600081519050919050565b6000819050602082019050919050565b60006126a48251611984565b80915050919050565b60006126b88261267d565b826126c284612688565b90506126cd81612698565b9250602082101561270d576127087fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802611fba565b831692505b5050919050565b600060a082019050612729600083018861198e565b612736602083018761198e565b612743604083018661198e565b61275060608301856118d0565b61275d6080830184611a4d565b9695505050505050565b600060808201905061277c600083018761198e565b612789602083018661195a565b612796604083018561198e565b6127a3606083018461198e565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b600061281160188361171a565b915061281c826127db565b602082019050919050565b6000602082019050818103600083015261284081612804565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061287d601f8361171a565b915061288882612847565b602082019050919050565b600060208201905081810360008301526128ac81612870565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061290f60228361171a565b915061291a826128b3565b604082019050919050565b6000602082019050818103600083015261293e81612902565b905091905056fea264697066735822122022a124a435fec57e6b7150738f5f9c05eb1de8c3ee0a3a4f470183000d67188f64736f6c63430008120033
Deployed Bytecode Sourcemap
68228:200:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52442:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54802:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53571:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55583:261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53413:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66248:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56253:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67587:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53742:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67997:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65990:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42759:657;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;52661:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56994:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54075:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65279:645;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54331:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52442:100;52496:13;52529:5;52522:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52442:100;:::o;54802:201::-;54885:4;54902:13;54918:12;:10;:12::i;:::-;54902:28;;54941:32;54950:5;54957:7;54966:6;54941:8;:32::i;:::-;54991:4;54984:11;;;54802:201;;;;:::o;53571:108::-;53632:7;53659:12;;53652:19;;53571:108;:::o;55583:261::-;55680:4;55697:15;55715:12;:10;:12::i;:::-;55697:30;;55738:38;55754:4;55760:7;55769:6;55738:15;:38::i;:::-;55787:27;55797:4;55803:2;55807:6;55787:9;:27::i;:::-;55832:4;55825:11;;;55583:261;;;;;:::o;53413:93::-;53471:5;53496:2;53489:9;;53413:93;:::o;66248:115::-;66308:7;66335:20;:18;:20::i;:::-;66328:27;;66248:115;:::o;56253:238::-;56341:4;56358:13;56374:12;:10;:12::i;:::-;56358:28;;56397:64;56406:5;56413:7;56450:10;56422:25;56432:5;56439:7;56422:9;:25::i;:::-;:38;;;;:::i;:::-;56397:8;:64::i;:::-;56479:4;56472:11;;;56253:238;;;;:::o;67587:91::-;67643:27;67649:12;:10;:12::i;:::-;67663:6;67643:5;:27::i;:::-;67587:91;:::o;53742:127::-;53816:7;53843:9;:18;53853:7;53843:18;;;;;;;;;;;;;;;;53836:25;;53742:127;;;:::o;67997:164::-;68074:46;68090:7;68099:12;:10;:12::i;:::-;68113:6;68074:15;:46::i;:::-;68131:22;68137:7;68146:6;68131:5;:22::i;:::-;67997:164;;:::o;65990:128::-;66059:7;66086:24;:7;:14;66094:5;66086:14;;;;;;;;;;;;;;;:22;:24::i;:::-;66079:31;;65990:128;;;:::o;42759:657::-;42880:13;42908:18;42941:21;42977:15;43007:25;43047:12;43074:27;43182:41;43209:13;43182:5;:26;;:41;;;;:::i;:::-;43238:47;43268:16;43238:8;:29;;:47;;;;:::i;:::-;43300:13;43336:4;43364:1;43356:10;;43395:1;43381:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43129:279;;;;;;;;;;;;;;;;;;;;;42759:657;;;;;;;:::o;52661:104::-;52717:13;52750:7;52743:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52661:104;:::o;56994:436::-;57087:4;57104:13;57120:12;:10;:12::i;:::-;57104:28;;57143:24;57170:25;57180:5;57187:7;57170:9;:25::i;:::-;57143:52;;57234:15;57214:16;:35;;57206:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;57327:60;57336:5;57343:7;57371:15;57352:16;:34;57327:8;:60::i;:::-;57418:4;57411:11;;;;56994:436;;;;:::o;54075:193::-;54154:4;54171:13;54187:12;:10;:12::i;:::-;54171:28;;54210;54220:5;54227:2;54231:6;54210:9;:28::i;:::-;54256:4;54249:11;;;54075:193;;;;:::o;65279:645::-;65523:8;65504:15;:27;;65496:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;65578:18;64454:95;65638:5;65645:7;65654:5;65661:16;65671:5;65661:9;:16::i;:::-;65679:8;65609:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65599:90;;;;;;65578:111;;65702:12;65717:28;65734:10;65717:16;:28::i;:::-;65702:43;;65758:14;65775:28;65789:4;65795:1;65798;65801;65775:13;:28::i;:::-;65758:45;;65832:5;65822:15;;:6;:15;;;65814:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;65885:31;65894:5;65901:7;65910:5;65885:8;:31::i;:::-;65485:439;;;65279:645;;;;;;;:::o;54331:151::-;54420:7;54447:11;:18;54459:5;54447:18;;;;;;;;;;;;;;;:27;54466:7;54447:27;;;;;;;;;;;;;;;;54440:34;;54331:151;;;;:::o;9541:348::-;9637:11;9687:2;9671:5;9665:19;:24;9661:221;;;9713:20;9727:5;9713:13;:20::i;:::-;9706:27;;;;9661:221;9807:5;9766:32;9792:5;9766:25;:32::i;:::-;:38;;:46;;;;;;:::i;:::-;;7970:66;9851:18;;9827:43;;9541:348;;;;;:::o;5728:207::-;5796:20;5907:10;5897:20;;5728:207;;;:::o;46482:98::-;46535:7;46562:10;46555:17;;46482:98;:::o;60987:346::-;61106:1;61089:19;;:5;:19;;;61081:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61187:1;61168:21;;:7;:21;;;61160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61271:6;61241:11;:18;61253:5;61241:18;;;;;;;;;;;;;;;:27;61260:7;61241:27;;;;;;;;;;;;;;;:36;;;;61309:7;61293:32;;61302:5;61293:32;;;61318:6;61293:32;;;;;;:::i;:::-;;;;;;;;60987:346;;;:::o;61624:419::-;61725:24;61752:25;61762:5;61769:7;61752:9;:25::i;:::-;61725:52;;61812:17;61792:16;:37;61788:248;;61874:6;61854:16;:26;;61846:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61958:51;61967:5;61974:7;62002:6;61983:16;:25;61958:8;:51::i;:::-;61788:248;61714:329;61624:419;;;:::o;57900:806::-;58013:1;57997:18;;:4;:18;;;57989:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58090:1;58076:16;;:2;:16;;;58068:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;58145:38;58166:4;58172:2;58176:6;58145:20;:38::i;:::-;58196:19;58218:9;:15;58228:4;58218:15;;;;;;;;;;;;;;;;58196:37;;58267:6;58252:11;:21;;58244:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;58384:6;58370:11;:20;58352:9;:15;58362:4;58352:15;;;;;;;;;;;;;;;:38;;;;58587:6;58570:9;:13;58580:2;58570:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;58637:2;58622:26;;58631:4;58622:26;;;58641:6;58622:26;;;;;;:::i;:::-;;;;;;;;58661:37;58681:4;58687:2;58691:6;58661:19;:37::i;:::-;57978:728;57900:806;;;:::o;41397:268::-;41450:7;41491:11;41474:28;;41482:4;41474:28;;;:63;;;;;41523:14;41506:13;:31;41474:63;41470:188;;;41561:22;41554:29;;;;41470:188;41623:23;:21;:23::i;:::-;41616:30;;41397:268;;:::o;59874:675::-;59977:1;59958:21;;:7;:21;;;59950:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;60030:49;60051:7;60068:1;60072:6;60030:20;:49::i;:::-;60092:22;60117:9;:18;60127:7;60117:18;;;;;;;;;;;;;;;;60092:43;;60172:6;60154:14;:24;;60146:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;60291:6;60274:14;:23;60253:9;:18;60263:7;60253:18;;;;;;;;;;;;;;;:44;;;;60408:6;60392:12;;:22;;;;;;;;;;;60469:1;60443:37;;60452:7;60443:37;;;60473:6;60443:37;;;;;;:::i;:::-;;;;;;;;60493:48;60513:7;60530:1;60534:6;60493:19;:48::i;:::-;59939:610;59874:675;;:::o;878:114::-;943:7;970;:14;;;963:21;;878:114;;;:::o;10025:274::-;10119:13;7970:66;10178:18;;10168:5;10149:47;10145:147;;10220:15;10229:5;10220:8;:15::i;:::-;10213:22;;;;10145:147;10275:5;10268:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10025:274;;;;;:::o;66501:207::-;66561:15;66589:30;66622:7;:14;66630:5;66622:14;;;;;;;;;;;;;;;66589:47;;66657:15;:5;:13;:15::i;:::-;66647:25;;66683:17;:5;:15;:17::i;:::-;66578:130;66501:207;;;:::o;42497:167::-;42574:7;42601:55;42623:20;:18;:20::i;:::-;42645:10;42601:21;:55::i;:::-;42594:62;;42497:167;;;:::o;35070:236::-;35155:7;35176:17;35195:18;35217:25;35228:4;35234:1;35237;35240;35217:10;:25::i;:::-;35175:67;;;;35253:18;35265:5;35253:11;:18::i;:::-;35289:9;35282:16;;;;35070:236;;;;;;:::o;8298:292::-;8363:11;8387:17;8413:3;8387:30;;8446:2;8432:4;:11;:16;8428:74;;;8486:3;8472:18;;;;;;;;;;;:::i;:::-;;;;;;;;8428:74;8569:4;:11;8560:4;8552:13;;;:::i;:::-;8544:22;;:36;8536:45;;8512:70;;;8298:292;;;:::o;62643:91::-;;;;:::o;63338:90::-;;;;:::o;41673:182::-;41728:7;39589:95;41788:11;41801:14;41817:13;41840:4;41765:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41755:92;;;;;;41748:99;;41673:182;:::o;8679:415::-;8738:13;8764:11;8778:16;8789:4;8778:10;:16::i;:::-;8764:30;;8884:17;8915:2;8904:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8884:34;;9009:3;9004;8997:16;9050:4;9043;9038:3;9034:14;9027:28;9083:3;9076:10;;;;8679:415;;;:::o;1000:127::-;1107:1;1089:7;:14;;;:19;;;;;;;;;;;1000:127;:::o;36854:406::-;36947:12;37057:4;37051:11;37088:10;37083:3;37076:23;37136:15;37129:4;37124:3;37120:14;37113:39;37189:10;37182:4;37177:3;37173:14;37166:34;37237:4;37232:3;37222:20;37214:28;;37025:228;36854:406;;;;:::o;33454:1477::-;33542:7;33551:12;34476:66;34471:1;34463:10;;:79;34459:163;;;34575:1;34579:30;34559:51;;;;;;34459:163;34719:14;34736:24;34746:4;34752:1;34755;34758;34736:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34719:41;;34793:1;34775:20;;:6;:20;;;34771:103;;34828:1;34832:29;34812:50;;;;;;;34771:103;34894:6;34902:20;34886:37;;;;;33454:1477;;;;;;;;:::o;28914:521::-;28992:20;28983:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;28979:449;29029:7;28979:449;29090:29;29081:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;29077:351;;29136:34;;;;;;;;;;:::i;:::-;;;;;;;;29077:351;29201:35;29192:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;29188:240;;29253:41;;;;;;;;;;:::i;:::-;;;;;;;;29188:240;29325:30;29316:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;29312:116;;29372:44;;;;;;;;;;:::i;:::-;;;;;;;;29312:116;28914:521;;:::o;9171:251::-;9232:7;9252:14;9305:4;9296;9269:33;;:40;9252:57;;9333:2;9324:6;:11;9320:71;;;9359:20;;;;;;;;;;;;;;9320:71;9408:6;9401:13;;;9171:251;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:86::-;4458:7;4498:4;4491:5;4487:16;4476:27;;4423:86;;;:::o;4515:112::-;4598:22;4614:5;4598:22;:::i;:::-;4593:3;4586:35;4515:112;;:::o;4633:214::-;4722:4;4760:2;4749:9;4745:18;4737:26;;4773:67;4837:1;4826:9;4822:17;4813:6;4773:67;:::i;:::-;4633:214;;;;:::o;4853:77::-;4890:7;4919:5;4908:16;;4853:77;;;:::o;4936:118::-;5023:24;5041:5;5023:24;:::i;:::-;5018:3;5011:37;4936:118;;:::o;5060:222::-;5153:4;5191:2;5180:9;5176:18;5168:26;;5204:71;5272:1;5261:9;5257:17;5248:6;5204:71;:::i;:::-;5060:222;;;;:::o;5288:329::-;5347:6;5396:2;5384:9;5375:7;5371:23;5367:32;5364:119;;;5402:79;;:::i;:::-;5364:119;5522:1;5547:53;5592:7;5583:6;5572:9;5568:22;5547:53;:::i;:::-;5537:63;;5493:117;5288:329;;;;:::o;5623:::-;5682:6;5731:2;5719:9;5710:7;5706:23;5702:32;5699:119;;;5737:79;;:::i;:::-;5699:119;5857:1;5882:53;5927:7;5918:6;5907:9;5903:22;5882:53;:::i;:::-;5872:63;;5828:117;5623:329;;;;:::o;5958:149::-;5994:7;6034:66;6027:5;6023:78;6012:89;;5958:149;;;:::o;6113:115::-;6198:23;6215:5;6198:23;:::i;:::-;6193:3;6186:36;6113:115;;:::o;6234:118::-;6321:24;6339:5;6321:24;:::i;:::-;6316:3;6309:37;6234:118;;:::o;6358:114::-;6425:6;6459:5;6453:12;6443:22;;6358:114;;;:::o;6478:184::-;6577:11;6611:6;6606:3;6599:19;6651:4;6646:3;6642:14;6627:29;;6478:184;;;;:::o;6668:132::-;6735:4;6758:3;6750:11;;6788:4;6783:3;6779:14;6771:22;;6668:132;;;:::o;6806:108::-;6883:24;6901:5;6883:24;:::i;:::-;6878:3;6871:37;6806:108;;:::o;6920:179::-;6989:10;7010:46;7052:3;7044:6;7010:46;:::i;:::-;7088:4;7083:3;7079:14;7065:28;;6920:179;;;;:::o;7105:113::-;7175:4;7207;7202:3;7198:14;7190:22;;7105:113;;;:::o;7254:732::-;7373:3;7402:54;7450:5;7402:54;:::i;:::-;7472:86;7551:6;7546:3;7472:86;:::i;:::-;7465:93;;7582:56;7632:5;7582:56;:::i;:::-;7661:7;7692:1;7677:284;7702:6;7699:1;7696:13;7677:284;;;7778:6;7772:13;7805:63;7864:3;7849:13;7805:63;:::i;:::-;7798:70;;7891:60;7944:6;7891:60;:::i;:::-;7881:70;;7737:224;7724:1;7721;7717:9;7712:14;;7677:284;;;7681:14;7977:3;7970:10;;7378:608;;;7254:732;;;;:::o;7992:1215::-;8341:4;8379:3;8368:9;8364:19;8356:27;;8393:69;8459:1;8448:9;8444:17;8435:6;8393:69;:::i;:::-;8509:9;8503:4;8499:20;8494:2;8483:9;8479:18;8472:48;8537:78;8610:4;8601:6;8537:78;:::i;:::-;8529:86;;8662:9;8656:4;8652:20;8647:2;8636:9;8632:18;8625:48;8690:78;8763:4;8754:6;8690:78;:::i;:::-;8682:86;;8778:72;8846:2;8835:9;8831:18;8822:6;8778:72;:::i;:::-;8860:73;8928:3;8917:9;8913:19;8904:6;8860:73;:::i;:::-;8943;9011:3;9000:9;8996:19;8987:6;8943:73;:::i;:::-;9064:9;9058:4;9054:20;9048:3;9037:9;9033:19;9026:49;9092:108;9195:4;9186:6;9092:108;:::i;:::-;9084:116;;7992:1215;;;;;;;;;;:::o;9213:118::-;9284:22;9300:5;9284:22;:::i;:::-;9277:5;9274:33;9264:61;;9321:1;9318;9311:12;9264:61;9213:118;:::o;9337:135::-;9381:5;9419:6;9406:20;9397:29;;9435:31;9460:5;9435:31;:::i;:::-;9337:135;;;;:::o;9478:122::-;9551:24;9569:5;9551:24;:::i;:::-;9544:5;9541:35;9531:63;;9590:1;9587;9580:12;9531:63;9478:122;:::o;9606:139::-;9652:5;9690:6;9677:20;9668:29;;9706:33;9733:5;9706:33;:::i;:::-;9606:139;;;;:::o;9751:1199::-;9862:6;9870;9878;9886;9894;9902;9910;9959:3;9947:9;9938:7;9934:23;9930:33;9927:120;;;9966:79;;:::i;:::-;9927:120;10086:1;10111:53;10156:7;10147:6;10136:9;10132:22;10111:53;:::i;:::-;10101:63;;10057:117;10213:2;10239:53;10284:7;10275:6;10264:9;10260:22;10239:53;:::i;:::-;10229:63;;10184:118;10341:2;10367:53;10412:7;10403:6;10392:9;10388:22;10367:53;:::i;:::-;10357:63;;10312:118;10469:2;10495:53;10540:7;10531:6;10520:9;10516:22;10495:53;:::i;:::-;10485:63;;10440:118;10597:3;10624:51;10667:7;10658:6;10647:9;10643:22;10624:51;:::i;:::-;10614:61;;10568:117;10724:3;10751:53;10796:7;10787:6;10776:9;10772:22;10751:53;:::i;:::-;10741:63;;10695:119;10853:3;10880:53;10925:7;10916:6;10905:9;10901:22;10880:53;:::i;:::-;10870:63;;10824:119;9751:1199;;;;;;;;;;:::o;10956:474::-;11024:6;11032;11081:2;11069:9;11060:7;11056:23;11052:32;11049:119;;;11087:79;;:::i;:::-;11049:119;11207:1;11232:53;11277:7;11268:6;11257:9;11253:22;11232:53;:::i;:::-;11222:63;;11178:117;11334:2;11360:53;11405:7;11396:6;11385:9;11381:22;11360:53;:::i;:::-;11350:63;;11305:118;10956:474;;;;;:::o;11436:180::-;11484:77;11481:1;11474:88;11581:4;11578:1;11571:15;11605:4;11602:1;11595:15;11622:320;11666:6;11703:1;11697:4;11693:12;11683:22;;11750:1;11744:4;11740:12;11771:18;11761:81;;11827:4;11819:6;11815:17;11805:27;;11761:81;11889:2;11881:6;11878:14;11858:18;11855:38;11852:84;;11908:18;;:::i;:::-;11852:84;11673:269;11622:320;;;:::o;11948:180::-;11996:77;11993:1;11986:88;12093:4;12090:1;12083:15;12117:4;12114:1;12107:15;12134:191;12174:3;12193:20;12211:1;12193:20;:::i;:::-;12188:25;;12227:20;12245:1;12227:20;:::i;:::-;12222:25;;12270:1;12267;12263:9;12256:16;;12291:3;12288:1;12285:10;12282:36;;;12298:18;;:::i;:::-;12282:36;12134:191;;;;:::o;12331:180::-;12379:77;12376:1;12369:88;12476:4;12473:1;12466:15;12500:4;12497:1;12490:15;12517:224;12657:34;12653:1;12645:6;12641:14;12634:58;12726:7;12721:2;12713:6;12709:15;12702:32;12517:224;:::o;12747:366::-;12889:3;12910:67;12974:2;12969:3;12910:67;:::i;:::-;12903:74;;12986:93;13075:3;12986:93;:::i;:::-;13104:2;13099:3;13095:12;13088:19;;12747:366;;;:::o;13119:419::-;13285:4;13323:2;13312:9;13308:18;13300:26;;13372:9;13366:4;13362:20;13358:1;13347:9;13343:17;13336:47;13400:131;13526:4;13400:131;:::i;:::-;13392:139;;13119:419;;;:::o;13544:179::-;13684:31;13680:1;13672:6;13668:14;13661:55;13544:179;:::o;13729:366::-;13871:3;13892:67;13956:2;13951:3;13892:67;:::i;:::-;13885:74;;13968:93;14057:3;13968:93;:::i;:::-;14086:2;14081:3;14077:12;14070:19;;13729:366;;;:::o;14101:419::-;14267:4;14305:2;14294:9;14290:18;14282:26;;14354:9;14348:4;14344:20;14340:1;14329:9;14325:17;14318:47;14382:131;14508:4;14382:131;:::i;:::-;14374:139;;14101:419;;;:::o;14526:775::-;14759:4;14797:3;14786:9;14782:19;14774:27;;14811:71;14879:1;14868:9;14864:17;14855:6;14811:71;:::i;:::-;14892:72;14960:2;14949:9;14945:18;14936:6;14892:72;:::i;:::-;14974;15042:2;15031:9;15027:18;15018:6;14974:72;:::i;:::-;15056;15124:2;15113:9;15109:18;15100:6;15056:72;:::i;:::-;15138:73;15206:3;15195:9;15191:19;15182:6;15138:73;:::i;:::-;15221;15289:3;15278:9;15274:19;15265:6;15221:73;:::i;:::-;14526:775;;;;;;;;;:::o;15307:180::-;15447:32;15443:1;15435:6;15431:14;15424:56;15307:180;:::o;15493:366::-;15635:3;15656:67;15720:2;15715:3;15656:67;:::i;:::-;15649:74;;15732:93;15821:3;15732:93;:::i;:::-;15850:2;15845:3;15841:12;15834:19;;15493:366;;;:::o;15865:419::-;16031:4;16069:2;16058:9;16054:18;16046:26;;16118:9;16112:4;16108:20;16104:1;16093:9;16089:17;16082:47;16146:131;16272:4;16146:131;:::i;:::-;16138:139;;15865:419;;;:::o;16290:141::-;16339:4;16362:3;16354:11;;16385:3;16382:1;16375:14;16419:4;16416:1;16406:18;16398:26;;16290:141;;;:::o;16437:93::-;16474:6;16521:2;16516;16509:5;16505:14;16501:23;16491:33;;16437:93;;;:::o;16536:107::-;16580:8;16630:5;16624:4;16620:16;16599:37;;16536:107;;;;:::o;16649:393::-;16718:6;16768:1;16756:10;16752:18;16791:97;16821:66;16810:9;16791:97;:::i;:::-;16909:39;16939:8;16928:9;16909:39;:::i;:::-;16897:51;;16981:4;16977:9;16970:5;16966:21;16957:30;;17030:4;17020:8;17016:19;17009:5;17006:30;16996:40;;16725:317;;16649:393;;;;;:::o;17048:60::-;17076:3;17097:5;17090:12;;17048:60;;;:::o;17114:142::-;17164:9;17197:53;17215:34;17224:24;17242:5;17224:24;:::i;:::-;17215:34;:::i;:::-;17197:53;:::i;:::-;17184:66;;17114:142;;;:::o;17262:75::-;17305:3;17326:5;17319:12;;17262:75;;;:::o;17343:269::-;17453:39;17484:7;17453:39;:::i;:::-;17514:91;17563:41;17587:16;17563:41;:::i;:::-;17555:6;17548:4;17542:11;17514:91;:::i;:::-;17508:4;17501:105;17419:193;17343:269;;;:::o;17618:73::-;17663:3;17618:73;:::o;17697:189::-;17774:32;;:::i;:::-;17815:65;17873:6;17865;17859:4;17815:65;:::i;:::-;17750:136;17697:189;;:::o;17892:186::-;17952:120;17969:3;17962:5;17959:14;17952:120;;;18023:39;18060:1;18053:5;18023:39;:::i;:::-;17996:1;17989:5;17985:13;17976:22;;17952:120;;;17892:186;;:::o;18084:543::-;18185:2;18180:3;18177:11;18174:446;;;18219:38;18251:5;18219:38;:::i;:::-;18303:29;18321:10;18303:29;:::i;:::-;18293:8;18289:44;18486:2;18474:10;18471:18;18468:49;;;18507:8;18492:23;;18468:49;18530:80;18586:22;18604:3;18586:22;:::i;:::-;18576:8;18572:37;18559:11;18530:80;:::i;:::-;18189:431;;18174:446;18084:543;;;:::o;18633:117::-;18687:8;18737:5;18731:4;18727:16;18706:37;;18633:117;;;;:::o;18756:169::-;18800:6;18833:51;18881:1;18877:6;18869:5;18866:1;18862:13;18833:51;:::i;:::-;18829:56;18914:4;18908;18904:15;18894:25;;18807:118;18756:169;;;;:::o;18930:295::-;19006:4;19152:29;19177:3;19171:4;19152:29;:::i;:::-;19144:37;;19214:3;19211:1;19207:11;19201:4;19198:21;19190:29;;18930:295;;;;:::o;19230:1395::-;19347:37;19380:3;19347:37;:::i;:::-;19449:18;19441:6;19438:30;19435:56;;;19471:18;;:::i;:::-;19435:56;19515:38;19547:4;19541:11;19515:38;:::i;:::-;19600:67;19660:6;19652;19646:4;19600:67;:::i;:::-;19694:1;19718:4;19705:17;;19750:2;19742:6;19739:14;19767:1;19762:618;;;;20424:1;20441:6;20438:77;;;20490:9;20485:3;20481:19;20475:26;20466:35;;20438:77;20541:67;20601:6;20594:5;20541:67;:::i;:::-;20535:4;20528:81;20397:222;19732:887;;19762:618;19814:4;19810:9;19802:6;19798:22;19848:37;19880:4;19848:37;:::i;:::-;19907:1;19921:208;19935:7;19932:1;19929:14;19921:208;;;20014:9;20009:3;20005:19;19999:26;19991:6;19984:42;20065:1;20057:6;20053:14;20043:24;;20112:2;20101:9;20097:18;20084:31;;19958:4;19955:1;19951:12;19946:17;;19921:208;;;20157:6;20148:7;20145:19;20142:179;;;20215:9;20210:3;20206:19;20200:26;20258:48;20300:4;20292:6;20288:17;20277:9;20258:48;:::i;:::-;20250:6;20243:64;20165:156;20142:179;20367:1;20363;20355:6;20351:14;20347:22;20341:4;20334:36;19769:611;;;19732:887;;19322:1303;;;19230:1395;;:::o;20631:223::-;20771:34;20767:1;20759:6;20755:14;20748:58;20840:6;20835:2;20827:6;20823:15;20816:31;20631:223;:::o;20860:366::-;21002:3;21023:67;21087:2;21082:3;21023:67;:::i;:::-;21016:74;;21099:93;21188:3;21099:93;:::i;:::-;21217:2;21212:3;21208:12;21201:19;;20860:366;;;:::o;21232:419::-;21398:4;21436:2;21425:9;21421:18;21413:26;;21485:9;21479:4;21475:20;21471:1;21460:9;21456:17;21449:47;21513:131;21639:4;21513:131;:::i;:::-;21505:139;;21232:419;;;:::o;21657:221::-;21797:34;21793:1;21785:6;21781:14;21774:58;21866:4;21861:2;21853:6;21849:15;21842:29;21657:221;:::o;21884:366::-;22026:3;22047:67;22111:2;22106:3;22047:67;:::i;:::-;22040:74;;22123:93;22212:3;22123:93;:::i;:::-;22241:2;22236:3;22232:12;22225:19;;21884:366;;;:::o;22256:419::-;22422:4;22460:2;22449:9;22445:18;22437:26;;22509:9;22503:4;22499:20;22495:1;22484:9;22480:17;22473:47;22537:131;22663:4;22537:131;:::i;:::-;22529:139;;22256:419;;;:::o;22681:179::-;22821:31;22817:1;22809:6;22805:14;22798:55;22681:179;:::o;22866:366::-;23008:3;23029:67;23093:2;23088:3;23029:67;:::i;:::-;23022:74;;23105:93;23194:3;23105:93;:::i;:::-;23223:2;23218:3;23214:12;23207:19;;22866:366;;;:::o;23238:419::-;23404:4;23442:2;23431:9;23427:18;23419:26;;23491:9;23485:4;23481:20;23477:1;23466:9;23462:17;23455:47;23519:131;23645:4;23519:131;:::i;:::-;23511:139;;23238:419;;;:::o;23663:224::-;23803:34;23799:1;23791:6;23787:14;23780:58;23872:7;23867:2;23859:6;23855:15;23848:32;23663:224;:::o;23893:366::-;24035:3;24056:67;24120:2;24115:3;24056:67;:::i;:::-;24049:74;;24132:93;24221:3;24132:93;:::i;:::-;24250:2;24245:3;24241:12;24234:19;;23893:366;;;:::o;24265:419::-;24431:4;24469:2;24458:9;24454:18;24446:26;;24518:9;24512:4;24508:20;24504:1;24493:9;24489:17;24482:47;24546:131;24672:4;24546:131;:::i;:::-;24538:139;;24265:419;;;:::o;24690:222::-;24830:34;24826:1;24818:6;24814:14;24807:58;24899:5;24894:2;24886:6;24882:15;24875:30;24690:222;:::o;24918:366::-;25060:3;25081:67;25145:2;25140:3;25081:67;:::i;:::-;25074:74;;25157:93;25246:3;25157:93;:::i;:::-;25275:2;25270:3;25266:12;25259:19;;24918:366;;;:::o;25290:419::-;25456:4;25494:2;25483:9;25479:18;25471:26;;25543:9;25537:4;25533:20;25529:1;25518:9;25514:17;25507:47;25571:131;25697:4;25571:131;:::i;:::-;25563:139;;25290:419;;;:::o;25715:225::-;25855:34;25851:1;25843:6;25839:14;25832:58;25924:8;25919:2;25911:6;25907:15;25900:33;25715:225;:::o;25946:366::-;26088:3;26109:67;26173:2;26168:3;26109:67;:::i;:::-;26102:74;;26185:93;26274:3;26185:93;:::i;:::-;26303:2;26298:3;26294:12;26287:19;;25946:366;;;:::o;26318:419::-;26484:4;26522:2;26511:9;26507:18;26499:26;;26571:9;26565:4;26561:20;26557:1;26546:9;26542:17;26535:47;26599:131;26725:4;26599:131;:::i;:::-;26591:139;;26318:419;;;:::o;26743:220::-;26883:34;26879:1;26871:6;26867:14;26860:58;26952:3;26947:2;26939:6;26935:15;26928:28;26743:220;:::o;26969:366::-;27111:3;27132:67;27196:2;27191:3;27132:67;:::i;:::-;27125:74;;27208:93;27297:3;27208:93;:::i;:::-;27326:2;27321:3;27317:12;27310:19;;26969:366;;;:::o;27341:419::-;27507:4;27545:2;27534:9;27530:18;27522:26;;27594:9;27588:4;27584:20;27580:1;27569:9;27565:17;27558:47;27622:131;27748:4;27622:131;:::i;:::-;27614:139;;27341:419;;;:::o;27766:221::-;27906:34;27902:1;27894:6;27890:14;27883:58;27975:4;27970:2;27962:6;27958:15;27951:29;27766:221;:::o;27993:366::-;28135:3;28156:67;28220:2;28215:3;28156:67;:::i;:::-;28149:74;;28232:93;28321:3;28232:93;:::i;:::-;28350:2;28345:3;28341:12;28334:19;;27993:366;;;:::o;28365:419::-;28531:4;28569:2;28558:9;28554:18;28546:26;;28618:9;28612:4;28608:20;28604:1;28593:9;28589:17;28582:47;28646:131;28772:4;28646:131;:::i;:::-;28638:139;;28365:419;;;:::o;28790:98::-;28841:6;28875:5;28869:12;28859:22;;28790:98;;;:::o;28894:116::-;28945:4;28968:3;28960:11;;28998:4;28993:3;28989:14;28981:22;;28894:116;;;:::o;29016:154::-;29059:11;29095:29;29119:3;29113:10;29095:29;:::i;:::-;29158:5;29134:29;;29071:99;29016:154;;;:::o;29176:594::-;29260:5;29291:38;29323:5;29291:38;:::i;:::-;29354:5;29381:40;29415:5;29381:40;:::i;:::-;29369:52;;29440:35;29466:8;29440:35;:::i;:::-;29431:44;;29499:2;29491:6;29488:14;29485:278;;;29570:169;29655:66;29625:6;29621:2;29617:15;29614:1;29610:23;29570:169;:::i;:::-;29547:5;29526:227;29517:236;;29485:278;29266:504;;29176:594;;;:::o;29776:664::-;29981:4;30019:3;30008:9;30004:19;29996:27;;30033:71;30101:1;30090:9;30086:17;30077:6;30033:71;:::i;:::-;30114:72;30182:2;30171:9;30167:18;30158:6;30114:72;:::i;:::-;30196;30264:2;30253:9;30249:18;30240:6;30196:72;:::i;:::-;30278;30346:2;30335:9;30331:18;30322:6;30278:72;:::i;:::-;30360:73;30428:3;30417:9;30413:19;30404:6;30360:73;:::i;:::-;29776:664;;;;;;;;:::o;30446:545::-;30619:4;30657:3;30646:9;30642:19;30634:27;;30671:71;30739:1;30728:9;30724:17;30715:6;30671:71;:::i;:::-;30752:68;30816:2;30805:9;30801:18;30792:6;30752:68;:::i;:::-;30830:72;30898:2;30887:9;30883:18;30874:6;30830:72;:::i;:::-;30912;30980:2;30969:9;30965:18;30956:6;30912:72;:::i;:::-;30446:545;;;;;;;:::o;30997:180::-;31045:77;31042:1;31035:88;31142:4;31139:1;31132:15;31166:4;31163:1;31156:15;31183:174;31323:26;31319:1;31311:6;31307:14;31300:50;31183:174;:::o;31363:366::-;31505:3;31526:67;31590:2;31585:3;31526:67;:::i;:::-;31519:74;;31602:93;31691:3;31602:93;:::i;:::-;31720:2;31715:3;31711:12;31704:19;;31363:366;;;:::o;31735:419::-;31901:4;31939:2;31928:9;31924:18;31916:26;;31988:9;31982:4;31978:20;31974:1;31963:9;31959:17;31952:47;32016:131;32142:4;32016:131;:::i;:::-;32008:139;;31735:419;;;:::o;32160:181::-;32300:33;32296:1;32288:6;32284:14;32277:57;32160:181;:::o;32347:366::-;32489:3;32510:67;32574:2;32569:3;32510:67;:::i;:::-;32503:74;;32586:93;32675:3;32586:93;:::i;:::-;32704:2;32699:3;32695:12;32688:19;;32347:366;;;:::o;32719:419::-;32885:4;32923:2;32912:9;32908:18;32900:26;;32972:9;32966:4;32962:20;32958:1;32947:9;32943:17;32936:47;33000:131;33126:4;33000:131;:::i;:::-;32992:139;;32719:419;;;:::o;33144:221::-;33284:34;33280:1;33272:6;33268:14;33261:58;33353:4;33348:2;33340:6;33336:15;33329:29;33144:221;:::o;33371:366::-;33513:3;33534:67;33598:2;33593:3;33534:67;:::i;:::-;33527:74;;33610:93;33699:3;33610:93;:::i;:::-;33728:2;33723:3;33719:12;33712:19;;33371:366;;;:::o;33743:419::-;33909:4;33947:2;33936:9;33932:18;33924:26;;33996:9;33990:4;33986:20;33982:1;33971:9;33967:17;33960:47;34024:131;34150:4;34024:131;:::i;:::-;34016:139;;33743:419;;;:::o
Swarm Source
ipfs://22a124a435fec57e6b7150738f5f9c05eb1de8c3ee0a3a4f470183000d67188f
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.