diff --git a/Makefile.genericwallet b/Makefile.genericwallet index 5f78ce8..9ec6ed5 100755 --- a/Makefile.genericwallet +++ b/Makefile.genericwallet @@ -20,30 +20,68 @@ $(error Environment variable BOLOS_SDK is not set) endif include $(BOLOS_SDK)/Makefile.defines +APP_LOAD_FLAGS= --appFlags 0x40 --dep Ethereum +DEFINES_LIB = USE_LIB_ETHEREUM +APP_LOAD_PARAMS= --curve secp256k1 $(COMMON_LOAD_PARAMS) APPVERSION_M=1 -APPVERSION_N=0 -APPVERSION_P=22 +APPVERSION_N=1 +APPVERSION_P=2 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) + +ifeq ($(CHAIN),) +CHAIN=ethereum +endif + ifeq ($(CHAIN),ethereum) -APP_LOAD_PARAMS += --path "44'/60'" --path "44'/61'" -DEFINES += CHAINID_UPCASE=\"ETHEREUM\" CHAINID_COINNAME=\"ETH\" CHAINID_NAME=\"Ethereum\" CHAINID=$(CHAIN) CHAIN_TYPE_ETHEREUM -APPNAME = Ethereum +#TODO : Fix in 1.4.3 +#APP_LOAD_PARAMS += --path "44'/60'" +APP_LOAD_PARAMS += --path "44'" +DEFINES += CHAINID_UPCASE=\"ETHEREUM\" CHAINID_COINNAME=\"ETH\" CHAIN_KIND=CHAIN_KIND_ETHEREUM CHAIN_ID=0 +APPNAME = "Ethereum" +DEFINES_LIB= +APP_LOAD_FLAGS=--appFlags 0x840 +else ifeq ($(CHAIN),ethereum_classic) +APP_LOAD_PARAMS += --path "44'/61'" +DEFINES += CHAINID_UPCASE=\"ETC\" CHAINID_COINNAME=\"ETC\" CHAIN_KIND=CHAIN_KIND_ETHEREUM_CLASSIC CHAIN_ID=61 +APPNAME = "ETC" else ifeq ($(CHAIN),expanse) APP_LOAD_PARAMS += --path "44'/40'" -DEFINES += CHAINID_UPCASE=\"EXPANSE\" CHAINID_COINNAME=\"EXP\" CHAINID_NAME=\"Expanse\" CHAINID=$(CHAIN) CHAIN_TYPE_EXPANSE -APPNAME = Expanse +DEFINES += CHAINID_UPCASE=\"EXPANSE\" CHAINID_COINNAME=\"EXP\" CHAIN_KIND=CHAIN_KIND_EXPANSE CHAIN_ID=2 +APPNAME = "Expanse" +else ifeq ($(CHAIN),poa) +APP_LOAD_PARAMS += --path "44'/60'" +DEFINES += CHAINID_UPCASE=\"POA\" CHAINID_COINNAME=\"POA\" CHAIN_KIND=CHAIN_KIND_POA CHAIN_ID=99 +APPNAME = "POA" +else ifeq ($(CHAIN),rsk) +APP_LOAD_PARAMS += --path "44'/137'" +DEFINES += CHAINID_UPCASE=\"RSK\" CHAINID_COINNAME=\"SBTC\" CHAIN_KIND=CHAIN_KIND_RSK CHAIN_ID=30 +APPNAME = "RSK" +else ifeq ($(CHAIN),rsk_testnet) +APP_LOAD_PARAMS += --path "44'/37310'" +DEFINES += CHAINID_UPCASE=\"RSKTESTNET\" CHAINID_COINNAME=\"SBTC\" CHAIN_KIND=CHAIN_KIND_RSK CHAIN_ID=31 +APPNAME = "RSK Test" else ifeq ($(CHAIN),ubiq) APP_LOAD_PARAMS += --path "44'/108'" -DEFINES += CHAINID_UPCASE=\"UBIQ\" CHAINID_COINNAME=\"UBQ\" CHAINID_NAME=\"Ubiq\" CHAINID=$(CHAIN) CHAIN_TYPE_UBIQ -APPNAME = Ubiq +DEFINES += CHAINID_UPCASE=\"UBIQ\" CHAINID_COINNAME=\"UBQ\" CHAIN_KIND=CHAIN_KIND_UBIQ CHAIN_ID=8 +APPNAME = "Ubiq" +else ifeq ($(CHAIN),wanchain) +APP_LOAD_PARAMS += --path "44'/5718350'" +DEFINES += CHAINID_UPCASE=\"WAN\" CHAINID_COINNAME=\"WAN\" CHAIN_KIND=CHAIN_KIND_WANCHAIN CHAIN_ID=1 +APPNAME = "Wanchain" +else ifeq ($(CHAIN),kusd) +APP_LOAD_PARAMS += --path "44'/91927009'" +DEFINES += CHAINID_UPCASE=\"KUSD\" CHAINID_COINNAME=\"KUSD\" CHAIN_KIND=CHAIN_KIND_KUSD CHAIN_ID=2 +APPNAME = "KUSD" else ifeq ($(filter clean,$(MAKECMDGOALS)),) -$(error Unsupported CHAIN - use ethereum, expanse, ubiq) +$(error Unsupported CHAIN - use ethereum, ethereum_classic, expanse, poa, rsk, rsk_testnet, ubiq, wanchain, kusd) endif endif -APP_LOAD_PARAMS += --appFlags 0x40 --path "44'/1'" --curve secp256k1 $(COMMON_LOAD_PARAMS) + +APP_LOAD_PARAMS += $(APP_LOAD_FLAGS) --path "44'/1'" +DEFINES += $(DEFINES_LIB) #prepare hsm generation ifeq ($(TARGET_NAME),TARGET_BLUE) @@ -66,21 +104,39 @@ DEFINES += HAVE_BAGL HAVE_SPRINTF #DEFINES += HAVE_PRINTF PRINTF=screen_printf DEFINES += PRINTF\(...\)= DEFINES += HAVE_IO_USB HAVE_L4_USBLIB IO_USB_MAX_ENDPOINTS=6 IO_HID_EP_LENGTH=64 HAVE_USB_APDU -DEFINES += LEDGER_MAJOR_VERSION=$(APPVERSION_M) LEDGER_MINOR_VERSION=$(APPVERSION_N) LEDGER_PATCH_VERSION=$(APPVERSION_P) +DEFINES += LEDGER_MAJOR_VERSION=$(APPVERSION_M) LEDGER_MINOR_VERSION=$(APPVERSION_N) LEDGER_PATCH_VERSION=$(APPVERSION_P) # U2F -DEFINES += HAVE_U2F +DEFINES += HAVE_U2F HAVE_IO_U2F +DEFINES += U2F_PROXY_MAGIC=\"w0w\" DEFINES += USB_SEGMENT_SIZE=64 DEFINES += BLE_SEGMENT_SIZE=32 #max MTU, min 20 -DEFINES += U2F_MAX_MESSAGE_SIZE=264 #257+5+2 + +WEBUSB_URL = www.ledgerwallet.com +DEFINES += HAVE_WEBUSB WEBUSB_URL_SIZE_B=$(shell echo -n $(WEBUSB_URL) | wc -c) WEBUSB_URL=$(shell echo -n $(WEBUSB_URL) | sed -e "s/./\\\'\0\\\',/g") + DEFINES += UNUSED\(x\)=\(void\)x DEFINES += APPVERSION=\"$(APPVERSION)\" +DEFINES += CX_COMPLIANCE_141 + ############## # Compiler # ############## -#GCCPATH := $(BOLOS_ENV)/gcc-arm-none-eabi-5_3-2016q1/bin/ -#CLANGPATH := $(BOLOS_ENV)/clang-arm-fropi/bin/ +ifneq ($(BOLOS_ENV),) +$(info BOLOS_ENV=$(BOLOS_ENV)) +CLANGPATH := $(BOLOS_ENV)/clang-arm-fropi/bin/ +GCCPATH := $(BOLOS_ENV)/gcc-arm-none-eabi-5_3-2016q1/bin/ +else +$(info BOLOS_ENV is not set: falling back to CLANGPATH and GCCPATH) +endif +ifeq ($(CLANGPATH),) +$(info CLANGPATH is not set: clang will be used from PATH) +endif +ifeq ($(GCCPATH),) +$(info GCCPATH is not set: arm-none-eabi-* will be used from PATH) +endif + CC := $(CLANGPATH)clang #CFLAGS += -O0 @@ -95,10 +151,9 @@ LDLIBS += -lm -lgcc -lc # import rules to compile glyphs(/pone) include $(BOLOS_SDK)/Makefile.glyphs -### computed variables +### variables processed by the common makefile.rules of the SDK to grab source files and include dirs APP_SOURCE_PATH += src_genericwallet src_common src -SDK_SOURCE_PATH += lib_stusb - +SDK_SOURCE_PATH += lib_stusb lib_stusb_impl lib_u2f load: all python -m ledgerblue.loadApp $(APP_LOAD_PARAMS) diff --git a/blue_app_ethereum_classic.gif b/blue_app_ethereum_classic.gif new file mode 100644 index 0000000..c3d5c4e Binary files /dev/null and b/blue_app_ethereum_classic.gif differ diff --git a/blue_app_poa.gif b/blue_app_poa.gif new file mode 100644 index 0000000..fdb78be Binary files /dev/null and b/blue_app_poa.gif differ diff --git a/blue_app_rsk.gif b/blue_app_rsk.gif new file mode 100644 index 0000000..c3d5c4e Binary files /dev/null and b/blue_app_rsk.gif differ diff --git a/blue_app_rsk_testnet.gif b/blue_app_rsk_testnet.gif new file mode 100644 index 0000000..c3d5c4e Binary files /dev/null and b/blue_app_rsk_testnet.gif differ diff --git a/blue_app_wanchain.gif b/blue_app_wanchain.gif new file mode 100644 index 0000000..6b626ff Binary files /dev/null and b/blue_app_wanchain.gif differ diff --git a/glyphs/blue_badge_ethereum_classic.gif b/glyphs/blue_badge_ethereum_classic.gif new file mode 100644 index 0000000..5174214 Binary files /dev/null and b/glyphs/blue_badge_ethereum_classic.gif differ diff --git a/glyphs/blue_badge_poa.gif b/glyphs/blue_badge_poa.gif new file mode 100644 index 0000000..fa8d59e Binary files /dev/null and b/glyphs/blue_badge_poa.gif differ diff --git a/glyphs/blue_badge_rsk.gif b/glyphs/blue_badge_rsk.gif new file mode 100644 index 0000000..5174214 Binary files /dev/null and b/glyphs/blue_badge_rsk.gif differ diff --git a/glyphs/blue_badge_rsk_testnet.gif b/glyphs/blue_badge_rsk_testnet.gif new file mode 100644 index 0000000..5174214 Binary files /dev/null and b/glyphs/blue_badge_rsk_testnet.gif differ diff --git a/glyphs/blue_badge_wanchain.gif b/glyphs/blue_badge_wanchain.gif new file mode 100644 index 0000000..6b626ff Binary files /dev/null and b/glyphs/blue_badge_wanchain.gif differ diff --git a/glyphs/nanos_badge_ethereum_classic.gif b/glyphs/nanos_badge_ethereum_classic.gif new file mode 100644 index 0000000..776f645 Binary files /dev/null and b/glyphs/nanos_badge_ethereum_classic.gif differ diff --git a/glyphs/nanos_badge_kusd.gif b/glyphs/nanos_badge_kusd.gif new file mode 100644 index 0000000..959be24 Binary files /dev/null and b/glyphs/nanos_badge_kusd.gif differ diff --git a/glyphs/nanos_badge_poa.gif b/glyphs/nanos_badge_poa.gif new file mode 100644 index 0000000..6fa73cc Binary files /dev/null and b/glyphs/nanos_badge_poa.gif differ diff --git a/glyphs/nanos_badge_rsk.gif b/glyphs/nanos_badge_rsk.gif new file mode 100644 index 0000000..776f645 Binary files /dev/null and b/glyphs/nanos_badge_rsk.gif differ diff --git a/glyphs/nanos_badge_rsk_testnet.gif b/glyphs/nanos_badge_rsk_testnet.gif new file mode 100644 index 0000000..776f645 Binary files /dev/null and b/glyphs/nanos_badge_rsk_testnet.gif differ diff --git a/glyphs/nanos_badge_wanchain.gif b/glyphs/nanos_badge_wanchain.gif new file mode 100644 index 0000000..aa61a1c Binary files /dev/null and b/glyphs/nanos_badge_wanchain.gif differ diff --git a/nanos_app_kusd.gif b/nanos_app_kusd.gif new file mode 100644 index 0000000..959be24 Binary files /dev/null and b/nanos_app_kusd.gif differ diff --git a/nanos_app_poa.gif b/nanos_app_poa.gif new file mode 100644 index 0000000..6fa73cc Binary files /dev/null and b/nanos_app_poa.gif differ diff --git a/nanos_app_rsk.gif b/nanos_app_rsk.gif new file mode 100644 index 0000000..bfaff49 Binary files /dev/null and b/nanos_app_rsk.gif differ diff --git a/nanos_app_rsk_testnet.gif b/nanos_app_rsk_testnet.gif new file mode 100644 index 0000000..bfaff49 Binary files /dev/null and b/nanos_app_rsk_testnet.gif differ diff --git a/nanos_app_wanchain.gif b/nanos_app_wanchain.gif new file mode 100644 index 0000000..58f68c1 Binary files /dev/null and b/nanos_app_wanchain.gif differ diff --git a/src_common/ethUstream.c b/src_common/ethUstream.c index 716920a..9641ad1 100644 --- a/src_common/ethUstream.c +++ b/src_common/ethUstream.c @@ -46,7 +46,7 @@ uint8_t readTxByte(txContext_t *context) { context->currentFieldPos++; } if (!(context->processingField && context->fieldSingleByte)) { - cx_hash((cx_hash_t *)context->sha3, 0, &data, 1, NULL); + cx_hash((cx_hash_t*)context->sha3, 0, &data, 1, NULL); } return data; } @@ -60,8 +60,7 @@ void copyTxData(txContext_t *context, uint8_t *out, uint32_t length) { os_memmove(out, context->workBuffer, length); } if (!(context->processingField && context->fieldSingleByte)) { - cx_hash((cx_hash_t *)context->sha3, 0, context->workBuffer, length, - NULL); + cx_hash((cx_hash_t*)context->sha3, 0, context->workBuffer, length, NULL); } context->workBuffer += length; context->commandLength -= length; @@ -81,6 +80,30 @@ static void processContent(txContext_t *context) { context->processingField = false; } + +static void processType(txContext_t *context) { + if (context->currentFieldIsList) { + PRINTF("Invalid type for RLP_TYPE\n"); + THROW(EXCEPTION); + } + if (context->currentFieldLength > MAX_INT256) { + PRINTF("Invalid length for RLP_TYPE\n"); + THROW(EXCEPTION); + } + if (context->currentFieldPos < context->currentFieldLength) { + uint32_t copySize = + (context->commandLength < + ((context->currentFieldLength - context->currentFieldPos)) + ? context->commandLength + : context->currentFieldLength - context->currentFieldPos); + copyTxData(context, NULL, copySize); + } + if (context->currentFieldPos == context->currentFieldLength) { + context->currentField++; + context->processingField = false; + } +} + static void processNonce(txContext_t *context) { if (context->currentFieldIsList) { PRINTF("Invalid type for RLP_NONCE\n"); @@ -111,7 +134,7 @@ static void processStartGas(txContext_t *context) { } if (context->currentFieldLength > MAX_INT256) { PRINTF("Invalid length for RLP_STARTGAS %d\n", - context->currentFieldLength); + context->currentFieldLength); THROW(EXCEPTION); } if (context->currentFieldPos < context->currentFieldLength) { @@ -183,7 +206,7 @@ static void processValue(txContext_t *context) { } } -static void processTo(txContext_t *context) { +static void processTo(txContext_t *context) { if (context->currentFieldIsList) { PRINTF("Invalid type for RLP_TO\n"); THROW(EXCEPTION); @@ -191,7 +214,7 @@ static void processTo(txContext_t *context) { if (context->currentFieldLength > MAX_ADDRESS) { PRINTF("Invalid length for RLP_TO\n"); THROW(EXCEPTION); - } + } if (context->currentFieldPos < context->currentFieldLength) { uint32_t copySize = (context->commandLength < @@ -209,7 +232,7 @@ static void processTo(txContext_t *context) { } } -static void processData(txContext_t *context) { +static void processData(txContext_t *context) { if (context->currentFieldIsList) { PRINTF("Invalid type for RLP_DATA\n"); THROW(EXCEPTION); @@ -228,7 +251,7 @@ static void processData(txContext_t *context) { } } -static void processV(txContext_t *context) { +static void processV(txContext_t *context) { if (context->currentFieldIsList) { PRINTF("Invalid type for RLP_V\n"); THROW(EXCEPTION); @@ -236,14 +259,15 @@ static void processV(txContext_t *context) { if (context->currentFieldLength > MAX_V) { PRINTF("Invalid length for RLP_V\n"); THROW(EXCEPTION); - } + } if (context->currentFieldPos < context->currentFieldLength) { uint32_t copySize = (context->commandLength < ((context->currentFieldLength - context->currentFieldPos)) ? context->commandLength : context->currentFieldLength - context->currentFieldPos); - copyTxData(context, context->content->v + context->currentFieldPos, + copyTxData(context, + context->content->v + context->currentFieldPos, copySize); } if (context->currentFieldPos == context->currentFieldLength) { @@ -253,7 +277,8 @@ static void processV(txContext_t *context) { } } -static parserStatus_e processTxInternal(txContext_t *context) { + +static parserStatus_e processTxInternal(txContext_t *context, uint32_t processingFlags) { for (;;) { bool processedCustom = false; // EIP 155 style transasction @@ -261,8 +286,7 @@ static parserStatus_e processTxInternal(txContext_t *context) { return USTREAM_FINISHED; } // Old style transaction - if ((context->currentField == TX_RLP_V) && - (context->commandLength == 0)) { + if ((context->currentField == TX_RLP_V) && (context->commandLength == 0)) { context->content->vLength = 0; return USTREAM_FINISHED; } @@ -323,6 +347,12 @@ static parserStatus_e processTxInternal(txContext_t *context) { switch (context->currentField) { case TX_RLP_CONTENT: processContent(context); + if ((processingFlags & TX_FLAG_TYPE) == 0) { + context->currentField++; + } + break; + case TX_RLP_TYPE: + processType(context); break; case TX_RLP_NONCE: processNonce(context); @@ -356,13 +386,13 @@ static parserStatus_e processTxInternal(txContext_t *context) { } parserStatus_e processTx(txContext_t *context, uint8_t *buffer, - uint32_t length) { + uint32_t length, uint32_t processingFlags) { parserStatus_e result; BEGIN_TRY { TRY { context->workBuffer = buffer; context->commandLength = length; - result = processTxInternal(context); + result = processTxInternal(context, processingFlags); } CATCH_OTHER(e) { result = USTREAM_FAULT; diff --git a/src_common/ethUstream.h b/src_common/ethUstream.h index bd05700..b88326c 100644 --- a/src_common/ethUstream.h +++ b/src_common/ethUstream.h @@ -23,9 +23,12 @@ struct txContext_t; typedef bool (*ustreamProcess_t)(struct txContext_t *context); +#define TX_FLAG_TYPE 0x01 + typedef enum rlpTxField_e { TX_RLP_NONE = 0, TX_RLP_CONTENT, + TX_RLP_TYPE, TX_RLP_NONCE, TX_RLP_GASPRICE, TX_RLP_STARTGAS, @@ -80,6 +83,6 @@ typedef struct txContext_t { void initTx(txContext_t *context, cx_sha3_t *sha3, txContent_t *content, ustreamProcess_t customProcessor, void *extra); parserStatus_e processTx(txContext_t *context, uint8_t *buffer, - uint32_t length); + uint32_t length, uint32_t processingFlags); void copyTxData(txContext_t *context, uint8_t *out, uint32_t length); uint8_t readTxByte(txContext_t *context); diff --git a/src_common/ethUtils.c b/src_common/ethUtils.c index 8779997..8ae6f90 100644 --- a/src_common/ethUtils.c +++ b/src_common/ethUtils.c @@ -26,7 +26,7 @@ #include "os.h" #include "cx.h" #include -#include "ethUtils.h" +#include "ethUtils.h" bool rlpCanDecode(uint8_t *buffer, uint32_t bufferLength, bool *valid) { if (*buffer <= 0x7f) { @@ -115,14 +115,14 @@ bool rlpDecodeLength(uint8_t *buffer, uint32_t bufferLength, } void getEthAddressFromKey(cx_ecfp_public_key_t *publicKey, uint8_t *out, - cx_sha3_t *sha3Context) { + cx_sha3_t *sha3Context) { uint8_t hashAddress[32]; cx_keccak_init(sha3Context, 256); - cx_hash((cx_hash_t *)sha3Context, CX_LAST, publicKey->W + 1, 64, - hashAddress); + cx_hash((cx_hash_t*)sha3Context, CX_LAST, publicKey->W + 1, 64, hashAddress); os_memmove(out, hashAddress + 12, 20); } + #ifdef CHECKSUM_1 static const uint8_t const HEXDIGITS[] = "0123456789ABCDEF"; @@ -153,8 +153,7 @@ void getEthAddressStringFromKey(cx_ecfp_public_key_t *publicKey, uint8_t *out, cx_sha3_t *sha3Context) { uint8_t hashAddress[32]; cx_keccak_init(sha3Context, 256); - cx_hash((cx_hash_t *)sha3Context, CX_LAST, publicKey->W + 1, 64, - hashAddress); + cx_hash((cx_hash_t*)sha3Context, CX_LAST, publicKey->W + 1, 64, hashAddress); getEthAddressStringFromBinary(hashAddress + 12, out, sha3Context); } @@ -163,7 +162,7 @@ void getEthAddressStringFromBinary(uint8_t *address, uint8_t *out, uint8_t hashChecksum[32]; uint8_t i; cx_keccak_init(sha3Context, 256); - cx_hash((cx_hash_t *)sha3Context, CX_LAST, address, 20, hashChecksum); + cx_hash((cx_hash_t*)sha3Context, CX_LAST, address, 20, hashChecksum); for (i = 0; i < 40; i++) { out[i] = convertDigit(address, i, hashChecksum); } @@ -178,8 +177,7 @@ void getEthAddressStringFromKey(cx_ecfp_public_key_t *publicKey, uint8_t *out, cx_sha3_t *sha3Context) { uint8_t hashAddress[32]; cx_keccak_init(sha3Context, 256); - cx_hash((cx_hash_t *)sha3Context, CX_LAST, publicKey->W + 1, 64, - hashAddress); + cx_hash((cx_hash_t*)sha3Context, CX_LAST, publicKey->W + 1, 64, hashAddress); getEthAddressStringFromBinary(hashAddress + 12, out, sha3Context); } @@ -194,7 +192,7 @@ void getEthAddressStringFromBinary(uint8_t *address, uint8_t *out, tmp[2 * i + 1] = HEXDIGITS[digit & 0x0f]; } cx_keccak_init(sha3Context, 256); - cx_hash((cx_hash_t *)sha3Context, CX_LAST, tmp, 40, hashChecksum); + cx_hash((cx_hash_t*)sha3Context, CX_LAST, tmp, 40, hashChecksum); for (i = 0; i < 40; i++) { uint8_t hashDigit = hashChecksum[i / 2]; if ((i % 2) == 0) { @@ -220,12 +218,12 @@ bool adjustDecimals(char *src, uint32_t srcLength, char *target, uint32_t offset = 0; if ((srcLength == 1) && (*src == '0')) { if (targetLength < 2) { - return false; + return false; } target[0] = '0'; target[1] = '\0'; return true; - } + } if (srcLength <= decimals) { uint32_t delta = decimals - srcLength; if (targetLength < srcLength + 1 + 2 + delta) { @@ -271,8 +269,8 @@ bool adjustDecimals(char *src, uint32_t srcLength, char *target, if (lastZeroOffset != 0) { target[lastZeroOffset] = '\0'; if (target[lastZeroOffset - 1] == '.') { - target[lastZeroOffset - 1] = '\0'; - } + target[lastZeroOffset - 1] = '\0'; + } } return true; } diff --git a/src_common/ethUtils.h b/src_common/ethUtils.h index 836a9f2..b716938 100644 --- a/src_common/ethUtils.h +++ b/src_common/ethUtils.h @@ -36,7 +36,7 @@ bool rlpDecodeLength(uint8_t *buffer, uint32_t bufferLength, bool rlpCanDecode(uint8_t *buffer, uint32_t bufferLength, bool *valid); void getEthAddressFromKey(cx_ecfp_public_key_t *publicKey, uint8_t *out, - cx_sha3_t *sha3Context); + cx_sha3_t *sha3Context); void getEthAddressStringFromKey(cx_ecfp_public_key_t *publicKey, uint8_t *out, cx_sha3_t *sha3Context); diff --git a/src_genericwallet/chainConfig.h b/src_genericwallet/chainConfig.h new file mode 100644 index 0000000..5bf034a --- /dev/null +++ b/src_genericwallet/chainConfig.h @@ -0,0 +1,32 @@ +#include "os.h" + +#ifndef CHAIN_CONFIG_H + +#define CHAIN_CONFIG_H + +typedef enum chain_kind_e { + CHAIN_KIND_ETHEREUM, + CHAIN_KIND_ETHEREUM_CLASSIC, + CHAIN_KIND_EXPANSE, + CHAIN_KIND_POA, + CHAIN_KIND_RSK, + CHAIN_KIND_UBIQ, + CHAIN_KIND_WANCHAIN, + CHAIN_KIND_KUSD +} chain_kind_t; + +typedef struct chain_config_s { + const char* coinName; // ticker + uint32_t chainId; + chain_kind_t kind; + +#ifdef TARGET_BLUE + const char* header_text; + unsigned int color_header; + unsigned int color_dashboard; +#endif // TARGET_BLUE + +} chain_config_t; + +#endif + diff --git a/src_genericwallet/main.c b/src_genericwallet/main.c index 0d11101..1134015 100644 --- a/src_genericwallet/main.c +++ b/src_genericwallet/main.c @@ -17,11 +17,12 @@ #include "os.h" #include "cx.h" -#include +#include "stdbool.h" #include "ethUstream.h" #include "ethUtils.h" #include "uint256.h" #include "tokens.h" +#include "chainConfig.h" #include "os_io_seproxyhal.h" #include "string.h" @@ -31,20 +32,9 @@ #define __NAME3(a, b, c) a##b##c #define NAME3(a, b, c) __NAME3(a, b, c) -#ifdef HAVE_U2F - -#include "u2f_service.h" -#include "u2f_transport.h" - -volatile unsigned char u2fMessageBuffer[U2F_MAX_MESSAGE_SIZE]; - -extern void USB_power_U2F(unsigned char enabled, unsigned char fido); -extern bool fidoActivated; - -#endif - unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; + unsigned int io_seproxyhal_touch_settings(const bagl_element_t *e); unsigned int io_seproxyhal_touch_exit(const bagl_element_t *e); unsigned int io_seproxyhal_touch_tx_ok(const bagl_element_t *e); @@ -80,8 +70,7 @@ uint32_t set_result_get_publicKey(void); #define WEI_TO_ETHER 18 -static const uint8_t const TOKEN_TRANSFER_ID[] = {0xa9, 0x05, 0x9c, 0xbb}; -static const uint8_t const TICKER_ETH[] = CHAINID_COINNAME " "; +static const uint8_t const TOKEN_TRANSFER_ID[] = { 0xa9, 0x05, 0x9c, 0xbb }; typedef struct tokenContext_t { uint8_t data[4 + 32 + 32]; uint32_t dataFieldPos; @@ -105,7 +94,7 @@ typedef struct messageSigningContext_t { uint8_t pathLength; uint32_t bip32Path[MAX_BIP32_PATH]; uint8_t hash[32]; - uint32_t remainingLength; + uint32_t remainingLength; } messageSigningContext_t; union { @@ -116,42 +105,34 @@ union { txContext_t txContext; union { - txContent_t txContent; - cx_sha256_t sha2; + txContent_t txContent; + cx_sha256_t sha2; } tmpContent; cx_sha3_t sha3; tokenContext_t tokenContext; -// volatile uint8_t dataAllowed; -// volatile uint8_t fidoTransport; +volatile uint8_t dataAllowed; volatile char addressSummary[32]; volatile char fullAddress[43]; volatile char fullAmount[50]; -volatile char maxFee[50]; +volatile char maxFee[60]; volatile bool dataPresent; volatile bool skipWarning; bagl_element_t tmp_element; -#ifdef HAVE_U2F - -volatile u2f_service_t u2fService; - -#endif - ux_state_t ux; // display stepped screens unsigned int ux_step; unsigned int ux_step_count; typedef struct internalStorage_t { - uint8_t dataAllowed; - uint8_t fidoTransport; - uint8_t initialized; + unsigned char dataAllowed; + uint8_t initialized; } internalStorage_t; WIDE internalStorage_t N_storage_real; -#define N_storage (*(WIDE internalStorage_t *)PIC(&N_storage_real)) +#define N_storage (*(WIDE internalStorage_t*) PIC(&N_storage_real)) static const char const CONTRACT_ADDRESS[] = "New contract"; @@ -161,6 +142,8 @@ static const char const SIGN_MAGIC[] = "\x19" const unsigned char hex_digits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; +chain_config_t *chainConfig; + void array_hexstr(char *strbuf, const void *bin, unsigned int len) { while (len--) { *strbuf++ = hex_digits[((*((char *)bin)) >> 4) & 0xF]; @@ -170,24 +153,13 @@ void array_hexstr(char *strbuf, const void *bin, unsigned int len) { *strbuf = 0; // EOS } -#ifdef HAVE_U2F -void u2f_proxy_response(u2f_service_t *service, unsigned int tx) { - os_memset(service->messageBuffer, 0, 5); - os_memmove(service->messageBuffer + 5, G_io_apdu_buffer, tx); - service->messageBuffer[tx + 5] = 0x90; - service->messageBuffer[tx + 6] = 0x00; - u2f_send_fragmented_response(service, U2F_CMD_MSG, service->messageBuffer, - tx + 7, true); +const bagl_element_t* ui_menu_item_out_over(const bagl_element_t* e) { + // the selection rectangle is after the none|touchable + e = (const bagl_element_t*)(((unsigned int)e)+sizeof(bagl_element_t)); + return e; } -#endif - -const bagl_element_t *ui_menu_item_out_over(const bagl_element_t *e) { - // the selection rectangle is after the none|touchable - e = (const bagl_element_t *)(((unsigned int)e) + sizeof(bagl_element_t)); - return e; -} #define BAGL_FONT_OPEN_SANS_LIGHT_16_22PX_AVG_WIDTH 10 #define BAGL_FONT_OPEN_SANS_REGULAR_10_13PX_AVG_WIDTH 8 @@ -198,638 +170,262 @@ const bagl_element_t *ui_menu_item_out_over(const bagl_element_t *e) { #define COLOR_APP_LIGHT 0x87dee6 #if defined(TARGET_BLUE) + +unsigned int map_color(unsigned int color) { + switch(color) { + case COLOR_APP: + return chainConfig->color_header; + + case COLOR_APP_LIGHT: + return chainConfig->color_dashboard; + } + return color; +} +void copy_element_and_map_coin_colors(const bagl_element_t* element) { + os_memmove(&tmp_element, element, sizeof(bagl_element_t)); + tmp_element.component.fgcolor = map_color(tmp_element.component.fgcolor); + tmp_element.component.bgcolor = map_color(tmp_element.component.bgcolor); + tmp_element.overfgcolor = map_color(tmp_element.overfgcolor); + tmp_element.overbgcolor = map_color(tmp_element.overbgcolor); +} + +const bagl_element_t *ui_idle_blue_prepro(const bagl_element_t *element) { + copy_element_and_map_coin_colors(element); + if (element->component.userid == 0x01) { + tmp_element.text = chainConfig->header_text; + } + return &tmp_element; +} + const bagl_element_t ui_idle_blue[] = { - // type userid x y w h str rad - // fill fg bg fid iid txt touchparams... ] - {{BAGL_RECTANGLE, 0x00, 0, 68, 320, 413, 0, 0, BAGL_FILL, COLOR_BG_1, - 0x000000, 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + // type userid x y w h str rad fill fg bg fid iid txt touchparams... ] + {{BAGL_RECTANGLE , 0x00, 0, 68, 320, 413, 0, 0, BAGL_FILL, COLOR_BG_1, 0x000000, 0 , 0 }, NULL, 0, 0, 0, NULL, NULL, NULL }, - // erase screen (only under the status bar) - {{BAGL_RECTANGLE, 0x00, 0, 20, 320, 48, 0, 0, BAGL_FILL, COLOR_APP, - COLOR_APP, 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + // erase screen (only under the status bar) + {{BAGL_RECTANGLE , 0x00, 0, 20, 320, 48, 0, 0, BAGL_FILL, COLOR_APP, COLOR_APP, 0 , 0 }, NULL, 0, 0, 0, NULL, NULL, NULL}, - /// TOP STATUS BAR - {{BAGL_LABELINE, 0x00, 0, 45, 320, 30, 0, 0, BAGL_FILL, 0xFFFFFF, COLOR_APP, - BAGL_FONT_OPEN_SANS_SEMIBOLD_10_13PX | BAGL_FONT_ALIGNMENT_CENTER, 0}, - CHAINID_UPCASE, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + /// TOP STATUS BAR + {{BAGL_LABELINE , 0x01, 0, 45, 320, 30, 0, 0, BAGL_FILL, 0xFFFFFF, COLOR_APP, BAGL_FONT_OPEN_SANS_SEMIBOLD_10_13PX|BAGL_FONT_ALIGNMENT_CENTER, 0 }, CHAINID_UPCASE, 0, 0, 0, NULL, NULL, NULL}, - {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 0, 19, 56, 44, 0, 0, - BAGL_FILL, COLOR_APP, COLOR_APP_LIGHT, - BAGL_FONT_SYMBOLS_0 | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - BAGL_FONT_SYMBOLS_0_SETTINGS, - 0, - COLOR_APP, - 0xFFFFFF, - io_seproxyhal_touch_settings, - NULL, - NULL}, - {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 264, 19, 56, 44, 0, 0, - BAGL_FILL, COLOR_APP, COLOR_APP_LIGHT, - BAGL_FONT_SYMBOLS_0 | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - BAGL_FONT_SYMBOLS_0_DASHBOARD, - 0, - COLOR_APP, - 0xFFFFFF, - io_seproxyhal_touch_exit, - NULL, - NULL}, + {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 0, 19, 56, 44, 0, 0, BAGL_FILL, COLOR_APP, COLOR_APP_LIGHT, BAGL_FONT_SYMBOLS_0|BAGL_FONT_ALIGNMENT_CENTER|BAGL_FONT_ALIGNMENT_MIDDLE, 0 }, BAGL_FONT_SYMBOLS_0_SETTINGS, 0, COLOR_APP, 0xFFFFFF, io_seproxyhal_touch_settings, NULL, NULL}, + {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 264, 19, 56, 44, 0, 0, BAGL_FILL, COLOR_APP, COLOR_APP_LIGHT, BAGL_FONT_SYMBOLS_0|BAGL_FONT_ALIGNMENT_CENTER|BAGL_FONT_ALIGNMENT_MIDDLE, 0 }, BAGL_FONT_SYMBOLS_0_DASHBOARD, 0, COLOR_APP, 0xFFFFFF, io_seproxyhal_touch_exit, NULL, NULL}, - // BADGE_.GIF - {{BAGL_ICON, 0x00, 135, 178, 50, 50, 0, 0, BAGL_FILL, 0, COLOR_BG_1, 0, 0}, - &NAME3(C_blue_badge_, CHAINID, ), - 0, - 0, - 0, - NULL, - NULL, - NULL}, + // BADGE_.GIF + //{{BAGL_ICON , 0x00, 135, 178, 50, 50, 0, 0, BAGL_FILL, 0 , COLOR_BG_1, 0 ,0 } , &NAME3(C_blue_badge_, CHAINID, ), 0, 0, 0, NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x00, 0, 270, 320, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, - BAGL_FONT_OPEN_SANS_LIGHT_16_22PX | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Open " CHAINID_NAME " wallet", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x00, 0, 308, 320, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, - BAGL_FONT_OPEN_SANS_REGULAR_10_13PX | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Connect your Ledger Blue and open your", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x00, 0, 331, 320, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, - BAGL_FONT_OPEN_SANS_REGULAR_10_13PX | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "preferred wallet to view your accounts.", - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE , 0x00, 0, 270, 320, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_LIGHT_16_22PX|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Open your wallet", 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE , 0x00, 0, 308, 320, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Connect your Ledger Blue and open your", 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE , 0x00, 0, 331, 320, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "preferred wallet to view your accounts.", 0, 0, 0, NULL, NULL, NULL}, - {{BAGL_LABELINE, 0x00, 0, 450, 320, 14, 0, 0, 0, 0x999999, COLOR_BG_1, - BAGL_FONT_OPEN_SANS_REGULAR_8_11PX | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Validation requests will show automatically.", - 10, - 0, - COLOR_BG_1, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE , 0x00, 0, 450, 320, 14, 0, 0, 0 , 0x999999, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_8_11PX|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Validation requests will show automatically.", 10, 0, COLOR_BG_1, NULL, NULL, NULL }, }; -unsigned int ui_idle_blue_button(unsigned int button_mask, - unsigned int button_mask_counter) { - return 0; +unsigned int ui_idle_blue_button(unsigned int button_mask, unsigned int button_mask_counter) { + return 0; } #endif // #if defined(TARGET_BLUE) + #if defined(TARGET_NANOS) + const ux_menu_entry_t menu_main[]; const ux_menu_entry_t menu_settings[]; -const ux_menu_entry_t menu_settings_browser[]; +//const ux_menu_entry_t menu_settings_browser[]; const ux_menu_entry_t menu_settings_data[]; #ifdef HAVE_U2F // change the setting void menu_settings_data_change(unsigned int enabled) { - uint8_t dataAllowed = enabled; - nvm_write(&N_storage.dataAllowed, (void *)&dataAllowed, sizeof(uint8_t)); - USB_power_U2F(0, 0); - USB_power_U2F(1, N_storage.fidoTransport); - // go back to the menu entry - UX_MENU_DISPLAY(0, menu_settings, NULL); + dataAllowed = enabled; + nvm_write(&N_storage.dataAllowed, (void*)&dataAllowed, sizeof(uint8_t)); + // go back to the menu entry + UX_MENU_DISPLAY(0, menu_settings, NULL); } // show the currently activated entry void menu_settings_data_init(unsigned int ignored) { - UNUSED(ignored); - UX_MENU_DISPLAY(N_storage.dataAllowed ? 1 : 0, menu_settings_data, NULL); + UNUSED(ignored); + UX_MENU_DISPLAY(N_storage.dataAllowed?1:0, menu_settings_data, NULL); } -#ifdef HAVE_U2F -// change the setting -void menu_settings_browser_change(unsigned int enabled) { - uint8_t fidoTransport = enabled; - nvm_write(&N_storage.fidoTransport, (void *)&fidoTransport, - sizeof(uint8_t)); - USB_power_U2F(0, 0); - USB_power_U2F(1, N_storage.fidoTransport); - // go back to the menu entry - UX_MENU_DISPLAY(1, menu_settings, NULL); -} - -// show the currently activated entry -void menu_settings_browser_init(unsigned int ignored) { - UNUSED(ignored); - UX_MENU_DISPLAY(N_storage.fidoTransport ? 1 : 0, menu_settings_browser, - NULL); -} - -const ux_menu_entry_t menu_settings_browser[] = { - {NULL, menu_settings_browser_change, 0, NULL, "No", NULL, 0, 0}, - {NULL, menu_settings_browser_change, 1, NULL, "Yes", NULL, 0, 0}, - UX_MENU_END}; -#endif // HAVE_U2F - const ux_menu_entry_t menu_settings_data[] = { - {NULL, menu_settings_data_change, 0, NULL, "No", NULL, 0, 0}, - {NULL, menu_settings_data_change, 1, NULL, "Yes", NULL, 0, 0}, - UX_MENU_END}; + {NULL, menu_settings_data_change, 0, NULL, "No", NULL, 0, 0}, + {NULL, menu_settings_data_change, 1, NULL, "Yes", NULL, 0, 0}, + UX_MENU_END +}; const ux_menu_entry_t menu_settings[] = { - {NULL, menu_settings_data_init, 0, NULL, "Contract data", NULL, 0, 0}, -#ifdef HAVE_U2F - {NULL, menu_settings_browser_init, 0, NULL, "Browser support", NULL, 0, 0}, -#endif // HAVE_U2F - {menu_main, NULL, 1, &C_icon_back, "Back", NULL, 61, 40}, - UX_MENU_END}; + {NULL, menu_settings_data_init, 0, NULL, "Contract data", NULL, 0, 0}, + {menu_main, NULL, 1, &C_icon_back, "Back", NULL, 61, 40}, + UX_MENU_END +}; #endif // HAVE_U2F const ux_menu_entry_t menu_about[] = { - {NULL, NULL, 0, NULL, "Version", APPVERSION, 0, 0}, - {menu_main, NULL, 2, &C_icon_back, "Back", NULL, 61, 40}, - UX_MENU_END}; + {NULL, NULL, 0, NULL, "Version", APPVERSION , 0, 0}, + {menu_main, NULL, 2, &C_icon_back, "Back", NULL, 61, 40}, + UX_MENU_END +}; const ux_menu_entry_t menu_main[] = { - {NULL, NULL, 0, &NAME3(C_nanos_badge_, CHAINID, ), "Use wallet to", - "view accounts", 33, 12}, - {menu_settings, NULL, 0, NULL, "Settings", NULL, 0, 0}, - {menu_about, NULL, 0, NULL, "About", NULL, 0, 0}, - {NULL, os_sched_exit, 0, &C_icon_dashboard, "Quit app", NULL, 50, 29}, - UX_MENU_END}; + //{NULL, NULL, 0, &NAME3(C_nanos_badge_, CHAINID, ), "Use wallet to", "view accounts", 33, 12}, + {NULL, NULL, 0, NULL, "Use wallet to", "view accounts", 0, 0}, + {menu_settings, NULL, 0, NULL, "Settings", NULL, 0, 0}, + {menu_about, NULL, 0, NULL, "About", NULL, 0, 0}, + {NULL, os_sched_exit, 0, &C_icon_dashboard, "Quit app", NULL, 50, 29}, + UX_MENU_END +}; #endif // #if defined(TARGET_NANOS) #if defined(TARGET_BLUE) -const bagl_element_t *ui_settings_blue_toggle_data(const bagl_element_t *e) { - // swap setting and request redraw of settings elements - uint8_t setting = N_storage.dataAllowed ? 0 : 1; - nvm_write(&N_storage.dataAllowed, (void *)&setting, sizeof(uint8_t)); +const bagl_element_t * ui_settings_blue_toggle_data(const bagl_element_t * e) { + // swap setting and request redraw of settings elements + uint8_t setting = N_storage.dataAllowed?0:1; + nvm_write(&N_storage.dataAllowed, (void*)&setting, sizeof(uint8_t)); - // only refresh settings mutable drawn elements - UX_REDISPLAY_IDX(12); + // only refresh settings mutable drawn elements + UX_REDISPLAY_IDX(7); - // won't redisplay the bagl_none - return 0; -} - -const bagl_element_t *ui_settings_blue_toggle_browser(const bagl_element_t *e) { - // swap setting and request redraw of settings elements - uint8_t setting = N_storage.fidoTransport ? 0 : 1; - nvm_write(&N_storage.fidoTransport, (void *)&setting, sizeof(uint8_t)); - - // only refresh settings mutable drawn elements - UX_REDISPLAY_IDX(12); - - // won't redisplay the bagl_none - return 0; + // won't redisplay the bagl_none + return 0; } // don't perform any draw/color change upon finger event over settings -const bagl_element_t *ui_settings_out_over(const bagl_element_t *e) { - return NULL; +const bagl_element_t* ui_settings_out_over(const bagl_element_t* e) { + return NULL; } -unsigned int ui_settings_back_callback(const bagl_element_t *e) { - // go back to idle - ui_idle(); - return 0; +unsigned int ui_settings_back_callback(const bagl_element_t* e) { + // go back to idle + ui_idle(); + return 0; } const bagl_element_t ui_settings_blue[] = { - // type userid x y w h str rad - // fill fg bg fid iid txt touchparams... ] - {{BAGL_RECTANGLE, 0x00, 0, 68, 320, 413, 0, 0, BAGL_FILL, COLOR_BG_1, - 0x000000, 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + // type userid x y w h str rad fill fg bg fid iid txt touchparams... ] + {{BAGL_RECTANGLE , 0x00, 0, 68, 320, 413, 0, 0, BAGL_FILL, COLOR_BG_1, 0x000000, 0 , 0 }, NULL, 0, 0, 0, NULL, NULL, NULL }, - // erase screen (only under the status bar) - {{BAGL_RECTANGLE, 0x00, 0, 20, 320, 48, 0, 0, BAGL_FILL, COLOR_APP, - COLOR_APP, 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + // erase screen (only under the status bar) + {{BAGL_RECTANGLE , 0x00, 0, 20, 320, 48, 0, 0, BAGL_FILL, COLOR_APP, COLOR_APP, 0 , 0 }, NULL, 0, 0, 0, NULL, NULL, NULL}, - /// TOP STATUS BAR - {{BAGL_LABELINE, 0x00, 0, 45, 320, 30, 0, 0, BAGL_FILL, 0xFFFFFF, COLOR_APP, - BAGL_FONT_OPEN_SANS_SEMIBOLD_10_13PX | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "SETTINGS", - 0, - 0, - 0, - NULL, - NULL, - NULL}, + /// TOP STATUS BAR + {{BAGL_LABELINE , 0x00, 0, 45, 320, 30, 0, 0, BAGL_FILL, 0xFFFFFF, COLOR_APP, BAGL_FONT_OPEN_SANS_SEMIBOLD_10_13PX|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "SETTINGS", 0, 0, 0, NULL, NULL, NULL}, - {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 0, 19, 50, 44, 0, 0, - BAGL_FILL, COLOR_APP, COLOR_APP_LIGHT, - BAGL_FONT_SYMBOLS_0 | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - BAGL_FONT_SYMBOLS_0_LEFT, - 0, - COLOR_APP, - 0xFFFFFF, - ui_settings_back_callback, - NULL, - NULL}, - {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 264, 19, 56, 44, 0, 0, - BAGL_FILL, COLOR_APP, COLOR_APP_LIGHT, - BAGL_FONT_SYMBOLS_0 | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - BAGL_FONT_SYMBOLS_0_DASHBOARD, - 0, - COLOR_APP, - 0xFFFFFF, - io_seproxyhal_touch_exit, - NULL, - NULL}, + {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 0, 19, 50, 44, 0, 0, BAGL_FILL, COLOR_APP, COLOR_APP_LIGHT, BAGL_FONT_SYMBOLS_0|BAGL_FONT_ALIGNMENT_CENTER|BAGL_FONT_ALIGNMENT_MIDDLE, 0 }, BAGL_FONT_SYMBOLS_0_LEFT, 0, COLOR_APP, 0xFFFFFF, ui_settings_back_callback, NULL, NULL}, + //{{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 264, 19, 56, 44, 0, 0, BAGL_FILL, COLOR_APP, COLOR_APP_LIGHT, BAGL_FONT_SYMBOLS_0|BAGL_FONT_ALIGNMENT_CENTER|BAGL_FONT_ALIGNMENT_MIDDLE, 0 }, BAGL_FONT_SYMBOLS_0_DASHBOARD, 0, COLOR_APP, 0xFFFFFF, io_seproxyhal_touch_exit, NULL, NULL}, - {{BAGL_LABELINE, 0x00, 30, 105, 160, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0}, - "Contract data", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x00, 30, 126, 260, 30, 0, 0, BAGL_FILL, 0x999999, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_8_11PX, 0}, - "Allow contract data in transactions", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_NONE | BAGL_FLAG_TOUCHABLE, 0x00, 0, 78, 320, 68, 0, 0, BAGL_FILL, - 0xFFFFFF, 0x000000, 0, 0}, - NULL, - 0, - 0xEEEEEE, - 0x000000, - ui_settings_blue_toggle_data, - ui_settings_out_over, - ui_settings_out_over}, -#ifdef HAVE_U2F - {{BAGL_RECTANGLE, 0x00, 30, 146, 260, 1, 1, 0, 0, 0xEEEEEE, COLOR_BG_1, 0, - 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE , 0x00, 30, 105, 160, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0 }, "Contract data", 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE , 0x00, 30, 126, 260, 30, 0, 0, BAGL_FILL, 0x999999, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_8_11PX, 0 }, "Allow contract data in transactions", 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_NONE | BAGL_FLAG_TOUCHABLE , 0x00, 0, 78, 320, 68, 0, 0, BAGL_FILL, 0xFFFFFF, 0x000000, 0 , 0 }, NULL, 0, 0xEEEEEE, 0x000000, ui_settings_blue_toggle_data, ui_settings_out_over, ui_settings_out_over }, - {{BAGL_LABELINE, 0x00, 30, 174, 160, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0}, - "Browser support", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x00, 30, 195, 260, 30, 0, 0, BAGL_FILL, 0x999999, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_8_11PX, 0}, - "Enable integrated browser support", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_NONE | BAGL_FLAG_TOUCHABLE, 0x00, 0, 147, 320, 68, 0, 0, BAGL_FILL, - 0xFFFFFF, 0x000000, 0, 0}, - NULL, - 0, - 0xEEEEEE, - 0x000000, - ui_settings_blue_toggle_browser, - ui_settings_out_over, - ui_settings_out_over}, - - // at the end to minimize the number of refreshed items upon setting change - {{BAGL_ICON, 0x02, 258, 167, 32, 18, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, -#endif // HAVE_U2F - {{BAGL_ICON, 0x01, 258, 98, 32, 18, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_ICON , 0x01, 258, 98, 32, 18, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, 0, 0 }, NULL, 0, 0, 0, NULL, NULL, NULL}, }; -const bagl_element_t *ui_settings_blue_prepro(const bagl_element_t *e) { - // none elements are skipped - if ((e->component.type & (~BAGL_FLAG_TOUCHABLE)) == BAGL_NONE) { - return 0; - } - // swap icon buffer to be displayed depending on if corresponding setting is - // enabled or not. - if (e->component.userid) { - os_memmove(&tmp_element, e, sizeof(bagl_element_t)); - switch (e->component.userid) { - case 0x01: - // swap icon content - if (N_storage.dataAllowed) { - tmp_element.text = &C_icon_toggle_set; - } else { - tmp_element.text = &C_icon_toggle_reset; - } - break; - case 0x02: - // swap icon content - if (N_storage.fidoTransport) { - tmp_element.text = &C_icon_toggle_set; - } else { - tmp_element.text = &C_icon_toggle_reset; - } - break; +const bagl_element_t * ui_settings_blue_prepro(const bagl_element_t * e) { + copy_element_and_map_coin_colors(e); + // none elements are skipped + if ((e->component.type&(~BAGL_FLAG_TOUCHABLE)) == BAGL_NONE) { + return 0; + } + // swap icon buffer to be displayed depending on if corresponding setting is enabled or not. + if (e->component.userid) { + switch(e->component.userid) { + case 0x01: + // swap icon content + if (N_storage.dataAllowed) { + tmp_element.text = &C_icon_toggle_set; } - return &tmp_element; + else { + tmp_element.text = &C_icon_toggle_reset; + } + break; } - return 1; + } + return &tmp_element; } -unsigned int ui_settings_blue_button(unsigned int button_mask, - unsigned int button_mask_counter) { - return 0; +unsigned int ui_settings_blue_button(unsigned int button_mask, unsigned int button_mask_counter) { + return 0; } #endif // #if defined(TARGET_BLUE) + + + #if defined(TARGET_BLUE) // reuse addressSummary for each line content -const char *ui_details_title; -const char *ui_details_content; +const char* ui_details_title; +const char* ui_details_content; typedef void (*callback_t)(void); callback_t ui_details_back_callback; -const bagl_element_t * -ui_details_blue_back_callback(const bagl_element_t *element) { - ui_details_back_callback(); - return 0; +const bagl_element_t* ui_details_blue_back_callback(const bagl_element_t* element) { + ui_details_back_callback(); + return 0; } + const bagl_element_t ui_details_blue[] = { - // erase screen (only under the status bar) - {{BAGL_RECTANGLE, 0x00, 0, 68, 320, 413, 0, 0, BAGL_FILL, COLOR_BG_1, - 0x000000, 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + // erase screen (only under the status bar) + {{BAGL_RECTANGLE , 0x00, 0, 68, 320, 413, 0, 0, BAGL_FILL, COLOR_BG_1, 0x000000, 0 , 0 }, NULL, 0, 0, 0, NULL, NULL, NULL }, - {{BAGL_RECTANGLE, 0x00, 0, 20, 320, 48, 0, 0, BAGL_FILL, COLOR_APP, - COLOR_APP, 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_RECTANGLE , 0x00, 0, 20, 320, 48, 0, 0, BAGL_FILL, COLOR_APP, COLOR_APP, 0 , 0 }, NULL, 0, 0, 0, NULL, NULL, NULL}, - /// TOP STATUS BAR - {{BAGL_LABELINE, 0x01, 0, 45, 320, 30, 0, 0, BAGL_FILL, 0xFFFFFF, COLOR_APP, - BAGL_FONT_OPEN_SANS_SEMIBOLD_10_13PX | BAGL_FONT_ALIGNMENT_CENTER, 0}, - addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + /// TOP STATUS BAR + {{BAGL_LABELINE , 0x01, 0, 45, 320, 30, 0, 0, BAGL_FILL, 0xFFFFFF, COLOR_APP, BAGL_FONT_OPEN_SANS_SEMIBOLD_10_13PX|BAGL_FONT_ALIGNMENT_CENTER, 0 }, addressSummary, 0, 0, 0, NULL, NULL, NULL}, - {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 0, 19, 50, 44, 0, 0, - BAGL_FILL, COLOR_APP, COLOR_APP_LIGHT, - BAGL_FONT_SYMBOLS_0 | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - BAGL_FONT_SYMBOLS_0_LEFT, - 0, - COLOR_APP, - 0xFFFFFF, - ui_details_blue_back_callback, - NULL, - NULL}, - //{{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 264, 19, 56, 44, 0, 0, - //BAGL_FILL, COLOR_APP, COLOR_APP_LIGHT, - //BAGL_FONT_SYMBOLS_0|BAGL_FONT_ALIGNMENT_CENTER|BAGL_FONT_ALIGNMENT_MIDDLE, - //0 }, " " /*BAGL_FONT_SYMBOLS_0_DASHBOARD*/, 0, COLOR_APP, 0xFFFFFF, - //io_seproxyhal_touch_exit, NULL, NULL}, + {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 0, 19, 50, 44, 0, 0, BAGL_FILL, COLOR_APP, COLOR_APP_LIGHT, BAGL_FONT_SYMBOLS_0|BAGL_FONT_ALIGNMENT_CENTER|BAGL_FONT_ALIGNMENT_MIDDLE, 0 }, BAGL_FONT_SYMBOLS_0_LEFT, 0, COLOR_APP, 0xFFFFFF, ui_details_blue_back_callback, NULL, NULL}, + //{{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 264, 19, 56, 44, 0, 0, BAGL_FILL, COLOR_APP, COLOR_APP_LIGHT, BAGL_FONT_SYMBOLS_0|BAGL_FONT_ALIGNMENT_CENTER|BAGL_FONT_ALIGNMENT_MIDDLE, 0 }, " " /*BAGL_FONT_SYMBOLS_0_DASHBOARD*/, 0, COLOR_APP, 0xFFFFFF, io_seproxyhal_touch_exit, NULL, NULL}, - {{BAGL_LABELINE, 0x00, 30, 106, 320, 30, 0, 0, BAGL_FILL, 0x999999, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_SEMIBOLD_8_11PX, 0}, - "VALUE", - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE , 0x00, 30, 106, 320, 30, 0, 0, BAGL_FILL, 0x999999, COLOR_BG_1, BAGL_FONT_OPEN_SANS_SEMIBOLD_8_11PX, 0 }, "VALUE", 0, 0, 0, NULL, NULL, NULL}, - {{BAGL_LABELINE, 0x10, 30, 136, 260, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0}, - addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x11, 30, 159, 260, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0}, - addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x12, 30, 182, 260, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0}, - addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x13, 30, 205, 260, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0}, - addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x14, 30, 228, 260, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0}, - addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x15, 30, 251, 260, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0}, - addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x16, 30, 274, 260, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0}, - addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x17, 30, 297, 260, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0}, - addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x18, 30, 320, 260, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0}, - addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - //"..." at the end if too much - {{BAGL_LABELINE, 0x19, 30, 343, 260, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0}, - addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE , 0x10, 30, 136, 260, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0 }, addressSummary, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE , 0x11, 30, 159, 260, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0 }, addressSummary, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE , 0x12, 30, 182, 260, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0 }, addressSummary, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE , 0x13, 30, 205, 260, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0 }, addressSummary, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE , 0x14, 30, 228, 260, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0 }, addressSummary, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE , 0x15, 30, 251, 260, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0 }, addressSummary, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE , 0x16, 30, 274, 260, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0 }, addressSummary, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE , 0x17, 30, 297, 260, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0 }, addressSummary, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE , 0x18, 30, 320, 260, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0 }, addressSummary, 0, 0, 0, NULL, NULL, NULL}, + //"..." at the end if too much + {{BAGL_LABELINE , 0x19, 30, 343, 260, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0 }, addressSummary, 0, 0, 0, NULL, NULL, NULL}, - {{BAGL_LABELINE, 0x00, 0, 450, 320, 14, 0, 0, 0, 0x999999, COLOR_BG_1, - BAGL_FONT_OPEN_SANS_REGULAR_8_11PX | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Review the whole value before continuing.", - 10, - 0, - COLOR_BG_1, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE , 0x00, 0, 450, 320, 14, 0, 0, 0 , 0x999999, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_8_11PX|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Review the whole value before continuing.", 10, 0, COLOR_BG_1, NULL, NULL, NULL }, }; -const bagl_element_t *ui_details_blue_prepro(const bagl_element_t *element) { - if (element->component.userid == 1) { - os_memmove(&tmp_element, element, sizeof(bagl_element_t)); - tmp_element.text = ui_details_title; - return &tmp_element; - } else if (element->component.userid > 0) { - unsigned int length = strlen(ui_details_content); - if (length >= (element->component.userid & 0xF) * MAX_CHAR_PER_LINE) { - os_memset(addressSummary, 0, MAX_CHAR_PER_LINE + 1); - os_memmove( - addressSummary, - ui_details_content + - (element->component.userid & 0xF) * MAX_CHAR_PER_LINE, - MIN(length - - (element->component.userid & 0xF) * MAX_CHAR_PER_LINE, - MAX_CHAR_PER_LINE)); - return 1; - } - // nothing to draw for this line - return 0; +const bagl_element_t* ui_details_blue_prepro(const bagl_element_t* element) { + copy_element_and_map_coin_colors(element); + if (element->component.userid == 1) { + tmp_element.text = ui_details_title; + return &tmp_element; + } + else if(element->component.userid > 0) { + unsigned int length = strlen(ui_details_content); + if (length >= (element->component.userid & 0xF) * MAX_CHAR_PER_LINE) { + os_memset(addressSummary, 0, MAX_CHAR_PER_LINE+1); + os_memmove(addressSummary, ui_details_content+(element->component.userid & 0xF) * MAX_CHAR_PER_LINE, MIN(length - (element->component.userid & 0xF) * MAX_CHAR_PER_LINE, MAX_CHAR_PER_LINE)); + return &tmp_element; } - return 1; -} - -unsigned int ui_details_blue_button(unsigned int button_mask, - unsigned int button_mask_counter) { + // nothing to draw for this line return 0; + } + return &tmp_element; } -void ui_details_init(const char *title, const char *content, - callback_t back_callback) { - ui_details_title = title; - ui_details_content = content; - ui_details_back_callback = back_callback; - UX_DISPLAY(ui_details_blue, ui_details_blue_prepro); +unsigned int ui_details_blue_button(unsigned int button_mask, unsigned int button_mask_counter) { + return 0; +} + +void ui_details_init(const char* title, const char* content, callback_t back_callback) { + ui_details_title = title; + ui_details_content = content; + ui_details_back_callback = back_callback; + UX_DISPLAY(ui_details_blue, ui_details_blue_prepro); } void ui_approval_blue_init(void); @@ -837,937 +433,351 @@ void ui_approval_blue_init(void); bagl_element_callback_t ui_approval_blue_ok; bagl_element_callback_t ui_approval_blue_cancel; -const bagl_element_t *ui_approval_blue_ok_callback(const bagl_element_t *e) { - return ui_approval_blue_ok(e); +const bagl_element_t* ui_approval_blue_ok_callback(const bagl_element_t* e) { + return ui_approval_blue_ok(e); } -const bagl_element_t * -ui_approval_blue_cancel_callback(const bagl_element_t *e) { - return ui_approval_blue_cancel(e); +const bagl_element_t* ui_approval_blue_cancel_callback(const bagl_element_t* e) { + return ui_approval_blue_cancel(e); } typedef enum { - APPROVAL_TRANSACTION, - APPROVAL_MESSAGE, + APPROVAL_TRANSACTION, + APPROVAL_MESSAGE, } ui_approval_blue_state_t; ui_approval_blue_state_t G_ui_approval_blue_state; // pointer to value to be displayed -const char *ui_approval_blue_values[3]; +const char* ui_approval_blue_values[3]; // variable part of the structure -const char *const ui_approval_blue_details_name[][5] = { - /*APPROVAL_TRANSACTION*/ - { - "AMOUNT", "ADDRESS", "MAX FEES", "CONFIRM TRANSACTION", - "Transaction details", - }, - - /*APPROVAL_MESSAGE*/ - { - "HASH", NULL, NULL, "SIGN MESSAGE", "Message signature", - }, +const char* const ui_approval_blue_details_name[][5] = { + /*APPROVAL_TRANSACTION*/ + {"AMOUNT", "ADDRESS", "MAX FEES","CONFIRM TRANSACTION","Transaction details",}, + + /*APPROVAL_MESSAGE*/ + {"HASH", NULL, NULL, "SIGN MESSAGE", "Message signature", }, }; -const bagl_element_t *ui_approval_blue_1_details(const bagl_element_t *e) { - if (strlen(ui_approval_blue_values[0]) * - BAGL_FONT_OPEN_SANS_LIGHT_16_22PX_AVG_WIDTH >= - 160) { - // display details screen - ui_details_init( - ui_approval_blue_details_name[G_ui_approval_blue_state][0], - ui_approval_blue_values[0], ui_approval_blue_init); - } - return 0; +const bagl_element_t* ui_approval_blue_1_details(const bagl_element_t* e) { + if (strlen(ui_approval_blue_values[0])*BAGL_FONT_OPEN_SANS_LIGHT_16_22PX_AVG_WIDTH >= 160) { + // display details screen + ui_details_init(ui_approval_blue_details_name[G_ui_approval_blue_state][0], ui_approval_blue_values[0], ui_approval_blue_init); + } + return 0; }; -const bagl_element_t *ui_approval_blue_2_details(const bagl_element_t *e) { - if (strlen(ui_approval_blue_values[1]) * - BAGL_FONT_OPEN_SANS_REGULAR_10_13PX_AVG_WIDTH >= - 160) { - ui_details_init( - ui_approval_blue_details_name[G_ui_approval_blue_state][1], - ui_approval_blue_values[1], ui_approval_blue_init); - } - return 0; +const bagl_element_t* ui_approval_blue_2_details(const bagl_element_t* e) { + if (strlen(ui_approval_blue_values[1])*BAGL_FONT_OPEN_SANS_REGULAR_10_13PX_AVG_WIDTH >= 160) { + ui_details_init(ui_approval_blue_details_name[G_ui_approval_blue_state][1], ui_approval_blue_values[1], ui_approval_blue_init); + } + return 0; }; -const bagl_element_t *ui_approval_blue_3_details(const bagl_element_t *e) { - if (strlen(ui_approval_blue_values[2]) * - BAGL_FONT_OPEN_SANS_REGULAR_10_13PX_AVG_WIDTH >= - 160) { - ui_details_init( - ui_approval_blue_details_name[G_ui_approval_blue_state][2], - ui_approval_blue_values[2], ui_approval_blue_init); - } - return 0; +const bagl_element_t* ui_approval_blue_3_details(const bagl_element_t* e) { + if (strlen(ui_approval_blue_values[2])*BAGL_FONT_OPEN_SANS_REGULAR_10_13PX_AVG_WIDTH >= 160) { + ui_details_init(ui_approval_blue_details_name[G_ui_approval_blue_state][2], ui_approval_blue_values[2], ui_approval_blue_init); + } + return 0; }; const bagl_element_t ui_approval_blue[] = { - {{BAGL_RECTANGLE, 0x00, 0, 68, 320, 413, 0, 0, BAGL_FILL, COLOR_BG_1, - 0x000000, 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_RECTANGLE , 0x00, 0, 68, 320, 413, 0, 0, BAGL_FILL, COLOR_BG_1, 0x000000, 0 , 0 }, NULL, 0, 0, 0, NULL, NULL, NULL }, - // erase screen (only under the status bar) - {{BAGL_RECTANGLE, 0x00, 0, 20, 320, 48, 0, 0, BAGL_FILL, COLOR_APP, - COLOR_APP, 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + // erase screen (only under the status bar) + {{BAGL_RECTANGLE , 0x00, 0, 20, 320, 48, 0, 0, BAGL_FILL, COLOR_APP, COLOR_APP, 0 , 0 }, NULL, 0, 0, 0, NULL, NULL, NULL}, - /// TOP STATUS BAR - {{BAGL_LABELINE, 0x60, 0, 45, 320, 30, 0, 0, BAGL_FILL, 0xFFFFFF, COLOR_APP, - BAGL_FONT_OPEN_SANS_SEMIBOLD_10_13PX | BAGL_FONT_ALIGNMENT_CENTER, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + /// TOP STATUS BAR + {{BAGL_LABELINE , 0x60, 0, 45, 320, 30, 0, 0, BAGL_FILL, 0xFFFFFF, COLOR_APP, BAGL_FONT_OPEN_SANS_SEMIBOLD_10_13PX|BAGL_FONT_ALIGNMENT_CENTER, 0 }, NULL, 0, 0, 0, NULL, NULL, NULL}, - // BADGE_TRANSACTION.GIF - {{BAGL_ICON, 0x40, 30, 98, 50, 50, 0, 0, BAGL_FILL, 0, COLOR_BG_1, 0, 0}, - &C_badge_transaction, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + // BADGE_TRANSACTION.GIF + {{BAGL_ICON , 0x40, 30, 98, 50, 50, 0, 0, BAGL_FILL, 0 , COLOR_BG_1, 0 , 0 } , &C_badge_transaction, 0, 0, 0, NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x50, 100, 117, 320, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE , 0x50, 100, 117, 320, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0 }, NULL, 0, 0, 0, NULL, NULL, NULL}, - {{BAGL_LABELINE, 0x00, 100, 138, 320, 30, 0, 0, BAGL_FILL, 0x999999, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_8_11PX, 0}, - "Check and confirm values", - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE , 0x00, 100, 138, 320, 30, 0, 0, BAGL_FILL, 0x999999, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_8_11PX, 0 }, "Check and confirm values", 0, 0, 0, NULL, NULL, NULL}, - {{BAGL_LABELINE, 0x70, 30, 196, 100, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_SEMIBOLD_8_11PX, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, // AMOUNT - // x-18 when ... - {{BAGL_LABELINE, 0x10, 130, 200, 160, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_LIGHT_16_22PX | BAGL_FONT_ALIGNMENT_RIGHT, - 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, // fullAmount - {{BAGL_LABELINE, 0x20, 284, 196, 6, 16, 0, 0, BAGL_FILL, 0x999999, - COLOR_BG_1, BAGL_FONT_SYMBOLS_0 | BAGL_FONT_ALIGNMENT_RIGHT, 0}, - BAGL_FONT_SYMBOLS_0_MINIRIGHT, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_NONE | BAGL_FLAG_TOUCHABLE, 0x00, 0, 168, 320, 48, 0, 9, BAGL_FILL, - 0xFFFFFF, 0x000000, 0, 0}, - NULL, - 0, - 0xEEEEEE, - 0x000000, - ui_approval_blue_1_details, - ui_menu_item_out_over, - ui_menu_item_out_over}, - {{BAGL_RECTANGLE, 0x20, 0, 168, 5, 48, 0, 0, BAGL_FILL, COLOR_BG_1, - COLOR_BG_1, 0, 0}, - NULL, - 0, - 0x41CCB4, - 0, - NULL, - NULL, - NULL}, - {{BAGL_RECTANGLE, 0x31, 30, 216, 260, 1, 1, 0, 0, 0xEEEEEE, COLOR_BG_1, 0, - 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE , 0x70, 30, 196, 100, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_SEMIBOLD_8_11PX, 0 }, NULL, 0, 0, 0, NULL, NULL, NULL}, // AMOUNT + // x-18 when ... + {{BAGL_LABELINE , 0x10, 130, 200, 160, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_LIGHT_16_22PX|BAGL_FONT_ALIGNMENT_RIGHT, 0 }, NULL, 0, 0, 0, NULL, NULL, NULL}, // fullAmount + {{BAGL_LABELINE , 0x20, 284, 196, 6, 16, 0, 0, BAGL_FILL, 0x999999, COLOR_BG_1, BAGL_FONT_SYMBOLS_0|BAGL_FONT_ALIGNMENT_RIGHT, 0 }, BAGL_FONT_SYMBOLS_0_MINIRIGHT, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_NONE | BAGL_FLAG_TOUCHABLE , 0x00, 0, 168, 320, 48, 0, 9, BAGL_FILL, 0xFFFFFF, 0x000000, 0 , 0 }, NULL, 0, 0xEEEEEE, 0x000000, ui_approval_blue_1_details, ui_menu_item_out_over, ui_menu_item_out_over }, + {{BAGL_RECTANGLE , 0x20, 0, 168, 5, 48, 0, 0, BAGL_FILL, COLOR_BG_1, COLOR_BG_1, 0 , 0 }, NULL, 0, 0x41CCB4, 0, NULL, NULL, NULL }, + + {{BAGL_RECTANGLE , 0x31, 30, 216, 260, 1, 1, 0, 0 , 0xEEEEEE, COLOR_BG_1, 0 , 0 }, NULL, 0, 0, 0, NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x71, 30, 245, 100, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_SEMIBOLD_8_11PX, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, // ADDRESS - // x-18 when ... - {{BAGL_LABELINE, 0x11, 130, 245, 160, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, - BAGL_FONT_OPEN_SANS_REGULAR_10_13PX | BAGL_FONT_ALIGNMENT_RIGHT, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, // fullAddress - {{BAGL_LABELINE, 0x21, 284, 245, 6, 16, 0, 0, BAGL_FILL, 0x999999, - COLOR_BG_1, BAGL_FONT_SYMBOLS_0 | BAGL_FONT_ALIGNMENT_RIGHT, 0}, - BAGL_FONT_SYMBOLS_0_MINIRIGHT, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_NONE | BAGL_FLAG_TOUCHABLE, 0x00, 0, 217, 320, 48, 0, 9, BAGL_FILL, - 0xFFFFFF, 0x000000, 0, 0}, - NULL, - 0, - 0xEEEEEE, - 0x000000, - ui_approval_blue_2_details, - ui_menu_item_out_over, - ui_menu_item_out_over}, - {{BAGL_RECTANGLE, 0x21, 0, 217, 5, 48, 0, 0, BAGL_FILL, COLOR_BG_1, - COLOR_BG_1, 0, 0}, - NULL, - 0, - 0x41CCB4, - 0, - NULL, - NULL, - NULL}, - {{BAGL_RECTANGLE, 0x32, 30, 265, 260, 1, 1, 0, 0, 0xEEEEEE, COLOR_BG_1, 0, - 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE , 0x71, 30, 245, 100, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_SEMIBOLD_8_11PX, 0 }, NULL, 0, 0, 0, NULL, NULL, NULL}, // ADDRESS + // x-18 when ... + {{BAGL_LABELINE , 0x11, 130, 245, 160, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX|BAGL_FONT_ALIGNMENT_RIGHT, 0 }, NULL, 0, 0, 0, NULL, NULL, NULL}, // fullAddress + {{BAGL_LABELINE , 0x21, 284, 245, 6, 16, 0, 0, BAGL_FILL, 0x999999, COLOR_BG_1, BAGL_FONT_SYMBOLS_0|BAGL_FONT_ALIGNMENT_RIGHT, 0 }, BAGL_FONT_SYMBOLS_0_MINIRIGHT, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_NONE | BAGL_FLAG_TOUCHABLE , 0x00, 0, 217, 320, 48, 0, 9, BAGL_FILL, 0xFFFFFF, 0x000000, 0 , 0 }, NULL, 0, 0xEEEEEE, 0x000000, ui_approval_blue_2_details, ui_menu_item_out_over, ui_menu_item_out_over }, + {{BAGL_RECTANGLE , 0x21, 0, 217, 5, 48, 0, 0, BAGL_FILL, COLOR_BG_1, COLOR_BG_1, 0 , 0 }, NULL, 0, 0x41CCB4, 0, NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x72, 30, 294, 100, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_SEMIBOLD_8_11PX, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, // MAX FEES - // x-18 when ... - {{BAGL_LABELINE, 0x12, 130, 294, 160, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, - BAGL_FONT_OPEN_SANS_REGULAR_10_13PX | BAGL_FONT_ALIGNMENT_RIGHT, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, // maxFee - {{BAGL_LABELINE, 0x22, 284, 294, 6, 16, 0, 0, BAGL_FILL, 0x999999, - COLOR_BG_1, BAGL_FONT_SYMBOLS_0 | BAGL_FONT_ALIGNMENT_RIGHT, 0}, - BAGL_FONT_SYMBOLS_0_MINIRIGHT, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_NONE | BAGL_FLAG_TOUCHABLE, 0x00, 0, 266, 320, 48, 0, 9, BAGL_FILL, - 0xFFFFFF, 0x000000, 0, 0}, - NULL, - 0, - 0xEEEEEE, - 0x000000, - ui_approval_blue_3_details, - ui_menu_item_out_over, - ui_menu_item_out_over}, - {{BAGL_RECTANGLE, 0x22, 0, 266, 5, 48, 0, 0, BAGL_FILL, COLOR_BG_1, - COLOR_BG_1, 0, 0}, - NULL, - 0, - 0x41CCB4, - 0, - NULL, - NULL, - NULL}, + {{BAGL_RECTANGLE , 0x32, 30, 265, 260, 1, 1, 0, 0 , 0xEEEEEE, COLOR_BG_1, 0 , 0 }, NULL, 0, 0, 0, NULL, NULL, NULL }, + - {{BAGL_RECTANGLE, 0x06, 30, 314, 260, 1, 1, 0, 0, 0xEEEEEE, COLOR_BG_1, 0, - 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE , 0x72, 30, 294, 100, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_SEMIBOLD_8_11PX, 0 }, NULL, 0, 0, 0, NULL, NULL, NULL}, // MAX FEES + // x-18 when ... + {{BAGL_LABELINE , 0x12, 130, 294, 160, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX|BAGL_FONT_ALIGNMENT_RIGHT, 0 }, NULL, 0, 0, 0, NULL, NULL, NULL}, //maxFee + {{BAGL_LABELINE , 0x22, 284, 294, 6, 16, 0, 0, BAGL_FILL, 0x999999, COLOR_BG_1, BAGL_FONT_SYMBOLS_0|BAGL_FONT_ALIGNMENT_RIGHT, 0 }, BAGL_FONT_SYMBOLS_0_MINIRIGHT, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_NONE | BAGL_FLAG_TOUCHABLE , 0x00, 0, 266, 320, 48, 0, 9, BAGL_FILL, 0xFFFFFF, 0x000000, 0 , 0 }, NULL, 0, 0xEEEEEE, 0x000000, ui_approval_blue_3_details, ui_menu_item_out_over, ui_menu_item_out_over }, + {{BAGL_RECTANGLE , 0x22, 0, 266, 5, 48, 0, 0, BAGL_FILL, COLOR_BG_1, COLOR_BG_1, 0 , 0 }, NULL, 0, 0x41CCB4, 0, NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x06, 30, 343, 120, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_SEMIBOLD_8_11PX, 0}, - "CONTRACT DATA", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - //{{BAGL_LABELINE , 0x05, 130, 343, 160, 30, 0, 0, - //BAGL_FILL, 0x666666, COLOR_BG_1, - //BAGL_FONT_OPEN_SANS_REGULAR_10_13PX|BAGL_FONT_ALIGNMENT_RIGHT, 0 }, "Not - //present", 0, 0, 0, NULL, NULL, NULL}, - {{BAGL_LABELINE, 0x06, 133, 343, 140, 30, 0, 0, BAGL_FILL, 0x666666, - COLOR_BG_1, - BAGL_FONT_OPEN_SANS_REGULAR_10_13PX | BAGL_FONT_ALIGNMENT_RIGHT, 0}, - "Present", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_ICON, 0x06, 278, 333, 12, 12, 0, 0, BAGL_FILL, 0, COLOR_BG_1, 0, 0}, - &C_icon_warning, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_RECTANGLE , 0x06, 30, 314, 260, 1, 1, 0, 0 , 0xEEEEEE, COLOR_BG_1, 0 , 0 }, NULL, 0, 0, 0, NULL, NULL, NULL }, + - {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 40, 414, 115, 36, 0, 18, - BAGL_FILL, 0xCCCCCC, COLOR_BG_1, - BAGL_FONT_OPEN_SANS_REGULAR_11_14PX | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - "REJECT", - 0, - 0xB7B7B7, - COLOR_BG_1, - ui_approval_blue_cancel_callback, - NULL, - NULL}, - {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 165, 414, 115, 36, 0, 18, - BAGL_FILL, 0x41ccb4, COLOR_BG_1, - BAGL_FONT_OPEN_SANS_REGULAR_11_14PX | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - "CONFIRM", - 0, - 0x3ab7a2, - COLOR_BG_1, - ui_approval_blue_ok_callback, - NULL, - NULL}, + {{BAGL_LABELINE , 0x06, 30, 343, 120, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_SEMIBOLD_8_11PX, 0 }, "CONTRACT DATA", 0, 0, 0, NULL, NULL, NULL}, + + //{{BAGL_LABELINE , 0x05, 130, 343, 160, 30, 0, 0, BAGL_FILL, 0x666666, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX|BAGL_FONT_ALIGNMENT_RIGHT, 0 }, "Not present", 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE , 0x06, 133, 343, 140, 30, 0, 0, BAGL_FILL, 0x666666, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX|BAGL_FONT_ALIGNMENT_RIGHT, 0 }, "Present", 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_ICON , 0x06, 278, 333, 12, 12, 0, 0, BAGL_FILL, 0 , COLOR_BG_1, 0 , 0}, &C_icon_warning, 0, 0, 0, NULL, NULL, NULL }, + + {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 40, 414, 115, 36, 0,18, BAGL_FILL, 0xCCCCCC, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_11_14PX|BAGL_FONT_ALIGNMENT_CENTER|BAGL_FONT_ALIGNMENT_MIDDLE, 0 }, "REJECT", 0, 0xB7B7B7, COLOR_BG_1, ui_approval_blue_cancel_callback, NULL, NULL}, + {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 165, 414, 115, 36, 0,18, BAGL_FILL, 0x41ccb4, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_11_14PX|BAGL_FONT_ALIGNMENT_CENTER|BAGL_FONT_ALIGNMENT_MIDDLE, 0 }, "CONFIRM", 0, 0x3ab7a2, COLOR_BG_1, ui_approval_blue_ok_callback, NULL, NULL}, }; -const bagl_element_t *ui_approval_blue_prepro(const bagl_element_t *element) { +const bagl_element_t* ui_approval_blue_prepro(const bagl_element_t* element) { + copy_element_and_map_coin_colors(element); if (element->component.userid == 0) { - return 1; + return &tmp_element; } // none elements are skipped - if ((element->component.type & (~BAGL_FLAG_TOUCHABLE)) == BAGL_NONE) { - return 0; - } else { - switch (element->component.userid & 0xF0) { + if ((element->component.type&(~BAGL_FLAG_TOUCHABLE)) == BAGL_NONE) { + return 0; + } + else { + switch(element->component.userid&0xF0) { + // icon case 0x40: - return 1; - break; - + return &tmp_element; + break; + // TITLE - case 0x60: - os_memmove(&tmp_element, element, sizeof(bagl_element_t)); - tmp_element.text = - ui_approval_blue_details_name[G_ui_approval_blue_state][3]; - return &tmp_element; - break; - + case 0x60: + tmp_element.text = ui_approval_blue_details_name[G_ui_approval_blue_state][3]; + return &tmp_element; + break; + // SUBLINE - case 0x50: - os_memmove(&tmp_element, element, sizeof(bagl_element_t)); - tmp_element.text = - ui_approval_blue_details_name[G_ui_approval_blue_state][4]; - return &tmp_element; + case 0x50: + tmp_element.text = ui_approval_blue_details_name[G_ui_approval_blue_state][4]; + return &tmp_element; // details label case 0x70: - if (!ui_approval_blue_details_name[G_ui_approval_blue_state] - [element->component.userid & - 0xF]) { - return NULL; - } - os_memmove(&tmp_element, element, sizeof(bagl_element_t)); - tmp_element.text = - ui_approval_blue_details_name[G_ui_approval_blue_state] - [element->component.userid & 0xF]; - return &tmp_element; + if (!ui_approval_blue_details_name[G_ui_approval_blue_state][element->component.userid&0xF]) { + return NULL; + } + tmp_element.text = ui_approval_blue_details_name[G_ui_approval_blue_state][element->component.userid&0xF]; + return &tmp_element; // detail value case 0x10: - // won't display - if (!ui_approval_blue_details_name[G_ui_approval_blue_state] - [element->component.userid & - 0xF]) { - return NULL; - } - // always display the value - os_memmove(&tmp_element, element, sizeof(bagl_element_t)); - tmp_element.text = - ui_approval_blue_values[(element->component.userid & 0xF)]; + // won't display + if (!ui_approval_blue_details_name[G_ui_approval_blue_state][element->component.userid&0xF]) { + return NULL; + } + // always display the value + tmp_element.text = ui_approval_blue_values[(element->component.userid&0xF)]; - // x -= 18 when overflow is detected - if (strlen(ui_approval_blue_values[(element->component.userid & - 0xF)]) * - BAGL_FONT_OPEN_SANS_LIGHT_16_22PX_AVG_WIDTH >= - 160) { - tmp_element.component.x -= 18; - } - return &tmp_element; - break; + // x -= 18 when overflow is detected + if (strlen(ui_approval_blue_values[(element->component.userid&0xF)])*BAGL_FONT_OPEN_SANS_LIGHT_16_22PX_AVG_WIDTH >= 160) { + tmp_element.component.x -= 18; + } + return &tmp_element; + break; // right arrow and left selection rectangle case 0x20: - if (!ui_approval_blue_details_name[G_ui_approval_blue_state] - [element->component.userid & - 0xF]) { - return NULL; - } - if (strlen(ui_approval_blue_values[(element->component.userid & - 0xF)]) * - BAGL_FONT_OPEN_SANS_LIGHT_16_22PX_AVG_WIDTH < - 160) { - return NULL; - } + if (!ui_approval_blue_details_name[G_ui_approval_blue_state][element->component.userid&0xF]) { + return NULL; + } + if (strlen(ui_approval_blue_values[(element->component.userid&0xF)])*BAGL_FONT_OPEN_SANS_LIGHT_16_22PX_AVG_WIDTH < 160) { + return NULL; + } // horizontal delimiter case 0x30: - return ui_approval_blue_details_name[G_ui_approval_blue_state] - [element->component.userid & - 0xF] != NULL - ? element - : NULL; + return ui_approval_blue_details_name[G_ui_approval_blue_state][element->component.userid&0xF]!=NULL?&tmp_element:NULL; + case 0x05: - return !dataPresent; + return !dataPresent?&tmp_element:NULL; case 0x06: - return dataPresent; - } + return dataPresent?&tmp_element:NULL; + } } - return element; + return &tmp_element; } -unsigned int ui_approval_blue_button(unsigned int button_mask, - unsigned int button_mask_counter) { - return 0; +unsigned int ui_approval_blue_button(unsigned int button_mask, unsigned int button_mask_counter) { + return 0; } #endif // #if defined(TARGET_BLUE) #if defined(TARGET_BLUE) const bagl_element_t ui_address_blue[] = { - {{BAGL_RECTANGLE, 0x00, 0, 68, 320, 413, 0, 0, BAGL_FILL, COLOR_BG_1, - 0x000000, 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_RECTANGLE , 0x00, 0, 68, 320, 413, 0, 0, BAGL_FILL, COLOR_BG_1, 0x000000, 0 , 0 }, NULL, 0, 0, 0, NULL, NULL, NULL }, - // erase screen (only under the status bar) - {{BAGL_RECTANGLE, 0x00, 0, 20, 320, 48, 0, 0, BAGL_FILL, COLOR_APP, - COLOR_APP, 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - /// TOP STATUS BAR - {{BAGL_LABELINE, 0x00, 0, 45, 320, 30, 0, 0, BAGL_FILL, 0xFFFFFF, COLOR_APP, - BAGL_FONT_OPEN_SANS_SEMIBOLD_10_13PX | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "CONFIRM ACCOUNT", - 0, - 0, - 0, - NULL, - NULL, - NULL}, + // erase screen (only under the status bar) + {{BAGL_RECTANGLE , 0x00, 0, 20, 320, 48, 0, 0, BAGL_FILL, COLOR_APP, COLOR_APP, 0 , 0 }, NULL, 0, 0, 0, NULL, NULL, NULL}, - //{{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 264, 19, 56, 44, 0, 0, - //BAGL_FILL, COLOR_APP, COLOR_APP_LIGHT, - //BAGL_FONT_SYMBOLS_0|BAGL_FONT_ALIGNMENT_CENTER|BAGL_FONT_ALIGNMENT_MIDDLE, - //0 }, " " /*BAGL_FONT_SYMBOLS_0_DASHBOARD*/, 0, COLOR_APP, 0xFFFFFF, - //io_seproxyhal_touch_exit, NULL, NULL}, + /// TOP STATUS BAR + {{BAGL_LABELINE , 0x00, 0, 45, 320, 30, 0, 0, BAGL_FILL, 0xFFFFFF, COLOR_APP, BAGL_FONT_OPEN_SANS_SEMIBOLD_10_13PX|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "CONFIRM ACCOUNT", 0, 0, 0, NULL, NULL, NULL}, - {{BAGL_LABELINE, 0x00, 30, 106, 320, 30, 0, 0, BAGL_FILL, 0x999999, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_SEMIBOLD_8_11PX, 0}, - "ACCOUNT", - 0, - 0, - 0, - NULL, - NULL, - NULL}, + //{{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 264, 19, 56, 44, 0, 0, BAGL_FILL, COLOR_APP, COLOR_APP_LIGHT, BAGL_FONT_SYMBOLS_0|BAGL_FONT_ALIGNMENT_CENTER|BAGL_FONT_ALIGNMENT_MIDDLE, 0 }, " " /*BAGL_FONT_SYMBOLS_0_DASHBOARD*/, 0, COLOR_APP, 0xFFFFFF, io_seproxyhal_touch_exit, NULL, NULL}, - {{BAGL_LABELINE, 0x10, 30, 136, 260, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0}, - addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x11, 30, 159, 260, 30, 0, 0, BAGL_FILL, 0x000000, - COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0}, - addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE , 0x00, 30, 106, 320, 30, 0, 0, BAGL_FILL, 0x999999, COLOR_BG_1, BAGL_FONT_OPEN_SANS_SEMIBOLD_8_11PX, 0 }, "ACCOUNT", 0, 0, 0, NULL, NULL, NULL}, - {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 40, 414, 115, 36, 0, 18, - BAGL_FILL, 0xCCCCCC, COLOR_BG_1, - BAGL_FONT_OPEN_SANS_REGULAR_11_14PX | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - "REJECT", - 0, - 0xB7B7B7, - COLOR_BG_1, - io_seproxyhal_touch_address_cancel, - NULL, - NULL}, - {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 165, 414, 115, 36, 0, 18, - BAGL_FILL, 0x41ccb4, COLOR_BG_1, - BAGL_FONT_OPEN_SANS_REGULAR_11_14PX | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - "CONFIRM", - 0, - 0x3ab7a2, - COLOR_BG_1, - io_seproxyhal_touch_address_ok, - NULL, - NULL}, + {{BAGL_LABELINE , 0x10, 30, 136, 260, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0 }, addressSummary, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE , 0x11, 30, 159, 260, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0 }, addressSummary, 0, 0, 0, NULL, NULL, NULL}, + + {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 40, 414, 115, 36, 0,18, BAGL_FILL, 0xCCCCCC, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_11_14PX|BAGL_FONT_ALIGNMENT_CENTER|BAGL_FONT_ALIGNMENT_MIDDLE, 0 }, "REJECT", 0, 0xB7B7B7, COLOR_BG_1, io_seproxyhal_touch_address_cancel, NULL, NULL}, + {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 165, 414, 115, 36, 0,18, BAGL_FILL, 0x41ccb4, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_11_14PX|BAGL_FONT_ALIGNMENT_CENTER|BAGL_FONT_ALIGNMENT_MIDDLE, 0 }, "CONFIRM", 0, 0x3ab7a2, COLOR_BG_1, io_seproxyhal_touch_address_ok, NULL, NULL}, }; -unsigned int ui_address_blue_prepro(const bagl_element_t *element) { - if (element->component.userid > 0) { - unsigned int length = strlen(fullAddress); - if (length >= (element->component.userid & 0xF) * MAX_CHAR_PER_LINE) { - os_memset(addressSummary, 0, MAX_CHAR_PER_LINE + 1); - os_memmove( - addressSummary, - fullAddress + - (element->component.userid & 0xF) * MAX_CHAR_PER_LINE, - MIN(length - - (element->component.userid & 0xF) * MAX_CHAR_PER_LINE, - MAX_CHAR_PER_LINE)); - return 1; - } - // nothing to draw for this line - return 0; +unsigned int ui_address_blue_prepro(const bagl_element_t* element) { + copy_element_and_map_coin_colors(element); + if(element->component.userid > 0) { + unsigned int length = strlen(fullAddress); + if (length >= (element->component.userid & 0xF) * MAX_CHAR_PER_LINE) { + os_memset(addressSummary, 0, MAX_CHAR_PER_LINE+1); + os_memmove(addressSummary, fullAddress+(element->component.userid & 0xF) * MAX_CHAR_PER_LINE, MIN(length - (element->component.userid & 0xF) * MAX_CHAR_PER_LINE, MAX_CHAR_PER_LINE)); + return &tmp_element; } - return 1; + // nothing to draw for this line + return 0; + } + return &tmp_element; } -unsigned int ui_address_blue_button(unsigned int button_mask, - unsigned int button_mask_counter) { - return 0; +unsigned int ui_address_blue_button(unsigned int button_mask, unsigned int button_mask_counter) { + return 0; } #endif // #if defined(TARGET_BLUE) #if defined(TARGET_NANOS) const bagl_element_t ui_address_nanos[] = { - // type userid x y w h str rad - // fill fg bg fid iid txt touchparams... ] - {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + // type userid x y w h str rad fill fg bg fid iid txt touchparams... ] + {{BAGL_RECTANGLE , 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, 0, 0}, NULL, 0, 0, 0, NULL, NULL, NULL}, - {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CROSS}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CHECK}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_ICON , 0x00, 3, 12, 7, 7, 0, 0, 0 , 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_CROSS }, NULL, 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_ICON , 0x00, 117, 13, 8, 6, 0, 0, 0 , 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_CHECK }, NULL, 0, 0, 0, NULL, NULL, NULL }, - //{{BAGL_ICON , 0x01, 31, 9, 14, 14, 0, 0, 0 - //, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_EYE_BADGE }, NULL, 0, 0, 0, - //NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x01, 0, 12, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Confirm", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x01, 0, 26, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "address", - 0, - 0, - 0, - NULL, - NULL, - NULL}, + //{{BAGL_ICON , 0x01, 31, 9, 14, 14, 0, 0, 0 , 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_EYE_BADGE }, NULL, 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_LABELINE , 0x01, 0, 12, 128, 12, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Confirm", 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_LABELINE , 0x01, 0, 26, 128, 12, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "address", 0, 0, 0, NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x02, 0, 12, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Address", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x02, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, - (char *)fullAddress, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE , 0x02, 0, 12, 128, 12, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_REGULAR_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Address", 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_LABELINE , 0x02, 23, 26, 82, 12, 0x80|10, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 26 }, (char*)fullAddress, 0, 0, 0, NULL, NULL, NULL }, }; -unsigned int ui_address_prepro(const bagl_element_t *element) { +unsigned int ui_address_prepro(const bagl_element_t* element) { if (element->component.userid > 0) { - unsigned int display = (ux_step == element->component.userid - 1); - if (display) { - switch (element->component.userid) { - case 1: - UX_CALLBACK_SET_INTERVAL(2000); - break; - case 2: - UX_CALLBACK_SET_INTERVAL(MAX( - 3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); - break; - } + unsigned int display = (ux_step == element->component.userid-1); + if(display) { + switch(element->component.userid) { + case 1: + UX_CALLBACK_SET_INTERVAL(2000); + break; + case 2: + UX_CALLBACK_SET_INTERVAL(MAX(3000, 1000+bagl_label_roundtrip_duration_ms(element, 7))); + break; + } } return display; } return 1; } -unsigned int ui_address_nanos_button(unsigned int button_mask, - unsigned int button_mask_counter); +unsigned int ui_address_nanos_button(unsigned int button_mask, unsigned int button_mask_counter); #endif // #if defined(TARGET_NANOS) + + #if defined(TARGET_NANOS) const bagl_element_t ui_approval_nanos[] = { - // type userid x y w h str rad - // fill fg bg fid iid txt touchparams... ] - {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + // type userid x y w h str rad fill fg bg fid iid txt touchparams... ] + {{BAGL_RECTANGLE , 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, 0, 0}, NULL, 0, 0, 0, NULL, NULL, NULL}, - {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CROSS}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CHECK}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_ICON , 0x00, 3, 12, 7, 7, 0, 0, 0 , 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_CROSS }, NULL, 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_ICON , 0x00, 117, 13, 8, 6, 0, 0, 0 , 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_CHECK }, NULL, 0, 0, 0, NULL, NULL, NULL }, - //{{BAGL_ICON , 0x01, 21, 9, 14, 14, 0, 0, 0 - //, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_TRANSACTION_BADGE }, NULL, 0, 0, - //0, NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x01, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Confirm", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x01, 0, 26, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "transaction", - 0, - 0, - 0, - NULL, - NULL, - NULL}, + //{{BAGL_ICON , 0x01, 21, 9, 14, 14, 0, 0, 0 , 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_TRANSACTION_BADGE }, NULL, 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_LABELINE , 0x01, 0, 12, 128, 32, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Confirm", 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_LABELINE , 0x01, 0, 26, 128, 32, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "transaction", 0, 0, 0, NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x02, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "WARNING", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x02, 23, 26, 82, 12, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Data present", - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE , 0x02, 0, 12, 128, 32, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_REGULAR_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "WARNING", 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_LABELINE , 0x02, 23, 26, 82, 12, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Data present", 0, 0, 0, NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x03, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Amount", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x03, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, - (char *)fullAmount, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE , 0x03, 0, 12, 128, 32, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_REGULAR_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Amount", 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_LABELINE , 0x03, 23, 26, 82, 12, 0x80|10, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 26 }, (char*)fullAmount, 0, 0, 0, NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x04, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Address", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x04, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 50}, - (char *)fullAddress, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE , 0x04, 0, 12, 128, 32, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_REGULAR_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Address", 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_LABELINE , 0x04, 23, 26, 82, 12, 0x80|10, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 50 }, (char*)fullAddress, 0, 0, 0, NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x05, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Maximum fees", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x05, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, - (char *)maxFee, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE , 0x05, 0, 12, 128, 32, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_REGULAR_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Maximum fees", 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_LABELINE , 0x05, 23, 26, 82, 12, 0x80|10, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 26 }, (char*)maxFee, 0, 0, 0, NULL, NULL, NULL }, }; -unsigned int ui_approval_prepro(const bagl_element_t *element) { +unsigned int ui_approval_prepro(const bagl_element_t* element) { unsigned int display = 1; if (element->component.userid > 0) { - display = (ux_step == element->component.userid - 1); - if (display) { - switch (element->component.userid) { - case 1: - UX_CALLBACK_SET_INTERVAL(2000); - break; - case 2: - if (dataPresent) { - UX_CALLBACK_SET_INTERVAL(3000); - } else { - display = 0; - ux_step++; // display the next step - } - break; - case 3: - UX_CALLBACK_SET_INTERVAL(MAX( - 3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); - break; - case 4: - UX_CALLBACK_SET_INTERVAL(MAX( - 3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); - break; - case 5: - UX_CALLBACK_SET_INTERVAL(MAX( - 3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); - break; + display = (ux_step == element->component.userid-1); + if(display) { + switch(element->component.userid) { + case 1: + UX_CALLBACK_SET_INTERVAL(2000); + break; + case 2: + if (dataPresent) { + UX_CALLBACK_SET_INTERVAL(3000); } + else { + display = 0; + ux_step++; // display the next step + } + break; + case 3: + UX_CALLBACK_SET_INTERVAL(MAX(3000, 1000+bagl_label_roundtrip_duration_ms(element, 7))); + break; + case 4: + UX_CALLBACK_SET_INTERVAL(MAX(3000, 1000+bagl_label_roundtrip_duration_ms(element, 7))); + break; + case 5: + UX_CALLBACK_SET_INTERVAL(MAX(3000, 1000+bagl_label_roundtrip_duration_ms(element, 7))); + break; + } } } return display; } -unsigned int ui_approval_nanos_button(unsigned int button_mask, - unsigned int button_mask_counter); +unsigned int ui_approval_nanos_button(unsigned int button_mask, unsigned int button_mask_counter); const bagl_element_t ui_approval_signMessage_nanos[] = { - // type userid x y w h str rad - // fill fg bg fid iid txt touchparams... ] - {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + // type userid x y w h str rad fill fg bg fid iid txt touchparams... ] + {{BAGL_RECTANGLE , 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, 0, 0}, NULL, 0, 0, 0, NULL, NULL, NULL}, + + {{BAGL_ICON , 0x00, 3, 12, 7, 7, 0, 0, 0 , 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_CROSS }, NULL, 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_ICON , 0x00, 117, 13, 8, 6, 0, 0, 0 , 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_CHECK }, NULL, 0, 0, 0, NULL, NULL, NULL }, - {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CROSS}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CHECK}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + //{{BAGL_ICON , 0x01, 28, 9, 14, 14, 0, 0, 0 , 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_TRANSACTION_BADGE }, NULL, 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_LABELINE , 0x01, 0, 12, 128, 32, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Sign the", 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_LABELINE , 0x01, 0, 26, 128, 32, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "message", 0, 0, 0, NULL, NULL, NULL }, - //{{BAGL_ICON , 0x01, 28, 9, 14, 14, 0, 0, 0 - //, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_TRANSACTION_BADGE }, NULL, 0, 0, - //0, NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x01, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Sign the", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x01, 0, 26, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "message", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_LABELINE, 0x02, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Message hash", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x02, 0, 26, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - fullAddress, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE , 0x02, 0, 12, 128, 32, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_REGULAR_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Message hash", 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_LABELINE , 0x02, 0, 26, 128, 32, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, fullAddress, 0, 0, 0, NULL, NULL, NULL }, }; unsigned int -ui_approval_signMessage_nanos_button(unsigned int button_mask, - unsigned int button_mask_counter); +ui_approval_signMessage_nanos_button(unsigned int button_mask, unsigned int button_mask_counter); unsigned int ui_approval_signMessage_prepro(const bagl_element_t *element) { if (element->component.userid > 0) { @@ -1789,16 +799,16 @@ unsigned int ui_approval_signMessage_prepro(const bagl_element_t *element) { void ui_idle(void) { skipWarning = false; #if defined(TARGET_BLUE) - UX_DISPLAY(ui_idle_blue, NULL); + UX_DISPLAY(ui_idle_blue, ui_idle_blue_prepro); #elif defined(TARGET_NANOS) - UX_MENU_DISPLAY(0, menu_main, NULL); + UX_MENU_DISPLAY(0, menu_main, NULL); #endif // #if TARGET_ID } #if defined(TARGET_BLUE) unsigned int io_seproxyhal_touch_settings(const bagl_element_t *e) { - UX_DISPLAY(ui_settings_blue, ui_settings_blue_prepro); - return 0; // do not redraw button, screen has switched + UX_DISPLAY(ui_settings_blue, ui_settings_blue_prepro); + return 0; // do not redraw button, screen has switched } #endif // #if defined(TARGET_BLUE) @@ -1812,17 +822,8 @@ unsigned int io_seproxyhal_touch_address_ok(const bagl_element_t *e) { uint32_t tx = set_result_get_publicKey(); G_io_apdu_buffer[tx++] = 0x90; G_io_apdu_buffer[tx++] = 0x00; -#ifdef HAVE_U2F - if (fidoActivated) { - u2f_proxy_response((u2f_service_t *)&u2fService, tx); - } else { - // Send back the response, do not restart the event loop - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); - } -#else // HAVE_U2F // Send back the response, do not restart the event loop io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); -#endif // HAVE_U2F // Display back the original UX ui_idle(); return 0; // do not redraw the widget @@ -1831,34 +832,24 @@ unsigned int io_seproxyhal_touch_address_ok(const bagl_element_t *e) { unsigned int io_seproxyhal_touch_address_cancel(const bagl_element_t *e) { G_io_apdu_buffer[0] = 0x69; G_io_apdu_buffer[1] = 0x85; -#ifdef HAVE_U2F - if (fidoActivated) { - u2f_proxy_response((u2f_service_t *)&u2fService, 2); - } else { - // Send back the response, do not restart the event loop - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); - } -#else // HAVE_U2F // Send back the response, do not restart the event loop io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); -#endif // HAVE_U2F // Display back the original UX ui_idle(); return 0; // do not redraw the widget } #if defined(TARGET_NANOS) -unsigned int ui_address_nanos_button(unsigned int button_mask, - unsigned int button_mask_counter) { - switch (button_mask) { - case BUTTON_EVT_RELEASED | BUTTON_LEFT: // CANCEL - io_seproxyhal_touch_address_cancel(NULL); - break; +unsigned int ui_address_nanos_button(unsigned int button_mask, unsigned int button_mask_counter) { + switch(button_mask) { + case BUTTON_EVT_RELEASED|BUTTON_LEFT: // CANCEL + io_seproxyhal_touch_address_cancel(NULL); + break; - case BUTTON_EVT_RELEASED | BUTTON_RIGHT: { // OK - io_seproxyhal_touch_address_ok(NULL); - break; - } + case BUTTON_EVT_RELEASED|BUTTON_RIGHT: { // OK + io_seproxyhal_touch_address_ok(NULL); + break; + } } return 0; } @@ -1871,40 +862,41 @@ unsigned int io_seproxyhal_touch_tx_ok(const bagl_element_t *e) { cx_ecfp_private_key_t privateKey; uint32_t tx = 0; uint8_t rLength, sLength, rOffset, sOffset; - os_perso_derive_node_bip32( - CX_CURVE_256K1, tmpCtx.transactionContext.bip32Path, - tmpCtx.transactionContext.pathLength, privateKeyData, NULL); - cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, &privateKey); + uint32_t v = 0; + if (tmpContent.txContent.vLength == 1) { + v = tmpContent.txContent.v[0]; + } + else + if (tmpContent.txContent.vLength == 2) { + v = (tmpContent.txContent.v[0] << 8) | tmpContent.txContent.v[1]; + } + os_perso_derive_node_bip32(CX_CURVE_256K1, tmpCtx.transactionContext.bip32Path, + tmpCtx.transactionContext.pathLength, + privateKeyData, NULL); + cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, + &privateKey); os_memset(privateKeyData, 0, sizeof(privateKeyData)); -#if CX_APILEVEL >= 8 - unsigned int info = 0; + unsigned int info = 0; signatureLength = cx_ecdsa_sign(&privateKey, CX_RND_RFC6979 | CX_LAST, CX_SHA256, tmpCtx.transactionContext.hash, sizeof(tmpCtx.transactionContext.hash), signature, &info); - if (info & CX_ECCINFO_PARITY_ODD) { - signature[0] |= 0x01; - } -#else - signatureLength = - cx_ecdsa_sign(&privateKey, CX_RND_RFC6979 | CX_LAST, CX_SHA256, - tmpCtx.transactionContext.hash, - sizeof(tmpCtx.transactionContext.hash), signature); -#endif os_memset(&privateKey, 0, sizeof(privateKey)); // Parity is present in the sequence tag in the legacy API if (tmpContent.txContent.vLength == 0) { - // Legacy API - G_io_apdu_buffer[0] = 27 + (signature[0] & 0x01); - } else { - // New API - uint8_t v; - if (tmpContent.txContent.vLength == 1) { - v = tmpContent.txContent.v[0]; - } else { - v = tmpContent.txContent.v[1]; - } - G_io_apdu_buffer[0] = (v * 2) + 35 + (signature[0] & 0x01); + // Legacy API + G_io_apdu_buffer[0] = 27; + } + else { + // New API + // Note that this is wrong for a large v, but the client can always recover + G_io_apdu_buffer[0] = (v * 2) + 35; + } + if (info & CX_ECCINFO_PARITY_ODD) { + G_io_apdu_buffer[0]++; + } + if (info & CX_ECCINFO_xGTn) { + G_io_apdu_buffer[0] += 2; } rLength = signature[3]; sLength = signature[4 + rLength + 1]; @@ -1916,17 +908,9 @@ unsigned int io_seproxyhal_touch_tx_ok(const bagl_element_t *e) { tx = 65; G_io_apdu_buffer[tx++] = 0x90; G_io_apdu_buffer[tx++] = 0x00; -#ifdef HAVE_U2F - if (fidoActivated) { - u2f_proxy_response((u2f_service_t *)&u2fService, tx); - } else { - // Send back the response, do not restart the event loop - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); - } -#else // HAVE_U2F +send: // Send back the response, do not restart the event loop io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); -#endif // HAVE_U2F // Display back the original UX ui_idle(); return 0; // do not redraw the widget @@ -1935,22 +919,14 @@ unsigned int io_seproxyhal_touch_tx_ok(const bagl_element_t *e) { unsigned int io_seproxyhal_touch_tx_cancel(const bagl_element_t *e) { G_io_apdu_buffer[0] = 0x69; G_io_apdu_buffer[1] = 0x85; -#ifdef HAVE_U2F - if (fidoActivated) { - u2f_proxy_response((u2f_service_t *)&u2fService, 2); - } else { - // Send back the response, do not restart the event loop - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); - } -#else // HAVE_U2F // Send back the response, do not restart the event loop io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); -#endif // HAVE_U2F // Display back the original UX ui_idle(); return 0; // do not redraw the widget } + unsigned int io_seproxyhal_touch_signMessage_ok(const bagl_element_t *e) { uint8_t privateKeyData[32]; uint8_t signature[100]; @@ -1963,24 +939,19 @@ unsigned int io_seproxyhal_touch_signMessage_ok(const bagl_element_t *e) { tmpCtx.messageSigningContext.pathLength, privateKeyData, NULL); cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, &privateKey); os_memset(privateKeyData, 0, sizeof(privateKeyData)); - -#if CX_APILEVEL >= 8 - unsigned int info = 0; - signatureLength = cx_ecdsa_sign( - &privateKey, CX_RND_RFC6979 | CX_LAST, CX_SHA256, - tmpCtx.messageSigningContext.hash, - sizeof(tmpCtx.messageSigningContext.hash), signature, &info); - if (info & CX_ECCINFO_PARITY_ODD) { - signature[0] |= 0x01; - } -#else + unsigned int info = 0; signatureLength = cx_ecdsa_sign(&privateKey, CX_RND_RFC6979 | CX_LAST, CX_SHA256, tmpCtx.messageSigningContext.hash, - sizeof(tmpCtx.messageSigningContext.hash), signature); -#endif + sizeof(tmpCtx.messageSigningContext.hash), signature, &info); os_memset(&privateKey, 0, sizeof(privateKey)); - G_io_apdu_buffer[0] = 27 + (signature[0] & 0x01); + G_io_apdu_buffer[0] = 27; + if (info & CX_ECCINFO_PARITY_ODD) { + G_io_apdu_buffer[0]++; + } + if (info & CX_ECCINFO_xGTn) { + G_io_apdu_buffer[0] += 2; + } rLength = signature[3]; sLength = signature[4 + rLength + 1]; rOffset = (rLength == 33 ? 1 : 0); @@ -1991,17 +962,8 @@ unsigned int io_seproxyhal_touch_signMessage_ok(const bagl_element_t *e) { tx = 65; G_io_apdu_buffer[tx++] = 0x90; G_io_apdu_buffer[tx++] = 0x00; -#ifdef HAVE_U2F - if (fidoActivated) { - u2f_proxy_response((u2f_service_t *)&u2fService, tx); - } else { - // Send back the response, do not restart the event loop - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); - } -#else // HAVE_U2F // Send back the response, do not restart the event loop io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); -#endif // HAVE_U2F // Display back the original UX ui_idle(); return 0; // do not redraw the widget @@ -2010,17 +972,8 @@ unsigned int io_seproxyhal_touch_signMessage_ok(const bagl_element_t *e) { unsigned int io_seproxyhal_touch_signMessage_cancel(const bagl_element_t *e) { G_io_apdu_buffer[0] = 0x69; G_io_apdu_buffer[1] = 0x85; -#ifdef HAVE_U2F - if (fidoActivated) { - u2f_proxy_response((u2f_service_t *)&u2fService, 2); - } else { - // Send back the response, do not restart the event loop - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); - } -#else // HAVE_U2F // Send back the response, do not restart the event loop io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); -#endif // HAVE_U2F // Display back the original UX ui_idle(); return 0; // do not redraw the widget @@ -2028,51 +981,46 @@ unsigned int io_seproxyhal_touch_signMessage_cancel(const bagl_element_t *e) { #if defined(TARGET_BLUE) void ui_approval_blue_init(void) { - UX_DISPLAY(ui_approval_blue, ui_approval_blue_prepro); + UX_DISPLAY(ui_approval_blue, ui_approval_blue_prepro); } void ui_approval_transaction_blue_init(void) { - ui_approval_blue_ok = (bagl_element_callback_t)io_seproxyhal_touch_tx_ok; - ui_approval_blue_cancel = - (bagl_element_callback_t)io_seproxyhal_touch_tx_cancel; - G_ui_approval_blue_state = APPROVAL_TRANSACTION; - ui_approval_blue_values[0] = fullAmount; - ui_approval_blue_values[1] = fullAddress; - ui_approval_blue_values[2] = maxFee; - ui_approval_blue_init(); + ui_approval_blue_ok = (bagl_element_callback_t) io_seproxyhal_touch_tx_ok; + ui_approval_blue_cancel = (bagl_element_callback_t) io_seproxyhal_touch_tx_cancel; + G_ui_approval_blue_state = APPROVAL_TRANSACTION; + ui_approval_blue_values[0] = fullAmount; + ui_approval_blue_values[1] = fullAddress; + ui_approval_blue_values[2] = maxFee; + ui_approval_blue_init(); } void ui_approval_message_sign_blue_init(void) { - ui_approval_blue_ok = - (bagl_element_callback_t)io_seproxyhal_touch_signMessage_ok; - ui_approval_blue_cancel = - (bagl_element_callback_t)io_seproxyhal_touch_signMessage_cancel; - G_ui_approval_blue_state = APPROVAL_MESSAGE; - ui_approval_blue_values[0] = fullAmount; - ui_approval_blue_values[1] = NULL; - ui_approval_blue_values[2] = NULL; - ui_approval_blue_init(); + ui_approval_blue_ok = (bagl_element_callback_t) io_seproxyhal_touch_signMessage_ok; + ui_approval_blue_cancel = (bagl_element_callback_t) io_seproxyhal_touch_signMessage_cancel; + G_ui_approval_blue_state = APPROVAL_MESSAGE; + ui_approval_blue_values[0] = fullAmount; + ui_approval_blue_values[1] = NULL; + ui_approval_blue_values[2] = NULL; + ui_approval_blue_init(); } #elif defined(TARGET_NANOS) -unsigned int ui_approval_nanos_button(unsigned int button_mask, - unsigned int button_mask_counter) { - switch (button_mask) { - case BUTTON_EVT_RELEASED | BUTTON_LEFT: - io_seproxyhal_touch_tx_cancel(NULL); - break; +unsigned int ui_approval_nanos_button(unsigned int button_mask, unsigned int button_mask_counter) { + switch(button_mask) { + case BUTTON_EVT_RELEASED|BUTTON_LEFT: + io_seproxyhal_touch_tx_cancel(NULL); + break; - case BUTTON_EVT_RELEASED | BUTTON_RIGHT: { - io_seproxyhal_touch_tx_ok(NULL); - break; - } - } + case BUTTON_EVT_RELEASED|BUTTON_RIGHT: { + io_seproxyhal_touch_tx_ok(NULL); + break; + } + } return 0; } -unsigned int -ui_approval_signMessage_nanos_button(unsigned int button_mask, - unsigned int button_mask_counter) { + +unsigned int ui_approval_signMessage_nanos_button(unsigned int button_mask, unsigned int button_mask_counter) { switch (button_mask) { case BUTTON_EVT_RELEASED | BUTTON_LEFT: io_seproxyhal_touch_signMessage_cancel(NULL); @@ -2123,9 +1071,8 @@ uint32_t set_result_get_publicKey() { os_memmove(G_io_apdu_buffer + tx, tmpCtx.publicKeyContext.address, 40); tx += 40; if (tmpCtx.publicKeyContext.getChaincode) { - os_memmove(G_io_apdu_buffer + tx, tmpCtx.publicKeyContext.chainCode, - 32); - tx += 32; + os_memmove(G_io_apdu_buffer + tx, tmpCtx.publicKeyContext.chainCode, 32); + tx += 32; } return tx; } @@ -2140,218 +1087,268 @@ void convertUint256BE(uint8_t *data, uint32_t length, uint256_t *target) { bool customProcessor(txContext_t *context) { if ((context->currentField == TX_RLP_DATA) && (context->currentFieldLength != 0)) { - if (!N_storage.dataAllowed) { - PRINTF("Data field forbidden\n"); - THROW(EXCEPTION); - } else { - dataPresent = true; - if (context->currentFieldLength == sizeof(tokenContext.data)) { - if (context->currentFieldPos < context->currentFieldLength) { - uint32_t copySize = (context->commandLength < - ((context->currentFieldLength - - context->currentFieldPos)) - ? context->commandLength - : context->currentFieldLength - - context->currentFieldPos); - copyTxData(context, - tokenContext.data + context->currentFieldPos, - copySize); - } - if (context->currentFieldPos == context->currentFieldLength) { - context->currentField++; - context->processingField = false; - // Initial check to see if the token content can be - // processed - tokenContext.provisioned = - (os_memcmp(tokenContext.data, TOKEN_TRANSFER_ID, 4) == - 0); - } - return true; - } - } - } + dataPresent = true; + if (context->currentFieldLength == sizeof(tokenContext.data)) { + if (context->currentFieldPos < context->currentFieldLength) { + uint32_t copySize = + (context->commandLength < + ((context->currentFieldLength - context->currentFieldPos)) + ? context->commandLength + : context->currentFieldLength - context->currentFieldPos); + copyTxData(context, tokenContext.data + context->currentFieldPos, + copySize); + } + if (context->currentFieldPos == context->currentFieldLength) { + context->currentField++; + context->processingField = false; + // Initial check to see if the token content can be processed + tokenContext.provisioned = (os_memcmp(tokenContext.data, TOKEN_TRANSFER_ID, 4) == 0); + } + return true; + } + } return false; } -void handleGetPublicKey(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, - uint16_t dataLength, volatile unsigned int *flags, - volatile unsigned int *tx) { - UNUSED(dataLength); - uint8_t privateKeyData[32]; - uint32_t bip32Path[MAX_BIP32_PATH]; - uint32_t i; - uint8_t bip32PathLength = *(dataBuffer++); - cx_ecfp_private_key_t privateKey; - if ((bip32PathLength < 0x01) || (bip32PathLength > MAX_BIP32_PATH)) { - PRINTF("Invalid path\n"); - THROW(0x6a80); - } - if ((p1 != P1_CONFIRM) && (p1 != P1_NON_CONFIRM)) { - THROW(0x6B00); - } - if ((p2 != P2_CHAINCODE) && (p2 != P2_NO_CHAINCODE)) { - THROW(0x6B00); - } - for (i = 0; i < bip32PathLength; i++) { - bip32Path[i] = (dataBuffer[0] << 24) | (dataBuffer[1] << 16) | - (dataBuffer[2] << 8) | (dataBuffer[3]); - dataBuffer += 4; - } - tmpCtx.publicKeyContext.getChaincode = (p2 == P2_CHAINCODE); - os_perso_derive_node_bip32(CX_CURVE_256K1, bip32Path, bip32PathLength, - privateKeyData, - (tmpCtx.publicKeyContext.getChaincode - ? tmpCtx.publicKeyContext.chainCode - : NULL)); - cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, &privateKey); - cx_ecfp_generate_pair(CX_CURVE_256K1, &tmpCtx.publicKeyContext.publicKey, - &privateKey, 1); - os_memset(&privateKey, 0, sizeof(privateKey)); - os_memset(privateKeyData, 0, sizeof(privateKeyData)); - getEthAddressStringFromKey(&tmpCtx.publicKeyContext.publicKey, - tmpCtx.publicKeyContext.address, &sha3); - if (p1 == P1_NON_CONFIRM) { - *tx = set_result_get_publicKey(); - THROW(0x9000); - } else { - /* - addressSummary[0] = '0'; - addressSummary[1] = 'x'; - os_memmove((unsigned char *)(addressSummary + 2), - tmpCtx.publicKeyContext.address, 4); - os_memmove((unsigned char *)(addressSummary + 6), "...", 3); - os_memmove((unsigned char *)(addressSummary + 9), - tmpCtx.publicKeyContext.address + 40 - 4, 4); - addressSummary[13] = '\0'; - */ +void handleGetPublicKey(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, volatile unsigned int *flags, volatile unsigned int *tx) { + UNUSED(dataLength); + uint8_t privateKeyData[32]; + uint32_t bip32Path[MAX_BIP32_PATH]; + uint32_t i; + uint8_t bip32PathLength = *(dataBuffer++); + cx_ecfp_private_key_t privateKey; - // prepare for a UI based reply - skipWarning = false; + if ((bip32PathLength < 0x01) || + (bip32PathLength > MAX_BIP32_PATH)) { + PRINTF("Invalid path\n"); + THROW(0x6a80); + } + if ((p1 != P1_CONFIRM) && (p1 != P1_NON_CONFIRM)) { + THROW(0x6B00); + } + if ((p2 != P2_CHAINCODE) && (p2 != P2_NO_CHAINCODE)) { + THROW(0x6B00); + } + for (i = 0; i < bip32PathLength; i++) { + bip32Path[i] = (dataBuffer[0] << 24) | + (dataBuffer[1] << 16) | + (dataBuffer[2] << 8) | (dataBuffer[3]); + dataBuffer += 4; + } + tmpCtx.publicKeyContext.getChaincode = (p2 == P2_CHAINCODE); + os_perso_derive_node_bip32(CX_CURVE_256K1, bip32Path, bip32PathLength, privateKeyData, (tmpCtx.publicKeyContext.getChaincode ? tmpCtx.publicKeyContext.chainCode : NULL)); + cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, &privateKey); + cx_ecfp_generate_pair(CX_CURVE_256K1, &tmpCtx.publicKeyContext.publicKey, &privateKey, 1); + os_memset(&privateKey, 0, sizeof(privateKey)); + os_memset(privateKeyData, 0, sizeof(privateKeyData)); + getEthAddressStringFromKey(&tmpCtx.publicKeyContext.publicKey, tmpCtx.publicKeyContext.address, &sha3); + if (p1 == P1_NON_CONFIRM) { + *tx = set_result_get_publicKey(); + THROW(0x9000); + } + else + { + /* + addressSummary[0] = '0'; + addressSummary[1] = 'x'; + os_memmove((unsigned char *)(addressSummary + 2), tmpCtx.publicKeyContext.address, 4); + os_memmove((unsigned char *)(addressSummary + 6), "...", 3); + os_memmove((unsigned char *)(addressSummary + 9), tmpCtx.publicKeyContext.address + 40 - 4, 4); + addressSummary[13] = '\0'; + */ + + // prepare for a UI based reply + skipWarning = false; #if defined(TARGET_BLUE) - snprintf(fullAddress, sizeof(fullAddress), "0x%.*s", 40, - tmpCtx.publicKeyContext.address); - UX_DISPLAY(ui_address_blue, ui_address_blue_prepro); + snprintf(fullAddress, sizeof(fullAddress), "0x%.*s", 40, tmpCtx.publicKeyContext.address); + UX_DISPLAY(ui_address_blue, ui_address_blue_prepro); #elif defined(TARGET_NANOS) - snprintf(fullAddress, sizeof(fullAddress), "0x%.*s", 40, - tmpCtx.publicKeyContext.address); - ux_step = 0; - ux_step_count = 2; - UX_DISPLAY(ui_address_nanos, ui_address_prepro); + snprintf(fullAddress, sizeof(fullAddress), "0x%.*s", 40, tmpCtx.publicKeyContext.address); + ux_step = 0; + ux_step_count = 2; + UX_DISPLAY(ui_address_nanos, ui_address_prepro); #endif // #if TARGET_ID - - *flags |= IO_ASYNCH_REPLY; - } + + *flags |= IO_ASYNCH_REPLY; + } } -void handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, - uint16_t dataLength, volatile unsigned int *flags, - volatile unsigned int *tx) { - UNUSED(tx); - parserStatus_e txResult; - uint256_t gasPrice, startGas, uint256; - uint32_t i; - uint8_t address[41]; - uint8_t decimals = WEI_TO_ETHER; - uint8_t *ticker = TICKER_ETH; - uint8_t tickerOffset = 0; - if (p1 == P1_FIRST) { - tmpCtx.transactionContext.pathLength = workBuffer[0]; - if ((tmpCtx.transactionContext.pathLength < 0x01) || - (tmpCtx.transactionContext.pathLength > MAX_BIP32_PATH)) { - PRINTF("Invalid path\n"); - THROW(0x6a80); - } - workBuffer++; - dataLength--; - for (i = 0; i < tmpCtx.transactionContext.pathLength; i++) { - tmpCtx.transactionContext.bip32Path[i] = - (workBuffer[0] << 24) | (workBuffer[1] << 16) | - (workBuffer[2] << 8) | (workBuffer[3]); - workBuffer += 4; - dataLength -= 4; - } - dataPresent = false; - tokenContext.provisioned = false; - initTx(&txContext, &sha3, &tmpContent.txContent, customProcessor, NULL); - } else if (p1 != P1_MORE) { - THROW(0x6B00); +void handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength, volatile unsigned int *flags, volatile unsigned int *tx) { + UNUSED(tx); + parserStatus_e txResult; + uint256_t gasPrice, startGas, uint256; + uint32_t i; + uint8_t address[41]; + uint8_t decimals = WEI_TO_ETHER; + uint8_t *ticker = PIC(chainConfig->coinName); + uint8_t tickerOffset = 0; + if (p1 == P1_FIRST) { + tmpCtx.transactionContext.pathLength = workBuffer[0]; + if ((tmpCtx.transactionContext.pathLength < 0x01) || + (tmpCtx.transactionContext.pathLength > MAX_BIP32_PATH)) { + PRINTF("Invalid path\n"); + THROW(0x6a80); } - if (p2 != 0) { - THROW(0x6B00); + workBuffer++; + dataLength--; + for (i = 0; i < tmpCtx.transactionContext.pathLength; i++) { + tmpCtx.transactionContext.bip32Path[i] = + (workBuffer[0] << 24) | (workBuffer[1] << 16) | + (workBuffer[2] << 8) | (workBuffer[3]); + workBuffer += 4; + dataLength -= 4; } - if (txContext.currentField == TX_RLP_NONE) { - PRINTF("Parser not initialized\n"); - THROW(0x6985); - } - txResult = processTx(&txContext, workBuffer, dataLength); - switch (txResult) { + dataPresent = false; + tokenContext.provisioned = false; + initTx(&txContext, &sha3, &tmpContent.txContent, customProcessor, NULL); + } + else + if (p1 != P1_MORE) { + THROW(0x6B00); + } + if (p2 != 0) { + THROW(0x6B00); + } + if (txContext.currentField == TX_RLP_NONE) { + PRINTF("Parser not initialized\n"); + THROW(0x6985); + } + txResult = processTx(&txContext, workBuffer, dataLength, (chainConfig->kind == CHAIN_KIND_WANCHAIN ? TX_FLAG_TYPE : 0)); + switch (txResult) { case USTREAM_FINISHED: - break; + break; case USTREAM_PROCESSING: - THROW(0x9000); + THROW(0x9000); case USTREAM_FAULT: - THROW(0x6A80); + THROW(0x6A80); default: - PRINTF("Unexpected parser status\n"); + PRINTF("Unexpected parser status\n"); + THROW(0x6A80); + } + // Verify the chain + if (chainConfig->chainId != 0) { + uint32_t v; + if (tmpContent.txContent.vLength == 1) { + v = tmpContent.txContent.v[0]; + } + else + if (tmpContent.txContent.vLength == 2) { + v = (tmpContent.txContent.v[0] << 8) | tmpContent.txContent.v[1]; + } + if (chainConfig->chainId != v) { + PRINTF("Invalid chainId %d expected %d\n", v, chainConfig->chainId); THROW(0x6A80); } - - // Store the hash - cx_hash((cx_hash_t *)&sha3, CX_LAST, tmpCtx.transactionContext.hash, 0, - tmpCtx.transactionContext.hash); + } + // Store the hash + cx_hash((cx_hash_t *)&sha3, CX_LAST, tmpCtx.transactionContext.hash, 0, tmpCtx.transactionContext.hash); // If there is a token to process, check if it is well known if (tokenContext.provisioned) { - for (i = 0; i < NUM_TOKENS; i++) { - tokenDefinition_t *currentToken = PIC(&TOKENS[i]); - if (os_memcmp(currentToken->address, - tmpContent.txContent.destination, 20) == 0) { + uint32_t numTokens = 0; + switch(chainConfig->kind) { + case CHAIN_KIND_ETHEREUM: + numTokens = NUM_TOKENS_ETHEREUM; + break; + case CHAIN_KIND_ETHEREUM_CLASSIC: + numTokens = NUM_TOKENS_ETHEREUM_CLASSIC; + break; + case CHAIN_KIND_POA: + numTokens = NUM_TOKENS_POA; + break; + case CHAIN_KIND_RSK: + numTokens = NUM_TOKENS_RSK; + break; + case CHAIN_KIND_EXPANSE: + numTokens = NUM_TOKENS_EXPANSE; + break; + case CHAIN_KIND_UBIQ: + numTokens = NUM_TOKENS_UBIQ; + break; + case CHAIN_KIND_WANCHAIN: + numTokens = NUM_TOKENS_WANCHAIN; + break; + case CHAIN_KIND_KUSD: + numTokens = NUM_TOKENS_KUSD; + break; + } + for (i=0; ikind) { + case CHAIN_KIND_ETHEREUM: + currentToken = PIC(&TOKENS_ETHEREUM[i]); + break; + case CHAIN_KIND_ETHEREUM_CLASSIC: + currentToken = PIC(&TOKENS_ETHEREUM_CLASSIC[i]); + break; + case CHAIN_KIND_POA: + currentToken = PIC(&TOKENS_POA[i]); + break; + case CHAIN_KIND_RSK: + currentToken = PIC(&TOKENS_RSK[i]); + break; + case CHAIN_KIND_EXPANSE: + currentToken = PIC(&TOKENS_EXPANSE[i]); + break; + case CHAIN_KIND_UBIQ: + currentToken = PIC(&TOKENS_UBIQ[i]); + break; + case CHAIN_KIND_WANCHAIN: + currentToken = PIC(&TOKENS_WANCHAIN[i]); + break; + case CHAIN_KIND_KUSD: + currentToken = PIC(&TOKENS_KUSD[i]); + break; + } + if (os_memcmp(currentToken->address, tmpContent.txContent.destination, 20) == 0) { dataPresent = false; decimals = currentToken->decimals; ticker = currentToken->ticker; tmpContent.txContent.destinationLength = 20; - os_memmove(tmpContent.txContent.destination, - tokenContext.data + 4 + 12, 20); - os_memmove(tmpContent.txContent.value.value, - tokenContext.data + 4 + 32, 32); + os_memmove(tmpContent.txContent.destination, tokenContext.data + 4 + 12, 20); + os_memmove(tmpContent.txContent.value.value, tokenContext.data + 4 + 32, 32); tmpContent.txContent.value.length = 32; break; } } + } + else { + if (dataPresent && !N_storage.dataAllowed) { + PRINTF("Data field forbidden\n"); + THROW(0x6A80); + } } - // Add address - if (tmpContent.txContent.destinationLength != 0) { - getEthAddressStringFromBinary(tmpContent.txContent.destination, address, - &sha3); - /* - addressSummary[0] = '0'; - addressSummary[1] = 'x'; - os_memmove((unsigned char *)(addressSummary + 2), address, 4); - os_memmove((unsigned char *)(addressSummary + 6), "...", 3); - os_memmove((unsigned char *)(addressSummary + 9), address + 40 - 4, 4); - addressSummary[13] = '\0'; - */ + // Add address + if (tmpContent.txContent.destinationLength != 0) { + getEthAddressStringFromBinary(tmpContent.txContent.destination, address, &sha3); + /* + addressSummary[0] = '0'; + addressSummary[1] = 'x'; + os_memmove((unsigned char *)(addressSummary + 2), address, 4); + os_memmove((unsigned char *)(addressSummary + 6), "...", 3); + os_memmove((unsigned char *)(addressSummary + 9), address + 40 - 4, 4); + addressSummary[13] = '\0'; + */ - fullAddress[0] = '0'; - fullAddress[1] = 'x'; - os_memmove((unsigned char *)fullAddress + 2, address, 40); - fullAddress[42] = '\0'; - } else { - os_memmove((void *)addressSummary, CONTRACT_ADDRESS, - sizeof(CONTRACT_ADDRESS)); - strcpy(fullAddress, "Contract"); - } - // Add amount in ethers or tokens - convertUint256BE(tmpContent.txContent.value.value, - tmpContent.txContent.value.length, &uint256); - tostring256(&uint256, 10, (char *)(G_io_apdu_buffer + 100), 100); - i = 0; - while (G_io_apdu_buffer[100 + i]) { - i++; - } - adjustDecimals((char *)(G_io_apdu_buffer + 100), i, - (char *)G_io_apdu_buffer, 100, decimals); - i = 0; + fullAddress[0] = '0'; + fullAddress[1] = 'x'; + os_memmove((unsigned char *)fullAddress+2, address, 40); + fullAddress[42] = '\0'; + } + else + { + os_memmove((void*)addressSummary, CONTRACT_ADDRESS, sizeof(CONTRACT_ADDRESS)); + strcpy(fullAddress, "Contract"); + } + // Add amount in ethers or tokens + convertUint256BE(tmpContent.txContent.value.value, tmpContent.txContent.value.length, &uint256); + tostring256(&uint256, 10, (char *)(G_io_apdu_buffer + 100), 100); + i = 0; + while (G_io_apdu_buffer[100 + i]) { + i++; + } + adjustDecimals((char *)(G_io_apdu_buffer + 100), i, (char *)G_io_apdu_buffer, 100, decimals); + i = 0; tickerOffset = 0; while (ticker[tickerOffset]) { fullAmount[tickerOffset] = ticker[tickerOffset]; @@ -2360,226 +1357,202 @@ void handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, while (G_io_apdu_buffer[i]) { fullAmount[tickerOffset + i] = G_io_apdu_buffer[i]; i++; - } - fullAmount[tickerOffset + i] = '\0'; - // Compute maximum fee - convertUint256BE(tmpContent.txContent.gasprice.value, - tmpContent.txContent.gasprice.length, &gasPrice); - convertUint256BE(tmpContent.txContent.startgas.value, - tmpContent.txContent.startgas.length, &startGas); - mul256(&gasPrice, &startGas, &uint256); - tostring256(&uint256, 10, (char *)(G_io_apdu_buffer + 100), 100); - i = 0; - while (G_io_apdu_buffer[100 + i]) { - i++; - } - adjustDecimals((char *)(G_io_apdu_buffer + 100), i, - (char *)G_io_apdu_buffer, 100, WEI_TO_ETHER); - i = 0; - tickerOffset = 0; - while (ticker[tickerOffset]) { - maxFee[tickerOffset] = ticker[tickerOffset]; - tickerOffset++; - } - tickerOffset++; - while (G_io_apdu_buffer[i]) { - maxFee[tickerOffset + i] = G_io_apdu_buffer[i]; - i++; - } - maxFee[tickerOffset + i] = '\0'; + } + fullAmount[tickerOffset + i] = '\0'; + // Compute maximum fee + convertUint256BE(tmpContent.txContent.gasprice.value, tmpContent.txContent.gasprice.length, &gasPrice); + convertUint256BE(tmpContent.txContent.startgas.value, tmpContent.txContent.startgas.length, &startGas); + mul256(&gasPrice, &startGas, &uint256); + tostring256(&uint256, 10, (char *)(G_io_apdu_buffer + 100), 100); + i = 0; + while (G_io_apdu_buffer[100 + i]) { + i++; + } + adjustDecimals((char *)(G_io_apdu_buffer + 100), i, (char *)G_io_apdu_buffer, 100, WEI_TO_ETHER); + i = 0; + tickerOffset=0; + while (ticker[tickerOffset]) { + maxFee[tickerOffset] = ticker[tickerOffset]; + tickerOffset++; + } + tickerOffset++; + while (G_io_apdu_buffer[i]) { + maxFee[tickerOffset + i] = G_io_apdu_buffer[i]; + i++; + } + maxFee[tickerOffset + i] = '\0'; #if defined(TARGET_BLUE) - ui_approval_transaction_blue_init(); + ui_approval_transaction_blue_init(); #elif defined(TARGET_NANOS) - skipWarning = !dataPresent; - ux_step = 0; - ux_step_count = 5; - UX_DISPLAY(ui_approval_nanos, ui_approval_prepro); + skipWarning = !dataPresent; + ux_step = 0; + ux_step_count = 5; + UX_DISPLAY(ui_approval_nanos, ui_approval_prepro); #endif // #if TARGET_ID - *flags |= IO_ASYNCH_REPLY; + *flags |= IO_ASYNCH_REPLY; } -void handleGetAppConfiguration(uint8_t p1, uint8_t p2, uint8_t *workBuffer, - uint16_t dataLength, - volatile unsigned int *flags, - volatile unsigned int *tx) { - UNUSED(p1); - UNUSED(p2); - UNUSED(workBuffer); - UNUSED(dataLength); - UNUSED(flags); - G_io_apdu_buffer[0] = (N_storage.dataAllowed ? 0x01 : 0x00); - G_io_apdu_buffer[1] = LEDGER_MAJOR_VERSION; - G_io_apdu_buffer[2] = LEDGER_MINOR_VERSION; - G_io_apdu_buffer[3] = LEDGER_PATCH_VERSION; - *tx = 4; - THROW(0x9000); +void handleGetAppConfiguration(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength, volatile unsigned int *flags, volatile unsigned int *tx) { + UNUSED(p1); + UNUSED(p2); + UNUSED(workBuffer); + UNUSED(dataLength); + UNUSED(flags); + G_io_apdu_buffer[0] = (N_storage.dataAllowed ? 0x01 : 0x00); + G_io_apdu_buffer[1] = LEDGER_MAJOR_VERSION; + G_io_apdu_buffer[2] = LEDGER_MINOR_VERSION; + G_io_apdu_buffer[3] = LEDGER_PATCH_VERSION; + *tx = 4; + THROW(0x9000); } -void handleSignPersonalMessage(uint8_t p1, uint8_t p2, uint8_t *workBuffer, - uint16_t dataLength, - volatile unsigned int *flags, - volatile unsigned int *tx) { - UNUSED(tx); - uint8_t hashMessage[32]; - if (p1 == P1_FIRST) { - char tmp[11]; - uint32_t index; - uint32_t base = 10; - uint8_t pos = 0; - uint32_t i; - tmpCtx.messageSigningContext.pathLength = workBuffer[0]; - if ((tmpCtx.messageSigningContext.pathLength < 0x01) || - (tmpCtx.messageSigningContext.pathLength > MAX_BIP32_PATH)) { - PRINTF("Invalid path\n"); - THROW(0x6a80); - } - workBuffer++; - dataLength--; - for (i = 0; i < tmpCtx.messageSigningContext.pathLength; i++) { - tmpCtx.messageSigningContext.bip32Path[i] = - (workBuffer[0] << 24) | (workBuffer[1] << 16) | - (workBuffer[2] << 8) | (workBuffer[3]); - workBuffer += 4; - dataLength -= 4; - } - tmpCtx.messageSigningContext.remainingLength = - (workBuffer[0] << 24) | (workBuffer[1] << 16) | - (workBuffer[2] << 8) | (workBuffer[3]); +void handleSignPersonalMessage(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength, volatile unsigned int *flags, volatile unsigned int *tx) { + UNUSED(tx); + uint8_t hashMessage[32]; + if (p1 == P1_FIRST) { + char tmp[11]; + uint32_t index; + uint32_t base = 10; + uint8_t pos = 0; + uint32_t i; + tmpCtx.messageSigningContext.pathLength = workBuffer[0]; + if ((tmpCtx.messageSigningContext.pathLength < 0x01) || + (tmpCtx.messageSigningContext.pathLength > MAX_BIP32_PATH)) { + PRINTF("Invalid path\n"); + THROW(0x6a80); + } + workBuffer++; + dataLength--; + for (i = 0; i < tmpCtx.messageSigningContext.pathLength; i++) { + tmpCtx.messageSigningContext.bip32Path[i] = + (workBuffer[0] << 24) | (workBuffer[1] << 16) | + (workBuffer[2] << 8) | (workBuffer[3]); workBuffer += 4; dataLength -= 4; - // Initialize message header + length - cx_keccak_init(&sha3, 256); - cx_hash((cx_hash_t *)&sha3, 0, SIGN_MAGIC, sizeof(SIGN_MAGIC) - 1, - NULL); - for (index = 1; (((index * base) <= - tmpCtx.messageSigningContext.remainingLength) && + } + tmpCtx.messageSigningContext.remainingLength = + (workBuffer[0] << 24) | (workBuffer[1] << 16) | + (workBuffer[2] << 8) | (workBuffer[3]); + workBuffer += 4; + dataLength -= 4; + // Initialize message header + length + cx_keccak_init(&sha3, 256); + cx_hash((cx_hash_t *)&sha3, 0, SIGN_MAGIC, sizeof(SIGN_MAGIC) - 1, NULL); + for (index = 1; (((index * base) <= tmpCtx.messageSigningContext.remainingLength) && (((index * base) / base) == index)); - index *= base) - ; - for (; index; index /= base) { - tmp[pos++] = - '0' + - ((tmpCtx.messageSigningContext.remainingLength / index) % base); - } - tmp[pos] = '\0'; - cx_hash((cx_hash_t *)&sha3, 0, tmp, pos, NULL); - cx_sha256_init(&tmpContent.sha2); - } else if (p1 != P1_MORE) { - THROW(0x6B00); + index *= base); + for (; index; index /= base) { + tmp[pos++] = '0' + ((tmpCtx.messageSigningContext.remainingLength / index) % base); } - if (p2 != 0) { - THROW(0x6B00); - } - if (dataLength > tmpCtx.messageSigningContext.remainingLength) { - THROW(0x6A80); - } - cx_hash((cx_hash_t *)&sha3, 0, workBuffer, dataLength, NULL); - cx_hash((cx_hash_t *)&tmpContent.sha2, 0, workBuffer, dataLength, NULL); - tmpCtx.messageSigningContext.remainingLength -= dataLength; - if (tmpCtx.messageSigningContext.remainingLength == 0) { - cx_hash((cx_hash_t *)&sha3, CX_LAST, workBuffer, 0, - tmpCtx.messageSigningContext.hash); - cx_hash((cx_hash_t *)&tmpContent.sha2, CX_LAST, workBuffer, 0, - hashMessage); + tmp[pos] = '\0'; + cx_hash((cx_hash_t *)&sha3, 0, tmp, pos, NULL); + cx_sha256_init(&tmpContent.sha2); + } + else if (p1 != P1_MORE) { + THROW(0x6B00); + } + if (p2 != 0) { + THROW(0x6B00); + } + if (dataLength > tmpCtx.messageSigningContext.remainingLength) { + THROW(0x6A80); + } + cx_hash((cx_hash_t *)&sha3, 0, workBuffer, dataLength, NULL); + cx_hash((cx_hash_t *)&tmpContent.sha2, 0, workBuffer, dataLength, NULL); + tmpCtx.messageSigningContext.remainingLength -= dataLength; + if (tmpCtx.messageSigningContext.remainingLength == 0) { + cx_hash((cx_hash_t *)&sha3, CX_LAST, workBuffer, 0, tmpCtx.messageSigningContext.hash); + cx_hash((cx_hash_t *)&tmpContent.sha2, CX_LAST, workBuffer, 0, hashMessage); #define HASH_LENGTH 4 - array_hexstr(fullAddress, hashMessage, HASH_LENGTH / 2); - fullAddress[HASH_LENGTH / 2 * 2] = '.'; - fullAddress[HASH_LENGTH / 2 * 2 + 1] = '.'; - fullAddress[HASH_LENGTH / 2 * 2 + 2] = '.'; - array_hexstr(fullAddress + HASH_LENGTH / 2 * 2 + 3, - hashMessage + 32 - HASH_LENGTH / 2, HASH_LENGTH / 2); + array_hexstr(fullAddress, hashMessage, HASH_LENGTH / 2); + fullAddress[HASH_LENGTH / 2 * 2] = '.'; + fullAddress[HASH_LENGTH / 2 * 2 + 1] = '.'; + fullAddress[HASH_LENGTH / 2 * 2 + 2] = '.'; + array_hexstr(fullAddress + HASH_LENGTH / 2 * 2 + 3, hashMessage + 32 - HASH_LENGTH / 2, HASH_LENGTH / 2); #if defined(TARGET_BLUE) - ui_approval_message_sign_blue_init(); + ui_approval_message_sign_blue_init(); #elif defined(TARGET_NANOS) - ux_step = 0; - ux_step_count = 2; - UX_DISPLAY(ui_approval_signMessage_nanos, + ux_step = 0; + ux_step_count = 2; + UX_DISPLAY(ui_approval_signMessage_nanos, ui_approval_signMessage_prepro); #endif // #if TARGET_ID - *flags |= IO_ASYNCH_REPLY; + *flags |= IO_ASYNCH_REPLY; - } else { - THROW(0x9000); - } + } else { + THROW(0x9000); + } } void handleApdu(volatile unsigned int *flags, volatile unsigned int *tx) { - unsigned short sw = 0; + unsigned short sw = 0; - BEGIN_TRY { - TRY { - if (G_io_apdu_buffer[OFFSET_CLA] != CLA) { - THROW(0x6E00); - } + BEGIN_TRY { + TRY { + if (G_io_apdu_buffer[OFFSET_CLA] != CLA) { + THROW(0x6E00); + } - switch (G_io_apdu_buffer[OFFSET_INS]) { - case INS_GET_PUBLIC_KEY: - handleGetPublicKey(G_io_apdu_buffer[OFFSET_P1], - G_io_apdu_buffer[OFFSET_P2], - G_io_apdu_buffer + OFFSET_CDATA, - G_io_apdu_buffer[OFFSET_LC], flags, tx); - break; + switch (G_io_apdu_buffer[OFFSET_INS]) { + case INS_GET_PUBLIC_KEY: + handleGetPublicKey(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); + break; - case INS_SIGN: - handleSign(G_io_apdu_buffer[OFFSET_P1], - G_io_apdu_buffer[OFFSET_P2], - G_io_apdu_buffer + OFFSET_CDATA, - G_io_apdu_buffer[OFFSET_LC], flags, tx); - break; + case INS_SIGN: + handleSign(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); + break; - case INS_GET_APP_CONFIGURATION: - handleGetAppConfiguration( - G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], - G_io_apdu_buffer + OFFSET_CDATA, - G_io_apdu_buffer[OFFSET_LC], flags, tx); - break; + case INS_GET_APP_CONFIGURATION: + handleGetAppConfiguration(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); + break; - case INS_SIGN_PERSONAL_MESSAGE: - handleSignPersonalMessage( - G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], - G_io_apdu_buffer + OFFSET_CDATA, - G_io_apdu_buffer[OFFSET_LC], flags, tx); - break; + case INS_SIGN_PERSONAL_MESSAGE: + handleSignPersonalMessage(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); + break; +#if 0 + case 0xFF: // return to dashboard + goto return_to_dashboard; +#endif - default: - THROW(0x6D00); - break; - } - } - CATCH(EXCEPTION_IO_RESET) { - THROW(EXCEPTION_IO_RESET); - } - CATCH_OTHER(e) { - switch (e & 0xF000) { - case 0x6000: - // Wipe the transaction context and report the exception - sw = e; - os_memset(&txContext, 0, sizeof(txContext)); - break; - case 0x9000: - // All is well - sw = e; - break; - default: - // Internal error - sw = 0x6800 | (e & 0x7FF); - break; - } - // Unexpected exception => report - G_io_apdu_buffer[*tx] = sw >> 8; - G_io_apdu_buffer[*tx + 1] = sw; - *tx += 2; - } - FINALLY { - } + default: + THROW(0x6D00); + break; + } } - END_TRY; + CATCH(EXCEPTION_IO_RESET) { + THROW(EXCEPTION_IO_RESET); + } + CATCH_OTHER(e) { + switch (e & 0xF000) { + case 0x6000: + // Wipe the transaction context and report the exception + sw = e; + os_memset(&txContext, 0, sizeof(txContext)); + break; + case 0x9000: + // All is well + sw = e; + break; + default: + // Internal error + sw = 0x6800 | (e & 0x7FF); + break; + } + // Unexpected exception => report + G_io_apdu_buffer[*tx] = sw >> 8; + G_io_apdu_buffer[*tx + 1] = sw; + *tx += 2; + } + FINALLY { + } + } + END_TRY; } void sample_main(void) { @@ -2613,7 +1586,7 @@ void sample_main(void) { handleApdu(&flags, &tx); } CATCH(EXCEPTION_IO_RESET) { - THROW(EXCEPTION_IO_RESET); + THROW(EXCEPTION_IO_RESET); } CATCH_OTHER(e) { switch (e & 0xF000) { @@ -2642,13 +1615,13 @@ void sample_main(void) { END_TRY; } - // return_to_dashboard: +//return_to_dashboard: return; } // override point, but nothing more to do void io_seproxyhal_display(const bagl_element_t *element) { - io_seproxyhal_display_default((bagl_element_t *)element); + io_seproxyhal_display_default((bagl_element_t *)element); } unsigned char io_event(unsigned char channel) { @@ -2658,20 +1631,18 @@ unsigned char io_event(unsigned char channel) { // can't have more than one tag in the reply, not supported yet. switch (G_io_seproxyhal_spi_buffer[0]) { case SEPROXYHAL_TAG_FINGER_EVENT: - UX_FINGER_EVENT(G_io_seproxyhal_spi_buffer); - break; - + UX_FINGER_EVENT(G_io_seproxyhal_spi_buffer); + break; + case SEPROXYHAL_TAG_BUTTON_PUSH_EVENT: UX_BUTTON_PUSH_EVENT(G_io_seproxyhal_spi_buffer); break; case SEPROXYHAL_TAG_STATUS_EVENT: - if (G_io_apdu_media == IO_APDU_MEDIA_USB_HID && - !(U4BE(G_io_seproxyhal_spi_buffer, 3) & - SEPROXYHAL_TAG_STATUS_EVENT_FLAG_USB_POWERED)) { - THROW(EXCEPTION_IO_RESET); + if (G_io_apdu_media == IO_APDU_MEDIA_USB_HID && !(U4BE(G_io_seproxyhal_spi_buffer, 3) & SEPROXYHAL_TAG_STATUS_EVENT_FLAG_USB_POWERED)) { + THROW(EXCEPTION_IO_RESET); } - // no break is intentional + // no break is intentional default: UX_DEFAULT_EVENT(); break; @@ -2681,19 +1652,20 @@ unsigned char io_event(unsigned char channel) { break; case SEPROXYHAL_TAG_TICKER_EVENT: - UX_TICKER_EVENT(G_io_seproxyhal_spi_buffer, { - if (UX_ALLOWED) { - if (skipWarning && (ux_step == 0)) { - ux_step++; - } - - if (ux_step_count) { - // prepare next screen - ux_step = (ux_step + 1) % ux_step_count; - // redisplay screen - UX_REDISPLAY(); - } + UX_TICKER_EVENT(G_io_seproxyhal_spi_buffer, + { + if (UX_ALLOWED) { + if (skipWarning && (ux_step == 0)) { + ux_step++; } + + if (ux_step_count) { + // prepare next screen + ux_step = (ux_step+1)%ux_step_count; + // redisplay screen + UX_REDISPLAY(); + } + } }); break; } @@ -2708,78 +1680,116 @@ unsigned char io_event(unsigned char channel) { } void app_exit(void) { + BEGIN_TRY_L(exit) { TRY_L(exit) { os_sched_exit(-1); } FINALLY_L(exit) { + } } END_TRY_L(exit); } -__attribute__((section(".boot"))) int main(void) { +chain_config_t const C_chain_config = { + .coinName = CHAINID_COINNAME " ", + .chainId = CHAIN_ID, + .kind = CHAIN_KIND, +#ifdef TARGET_BLUE + .color_header = COLOR_APP, + .color_dashboard = COLOR_APP_LIGHT, + .header_text = CHAINID_UPCASE, +#endif // TARGET_BLUE +}; + +__attribute__((section(".boot"))) int main(int arg0) { +#ifdef USE_LIB_ETHEREUM + chain_config_t local_chainConfig; + os_memmove(&local_chainConfig, &C_chain_config, sizeof(chain_config_t)); + unsigned int libcall_params[3]; + unsigned char coinName[sizeof(CHAINID_COINNAME)]; + strcpy(coinName, CHAINID_COINNAME); +#ifdef TARGET_BLUE + unsigned char coinNameUP[sizeof(CHAINID_UPCASE)]; + strcpy(coinNameUP, CHAINID_UPCASE); + local_chainConfig.header_text = coinNameUP; +#endif // TARGET_BLUE + local_chainConfig.coinName = coinName; + BEGIN_TRY { + TRY { + // ensure syscall will accept us + check_api_level(CX_COMPAT_APILEVEL); + // delegate to Ethereum app/lib + libcall_params[0] = "Ethereum"; + libcall_params[1] = 0x100; // use the Init call, as we won't exit + libcall_params[2] = &local_chainConfig; + os_lib_call(&libcall_params); + } + FINALLY { + app_exit(); + } + } + END_TRY; +#else // exit critical section __asm volatile("cpsie i"); + if (arg0) { + if (((unsigned int *)arg0)[0] != 0x100) { + os_lib_throw(INVALID_PARAMETER); + } + chainConfig = (chain_config_t *)((unsigned int *)arg0)[1]; + } + else { + chainConfig = (chain_config_t *)PIC(&C_chain_config); + } + os_memset(&txContext, 0, sizeof(txContext)); + // ensure exception will work as planned + os_boot(); + for (;;) { UX_INIT(); - // ensure exception will work as planned - os_boot(); - BEGIN_TRY { TRY { io_seproxyhal_init(); if (N_storage.initialized != 0x01) { - internalStorage_t storage; - storage.dataAllowed = 0x00; - storage.fidoTransport = 0x00; - storage.initialized = 0x01; - nvm_write(&N_storage, (void *)&storage, - sizeof(internalStorage_t)); + internalStorage_t storage; + storage.dataAllowed = 0x00; + storage.initialized = 0x01; + nvm_write(&N_storage, (void*)&storage, sizeof(internalStorage_t)); } + dataAllowed = N_storage.dataAllowed; - USB_power_U2F(0, 0); -#ifdef HAVE_U2F - os_memset((unsigned char *)&u2fService, 0, sizeof(u2fService)); - u2fService.inputBuffer = G_io_apdu_buffer; - u2fService.outputBuffer = G_io_apdu_buffer; - u2fService.messageBuffer = (uint8_t *)u2fMessageBuffer; - u2fService.messageBufferSize = U2F_MAX_MESSAGE_SIZE; - u2f_initialize_service((u2f_service_t *)&u2fService); + USB_power(0); + USB_power(1); - USB_power_U2F(1, N_storage.fidoTransport); -#else // HAVE_U2F - USB_power_U2F(1, 0); -#endif // HAVE_U2F - - ui_idle(); - -#if defined(TARGET_BLUE) - // setup the status bar colors (remembered after wards, even - // more if another app does not resetup after app switch) - UX_SET_STATUS_BAR_COLOR(0xFFFFFF, COLOR_APP); -#endif // #if defined(TARGET_BLUE) + ui_idle(); + #if defined(TARGET_BLUE) + // setup the status bar colors (remembered after wards, even more if another app does not resetup after app switch) + UX_SET_STATUS_BAR_COLOR(0xFFFFFF, chainConfig->color_header); + #endif // #if defined(TARGET_BLUE) + sample_main(); } CATCH(EXCEPTION_IO_RESET) { - // reset IO and UX before continuing - continue; + // reset IO and UX before continuing + continue; } CATCH_ALL { - break; + break; } FINALLY { } } END_TRY; } - app_exit(); - + app_exit(); +#endif return 0; } diff --git a/src_genericwallet/tokens.c b/src_genericwallet/tokens.c index 9e2b1a6..1a869ed 100644 --- a/src_genericwallet/tokens.c +++ b/src_genericwallet/tokens.c @@ -17,1406 +17,703 @@ #include "tokens.h" -#if defined(CHAIN_TYPE_ETHEREUM) - -const tokenDefinition_t const TOKENS[NUM_TOKENS] = { - - {{0x59, 0x41, 0x6A, 0x25, 0x62, 0x8A, 0x76, 0xb4, 0x73, 0x0e, - 0xC5, 0x14, 0x86, 0x11, 0x4c, 0x32, 0xE0, 0xB5, 0x82, 0xA1}, - "PLMA ", - 6}, - {{0xAf, 0x30, 0xD2, 0xa7, 0xE9, 0x0d, 0x7D, 0xC3, 0x61, 0xc8, - 0xC4, 0x58, 0x5e, 0x9B, 0xB7, 0xD2, 0xF6, 0xf1, 0x5b, 0xc7}, - "1ST ", - 18}, - {{0xfd, 0xbc, 0x1a, 0xdc, 0x26, 0xf0, 0xf8, 0xf8, 0x60, 0x6a, - 0x5d, 0x63, 0xb7, 0xd3, 0xa3, 0xcd, 0x21, 0xc2, 0x2b, 0x23}, - "1WO ", - 8}, - {{0xaE, 0xc9, 0x8A, 0x70, 0x88, 0x10, 0x41, 0x48, 0x78, 0xc3, - 0xBC, 0xDF, 0x46, 0xAa, 0xd3, 0x1d, 0xEd, 0x4a, 0x45, 0x57}, - "300 ", - 18}, - {{0x13, 0xf1, 0xb7, 0xfd, 0xfb, 0xe1, 0xfc, 0x66, 0x67, 0x6d, - 0x56, 0x48, 0x3e, 0x21, 0xb1, 0xec, 0xb4, 0x0b, 0x58, 0xe2}, - "ACC ", - 18}, - {{0x42, 0x28, 0x66, 0xa8, 0xF0, 0xb0, 0x32, 0xc5, 0xcf, 0x1D, - 0xfB, 0xDE, 0xf3, 0x1A, 0x20, 0xF4, 0x50, 0x95, 0x62, 0xb0}, - "ADST ", - 0}, - {{0xD0, 0xD6, 0xD6, 0xC5, 0xFe, 0x4a, 0x67, 0x7D, 0x34, 0x3c, - 0xC4, 0x33, 0x53, 0x6B, 0xB7, 0x17, 0xbA, 0xe1, 0x67, 0xdD}, - "ADT ", - 9}, - {{0x44, 0x70, 0xBB, 0x87, 0xd7, 0x7b, 0x96, 0x3A, 0x01, 0x3D, - 0xB9, 0x39, 0xBE, 0x33, 0x2f, 0x92, 0x7f, 0x2b, 0x99, 0x2e}, - "ADX ", - 4}, - {{0x27, 0xdc, 0xe1, 0xec, 0x4d, 0x3f, 0x72, 0xc3, 0xe4, 0x57, - 0xcc, 0x50, 0x35, 0x4f, 0x1f, 0x97, 0x5d, 0xde, 0xf4, 0x88}, - "AIR ", - 8}, - {{0x10, 0x63, 0xce, 0x52, 0x42, 0x65, 0xd5, 0xa3, 0xA6, 0x24, - 0xf4, 0x91, 0x4a, 0xcd, 0x57, 0x3d, 0xD8, 0x9c, 0xe9, 0x88}, - "AIX ", - 18}, - {{0xEA, 0x61, 0x0B, 0x11, 0x53, 0x47, 0x77, 0x20, 0x74, 0x8D, - 0xC1, 0x3E, 0xD3, 0x78, 0x00, 0x39, 0x41, 0xd8, 0x4f, 0xAB}, - "ALIS ", - 18}, - {{0x18, 0x1a, 0x63, 0x74, 0x6d, 0x3a, 0xdc, 0xf3, 0x56, 0xcb, - 0xc7, 0x3a, 0xce, 0x22, 0x83, 0x2f, 0xfb, 0xb1, 0xee, 0x5a}, - "ALCO ", - 8}, - {{0x63, 0x8a, 0xc1, 0x49, 0xea, 0x8e, 0xf9, 0xa1, 0x28, 0x6c, - 0x41, 0xb9, 0x77, 0x01, 0x7a, 0xa7, 0x35, 0x9e, 0x6c, 0xfa}, - "ALTS ", - 18}, - {{0x4d, 0xc3, 0x64, 0x3d, 0xbc, 0x64, 0x2b, 0x72, 0xc1, 0x58, - 0xe7, 0xf3, 0xd2, 0xff, 0x23, 0x2d, 0xf6, 0x1c, 0xb6, 0xce}, - "AMB ", - 18}, - {{0x94, 0x9b, 0xEd, 0x88, 0x6c, 0x73, 0x9f, 0x1A, 0x32, 0x73, - 0x62, 0x9b, 0x33, 0x20, 0xdb, 0x0C, 0x50, 0x24, 0xc7, 0x19}, - "AMIS ", - 9}, - {{0x96, 0x0b, 0x23, 0x6A, 0x07, 0xcf, 0x12, 0x26, 0x63, 0xc4, - 0x30, 0x33, 0x50, 0x60, 0x9A, 0x66, 0xA7, 0xB2, 0x88, 0xC0}, - "ANT ", - 18}, - {{0x23, 0xaE, 0x3C, 0x5B, 0x39, 0xB1, 0x2f, 0x06, 0x93, 0xe0, - 0x54, 0x35, 0xEe, 0xaA, 0x1e, 0x51, 0xd8, 0xc6, 0x15, 0x30}, - "APT ", - 18}, - {{0xAc, 0x70, 0x9F, 0xcB, 0x44, 0xa4, 0x3c, 0x35, 0xF0, 0xDA, - 0x4e, 0x31, 0x63, 0xb1, 0x17, 0xA1, 0x7F, 0x37, 0x70, 0xf5}, - "ARC ", - 18}, - {{0x12, 0x45, 0xef, 0x80, 0xf4, 0xd9, 0xe0, 0x2e, 0xd9, 0x42, - 0x53, 0x75, 0xe8, 0xf6, 0x49, 0xb9, 0x22, 0x1b, 0x31, 0xd8}, - "ARCT ", - 8}, - {{0xBA, 0x5F, 0x11, 0xb1, 0x6B, 0x15, 0x57, 0x92, 0xCf, 0x3B, - 0x2E, 0x68, 0x80, 0xE8, 0x70, 0x68, 0x59, 0xA8, 0xAE, 0xB6}, - "ARN ", - 8}, - {{0xfe, 0xc0, 0xcF, 0x7f, 0xE0, 0x78, 0xa5, 0x00, 0xab, 0xf1, - 0x5F, 0x12, 0x84, 0x95, 0x8F, 0x22, 0x04, 0x9c, 0x2C, 0x7e}, - "ART ", - 18}, - {{0x77, 0x05, 0xFa, 0xA3, 0x4B, 0x16, 0xEB, 0x6d, 0x77, 0xDf, - 0xc7, 0x81, 0x2b, 0xe2, 0x36, 0x7b, 0xa6, 0xB0, 0x24, 0x8e}, - "ARX ", - 8}, - {{0x27, 0x05, 0x4b, 0x13, 0xb1, 0xB7, 0x98, 0xB3, 0x45, 0xb5, - 0x91, 0xa4, 0xd2, 0x2e, 0x65, 0x62, 0xd4, 0x7e, 0xA7, 0x5a}, - "AST ", - 4}, - {{0x17, 0x05, 0x2d, 0x51, 0xE9, 0x54, 0x59, 0x2C, 0x10, 0x46, - 0x32, 0x0c, 0x23, 0x71, 0xAb, 0xaB, 0x6C, 0x73, 0xEf, 0x10}, - "ATH ", - 18}, - {{0x78, 0xB7, 0xFA, 0xDA, 0x55, 0xA6, 0x4d, 0xD8, 0x95, 0xD8, - 0xc8, 0xc3, 0x57, 0x79, 0xDD, 0x8b, 0x67, 0xfA, 0x8a, 0x05}, - "ATL ", - 18}, - {{0x88, 0x78, 0x34, 0xD3, 0xb8, 0xD4, 0x50, 0xB6, 0xbA, 0xB1, - 0x09, 0xc2, 0x52, 0xDf, 0x3D, 0xA2, 0x86, 0xd7, 0x3C, 0xE4}, - "ATT ", - 18}, - {{0xeD, 0x24, 0x79, 0x80, 0x39, 0x6B, 0x10, 0x16, 0x9B, 0xB1, - 0xd3, 0x6f, 0x6e, 0x27, 0x8e, 0xD1, 0x67, 0x00, 0xa6, 0x0f}, - "AVA ", - 4}, - {{0x0d, 0x88, 0xed, 0x6e, 0x74, 0xbb, 0xfd, 0x96, 0xb8, 0x31, - 0x23, 0x16, 0x38, 0xb6, 0x6c, 0x05, 0x57, 0x1e, 0x82, 0x4f}, - "AVT ", - 18}, - {{0x0D, 0x87, 0x75, 0xF6, 0x48, 0x43, 0x06, 0x79, 0xA7, 0x09, - 0xE9, 0x8d, 0x2b, 0x0C, 0xb6, 0x25, 0x0d, 0x28, 0x87, 0xEF}, - "BAT ", - 18}, - {{0xbc, 0x12, 0x34, 0x55, 0x2E, 0xBe, 0xa3, 0x2B, 0x51, 0x21, - 0x19, 0x03, 0x56, 0xbB, 0xa6, 0xD3, 0xBb, 0x22, 0x5b, 0xb5}, - "BCL ", - 18}, - {{0x1e, 0x79, 0x7C, 0xe9, 0x86, 0xC3, 0xCF, 0xF4, 0x47, 0x2F, - 0x7D, 0x38, 0xd5, 0xC4, 0xab, 0xa5, 0x5D, 0xfE, 0xFE, 0x40}, - "BCDN ", - 15}, - {{0x1c, 0x44, 0x81, 0x75, 0x0d, 0xaa, 0x5F, 0xf5, 0x21, 0xA2, - 0xa7, 0x49, 0x0d, 0x99, 0x81, 0xeD, 0x46, 0x46, 0x5D, 0xbd}, - "BCPT ", - 18}, - {{0x74, 0xC1, 0xE4, 0xb8, 0xca, 0xE5, 0x92, 0x69, 0xec, 0x1D, - 0x85, 0xD3, 0xD4, 0xF3, 0x24, 0x39, 0x60, 0x48, 0xF4, 0xac}, - "(^) ", - 0}, - {{0x8a, 0xA3, 0x3A, 0x78, 0x99, 0xFC, 0xC8, 0xeA, 0x5f, 0xBe, - 0x6A, 0x60, 0x8A, 0x10, 0x9c, 0x38, 0x93, 0xA1, 0xB8, 0xb2}, - "BET ", - 18}, - {{0xb2, 0xbf, 0xeb, 0x70, 0xb9, 0x03, 0xf1, 0xba, 0xac, 0x7f, - 0x2b, 0xa2, 0xc6, 0x29, 0x34, 0xc7, 0xe5, 0xb9, 0x74, 0xc4}, - "BKB ", - 8}, - {{0xce, 0x59, 0xd2, 0x9b, 0x09, 0xaa, 0xe5, 0x65, 0xfe, 0xee, - 0xf8, 0xe5, 0x2f, 0x47, 0xc3, 0xcd, 0x53, 0x68, 0xc6, 0x63}, - "BLXb ", - 18}, - {{0xE5, 0xa7, 0xc1, 0x29, 0x72, 0xf3, 0xbb, 0xFe, 0x70, 0xed, - 0x29, 0x52, 0x1C, 0x89, 0x49, 0xb8, 0xAf, 0x6a, 0x09, 0x70}, - "BLXi ", - 18}, - {{0xdf, 0x6e, 0xf3, 0x43, 0x35, 0x07, 0x80, 0xbf, 0x8c, 0x34, - 0x10, 0xbf, 0x06, 0x2e, 0x0c, 0x01, 0x5b, 0x1d, 0xd6, 0x71}, - "BMC ", - 8}, - {{0xf0, 0x28, 0xad, 0xee, 0x51, 0x53, 0x3b, 0x1b, 0x47, 0xbe, - 0xaa, 0x89, 0x0f, 0xeb, 0x54, 0xa4, 0x57, 0xf5, 0x1e, 0x89}, - "BMT ", - 18}, - {{0xb8, 0xc7, 0x74, 0x82, 0xe4, 0x5f, 0x1f, 0x44, 0xde, 0x17, - 0x45, 0xf5, 0x2c, 0x74, 0x42, 0x6c, 0x63, 0x1b, 0xdd, 0x52}, - "BNB ", - 18}, - {{0xdD, 0x6B, 0xf5, 0x6C, 0xA2, 0xad, 0xa2, 0x4c, 0x68, 0x3F, - 0xAC, 0x50, 0xE3, 0x77, 0x83, 0xe5, 0x5B, 0x57, 0xAF, 0x9F}, - "BNC ", - 12}, - {{0x1F, 0x57, 0x3D, 0x6F, 0xb3, 0xF1, 0x3d, 0x68, 0x9F, 0xF8, - 0x44, 0xB4, 0xcE, 0x37, 0x79, 0x4d, 0x79, 0xa7, 0xFF, 0x1C}, - "BNT ", - 18}, - {{0x7f, 0x1e, 0x2c, 0x7d, 0x6a, 0x69, 0xbf, 0x34, 0x82, 0x4d, - 0x72, 0xc5, 0x3b, 0x45, 0x50, 0xe8, 0x95, 0xc0, 0xd8, 0xc2}, - "BOP ", - 8}, - {{0xC2, 0xC6, 0x3F, 0x23, 0xec, 0x5E, 0x97, 0xef, 0xbD, 0x75, - 0x65, 0xdF, 0x9E, 0xc7, 0x64, 0xFD, 0xc7, 0xd4, 0xe9, 0x1d}, - "BOU ", - 18}, - {{0x5A, 0xf2, 0xBe, 0x19, 0x3a, 0x6A, 0xBC, 0xa9, 0xc8, 0x81, - 0x70, 0x01, 0xF4, 0x57, 0x44, 0x77, 0x7D, 0xb3, 0x07, 0x56}, - "BQX ", - 8}, - {{0x9E, 0x77, 0xD5, 0xa1, 0x25, 0x1b, 0x6F, 0x7D, 0x45, 0x67, - 0x22, 0xA6, 0xea, 0xC6, 0xD2, 0xd5, 0x98, 0x0b, 0xd8, 0x91}, - "BRAT ", - 8}, - {{0xf2, 0x6e, 0xf5, 0xe0, 0x54, 0x53, 0x84, 0xb7, 0xdc, 0xc0, - 0xf2, 0x97, 0xf2, 0x67, 0x41, 0x89, 0x58, 0x68, 0x30, 0xdf}, - "BSDC ", - 18}, - {{0x73, 0xdd, 0x06, 0x9c, 0x29, 0x9a, 0x5d, 0x69, 0x1e, 0x98, - 0x36, 0x24, 0x3b, 0xca, 0xec, 0x9c, 0x8c, 0x1d, 0x87, 0x34}, - "BTE ", - 8}, - {{0xfa, 0xd5, 0x72, 0xdb, 0x56, 0x6e, 0x52, 0x34, 0xac, 0x9f, - 0xc3, 0xd5, 0x70, 0xc4, 0xed, 0xc0, 0x05, 0x0e, 0xaa, 0x92}, - "BTH ", - 18}, - {{0x2a, 0xcc, 0xaB, 0x9c, 0xb7, 0xa4, 0x8c, 0x3E, 0x82, 0x28, - 0x6F, 0x0b, 0x2f, 0x87, 0x98, 0xD2, 0x01, 0xF4, 0xeC, 0x3f}, - "BTL ", - 18}, - {{0xcb, 0x97, 0xe6, 0x5f, 0x07, 0xda, 0x24, 0xd4, 0x6b, 0xcd, - 0xd0, 0x78, 0xeb, 0xeb, 0xd7, 0xc6, 0xe6, 0xe3, 0xd7, 0x50}, - "BTM ", - 8}, - {{0x26, 0xE7, 0x53, 0x07, 0xFc, 0x0C, 0x02, 0x14, 0x72, 0xfE, - 0xb8, 0xF7, 0x27, 0x83, 0x95, 0x31, 0xF1, 0x12, 0xf3, 0x17}, - "C20 ", - 18}, - {{0x7d, 0x4b, 0x8C, 0xce, 0x05, 0x91, 0xC9, 0x04, 0x4a, 0x22, - 0xee, 0x54, 0x35, 0x33, 0xb7, 0x2E, 0x97, 0x6E, 0x36, 0xC3}, - "CAG ", - 18}, - {{0x1d, 0x46, 0x24, 0x14, 0xfe, 0x14, 0xcf, 0x48, 0x9c, 0x7A, - 0x21, 0xCa, 0xC7, 0x85, 0x09, 0xf4, 0xbF, 0x8C, 0xD7, 0xc0}, - "CAN ", - 6}, - {{0x11, 0x11, 0x11, 0xf7, 0xe9, 0xB1, 0xFe, 0x07, 0x2a, 0xde, - 0x43, 0x8F, 0x77, 0xE1, 0xCe, 0x86, 0x1C, 0x7e, 0xE4, 0xE3}, - "CAT ", - 18}, - {{0x68, 0xe1, 0x4b, 0xb5, 0xA4, 0x5B, 0x96, 0x81, 0x32, 0x7E, - 0x16, 0xE5, 0x28, 0x08, 0x4B, 0x9d, 0x96, 0x2C, 0x1a, 0x39}, - "CATs ", - 18}, - {{0x56, 0xba, 0x2E, 0xe7, 0x89, 0x04, 0x61, 0xf4, 0x63, 0xF7, - 0xbe, 0x02, 0xaA, 0xC3, 0x09, 0x9f, 0x6d, 0x58, 0x11, 0xA8}, - "CATc ", - 18}, - {{0x28, 0x57, 0x7A, 0x6d, 0x31, 0x55, 0x9b, 0xd2, 0x65, 0xCe, - 0x3A, 0xDB, 0x62, 0xd0, 0x45, 0x85, 0x50, 0xF7, 0xb8, 0xa7}, - "CCC ", - 18}, - {{0x8a, 0x95, 0xca, 0x44, 0x8A, 0x52, 0xC0, 0xAD, 0xf0, 0x05, - 0x4b, 0xB3, 0x40, 0x2d, 0xC5, 0xe0, 0x9C, 0xD6, 0xB2, 0x32}, - "CDL ", - 18}, - {{0x17, 0x7d, 0x39, 0xAC, 0x67, 0x6E, 0xD1, 0xC6, 0x7A, 0x2b, - 0x26, 0x8A, 0xD7, 0xF1, 0xE5, 0x88, 0x26, 0xE5, 0xB0, 0xaf}, - "CDT ", - 18}, - {{0x6f, 0xFF, 0x38, 0x06, 0xBb, 0xac, 0x52, 0xA2, 0x0e, 0x0d, - 0x79, 0xBC, 0x53, 0x8d, 0x52, 0x7f, 0x6a, 0x22, 0xc9, 0x6b}, - "CDX ", - 18}, - {{0x12, 0xFE, 0xF5, 0xe5, 0x7b, 0xF4, 0x58, 0x73, 0xCd, 0x9B, - 0x62, 0xE9, 0xDB, 0xd7, 0xBF, 0xb9, 0x9e, 0x32, 0xD7, 0x3e}, - "CFI ", - 18}, - {{0x06, 0x01, 0x2c, 0x8c, 0xf9, 0x7b, 0xea, 0xd5, 0xde, 0xae, - 0x23, 0x70, 0x70, 0xf9, 0x58, 0x7f, 0x8e, 0x7a, 0x26, 0x6d}, - "CK ", - 0}, - {{0x7f, 0xce, 0x28, 0x56, 0x89, 0x9a, 0x68, 0x06, 0xee, 0xef, - 0x70, 0x80, 0x79, 0x85, 0xfc, 0x75, 0x54, 0xc6, 0x63, 0x40}, - "CLP ", - 9}, - {{0x7e, 0x66, 0x75, 0x25, 0x52, 0x1c, 0xF6, 0x13, 0x52, 0xe2, - 0xE0, 0x1b, 0x50, 0xFa, 0xaa, 0xE7, 0xDf, 0x39, 0x74, 0x9a}, - "CMC ", - 18}, - {{0xf8, 0x5f, 0xEe, 0xa2, 0xFd, 0xD8, 0x1d, 0x51, 0x17, 0x7F, - 0x6b, 0x8F, 0x35, 0xF0, 0xe6, 0x73, 0x4C, 0xe4, 0x5F, 0x5F}, - "CMT ", - 18}, - {{0xb2, 0xf7, 0xeb, 0x1f, 0x2c, 0x37, 0x64, 0x5b, 0xe6, 0x1d, - 0x73, 0x95, 0x30, 0x35, 0x36, 0x0e, 0x76, 0x8d, 0x81, 0xe6}, - "COB ", - 18}, - {{0x65, 0x29, 0x2e, 0xea, 0xdf, 0x14, 0x26, 0xcd, 0x2d, 0xf1, - 0xc4, 0x79, 0x3a, 0x3d, 0x75, 0x19, 0xf2, 0x53, 0x91, 0x3b}, - "COSS ", - 18}, - {{0xAe, 0xf3, 0x8f, 0xBF, 0xBF, 0x93, 0x2D, 0x1A, 0xeF, 0x3B, - 0x80, 0x8B, 0xc8, 0xfB, 0xd8, 0xCd, 0x8E, 0x1f, 0x8B, 0xC5}, - "CRB ", - 8}, - {{0x67, 0x2a, 0x1A, 0xD4, 0xf6, 0x67, 0xFB, 0x18, 0xA3, 0x33, - 0xAf, 0x13, 0x66, 0x7a, 0xa0, 0xAf, 0x1F, 0x5b, 0x5b, 0xDD}, - "CRED ", - 18}, - {{0x4E, 0x06, 0x03, 0xe2, 0xA2, 0x7A, 0x30, 0x48, 0x0E, 0x5e, - 0x3a, 0x4F, 0xe5, 0x48, 0xe2, 0x9E, 0xF1, 0x2F, 0x64, 0xbE}, - "CRDO ", - 18}, - {{0xE4, 0xc9, 0x4d, 0x45, 0xf7, 0xAe, 0xf7, 0x01, 0x8a, 0x5D, - 0x66, 0xf4, 0x4a, 0xF7, 0x80, 0xec, 0x60, 0x23, 0x37, 0x8e}, - "CCRB ", - 6}, - {{0xBf, 0x4c, 0xFD, 0x7d, 0x1e, 0xDe, 0xeE, 0xA5, 0xf6, 0x60, - 0x08, 0x27, 0x41, 0x1B, 0x41, 0xA2, 0x1e, 0xB0, 0x8a, 0xbd}, - "CTL ", - 2}, - {{0x66, 0x2a, 0xBc, 0xAd, 0x0b, 0x7f, 0x34, 0x5A, 0xB7, 0xFf, - 0xB1, 0xb1, 0xfb, 0xb9, 0xDf, 0x78, 0x94, 0xf1, 0x8e, 0x66}, - "CTX ", - 18}, - {{0x41, 0xe5, 0x56, 0x00, 0x54, 0x82, 0x4e, 0xA6, 0xB0, 0x73, - 0x2E, 0x65, 0x6E, 0x3A, 0xd6, 0x4E, 0x20, 0xe9, 0x4E, 0x45}, - "CVC ", - 8}, - {{0xda, 0xb0, 0xC3, 0x1B, 0xF3, 0x4C, 0x89, 0x7F, 0xb0, 0xFe, - 0x90, 0xD1, 0x2E, 0xC9, 0x40, 0x1c, 0xaf, 0x5c, 0x36, 0xEc}, - "DAB ", - 0}, - {{0x07, 0xd9, 0xe4, 0x9e, 0xa4, 0x02, 0x19, 0x4b, 0xf4, 0x8a, - 0x82, 0x76, 0xda, 0xfb, 0x16, 0xe4, 0xed, 0x63, 0x33, 0x17}, - "DALC ", - 8}, - {{0xBB, 0x9b, 0xc2, 0x44, 0xD7, 0x98, 0x12, 0x3f, 0xDe, 0x78, - 0x3f, 0xCc, 0x1C, 0x72, 0xd3, 0xBb, 0x8C, 0x18, 0x94, 0x13}, - "DAO ", - 16}, - {{0x81, 0xc9, 0x15, 0x1d, 0xe0, 0xc8, 0xba, 0xfc, 0xd3, 0x25, - 0xa5, 0x7e, 0x3d, 0xb5, 0xa5, 0xdf, 0x1c, 0xeb, 0xf7, 0x9c}, - "DAT ", - 18}, - {{0x1b, 0x5f, 0x21, 0xee, 0x98, 0xee, 0xd4, 0x8d, 0x29, 0x2e, - 0x8e, 0x2d, 0x3e, 0xd8, 0x2b, 0x40, 0xa9, 0x72, 0x8a, 0x22}, - "DATD ", - 18}, - {{0x0c, 0xf0, 0xee, 0x63, 0x78, 0x8a, 0x08, 0x49, 0xfe, 0x52, - 0x97, 0xf3, 0x40, 0x7f, 0x70, 0x1e, 0x12, 0x2c, 0xc0, 0x23}, - "DATS ", - 18}, - {{0x39, 0x9A, 0x0e, 0x6F, 0xbE, 0xb3, 0xd7, 0x4c, 0x85, 0x35, - 0x74, 0x39, 0xf4, 0xc8, 0xAe, 0xD9, 0x67, 0x8a, 0x5c, 0xbF}, - "DCL ", - 3}, - {{0xcC, 0x4e, 0xF9, 0xEE, 0xAF, 0x65, 0x6a, 0xC1, 0xa2, 0xAb, - 0x88, 0x67, 0x43, 0xE9, 0x8e, 0x97, 0xE0, 0x90, 0xed, 0x38}, - "DDF ", - 18}, - {{0x35, 0x97, 0xbf, 0xD5, 0x33, 0xa9, 0x9c, 0x9a, 0xa0, 0x83, - 0x58, 0x7B, 0x07, 0x44, 0x34, 0xE6, 0x1E, 0xb0, 0xA2, 0x58}, - "DENT ", - 8}, - {{0xE0, 0xB7, 0x92, 0x7c, 0x4a, 0xF2, 0x37, 0x65, 0xCb, 0x51, - 0x31, 0x4A, 0x0E, 0x05, 0x21, 0xA9, 0x64, 0x5F, 0x0E, 0x2A}, - "DGD ", - 9}, - {{0x55, 0xb9, 0xa1, 0x1c, 0x2e, 0x83, 0x51, 0xb4, 0xFf, 0xc7, - 0xb1, 0x15, 0x61, 0x14, 0x8b, 0xfa, 0xC9, 0x97, 0x78, 0x55}, - "DGX1 ", - 9}, - {{0x2e, 0x07, 0x1D, 0x29, 0x66, 0xAa, 0x7D, 0x8d, 0xEC, 0xB1, - 0x00, 0x58, 0x85, 0xbA, 0x19, 0x77, 0xD6, 0x03, 0x8A, 0x65}, - "DICE ", - 16}, - {{0x13, 0xf1, 0x1C, 0x99, 0x05, 0xA0, 0x8c, 0xa7, 0x6e, 0x3e, - 0x85, 0x3b, 0xE6, 0x3D, 0x4f, 0x09, 0x44, 0x32, 0x6C, 0x72}, - "DIVX ", - 18}, - {{0x07, 0xe3, 0xc7, 0x06, 0x53, 0x54, 0x8b, 0x04, 0xf0, 0xa7, - 0x59, 0x70, 0xc1, 0xf8, 0x1b, 0x4c, 0xbb, 0xfb, 0x60, 0x6f}, - "DLT ", - 18}, - {{0x0A, 0xbd, 0xAc, 0xe7, 0x0D, 0x37, 0x90, 0x23, 0x5a, 0xf4, - 0x48, 0xC8, 0x85, 0x47, 0x60, 0x3b, 0x94, 0x56, 0x04, 0xea}, - "DNT ", - 18}, - {{0xEE, 0xF6, 0xE9, 0x00, 0x34, 0xeE, 0xa8, 0x9E, 0x31, 0xEb, - 0x4B, 0x8e, 0xaC, 0xd3, 0x23, 0xF2, 0x8A, 0x92, 0xea, 0xE4}, - "DOW ", - 18}, - {{0x01, 0xb3, 0xEc, 0x4a, 0xAe, 0x1B, 0x87, 0x29, 0x52, 0x9B, - 0xEB, 0x49, 0x65, 0xF2, 0x7d, 0x00, 0x87, 0x88, 0xB0, 0xEB}, - "DPP ", - 18}, - {{0x3c, 0x75, 0x22, 0x65, 0x55, 0xFC, 0x49, 0x61, 0x68, 0xd4, - 0x8B, 0x88, 0xDF, 0x83, 0xB9, 0x5F, 0x16, 0x77, 0x1F, 0x37}, - "DROP ", - 0}, - {{0x62, 0x1d, 0x78, 0xf2, 0xEF, 0x2f, 0xd9, 0x37, 0xBF, 0xca, - 0x69, 0x6C, 0xab, 0xaF, 0x9A, 0x77, 0x9F, 0x59, 0xB3, 0xEd}, - "DRP ", - 2}, - {{0xd2, 0x34, 0xbf, 0x24, 0x10, 0xa0, 0x00, 0x9d, 0xf9, 0xc3, - 0xc6, 0x3b, 0x61, 0x0c, 0x09, 0x73, 0x8f, 0x18, 0xcc, 0xd7}, - "DTR ", - 8}, - {{0xaf, 0xc3, 0x97, 0x88, 0xc5, 0x1f, 0x0c, 0x1f, 0xf7, 0xb5, - 0x53, 0x17, 0xf3, 0xe7, 0x02, 0x99, 0xe5, 0x21, 0xff, 0xf6}, - "eBCH ", - 8}, - {{0xeb, 0x7c, 0x20, 0x02, 0x71, 0x72, 0xe5, 0xd1, 0x43, 0xfb, - 0x03, 0x0d, 0x50, 0xf9, 0x1c, 0xec, 0xe2, 0xd1, 0x48, 0x5d}, - "eBTC ", - 8}, - {{0xa5, 0x78, 0xaC, 0xc0, 0xcB, 0x78, 0x75, 0x78, 0x1b, 0x78, - 0x80, 0x90, 0x3F, 0x45, 0x94, 0xD1, 0x3c, 0xFa, 0x8B, 0x98}, - "ECN ", - 2}, - {{0x08, 0x71, 0x1D, 0x3B, 0x02, 0xC8, 0x75, 0x8F, 0x2F, 0xB3, - 0xab, 0x4e, 0x80, 0x22, 0x84, 0x18, 0xa7, 0xF8, 0xe3, 0x9c}, - "EDG ", - 0}, - {{0xce, 0xd4, 0xe9, 0x31, 0x98, 0x73, 0x4d, 0xda, 0xff, 0x84, - 0x92, 0xd5, 0x25, 0xbd, 0x25, 0x8d, 0x49, 0xeb, 0x38, 0x8e}, - "EDO ", - 18}, - {{0x5b, 0x26, 0xC5, 0xD0, 0x77, 0x2E, 0x5b, 0xba, 0xC8, 0xb3, - 0x18, 0x2A, 0xE9, 0xa1, 0x3f, 0x9B, 0xB2, 0xD0, 0x37, 0x65}, - "EDU ", - 8}, - {{0xf9, 0xF0, 0xFC, 0x71, 0x67, 0xc3, 0x11, 0xDd, 0x2F, 0x1e, - 0x21, 0xE9, 0x20, 0x4F, 0x87, 0xEB, 0xA9, 0x01, 0x2f, 0xB2}, - "EHT ", - 8}, - {{0xc8, 0xC6, 0xA3, 0x1A, 0x4A, 0x80, 0x6d, 0x37, 0x10, 0xA7, - 0xB3, 0x8b, 0x7B, 0x29, 0x6D, 0x2f, 0xAB, 0xCC, 0xDB, 0xA8}, - "ELIX ", - 18}, - {{0xB8, 0x02, 0xb2, 0x4E, 0x06, 0x37, 0xc2, 0xB8, 0x7D, 0x2E, - 0x8b, 0x77, 0x84, 0xC0, 0x55, 0xBB, 0xE9, 0x21, 0x01, 0x1a}, - "EMV ", - 2}, - {{0xF6, 0x29, 0xcB, 0xd9, 0x4d, 0x37, 0x91, 0xC9, 0x25, 0x01, - 0x52, 0xBD, 0x8d, 0xfB, 0xDF, 0x38, 0x0E, 0x2a, 0x3B, 0x9c}, - "ENJ ", - 18}, - {{0x86, 0xFa, 0x04, 0x98, 0x57, 0xE0, 0x20, 0x9a, 0xa7, 0xD9, - 0xe6, 0x16, 0xF7, 0xeb, 0x3b, 0x3B, 0x78, 0xEC, 0xfd, 0xb0}, - "EOS ", - 18}, - {{0x1b, 0x97, 0x43, 0xf5, 0x56, 0xd6, 0x5e, 0x75, 0x7c, 0x4c, - 0x65, 0x0b, 0x45, 0x55, 0xba, 0xf3, 0x54, 0xcb, 0x8b, 0xd3}, - "ETBS ", - 12}, - {{0x3a, 0x26, 0x74, 0x6D, 0xdb, 0x79, 0xB1, 0xB8, 0xe4, 0x45, - 0x0e, 0x3F, 0x4F, 0xFE, 0x32, 0x85, 0xA3, 0x07, 0x38, 0x7E}, - "ETHB ", - 8}, - {{0xf3, 0xdb, 0x5f, 0xa2, 0xc6, 0x6b, 0x7a, 0xf3, 0xeb, 0x0c, - 0x0b, 0x78, 0x25, 0x10, 0x81, 0x6c, 0xbe, 0x48, 0x13, 0xb8}, - "EVX ", - 4}, - {{0xc9, 0x8e, 0x06, 0x39, 0xc6, 0xd2, 0xec, 0x03, 0x7a, 0x61, - 0x53, 0x41, 0xc3, 0x69, 0x66, 0x6b, 0x11, 0x0e, 0x80, 0xe5}, - "EXMR ", - 8}, - {{0x19, 0x0e, 0x56, 0x9b, 0xE0, 0x71, 0xF4, 0x0c, 0x70, 0x4e, - 0x15, 0x82, 0x5F, 0x28, 0x54, 0x81, 0xCB, 0x74, 0xB6, 0xcC}, - "FAM ", - 12}, - {{0xf0, 0x4a, 0x8a, 0xc5, 0x53, 0xFc, 0xeD, 0xB5, 0xBA, 0x99, - 0xA6, 0x47, 0x99, 0x15, 0x58, 0x26, 0xC1, 0x36, 0xb0, 0xBe}, - "FLIX ", - 18}, - {{0x0A, 0xBe, 0xFb, 0x76, 0x11, 0xCb, 0x3A, 0x01, 0xEA, 0x3F, - 0xaD, 0x85, 0xf3, 0x3C, 0x3C, 0x93, 0x4F, 0x8e, 0x2c, 0xF4}, - "FRD ", - 18}, - {{0xe6, 0xf7, 0x4d, 0xcf, 0xa0, 0xe2, 0x08, 0x83, 0x00, 0x8d, - 0x8c, 0x16, 0xb6, 0xd9, 0xa3, 0x29, 0x18, 0x9d, 0x0c, 0x30}, - "FTC ", - 2}, - {{0xEA, 0x38, 0xeA, 0xa3, 0xC8, 0x6c, 0x8F, 0x9B, 0x75, 0x15, - 0x33, 0xBa, 0x2E, 0x56, 0x2d, 0xeb, 0x9a, 0xcD, 0xED, 0x40}, - "FUEL ", - 18}, - {{0x41, 0x9D, 0x0d, 0x8B, 0xdD, 0x9a, 0xF5, 0xe6, 0x06, 0xAe, - 0x22, 0x32, 0xed, 0x28, 0x5A, 0xff, 0x19, 0x0E, 0x71, 0x1b}, - "FUN ", - 8}, - {{0x88, 0xFC, 0xFB, 0xc2, 0x2C, 0x6d, 0x3d, 0xBa, 0xa2, 0x5a, - 0xF4, 0x78, 0xC5, 0x78, 0x97, 0x83, 0x39, 0xBD, 0xe7, 0x7a}, - "FYN ", - 18}, - {{0x70, 0x88, 0x76, 0xf4, 0x86, 0xe4, 0x48, 0xee, 0x89, 0xeb, - 0x33, 0x2b, 0xfb, 0xc8, 0xe5, 0x93, 0x55, 0x30, 0x58, 0xb9}, - "GVL ", - 18}, - {{0x75, 0x85, 0xF8, 0x35, 0xae, 0x2d, 0x52, 0x27, 0x22, 0xd2, - 0x68, 0x43, 0x23, 0xa0, 0xba, 0x83, 0x40, 0x1f, 0x32, 0xf5}, - "GBT ", - 18}, - {{0x4F, 0x4f, 0x0D, 0xb4, 0xde, 0x90, 0x3B, 0x88, 0xf2, 0xB1, - 0xa2, 0x84, 0x79, 0x71, 0xE2, 0x31, 0xD5, 0x4F, 0x8f, 0xd3}, - "GEE ", - 8}, - {{0x24, 0x08, 0x3B, 0xb3, 0x00, 0x72, 0x64, 0x3C, 0x3b, 0xB9, - 0x0B, 0x44, 0xB7, 0x28, 0x58, 0x60, 0xa7, 0x55, 0xe6, 0x87}, - "GELD ", - 18}, - {{0xae, 0x4f, 0x56, 0xf0, 0x72, 0xc3, 0x4c, 0x0a, 0x65, 0xb3, - 0xae, 0x3e, 0x4d, 0xb7, 0x97, 0xd8, 0x31, 0x43, 0x9d, 0x93}, - "GIM ", - 8}, - {{0xb3, 0xBd, 0x49, 0xE2, 0x8f, 0x8F, 0x83, 0x2b, 0x8d, 0x1E, - 0x24, 0x61, 0x06, 0x99, 0x1e, 0x54, 0x6c, 0x32, 0x35, 0x02}, - "GMT ", - 18}, - {{0x68, 0x10, 0xe7, 0x76, 0x88, 0x0C, 0x02, 0x93, 0x3D, 0x47, - 0xDB, 0x1b, 0x9f, 0xc0, 0x59, 0x08, 0xe5, 0x38, 0x6b, 0x96}, - "GNO ", - 18}, - {{0xa7, 0x44, 0x76, 0x44, 0x31, 0x19, 0xA9, 0x42, 0xdE, 0x49, - 0x85, 0x90, 0xFe, 0x1f, 0x24, 0x54, 0xd7, 0xD4, 0xaC, 0x0d}, - "GNT ", - 18}, - {{0x12, 0xb1, 0x9d, 0x3e, 0x2c, 0xcc, 0x14, 0xda, 0x04, 0xfa, - 0xe3, 0x3e, 0x63, 0x65, 0x2c, 0xe4, 0x69, 0xb3, 0xf2, 0xfd}, - "GRID ", - 12}, - {{0xB7, 0x08, 0x35, 0xD7, 0x82, 0x2e, 0xBB, 0x94, 0x26, 0xB5, - 0x65, 0x43, 0xE3, 0x91, 0x84, 0x6C, 0x10, 0x7b, 0xd3, 0x2C}, - "GTC ", - 18}, - {{0x02, 0x5a, 0xbA, 0xD9, 0xe5, 0x18, 0x51, 0x6f, 0xda, 0xAF, - 0xBD, 0xcd, 0xB9, 0x70, 0x1b, 0x37, 0xfb, 0x7e, 0xF0, 0xFA}, - "GTKT ", - 0}, - {{0xf7, 0xB0, 0x98, 0x29, 0x8f, 0x7C, 0x69, 0xFc, 0x14, 0x61, - 0x0b, 0xf7, 0x1d, 0x5e, 0x02, 0xc6, 0x07, 0x92, 0x89, 0x4C}, - "GUP ", - 3}, - {{0x10, 0x3c, 0x3A, 0x20, 0x9d, 0xa5, 0x9d, 0x3E, 0x7C, 0x4A, - 0x89, 0x30, 0x7e, 0x66, 0x52, 0x1e, 0x08, 0x1C, 0xFD, 0xF0}, - "GVT ", - 18}, - {{0x58, 0xca, 0x30, 0x65, 0xc0, 0xf2, 0x4c, 0x7c, 0x96, 0xae, - 0xe8, 0xd6, 0x05, 0x6b, 0x5b, 0x5d, 0xec, 0xf9, 0xc2, 0xf8}, - "GXC ", - 10}, - {{0x22, 0xF0, 0xAF, 0x8D, 0x78, 0x85, 0x1b, 0x72, 0xEE, 0x79, - 0x9e, 0x05, 0xF5, 0x4A, 0x77, 0x00, 0x15, 0x86, 0xB1, 0x8A}, - "GXVC ", - 10}, - {{0xFe, 0xeD, 0x1a, 0x53, 0xbd, 0x53, 0xFF, 0xE4, 0x53, 0xD2, - 0x65, 0xFC, 0x6E, 0x70, 0xdD, 0x85, 0xf8, 0xe9, 0x93, 0xb6}, - "H2O ", - 18}, - {{0xff, 0xe8, 0x19, 0x6b, 0xc2, 0x59, 0xe8, 0xde, 0xdc, 0x54, - 0x4d, 0x93, 0x57, 0x86, 0xaa, 0x47, 0x09, 0xec, 0x3e, 0x64}, - "HDG ", - 18}, - {{0xba, 0x21, 0x84, 0x52, 0x0A, 0x1c, 0xC4, 0x9a, 0x61, 0x59, - 0xc5, 0x7e, 0x61, 0xE1, 0x84, 0x4E, 0x08, 0x56, 0x15, 0xB6}, - "HGT ", - 8}, - {{0xa9, 0x24, 0x0f, 0xBC, 0xAC, 0x1F, 0x0b, 0x9A, 0x6a, 0xDf, - 0xB0, 0x4a, 0x53, 0xc8, 0xE3, 0xB0, 0xcC, 0x1D, 0x14, 0x44}, - "HIG ", - 18}, - {{0x14, 0xF3, 0x7B, 0x57, 0x42, 0x42, 0xD3, 0x66, 0x55, 0x8d, - 0xB6, 0x1f, 0x33, 0x35, 0x28, 0x9a, 0x50, 0x35, 0xc5, 0x06}, - "HKG ", - 3}, - {{0xcb, 0xCC, 0x0F, 0x03, 0x6E, 0xD4, 0x78, 0x8F, 0x63, 0xFC, - 0x0f, 0xEE, 0x32, 0x87, 0x3d, 0x6A, 0x74, 0x87, 0xb9, 0x08}, - "HMQ ", - 8}, - {{0x55, 0x4C, 0x20, 0xB7, 0xc4, 0x86, 0xbe, 0xeE, 0x43, 0x92, - 0x77, 0xb4, 0x54, 0x0A, 0x43, 0x45, 0x66, 0xdC, 0x4C, 0x02}, - "HST ", - 18}, - {{0x5a, 0x84, 0x96, 0x9b, 0xb6, 0x63, 0xfb, 0x64, 0xF6, 0xd0, - 0x15, 0xDc, 0xF9, 0xF6, 0x22, 0xAe, 0xdc, 0x79, 0x67, 0x50}, - "ICE ", - 18}, - {{0x88, 0x86, 0x66, 0xCA, 0x69, 0xE0, 0xf1, 0x78, 0xDE, 0xD6, - 0xD7, 0x5b, 0x57, 0x26, 0xCe, 0xe9, 0x9A, 0x87, 0xD6, 0x98}, - "ICN ", - 18}, - {{0xa3, 0x3e, 0x72, 0x9b, 0xf4, 0xfd, 0xeb, 0x86, 0x8b, 0x53, - 0x4e, 0x1f, 0x20, 0x52, 0x34, 0x63, 0xd9, 0xc4, 0x6b, 0xee}, - "ICO ", - 10}, - {{0x01, 0x4B, 0x50, 0x46, 0x65, 0x90, 0x34, 0x0D, 0x41, 0x30, - 0x7C, 0xc5, 0x4D, 0xCe, 0xe9, 0x90, 0xc8, 0xD5, 0x8a, 0xa8}, - "ICOS ", - 6}, - {{0x81, 0x4c, 0xaf, 0xd4, 0x78, 0x2d, 0x2e, 0x72, 0x81, 0x70, - 0xfd, 0xa6, 0x82, 0x57, 0x98, 0x3f, 0x03, 0x32, 0x1c, 0x58}, - "IDEA ", - 0}, - {{0x76, 0x54, 0x91, 0x5a, 0x1b, 0x82, 0xd6, 0xd2, 0xd0, 0xaf, - 0xc3, 0x7c, 0x52, 0xaf, 0x55, 0x6e, 0xa8, 0x98, 0x3c, 0x7e}, - "IFT ", - 18}, - {{0x16, 0x66, 0x2f, 0x73, 0xdf, 0x3e, 0x79, 0xe5, 0x4c, 0x6c, - 0x59, 0x38, 0xb4, 0x31, 0x3f, 0x92, 0xc5, 0x24, 0xc1, 0x20}, - "IIC ", - 18}, - {{0x88, 0xAE, 0x96, 0x84, 0x5e, 0x15, 0x75, 0x58, 0xef, 0x59, - 0xe9, 0xFf, 0x90, 0xE7, 0x66, 0xE2, 0x2E, 0x48, 0x03, 0x90}, - "IKB ", - 0}, - {{0xe3, 0x83, 0x1c, 0x5A, 0x98, 0x2B, 0x27, 0x9A, 0x19, 0x84, - 0x56, 0xD5, 0x77, 0xcf, 0xb9, 0x04, 0x24, 0xcb, 0x63, 0x40}, - "IMC ", - 6}, - {{0x22, 0xE5, 0xF6, 0x2D, 0x0F, 0xA1, 0x99, 0x74, 0x74, 0x9f, - 0xaa, 0x19, 0x4e, 0x3d, 0x3e, 0xF6, 0xd8, 0x9c, 0x08, 0xd7}, - "IMT ", - 0}, - {{0xf8, 0xe3, 0x86, 0xED, 0xa8, 0x57, 0x48, 0x4f, 0x5a, 0x12, - 0xe4, 0xB5, 0xDA, 0xa9, 0x98, 0x4E, 0x06, 0xE7, 0x37, 0x05}, - "IND ", - 18}, - {{0x5b, 0x2e, 0x4a, 0x70, 0x0d, 0xfb, 0xc5, 0x60, 0x06, 0x1e, - 0x95, 0x7e, 0xde, 0xc8, 0xf6, 0xee, 0xeb, 0x74, 0xa3, 0x20}, - "INS ", - 10}, - {{0xa8, 0x00, 0x6c, 0x4c, 0xa5, 0x6f, 0x24, 0xd6, 0x83, 0x67, - 0x27, 0xd1, 0x06, 0x34, 0x93, 0x20, 0xdb, 0x7f, 0xef, 0x82}, - "INXT ", - 8}, - {{0x0a, 0xeF, 0x06, 0xDc, 0xCC, 0xC5, 0x31, 0xe5, 0x81, 0xf0, - 0x44, 0x00, 0x59, 0xE6, 0xFf, 0xCC, 0x20, 0x60, 0x39, 0xEE}, - "ITT ", - 8}, - {{0xfc, 0xa4, 0x79, 0x62, 0xd4, 0x5a, 0xdf, 0xdf, 0xd1, 0xab, - 0x2d, 0x97, 0x23, 0x15, 0xdb, 0x4c, 0xe7, 0xcc, 0xf0, 0x94}, - "IXT ", - 8}, - {{0x0A, 0xaf, 0x56, 0x1e, 0xFF, 0x5B, 0xD9, 0xc8, 0xF9, 0x11, - 0x61, 0x69, 0x33, 0xF8, 0x41, 0x66, 0xA1, 0x7c, 0xfE, 0x0C}, - "JBX ", - 0}, - {{0x87, 0x27, 0xc1, 0x12, 0xC7, 0x12, 0xc4, 0xa0, 0x33, 0x71, - 0xAC, 0x87, 0xa7, 0x4d, 0xD6, 0xaB, 0x10, 0x4A, 0xf7, 0x68}, - "JETn ", - 18}, - {{0xc1, 0xE6, 0xC6, 0xC6, 0x81, 0xB2, 0x86, 0xFb, 0x50, 0x3B, - 0x36, 0xa9, 0xdD, 0x6c, 0x1d, 0xbF, 0xF8, 0x5E, 0x73, 0xCF}, - "JETo ", - 18}, - {{0x77, 0x34, 0x50, 0x33, 0x5e, 0xD4, 0xec, 0x3D, 0xB4, 0x5a, - 0xF7, 0x4f, 0x34, 0xF2, 0xc8, 0x53, 0x48, 0x64, 0x5D, 0x39}, - "JTC ", - 18}, - {{0xa5, 0xFd, 0x1A, 0x79, 0x1C, 0x4d, 0xfc, 0xaa, 0xcC, 0x96, - 0x3D, 0x4F, 0x73, 0xc6, 0xAe, 0x58, 0x24, 0x14, 0x9e, 0xA7}, - "JNT ", - 18}, - {{0x27, 0x69, 0x5E, 0x09, 0x14, 0x9A, 0xdC, 0x73, 0x8A, 0x97, - 0x8e, 0x9A, 0x67, 0x8F, 0x99, 0xE4, 0xc3, 0x9e, 0x9e, 0xb9}, - "KICK ", - 8}, - {{0x81, 0x8F, 0xc6, 0xC2, 0xEc, 0x59, 0x86, 0xbc, 0x6E, 0x2C, - 0xBf, 0x00, 0x93, 0x9d, 0x90, 0x55, 0x6a, 0xB1, 0x2c, 0xe5}, - "KIN ", - 18}, - {{0xdd, 0x97, 0x4D, 0x5C, 0x2e, 0x29, 0x28, 0xde, 0xA5, 0xF7, - 0x1b, 0x98, 0x25, 0xb8, 0xb6, 0x46, 0x68, 0x6B, 0xD2, 0x00}, - "KNC ", - 18}, - {{0x95, 0x41, 0xFD, 0x8B, 0x9b, 0x5F, 0xA9, 0x73, 0x81, 0x78, - 0x37, 0x83, 0xCe, 0xBF, 0x2F, 0x5f, 0xA7, 0x93, 0xC2, 0x62}, - "KZN ", - 8}, - {{0x2e, 0xb8, 0x6e, 0x8f, 0xc5, 0x20, 0xe0, 0xf6, 0xbb, 0x5d, - 0x9a, 0xf0, 0x8f, 0x92, 0x4f, 0xe7, 0x05, 0x58, 0xab, 0x89}, - "LGR ", - 8}, - {{0xff, 0x18, 0xdb, 0xc4, 0x87, 0xb4, 0xc2, 0xe3, 0x22, 0x2d, - 0x11, 0x59, 0x52, 0xba, 0xbf, 0xda, 0x8b, 0xa5, 0x2f, 0x5f}, - "LIFE ", - 18}, - {{0x51, 0x49, 0x10, 0x77, 0x1a, 0xf9, 0xca, 0x65, 0x6a, 0xf8, - 0x40, 0xdf, 0xf8, 0x3e, 0x82, 0x64, 0xec, 0xf9, 0x86, 0xca}, - "LNK ", - 18}, - {{0xe2, 0xe6, 0xd4, 0xbe, 0x08, 0x6c, 0x69, 0x38, 0xb5, 0x3b, - 0x22, 0x14, 0x48, 0x55, 0xee, 0xf6, 0x74, 0x28, 0x16, 0x39}, - "LNKl ", - 18}, - {{0x24, 0xA7, 0x7c, 0x1F, 0x17, 0xC5, 0x47, 0x10, 0x5E, 0x14, - 0x81, 0x3e, 0x51, 0x7b, 0xe0, 0x6b, 0x00, 0x40, 0xaa, 0x76}, - "LIVE ", - 18}, - {{0x63, 0xe6, 0x34, 0x33, 0x0A, 0x20, 0x15, 0x0D, 0xbB, 0x61, - 0xB1, 0x56, 0x48, 0xbC, 0x73, 0x85, 0x5d, 0x6C, 0xCF, 0x07}, - "LNC ", - 18}, - {{0x6b, 0xeb, 0x41, 0x8f, 0xc6, 0xe1, 0x95, 0x82, 0x04, 0xac, - 0x8b, 0xad, 0xdc, 0xf1, 0x09, 0xb8, 0xe9, 0x69, 0x49, 0x66}, - "LNC ", - 18}, - {{0x5e, 0x33, 0x46, 0x44, 0x40, 0x10, 0x13, 0x53, 0x22, 0x26, - 0x8a, 0x46, 0x30, 0xd2, 0xed, 0x5f, 0x8d, 0x09, 0x44, 0x6c}, - "LOC ", - 18}, - {{0x21, 0xaE, 0x23, 0xB8, 0x82, 0xA3, 0x40, 0xA2, 0x22, 0x82, - 0x16, 0x20, 0x86, 0xbC, 0x98, 0xD3, 0xE2, 0xB7, 0x30, 0x18}, - "LOK ", - 18}, - {{0xEF, 0x68, 0xe7, 0xC6, 0x94, 0xF4, 0x0c, 0x82, 0x02, 0x82, - 0x1e, 0xDF, 0x52, 0x5d, 0xE3, 0x78, 0x24, 0x58, 0x63, 0x9f}, - "LRC ", - 18}, - {{0xFB, 0x12, 0xe3, 0xCc, 0xA9, 0x83, 0xB9, 0xf5, 0x9D, 0x90, - 0x91, 0x2F, 0xd1, 0x7F, 0x8D, 0x74, 0x5A, 0x8B, 0x29, 0x53}, - "LUCK ", - 0}, - {{0xa8, 0x9b, 0x59, 0x34, 0x86, 0x34, 0x47, 0xf6, 0xe4, 0xfc, - 0x53, 0xb3, 0x15, 0xa9, 0x3e, 0x87, 0x3b, 0xda, 0x69, 0xa3}, - "LUM ", - 18}, - {{0xfa, 0x05, 0xA7, 0x3F, 0xfE, 0x78, 0xef, 0x8f, 0x1a, 0x73, - 0x94, 0x73, 0xe4, 0x62, 0xc5, 0x4b, 0xae, 0x65, 0x67, 0xD9}, - "LUN ", - 18}, - {{0x3f, 0x4b, 0x72, 0x66, 0x68, 0xda, 0x46, 0xf5, 0xe0, 0xe7, - 0x5a, 0xa5, 0xd4, 0x78, 0xac, 0xec, 0x9f, 0x38, 0x21, 0x0f}, - "METH ", - 18}, - {{0x0F, 0x5D, 0x2f, 0xB2, 0x9f, 0xb7, 0xd3, 0xCF, 0xeE, 0x44, - 0x4a, 0x20, 0x02, 0x98, 0xf4, 0x68, 0x90, 0x8c, 0xC9, 0x42}, - "MANA ", - 18}, - {{0x38, 0x64, 0x67, 0xf1, 0xf3, 0xdd, 0xbe, 0x83, 0x24, 0x48, - 0x65, 0x04, 0x18, 0x31, 0x1a, 0x47, 0x9e, 0xec, 0xfc, 0x57}, - "MBRS ", - 0}, - {{0x93, 0xE6, 0x82, 0x10, 0x7d, 0x1E, 0x9d, 0xef, 0xB0, 0xb5, - 0xee, 0x70, 0x1C, 0x71, 0x70, 0x7a, 0x4B, 0x2E, 0x46, 0xBc}, - "MCAP ", - 8}, - {{0x13, 0x8A, 0x87, 0x52, 0x09, 0x3F, 0x4f, 0x9a, 0x79, 0xAa, - 0xeD, 0xF4, 0x8d, 0x4B, 0x92, 0x48, 0xfa, 0xb9, 0x3c, 0x9C}, - "MCI ", - 18}, - {{0xB6, 0x3B, 0x60, 0x6A, 0xc8, 0x10, 0xa5, 0x2c, 0xCa, 0x15, - 0xe4, 0x4b, 0xB6, 0x30, 0xfd, 0x42, 0xD8, 0xd1, 0xd8, 0x3d}, - "MCO ", - 8}, - {{0x51, 0xDB, 0x5A, 0xd3, 0x5C, 0x67, 0x1a, 0x87, 0x20, 0x7d, - 0x88, 0xfC, 0x11, 0xd5, 0x93, 0xAC, 0x0C, 0x84, 0x15, 0xbd}, - "MDA ", - 18}, - {{0x40, 0x39, 0x50, 0x44, 0xAc, 0x3c, 0x0C, 0x57, 0x05, 0x19, - 0x06, 0xdA, 0x93, 0x8B, 0x54, 0xBD, 0x65, 0x57, 0xF2, 0x12}, - "MGO ", - 8}, - {{0xe2, 0x3c, 0xd1, 0x60, 0x76, 0x1f, 0x63, 0xFC, 0x3a, 0x1c, - 0xF7, 0x8A, 0xa0, 0x34, 0xb6, 0xcd, 0xF9, 0x7d, 0x3E, 0x0C}, - "MIT ", - 18}, - {{0xC6, 0x6e, 0xA8, 0x02, 0x71, 0x7b, 0xFb, 0x98, 0x33, 0x40, - 0x02, 0x64, 0xDd, 0x12, 0xc2, 0xbC, 0xeA, 0xa3, 0x4a, 0x6d}, - "MKR ", - 18}, - {{0xBE, 0xB9, 0xeF, 0x51, 0x4a, 0x37, 0x9B, 0x99, 0x7e, 0x07, - 0x98, 0xFD, 0xcC, 0x90, 0x1E, 0xe4, 0x74, 0xB6, 0xD9, 0xA1}, - "MLN ", - 18}, - {{0x1a, 0x95, 0xB2, 0x71, 0xB0, 0x53, 0x5D, 0x15, 0xfa, 0x49, - 0x93, 0x2D, 0xab, 0xa3, 0x1B, 0xA6, 0x12, 0xb5, 0x29, 0x46}, - "MNE ", - 8}, - {{0x83, 0xce, 0xe9, 0xe0, 0x86, 0xa7, 0x7e, 0x49, 0x2e, 0xe0, - 0xbb, 0x93, 0xc2, 0xb0, 0x43, 0x7a, 0xd6, 0xfd, 0xec, 0xcc}, - "MNTP ", - 18}, - {{0x95, 0x7c, 0x30, 0xaB, 0x04, 0x26, 0xe0, 0xC9, 0x3C, 0xD8, - 0x24, 0x1E, 0x2c, 0x60, 0x39, 0x2d, 0x08, 0xc6, 0xaC, 0x8e}, - "MOD ", - 0}, - {{0xAB, 0x6C, 0xF8, 0x7a, 0x50, 0xF1, 0x7d, 0x7F, 0x5E, 0x1F, - 0xEa, 0xf8, 0x1B, 0x6f, 0xE9, 0xFf, 0xBe, 0x8E, 0xBF, 0x84}, - "MRV ", - 18}, - {{0x68, 0xAA, 0x3F, 0x23, 0x2d, 0xA9, 0xbd, 0xC2, 0x34, 0x34, - 0x65, 0x54, 0x57, 0x94, 0xef, 0x3e, 0xEa, 0x52, 0x09, 0xBD}, - "MSP ", - 18}, - {{0xaF, 0x4D, 0xcE, 0x16, 0xDa, 0x28, 0x77, 0xf8, 0xc9, 0xe0, - 0x05, 0x44, 0xc9, 0x3B, 0x62, 0xAc, 0x40, 0x63, 0x1F, 0x16}, - "MTH ", - 5}, - {{0xF4, 0x33, 0x08, 0x93, 0x66, 0x89, 0x9D, 0x83, 0xa9, 0xf2, - 0x6A, 0x77, 0x3D, 0x59, 0xec, 0x7e, 0xCF, 0x30, 0x35, 0x5e}, - "MTL ", - 8}, - {{0x7F, 0xC4, 0x08, 0x01, 0x11, 0x65, 0x76, 0x0e, 0xE3, 0x1b, - 0xE2, 0xBF, 0x20, 0xdA, 0xf4, 0x50, 0x35, 0x66, 0x92, 0xAf}, - "MTR ", - 8}, - {{0x0A, 0xF4, 0x4e, 0x27, 0x84, 0x63, 0x72, 0x18, 0xdD, 0x1D, - 0x32, 0xA3, 0x22, 0xD4, 0x4e, 0x60, 0x3A, 0x8f, 0x0c, 0x6A}, - "MTX ", - 18}, - {{0xf7, 0xe9, 0x83, 0x78, 0x16, 0x09, 0x01, 0x23, 0x07, 0xf2, - 0x51, 0x4f, 0x63, 0xD5, 0x26, 0xD8, 0x3D, 0x24, 0xF4, 0x66}, - "MYD ", - 16}, - {{0xa6, 0x45, 0x26, 0x4C, 0x56, 0x03, 0xE9, 0x6c, 0x3b, 0x0B, - 0x07, 0x8c, 0xda, 0xb6, 0x87, 0x33, 0x79, 0x4B, 0x0A, 0x71}, - "MYST ", - 8}, - {{0xa5, 0x4d, 0xdc, 0x7b, 0x3c, 0xce, 0x7f, 0xc8, 0xb1, 0xe3, - 0xfa, 0x02, 0x56, 0xd0, 0xdb, 0x80, 0xd2, 0xc1, 0x09, 0x70}, - "NDC ", - 18}, - {{0xcf, 0xb9, 0x86, 0x37, 0xbc, 0xae, 0x43, 0xC1, 0x33, 0x23, - 0xEA, 0xa1, 0x73, 0x1c, 0xED, 0x2B, 0x71, 0x69, 0x62, 0xfD}, - "NET ", - 18}, - {{0xa8, 0x23, 0xe6, 0x72, 0x20, 0x06, 0xaf, 0xe9, 0x9e, 0x91, - 0xc3, 0x0f, 0xf5, 0x29, 0x50, 0x52, 0xfe, 0x6b, 0x8e, 0x32}, - "NEU ", - 18}, - {{0xe2, 0x65, 0x17, 0xA9, 0x96, 0x72, 0x99, 0x45, 0x3d, 0x3F, - 0x1B, 0x48, 0xAa, 0x00, 0x5E, 0x61, 0x27, 0xe6, 0x72, 0x10}, - "NMFA ", - 18}, - {{0x17, 0x76, 0xe1, 0xF2, 0x6f, 0x98, 0xb1, 0xA5, 0xdF, 0x9c, - 0xD3, 0x47, 0x95, 0x3a, 0x26, 0xdd, 0x3C, 0xb4, 0x66, 0x71}, - "NMR ", - 18}, - {{0xec, 0x46, 0xf8, 0x20, 0x7d, 0x76, 0x60, 0x12, 0x45, 0x4c, - 0x40, 0x8d, 0xe2, 0x10, 0xbc, 0xbc, 0x22, 0x43, 0xe7, 0x1c}, - "NOX ", - 18}, - {{0x45, 0xe4, 0x2D, 0x65, 0x9D, 0x9f, 0x94, 0x66, 0xcD, 0x5D, - 0xF6, 0x22, 0x50, 0x60, 0x33, 0x14, 0x5a, 0x9b, 0x89, 0xBc}, - "NxC ", - 3}, - {{0x76, 0x27, 0xde, 0x4b, 0x93, 0x26, 0x3a, 0x6a, 0x75, 0x70, - 0xb8, 0xda, 0xfa, 0x64, 0xba, 0xe8, 0x12, 0xe5, 0xc3, 0x94}, - "NXX ", - 8}, - {{0x5c, 0x61, 0x83, 0xd1, 0x0A, 0x00, 0xCD, 0x74, 0x7a, 0x6D, - 0xbb, 0x5F, 0x65, 0x8a, 0xD5, 0x14, 0x38, 0x3e, 0x94, 0x19}, - "NXXo ", - 8}, - {{0x70, 0x1C, 0x24, 0x4b, 0x98, 0x8a, 0x51, 0x3c, 0x94, 0x59, - 0x73, 0xdE, 0xFA, 0x05, 0xde, 0x93, 0x3b, 0x23, 0xFe, 0x1D}, - "OAX ", - 18}, - {{0x7F, 0x21, 0x76, 0xcE, 0xB1, 0x6d, 0xcb, 0x64, 0x8d, 0xc9, - 0x24, 0xef, 0xf6, 0x17, 0xc3, 0xdC, 0x2B, 0xEf, 0xd3, 0x0d}, - "OHNI ", - 0}, - {{0xd2, 0x61, 0x14, 0xcd, 0x6E, 0xE2, 0x89, 0xAc, 0xcF, 0x82, - 0x35, 0x0c, 0x8d, 0x84, 0x87, 0xfe, 0xdB, 0x8A, 0x0C, 0x07}, - "OMG ", - 18}, - {{0xb2, 0x3b, 0xe7, 0x35, 0x73, 0xbc, 0x7e, 0x03, 0xdb, 0x6e, - 0x5d, 0xfc, 0x62, 0x40, 0x53, 0x68, 0x71, 0x6d, 0x28, 0xa8}, - "ONEK ", - 18}, - {{0x43, 0x55, 0xfC, 0x16, 0x0f, 0x74, 0x32, 0x8f, 0x9b, 0x38, - 0x3d, 0xF2, 0xEC, 0x58, 0x9b, 0xB3, 0xdF, 0xd8, 0x2B, 0xa0}, - "OPT ", - 18}, - {{0x65, 0xa1, 0x50, 0x14, 0x96, 0x4f, 0x21, 0x02, 0xff, 0x58, - 0x64, 0x7e, 0x16, 0xa1, 0x6a, 0x6b, 0x9e, 0x14, 0xbc, 0xf6}, - "OxFi ", - 3}, - {{0x69, 0x44, 0x04, 0x59, 0x5e, 0x30, 0x75, 0xa9, 0x42, 0x39, - 0x7f, 0x46, 0x6a, 0xac, 0xd4, 0x62, 0xff, 0x1a, 0x7b, 0xd0}, - "PNTS ", - 18}, - {{0xB9, 0x70, 0x48, 0x62, 0x8D, 0xB6, 0xB6, 0x61, 0xD4, 0xC2, - 0xaA, 0x83, 0x3e, 0x95, 0xDb, 0xe1, 0xA9, 0x05, 0xB2, 0x80}, - "PAY ", - 18}, - {{0x55, 0x64, 0x8d, 0xe1, 0x98, 0x36, 0x33, 0x85, 0x49, 0x13, - 0x0b, 0x1a, 0xf5, 0x87, 0xf1, 0x6b, 0xea, 0x46, 0xf6, 0x6b}, - "PBL ", - 18}, - {{0xE6, 0x45, 0x09, 0xF0, 0xbf, 0x07, 0xce, 0x2d, 0x29, 0xA7, - 0xeF, 0x19, 0xA8, 0xA9, 0xbc, 0x06, 0x54, 0x77, 0xC1, 0xB4}, - "PIPL ", - 8}, - {{0x8e, 0xFF, 0xd4, 0x94, 0xeB, 0x69, 0x8c, 0xc3, 0x99, 0xAF, - 0x62, 0x31, 0xfC, 0xcd, 0x39, 0xE0, 0x8f, 0xd2, 0x0B, 0x15}, - "PIX ", - 0}, - {{0xE4, 0x77, 0x29, 0x2f, 0x1B, 0x32, 0x68, 0x68, 0x7A, 0x29, - 0x37, 0x61, 0x16, 0xB0, 0xED, 0x27, 0xA9, 0xc7, 0x61, 0x70}, - "PLAY ", - 18}, - {{0x0A, 0xfF, 0xa0, 0x6e, 0x7F, 0xbe, 0x5b, 0xC9, 0xa7, 0x64, - 0xC9, 0x79, 0xaA, 0x66, 0xE8, 0x25, 0x6A, 0x63, 0x1f, 0x02}, - "PLBT ", - 6}, - {{0xe3, 0x81, 0x85, 0x04, 0xc1, 0xB3, 0x2b, 0xF1, 0x55, 0x7b, - 0x16, 0xC2, 0x38, 0xB2, 0xE0, 0x1F, 0xd3, 0x14, 0x9C, 0x17}, - "PLR ", - 18}, - {{0xD8, 0x91, 0x2C, 0x10, 0x68, 0x1D, 0x8B, 0x21, 0xFd, 0x37, - 0x42, 0x24, 0x4f, 0x44, 0x65, 0x8d, 0xBA, 0x12, 0x26, 0x4E}, - "PLU ", - 18}, - {{0x0e, 0x09, 0x89, 0xb1, 0xf9, 0xb8, 0xa3, 0x89, 0x83, 0xc2, - 0xba, 0x80, 0x53, 0x26, 0x9c, 0xa6, 0x2e, 0xc9, 0xb1, 0x95}, - "POE ", - 8}, - {{0x77, 0x9B, 0x7b, 0x71, 0x3C, 0x86, 0xe3, 0xE6, 0x77, 0x4f, - 0x50, 0x40, 0xD9, 0xcC, 0xC2, 0xD4, 0x3a, 0xd3, 0x75, 0xF8}, - "POOL ", - 8}, - {{0xee, 0x60, 0x9f, 0xe2, 0x92, 0x12, 0x8c, 0xad, 0x03, 0xb7, - 0x86, 0xdb, 0xb9, 0xbc, 0x26, 0x34, 0xcc, 0xdb, 0xe7, 0xfc}, - "POS ", - 18}, - {{0x59, 0x58, 0x32, 0xf8, 0xfc, 0x6b, 0xf5, 0x9c, 0x85, 0xc5, - 0x27, 0xfe, 0xc3, 0x74, 0x0a, 0x1b, 0x7a, 0x36, 0x12, 0x69}, - "POWR ", - 6}, - {{0xc4, 0x22, 0x09, 0xac, 0xcc, 0x14, 0x02, 0x9c, 0x10, 0x12, - 0xfb, 0x56, 0x80, 0xd9, 0x5f, 0xbd, 0x60, 0x36, 0xe2, 0xa0}, - "PPP ", - 18}, - {{0xd4, 0xfa, 0x14, 0x60, 0xF5, 0x37, 0xbb, 0x90, 0x85, 0xd2, - 0x2C, 0x7b, 0xcC, 0xB5, 0xDD, 0x45, 0x0E, 0xf2, 0x8e, 0x3a}, - "PPT ", - 8}, - {{0x88, 0xa3, 0xe4, 0xf3, 0x5d, 0x64, 0xaa, 0xd4, 0x1a, 0x6d, - 0x40, 0x30, 0xac, 0x9a, 0xfe, 0x43, 0x56, 0xcb, 0x84, 0xfa}, - "PRE ", - 18}, - {{0x22, 0x6b, 0xb5, 0x99, 0xa1, 0x2C, 0x82, 0x64, 0x76, 0xe3, - 0xA7, 0x71, 0x45, 0x46, 0x97, 0xEA, 0x52, 0xE9, 0xE2, 0x20}, - "PRO ", - 8}, - {{0x16, 0x37, 0x33, 0xbc, 0xc2, 0x8d, 0xbf, 0x26, 0xB4, 0x1a, - 0x8C, 0xfA, 0x83, 0xe3, 0x69, 0xb5, 0xB3, 0xaf, 0x74, 0x1b}, - "PRS ", - 18}, - {{0x77, 0x28, 0xdf, 0xef, 0x5a, 0xbd, 0x46, 0x86, 0x69, 0xeb, - 0x7f, 0x9b, 0x48, 0xa7, 0xf7, 0x0a, 0x50, 0x1e, 0xd2, 0x9d}, - "PRG ", - 6}, - {{0x0c, 0x04, 0xd4, 0xf3, 0x31, 0xda, 0x8d, 0xf7, 0x5f, 0x9e, - 0x2e, 0x27, 0x1e, 0x3f, 0x3f, 0x14, 0x94, 0xc6, 0x6c, 0x36}, - "PRSP ", - 9}, - {{0x66, 0x49, 0x7a, 0x28, 0x3e, 0x0a, 0x00, 0x7b, 0xa3, 0x97, - 0x4e, 0x83, 0x77, 0x84, 0xc6, 0xae, 0x32, 0x34, 0x47, 0xde}, - "PT ", - 18}, - {{0x8A, 0xe4, 0xBF, 0x2C, 0x33, 0xa8, 0xe6, 0x67, 0xde, 0x34, - 0xB5, 0x49, 0x38, 0xB0, 0xcc, 0xD0, 0x3E, 0xb8, 0xCC, 0x06}, - "PTOY ", - 8}, - {{0x67, 0x1A, 0xbB, 0xe5, 0xCE, 0x65, 0x24, 0x91, 0x98, 0x53, - 0x42, 0xe8, 0x54, 0x28, 0xEB, 0x1b, 0x07, 0xbC, 0x6c, 0x64}, - "QAU ", - 8}, - {{0x99, 0xea, 0x4d, 0xB9, 0xEE, 0x77, 0xAC, 0xD4, 0x0B, 0x11, - 0x9B, 0xD1, 0xdC, 0x4E, 0x33, 0xe1, 0xC0, 0x70, 0xb8, 0x0d}, - "QSP ", - 18}, - {{0x2C, 0x3C, 0x1F, 0x05, 0x18, 0x7d, 0xBa, 0x7A, 0x5f, 0x2D, - 0xd4, 0x7D, 0xca, 0x57, 0x28, 0x1C, 0x4d, 0x4F, 0x18, 0x3F}, - "QTQ ", - 18}, - {{0x9a, 0x64, 0x2d, 0x6b, 0x33, 0x68, 0xdd, 0xc6, 0x62, 0xCA, - 0x24, 0x4b, 0xAd, 0xf3, 0x2c, 0xDA, 0x71, 0x60, 0x05, 0xBC}, - "QTUM ", - 18}, - {{0x69, 0x7b, 0xea, 0xc2, 0x8B, 0x09, 0xE1, 0x22, 0xC4, 0x33, - 0x2D, 0x16, 0x39, 0x85, 0xe8, 0xa7, 0x31, 0x21, 0xb9, 0x7F}, - "QRL ", - 8}, - {{0x25, 0x5a, 0xa6, 0xdf, 0x07, 0x54, 0x0c, 0xb5, 0xd3, 0xd2, - 0x97, 0xf0, 0xd0, 0xd4, 0xd8, 0x4c, 0xb5, 0x2b, 0xc8, 0xe6}, - "RDN ", - 18}, - {{0x5f, 0x53, 0xf7, 0xa8, 0x07, 0x56, 0x14, 0xb6, 0x99, 0xba, - 0xad, 0x0b, 0xc2, 0xc8, 0x99, 0xf4, 0xba, 0xd8, 0xfb, 0xbf}, - "REBL ", - 18}, - {{0xE9, 0x43, 0x27, 0xD0, 0x7F, 0xc1, 0x79, 0x07, 0xb4, 0xDB, - 0x78, 0x8E, 0x5a, 0xDf, 0x2e, 0xd4, 0x24, 0xad, 0xDf, 0xf6}, - "REP ", - 18}, - {{0xf0, 0x5a, 0x93, 0x82, 0xA4, 0xC3, 0xF2, 0x9E, 0x27, 0x84, - 0x50, 0x27, 0x54, 0x29, 0x3D, 0x88, 0xb8, 0x35, 0x10, 0x9C}, - "REX ", - 18}, - {{0xdd, 0x00, 0x72, 0x78, 0xb6, 0x67, 0xf6, 0xbe, 0xf5, 0x2f, - 0xd0, 0xa4, 0xc2, 0x36, 0x04, 0xaa, 0x1f, 0x96, 0x03, 0x9a}, - "RIPT ", - 8}, - {{0x60, 0x7F, 0x4C, 0x5B, 0xB6, 0x72, 0x23, 0x0e, 0x86, 0x72, - 0x08, 0x55, 0x32, 0xf7, 0xe9, 0x01, 0x54, 0x4a, 0x73, 0x75}, - "RLC ", - 9}, - {{0xcC, 0xeD, 0x5B, 0x82, 0x88, 0x08, 0x6B, 0xE8, 0xc3, 0x8E, - 0x23, 0x56, 0x7e, 0x68, 0x4C, 0x37, 0x40, 0xbe, 0x4D, 0x48}, - "RLT ", - 10}, - {{0x4a, 0x42, 0xd2, 0xc5, 0x80, 0xf8, 0x3d, 0xce, 0x40, 0x4a, - 0xca, 0xd1, 0x8d, 0xab, 0x26, 0xdb, 0x11, 0xa1, 0x75, 0x0e}, - "RLX ", - 18}, - {{0x09, 0x96, 0xbf, 0xb5, 0xd0, 0x57, 0xfa, 0xa2, 0x37, 0x64, - 0x0e, 0x25, 0x06, 0xbe, 0x7b, 0x4f, 0x9c, 0x46, 0xde, 0x0b}, - "RNDR ", - 18}, - {{0xb4, 0xef, 0xd8, 0x5c, 0x19, 0x99, 0x9d, 0x84, 0x25, 0x13, - 0x04, 0xbd, 0xa9, 0x9e, 0x90, 0xb9, 0x23, 0x00, 0xbd, 0x93}, - "RPL ", - 18}, - {{0xc9, 0xde, 0x4b, 0x7f, 0x0c, 0x3d, 0x99, 0x1e, 0x96, 0x71, - 0x58, 0xe4, 0xd4, 0xbf, 0xa4, 0xb5, 0x1e, 0xc0, 0xb1, 0x14}, - "ROK ", - 18}, - {{0x49, 0x93, 0xCB, 0x95, 0xc7, 0x44, 0x3b, 0xdC, 0x06, 0x15, - 0x5c, 0x5f, 0x56, 0x88, 0xBe, 0x9D, 0x8f, 0x69, 0x99, 0xa5}, - "RND ", - 18}, - {{0x3d, 0x1b, 0xa9, 0xbe, 0x9f, 0x66, 0xb8, 0xee, 0x10, 0x19, - 0x11, 0xbc, 0x36, 0xd3, 0xfb, 0x56, 0x2e, 0xac, 0x22, 0x44}, - "RVT ", - 18}, - {{0x8f, 0x82, 0x21, 0xaF, 0xbB, 0x33, 0x99, 0x8d, 0x85, 0x84, - 0xA2, 0xB0, 0x57, 0x49, 0xbA, 0x73, 0xc3, 0x7a, 0x93, 0x8a}, - "REQ ", - 18}, - {{0x41, 0x56, 0xD3, 0x34, 0x2D, 0x5c, 0x38, 0x5a, 0x87, 0xD2, - 0x64, 0xF9, 0x06, 0x53, 0x73, 0x35, 0x92, 0x00, 0x05, 0x81}, - "SALT ", - 8}, - {{0x7C, 0x5A, 0x0C, 0xE9, 0x26, 0x7E, 0xD1, 0x9B, 0x22, 0xF8, - 0xca, 0xe6, 0x53, 0xF1, 0x98, 0xe3, 0xE8, 0xda, 0xf0, 0x98}, - "SAN ", - 18}, - {{0x1e, 0xc8, 0xfe, 0x51, 0xa9, 0xb6, 0xa3, 0xa6, 0xc4, 0x27, - 0xd1, 0x7d, 0x9e, 0xcc, 0x30, 0x60, 0xfb, 0xc4, 0xa4, 0x5c}, - "SAPT ", - 18}, - {{0xd7, 0x63, 0x17, 0x87, 0xB4, 0xdC, 0xc8, 0x7b, 0x12, 0x54, - 0xcf, 0xd1, 0xe5, 0xcE, 0x48, 0xe9, 0x68, 0x23, 0xdE, 0xe8}, - "SCL ", - 8}, - {{0x4c, 0xa7, 0x41, 0x85, 0x53, 0x2d, 0xc1, 0x78, 0x95, 0x27, - 0x19, 0x4e, 0x5b, 0x9c, 0x86, 0x6d, 0xd3, 0x3f, 0x4e, 0x82}, - "sens ", - 18}, - {{0x3e, 0xb9, 0x1d, 0x23, 0x7e, 0x49, 0x1e, 0x0d, 0xee, 0x85, - 0x82, 0xc4, 0x02, 0xd8, 0x5c, 0xb4, 0x40, 0xfb, 0x6b, 0x54}, - "SETH ", - 18}, - {{0xe0, 0x6e, 0xda, 0x74, 0x35, 0xba, 0x74, 0x9b, 0x04, 0x73, - 0x80, 0xce, 0xd4, 0x91, 0x21, 0xdd, 0xe9, 0x33, 0x34, 0xae}, - "SET ", - 0}, - {{0xe0, 0x6e, 0xda, 0x74, 0x35, 0xba, 0x74, 0x9b, 0x04, 0x73, - 0x80, 0xce, 0xd4, 0x91, 0x21, 0xdd, 0xe9, 0x33, 0x34, 0xae}, - "SET ", - 0}, - {{0x98, 0xf5, 0xe9, 0xb7, 0xf0, 0xe3, 0x39, 0x56, 0xc0, 0x44, - 0x3e, 0x81, 0xbf, 0x7d, 0xeb, 0x8b, 0x5b, 0x1e, 0xd5, 0x45}, - "SEXY ", - 18}, - {{0xd2, 0x48, 0xB0, 0xD4, 0x8E, 0x44, 0xaa, 0xF9, 0xc4, 0x9a, - 0xea, 0x03, 0x12, 0xbe, 0x7E, 0x13, 0xa6, 0xdc, 0x14, 0x68}, - "SGT ", - 1}, - {{0xEF, 0x2E, 0x99, 0x66, 0xeb, 0x61, 0xBB, 0x49, 0x4E, 0x53, - 0x75, 0xd5, 0xDf, 0x8d, 0x67, 0xB7, 0xdB, 0x8A, 0x78, 0x0D}, - "SHIT ", - 0}, - {{0x8a, 0x18, 0x7d, 0x52, 0x85, 0xd3, 0x16, 0xbc, 0xbc, 0x9a, - 0xda, 0xfc, 0x08, 0xb5, 0x1d, 0x70, 0xa0, 0xd8, 0xe0, 0x00}, - "SIFT ", - 0}, - {{0x2b, 0xDC, 0x0D, 0x42, 0x99, 0x60, 0x17, 0xfC, 0xe2, 0x14, - 0xb2, 0x16, 0x07, 0xa5, 0x15, 0xDA, 0x41, 0xA9, 0xE0, 0xC5}, - "SKIN ", - 6}, - {{0x49, 0x94, 0xe8, 0x18, 0x97, 0xa9, 0x20, 0xc0, 0xFE, 0xA2, - 0x35, 0xeb, 0x8C, 0xEd, 0xEE, 0xd3, 0xc6, 0xfF, 0xF6, 0x97}, - "SKO1 ", - 18}, - {{0x4c, 0x38, 0x2F, 0x8E, 0x09, 0x61, 0x5A, 0xC8, 0x6E, 0x08, - 0xCE, 0x58, 0x26, 0x6C, 0xC2, 0x27, 0xe7, 0xd4, 0xD9, 0x13}, - "SKR ", - 6}, - {{0x7A, 0x5f, 0xF2, 0x95, 0xDc, 0x82, 0x39, 0xd5, 0xC2, 0x37, - 0x4E, 0x4D, 0x89, 0x42, 0x02, 0xaA, 0xF0, 0x29, 0xCa, 0xb6}, - "SLT ", - 3}, - {{0x6F, 0x6D, 0xEb, 0x5d, 0xb0, 0xC4, 0x99, 0x4A, 0x82, 0x83, - 0xA0, 0x1D, 0x6C, 0xFe, 0xEB, 0x27, 0xFc, 0x3b, 0xBe, 0x9C}, - "smrt ", - 0}, - {{0xF4, 0x13, 0x41, 0x46, 0xAF, 0x2d, 0x51, 0x1D, 0xd5, 0xEA, - 0x8c, 0xDB, 0x1C, 0x4A, 0xC8, 0x8C, 0x57, 0xD6, 0x04, 0x04}, - "SNC ", - 18}, - {{0x44, 0xF5, 0x88, 0xaE, 0xeB, 0x8C, 0x44, 0x47, 0x14, 0x39, - 0xD1, 0x27, 0x0B, 0x36, 0x03, 0xc6, 0x6a, 0x92, 0x62, 0xF1}, - "SNIP ", - 18}, - {{0xae, 0xC2, 0xE8, 0x7E, 0x0A, 0x23, 0x52, 0x66, 0xD9, 0xC5, - 0xAD, 0xc9, 0xDE, 0xb4, 0xb2, 0xE2, 0x9b, 0x54, 0xD0, 0x09}, - "SNGL ", - 0}, - {{0xf3, 0x33, 0xb2, 0xAc, 0xe9, 0x92, 0xac, 0x2b, 0xBD, 0x87, - 0x98, 0xbF, 0x57, 0xBc, 0x65, 0xa0, 0x61, 0x84, 0xaf, 0xBa}, - "SND ", - 0}, - {{0x98, 0x3F, 0x6d, 0x60, 0xdb, 0x79, 0xea, 0x8c, 0xA4, 0xeB, - 0x99, 0x68, 0xC6, 0xaF, 0xf8, 0xcf, 0xA0, 0x4B, 0x3c, 0x63}, - "SNM ", - 18}, - {{0x74, 0x4d, 0x70, 0xFD, 0xBE, 0x2B, 0xa4, 0xCF, 0x95, 0x13, - 0x16, 0x26, 0x61, 0x4a, 0x17, 0x63, 0xDF, 0x80, 0x5B, 0x9E}, - "SNT ", - 18}, - {{0x58, 0xbf, 0x7d, 0xf5, 0x7d, 0x9D, 0xA7, 0x11, 0x3c, 0x4c, - 0xCb, 0x49, 0xd8, 0x46, 0x3D, 0x49, 0x08, 0xC7, 0x35, 0xcb}, - "SPRC ", - 18}, - {{0x24, 0xae, 0xf3, 0xbf, 0x1a, 0x47, 0x56, 0x15, 0x00, 0xf9, - 0x43, 0x0d, 0x74, 0xed, 0x40, 0x97, 0xc4, 0x7f, 0x51, 0xf2}, - "SPTA ", - 4}, - {{0x85, 0x08, 0x93, 0x89, 0xC1, 0x4B, 0xd9, 0xc7, 0x7F, 0xC2, - 0xb8, 0xF0, 0xc3, 0xd1, 0xdC, 0x33, 0x63, 0xBf, 0x06, 0xEf}, - "SPF ", - 18}, - {{0x68, 0xd5, 0x7c, 0x9a, 0x1C, 0x35, 0xf6, 0x3E, 0x2c, 0x83, - 0xeE, 0x8e, 0x49, 0xA6, 0x4e, 0x9d, 0x70, 0x52, 0x8D, 0x25}, - "SRN ", - 18}, - {{0x2C, 0x4e, 0x8f, 0x2D, 0x74, 0x61, 0x13, 0xd0, 0x69, 0x6c, - 0xE8, 0x9B, 0x35, 0xF0, 0xd8, 0xbF, 0x88, 0xE0, 0xAE, 0xcA}, - "ST ", - 18}, - {{0xF7, 0x0a, 0x64, 0x2b, 0xD3, 0x87, 0xF9, 0x43, 0x80, 0xfF, - 0xb9, 0x04, 0x51, 0xC2, 0xc8, 0x1d, 0x4E, 0xb8, 0x2C, 0xBc}, - "STAR ", - 18}, - {{0x7d, 0xd7, 0xf5, 0x6d, 0x69, 0x7c, 0xc0, 0xf2, 0xb5, 0x2b, - 0xd5, 0x5c, 0x05, 0x7f, 0x37, 0x8f, 0x1f, 0xe6, 0xab, 0x4b}, - "STEK ", - 18}, - {{0xB6, 0x4e, 0xf5, 0x1C, 0x88, 0x89, 0x72, 0xc9, 0x08, 0xCF, - 0xac, 0xf5, 0x9B, 0x47, 0xC1, 0xAf, 0xBC, 0x0A, 0xb8, 0xaC}, - "STRJ ", - 8}, - {{0xD0, 0xa4, 0xb8, 0x94, 0x6C, 0xb5, 0x2f, 0x06, 0x61, 0x27, - 0x3b, 0xfb, 0xC6, 0xfD, 0x0E, 0x0C, 0x75, 0xFc, 0x64, 0x33}, - "STRM ", - 18}, - {{0x59, 0x93, 0x46, 0x77, 0x9e, 0x90, 0xfc, 0x3F, 0x5F, 0x99, - 0x7b, 0x5e, 0xa7, 0x15, 0x34, 0x98, 0x20, 0xF9, 0x15, 0x71}, - "STN ", - 4}, - {{0x46, 0x49, 0x24, 0x73, 0x75, 0x5e, 0x8d, 0xF9, 0x60, 0xF8, - 0x03, 0x48, 0x77, 0xF6, 0x17, 0x32, 0xD7, 0x18, 0xCE, 0x96}, - "STRC ", - 8}, - {{0x00, 0x6B, 0xeA, 0x43, 0xBa, 0xa3, 0xf7, 0xA6, 0xf7, 0x65, - 0xF1, 0x4f, 0x10, 0xA1, 0xa1, 0xb0, 0x83, 0x34, 0xEF, 0x45}, - "STX ", - 18}, - {{0x12, 0x48, 0x0E, 0x24, 0xeb, 0x5b, 0xec, 0x1a, 0x9D, 0x43, - 0x69, 0xCa, 0xB6, 0xa8, 0x0c, 0xaD, 0x3c, 0x0A, 0x37, 0x7A}, - "SUB ", - 2}, - {{0xB9, 0xe7, 0xF8, 0x56, 0x8e, 0x08, 0xd5, 0x65, 0x9f, 0x5D, - 0x29, 0xC4, 0x99, 0x71, 0x73, 0xd8, 0x4C, 0xdF, 0x26, 0x07}, - "SWT ", - 18}, - {{0x55, 0x4c, 0x98, 0xb3, 0xec, 0x77, 0x2f, 0x79, 0xeE, 0x5b, - 0x96, 0xd4, 0x7A, 0x1D, 0x10, 0x85, 0x2E, 0xD2, 0x74, 0xC8}, - "SXD ", - 18}, - {{0x6c, 0xeE, 0x94, 0x8C, 0x9d, 0x59, 0x3c, 0x58, 0xCb, 0xa5, - 0xDf, 0xa7, 0x04, 0x82, 0x44, 0x48, 0x99, 0xD1, 0x34, 0x1c}, - "SXS ", - 18}, - {{0xaA, 0xDB, 0x05, 0xF4, 0x49, 0x07, 0x2D, 0x27, 0x58, 0x33, - 0xbA, 0xf7, 0xC8, 0x2e, 0x8f, 0xCa, 0x4e, 0xe4, 0x65, 0x75}, - "SXU ", - 18}, - {{0x10, 0xb1, 0x23, 0xfd, 0xdd, 0xe0, 0x03, 0x24, 0x31, 0x99, - 0xaa, 0xd0, 0x35, 0x22, 0x06, 0x5d, 0xc0, 0x58, 0x27, 0xa0}, - "SYN ", - 18}, - {{0xE7, 0x77, 0x5A, 0x6e, 0x9B, 0xcf, 0x90, 0x4e, 0xb3, 0x9D, - 0xA2, 0xb6, 0x8c, 0x5e, 0xfb, 0x4F, 0x93, 0x60, 0xe0, 0x8C}, - "TaaS ", - 6}, - {{0xAF, 0xe6, 0x05, 0x11, 0x34, 0x1a, 0x37, 0x48, 0x8d, 0xe2, - 0x5B, 0xef, 0x35, 0x19, 0x52, 0x56, 0x2E, 0x31, 0xfC, 0xc1}, - "TBT ", - 8}, - {{0xa7, 0xf9, 0x76, 0xC3, 0x60, 0xeb, 0xBe, 0xD4, 0x46, 0x5c, - 0x28, 0x55, 0x68, 0x4D, 0x1A, 0xAE, 0x52, 0x71, 0xeF, 0xa9}, - "TFL ", - 8}, - {{0xFA, 0xCC, 0xD5, 0xFc, 0x83, 0xc3, 0xE4, 0xC3, 0xc1, 0xAC, - 0x1E, 0xF3, 0x5D, 0x15, 0xad, 0xf0, 0x6b, 0xCF, 0x20, 0x9C}, - "TBC2 ", - 8}, - {{0x65, 0x31, 0xf1, 0x33, 0xe6, 0xDe, 0xeB, 0xe7, 0xF2, 0xdc, - 0xE5, 0xA0, 0x44, 0x1a, 0xA7, 0xef, 0x33, 0x0B, 0x4e, 0x53}, - "TIME ", - 8}, - {{0x80, 0xbc, 0x55, 0x12, 0x56, 0x1c, 0x7f, 0x85, 0xa3, 0xa9, - 0x50, 0x8c, 0x7d, 0xf7, 0x90, 0x1b, 0x37, 0x0f, 0xa1, 0xdf}, - "TIO ", - 18}, - {{0xEa, 0x1f, 0x34, 0x6f, 0xaF, 0x02, 0x3F, 0x97, 0x4E, 0xb5, - 0xad, 0xaf, 0x08, 0x8B, 0xbC, 0xdf, 0x02, 0xd7, 0x61, 0xF4}, - "TIX ", - 18}, - {{0xaA, 0xAf, 0x91, 0xD9, 0xb9, 0x0d, 0xF8, 0x00, 0xDf, 0x4F, - 0x55, 0xc2, 0x05, 0xfd, 0x69, 0x89, 0xc9, 0x77, 0xE7, 0x3a}, - "TKN ", - 8}, - {{0x08, 0xf5, 0xa9, 0x23, 0x5b, 0x08, 0x17, 0x3b, 0x75, 0x69, - 0xf8, 0x36, 0x45, 0xd2, 0xc7, 0xfb, 0x55, 0xe8, 0xcc, 0xd8}, - "TNT ", - 8}, - {{0xCb, 0x94, 0xbe, 0x6f, 0x13, 0xA1, 0x18, 0x2E, 0x4A, 0x4B, - 0x61, 0x40, 0xcb, 0x7b, 0xf2, 0x02, 0x5d, 0x28, 0xe4, 0x1B}, - "TRST ", - 6}, - {{0xf2, 0x30, 0xb7, 0x90, 0xe0, 0x53, 0x90, 0xfc, 0x82, 0x95, - 0xf4, 0xd3, 0xf6, 0x03, 0x32, 0xc9, 0x3b, 0xed, 0x42, 0xe2}, - "TRX ", - 6}, - {{0x24, 0x69, 0x27, 0x91, 0xbc, 0x44, 0x4c, 0x5c, 0xd0, 0xb8, - 0x1e, 0x3c, 0xbc, 0xab, 0xa4, 0xb0, 0x4a, 0xcd, 0x1f, 0x3b}, - "UKG ", - 18}, - {{0x89, 0x20, 0x5A, 0x3A, 0x3b, 0x2A, 0x69, 0xDe, 0x6D, 0xbf, - 0x7f, 0x01, 0xED, 0x13, 0xB2, 0x10, 0x8B, 0x2c, 0x43, 0xe7}, - "o> ", - 0}, - {{0xd0, 0x1d, 0xb7, 0x3e, 0x04, 0x78, 0x55, 0xef, 0xb4, 0x14, - 0xe6, 0x20, 0x20, 0x98, 0xc4, 0xbe, 0x4c, 0xd2, 0x42, 0x3b}, - "UQC ", - 18}, - {{0xEb, 0xeD, 0x4f, 0xF9, 0xfe, 0x34, 0x41, 0x3d, 0xb8, 0xfC, - 0x82, 0x94, 0x55, 0x6B, 0xBD, 0x15, 0x28, 0xa4, 0xDA, 0xca}, - "VENS ", - 3}, - {{0x8f, 0x34, 0x70, 0xA7, 0x38, 0x8c, 0x05, 0xeE, 0x4e, 0x7A, - 0xF3, 0xd0, 0x1D, 0x8C, 0x72, 0x2b, 0x0F, 0xF5, 0x23, 0x74}, - "VERI ", - 18}, - {{0xD8, 0x50, 0x94, 0x2e, 0xF8, 0x81, 0x1f, 0x2A, 0x86, 0x66, - 0x92, 0xA6, 0x23, 0x01, 0x1b, 0xDE, 0x52, 0xa4, 0x62, 0xC1}, - "VET ", - 18}, - {{0xe8, 0xff, 0x5c, 0x9c, 0x75, 0xde, 0xb3, 0x46, 0xac, 0xac, - 0x49, 0x3c, 0x46, 0x3c, 0x89, 0x50, 0xbe, 0x03, 0xdf, 0xba}, - "VIBE ", - 18}, - {{0x2C, 0x97, 0x4B, 0x2d, 0x0B, 0xA1, 0x71, 0x6E, 0x64, 0x4c, - 0x1F, 0xC5, 0x99, 0x82, 0xa8, 0x9D, 0xDD, 0x2f, 0xF7, 0x24}, - "VIB ", - 18}, - {{0x88, 0x24, 0x48, 0xf8, 0x3d, 0x90, 0xb2, 0xbf, 0x47, 0x7a, - 0xf2, 0xea, 0x79, 0x32, 0x7f, 0xde, 0xa1, 0x33, 0x5d, 0x93}, - "VIBX ", - 18}, - {{0x51, 0x94, 0x75, 0xb3, 0x16, 0x53, 0xe4, 0x6d, 0x20, 0xcd, - 0x09, 0xf9, 0xfd, 0xcf, 0x3b, 0x12, 0xbd, 0xac, 0xb4, 0xf5}, - "VIU ", - 18}, - {{0x83, 0xeE, 0xA0, 0x0D, 0x83, 0x8f, 0x92, 0xdE, 0xC4, 0xD1, - 0x47, 0x56, 0x97, 0xB9, 0xf4, 0xD3, 0x53, 0x7b, 0x56, 0xE3}, - "VOIS ", - 8}, - {{0xeD, 0xBa, 0xF3, 0xc5, 0x10, 0x03, 0x02, 0xdC, 0xdd, 0xA5, - 0x32, 0x69, 0x32, 0x2f, 0x37, 0x30, 0xb1, 0xF0, 0x41, 0x6d}, - "VRS ", - 5}, - {{0x5c, 0x54, 0x3e, 0x7A, 0xE0, 0xA1, 0x10, 0x4f, 0x78, 0x40, - 0x6C, 0x34, 0x0E, 0x9C, 0x64, 0xFD, 0x9f, 0xCE, 0x51, 0x70}, - "VSL ", - 18}, - {{0x82, 0x66, 0x57, 0x64, 0xea, 0x0b, 0x58, 0x15, 0x7E, 0x1e, - 0x5E, 0x9b, 0xab, 0x32, 0xF6, 0x8c, 0x76, 0xEc, 0x0C, 0xdF}, - "VSMo ", - 0}, - {{0x28, 0x6B, 0xDA, 0x14, 0x13, 0xa2, 0xDf, 0x81, 0x73, 0x1D, - 0x49, 0x30, 0xce, 0x2F, 0x86, 0x2a, 0x35, 0xA6, 0x09, 0xfE}, - "WaBi ", - 18}, - {{0x74, 0x95, 0x1B, 0x67, 0x7d, 0xe3, 0x2D, 0x59, 0x6E, 0xE8, - 0x51, 0xA2, 0x33, 0x33, 0x69, 0x26, 0xe6, 0xA2, 0xcd, 0x09}, - "WBA ", - 7}, - {{0x6a, 0x0A, 0x97, 0xE4, 0x7d, 0x15, 0xaA, 0xd1, 0xD1, 0x32, - 0xa1, 0xAc, 0x79, 0xa4, 0x80, 0xE3, 0xF2, 0x07, 0x90, 0x63}, - "WCT ", - 18}, - {{0x5e, 0x4A, 0xBE, 0x64, 0x19, 0x65, 0x0C, 0xA8, 0x39, 0xCe, - 0x5B, 0xB7, 0xDb, 0x42, 0x2b, 0x88, 0x1a, 0x60, 0x64, 0xbB}, - "WiC ", - 18}, - {{0x66, 0x70, 0x88, 0xb2, 0x12, 0xce, 0x3d, 0x06, 0xa1, 0xb5, - 0x53, 0xa7, 0x22, 0x1E, 0x1f, 0xD1, 0x90, 0x00, 0xd9, 0xaF}, - "WING ", - 18}, - {{0xF6, 0xB5, 0x5a, 0xcB, 0xBC, 0x49, 0xf4, 0x52, 0x4A, 0xa4, - 0x8D, 0x19, 0x28, 0x1A, 0x9A, 0x77, 0xc5, 0x4D, 0xE1, 0x0f}, - "WLK ", - 18}, - {{0x72, 0x87, 0x81, 0xE7, 0x57, 0x35, 0xdc, 0x09, 0x62, 0xDf, - 0x3a, 0x51, 0xd7, 0xEf, 0x47, 0xE7, 0x98, 0xA7, 0x10, 0x7E}, - "WOLK ", - 18}, - {{0x62, 0x08, 0x72, 0x45, 0x08, 0x71, 0x25, 0xd3, 0xdb, 0x5b, - 0x9a, 0x3d, 0x71, 0x3d, 0x78, 0xe7, 0xbb, 0xc3, 0x1e, 0x54}, - "WPC ", - 18}, - {{0x91, 0x0D, 0xfc, 0x18, 0xD6, 0xEA, 0x3D, 0x6a, 0x71, 0x24, - 0xA6, 0xF8, 0xB5, 0x45, 0x8F, 0x28, 0x10, 0x60, 0xfa, 0x4c}, - "X8X ", - 18}, - {{0x4D, 0xF8, 0x12, 0xF6, 0x06, 0x4d, 0xef, 0x1e, 0x5e, 0x02, - 0x9f, 0x1c, 0xa8, 0x58, 0x77, 0x7C, 0xC9, 0x8D, 0x2D, 0x81}, - "XAUR ", - 8}, - {{0x53, 0x3e, 0xf0, 0x98, 0x4b, 0x2F, 0xAA, 0x22, 0x7A, 0xcC, - 0x62, 0x0C, 0x67, 0xcc, 0xe1, 0x2a, 0xA3, 0x9C, 0xD8, 0xCD}, - "XGM ", - 8}, - {{0x30, 0xf4, 0xA3, 0xe0, 0xaB, 0x7a, 0x76, 0x73, 0x3D, 0x8b, - 0x60, 0xb8, 0x9D, 0xD9, 0x3c, 0x3D, 0x0b, 0x4c, 0x9E, 0x2f}, - "XGT ", - 18}, - {{0xB1, 0x10, 0xeC, 0x7B, 0x1d, 0xcb, 0x8F, 0xAB, 0x8d, 0xED, - 0xbf, 0x28, 0xf5, 0x3B, 0xc6, 0x3e, 0xA5, 0xBE, 0xdd, 0x84}, - "XID ", - 8}, - {{0xab, 0x95, 0xe9, 0x15, 0xc1, 0x23, 0xfd, 0xed, 0x5b, 0xdf, - 0xb6, 0x32, 0x5e, 0x35, 0xef, 0x55, 0x15, 0xf1, 0xea, 0x69}, - "XNN ", - 18}, - {{0xB2, 0x47, 0x54, 0xbE, 0x79, 0x28, 0x15, 0x53, 0xdc, 0x1a, - 0xdC, 0x16, 0x0d, 0xdF, 0x5C, 0xd9, 0xb7, 0x43, 0x61, 0xa4}, - "XRL ", - 9}, - {{0x0F, 0x51, 0x3f, 0xFb, 0x49, 0x26, 0xff, 0x82, 0xD7, 0xF6, - 0x0A, 0x05, 0x06, 0x90, 0x47, 0xAc, 0xA2, 0x95, 0xC4, 0x13}, - "XSC ", - 18}, - {{0x0F, 0x33, 0xbb, 0x20, 0xa2, 0x82, 0xA7, 0x64, 0x9C, 0x7B, - 0x3A, 0xFf, 0x64, 0x4F, 0x08, 0x4a, 0x93, 0x48, 0xe9, 0x33}, - "YUPI ", - 18}, - {{0x67, 0x81, 0xa0, 0xf8, 0x4c, 0x7e, 0x9e, 0x84, 0x6d, 0xcb, - 0x84, 0xa9, 0xa5, 0xbd, 0x49, 0x33, 0x30, 0x67, 0xb1, 0x04}, - "ZAP ", - 18}, - {{0xE4, 0x1d, 0x24, 0x89, 0x57, 0x1d, 0x32, 0x21, 0x89, 0x24, - 0x6D, 0xaF, 0xA5, 0xeb, 0xDe, 0x1F, 0x46, 0x99, 0xF4, 0x98}, - "ZRX ", - 18}, - {{0xe3, 0x86, 0xb1, 0x39, 0xed, 0x37, 0x15, 0xca, 0x4b, 0x18, - 0xfd, 0x52, 0x67, 0x1b, 0xdc, 0xea, 0x1c, 0xdf, 0xe4, 0xb1}, - "ZST ", - 8} - +const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { + {{0x4E,0x84,0xE9,0xe5,0xfb,0x0A,0x97,0x26,0x28,0xCf,0x45,0x68,0xc4,0x03,0x16,0x7E,0xF1,0xD4,0x04,0x31}, "$FFC ", 18}, + {{0xa0,0x24,0xe8,0x05,0x7e,0xec,0x47,0x4a,0x9b,0x23,0x56,0x83,0x37,0x07,0xdd,0x05,0x79,0xe2,0x6e,0xf3}, "$FYX ", 18}, + {{0x7d,0xd7,0xf5,0x6d,0x69,0x7c,0xc0,0xf2,0xb5,0x2b,0xd5,0x5c,0x05,0x7f,0x37,0x8f,0x1f,0xe6,0xab,0x4b}, "$TEAK ", 18}, + {{0xB6,0xeD,0x76,0x44,0xC6,0x94,0x16,0xd6,0x7B,0x52,0x2e,0x20,0xbC,0x29,0x4A,0x9a,0x9B,0x40,0x5B,0x31}, "0xBTC ", 8}, + {{0xAf,0x30,0xD2,0xa7,0xE9,0x0d,0x7D,0xC3,0x61,0xc8,0xC4,0x58,0x5e,0x9B,0xB7,0xD2,0xF6,0xf1,0x5b,0xc7}, "1ST ", 18}, + {{0xfd,0xbc,0x1a,0xdc,0x26,0xf0,0xf8,0xf8,0x60,0x6a,0x5d,0x63,0xb7,0xd3,0xa3,0xcd,0x21,0xc2,0x2b,0x23}, "1WO ", 8}, + {{0x9f,0xC0,0x58,0x32,0x20,0xeB,0x44,0xfA,0xeE,0x9e,0x2d,0xc1,0xE6,0x3F,0x39,0x20,0x4D,0xDD,0x90,0x90}, "2DC ", 18}, + {{0xaE,0xc9,0x8A,0x70,0x88,0x10,0x41,0x48,0x78,0xc3,0xBC,0xDF,0x46,0xAa,0xd3,0x1d,0xEd,0x4a,0x45,0x57}, "300 ", 18}, + {{0xBD,0xe8,0xf7,0x82,0x0b,0x55,0x44,0xa4,0x9D,0x34,0xF9,0xdD,0xea,0xCA,0xbE,0xDC,0x7C,0x0B,0x5a,0xdc}, "A18 ", 0}, + {{0xb9,0x8d,0x4c,0x97,0x42,0x5d,0x99,0x08,0xe6,0x6e,0x53,0xa6,0xfd,0xf6,0x73,0xac,0xca,0x0b,0xe9,0x86}, "ABT ", 18}, + {{0x0e,0x8d,0x6b,0x47,0x1e,0x33,0x2f,0x14,0x0e,0x7d,0x9d,0xbb,0x99,0xe5,0xe3,0x82,0x2f,0x72,0x8d,0xa6}, "ABYSS ", 18}, + {{0x13,0xf1,0xb7,0xfd,0xfb,0xe1,0xfc,0x66,0x67,0x6d,0x56,0x48,0x3e,0x21,0xb1,0xec,0xb4,0x0b,0x58,0xe2}, "ACC ", 18}, + {{0xE6,0x9a,0x35,0x3b,0x31,0x52,0xDd,0x7b,0x70,0x6f,0xf7,0xdD,0x40,0xfe,0x1d,0x18,0xb7,0x80,0x2d,0x31}, "ADH ", 18}, + {{0x88,0x10,0xC6,0x34,0x70,0xd3,0x86,0x39,0x95,0x4c,0x6B,0x41,0xAa,0xC5,0x45,0x84,0x8C,0x46,0x48,0x4a}, "ADI ", 18}, + {{0x66,0x0e,0x71,0x48,0x37,0x85,0xf6,0x61,0x33,0x54,0x8b,0x10,0xf6,0x92,0x6d,0xc3,0x32,0xb0,0x6e,0x61}, "ADL ", 18}, + {{0x42,0x28,0x66,0xa8,0xF0,0xb0,0x32,0xc5,0xcf,0x1D,0xfB,0xDE,0xf3,0x1A,0x20,0xF4,0x50,0x95,0x62,0xb0}, "ADST ", 0}, + {{0xD0,0xD6,0xD6,0xC5,0xFe,0x4a,0x67,0x7D,0x34,0x3c,0xC4,0x33,0x53,0x6B,0xB7,0x17,0xbA,0xe1,0x67,0xdD}, "ADT ", 9}, + {{0x44,0x70,0xBB,0x87,0xd7,0x7b,0x96,0x3A,0x01,0x3D,0xB9,0x39,0xBE,0x33,0x2f,0x92,0x7f,0x2b,0x99,0x2e}, "ADX ", 4}, + {{0x5c,0xa9,0xa7,0x1b,0x1d,0x01,0x84,0x9c,0x0a,0x95,0x49,0x0c,0xc0,0x05,0x59,0x71,0x7f,0xcf,0x0d,0x1d}, "AE ", 18}, + {{0x8e,0xB2,0x43,0x19,0x39,0x37,0x16,0x66,0x8D,0x76,0x8d,0xCE,0xC2,0x93,0x56,0xae,0x9C,0xfF,0xe2,0x85}, "AGI ", 8}, + {{0x4C,0xEd,0xA7,0x90,0x6a,0x5E,0xd2,0x17,0x97,0x85,0xCd,0x3A,0x40,0xA6,0x9e,0xe8,0xbc,0x99,0xC4,0x66}, "AION ", 8}, + {{0x27,0xdc,0xe1,0xec,0x4d,0x3f,0x72,0xc3,0xe4,0x57,0xcc,0x50,0x35,0x4f,0x1f,0x97,0x5d,0xde,0xf4,0x88}, "AIR ", 8}, + {{0x10,0x63,0xce,0x52,0x42,0x65,0xd5,0xa3,0xA6,0x24,0xf4,0x91,0x4a,0xcd,0x57,0x3d,0xD8,0x9c,0xe9,0x88}, "AIX ", 18}, + {{0x18,0x1a,0x63,0x74,0x6d,0x3a,0xdc,0xf3,0x56,0xcb,0xc7,0x3a,0xce,0x22,0x83,0x2f,0xfb,0xb1,0xee,0x5a}, "ALCO ", 8}, + {{0xEA,0x61,0x0B,0x11,0x53,0x47,0x77,0x20,0x74,0x8D,0xC1,0x3E,0xD3,0x78,0x00,0x39,0x41,0xd8,0x4f,0xAB}, "ALIS ", 18}, + {{0x63,0x8a,0xc1,0x49,0xea,0x8e,0xf9,0xa1,0x28,0x6c,0x41,0xb9,0x77,0x01,0x7a,0xa7,0x35,0x9e,0x6c,0xfa}, "ALTS ", 18}, + {{0x4d,0xc3,0x64,0x3d,0xbc,0x64,0x2b,0x72,0xc1,0x58,0xe7,0xf3,0xd2,0xff,0x23,0x2d,0xf6,0x1c,0xb6,0xce}, "AMB ", 18}, + {{0x94,0x9b,0xed,0x88,0x6c,0x73,0x9f,0x1a,0x32,0x73,0x62,0x9b,0x33,0x20,0xdb,0x0c,0x50,0x24,0xc7,0x19}, "AMIS ", 9}, + {{0x73,0x7f,0x98,0xac,0x8c,0xa5,0x9f,0x2c,0x68,0xad,0x65,0x8e,0x3c,0x3d,0x8c,0x89,0x63,0xe4,0x0a,0x4c}, "AMN ", 18}, + {{0x38,0xc8,0x7a,0xa8,0x9b,0x2b,0x8c,0xd9,0xb9,0x5b,0x73,0x6e,0x1f,0xa7,0xb6,0x12,0xea,0x97,0x21,0x69}, "AMO ", 18}, + {{0x84,0x93,0x6c,0xF7,0x63,0x0A,0xA3,0xe2,0x7D,0xd9,0xAf,0xF9,0x68,0xb1,0x40,0xd5,0xAE,0xE4,0x9F,0x5a}, "AMTC ", 8}, + {{0x96,0x0b,0x23,0x6A,0x07,0xcf,0x12,0x26,0x63,0xc4,0x30,0x33,0x50,0x60,0x9A,0x66,0xA7,0xB2,0x88,0xC0}, "ANT ", 18}, + {{0x4c,0x0f,0xbe,0x1b,0xb4,0x66,0x12,0x91,0x5e,0x79,0x67,0xd2,0xc3,0x21,0x3c,0xd4,0xd8,0x72,0x57,0xad}, "APIS ", 18}, + {{0x1a,0x7a,0x8b,0xd9,0x10,0x6f,0x2b,0x8d,0x97,0x7e,0x08,0x58,0x2d,0xc7,0xd2,0x4c,0x72,0x3a,0xb0,0xdb}, "APPC ", 18}, + {{0x23,0xae,0x3c,0x5b,0x39,0xb1,0x2f,0x06,0x93,0xe0,0x54,0x35,0xee,0xaa,0x1e,0x51,0xd8,0xc6,0x15,0x30}, "APT ", 18}, + {{0xAc,0x70,0x9F,0xcB,0x44,0xa4,0x3c,0x35,0xF0,0xDA,0x4e,0x31,0x63,0xb1,0x17,0xA1,0x7F,0x37,0x70,0xf5}, "ARC ", 18}, + {{0x12,0x45,0xef,0x80,0xf4,0xd9,0xe0,0x2e,0xd9,0x42,0x53,0x75,0xe8,0xf6,0x49,0xb9,0x22,0x1b,0x31,0xd8}, "ARCT ", 8}, + {{0x75,0xaa,0x7b,0x0d,0x02,0x53,0x2f,0x38,0x33,0xb6,0x6c,0x7f,0x0a,0xd3,0x53,0x76,0xd3,0x73,0xdd,0xf8}, "ARD ", 18}, + {{0xBA,0x5F,0x11,0xb1,0x6B,0x15,0x57,0x92,0xCf,0x3B,0x2E,0x68,0x80,0xE8,0x70,0x68,0x59,0xA8,0xAE,0xB6}, "ARN ", 8}, + {{0xfe,0xc0,0xcF,0x7f,0xE0,0x78,0xa5,0x00,0xab,0xf1,0x5F,0x12,0x84,0x95,0x8F,0x22,0x04,0x9c,0x2C,0x7e}, "ART ", 18}, + {{0x77,0x05,0xFa,0xA3,0x4B,0x16,0xEB,0x6d,0x77,0xDf,0xc7,0x81,0x2b,0xe2,0x36,0x7b,0xa6,0xB0,0x24,0x8e}, "ARX ", 8}, + {{0xb0,0xD9,0x26,0xc1,0xBC,0x3d,0x78,0x06,0x4F,0x3e,0x10,0x75,0xD5,0xbD,0x9A,0x24,0xF3,0x5A,0xe6,0xC5}, "ARXT ", 18}, + {{0x27,0x05,0x4b,0x13,0xb1,0xB7,0x98,0xB3,0x45,0xb5,0x91,0xa4,0xd2,0x2e,0x65,0x62,0xd4,0x7e,0xA7,0x5a}, "AST ", 4}, + {{0x15,0x43,0xd0,0xF8,0x34,0x89,0xe8,0x2A,0x13,0x44,0xDF,0x68,0x27,0xB2,0x3d,0x54,0x1F,0x23,0x5A,0x50}, "Aigatha ", 18}, + {{0x17,0x05,0x2d,0x51,0xE9,0x54,0x59,0x2C,0x10,0x46,0x32,0x0c,0x23,0x71,0xAb,0xaB,0x6C,0x73,0xEf,0x10}, "Athenian ", 18}, + {{0x78,0xB7,0xFA,0xDA,0x55,0xA6,0x4d,0xD8,0x95,0xD8,0xc8,0xc3,0x57,0x79,0xDD,0x8b,0x67,0xfA,0x8a,0x05}, "ATL ", 18}, + {{0x97,0xAE,0xB5,0x06,0x6E,0x1A,0x59,0x0e,0x86,0x8b,0x51,0x14,0x57,0xBE,0xb6,0xFE,0x99,0xd3,0x29,0xF5}, "ATMI ", 18}, + {{0x88,0x78,0x34,0xd3,0xb8,0xd4,0x50,0xb6,0xba,0xb1,0x09,0xc2,0x52,0xdf,0x3d,0xa2,0x86,0xd7,0x3c,0xe4}, "ATT ", 18}, + {{0x63,0x39,0x78,0x4d,0x94,0x78,0xda,0x43,0x10,0x6a,0x42,0x91,0x96,0x77,0x2a,0x02,0x9c,0x2f,0x17,0x7d}, "ATTN ", 18}, + {{0xeD,0x24,0x79,0x80,0x39,0x6B,0x10,0x16,0x9B,0xB1,0xd3,0x6f,0x6e,0x27,0x8e,0xD1,0x67,0x00,0xa6,0x0f}, "AVA ", 4}, + {{0x0d,0x88,0xed,0x6e,0x74,0xbb,0xfd,0x96,0xb8,0x31,0x23,0x16,0x38,0xb6,0x6c,0x05,0x57,0x1e,0x82,0x4f}, "AVT ", 18}, + {{0xcd,0x4b,0x4b,0x0f,0x32,0x84,0xa3,0x3a,0xc4,0x9c,0x67,0x96,0x1e,0xc6,0xe1,0x11,0x70,0x83,0x18,0xcf}, "AX1 ", 5}, + {{0x9a,0xf2,0xc6,0xB1,0xA2,0x8D,0x3d,0x6B,0xC0,0x84,0xbd,0x26,0x7F,0x70,0xe9,0x0d,0x49,0x74,0x1D,0x5B}, "AXP ", 8}, + {{0xf8,0x7f,0x0d,0x91,0x53,0xfe,0xa5,0x49,0xc7,0x28,0xad,0x61,0xcb,0x80,0x15,0x95,0xa6,0x8b,0x73,0xde}, "BANX ", 18}, + {{0x0D,0x87,0x75,0xF6,0x48,0x43,0x06,0x79,0xA7,0x09,0xE9,0x8d,0x2b,0x0C,0xb6,0x25,0x0d,0x28,0x87,0xEF}, "BAT ", 18}, + {{0x4a,0x60,0x58,0x66,0x6c,0xf1,0x05,0x7e,0xaC,0x3C,0xD3,0xA5,0xa6,0x14,0x62,0x05,0x47,0x55,0x9f,0xc9}, "BBK ", 18}, + {{0x73,0x67,0xa6,0x80,0x39,0xd4,0x70,0x4f,0x30,0xbf,0xbf,0x6d,0x94,0x80,0x20,0xc3,0xb0,0x7d,0xfc,0x59}, "BCBC ", 18}, + {{0x1e,0x79,0x7C,0xe9,0x86,0xC3,0xCF,0xF4,0x47,0x2F,0x7D,0x38,0xd5,0xC4,0xab,0xa5,0x5D,0xfE,0xFE,0x40}, "BCDN ", 15}, + {{0xac,0xfa,0x20,0x9f,0xb7,0x3b,0xf3,0xdd,0x5b,0xbf,0xb1,0x10,0x1b,0x9b,0xc9,0x99,0xc4,0x90,0x62,0xa5}, "BCDT ", 18}, + {{0xbc,0x12,0x34,0x55,0x2E,0xBe,0xa3,0x2B,0x51,0x21,0x19,0x03,0x56,0xbB,0xa6,0xD3,0xBb,0x22,0x5b,0xb5}, "BCL ", 18}, + {{0x1c,0x44,0x81,0x75,0x0d,0xaa,0x5F,0xf5,0x21,0xA2,0xa7,0x49,0x0d,0x99,0x81,0xeD,0x46,0x46,0x5D,0xbd}, "BCPT ", 18}, + {{0x10,0x14,0x61,0x3e,0x2b,0x3c,0xbc,0x4d,0x57,0x50,0x54,0xd4,0x98,0x2e,0x58,0x0d,0x9b,0x99,0xd7,0xb1}, "BCV ", 8}, + {{0x19,0x61,0xB3,0x33,0x19,0x69,0xeD,0x52,0x77,0x07,0x51,0xfC,0x71,0x8e,0xf5,0x30,0x83,0x8b,0x6d,0xEE}, "BDG ", 18}, + {{0x4D,0x8f,0xc1,0x45,0x3a,0x0F,0x35,0x9e,0x99,0xc9,0x67,0x59,0x54,0xe6,0x56,0xD8,0x0d,0x99,0x6F,0xbF}, "BEE ", 18}, + {{0x74,0xC1,0xE4,0xb8,0xca,0xE5,0x92,0x69,0xec,0x1D,0x85,0xD3,0xD4,0xF3,0x24,0x39,0x60,0x48,0xF4,0xac}, "BeerCoin ", 0}, + {{0x6a,0xeb,0x95,0xf0,0x6c,0xda,0x84,0xca,0x34,0x5c,0x2d,0xe0,0xf3,0xb7,0xf9,0x69,0x23,0xa4,0x4f,0x4c}, "BERRY ", 14}, + {{0x8a,0xA3,0x3A,0x78,0x99,0xFC,0xC8,0xeA,0x5f,0xBe,0x6A,0x60,0x8A,0x10,0x9c,0x38,0x93,0xA1,0xB8,0xb2}, "BET ", 18}, + {{0x76,0x31,0x86,0xeb,0x8d,0x48,0x56,0xd5,0x36,0xed,0x44,0x78,0x30,0x29,0x71,0x21,0x4f,0xeb,0xc6,0xa9}, "BETR ", 18}, + {{0xb2,0xbf,0xeb,0x70,0xb9,0x03,0xf1,0xba,0xac,0x7f,0x2b,0xa2,0xc6,0x29,0x34,0xc7,0xe5,0xb9,0x74,0xc4}, "BKB ", 8}, + {{0x3c,0xf9,0xe0,0xc3,0x85,0xa5,0xab,0xec,0x9f,0xd2,0xa7,0x17,0x90,0xaa,0x34,0x4c,0x4e,0x8e,0x35,0x70}, "BKRx ", 18}, + {{0x45,0x24,0x5b,0xc5,0x92,0x19,0xee,0xaa,0xf6,0xcd,0x3f,0x38,0x2e,0x07,0x8a,0x46,0x1f,0xf9,0xde,0x7b}, "BKX ", 18}, + {{0x10,0x7c,0x45,0x04,0xcd,0x79,0xC5,0xd2,0x69,0x6E,0xa0,0x03,0x0a,0x8d,0xD4,0xe9,0x26,0x01,0xB8,0x2e}, "BLT ", 18}, + {{0xce,0x59,0xd2,0x9b,0x09,0xaa,0xe5,0x65,0xfe,0xee,0xf8,0xe5,0x2f,0x47,0xc3,0xcd,0x53,0x68,0xc6,0x63}, "BLX bull ", 18}, + {{0xE5,0xa7,0xc1,0x29,0x72,0xf3,0xbb,0xFe,0x70,0xed,0x29,0x52,0x1C,0x89,0x49,0xb8,0xAf,0x6a,0x09,0x70}, "BLX ico ", 18}, + {{0x57,0x32,0x04,0x6A,0x88,0x37,0x04,0x40,0x4F,0x28,0x4C,0xe4,0x1F,0xfA,0xDd,0x5b,0x00,0x7F,0xD6,0x68}, "BLZ ", 18}, + {{0xdf,0x6e,0xf3,0x43,0x35,0x07,0x80,0xbf,0x8c,0x34,0x10,0xbf,0x06,0x2e,0x0c,0x01,0x5b,0x1d,0xd6,0x71}, "BMC ", 8}, + {{0xf0,0x28,0xad,0xee,0x51,0x53,0x3b,0x1b,0x47,0xbe,0xaa,0x89,0x0f,0xeb,0x54,0xa4,0x57,0xf5,0x1e,0x89}, "BMT ", 18}, + {{0x98,0x6E,0xE2,0xB9,0x44,0xc4,0x2D,0x01,0x7F,0x52,0xAf,0x21,0xc4,0xc6,0x9B,0x84,0xDB,0xeA,0x35,0xd8}, "BMX ", 18}, + {{0xb8,0xc7,0x74,0x82,0xe4,0x5f,0x1f,0x44,0xde,0x17,0x45,0xf5,0x2c,0x74,0x42,0x6c,0x63,0x1b,0xdd,0x52}, "BNB ", 18}, + {{0xdD,0x6B,0xf5,0x6C,0xA2,0xad,0xa2,0x4c,0x68,0x3F,0xAC,0x50,0xE3,0x77,0x83,0xe5,0x5B,0x57,0xAF,0x9F}, "BNC ", 12}, + {{0xdA,0x2C,0x42,0x4F,0xc9,0x8c,0x74,0x1c,0x2d,0x4e,0xf2,0xf4,0x28,0x97,0xCE,0xfe,0xd8,0x97,0xCA,0x75}, "BNFT ", 9}, + {{0x1F,0x57,0x3D,0x6F,0xb3,0xF1,0x3d,0x68,0x9F,0xF8,0x44,0xB4,0xcE,0x37,0x79,0x4d,0x79,0xa7,0xFF,0x1C}, "BNT ", 18}, + {{0xd2,0xd6,0x15,0x86,0x83,0xae,0xe4,0xcc,0x83,0x80,0x67,0x72,0x72,0x09,0xa0,0xaa,0xf4,0x35,0x9d,0xe3}, "BNTY ", 18}, + {{0xDF,0x34,0x79,0x11,0x91,0x0b,0x6c,0x9A,0x42,0x86,0xbA,0x8E,0x2E,0xE5,0xea,0x4a,0x39,0xeB,0x21,0x34}, "BOB ", 18}, + {{0xCc,0x34,0x36,0x6E,0x38,0x42,0xcA,0x1B,0xD3,0x6c,0x1f,0x32,0x4d,0x15,0x25,0x79,0x60,0xfC,0xC8,0x01}, "BON ", 18}, + {{0x7f,0x1e,0x2c,0x7d,0x6a,0x69,0xbf,0x34,0x82,0x4d,0x72,0xc5,0x3b,0x45,0x50,0xe8,0x95,0xc0,0xd8,0xc2}, "BOP ", 8}, + {{0xC2,0xC6,0x3F,0x23,0xec,0x5E,0x97,0xef,0xbD,0x75,0x65,0xdF,0x9E,0xc7,0x64,0xFD,0xc7,0xd4,0xe9,0x1d}, "BOU ", 18}, + {{0x32,0x76,0x82,0x77,0x9b,0xAB,0x2B,0xF4,0xd1,0x33,0x7e,0x89,0x74,0xab,0x9d,0xE8,0x27,0x5A,0x7C,0xa8}, "BPT ", 18}, + {{0x5A,0xf2,0xBe,0x19,0x3a,0x6A,0xBC,0xa9,0xc8,0x81,0x70,0x01,0xF4,0x57,0x44,0x77,0x7D,0xb3,0x07,0x56}, "BQX ", 8}, + {{0x9E,0x77,0xD5,0xa1,0x25,0x1b,0x6F,0x7D,0x45,0x67,0x22,0xA6,0xea,0xC6,0xD2,0xd5,0x98,0x0b,0xd8,0x91}, "BRAT ", 8}, + {{0x55,0x8e,0xc3,0x15,0x2e,0x2e,0xb2,0x17,0x49,0x05,0xcd,0x19,0xae,0xa4,0xe3,0x4a,0x23,0xde,0x9a,0xd6}, "BRD ", 18}, + {{0xf2,0x6e,0xf5,0xe0,0x54,0x53,0x84,0xb7,0xdc,0xc0,0xf2,0x97,0xf2,0x67,0x41,0x89,0x58,0x68,0x30,0xdf}, "BSDC ", 18}, + {{0x50,0x9A,0x38,0xb7,0xa1,0xcC,0x0d,0xcd,0x83,0xAa,0x9d,0x06,0x21,0x46,0x63,0xD9,0xeC,0x7c,0x7F,0x4a}, "BST ", 18}, + {{0x08,0x86,0x94,0x9c,0x1b,0x8C,0x41,0x28,0x60,0xc4,0x26,0x4C,0xeb,0x80,0x83,0xd1,0x36,0x5e,0x86,0xCF}, "BTCE ", 8}, + {{0x5a,0xcD,0x19,0xb9,0xc9,0x1e,0x59,0x6b,0x1f,0x06,0x2f,0x18,0xe3,0xD0,0x2d,0xa7,0xeD,0x8D,0x1e,0x50}, "BTCL ", 8}, + {{0x73,0xdd,0x06,0x9c,0x29,0x9a,0x5d,0x69,0x1e,0x98,0x36,0x24,0x3b,0xca,0xec,0x9c,0x8c,0x1d,0x87,0x34}, "BTE ", 8}, + {{0xfa,0xd5,0x72,0xdb,0x56,0x6e,0x52,0x34,0xac,0x9f,0xc3,0xd5,0x70,0xc4,0xed,0xc0,0x05,0x0e,0xaa,0x92}, "BTH ", 18}, + {{0x14,0xC9,0x26,0xF2,0x29,0x00,0x44,0xB6,0x47,0xe1,0xBf,0x20,0x72,0xe6,0x7B,0x49,0x5e,0xff,0x19,0x05}, "BETHER ", 18}, + {{0xdb,0x86,0x46,0xf5,0xb4,0x87,0xb5,0xdd,0x97,0x9f,0xac,0x61,0x83,0x50,0xe8,0x50,0x18,0xf5,0x57,0xd4}, "BTK ", 18}, + {{0x2a,0xcc,0xaB,0x9c,0xb7,0xa4,0x8c,0x3E,0x82,0x28,0x6F,0x0b,0x2f,0x87,0x98,0xD2,0x01,0xF4,0xeC,0x3f}, "Battle ", 18}, + {{0x92,0x68,0x5E,0x93,0x95,0x65,0x37,0xc2,0x5B,0xb7,0x5D,0x5d,0x47,0xfc,0xa4,0x26,0x6d,0xd6,0x28,0xB8}, "Bitlle ", 4}, + {{0xcb,0x97,0xe6,0x5f,0x07,0xda,0x24,0xd4,0x6b,0xcd,0xd0,0x78,0xeb,0xeb,0xd7,0xc6,0xe6,0xe3,0xd7,0x50}, "BTM ", 8}, + {{0x16,0xB0,0xE6,0x2a,0xC1,0x3a,0x2f,0xAe,0xD3,0x6D,0x18,0xbc,0xe2,0x35,0x6d,0x25,0xAb,0x3C,0xfA,0xD3}, "BTQ ", 18}, + {{0x08,0x0a,0xa0,0x7e,0x2c,0x71,0x85,0x15,0x0d,0x7e,0x4d,0xa9,0x88,0x38,0xa8,0xd2,0xfe,0xac,0x3d,0xfc}, "Bit eth ", 0}, + {{0xFA,0x45,0x6C,0xf5,0x52,0x50,0xA8,0x39,0x08,0x8b,0x27,0xEE,0x32,0xA4,0x24,0xd7,0xDA,0xcB,0x54,0xFf}, "BlkTrade ", 18}, + {{0xca,0x3c,0x18,0xa6,0x5b,0x80,0x2e,0xc2,0x67,0xf8,0xf4,0x80,0x25,0x45,0xe7,0xf5,0x3d,0x24,0xc7,0x5e}, "BUC ", 18}, + {{0x26,0xE7,0x53,0x07,0xFc,0x0C,0x02,0x14,0x72,0xfE,0xb8,0xF7,0x27,0x83,0x95,0x31,0xF1,0x12,0xf3,0x17}, "C20 ", 18}, + {{0xd4,0x2d,0xeb,0xE4,0xeD,0xc9,0x2B,0xd5,0xa3,0xFB,0xb4,0x24,0x3e,0x1e,0xcC,0xf6,0xd6,0x3A,0x4A,0x5d}, "C8 ", 18}, + {{0x7d,0x4b,0x8C,0xce,0x05,0x91,0xC9,0x04,0x4a,0x22,0xee,0x54,0x35,0x33,0xb7,0x2E,0x97,0x6E,0x36,0xC3}, "CAG ", 18}, + {{0x1d,0x46,0x24,0x14,0xfe,0x14,0xcf,0x48,0x9c,0x7A,0x21,0xCa,0xC7,0x85,0x09,0xf4,0xbF,0x8C,0xD7,0xc0}, "CAN ", 6}, + {{0x42,0x3e,0x43,0x22,0xcd,0xda,0x29,0x15,0x6b,0x49,0xa1,0x7d,0xfb,0xd2,0xac,0xc4,0xb2,0x80,0x60,0x0d}, "CAR ", 9}, + {{0xa5,0x17,0xa4,0x6b,0xaa,0xd6,0xb0,0x54,0xa7,0x6b,0xd1,0x9c,0x46,0x84,0x4f,0x71,0x7f,0xe6,0x9f,0xea}, "CARB ", 8}, + {{0xB0,0x7e,0xc2,0xc2,0x88,0x34,0xB8,0x89,0xb1,0xCE,0x52,0x7C,0xa0,0xF1,0x93,0x64,0xcD,0x38,0x93,0x5c}, "CARD ", 18}, + {{0xbf,0x18,0xf2,0x46,0xb9,0x30,0x1f,0x23,0x1e,0x95,0x61,0xb3,0x5a,0x38,0x79,0x76,0x9b,0xb4,0x63,0x75}, "CARE ", 18}, + {{0xe8,0x78,0x0B,0x48,0xbd,0xb0,0x5F,0x92,0x86,0x97,0xA5,0xe8,0x15,0x5f,0x67,0x2E,0xD9,0x14,0x62,0xF7}, "CAS ", 18}, + {{0x12,0x34,0x56,0x74,0x61,0xd3,0xf8,0xdb,0x74,0x96,0x58,0x17,0x74,0xbd,0x86,0x9c,0x83,0xd5,0x1c,0x93}, "BitClv ", 18}, + {{0x56,0xba,0x2E,0xe7,0x89,0x04,0x61,0xf4,0x63,0xF7,0xbe,0x02,0xaA,0xC3,0x09,0x9f,0x6d,0x58,0x11,0xA8}, "Blockcat ", 18}, + {{0x68,0xe1,0x4b,0xb5,0xA4,0x5B,0x96,0x81,0x32,0x7E,0x16,0xE5,0x28,0x08,0x4B,0x9d,0x96,0x2C,0x1a,0x39}, "BitClvs2 ", 18}, + {{0xc1,0x66,0x03,0x87,0x05,0xFF,0xBA,0xb3,0x79,0x41,0x85,0xb3,0xa9,0xD9,0x25,0x63,0x2A,0x1D,0xF3,0x7D}, "CC3 ", 18}, + {{0x28,0x57,0x7A,0x6d,0x31,0x55,0x9b,0xd2,0x65,0xCe,0x3A,0xDB,0x62,0xd0,0x45,0x85,0x50,0xF7,0xb8,0xa7}, "CrashCs ", 18}, + {{0xbe,0x11,0xee,0xb1,0x86,0xe6,0x24,0xb8,0xf2,0x6a,0x50,0x45,0x57,0x5a,0x13,0x40,0xe4,0x05,0x45,0x52}, "CCC ico ", 18}, + {{0xd3,0x48,0xe0,0x7a,0x28,0x06,0x50,0x5b,0x85,0x61,0x23,0x04,0x5d,0x27,0xae,0xed,0x90,0x92,0x4b,0x50}, "CCLC ", 8}, + {{0x31,0x5c,0xe5,0x9f,0xaf,0xd3,0xa8,0xd5,0x62,0xb7,0xec,0x1c,0x85,0x42,0x38,0x2d,0x27,0x10,0xb0,0x6c}, "CCS ", 18}, + {{0x8a,0x95,0xca,0x44,0x8A,0x52,0xC0,0xAD,0xf0,0x05,0x4b,0xB3,0x40,0x2d,0xC5,0xe0,0x9C,0xD6,0xB2,0x32}, "CDL ", 18}, + {{0x17,0x7d,0x39,0xAC,0x67,0x6E,0xD1,0xC6,0x7A,0x2b,0x26,0x8A,0xD7,0xF1,0xE5,0x88,0x26,0xE5,0xB0,0xaf}, "CDT ", 18}, + {{0x2c,0xb1,0x01,0xd7,0xda,0x0e,0xba,0xa5,0x7d,0x3f,0x2f,0xef,0x46,0xd7,0xff,0xb7,0xbb,0x64,0x59,0x2b}, "CDX C$X ", 0}, + {{0x6f,0xFF,0x38,0x06,0xBb,0xac,0x52,0xA2,0x0e,0x0d,0x79,0xBC,0x53,0x8d,0x52,0x7f,0x6a,0x22,0xc9,0x6b}, "CDX Net ", 18}, + {{0xb0,0x56,0xc3,0x8f,0x6b,0x7d,0xc4,0x06,0x43,0x67,0x40,0x3e,0x26,0x42,0x4c,0xd2,0xc6,0x06,0x55,0xe1}, "CEEK ", 18}, + {{0xf6,0x60,0xca,0x1e,0x22,0x8e,0x7b,0xe1,0xfa,0x8b,0x4f,0x55,0x83,0x14,0x5e,0x31,0x14,0x7f,0xb5,0x77}, "CET ", 18}, + {{0x12,0xFE,0xF5,0xe5,0x7b,0xF4,0x58,0x73,0xCd,0x9B,0x62,0xE9,0xDB,0xd7,0xBF,0xb9,0x9e,0x32,0xD7,0x3e}, "CFI ", 18}, + {{0x69,0x56,0x98,0x3f,0x8b,0x3c,0xe1,0x73,0xb4,0xab,0x84,0x36,0x1a,0xa0,0xad,0x52,0xf3,0x8d,0x93,0x6f}, "CFTY ", 8}, + {{0xba,0x9d,0x41,0x99,0xfa,0xb4,0xf2,0x6e,0xfe,0x35,0x51,0xd4,0x90,0xe3,0x82,0x14,0x86,0xf1,0x35,0xba}, "CHSB ", 8}, + {{0x06,0x01,0x2c,0x8c,0xf9,0x7b,0xea,0xd5,0xde,0xae,0x23,0x70,0x70,0xf9,0x58,0x7f,0x8e,0x7a,0x26,0x6d}, "CK ", 0}, + {{0xb1,0xc1,0xcb,0x8c,0x7c,0x19,0x92,0xdb,0xa2,0x4e,0x62,0x8b,0xf7,0xd3,0x8e,0x71,0xda,0xd4,0x6a,0xeb}, "CLB ", 18}, + {{0x3d,0xc9,0xa4,0x2f,0xa7,0xaf,0xe5,0x7b,0xe0,0x3c,0x58,0xfd,0x7f,0x44,0x11,0xb1,0xe4,0x66,0xc5,0x08}, "CLL ", 18}, + {{0x41,0x62,0x17,0x8B,0x78,0xD6,0x98,0x54,0x80,0xA3,0x08,0xB2,0x19,0x0E,0xE5,0x51,0x74,0x60,0x40,0x6D}, "CLN ", 18}, + {{0x7f,0xce,0x28,0x56,0x89,0x9a,0x68,0x06,0xee,0xef,0x70,0x80,0x79,0x85,0xfc,0x75,0x54,0xc6,0x63,0x40}, "CLP ", 9}, + {{0x3e,0xdd,0x23,0x5c,0x3e,0x84,0x0c,0x1f,0x29,0x28,0x6b,0x2e,0x39,0x37,0x0a,0x25,0x5c,0x7b,0x6f,0xdb}, "CMBT ", 8}, + {{0x7e,0x66,0x75,0x25,0x52,0x1c,0xF6,0x13,0x52,0xe2,0xE0,0x1b,0x50,0xFa,0xaa,0xE7,0xDf,0x39,0x74,0x9a}, "CMC ", 18}, + {{0xf8,0x5f,0xEe,0xa2,0xFd,0xD8,0x1d,0x51,0x17,0x7F,0x6b,0x8F,0x35,0xF0,0xe6,0x73,0x4C,0xe4,0x5F,0x5F}, "CMT ", 18}, + {{0xEB,0xf2,0xF9,0xE8,0xDe,0x96,0x0f,0x64,0xec,0x0f,0xDC,0xDa,0x6C,0xb2,0x82,0x42,0x31,0x33,0x34,0x7B}, "CNB ", 8}, + {{0xd4,0xc4,0x35,0xf5,0xb0,0x9f,0x85,0x5c,0x33,0x17,0xc8,0x52,0x4c,0xb1,0xf5,0x86,0xe4,0x27,0x95,0xfa}, "CND ", 18}, + {{0xB4,0xb1,0xD2,0xC2,0x17,0xEC,0x07,0x76,0x58,0x4C,0xE0,0x8D,0x3D,0xD9,0x8F,0x90,0xED,0xed,0xA4,0x4b}, "CO2 ", 18}, + {{0x57,0x4b,0x36,0xbc,0xed,0x44,0x33,0x38,0x87,0x5d,0x17,0x1c,0xc3,0x77,0xe6,0x91,0xf7,0xd4,0xf8,0x87}, "CO2Bit ", 18}, + {{0xb2,0xf7,0xeb,0x1f,0x2c,0x37,0x64,0x5b,0xe6,0x1d,0x73,0x95,0x30,0x35,0x36,0x0e,0x76,0x8d,0x81,0xe6}, "COB ", 18}, + {{0x31,0x36,0xeF,0x85,0x15,0x92,0xaC,0xf4,0x9C,0xA4,0xC8,0x25,0x13,0x1E,0x36,0x41,0x70,0xFA,0x32,0xb3}, "COFI ", 18}, + {{0x0c,0x91,0xb0,0x15,0xab,0xa6,0xf7,0xb4,0x73,0x8d,0xcd,0x36,0xe7,0x41,0x01,0x38,0xb2,0x9a,0xdc,0x29}, "COIL ", 8}, + {{0x5e,0x8f,0x85,0x59,0x66,0xd6,0x38,0x13,0x5a,0x96,0x88,0x61,0xe8,0x0d,0xda,0x72,0x22,0x91,0xb0,0x6d}, "COIN ", 18}, + {{0x65,0x29,0x2e,0xea,0xdf,0x14,0x26,0xcd,0x2d,0xf1,0xc4,0x79,0x3a,0x3d,0x75,0x19,0xf2,0x53,0x91,0x3b}, "COSS ", 18}, + {{0x9e,0x96,0x60,0x44,0x45,0xec,0x19,0xff,0xed,0x9a,0x5e,0x8d,0xd7,0xb5,0x0a,0x29,0xc8,0x99,0xa1,0x0c}, "COSS.io ", 18}, + {{0xE2,0xFB,0x65,0x29,0xEF,0x56,0x6a,0x08,0x0e,0x6d,0x23,0xdE,0x0b,0xd3,0x51,0x31,0x10,0x87,0xD5,0x67}, "COV ", 18}, + {{0xb7,0x87,0xd4,0xea,0xc8,0x89,0x97,0x30,0xbb,0x8c,0x57,0xfc,0x3c,0x99,0x8c,0x49,0xc5,0x24,0x4e,0xc0}, "CPEX ", 8}, + {{0xf4,0x47,0x45,0xfb,0xd4,0x1f,0x6a,0x1b,0xa1,0x51,0xdf,0x19,0x0d,0xb0,0x56,0x4c,0x5f,0xcc,0x44,0x10}, "CPY ", 18}, + {{0x7f,0x58,0x5b,0x91,0x30,0xc6,0x4e,0x9e,0x9f,0x47,0x0b,0x61,0x8a,0x7b,0xad,0xd0,0x3d,0x79,0xca,0x7e}, "CR7 ", 18}, + {{0xAe,0xf3,0x8f,0xBF,0xBF,0x93,0x2D,0x1A,0xeF,0x3B,0x80,0x8B,0xc8,0xfB,0xd8,0xCd,0x8E,0x1f,0x8B,0xC5}, "CRB ", 8}, + {{0x67,0x2a,0x1A,0xD4,0xf6,0x67,0xFB,0x18,0xA3,0x33,0xAf,0x13,0x66,0x7a,0xa0,0xAf,0x1F,0x5b,0x5b,0xDD}, "CRED ", 18}, + {{0x4e,0x06,0x03,0xe2,0xa2,0x7a,0x30,0x48,0x0e,0x5e,0x3a,0x4f,0xe5,0x48,0xe2,0x9e,0xf1,0x2f,0x64,0xbe}, "CREDO ", 18}, + {{0x80,0xa7,0xe0,0x48,0xf3,0x7a,0x50,0x50,0x03,0x51,0xc2,0x04,0xcb,0x40,0x77,0x66,0xfa,0x3b,0xae,0x7f}, "CRPT ", 18}, + {{0xF0,0xda,0x11,0x86,0xa4,0x97,0x72,0x26,0xb9,0x13,0x5d,0x06,0x13,0xee,0x72,0xe2,0x29,0xEC,0x3F,0x4d}, "CRT ", 18}, + {{0xE4,0xc9,0x4d,0x45,0xf7,0xAe,0xf7,0x01,0x8a,0x5D,0x66,0xf4,0x4a,0xF7,0x80,0xec,0x60,0x23,0x37,0x8e}, "CrCarbon ", 6}, + {{0x45,0x45,0x75,0x0F,0x39,0xaF,0x6B,0xe4,0xF2,0x37,0xB6,0x86,0x9D,0x4E,0xcc,0xA9,0x28,0xFd,0x5A,0x85}, "CTF ", 18}, + {{0xc8,0x7c,0x5d,0xd8,0x6a,0x3d,0x56,0x7f,0xf2,0x87,0x01,0x88,0x6f,0xb0,0x74,0x5a,0xaa,0x89,0x8d,0xa4}, "CTG ", 18}, + {{0x9e,0x7d,0x29,0xbd,0x49,0x9b,0x6c,0x7d,0xa2,0xa5,0xb2,0xea,0xfc,0xf4,0xa3,0x9d,0x3b,0xd8,0x45,0xd1}, "CTGC ", 18}, + {{0xbf,0x4c,0xfd,0x7d,0x1e,0xde,0xee,0xa5,0xf6,0x60,0x08,0x27,0x41,0x1b,0x41,0xa2,0x1e,0xb0,0x8a,0xbd}, "CTL ", 2}, + {{0xE3,0xFa,0x17,0x7A,0xce,0xcf,0xB8,0x67,0x21,0xCf,0x6f,0x9f,0x42,0x06,0xbd,0x3B,0xd6,0x72,0xD7,0xd5}, "CTT ", 18}, + {{0x66,0x2a,0xBc,0xAd,0x0b,0x7f,0x34,0x5A,0xB7,0xFf,0xB1,0xb1,0xfb,0xb9,0xDf,0x78,0x94,0xf1,0x8e,0x66}, "CTX ", 18}, + {{0xdA,0x6c,0xb5,0x8A,0x0D,0x0C,0x01,0x61,0x0a,0x29,0xc5,0xA6,0x5c,0x30,0x3e,0x13,0xe8,0x85,0x88,0x7C}, "cV ", 18}, + {{0x41,0xe5,0x56,0x00,0x54,0x82,0x4e,0xa6,0xb0,0x73,0x2e,0x65,0x6e,0x3a,0xd6,0x4e,0x20,0xe9,0x4e,0x45}, "CVC ", 8}, + {{0x21,0x34,0x05,0x7c,0x0b,0x46,0x1f,0x89,0x8d,0x37,0x5c,0xea,0xd6,0x52,0xac,0xae,0x62,0xb5,0x95,0x41}, "CXC ", 18}, + {{0xb6,0xEE,0x96,0x68,0x77,0x1a,0x79,0xbe,0x79,0x67,0xee,0x29,0xa6,0x3D,0x41,0x84,0xF8,0x09,0x71,0x43}, "CXO ", 18}, + {{0xda,0xb0,0xC3,0x1B,0xF3,0x4C,0x89,0x7F,0xb0,0xFe,0x90,0xD1,0x2E,0xC9,0x40,0x1c,0xaf,0x5c,0x36,0xEc}, "DAB ", 0}, + {{0xfb,0x2f,0x26,0xf2,0x66,0xfb,0x28,0x05,0xa3,0x87,0x23,0x0f,0x2a,0xa0,0xa3,0x31,0xb4,0xd9,0x6f,0xba}, "DADI ", 18}, + {{0x89,0xd2,0x4A,0x6b,0x4C,0xcB,0x1B,0x6f,0xAA,0x26,0x25,0xfE,0x56,0x2b,0xDD,0x9a,0x23,0x26,0x03,0x59}, "DAI ", 18}, + {{0x07,0xd9,0xe4,0x9e,0xa4,0x02,0x19,0x4b,0xf4,0x8a,0x82,0x76,0xda,0xfb,0x16,0xe4,0xed,0x63,0x33,0x17}, "DALC ", 8}, + {{0x9B,0x70,0x74,0x0e,0x70,0x8a,0x08,0x3C,0x6f,0xF3,0x8D,0xf5,0x22,0x97,0x02,0x0f,0x5D,0xfA,0xa5,0xEE}, "DAN ", 10}, + {{0xBB,0x9b,0xc2,0x44,0xD7,0x98,0x12,0x3f,0xDe,0x78,0x3f,0xCc,0x1C,0x72,0xd3,0xBb,0x8C,0x18,0x94,0x13}, "DAO ", 16}, + {{0x81,0xc9,0x15,0x1d,0xe0,0xc8,0xba,0xfc,0xd3,0x25,0xa5,0x7e,0x3d,0xb5,0xa5,0xdf,0x1c,0xeb,0xf7,0x9c}, "DAT ", 18}, + {{0x1b,0x5f,0x21,0xee,0x98,0xee,0xd4,0x8d,0x29,0x2e,0x8e,0x2d,0x3e,0xd8,0x2b,0x40,0xa9,0x72,0x8a,0x22}, "DATABrkr ", 18}, + {{0x0c,0xf0,0xee,0x63,0x78,0x8a,0x08,0x49,0xfe,0x52,0x97,0xf3,0x40,0x7f,0x70,0x1e,0x12,0x2c,0xc0,0x23}, "DATACoin ", 18}, + {{0x61,0x72,0x5f,0x3d,0xb4,0x00,0x4a,0xfe,0x01,0x47,0x45,0xb2,0x1d,0xab,0x1e,0x16,0x77,0xcc,0x32,0x8b}, "DAXT ", 18}, + {{0xd8,0x2D,0xf0,0xAB,0xD3,0xf5,0x14,0x25,0xEb,0x15,0xef,0x75,0x80,0xfD,0xA5,0x57,0x27,0x87,0x5f,0x14}, "DAV ", 18}, + {{0x38,0x6F,0xaa,0x47,0x03,0xa3,0x4a,0x7F,0xdb,0x19,0xBe,0xc2,0xe1,0x4F,0xd4,0x27,0xC9,0x63,0x84,0x16}, "DCA ", 18}, + {{0x39,0x9A,0x0e,0x6F,0xbE,0xb3,0xd7,0x4c,0x85,0x35,0x74,0x39,0xf4,0xc8,0xAe,0xD9,0x67,0x8a,0x5c,0xbF}, "DCL ", 3}, + {{0x08,0xd3,0x2b,0x0d,0xa6,0x3e,0x2C,0x3b,0xcF,0x80,0x19,0xc9,0xc5,0xd8,0x49,0xd7,0xa9,0xd7,0x91,0xe6}, "DCN ", 0}, + {{0xcC,0x4e,0xF9,0xEE,0xAF,0x65,0x6a,0xC1,0xa2,0xAb,0x88,0x67,0x43,0xE9,0x8e,0x97,0xE0,0x90,0xed,0x38}, "DDF ", 18}, + {{0x15,0x12,0x02,0xC9,0xc1,0x8e,0x49,0x56,0x56,0xf3,0x72,0x28,0x1F,0x49,0x3E,0xB7,0x69,0x89,0x61,0xD5}, "DEB ", 18}, + {{0x35,0x97,0xbf,0xd5,0x33,0xa9,0x9c,0x9a,0xa0,0x83,0x58,0x7b,0x07,0x44,0x34,0xe6,0x1e,0xb0,0xa2,0x58}, "DENT ", 8}, + {{0x7c,0xF2,0x71,0x96,0x6F,0x36,0x34,0x3B,0xf0,0x15,0x0F,0x25,0xE5,0x36,0x4f,0x79,0x61,0xc5,0x82,0x01}, "DEPO ", 0}, + {{0xdd,0x94,0xDe,0x9c,0xFE,0x06,0x35,0x77,0x05,0x1A,0x5e,0xb7,0x46,0x5D,0x08,0x31,0x7d,0x88,0x08,0xB6}, "Devcon2 ", 0}, + {{0xE0,0xB7,0x92,0x7c,0x4a,0xF2,0x37,0x65,0xCb,0x51,0x31,0x4A,0x0E,0x05,0x21,0xA9,0x64,0x5F,0x0E,0x2A}, "DGD ", 9}, + {{0xf6,0xcF,0xe5,0x3d,0x6F,0xEb,0xaE,0xEA,0x05,0x1f,0x40,0x0f,0xf5,0xfc,0x14,0xF0,0xcB,0xBD,0xac,0xA1}, "DGPT ", 18}, + {{0x6a,0xED,0xbF,0x8d,0xFF,0x31,0x43,0x72,0x20,0xdF,0x35,0x19,0x50,0xBa,0x2a,0x33,0x62,0x16,0x8d,0x1b}, "DGS ", 8}, + {{0x55,0xb9,0xa1,0x1c,0x2e,0x83,0x51,0xb4,0xFf,0xc7,0xb1,0x15,0x61,0x14,0x8b,0xfa,0xC9,0x97,0x78,0x55}, "DGX ", 9}, + {{0x2e,0x07,0x1D,0x29,0x66,0xAa,0x7D,0x8d,0xEC,0xB1,0x00,0x58,0x85,0xbA,0x19,0x77,0xD6,0x03,0x8A,0x65}, "DICE ", 16}, + {{0xc7,0x19,0xd0,0x10,0xB6,0x3E,0x5b,0xbF,0x2C,0x05,0x51,0x87,0x2C,0xD5,0x31,0x6E,0xD2,0x6A,0xcD,0x83}, "DecInsur ", 18}, + {{0x13,0xf1,0x1C,0x99,0x05,0xA0,0x8c,0xa7,0x6e,0x3e,0x85,0x3b,0xE6,0x3D,0x4f,0x09,0x44,0x32,0x6C,0x72}, "DIVX ", 18}, + {{0x07,0xe3,0xc7,0x06,0x53,0x54,0x8b,0x04,0xf0,0xa7,0x59,0x70,0xc1,0xf8,0x1b,0x4c,0xbb,0xfb,0x60,0x6f}, "DLT ", 18}, + {{0x2c,0xcb,0xFF,0x3A,0x04,0x2c,0x68,0x71,0x6E,0xd2,0xa2,0xCb,0x0c,0x54,0x4A,0x9f,0x1d,0x19,0x35,0xE1}, "DMT ", 8}, + {{0x0a,0xbd,0xac,0xe7,0x0d,0x37,0x90,0x23,0x5a,0xf4,0x48,0xc8,0x85,0x47,0x60,0x3b,0x94,0x56,0x04,0xea}, "DNT ", 18}, + {{0xE4,0x3E,0x20,0x41,0xdc,0x37,0x86,0xe1,0x66,0x96,0x1e,0xD9,0x48,0x4a,0x55,0x39,0x03,0x3d,0x10,0xfB}, "DNX ", 18}, + {{0x76,0x97,0x4c,0x7b,0x79,0xdc,0x8a,0x6a,0x10,0x9f,0xd7,0x1f,0xd7,0xce,0xb9,0xe4,0x0e,0xff,0x53,0x82}, "DOW ", 18}, + {{0x01,0xb3,0xEc,0x4a,0xAe,0x1B,0x87,0x29,0x52,0x9B,0xEB,0x49,0x65,0xF2,0x7d,0x00,0x87,0x88,0xB0,0xEB}, "DPP ", 18}, + {{0x41,0x9c,0x4d,0xb4,0xb9,0xe2,0x5d,0x6d,0xb2,0xad,0x96,0x91,0xcc,0xb8,0x32,0xc8,0xd9,0xfd,0xa0,0x5e}, "DRGN ", 18}, + {{0x46,0x72,0xba,0xd5,0x27,0x10,0x74,0x71,0xcb,0x50,0x67,0xa8,0x87,0xf4,0x65,0x6d,0x58,0x5a,0x8a,0x31}, "DROPil ", 18}, + {{0x3c,0x75,0x22,0x65,0x55,0xFC,0x49,0x61,0x68,0xd4,0x8B,0x88,0xDF,0x83,0xB9,0x5F,0x16,0x77,0x1F,0x37}, "DROPlex ", 0}, + {{0x62,0x1d,0x78,0xf2,0xef,0x2f,0xd9,0x37,0xbf,0xca,0x69,0x6c,0xab,0xaf,0x9a,0x77,0x9f,0x59,0xb3,0xed}, "DRP ", 2}, + {{0x27,0x99,0xd9,0x0c,0x6d,0x44,0xcb,0x9a,0xa5,0xfb,0xc3,0x77,0x17,0x7f,0x16,0xc3,0x3e,0x05,0x6b,0x82}, "DripCoin ", 0}, + {{0x1e,0x09,0xBD,0x8C,0xad,0xb4,0x41,0x63,0x2e,0x44,0x1D,0xb3,0xe1,0xD7,0x99,0x09,0xEE,0x0A,0x22,0x56}, "DSC ", 1}, + {{0x5a,0xdc,0x96,0x1D,0x6A,0xC3,0xf7,0x06,0x2D,0x2e,0xA4,0x5F,0xEF,0xB8,0xD8,0x16,0x7d,0x44,0xb1,0x90}, "DTH ", 18}, + {{0xd2,0x34,0xbf,0x24,0x10,0xa0,0x00,0x9d,0xf9,0xc3,0xc6,0x3b,0x61,0x0c,0x09,0x73,0x8f,0x18,0xcc,0xd7}, "DTR ", 8}, + {{0xf9,0xF7,0xc2,0x9C,0xFd,0xf1,0x9F,0xCf,0x1f,0x2A,0xA6,0xB8,0x4a,0xA3,0x67,0xBc,0xf1,0xbD,0x16,0x76}, "DTT ", 18}, + {{0x82,0xfd,0xed,0xfB,0x76,0x35,0x44,0x1a,0xA5,0xA9,0x27,0x91,0xD0,0x01,0xfA,0x73,0x88,0xda,0x80,0x25}, "DTx ", 18}, + {{0x76,0x5f,0x0c,0x16,0xd1,0xdd,0xc2,0x79,0x29,0x5c,0x1a,0x7c,0x24,0xb0,0x88,0x3f,0x62,0xd3,0x3f,0x75}, "DTX ", 18}, + {{0x9c,0x6F,0xa4,0x22,0x09,0x16,0x9b,0xCe,0xA0,0x32,0xe4,0x01,0x18,0x8a,0x6f,0xc3,0xe9,0xC9,0xf5,0x9c}, "DUBI ", 18}, + {{0x99,0x4f,0x0d,0xff,0xdb,0xae,0x0b,0xbf,0x09,0xb6,0x52,0xd6,0xf1,0x1a,0x49,0x3f,0xd3,0x3f,0x42,0xb9}, "EAGLE ", 18}, + {{0xaf,0xc3,0x97,0x88,0xc5,0x1f,0x0c,0x1f,0xf7,0xb5,0x53,0x17,0xf3,0xe7,0x02,0x99,0xe5,0x21,0xff,0xf6}, "eBCH ", 8}, + {{0xeb,0x7c,0x20,0x02,0x71,0x72,0xe5,0xd1,0x43,0xfb,0x03,0x0d,0x50,0xf9,0x1c,0xec,0xe2,0xd1,0x48,0x5d}, "eBTC ", 8}, + {{0xa5,0x78,0xac,0xc0,0xcb,0x78,0x75,0x78,0x1b,0x78,0x80,0x90,0x3f,0x45,0x94,0xd1,0x3c,0xfa,0x8b,0x98}, "ECN ", 2}, + {{0x17,0xF9,0x34,0x75,0xd2,0xA9,0x78,0xf5,0x27,0xc3,0xf7,0xc4,0x4a,0xBf,0x44,0xAd,0xfB,0xa6,0x0D,0x5C}, "ECO2 ", 2}, + {{0xfa,0x1d,0xe2,0xee,0x97,0xe4,0xc1,0x0c,0x94,0xc9,0x1c,0xb2,0xb5,0x06,0x2b,0x89,0xfb,0x14,0x0b,0x82}, "EDC ", 6}, + {{0x08,0x71,0x1D,0x3B,0x02,0xC8,0x75,0x8F,0x2F,0xB3,0xab,0x4e,0x80,0x22,0x84,0x18,0xa7,0xF8,0xe3,0x9c}, "EDG ", 0}, + {{0xce,0xd4,0xe9,0x31,0x98,0x73,0x4d,0xda,0xff,0x84,0x92,0xd5,0x25,0xbd,0x25,0x8d,0x49,0xeb,0x38,0x8e}, "EDO ", 18}, + {{0x2a,0x22,0xe5,0xcc,0xa0,0x0a,0x3d,0x63,0x30,0x8f,0xa3,0x9f,0x29,0x20,0x2e,0xb1,0xb3,0x9e,0xef,0x52}, "EDU ", 18}, + {{0xb5,0x3a,0x96,0xbc,0xbd,0xd9,0xcf,0x78,0xdf,0xf2,0x0b,0xab,0x6c,0x2b,0xe7,0xba,0xec,0x8f,0x00,0xf8}, "eGAS ", 8}, + {{0x8e,0x1b,0x44,0x8E,0xC7,0xaD,0xFc,0x7F,0xa3,0x5F,0xC2,0xe8,0x85,0x67,0x8b,0xD3,0x23,0x17,0x6E,0x34}, "EGT ", 18}, + {{0xf9,0xF0,0xFC,0x71,0x67,0xc3,0x11,0xDd,0x2F,0x1e,0x21,0xE9,0x20,0x4F,0x87,0xEB,0xA9,0x01,0x2f,0xB2}, "EHT ", 8}, + {{0xbf,0x21,0x79,0x85,0x9f,0xc6,0xd5,0xbe,0xe9,0xbf,0x91,0x58,0x63,0x2d,0xc5,0x16,0x78,0xa4,0x10,0x0e}, "ELF ", 18}, + {{0xc8,0xC6,0xA3,0x1A,0x4A,0x80,0x6d,0x37,0x10,0xA7,0xB3,0x8b,0x7B,0x29,0x6D,0x2f,0xAB,0xCC,0xDB,0xA8}, "ELIX ", 18}, + {{0x44,0x19,0x7a,0x4c,0x44,0xd6,0xa0,0x59,0x29,0x7c,0xaf,0x6b,0xe4,0xf7,0xe1,0x72,0xbd,0x56,0xca,0xaf}, "ELTCOIN ", 8}, + {{0xb6,0x7b,0x88,0xa2,0x57,0x08,0xa3,0x5a,0xe7,0xc2,0xd7,0x36,0xd3,0x98,0xd2,0x68,0xce,0x4f,0x7f,0x83}, "EMON ", 8}, + {{0x95,0xda,0xaa,0xb9,0x80,0x46,0x84,0x6b,0xf4,0xb2,0x85,0x3e,0x23,0xcb,0xa2,0x36,0xfa,0x39,0x4a,0x31}, "EMONT ", 8}, + {{0x95,0x01,0xBF,0xc4,0x88,0x97,0xDC,0xEE,0xad,0xf7,0x31,0x13,0xEF,0x63,0x5d,0x2f,0xF7,0xee,0x4B,0x97}, "EMT ", 18}, + {{0xB8,0x02,0xb2,0x4E,0x06,0x37,0xc2,0xB8,0x7D,0x2E,0x8b,0x77,0x84,0xC0,0x55,0xBB,0xE9,0x21,0x01,0x1a}, "EMV ", 2}, + {{0x03,0x9f,0x50,0x50,0xde,0x49,0x08,0xf9,0xb5,0xdd,0xf4,0x0a,0x4f,0x3a,0xa3,0xf3,0x29,0x08,0x63,0x87}, "ENC ", 18}, + {{0xf0,0xee,0x6b,0x27,0xb7,0x59,0xc9,0x89,0x3c,0xe4,0xf0,0x94,0xb4,0x9a,0xd2,0x8f,0xd1,0x5a,0x23,0xe4}, "ENG ", 8}, + {{0xF6,0x29,0xcB,0xd9,0x4d,0x37,0x91,0xC9,0x25,0x01,0x52,0xBD,0x8d,0xfB,0xDF,0x38,0x0E,0x2a,0x3B,0x9c}, "ENJ ", 18}, + {{0x5B,0xC7,0xe5,0xf0,0xAb,0x8b,0x2E,0x10,0xD2,0xD0,0xa3,0xF2,0x17,0x39,0xFC,0xe6,0x24,0x59,0xae,0xF3}, "ENTRP ", 18}, + {{0x86,0xfa,0x04,0x98,0x57,0xe0,0x20,0x9a,0xa7,0xd9,0xe6,0x16,0xf7,0xeb,0x3b,0x3b,0x78,0xec,0xfd,0xb0}, "EOS ", 18}, + {{0x7e,0x9e,0x43,0x1a,0x0b,0x8c,0x4d,0x53,0x2c,0x74,0x5b,0x10,0x43,0xc7,0xfa,0x29,0xa4,0x8d,0x4f,0xba}, "eosDAC ", 18}, + {{0x35,0xBA,0xA7,0x20,0x38,0xF1,0x27,0xf9,0xf8,0xC8,0xf9,0xB4,0x91,0x04,0x9f,0x64,0xf3,0x77,0x91,0x4d}, "EPX ", 4}, + {{0xe8,0xa1,0xdf,0x95,0x8b,0xe3,0x79,0x04,0x5e,0x2b,0x46,0xa3,0x1a,0x98,0xb9,0x3a,0x2e,0xcd,0xfd,0xed}, "ESZ ", 18}, + {{0x1b,0x97,0x43,0xf5,0x56,0xd6,0x5e,0x75,0x7c,0x4c,0x65,0x0b,0x45,0x55,0xba,0xf3,0x54,0xcb,0x8b,0xd3}, "ETBS ", 12}, + {{0xdd,0x74,0xa7,0xa3,0x76,0x9f,0xa7,0x25,0x61,0xb3,0xa6,0x9e,0x65,0x96,0x8f,0x49,0x74,0x8c,0x69,0x0c}, "ETCH ", 18}, + {{0x3a,0x26,0x74,0x6D,0xdb,0x79,0xB1,0xB8,0xe4,0x45,0x0e,0x3F,0x4F,0xFE,0x32,0x85,0xA3,0x07,0x38,0x7E}, "ETHB ", 8}, + {{0x69,0x27,0xC6,0x9f,0xb4,0xda,0xf2,0x04,0x3f,0xbB,0x1C,0xb7,0xb8,0x6c,0x56,0x61,0x41,0x6b,0xea,0x29}, "ETR ", 18}, + {{0xab,0xdf,0x14,0x78,0x70,0x23,0x5f,0xcf,0xc3,0x41,0x53,0x82,0x8c,0x76,0x9a,0x70,0xb3,0xfa,0xe0,0x1f}, "EURT ", 6}, + {{0x52,0x36,0x30,0x97,0x6e,0xB6,0x14,0x76,0x21,0xB5,0xc3,0x1c,0x78,0x1e,0xBe,0x2E,0xc2,0xa8,0x06,0xE0}, "eUSD ", 18}, + {{0x92,0x31,0x08,0xa4,0x39,0xC4,0xe8,0xC2,0x31,0x5c,0x4f,0x65,0x21,0xE5,0xcE,0x95,0xB4,0x4e,0x9B,0x4c}, "EVE ", 18}, + {{0xd7,0x80,0xAe,0x2B,0xf0,0x4c,0xD9,0x6E,0x57,0x7D,0x3D,0x01,0x47,0x62,0xf8,0x31,0xd9,0x71,0x29,0xd0}, "EVN ", 18}, + {{0xf3,0xdb,0x5f,0xa2,0xc6,0x6b,0x7a,0xf3,0xeb,0x0c,0x0b,0x78,0x25,0x10,0x81,0x6c,0xbe,0x48,0x13,0xb8}, "EVX ", 4}, + {{0xc9,0x8e,0x06,0x39,0xc6,0xd2,0xec,0x03,0x7a,0x61,0x53,0x41,0xc3,0x69,0x66,0x6b,0x11,0x0e,0x80,0xe5}, "EXMR ", 8}, + {{0xb6,0x77,0x34,0x52,0x1e,0xAb,0xBE,0x9C,0x77,0x37,0x29,0xdB,0x73,0xE1,0x6C,0xC2,0xdf,0xb2,0x0A,0x58}, "E₹ ", 2}, + {{0x19,0x0e,0x56,0x9b,0xE0,0x71,0xF4,0x0c,0x70,0x4e,0x15,0x82,0x5F,0x28,0x54,0x81,0xCB,0x74,0xB6,0xcC}, "FAM ", 12}, + {{0x7f,0x67,0x15,0xc3,0xfc,0x47,0x40,0xa0,0x2f,0x70,0xde,0x85,0xb9,0xfd,0x50,0xac,0x60,0x01,0xfe,0xd9}, "FANX ", 18}, + {{0x00,0x9e,0x86,0x49,0x23,0xb4,0x92,0x63,0xc7,0xF1,0x0D,0x19,0xB7,0xf8,0xAb,0x7a,0x9A,0x5A,0xAd,0x33}, "FKX ", 18}, + {{0xf0,0x4a,0x8a,0xc5,0x53,0xFc,0xeD,0xB5,0xBA,0x99,0xA6,0x47,0x99,0x15,0x58,0x26,0xC1,0x36,0xb0,0xBe}, "FLIXX ", 18}, + {{0x04,0xcC,0x78,0x3b,0x45,0x0b,0x8D,0x11,0xF3,0xC7,0xd0,0x0D,0xD0,0x3f,0xDF,0x7F,0xB5,0x1f,0xE9,0xF2}, "FLMC ", 18}, + {{0x3a,0x1B,0xda,0x28,0xAd,0xB5,0xB0,0xa8,0x12,0xa7,0xCF,0x10,0xA1,0x95,0x0c,0x92,0x0F,0x79,0xBc,0xD3}, "FLP ", 18}, + {{0x9a,0xeF,0xBE,0x0b,0x3C,0x3b,0xa9,0xEa,0xb2,0x62,0xCB,0x98,0x56,0xE8,0x15,0x7A,0xB7,0x64,0x8e,0x09}, "FLR ", 18}, + {{0x95,0x4b,0x5d,0xe0,0x9a,0x55,0xe5,0x97,0x55,0xac,0xbd,0xa2,0x9e,0x1e,0xb7,0x4a,0x45,0xd3,0x01,0x75}, "FLUZ ", 18}, + {{0x70,0xb1,0x47,0xe0,0x1e,0x92,0x85,0xe7,0xce,0x68,0xb9,0xba,0x43,0x7f,0xe3,0xa9,0x19,0x0e,0x75,0x6a}, "FLX ", 18}, + {{0x4d,0xf4,0x7b,0x49,0x69,0xb2,0x91,0x1c,0x96,0x65,0x06,0xe3,0x59,0x2c,0x41,0x38,0x94,0x93,0x95,0x3b}, "FND ", 18}, + {{0x0A,0xBe,0xFb,0x76,0x11,0xCb,0x3A,0x01,0xEA,0x3F,0xaD,0x85,0xf3,0x3C,0x3C,0x93,0x4F,0x8e,0x2c,0xF4}, "FRD ", 18}, + {{0xe6,0xf7,0x4d,0xcf,0xa0,0xe2,0x08,0x83,0x00,0x8d,0x8c,0x16,0xb6,0xd9,0xa3,0x29,0x18,0x9d,0x0c,0x30}, "FTC ", 2}, + {{0x20,0x23,0xDC,0xf7,0xc4,0x38,0xc8,0xC8,0xC0,0xB0,0xF2,0x8d,0xBa,0xE1,0x55,0x20,0xB4,0xf3,0xEe,0x20}, "FTR ", 18}, + {{0x2A,0xEC,0x18,0xc5,0x50,0x0f,0x21,0x35,0x9C,0xE1,0xBE,0xA5,0xDc,0x17,0x77,0x34,0x4d,0xF4,0xC0,0xDc}, "FTT ", 18}, + {{0x65,0xbe,0x44,0xc7,0x47,0x98,0x8f,0xbf,0x60,0x62,0x07,0x69,0x8c,0x94,0x4d,0xf4,0x44,0x2e,0xfe,0x19}, "FUCK ", 4}, + {{0xEA,0x38,0xeA,0xa3,0xC8,0x6c,0x8F,0x9B,0x75,0x15,0x33,0xBa,0x2E,0x56,0x2d,0xeb,0x9a,0xcD,0xED,0x40}, "FUEL ", 18}, + {{0x41,0x9D,0x0d,0x8B,0xdD,0x9a,0xF5,0xe6,0x06,0xAe,0x22,0x32,0xed,0x28,0x5A,0xff,0x19,0x0E,0x71,0x1b}, "FUN ", 8}, + {{0x88,0xFC,0xFB,0xc2,0x2C,0x6d,0x3d,0xBa,0xa2,0x5a,0xF4,0x78,0xC5,0x78,0x97,0x83,0x39,0xBD,0xe7,0x7a}, "FYN ", 18}, + {{0xf6,0x74,0x51,0xdc,0x84,0x21,0xf0,0xe0,0xaf,0xeb,0x52,0xfa,0xa8,0x10,0x10,0x34,0xed,0x08,0x1e,0xd9}, "GAM ", 8}, + {{0xc0,0xEA,0x63,0x06,0xF6,0x36,0x0F,0xE7,0xdC,0xAB,0x65,0xD1,0x6B,0xf1,0xa3,0xAF,0x92,0xC7,0x9A,0xa2}, "GANA ", 18}, + {{0x70,0x88,0x76,0xf4,0x86,0xe4,0x48,0xee,0x89,0xeb,0x33,0x2b,0xfb,0xc8,0xe5,0x93,0x55,0x30,0x58,0xb9}, "GAVEL ", 18}, + {{0x75,0x85,0xF8,0x35,0xae,0x2d,0x52,0x27,0x22,0xd2,0x68,0x43,0x23,0xa0,0xba,0x83,0x40,0x1f,0x32,0xf5}, "GBT ", 18}, + {{0x12,0xfC,0xd6,0x46,0x3E,0x66,0x97,0x4c,0xF7,0xbB,0xC2,0x4F,0xFC,0x4d,0x40,0xd6,0xbE,0x45,0x82,0x83}, "GBX ", 8}, + {{0xdb,0x0F,0x69,0x30,0x6F,0xF8,0xF9,0x49,0xf2,0x58,0xE8,0x3f,0x6b,0x87,0xee,0x5D,0x05,0x2d,0x0b,0x23}, "GCP ", 18}, + {{0x4F,0x4f,0x0D,0xb4,0xde,0x90,0x3B,0x88,0xf2,0xB1,0xa2,0x84,0x79,0x71,0xE2,0x31,0xD5,0x4F,0x8f,0xd3}, "GEE ", 8}, + {{0x24,0x08,0x3b,0xb3,0x00,0x72,0x64,0x3c,0x3b,0xb9,0x0b,0x44,0xb7,0x28,0x58,0x60,0xa7,0x55,0xe6,0x87}, "GELD ", 18}, + {{0x54,0x3F,0xf2,0x27,0xF6,0x4A,0xa1,0x7e,0xA1,0x32,0xBf,0x98,0x86,0xcA,0xb5,0xDB,0x55,0xDC,0xAd,0xdf}, "GEN ", 18}, + {{0x8a,0x85,0x42,0x88,0xa5,0x97,0x60,0x36,0xa7,0x25,0x87,0x91,0x64,0xca,0x3e,0x91,0xd3,0x0c,0x6a,0x1b}, "GET ", 18}, + {{0xFc,0xD8,0x62,0x98,0x56,0x28,0xb2,0x54,0x06,0x1F,0x7A,0x91,0x80,0x35,0xB8,0x03,0x40,0xD0,0x45,0xd3}, "GIF ", 18}, + {{0xaE,0x4f,0x56,0xF0,0x72,0xc3,0x4C,0x0a,0x65,0xB3,0xae,0x3E,0x4D,0xB7,0x97,0xD8,0x31,0x43,0x9D,0x93}, "GIM ", 8}, + {{0xb3,0xBd,0x49,0xE2,0x8f,0x8F,0x83,0x2b,0x8d,0x1E,0x24,0x61,0x06,0x99,0x1e,0x54,0x6c,0x32,0x35,0x02}, "GMT ", 18}, + {{0x68,0x10,0xe7,0x76,0x88,0x0C,0x02,0x93,0x3D,0x47,0xDB,0x1b,0x9f,0xc0,0x59,0x08,0xe5,0x38,0x6b,0x96}, "GNO ", 18}, + {{0xa7,0x44,0x76,0x44,0x31,0x19,0xA9,0x42,0xdE,0x49,0x85,0x90,0xFe,0x1f,0x24,0x54,0xd7,0xD4,0xaC,0x0d}, "GNT ", 18}, + {{0xeA,0xb4,0x31,0x93,0xCF,0x06,0x23,0x07,0x3C,0xa8,0x9D,0xB9,0xB7,0x12,0x79,0x63,0x56,0xFA,0x74,0x14}, "GOLDX ", 18}, + {{0x12,0xb1,0x9d,0x3e,0x2c,0xcc,0x14,0xda,0x04,0xfa,0xe3,0x3e,0x63,0x65,0x2c,0xe4,0x69,0xb3,0xf2,0xfd}, "GRID ", 12}, + {{0x0a,0x9A,0x9c,0xe6,0x00,0xD0,0x8B,0xF9,0xb7,0x6F,0x49,0xFA,0x4e,0x7b,0x38,0xA6,0x7E,0xBE,0xB1,0xE6}, "GROW ", 8}, + {{0xe5,0x30,0x44,0x1f,0x4f,0x73,0xbD,0xB6,0xDC,0x2f,0xA5,0xaF,0x7c,0x3f,0xC5,0xfD,0x55,0x1E,0xc8,0x38}, "GSE ", 4}, + {{0xB7,0x08,0x35,0xD7,0x82,0x2e,0xBB,0x94,0x26,0xB5,0x65,0x43,0xE3,0x91,0x84,0x6C,0x10,0x7b,0xd3,0x2C}, "GTC ", 18}, + {{0x02,0x5a,0xba,0xd9,0xe5,0x18,0x51,0x6f,0xda,0xaf,0xbd,0xcd,0xb9,0x70,0x1b,0x37,0xfb,0x7e,0xf0,0xfa}, "GTKT ", 0}, + {{0xc5,0xbb,0xae,0x50,0x78,0x1b,0xe1,0x66,0x93,0x06,0xb9,0xe0,0x01,0xef,0xf5,0x7a,0x29,0x57,0xb0,0x9d}, "GTO ", 5}, + {{0xf7,0xB0,0x98,0x29,0x8f,0x7C,0x69,0xFc,0x14,0x61,0x0b,0xf7,0x1d,0x5e,0x02,0xc6,0x07,0x92,0x89,0x4C}, "GUP ", 3}, + {{0x10,0x3c,0x3A,0x20,0x9d,0xa5,0x9d,0x3E,0x7C,0x4A,0x89,0x30,0x7e,0x66,0x52,0x1e,0x08,0x1C,0xFD,0xF0}, "GVT ", 18}, + {{0x58,0xca,0x30,0x65,0xc0,0xf2,0x4c,0x7c,0x96,0xae,0xe8,0xd6,0x05,0x6b,0x5b,0x5d,0xec,0xf9,0xc2,0xf8}, "GXC ", 10}, + {{0x22,0xF0,0xAF,0x8D,0x78,0x85,0x1b,0x72,0xEE,0x79,0x9e,0x05,0xF5,0x4A,0x77,0x00,0x15,0x86,0xB1,0x8A}, "GXVC ", 10}, + {{0x8C,0x65,0xe9,0x92,0x29,0x7d,0x5f,0x09,0x2A,0x75,0x6d,0xEf,0x24,0xF4,0x78,0x1a,0x28,0x01,0x98,0xFf}, "GZE ", 18}, + {{0xE6,0x38,0xdc,0x39,0xb6,0xaD,0xBE,0xE8,0x52,0x6b,0x5C,0x22,0x38,0x0b,0x4b,0x45,0xdA,0xf4,0x6d,0x8e}, "GZR ", 6}, + {{0x90,0x02,0xD4,0x48,0x5b,0x75,0x94,0xe3,0xE8,0x50,0xF0,0xa2,0x06,0x71,0x3B,0x30,0x51,0x13,0xf6,0x9e}, "HAT ", 12}, + {{0xC0,0x11,0xA7,0x24,0x00,0xE5,0x8e,0xcD,0x99,0xEe,0x49,0x7C,0xF8,0x9E,0x37,0x75,0xd4,0xbd,0x73,0x2F}, "HAV ", 18}, + {{0xff,0xe8,0x19,0x6b,0xc2,0x59,0xe8,0xde,0xdc,0x54,0x4d,0x93,0x57,0x86,0xaa,0x47,0x09,0xec,0x3e,0x64}, "HDG ", 18}, + {{0xe9,0xff,0x07,0x80,0x9c,0xcf,0xf0,0x5d,0xae,0x74,0x99,0x0e,0x25,0x83,0x1d,0x0b,0xc5,0xcb,0xe5,0x75}, "Hdp ", 18}, + {{0x84,0x54,0x3f,0x86,0x8e,0xc1,0xb1,0xfa,0xc5,0x10,0xd4,0x9d,0x13,0xc0,0x69,0xf6,0x4c,0xd2,0xd5,0xf9}, "Hdp.ф ", 18}, + {{0xba,0x21,0x84,0x52,0x0A,0x1c,0xC4,0x9a,0x61,0x59,0xc5,0x7e,0x61,0xE1,0x84,0x4E,0x08,0x56,0x15,0xB6}, "HGT ", 8}, + {{0xa9,0x24,0x0f,0xBC,0xAC,0x1F,0x0b,0x9A,0x6a,0xDf,0xB0,0x4a,0x53,0xc8,0xE3,0xB0,0xcC,0x1D,0x14,0x44}, "HIG ", 18}, + {{0x14,0xF3,0x7B,0x57,0x42,0x42,0xD3,0x66,0x55,0x8d,0xB6,0x1f,0x33,0x35,0x28,0x9a,0x50,0x35,0xc5,0x06}, "HKG ", 3}, + {{0x88,0xac,0x94,0xd5,0xd1,0x75,0x13,0x03,0x47,0xfc,0x95,0xe1,0x09,0xd7,0x7a,0xc0,0x9d,0xbf,0x5a,0xb7}, "HKY ", 18}, + {{0xcb,0xCC,0x0F,0x03,0x6E,0xD4,0x78,0x8F,0x63,0xFC,0x0f,0xEE,0x32,0x87,0x3d,0x6A,0x74,0x87,0xb9,0x08}, "HMQ ", 8}, + {{0xb4,0x5d,0x7B,0xc4,0xcE,0xBc,0xAB,0x98,0xaD,0x09,0xBA,0xBD,0xF8,0xC8,0x18,0xB2,0x29,0x2B,0x67,0x2c}, "HODL ", 18}, + {{0x5B,0x07,0x51,0x71,0x3b,0x25,0x27,0xd7,0xf0,0x02,0xc0,0xc4,0xe2,0xa3,0x7e,0x12,0x19,0x61,0x0A,0x6B}, "HORSE ", 18}, + {{0x6c,0x6e,0xe5,0xe3,0x1d,0x82,0x8d,0xe2,0x41,0x28,0x2b,0x96,0x06,0xc8,0xe9,0x8e,0xa4,0x85,0x26,0xe2}, "HoloTkn ", 18}, + {{0x9a,0xf8,0x39,0x68,0x7f,0x6c,0x94,0x54,0x2a,0xc5,0xec,0xe2,0xe3,0x17,0xda,0xae,0x35,0x54,0x93,0xa1}, "Hydro ", 18}, + {{0x55,0x4C,0x20,0xB7,0xc4,0x86,0xbe,0xeE,0x43,0x92,0x77,0xb4,0x54,0x0A,0x43,0x45,0x66,0xdC,0x4C,0x02}, "HST ", 18}, + {{0xC0,0xEb,0x85,0x28,0x5d,0x83,0x21,0x7C,0xD7,0xc8,0x91,0x70,0x2b,0xcb,0xC0,0xFC,0x40,0x1E,0x2D,0x9D}, "HVN ", 8}, + {{0xC1,0xE2,0x09,0x7d,0x78,0x8d,0x33,0x70,0x1B,0xA3,0xCc,0x27,0x73,0xBF,0x67,0x15,0x5e,0xc9,0x3F,0xC4}, "IAD ", 18}, + {{0x5a,0x84,0x96,0x9b,0xb6,0x63,0xfb,0x64,0xF6,0xd0,0x15,0xDc,0xF9,0xF6,0x22,0xAe,0xdc,0x79,0x67,0x50}, "ICE ", 18}, + {{0x88,0x86,0x66,0xCA,0x69,0xE0,0xf1,0x78,0xDE,0xD6,0xD7,0x5b,0x57,0x26,0xCe,0xe9,0x9A,0x87,0xD6,0x98}, "ICN ", 18}, + {{0xa3,0x3e,0x72,0x9b,0xf4,0xfd,0xeb,0x86,0x8b,0x53,0x4e,0x1f,0x20,0x52,0x34,0x63,0xd9,0xc4,0x6b,0xee}, "ICO ", 10}, + {{0x01,0x4B,0x50,0x46,0x65,0x90,0x34,0x0D,0x41,0x30,0x7C,0xc5,0x4D,0xCe,0xe9,0x90,0xc8,0xD5,0x8a,0xa8}, "ICOS ", 6}, + {{0xb5,0xa5,0xf2,0x26,0x94,0x35,0x2c,0x15,0xb0,0x03,0x23,0x84,0x4a,0xd5,0x45,0xab,0xb2,0xb1,0x10,0x28}, "ICX ", 18}, + {{0x81,0x4c,0xaf,0xd4,0x78,0x2d,0x2e,0x72,0x81,0x70,0xfd,0xa6,0x82,0x57,0x98,0x3f,0x03,0x32,0x1c,0x58}, "IDEA ", 0}, + {{0x76,0x54,0x91,0x5a,0x1b,0x82,0xd6,0xd2,0xd0,0xaf,0xc3,0x7c,0x52,0xaf,0x55,0x6e,0xa8,0x98,0x3c,0x7e}, "IFT ", 18}, + {{0x16,0x66,0x2f,0x73,0xdf,0x3e,0x79,0xe5,0x4c,0x6c,0x59,0x38,0xb4,0x31,0x3f,0x92,0xc5,0x24,0xc1,0x20}, "IIC ", 18}, + {{0x88,0xAE,0x96,0x84,0x5e,0x15,0x75,0x58,0xef,0x59,0xe9,0xFf,0x90,0xE7,0x66,0xE2,0x2E,0x48,0x03,0x90}, "IKB ", 0}, + {{0xe3,0x83,0x1c,0x5A,0x98,0x2B,0x27,0x9A,0x19,0x84,0x56,0xD5,0x77,0xcf,0xb9,0x04,0x24,0xcb,0x63,0x40}, "IMC ", 6}, + {{0x22,0xE5,0xF6,0x2D,0x0F,0xA1,0x99,0x74,0x74,0x9f,0xaa,0x19,0x4e,0x3d,0x3e,0xF6,0xd8,0x9c,0x08,0xd7}, "IMT ", 0}, + {{0xf8,0xe3,0x86,0xED,0xa8,0x57,0x48,0x4f,0x5a,0x12,0xe4,0xB5,0xDA,0xa9,0x98,0x4E,0x06,0xE7,0x37,0x05}, "IND ", 18}, + {{0x48,0xe5,0x41,0x3b,0x73,0xad,0xd2,0x43,0x4e,0x47,0x50,0x4E,0x2a,0x22,0xd1,0x49,0x40,0xdB,0xFe,0x78}, "INRM ", 3}, + {{0x5b,0x2e,0x4a,0x70,0x0d,0xfb,0xc5,0x60,0x06,0x1e,0x95,0x7e,0xde,0xc8,0xf6,0xee,0xeb,0x74,0xa3,0x20}, "INS ", 10}, + {{0xc7,0x2f,0xe8,0xe3,0xdd,0x5b,0xef,0x0f,0x9f,0x31,0xf2,0x59,0x39,0x9f,0x30,0x12,0x72,0xef,0x2a,0x2d}, "INSTAR ", 18}, + {{0xa8,0x00,0x6c,0x4c,0xa5,0x6f,0x24,0xd6,0x83,0x67,0x27,0xd1,0x06,0x34,0x93,0x20,0xdb,0x7f,0xef,0x82}, "INXT ", 8}, + {{0xFA,0x1a,0x85,0x6C,0xfa,0x34,0x09,0xCF,0xa1,0x45,0xFa,0x4e,0x20,0xEb,0x27,0x0d,0xF3,0xEB,0x21,0xab}, "IOST ", 18}, + {{0xc3,0x4b,0x21,0xf6,0xf8,0xe5,0x1c,0xc9,0x65,0xc2,0x39,0x3b,0x3c,0xcf,0xa3,0xb8,0x2b,0xeb,0x24,0x03}, "IoT ", 6}, + {{0x6f,0xb3,0xe0,0xa2,0x17,0x40,0x7e,0xff,0xf7,0xca,0x06,0x2d,0x46,0xc2,0x6e,0x5d,0x60,0xa1,0x4d,0x69}, "IOTX ", 18}, + {{0x64,0xCd,0xF8,0x19,0xd3,0xE7,0x5A,0xc8,0xeC,0x21,0x7B,0x34,0x96,0xd7,0xcE,0x16,0x7B,0xe4,0x2e,0x80}, "IPL ", 18}, + {{0x00,0x1f,0x0a,0xa5,0xda,0x15,0x58,0x5e,0x5b,0x23,0x05,0xdb,0xab,0x2b,0xac,0x42,0x5e,0xa7,0x10,0x07}, "IPSX ", 18}, + {{0x5e,0x6b,0x6d,0x9a,0xba,0xd9,0x09,0x3f,0xdc,0x86,0x1e,0xa1,0x60,0x0e,0xba,0x1b,0x35,0x5c,0xd9,0x40}, "ITC ", 18}, + {{0x0a,0xeF,0x06,0xDc,0xCC,0xC5,0x31,0xe5,0x81,0xf0,0x44,0x00,0x59,0xE6,0xFf,0xCC,0x20,0x60,0x39,0xEE}, "ITT ", 8}, + {{0xfc,0xa4,0x79,0x62,0xd4,0x5a,0xdf,0xdf,0xd1,0xab,0x2d,0x97,0x23,0x15,0xdb,0x4c,0xe7,0xcc,0xf0,0x94}, "IXT ", 8}, + {{0x0d,0x26,0x2e,0x5d,0xc4,0xa0,0x6a,0x0f,0x1c,0x90,0xce,0x79,0xc7,0xa6,0x0c,0x09,0xdf,0xc8,0x84,0xe4}, "J8T ", 8}, + {{0x88,0x4e,0x39,0x02,0xC4,0xd5,0xcF,0xA8,0x6d,0xe4,0xaC,0xE7,0xA9,0x6A,0xA9,0x1E,0xbC,0x25,0xC0,0xFf}, "JBX ", 0}, + {{0x87,0x27,0xc1,0x12,0xc7,0x12,0xc4,0xa0,0x33,0x71,0xac,0x87,0xa7,0x4d,0xd6,0xab,0x10,0x4a,0xf7,0x68}, "JET ", 18}, + {{0x77,0x34,0x50,0x33,0x5e,0xD4,0xec,0x3D,0xB4,0x5a,0xF7,0x4f,0x34,0xF2,0xc8,0x53,0x48,0x64,0x5D,0x39}, "JetCoins ", 18}, + {{0xa5,0xFd,0x1A,0x79,0x1C,0x4d,0xfc,0xaa,0xcC,0x96,0x3D,0x4F,0x73,0xc6,0xAe,0x58,0x24,0x14,0x9e,0xA7}, "JNT ", 18}, + {{0xDD,0xe1,0x2a,0x12,0xA6,0xf6,0x71,0x56,0xe0,0xDA,0x67,0x2b,0xe0,0x5c,0x37,0x4e,0x1B,0x0a,0x3e,0x57}, "JOY ", 6}, + {{0x0D,0x6D,0xD9,0xf6,0x8d,0x24,0xEC,0x1d,0x5f,0xE2,0x17,0x4f,0x3E,0xC8,0xDA,0xB5,0x2B,0x52,0xBa,0xF5}, "KC ", 18}, + {{0x72,0xD3,0x2a,0xc1,0xc5,0xE6,0x6B,0xfC,0x5b,0x08,0x80,0x62,0x71,0xf8,0xeE,0xF9,0x15,0x54,0x51,0x64}, "KEE ", 0}, + {{0x4c,0xd9,0x88,0xaf,0xba,0xd3,0x72,0x89,0xba,0xaf,0x53,0xc1,0x3e,0x98,0xe2,0xbd,0x46,0xaa,0xea,0x8c}, "BihuKey ", 18}, + {{0x4C,0xC1,0x93,0x56,0xf2,0xD3,0x73,0x38,0xb9,0x80,0x2a,0xa8,0xE8,0xfc,0x58,0xB0,0x37,0x32,0x96,0xE7}, "SelfKey ", 18}, + {{0x27,0x69,0x5E,0x09,0x14,0x9A,0xdC,0x73,0x8A,0x97,0x8e,0x9A,0x67,0x8F,0x99,0xE4,0xc3,0x9e,0x9e,0xb9}, "KICK ", 8}, + {{0x81,0x8F,0xc6,0xC2,0xEc,0x59,0x86,0xbc,0x6E,0x2C,0xBf,0x00,0x93,0x9d,0x90,0x55,0x6a,0xB1,0x2c,0xe5}, "KIN ", 18}, + {{0xdd,0x97,0x4D,0x5C,0x2e,0x29,0x28,0xde,0xA5,0xF7,0x1b,0x98,0x25,0xb8,0xb6,0x46,0x68,0x6B,0xD2,0x00}, "KNC ", 18}, + {{0xb5,0xc3,0x3f,0x96,0x5c,0x88,0x99,0xd2,0x55,0xc3,0x4c,0xdd,0x2a,0x3e,0xfa,0x8a,0xbc,0xbb,0x3d,0xea}, "KPR ", 18}, + {{0x46,0x4e,0xbe,0x77,0xc2,0x93,0xe4,0x73,0xb4,0x8c,0xfe,0x96,0xdd,0xcf,0x88,0xfc,0xf7,0xbf,0xda,0xc0}, "KRL ", 18}, + {{0x95,0x41,0xFD,0x8B,0x9b,0x5F,0xA9,0x73,0x81,0x78,0x37,0x83,0xCe,0xBF,0x2F,0x5f,0xA7,0x93,0xC2,0x62}, "KZN ", 8}, + {{0xE5,0x03,0x65,0xf5,0xD6,0x79,0xCB,0x98,0xa1,0xdd,0x62,0xD6,0xF6,0xe5,0x8e,0x59,0x32,0x1B,0xcd,0xDf}, "LA ", 18}, + {{0xfD,0x10,0x7B,0x47,0x3A,0xB9,0x0e,0x8F,0xbd,0x89,0x87,0x21,0x44,0xa3,0xDC,0x92,0xC4,0x0F,0xa8,0xC9}, "LALA ", 18}, + {{0x51,0x02,0x79,0x1c,0xa0,0x2f,0xc3,0x59,0x53,0x98,0x40,0x0b,0xfe,0x0e,0x33,0xd7,0xb6,0xc8,0x22,0x67}, "LDC ", 18}, + {{0x5b,0x26,0xC5,0xD0,0x77,0x2E,0x5b,0xba,0xC8,0xb3,0x18,0x2A,0xE9,0xa1,0x3f,0x9B,0xB2,0xD0,0x37,0x65}, "LEDU ", 8}, + {{0xB5,0xAE,0x84,0x8E,0xdB,0x29,0x6C,0x21,0x25,0x9b,0x74,0x67,0x33,0x14,0x67,0xd2,0x64,0x7e,0xEc,0xDf}, "LEMO ", 18}, + {{0x80,0xfB,0x78,0x4B,0x7e,0xD6,0x67,0x30,0xe8,0xb1,0xDB,0xd9,0x82,0x0a,0xFD,0x29,0x93,0x1a,0xab,0x03}, "LEND ", 18}, + {{0xc7,0x98,0xcd,0x1c,0x49,0xdb,0x0e,0x29,0x73,0x12,0xe4,0xc6,0x82,0x75,0x26,0x68,0xce,0x1d,0xb2,0xad}, "LFR ", 5}, + {{0x12,0x3a,0xb1,0x95,0xdd,0x38,0xb1,0xb4,0x05,0x10,0xd4,0x67,0xa6,0xa3,0x59,0xb2,0x01,0xaf,0x05,0x6f}, "LGO ", 8}, + {{0x2e,0xb8,0x6e,0x8f,0xc5,0x20,0xe0,0xf6,0xbb,0x5d,0x9a,0xf0,0x8f,0x92,0x4f,0xe7,0x05,0x58,0xab,0x89}, "LGR ", 8}, + {{0xEB,0x99,0x51,0x02,0x16,0x98,0xB4,0x2e,0x43,0x99,0xf9,0xcB,0xb6,0x26,0x7A,0xa3,0x5F,0x82,0xD5,0x9D}, "LIF ", 18}, + {{0xff,0x18,0xdb,0xc4,0x87,0xb4,0xc2,0xe3,0x22,0x2d,0x11,0x59,0x52,0xba,0xbf,0xda,0x8b,0xa5,0x2f,0x5f}, "LIFE ", 18}, + {{0x51,0x49,0x10,0x77,0x1a,0xf9,0xca,0x65,0x6a,0xf8,0x40,0xdf,0xf8,0x3e,0x82,0x64,0xec,0xf9,0x86,0xca}, "ChainLnk ", 18}, + {{0xe2,0xe6,0xd4,0xbe,0x08,0x6c,0x69,0x38,0xb5,0x3b,0x22,0x14,0x48,0x55,0xee,0xf6,0x74,0x28,0x16,0x39}, "LINK ptf ", 18}, + {{0x24,0xA7,0x7c,0x1F,0x17,0xC5,0x47,0x10,0x5E,0x14,0x81,0x3e,0x51,0x7b,0xe0,0x6b,0x00,0x40,0xaa,0x76}, "LIVE ", 18}, + {{0x63,0xe6,0x34,0x33,0x0A,0x20,0x15,0x0D,0xbB,0x61,0xB1,0x56,0x48,0xbC,0x73,0x85,0x5d,0x6C,0xCF,0x07}, "LNC ", 18}, + {{0x6b,0xeb,0x41,0x8f,0xc6,0xe1,0x95,0x82,0x04,0xac,0x8b,0xad,0xdc,0xf1,0x09,0xb8,0xe9,0x69,0x49,0x66}, "LinkCoin ", 18}, + {{0x09,0x47,0xb0,0xe6,0xD8,0x21,0x37,0x88,0x05,0xc9,0x59,0x82,0x91,0x38,0x5C,0xE7,0xc7,0x91,0xA6,0xB2}, "LND ", 18}, + {{0x5e,0x33,0x46,0x44,0x40,0x10,0x13,0x53,0x22,0x26,0x8a,0x46,0x30,0xd2,0xed,0x5f,0x8d,0x09,0x44,0x6c}, "LOC ", 18}, + {{0x9c,0x23,0xd6,0x7a,0xea,0x7b,0x95,0xd8,0x09,0x42,0xe3,0x83,0x6b,0xcd,0xf7,0xe7,0x08,0xa7,0x47,0xc2}, "LOCI ", 18}, + {{0xC6,0x45,0x00,0xDD,0x7B,0x0f,0x17,0x94,0x80,0x7e,0x67,0x80,0x2F,0x8A,0xbb,0xf5,0xF8,0xFf,0xb0,0x54}, "LOCUS ", 18}, + {{0x21,0xae,0x23,0xb8,0x82,0xa3,0x40,0xa2,0x22,0x82,0x16,0x20,0x86,0xbc,0x98,0xd3,0xe2,0xb7,0x30,0x18}, "LOK ", 18}, + {{0xa4,0xe8,0xc3,0xec,0x45,0x61,0x07,0xea,0x67,0xd3,0x07,0x5b,0xf9,0xe3,0xdf,0x3a,0x75,0x82,0x3d,0xb0}, "LOOM ", 18}, + {{0xEF,0x68,0xe7,0xC6,0x94,0xF4,0x0c,0x82,0x02,0x82,0x1e,0xDF,0x52,0x5d,0xE3,0x78,0x24,0x58,0x63,0x9f}, "LRC ", 18}, + {{0x5d,0xbe,0x29,0x6f,0x97,0xb2,0x3c,0x4a,0x6a,0xa6,0x18,0x3d,0x73,0xe5,0x74,0xd0,0x2b,0xa5,0xc7,0x19}, "LUC ", 18}, + {{0xFB,0x12,0xe3,0xCc,0xA9,0x83,0xB9,0xf5,0x9D,0x90,0x91,0x2F,0xd1,0x7F,0x8D,0x74,0x5A,0x8B,0x29,0x53}, "LUCK ", 0}, + {{0xa8,0x9b,0x59,0x34,0x86,0x34,0x47,0xf6,0xe4,0xfc,0x53,0xb3,0x15,0xa9,0x3e,0x87,0x3b,0xda,0x69,0xa3}, "LUM ", 18}, + {{0xfa,0x05,0xA7,0x3F,0xfE,0x78,0xef,0x8f,0x1a,0x73,0x94,0x73,0xe4,0x62,0xc5,0x4b,0xae,0x65,0x67,0xD9}, "LUN ", 18}, + {{0x3f,0x4b,0x72,0x66,0x68,0xda,0x46,0xf5,0xe0,0xe7,0x5a,0xa5,0xd4,0x78,0xac,0xec,0x9f,0x38,0x21,0x0f}, "M-ETH ", 18}, + {{0x5b,0x09,0xa0,0x37,0x1c,0x1d,0xa4,0x4a,0x8e,0x24,0xd3,0x6b,0xf5,0xde,0xb1,0x14,0x1a,0x84,0xd8,0x75}, "MAD ", 18}, + {{0xe2,0x5b,0xCe,0xc5,0xD3,0x80,0x1c,0xE3,0xa7,0x94,0x07,0x9B,0xF9,0x4a,0xdF,0x1B,0x8c,0xCD,0x80,0x2D}, "MAN ", 18}, + {{0x0F,0x5D,0x2f,0xB2,0x9f,0xb7,0xd3,0xCF,0xeE,0x44,0x4a,0x20,0x02,0x98,0xf4,0x68,0x90,0x8c,0xC9,0x42}, "MANA ", 18}, + {{0xfd,0xcc,0x07,0xAb,0x60,0x66,0x0d,0xe5,0x33,0xb5,0xAd,0x26,0xe1,0x45,0x7b,0x56,0x5a,0x9D,0x59,0xBd}, "MART ", 18}, + {{0x38,0x64,0x67,0xf1,0xf3,0xdd,0xbe,0x83,0x24,0x48,0x65,0x04,0x18,0x31,0x1a,0x47,0x9e,0xec,0xfc,0x57}, "MBRS ", 0}, + {{0x93,0xE6,0x82,0x10,0x7d,0x1E,0x9d,0xef,0xB0,0xb5,0xee,0x70,0x1C,0x71,0x70,0x7a,0x4B,0x2E,0x46,0xBc}, "MCAP ", 8}, + {{0x13,0x8A,0x87,0x52,0x09,0x3F,0x4f,0x9a,0x79,0xAa,0xeD,0xF4,0x8d,0x4B,0x92,0x48,0xfa,0xb9,0x3c,0x9C}, "MCI ", 18}, + {{0xB6,0x3B,0x60,0x6A,0xc8,0x10,0xa5,0x2c,0xCa,0x15,0xe4,0x4b,0xB6,0x30,0xfd,0x42,0xD8,0xd1,0xd8,0x3d}, "MCO ", 8}, + {{0x51,0xDB,0x5A,0xd3,0x5C,0x67,0x1a,0x87,0x20,0x7d,0x88,0xfC,0x11,0xd5,0x93,0xAC,0x0C,0x84,0x15,0xbd}, "MDA ", 18}, + {{0x01,0xf2,0xac,0xf2,0x91,0x48,0x60,0x33,0x1c,0x1c,0xb1,0xa9,0xac,0xec,0xda,0x74,0x75,0xe0,0x6a,0xf8}, "MESH ", 18}, + {{0x5b,0x8d,0x43,0xff,0xde,0x4a,0x29,0x82,0xb9,0xa5,0x38,0x7c,0xdf,0x21,0xd5,0x4e,0xad,0x64,0xac,0x8d}, "MEST ", 18}, + {{0x67,0x10,0xc6,0x34,0x32,0xa2,0xde,0x02,0x95,0x4f,0xc0,0xf8,0x51,0xdb,0x07,0x14,0x6a,0x6c,0x03,0x12}, "MFG ", 18}, + {{0x40,0x39,0x50,0x44,0xac,0x3c,0x0c,0x57,0x05,0x19,0x06,0xda,0x93,0x8b,0x54,0xbd,0x65,0x57,0xf2,0x12}, "MGO ", 8}, + {{0xe2,0x3c,0xd1,0x60,0x76,0x1f,0x63,0xFC,0x3a,0x1c,0xF7,0x8A,0xa0,0x34,0xb6,0xcd,0xF9,0x7d,0x3E,0x0C}, "Mainstrt ", 18}, + {{0xad,0x8d,0xd4,0xc7,0x25,0xde,0x1d,0x31,0xb9,0xe8,0xf8,0xd1,0x46,0x08,0x9e,0x9d,0xc6,0x88,0x20,0x93}, "Mychat ", 6}, + {{0x9f,0x8F,0x72,0xaA,0x93,0x04,0xc8,0xB5,0x93,0xd5,0x55,0xF1,0x2e,0xF6,0x58,0x9c,0xC3,0xA5,0x79,0xA2}, "MKR ", 18}, + {{0x79,0x39,0x88,0x2b,0x54,0xfc,0xf0,0xbc,0xae,0x6b,0x53,0xde,0xc3,0x9a,0xd6,0xe8,0x06,0x17,0x64,0x42}, "MKT ", 8}, + {{0xBE,0xB9,0xeF,0x51,0x4a,0x37,0x9B,0x99,0x7e,0x07,0x98,0xFD,0xcC,0x90,0x1E,0xe4,0x74,0xB6,0xD9,0xA1}, "MLN ", 18}, + {{0x1a,0x95,0xB2,0x71,0xB0,0x53,0x5D,0x15,0xfa,0x49,0x93,0x2D,0xab,0xa3,0x1B,0xA6,0x12,0xb5,0x29,0x46}, "MNE ", 8}, + {{0xA9,0x87,0x7b,0x1e,0x05,0xD0,0x35,0x89,0x91,0x31,0xDB,0xd1,0xe4,0x03,0x82,0x51,0x66,0xD0,0x9f,0x92}, "MNT ", 18}, + {{0x83,0xce,0xe9,0xe0,0x86,0xa7,0x7e,0x49,0x2e,0xe0,0xbb,0x93,0xc2,0xb0,0x43,0x7a,0xd6,0xfd,0xec,0xcc}, "MNTP ", 18}, + {{0x95,0x7c,0x30,0xaB,0x04,0x26,0xe0,0xC9,0x3C,0xD8,0x24,0x1E,0x2c,0x60,0x39,0x2d,0x08,0xc6,0xaC,0x8e}, "MOD ", 0}, + {{0x82,0x12,0x5A,0xFe,0x01,0x81,0x9D,0xff,0x15,0x35,0xD0,0xD6,0x27,0x6d,0x57,0x04,0x52,0x91,0xB6,0xc0}, "MRL ", 18}, + {{0x21,0xf0,0xF0,0xfD,0x31,0x41,0xEe,0x9E,0x11,0xB3,0xd7,0xf1,0x3a,0x10,0x28,0xCD,0x51,0x5f,0x45,0x9c}, "MRP ", 18}, + {{0xAB,0x6C,0xF8,0x7a,0x50,0xF1,0x7d,0x7F,0x5E,0x1F,0xEa,0xf8,0x1B,0x6f,0xE9,0xFf,0xBe,0x8E,0xBF,0x84}, "MRV ", 18}, + {{0x68,0xAA,0x3F,0x23,0x2d,0xA9,0xbd,0xC2,0x34,0x34,0x65,0x54,0x57,0x94,0xef,0x3e,0xEa,0x52,0x09,0xBD}, "MSP ", 18}, + {{0x90,0x5E,0x33,0x7c,0x6c,0x86,0x45,0x26,0x3D,0x35,0x21,0x20,0x5A,0xa3,0x7b,0xf4,0xd0,0x34,0xe7,0x45}, "MTC ", 18}, + {{0xaF,0x4D,0xcE,0x16,0xDa,0x28,0x77,0xf8,0xc9,0xe0,0x05,0x44,0xc9,0x3B,0x62,0xAc,0x40,0x63,0x1F,0x16}, "MTH ", 5}, + {{0xF4,0x33,0x08,0x93,0x66,0x89,0x9D,0x83,0xa9,0xf2,0x6A,0x77,0x3D,0x59,0xec,0x7e,0xCF,0x30,0x35,0x5e}, "MTL ", 8}, + {{0x41,0xdb,0xec,0xc1,0xcd,0xc5,0x51,0x7c,0x6f,0x76,0xf6,0xa6,0xe8,0x36,0xad,0xbe,0xe2,0x75,0x4d,0xe3}, "MTN ", 18}, + {{0x7F,0xC4,0x08,0x01,0x11,0x65,0x76,0x0e,0xE3,0x1b,0xE2,0xBF,0x20,0xdA,0xf4,0x50,0x35,0x66,0x92,0xAf}, "MTR ", 8}, + {{0x1e,0x49,0xfF,0x77,0xc3,0x55,0xA3,0xe3,0x8D,0x66,0x51,0xce,0x84,0x04,0xAF,0x0E,0x48,0xc5,0x39,0x5f}, "MTRc ", 18}, + {{0x0A,0xF4,0x4e,0x27,0x84,0x63,0x72,0x18,0xdD,0x1D,0x32,0xA3,0x22,0xD4,0x4e,0x60,0x3A,0x8f,0x0c,0x6A}, "MTX ", 18}, + {{0x51,0x56,0x69,0xd3,0x08,0xf8,0x87,0xfd,0x83,0xa4,0x71,0xc7,0x76,0x4f,0x5d,0x08,0x48,0x86,0xd3,0x4d}, "MUXE ", 18}, + {{0x8a,0x77,0xe4,0x09,0x36,0xbb,0xc2,0x7e,0x80,0xe9,0xa3,0xf5,0x26,0x36,0x8c,0x96,0x78,0x69,0xc8,0x6d}, "MVP ", 18}, + {{0x64,0x25,0xc6,0xbe,0x90,0x2d,0x69,0x2a,0xe2,0xdb,0x75,0x2b,0x3c,0x26,0x8a,0xfa,0xdb,0x09,0x9d,0x3b}, "MWAT ", 18}, + {{0xf7,0xe9,0x83,0x78,0x16,0x09,0x01,0x23,0x07,0xf2,0x51,0x4f,0x63,0xD5,0x26,0xD8,0x3D,0x24,0xF4,0x66}, "MYD ", 16}, + {{0xa6,0x45,0x26,0x4C,0x56,0x03,0xE9,0x6c,0x3b,0x0B,0x07,0x8c,0xda,0xb6,0x87,0x33,0x79,0x4B,0x0A,0x71}, "MYST ", 8}, + {{0x8d,0x80,0xde,0x8A,0x78,0x19,0x83,0x96,0x32,0x9d,0xfA,0x76,0x9a,0xD5,0x4d,0x24,0xbF,0x90,0xE7,0xaa}, "NAC ", 18}, + {{0x58,0x80,0x47,0x36,0x5d,0xf5,0xba,0x58,0x9f,0x92,0x36,0x04,0xaa,0xc2,0x3d,0x67,0x35,0x55,0xc6,0x23}, "NAVI ", 18}, + {{0x17,0xf8,0xaF,0xB6,0x3D,0xfc,0xDc,0xC9,0x0e,0xbE,0x6e,0x84,0xF0,0x60,0xCc,0x30,0x6A,0x98,0x25,0x7D}, "NBAI ", 18}, + {{0x80,0x98,0x26,0xcc,0xea,0xb6,0x8c,0x38,0x77,0x26,0xaf,0x96,0x27,0x13,0xb6,0x4c,0xb5,0xcb,0x3c,0xca}, "NCASH ", 18}, + {{0x9e,0x46,0xa3,0x8f,0x5d,0xaa,0xbe,0x86,0x83,0xe1,0x07,0x93,0xb0,0x67,0x49,0xee,0xf7,0xd7,0x33,0xd1}, "NCT ", 18}, + {{0xa5,0x4d,0xdc,0x7b,0x3c,0xce,0x7f,0xc8,0xb1,0xe3,0xfa,0x02,0x56,0xd0,0xdb,0x80,0xd2,0xc1,0x09,0x70}, "NDC ", 18}, + {{0xcf,0xb9,0x86,0x37,0xbc,0xae,0x43,0xC1,0x33,0x23,0xEA,0xa1,0x73,0x1c,0xED,0x2B,0x71,0x69,0x62,0xfD}, "NET ", 18}, + {{0xa8,0x23,0xe6,0x72,0x20,0x06,0xaf,0xe9,0x9e,0x91,0xc3,0x0f,0xf5,0x29,0x50,0x52,0xfe,0x6b,0x8e,0x32}, "NEU ", 18}, + {{0x72,0xdd,0x4b,0x6b,0xd8,0x52,0xa3,0xaa,0x17,0x2b,0xe4,0xd6,0xc5,0xa6,0xdb,0xec,0x58,0x8c,0xf1,0x31}, "NGC ", 18}, + {{0xe2,0x65,0x17,0xA9,0x96,0x72,0x99,0x45,0x3d,0x3F,0x1B,0x48,0xAa,0x00,0x5E,0x61,0x27,0xe6,0x72,0x10}, "NIMFA ", 18}, + {{0x17,0x76,0xe1,0xF2,0x6f,0x98,0xb1,0xA5,0xdF,0x9c,0xD3,0x47,0x95,0x3a,0x26,0xdd,0x3C,0xb4,0x66,0x71}, "NMR ", 18}, + {{0xec,0x46,0xf8,0x20,0x7d,0x76,0x60,0x12,0x45,0x4c,0x40,0x8d,0xe2,0x10,0xbc,0xbc,0x22,0x43,0xe7,0x1c}, "NOX ", 18}, + {{0x4c,0xe6,0xb3,0x62,0xbc,0x77,0xa2,0x49,0x66,0xdd,0xa9,0x07,0x8f,0x9c,0xef,0x81,0xb3,0xb8,0x86,0xa7}, "NPER ", 18}, + {{0xb9,0x13,0x18,0xf3,0x5b,0xdb,0x26,0x2e,0x94,0x23,0xbc,0x7c,0x7c,0x2a,0x3a,0x93,0xdd,0x93,0xc9,0x2c}, "NULS ", 18}, + {{0x57,0xAb,0x1E,0x02,0xfE,0xE2,0x37,0x74,0x58,0x0C,0x11,0x97,0x40,0x12,0x9e,0xAC,0x70,0x81,0xe9,0xD3}, "nUSD ", 18}, + {{0x45,0xe4,0x2D,0x65,0x9D,0x9f,0x94,0x66,0xcD,0x5D,0xF6,0x22,0x50,0x60,0x33,0x14,0x5a,0x9b,0x89,0xBc}, "NxC ", 3}, + {{0x76,0x27,0xde,0x4b,0x93,0x26,0x3a,0x6a,0x75,0x70,0xb8,0xda,0xfa,0x64,0xba,0xe8,0x12,0xe5,0xc3,0x94}, "NXX ", 8}, + {{0x5c,0x61,0x83,0xd1,0x0A,0x00,0xCD,0x74,0x7a,0x6D,0xbb,0x5F,0x65,0x8a,0xD5,0x14,0x38,0x3e,0x94,0x19}, "NXX OLD ", 8}, + {{0x5e,0x88,0x8B,0x83,0xB7,0x28,0x7E,0xED,0x4f,0xB7,0xDA,0x7b,0x7d,0x0A,0x0D,0x4c,0x73,0x5d,0x94,0xb3}, "OAK ", 18}, + {{0x70,0x1C,0x24,0x4b,0x98,0x8a,0x51,0x3c,0x94,0x59,0x73,0xdE,0xFA,0x05,0xde,0x93,0x3b,0x23,0xFe,0x1D}, "OAX ", 18}, + {{0x02,0x35,0xfe,0x62,0x4e,0x04,0x4a,0x05,0xee,0xd7,0xa4,0x3e,0x16,0xe3,0x08,0x3b,0xc8,0xa4,0x28,0x7a}, "OCC ", 18}, + {{0x6f,0x53,0x9a,0x94,0x56,0xa5,0xbc,0xb6,0x33,0x4a,0x1a,0x41,0x20,0x7c,0x37,0x88,0xf5,0x82,0x52,0x07}, "OHNI ", 18}, + {{0xbe,0xef,0x54,0x6a,0xc8,0xa4,0xe0,0xa8,0x0d,0xc1,0xe2,0xd6,0x96,0x96,0x8e,0xf5,0x41,0x38,0xf1,0xd4}, "OJX ", 18}, + {{0xc6,0x6e,0xa8,0x02,0x71,0x7b,0xfb,0x98,0x33,0x40,0x02,0x64,0xdd,0x12,0xc2,0xbc,0xea,0xa3,0x4a,0x6d}, "OLD_MKR ", 18}, + {{0xd2,0x61,0x14,0xcd,0x6E,0xE2,0x89,0xAc,0xcF,0x82,0x35,0x0c,0x8d,0x84,0x87,0xfe,0xdB,0x8A,0x0C,0x07}, "OMG ", 18}, + {{0xb2,0x3b,0xe7,0x35,0x73,0xbc,0x7e,0x03,0xdb,0x6e,0x5d,0xfc,0x62,0x40,0x53,0x68,0x71,0x6d,0x28,0xa8}, "ONEK ", 18}, + {{0xd3,0x41,0xd1,0x68,0x0e,0xee,0xe3,0x25,0x5b,0x8c,0x4c,0x75,0xbc,0xce,0x7e,0xb5,0x7f,0x14,0x4d,0xae}, "onG ", 18}, + {{0x69,0xc4,0xBB,0x24,0x0c,0xF0,0x5D,0x51,0xee,0xab,0x69,0x85,0xBa,0xb3,0x55,0x27,0xd0,0x4a,0x8C,0x64}, "OPEN ", 8}, + {{0x43,0x55,0xfC,0x16,0x0f,0x74,0x32,0x8f,0x9b,0x38,0x3d,0xF2,0xEC,0x58,0x9b,0xB3,0xdF,0xd8,0x2B,0xa0}, "OPT ", 18}, + {{0xff,0x56,0xCc,0x6b,0x1E,0x6d,0xEd,0x34,0x7a,0xA0,0xB7,0x67,0x6C,0x85,0xAB,0x0B,0x3D,0x08,0xB0,0xFA}, "ORBS ", 18}, + {{0x2C,0x4e,0x8f,0x2D,0x74,0x61,0x13,0xd0,0x69,0x6c,0xE8,0x9B,0x35,0xF0,0xd8,0xbF,0x88,0xE0,0xAE,0xcA}, "OST ", 18}, + {{0x65,0xa1,0x50,0x14,0x96,0x4f,0x21,0x02,0xff,0x58,0x64,0x7e,0x16,0xa1,0x6a,0x6b,0x9e,0x14,0xbc,0xf6}, "Ox Fina ", 3}, + {{0xfe,0xDA,0xE5,0x64,0x26,0x68,0xf8,0x63,0x6A,0x11,0x98,0x7F,0xf3,0x86,0xbf,0xd2,0x15,0xF9,0x42,0xEE}, "PAL ", 18}, + {{0xea,0x5f,0x88,0xe5,0x4d,0x98,0x2c,0xbb,0x0c,0x44,0x1c,0xde,0x4e,0x79,0xbc,0x30,0x5e,0x5b,0x43,0xbc}, "PARETO ", 18}, + {{0xBB,0x1f,0xA4,0xFd,0xEB,0x34,0x59,0x73,0x3b,0xF6,0x7E,0xbC,0x6f,0x89,0x30,0x03,0xfA,0x97,0x6a,0x82}, "XPAT ", 18}, + {{0x69,0x44,0x04,0x59,0x5e,0x30,0x75,0xa9,0x42,0x39,0x7f,0x46,0x6a,0xac,0xd4,0x62,0xff,0x1a,0x7b,0xd0}, "PATENTS ", 18}, + {{0xF8,0x13,0xF3,0x90,0x2b,0xBc,0x00,0xA6,0xDC,0xe3,0x78,0x63,0x4d,0x3B,0x79,0xD8,0x4F,0x98,0x03,0xd7}, "PATH ", 18}, + {{0xB9,0x70,0x48,0x62,0x8D,0xB6,0xB6,0x61,0xD4,0xC2,0xaA,0x83,0x3e,0x95,0xDb,0xe1,0xA9,0x05,0xB2,0x80}, "PAY ", 18}, + {{0x55,0x64,0x8d,0xe1,0x98,0x36,0x33,0x85,0x49,0x13,0x0b,0x1a,0xf5,0x87,0xf1,0x6b,0xea,0x46,0xf6,0x6b}, "PBL ", 18}, + {{0xF4,0xc0,0x7b,0x18,0x65,0xbC,0x32,0x6A,0x3c,0x01,0x33,0x94,0x92,0xCa,0x75,0x38,0xFD,0x03,0x8C,0xc0}, "PBT ", 4}, + {{0xfc,0xAC,0x7A,0x75,0x15,0xe9,0xA9,0xd7,0x61,0x9f,0xA7,0x7A,0x1f,0xa7,0x38,0x11,0x1f,0x66,0x72,0x7e}, "PCH ", 18}, + {{0x36,0x18,0x51,0x6F,0x45,0xCD,0x3c,0x91,0x3F,0x81,0xF9,0x98,0x7A,0xF4,0x10,0x77,0x93,0x2B,0xc4,0x0d}, "PCL ", 8}, + {{0x53,0x14,0x8B,0xb4,0x55,0x17,0x07,0xed,0xF5,0x1a,0x1e,0x8d,0x7A,0x93,0x69,0x8d,0x18,0x93,0x12,0x25}, "PCLOLD ", 8}, + {{0x58,0x84,0x96,0x9E,0xc0,0x48,0x05,0x56,0xE1,0x1d,0x11,0x99,0x80,0x13,0x6a,0x4C,0x17,0xeD,0xDE,0xd1}, "PET ", 18}, + {{0xec,0x18,0xf8,0x98,0xb4,0x07,0x6a,0x3e,0x18,0xf1,0x08,0x9d,0x33,0x37,0x6c,0xc3,0x80,0xbd,0xe6,0x1d}, "PETRO ", 18}, + {{0x55,0xc2,0xA0,0xC1,0x71,0xD9,0x20,0x84,0x35,0x60,0x59,0x4d,0xE3,0xd6,0xEE,0xcC,0x09,0xeF,0xc0,0x98}, "PEXT ", 4}, + {{0xE6,0x45,0x09,0xF0,0xbf,0x07,0xce,0x2d,0x29,0xA7,0xeF,0x19,0xA8,0xA9,0xbc,0x06,0x54,0x77,0xC1,0xB4}, "PIPL ", 8}, + {{0x8e,0xFF,0xd4,0x94,0xeB,0x69,0x8c,0xc3,0x99,0xAF,0x62,0x31,0xfC,0xcd,0x39,0xE0,0x8f,0xd2,0x0B,0x15}, "PIX ", 0}, + {{0x59,0x41,0x6A,0x25,0x62,0x8A,0x76,0xb4,0x73,0x0e,0xC5,0x14,0x86,0x11,0x4c,0x32,0xE0,0xB5,0x82,0xA1}, "PLASMA ", 6}, + {{0xE4,0x77,0x29,0x2f,0x1B,0x32,0x68,0x68,0x7A,0x29,0x37,0x61,0x16,0xB0,0xED,0x27,0xA9,0xc7,0x61,0x70}, "PLAY ", 18}, + {{0x0A,0xfF,0xa0,0x6e,0x7F,0xbe,0x5b,0xC9,0xa7,0x64,0xC9,0x79,0xaA,0x66,0xE8,0x25,0x6A,0x63,0x1f,0x02}, "PLBT ", 6}, + {{0xe3,0x81,0x85,0x04,0xc1,0xB3,0x2b,0xF1,0x55,0x7b,0x16,0xC2,0x38,0xB2,0xE0,0x1F,0xd3,0x14,0x9C,0x17}, "PLR ", 18}, + {{0xD8,0x91,0x2C,0x10,0x68,0x1D,0x8B,0x21,0xFd,0x37,0x42,0x24,0x4f,0x44,0x65,0x8d,0xBA,0x12,0x26,0x4E}, "PLU ", 18}, + {{0x0e,0x09,0x89,0xb1,0xf9,0xb8,0xa3,0x89,0x83,0xc2,0xba,0x80,0x53,0x26,0x9c,0xa6,0x2e,0xc9,0xb1,0x95}, "POE ", 8}, + {{0x43,0xf6,0xa1,0xbe,0x99,0x2d,0xee,0x40,0x87,0x21,0x74,0x84,0x90,0x77,0x2b,0x15,0x14,0x3c,0xe0,0xa7}, "POIN ", 0}, + {{0x99,0x92,0xeC,0x3c,0xF6,0xA5,0x5b,0x00,0x97,0x8c,0xdD,0xF2,0xb2,0x7B,0xC6,0x88,0x2d,0x88,0xD1,0xeC}, "POLY ", 18}, + {{0x77,0x9B,0x7b,0x71,0x3C,0x86,0xe3,0xE6,0x77,0x4f,0x50,0x40,0xD9,0xcC,0xC2,0xD4,0x3a,0xd3,0x75,0xF8}, "POOL ", 8}, + {{0xee,0x60,0x9f,0xe2,0x92,0x12,0x8c,0xad,0x03,0xb7,0x86,0xdb,0xb9,0xbc,0x26,0x34,0xcc,0xdb,0xe7,0xfc}, "POS ", 18}, + {{0x59,0x58,0x32,0xf8,0xfc,0x6b,0xf5,0x9c,0x85,0xc5,0x27,0xfe,0xc3,0x74,0x0a,0x1b,0x7a,0x36,0x12,0x69}, "POWR ", 6}, + {{0xc4,0x22,0x09,0xac,0xcc,0x14,0x02,0x9c,0x10,0x12,0xfb,0x56,0x80,0xd9,0x5f,0xbd,0x60,0x36,0xe2,0xa0}, "PPP ", 18}, + {{0xd4,0xfa,0x14,0x60,0xF5,0x37,0xbb,0x90,0x85,0xd2,0x2C,0x7b,0xcC,0xB5,0xDD,0x45,0x0E,0xf2,0x8e,0x3a}, "PPT ", 8}, + {{0x88,0xa3,0xe4,0xf3,0x5d,0x64,0xaa,0xd4,0x1a,0x6d,0x40,0x30,0xac,0x9a,0xfe,0x43,0x56,0xcb,0x84,0xfa}, "PRE ", 18}, + {{0x77,0x28,0xdf,0xef,0x5a,0xbd,0x46,0x86,0x69,0xeb,0x7f,0x9b,0x48,0xa7,0xf7,0x0a,0x50,0x1e,0xd2,0x9d}, "PRG ", 6}, + {{0x18,0x44,0xb2,0x15,0x93,0x26,0x26,0x68,0xb7,0x24,0x8d,0x0f,0x57,0xa2,0x20,0xca,0xab,0xa4,0x6a,0xb9}, "PRL ", 18}, + {{0x22,0x6b,0xb5,0x99,0xa1,0x2C,0x82,0x64,0x76,0xe3,0xA7,0x71,0x45,0x46,0x97,0xEA,0x52,0xE9,0xE2,0x20}, "PRO ", 8}, + {{0xA3,0x14,0x9E,0x0f,0xA0,0x06,0x1A,0x90,0x07,0xfA,0xf3,0x07,0x07,0x4c,0xdC,0xd2,0x90,0xf0,0xe2,0xFd}, "PRON ", 8}, + {{0xd9,0x4F,0x27,0x78,0xe2,0xB3,0x91,0x3C,0x53,0x63,0x7A,0xe6,0x06,0x47,0x59,0x8b,0xE5,0x88,0xc5,0x70}, "PRPS ", 18}, + {{0x16,0x37,0x33,0xbc,0xc2,0x8d,0xbf,0x26,0xB4,0x1a,0x8C,0xfA,0x83,0xe3,0x69,0xb5,0xB3,0xaf,0x74,0x1b}, "PRS ", 18}, + {{0x0c,0x04,0xd4,0xf3,0x31,0xda,0x8d,0xf7,0x5f,0x9e,0x2e,0x27,0x1e,0x3f,0x3f,0x14,0x94,0xc6,0x6c,0x36}, "PRSP ", 9}, + {{0x66,0x49,0x7a,0x28,0x3e,0x0a,0x00,0x7b,0xa3,0x97,0x4e,0x83,0x77,0x84,0xc6,0xae,0x32,0x34,0x47,0xde}, "PT ", 18}, + {{0x2a,0x8E,0x98,0xe2,0x56,0xf3,0x22,0x59,0xb5,0xE5,0xCb,0x55,0xDd,0x63,0xC8,0xe8,0x91,0x95,0x06,0x66}, "PTC ", 18}, + {{0x8A,0xe4,0xBF,0x2C,0x33,0xa8,0xe6,0x67,0xde,0x34,0xB5,0x49,0x38,0xB0,0xcc,0xD0,0x3E,0xb8,0xCC,0x06}, "PTOY ", 8}, + {{0x55,0x12,0xe1,0xd6,0xa7,0xbe,0x42,0x4b,0x43,0x23,0x12,0x6b,0x4f,0x9e,0x86,0xd0,0x23,0xf9,0x57,0x64}, "PTWO ", 18}, + {{0xef,0x6b,0x4c,0xe8,0xc9,0xbc,0x83,0x74,0x4f,0xbc,0xde,0x26,0x57,0xb3,0x2e,0xc1,0x87,0x90,0x45,0x8a}, "PUC ", 0}, + {{0xc1,0x48,0x30,0xe5,0x3a,0xa3,0x44,0xe8,0xc1,0x46,0x03,0xa9,0x12,0x29,0xa0,0xb9,0x25,0xb0,0xb2,0x62}, "PXT ", 8}, + {{0x61,0x8e,0x75,0xac,0x90,0xb1,0x2c,0x60,0x49,0xba,0x3b,0x27,0xf5,0xd5,0xf8,0x65,0x1b,0x00,0x37,0xf6}, "QASH ", 6}, + {{0x67,0x1A,0xbB,0xe5,0xCE,0x65,0x24,0x91,0x98,0x53,0x42,0xe8,0x54,0x28,0xEB,0x1b,0x07,0xbC,0x6c,0x64}, "QAU ", 8}, + {{0x24,0x67,0xaa,0x6b,0x5a,0x23,0x51,0x41,0x6f,0xd4,0xc3,0xde,0xf8,0x46,0x2d,0x84,0x1f,0xee,0xec,0xec}, "QBX ", 18}, + {{0xFF,0xAA,0x5f,0xfc,0x45,0x5d,0x91,0x31,0xf8,0xA2,0x71,0x3A,0x74,0x1f,0xD1,0x96,0x03,0x30,0x50,0x8B}, "QRG ", 18}, + {{0x69,0x7b,0xea,0xc2,0x8B,0x09,0xE1,0x22,0xC4,0x33,0x2D,0x16,0x39,0x85,0xe8,0xa7,0x31,0x21,0xb9,0x7F}, "QRL ", 8}, + {{0x99,0xea,0x4d,0xB9,0xEE,0x77,0xAC,0xD4,0x0B,0x11,0x9B,0xD1,0xdC,0x4E,0x33,0xe1,0xC0,0x70,0xb8,0x0d}, "QSP ", 18}, + {{0x2C,0x3C,0x1F,0x05,0x18,0x7d,0xBa,0x7A,0x5f,0x2D,0xd4,0x7D,0xca,0x57,0x28,0x1C,0x4d,0x4F,0x18,0x3F}, "QTQ ", 18}, + {{0x9a,0x64,0x2d,0x6b,0x33,0x68,0xdd,0xc6,0x62,0xCA,0x24,0x4b,0xAd,0xf3,0x2c,0xDA,0x71,0x60,0x05,0xBC}, "QTUM ", 18}, + {{0x45,0xed,0xb5,0x35,0x94,0x2a,0x8c,0x84,0xd9,0xf4,0xb5,0xd3,0x7e,0x1b,0x25,0xf9,0x1e,0xa4,0x80,0x4c}, "RAO ", 18}, + {{0xfc,0x2c,0x4d,0x8f,0x95,0x00,0x2c,0x14,0xed,0x0a,0x7a,0xa6,0x51,0x02,0xca,0xc9,0xe5,0x95,0x3b,0x5e}, "RBLX ", 18}, + {{0xf9,0x70,0xb8,0xe3,0x6e,0x23,0xf7,0xfc,0x3f,0xd7,0x52,0xee,0xa8,0x6f,0x8b,0xe8,0xd8,0x33,0x75,0xa6}, "RCN ", 18}, + {{0x25,0x5a,0xa6,0xdf,0x07,0x54,0x0c,0xb5,0xd3,0xd2,0x97,0xf0,0xd0,0xd4,0xd8,0x4c,0xb5,0x2b,0xc8,0xe6}, "RDN ", 18}, + {{0x76,0x7b,0xA2,0x91,0x5E,0xC3,0x44,0x01,0x5a,0x79,0x38,0xE3,0xeE,0xDf,0xeC,0x27,0x85,0x19,0x5D,0x05}, "REA ", 18}, + {{0x5f,0x53,0xf7,0xa8,0x07,0x56,0x14,0xb6,0x99,0xba,0xad,0x0b,0xc2,0xc8,0x99,0xf4,0xba,0xd8,0xfb,0xbf}, "REBL ", 18}, + {{0x76,0x96,0x0d,0xcc,0xd5,0xa1,0xfe,0x79,0x9f,0x7c,0x29,0xbe,0x9f,0x19,0xce,0xb4,0x62,0x7a,0xeb,0x2f}, "RED ", 18}, + {{0x40,0x8e,0x41,0x87,0x6c,0xCC,0xDC,0x0F,0x92,0x21,0x06,0x00,0xef,0x50,0x37,0x26,0x56,0x05,0x2a,0x38}, "REN ", 18}, + {{0xE9,0x43,0x27,0xD0,0x7F,0xc1,0x79,0x07,0xb4,0xDB,0x78,0x8E,0x5a,0xDf,0x2e,0xd4,0x24,0xad,0xDf,0xf6}, "REP ", 18}, + {{0x8f,0x82,0x21,0xaF,0xbB,0x33,0x99,0x8d,0x85,0x84,0xA2,0xB0,0x57,0x49,0xbA,0x73,0xc3,0x7a,0x93,0x8a}, "REQ ", 18}, + {{0xf0,0x5a,0x93,0x82,0xA4,0xC3,0xF2,0x9E,0x27,0x84,0x50,0x27,0x54,0x29,0x3D,0x88,0xb8,0x35,0x10,0x9C}, "REX ", 18}, + {{0xd0,0x92,0x9d,0x41,0x19,0x54,0xc4,0x74,0x38,0xdc,0x1d,0x87,0x1d,0xd6,0x08,0x1f,0x5c,0x5e,0x14,0x9c}, "RFR ", 4}, + {{0xdd,0x00,0x72,0x78,0xb6,0x67,0xf6,0xbe,0xf5,0x2f,0xd0,0xa4,0xc2,0x36,0x04,0xaa,0x1f,0x96,0x03,0x9a}, "RIPT ", 8}, + {{0x60,0x7F,0x4C,0x5B,0xB6,0x72,0x23,0x0e,0x86,0x72,0x08,0x55,0x32,0xf7,0xe9,0x01,0x54,0x4a,0x73,0x75}, "RLC ", 9}, + {{0xcC,0xeD,0x5B,0x82,0x88,0x08,0x6B,0xE8,0xc3,0x8E,0x23,0x56,0x7e,0x68,0x4C,0x37,0x40,0xbe,0x4D,0x48}, "RLT ", 10}, + {{0xbe,0x99,0xB0,0x97,0x09,0xfc,0x75,0x3b,0x09,0xBC,0xf5,0x57,0xA9,0x92,0xF6,0x60,0x5D,0x59,0x97,0xB0}, "RLTY ", 8}, + {{0x4a,0x42,0xd2,0xc5,0x80,0xf8,0x3d,0xce,0x40,0x4a,0xca,0xd1,0x8d,0xab,0x26,0xdb,0x11,0xa1,0x75,0x0e}, "RLX ", 18}, + {{0x09,0x96,0xbf,0xb5,0xd0,0x57,0xfa,0xa2,0x37,0x64,0x0e,0x25,0x06,0xbe,0x7b,0x4f,0x9c,0x46,0xde,0x0b}, "RNDR ", 18}, + {{0xA4,0x01,0x06,0x13,0x4c,0x5b,0xF4,0xc4,0x14,0x11,0x55,0x4e,0x6d,0xb9,0x9B,0x95,0xA1,0x5e,0xd9,0xd8}, "ROCK ", 18}, + {{0xc9,0xde,0x4b,0x7f,0x0c,0x3d,0x99,0x1e,0x96,0x71,0x58,0xe4,0xd4,0xbf,0xa4,0xb5,0x1e,0xc0,0xb1,0x14}, "ROK ", 18}, + {{0x49,0x93,0xCB,0x95,0xc7,0x44,0x3b,0xdC,0x06,0x15,0x5c,0x5f,0x56,0x88,0xBe,0x9D,0x8f,0x69,0x99,0xa5}, "ROUND ", 18}, + {{0xb4,0xef,0xd8,0x5c,0x19,0x99,0x9d,0x84,0x25,0x13,0x04,0xbd,0xa9,0x9e,0x90,0xb9,0x23,0x00,0xbd,0x93}, "RPL ", 18}, + {{0x54,0xb2,0x93,0x22,0x60,0x00,0xcc,0xBF,0xC0,0x4D,0xF9,0x02,0xeE,0xC5,0x67,0xCB,0x4C,0x35,0xa9,0x03}, "RTN ", 18}, + {{0x3d,0x1b,0xa9,0xbe,0x9f,0x66,0xb8,0xee,0x10,0x19,0x11,0xbc,0x36,0xd3,0xfb,0x56,0x2e,0xac,0x22,0x44}, "RVT ", 18}, + {{0x1e,0xc8,0xfe,0x51,0xa9,0xb6,0xa3,0xa6,0xc4,0x27,0xd1,0x7d,0x9e,0xcc,0x30,0x60,0xfb,0xc4,0xa4,0x5c}, "S-A-PAT ", 18}, + {{0x3e,0xb9,0x1d,0x23,0x7e,0x49,0x1e,0x0d,0xee,0x85,0x82,0xc4,0x02,0xd8,0x5c,0xb4,0x40,0xfb,0x6b,0x54}, "S-ETH ", 18}, + {{0x41,0x56,0xD3,0x34,0x2D,0x5c,0x38,0x5a,0x87,0xD2,0x64,0xF9,0x06,0x53,0x73,0x35,0x92,0x00,0x05,0x81}, "SALT ", 8}, + {{0x7C,0x5A,0x0C,0xE9,0x26,0x7E,0xD1,0x9B,0x22,0xF8,0xca,0xe6,0x53,0xF1,0x98,0xe3,0xE8,0xda,0xf0,0x98}, "SAN ", 18}, + {{0x78,0xfe,0x18,0xe4,0x1f,0x43,0x6e,0x19,0x81,0xa3,0xa6,0x0d,0x15,0x57,0xc8,0xa7,0xa9,0x37,0x04,0x61}, "SCANDI ", 2}, + {{0xd7,0x63,0x17,0x87,0xb4,0xdc,0xc8,0x7b,0x12,0x54,0xcf,0xd1,0xe5,0xce,0x48,0xe9,0x68,0x23,0xde,0xe8}, "SCL ", 8}, + {{0x4c,0xa7,0x41,0x85,0x53,0x2d,0xc1,0x78,0x95,0x27,0x19,0x4e,0x5b,0x9c,0x86,0x6d,0xd3,0x3f,0x4e,0x82}, "SenSatoI ", 18}, + {{0x67,0x45,0xfA,0xB6,0x80,0x1e,0x37,0x6c,0xD2,0x4F,0x03,0x57,0x2B,0x9C,0x9B,0x0D,0x4E,0xdD,0xDC,0xcf}, "SENSE ", 8}, + {{0xe0,0x6e,0xda,0x74,0x35,0xba,0x74,0x9b,0x04,0x73,0x80,0xce,0xd4,0x91,0x21,0xdd,0xe9,0x33,0x34,0xae}, "SET ", 0}, + {{0x98,0xf5,0xe9,0xb7,0xf0,0xe3,0x39,0x56,0xc0,0x44,0x3e,0x81,0xbf,0x7d,0xeb,0x8b,0x5b,0x1e,0xd5,0x45}, "SEXY ", 18}, + {{0xa1,0xcc,0xc1,0x66,0xfa,0xf0,0xE9,0x98,0xb3,0xE3,0x32,0x25,0xA1,0xA0,0x30,0x1B,0x1C,0x86,0x11,0x9D}, "SGEL ", 18}, + {{0x37,0x42,0x75,0x76,0x32,0x4f,0xE1,0xf3,0x62,0x5c,0x91,0x02,0x67,0x47,0x72,0xd7,0xCF,0x71,0x37,0x7d}, "SelfieYo ", 18}, + {{0xd2,0x48,0xB0,0xD4,0x8E,0x44,0xaa,0xF9,0xc4,0x9a,0xea,0x03,0x12,0xbe,0x7E,0x13,0xa6,0xdc,0x14,0x68}, "StatusGn ", 1}, + {{0xEF,0x2E,0x99,0x66,0xeb,0x61,0xBB,0x49,0x4E,0x53,0x75,0xd5,0xDf,0x8d,0x67,0xB7,0xdB,0x8A,0x78,0x0D}, "SHIT ", 0}, + {{0x8a,0x18,0x7d,0x52,0x85,0xd3,0x16,0xbc,0xbc,0x9a,0xda,0xfc,0x08,0xb5,0x1d,0x70,0xa0,0xd8,0xe0,0x00}, "SIFT ", 0}, + {{0x68,0x88,0xa1,0x6e,0xA9,0x79,0x2c,0x15,0xA4,0xDC,0xF2,0xf6,0xC6,0x23,0xD0,0x55,0xc8,0xeD,0xe7,0x92}, "SIG ", 18}, + {{0x2b,0xDC,0x0D,0x42,0x99,0x60,0x17,0xfC,0xe2,0x14,0xb2,0x16,0x07,0xa5,0x15,0xDA,0x41,0xA9,0xE0,0xC5}, "SKIN ", 6}, + {{0x49,0x94,0xe8,0x18,0x97,0xa9,0x20,0xc0,0xFE,0xA2,0x35,0xeb,0x8C,0xEd,0xEE,0xd3,0xc6,0xfF,0xF6,0x97}, "SKO1 ", 18}, + {{0x4c,0x38,0x2F,0x8E,0x09,0x61,0x5A,0xC8,0x6E,0x08,0xCE,0x58,0x26,0x6C,0xC2,0x27,0xe7,0xd4,0xD9,0x13}, "SKR ", 6}, + {{0xfd,0xFE,0x8b,0x7a,0xB6,0xCF,0x1b,0xD1,0xE3,0xd1,0x45,0x38,0xEf,0x40,0x68,0x62,0x96,0xC4,0x20,0x52}, "SKRP ", 18}, + {{0x6E,0x34,0xd8,0xd8,0x47,0x64,0xD4,0x0f,0x6D,0x7b,0x39,0xcd,0x56,0x9F,0xd0,0x17,0xbF,0x53,0x17,0x7D}, "SKRP 1 ", 18}, + {{0x32,0x4a,0x48,0xeb,0xcb,0xb4,0x6e,0x61,0x99,0x39,0x31,0xef,0x9d,0x35,0xf6,0x69,0x7c,0xd2,0x90,0x1b}, "SKRP 1-E ", 18}, + {{0x7A,0x5f,0xF2,0x95,0xDc,0x82,0x39,0xd5,0xC2,0x37,0x4E,0x4D,0x89,0x42,0x02,0xaA,0xF0,0x29,0xCa,0xb6}, "SLT ", 3}, + {{0x6F,0x6D,0xEb,0x5d,0xb0,0xC4,0x99,0x4A,0x82,0x83,0xA0,0x1D,0x6C,0xFe,0xEB,0x27,0xFc,0x3b,0xBe,0x9C}, "SMART ", 0}, + {{0x2d,0xcf,0xaa,0xc1,0x1c,0x9e,0xeb,0xd8,0xc6,0xc4,0x21,0x03,0xfe,0x9e,0x2a,0x6a,0xd2,0x37,0xaf,0x27}, "SmartNod ", 18}, + {{0x55,0xf9,0x39,0x85,0x43,0x1f,0xc9,0x30,0x40,0x77,0x68,0x7a,0x35,0xa1,0xba,0x10,0x3d,0xc1,0xe0,0x81}, "SmartMsh ", 18}, + {{0x78,0xEb,0x8D,0xC6,0x41,0x07,0x7F,0x04,0x9f,0x91,0x06,0x59,0xb6,0xd5,0x80,0xE8,0x0d,0xC4,0xd2,0x37}, "SocialMk ", 8}, + {{0xF4,0x13,0x41,0x46,0xAF,0x2d,0x51,0x1D,0xd5,0xEA,0x8c,0xDB,0x1C,0x4A,0xC8,0x8C,0x57,0xD6,0x04,0x04}, "SNC ", 18}, + {{0xf3,0x33,0xb2,0xAc,0xe9,0x92,0xac,0x2b,0xBD,0x87,0x98,0xbF,0x57,0xBc,0x65,0xa0,0x61,0x84,0xaf,0xBa}, "SND ", 0}, + {{0xcF,0xD6,0xAe,0x8B,0xF1,0x3f,0x42,0xDE,0x14,0x86,0x73,0x51,0xeA,0xff,0x7A,0x8A,0x3b,0x9F,0xbB,0xe7}, "SNG ", 8}, + {{0xae,0xC2,0xE8,0x7E,0x0A,0x23,0x52,0x66,0xD9,0xC5,0xAD,0xc9,0xDE,0xb4,0xb2,0xE2,0x9b,0x54,0xD0,0x09}, "SNGLS ", 0}, + {{0x44,0xF5,0x88,0xaE,0xeB,0x8C,0x44,0x47,0x14,0x39,0xD1,0x27,0x0B,0x36,0x03,0xc6,0x6a,0x92,0x62,0xF1}, "SNIP ", 18}, + {{0x98,0x3F,0x6d,0x60,0xdb,0x79,0xea,0x8c,0xA4,0xeB,0x99,0x68,0xC6,0xaF,0xf8,0xcf,0xA0,0x4B,0x3c,0x63}, "SNM ", 18}, + {{0xbd,0xc5,0xba,0xc3,0x9d,0xbe,0x13,0x2b,0x1e,0x03,0x0e,0x89,0x8a,0xe3,0x83,0x00,0x17,0xd7,0xd9,0x69}, "SNOV ", 18}, + {{0x74,0x4d,0x70,0xFD,0xBE,0x2B,0xa4,0xCF,0x95,0x13,0x16,0x26,0x61,0x4a,0x17,0x63,0xDF,0x80,0x5B,0x9E}, "SNT ", 18}, + {{0x1f,0x54,0x63,0x8b,0x77,0x37,0x19,0x3f,0xfd,0x86,0xc1,0x9e,0xc5,0x19,0x07,0xa7,0xc4,0x17,0x55,0xd8}, "SOL ", 6}, + {{0x42,0xd6,0x62,0x2d,0xec,0xe3,0x94,0xb5,0x49,0x99,0xfb,0xd7,0x3d,0x10,0x81,0x23,0x80,0x6f,0x6a,0x18}, "SPANK ", 18}, + {{0x58,0xbf,0x7d,0xf5,0x7d,0x9D,0xA7,0x11,0x3c,0x4c,0xCb,0x49,0xd8,0x46,0x3D,0x49,0x08,0xC7,0x35,0xcb}, "SPARC ", 18}, + {{0x24,0xae,0xf3,0xbf,0x1a,0x47,0x56,0x15,0x00,0xf9,0x43,0x0d,0x74,0xed,0x40,0x97,0xc4,0x7f,0x51,0xf2}, "SPARTA ", 4}, + {{0x85,0x08,0x93,0x89,0xC1,0x4B,0xd9,0xc7,0x7F,0xC2,0xb8,0xF0,0xc3,0xd1,0xdC,0x33,0x63,0xBf,0x06,0xEf}, "SPF ", 18}, + {{0x20,0xF7,0xA3,0xDd,0xF2,0x44,0xdc,0x92,0x99,0x97,0x5b,0x4D,0xa1,0xC3,0x9F,0x8D,0x5D,0x75,0xf0,0x5A}, "SPN ", 6}, + {{0x68,0xd5,0x7c,0x9a,0x1C,0x35,0xf6,0x3E,0x2c,0x83,0xeE,0x8e,0x49,0xA6,0x4e,0x9d,0x70,0x52,0x8D,0x25}, "SRN ", 18}, + {{0xbb,0xFF,0x86,0x2d,0x90,0x6E,0x34,0x8E,0x99,0x46,0xBf,0xb2,0x13,0x2e,0xcB,0x15,0x7D,0xa3,0xD4,0xb4}, "SS shard ", 18}, + {{0x6e,0x20,0x50,0xCB,0xFB,0x3e,0xD8,0xA4,0xd3,0x9b,0x64,0xcC,0x9f,0x47,0xE7,0x11,0xa0,0x3a,0x5a,0x89}, "SSH ", 18}, + {{0x4A,0x89,0xcD,0x48,0x6f,0xA9,0x96,0xad,0x50,0xc0,0xa6,0x3C,0x35,0xc7,0x87,0x02,0xf5,0x42,0x2a,0x50}, "STABIT ", 3}, + {{0x9a,0x00,0x5c,0x9a,0x89,0xbd,0x72,0xa4,0xbd,0x27,0x72,0x1e,0x7a,0x09,0xa3,0xc1,0x1d,0x2b,0x03,0xc4}, "STAC ", 18}, + {{0xF7,0x0a,0x64,0x2b,0xD3,0x87,0xF9,0x43,0x80,0xfF,0xb9,0x04,0x51,0xC2,0xc8,0x1d,0x4E,0xb8,0x2C,0xBc}, "STAR ", 18}, + {{0x62,0x9a,0xEe,0x55,0xed,0x49,0x58,0x1C,0x33,0xab,0x27,0xf9,0x40,0x3F,0x79,0x92,0xA2,0x89,0xff,0xd5}, "STC ", 18}, + {{0xaE,0x73,0xB3,0x8d,0x1c,0x9A,0x8b,0x27,0x41,0x27,0xec,0x30,0x16,0x0a,0x49,0x27,0xC4,0xd7,0x18,0x24}, "STK ", 18}, + {{0x59,0x93,0x46,0x77,0x9e,0x90,0xfc,0x3F,0x5F,0x99,0x7b,0x5e,0xa7,0x15,0x34,0x98,0x20,0xF9,0x15,0x71}, "STN ", 4}, + {{0xB6,0x4e,0xf5,0x1C,0x88,0x89,0x72,0xc9,0x08,0xCF,0xac,0xf5,0x9B,0x47,0xC1,0xAf,0xBC,0x0A,0xb8,0xaC}, "STORJ ", 8}, + {{0xD0,0xa4,0xb8,0x94,0x6C,0xb5,0x2f,0x06,0x61,0x27,0x3b,0xfb,0xC6,0xfD,0x0E,0x0C,0x75,0xFc,0x64,0x33}, "STORM ", 18}, + {{0xec,0xd5,0x70,0xbB,0xf7,0x47,0x61,0xb9,0x60,0xFa,0x04,0xCc,0x10,0xfe,0x2c,0x4e,0x86,0xFf,0xDA,0x36}, "STP ", 8}, + {{0x5c,0x3a,0x22,0x85,0x10,0xd2,0x46,0xb7,0x8a,0x37,0x65,0xc2,0x02,0x21,0xcb,0xf3,0x08,0x2b,0x44,0xa4}, "STQ ", 18}, + {{0x46,0x49,0x24,0x73,0x75,0x5e,0x8d,0xF9,0x60,0xF8,0x03,0x48,0x77,0xF6,0x17,0x32,0xD7,0x18,0xCE,0x96}, "STRC ", 8}, + {{0x00,0x6B,0xeA,0x43,0xBa,0xa3,0xf7,0xA6,0xf7,0x65,0xF1,0x4f,0x10,0xA1,0xa1,0xb0,0x83,0x34,0xEF,0x45}, "STX ", 18}, + {{0x12,0x48,0x0E,0x24,0xeb,0x5b,0xec,0x1a,0x9D,0x43,0x69,0xCa,0xB6,0xa8,0x0c,0xaD,0x3c,0x0A,0x37,0x7A}, "SUB ", 2}, + {{0x9e,0x88,0x61,0x34,0x18,0xcf,0x03,0xdc,0xa5,0x4d,0x6a,0x2c,0xf6,0xad,0x93,0x4a,0x78,0xc7,0xa1,0x7a}, "SWM ", 18}, + {{0xB9,0xe7,0xF8,0x56,0x8e,0x08,0xd5,0x65,0x9f,0x5D,0x29,0xC4,0x99,0x71,0x73,0xd8,0x4C,0xdF,0x26,0x07}, "SWT ", 18}, + {{0x12,0xb3,0x06,0xfa,0x98,0xf4,0xcb,0xb8,0xd4,0x45,0x7f,0xdf,0xf3,0xa0,0xa0,0xa5,0x6f,0x07,0xcc,0xdf}, "SXDT ", 18}, + {{0x2c,0x82,0xc7,0x3d,0x5b,0x34,0xaa,0x01,0x59,0x89,0x46,0x2b,0x29,0x48,0xcd,0x61,0x6a,0x37,0x64,0x1f}, "SXUT ", 18}, + {{0x10,0xb1,0x23,0xfd,0xdd,0xe0,0x03,0x24,0x31,0x99,0xaa,0xd0,0x35,0x22,0x06,0x5d,0xc0,0x58,0x27,0xa0}, "SYN ", 18}, + {{0xE7,0x77,0x5A,0x6e,0x9B,0xcf,0x90,0x4e,0xb3,0x9D,0xA2,0xb6,0x8c,0x5e,0xfb,0x4F,0x93,0x60,0xe0,0x8C}, "TaaS ", 6}, + {{0xc2,0x7a,0x2f,0x05,0xfa,0x57,0x7a,0x83,0xba,0x0f,0xdb,0x4c,0x38,0x44,0x3c,0x07,0x18,0x35,0x65,0x01}, "TAU ", 18}, + {{0xFA,0xCC,0xD5,0xFc,0x83,0xc3,0xE4,0xC3,0xc1,0xAC,0x1E,0xF3,0x5D,0x15,0xad,0xf0,0x6b,0xCF,0x20,0x9C}, "TBC2 ", 8}, + {{0xAF,0xe6,0x05,0x11,0x34,0x1a,0x37,0x48,0x8d,0xe2,0x5B,0xef,0x35,0x19,0x52,0x56,0x2E,0x31,0xfC,0xc1}, "TBT ", 8}, + {{0x2a,0x1d,0xba,0xbe,0x65,0xc5,0x95,0xB0,0x02,0x2e,0x75,0x20,0x8C,0x34,0x01,0x41,0x39,0xd5,0xd3,0x57}, "TDH ", 18}, + {{0x85,0xe0,0x76,0x36,0x1c,0xc8,0x13,0xa9,0x08,0xff,0x67,0x2f,0x9b,0xad,0x15,0x41,0x47,0x44,0x02,0xb2}, "TEL ", 2}, + {{0xa7,0xf9,0x76,0xC3,0x60,0xeb,0xBe,0xD4,0x46,0x5c,0x28,0x55,0x68,0x4D,0x1A,0xAE,0x52,0x71,0xeF,0xa9}, "TFL ", 8}, + {{0x38,0x83,0xf5,0xe1,0x81,0xfc,0xca,0xf8,0x41,0x0f,0xa6,0x1e,0x12,0xb5,0x9b,0xad,0x96,0x3f,0xb6,0x45}, "THETA ", 18}, + {{0xfe,0x7B,0x91,0x5A,0x0b,0xAA,0x0E,0x79,0xf8,0x5c,0x55,0x53,0x26,0x65,0x13,0xF7,0xC1,0xc0,0x3E,0xd0}, "THUG ", 18}, + {{0x65,0x31,0xf1,0x33,0xe6,0xDe,0xeB,0xe7,0xF2,0xdc,0xE5,0xA0,0x44,0x1a,0xA7,0xef,0x33,0x0B,0x4e,0x53}, "TIME ", 8}, + {{0x80,0xbc,0x55,0x12,0x56,0x1c,0x7f,0x85,0xa3,0xa9,0x50,0x8c,0x7d,0xf7,0x90,0x1b,0x37,0x0f,0xa1,0xdf}, "TIO ", 18}, + {{0xEa,0x1f,0x34,0x6f,0xaF,0x02,0x3F,0x97,0x4E,0xb5,0xad,0xaf,0x08,0x8B,0xbC,0xdf,0x02,0xd7,0x61,0xF4}, "TIX ", 18}, + {{0xaA,0xAf,0x91,0xD9,0xb9,0x0d,0xF8,0x00,0xDf,0x4F,0x55,0xc2,0x05,0xfd,0x69,0x89,0xc9,0x77,0xE7,0x3a}, "TKN ", 8}, + {{0x08,0xf5,0xa9,0x23,0x5b,0x08,0x17,0x3b,0x75,0x69,0xf8,0x36,0x45,0xd2,0xc7,0xfb,0x55,0xe8,0xcc,0xd8}, "TNT ", 8}, + {{0x8e,0xb9,0x65,0xee,0x9c,0xCF,0xBC,0xE7,0x6c,0x0a,0x06,0x26,0x44,0x92,0xc0,0xaf,0xEf,0xc2,0x82,0x6d}, "TOOR ", 18}, + {{0xcB,0x3F,0x90,0x2b,0xf9,0x76,0x26,0x39,0x1b,0xF8,0xbA,0x87,0x26,0x4b,0xbC,0x3D,0xC1,0x34,0x69,0xbe}, "TRC ", 18}, + {{0x56,0x6F,0xd7,0x99,0x9B,0x1F,0xc3,0x98,0x80,0x22,0xbD,0x38,0x50,0x7A,0x48,0xF0,0xbC,0xf2,0x2c,0x77}, "TRCN ", 18}, + {{0xcb,0x94,0xbe,0x6f,0x13,0xa1,0x18,0x2e,0x4a,0x4b,0x61,0x40,0xcb,0x7b,0xf2,0x02,0x5d,0x28,0xe4,0x1b}, "TRST ", 6}, + {{0xf2,0x30,0xb7,0x90,0xe0,0x53,0x90,0xfc,0x82,0x95,0xf4,0xd3,0xf6,0x03,0x32,0xc9,0x3b,0xed,0x42,0xe2}, "TRX ", 6}, + {{0x2e,0xF1,0xaB,0x8a,0x26,0x18,0x7C,0x58,0xBB,0x8a,0xAe,0xB1,0x1B,0x2f,0xC6,0xD2,0x5C,0x5c,0x07,0x16}, "TWN ", 18}, + {{0xfb,0xd0,0xd1,0xc7,0x7b,0x50,0x17,0x96,0xa3,0x5d,0x86,0xcf,0x91,0xd6,0x5d,0x97,0x78,0xee,0xe6,0x95}, "TWNKL ", 3}, + {{0x24,0x69,0x27,0x91,0xbc,0x44,0x4c,0x5c,0xd0,0xb8,0x1e,0x3c,0xbc,0xab,0xa4,0xb0,0x4a,0xcd,0x1f,0x3b}, "UKG ", 18}, + {{0x8e,0x5a,0xfc,0x69,0xf6,0x22,0x7a,0x3a,0xd7,0x5e,0xd3,0x46,0xc8,0x72,0x3b,0xc6,0x2c,0xe9,0x71,0x23}, "UMKA ", 4}, + {{0x89,0x20,0x5A,0x3A,0x3b,0x2A,0x69,0xDe,0x6D,0xbf,0x7f,0x01,0xED,0x13,0xB2,0x10,0x8B,0x2c,0x43,0xe7}, "Unicorn ", 0}, + {{0xd0,0x1d,0xb7,0x3e,0x04,0x78,0x55,0xef,0xb4,0x14,0xe6,0x20,0x20,0x98,0xc4,0xbe,0x4c,0xd2,0x42,0x3b}, "UQC ", 18}, + {{0xD7,0x60,0xAD,0xdF,0xb2,0x4D,0x9C,0x01,0xFe,0x4B,0xfe,0xa7,0x47,0x5C,0x5e,0x36,0x36,0x68,0x40,0x58}, "USDM ", 2}, + {{0xda,0xc1,0x7f,0x95,0x8d,0x2e,0xe5,0x23,0xa2,0x20,0x62,0x06,0x99,0x45,0x97,0xc1,0x3d,0x83,0x1e,0xc7}, "USDT ", 6}, + {{0x70,0xa7,0x28,0x33,0xd6,0xbf,0x7f,0x50,0x8c,0x82,0x24,0xce,0x59,0xea,0x1e,0xf3,0xd0,0xea,0x3a,0x38}, "UTK ", 18}, + {{0x9e,0x33,0x19,0x63,0x6e,0x21,0x26,0xe3,0xc0,0xbc,0x9e,0x31,0x34,0xAE,0xC5,0xe1,0x50,0x8A,0x46,0xc7}, "UTN-P ", 18}, + {{0x35,0x43,0x63,0x8e,0xD4,0xa9,0x00,0x6E,0x48,0x40,0xB1,0x05,0x94,0x42,0x71,0xBc,0xea,0x15,0x60,0x5D}, "UUU ", 18}, + {{0x82,0xBD,0x52,0x6b,0xDB,0x71,0x8C,0x6d,0x4D,0xD2,0x29,0x1E,0xd0,0x13,0xA5,0x18,0x6c,0xAE,0x2D,0xCa}, "VDOC ", 18}, + {{0x34,0x0d,0x2b,0xde,0x5e,0xb2,0x8c,0x1e,0xed,0x91,0xb2,0xf7,0x90,0x72,0x3e,0x3b,0x16,0x06,0x13,0xb7}, "VEE ", 18}, + {{0xEb,0xeD,0x4f,0xF9,0xfe,0x34,0x41,0x3d,0xb8,0xfC,0x82,0x94,0x55,0x6B,0xBD,0x15,0x28,0xa4,0xDA,0xca}, "VENUS ", 3}, + {{0x8f,0x34,0x70,0xA7,0x38,0x8c,0x05,0xeE,0x4e,0x7A,0xF3,0xd0,0x1D,0x8C,0x72,0x2b,0x0F,0xF5,0x23,0x74}, "VERI ", 18}, + {{0xD8,0x50,0x94,0x2e,0xF8,0x81,0x1f,0x2A,0x86,0x66,0x92,0xA6,0x23,0x01,0x1b,0xDE,0x52,0xa4,0x62,0xC1}, "VET ", 18}, + {{0x2C,0x97,0x4B,0x2d,0x0B,0xA1,0x71,0x6E,0x64,0x4c,0x1F,0xC5,0x99,0x82,0xa8,0x9D,0xDD,0x2f,0xF7,0x24}, "VIB ", 18}, + {{0xe8,0xff,0x5c,0x9c,0x75,0xde,0xb3,0x46,0xac,0xac,0x49,0x3c,0x46,0x3c,0x89,0x50,0xbe,0x03,0xdf,0xba}, "VIBE ", 18}, + {{0x88,0x24,0x48,0xf8,0x3d,0x90,0xb2,0xbf,0x47,0x7a,0xf2,0xea,0x79,0x32,0x7f,0xde,0xa1,0x33,0x5d,0x93}, "VIBEX ", 18}, + {{0xf0,0x3f,0x8d,0x65,0xba,0xfa,0x59,0x86,0x11,0xc3,0x49,0x51,0x24,0x09,0x3c,0x56,0xe8,0xf6,0x38,0xf0}, "VIEW ", 18}, + {{0x23,0xb7,0x5B,0xc7,0xAa,0xF2,0x8e,0x2d,0x66,0x28,0xC3,0xf4,0x24,0xB3,0x88,0x2F,0x8f,0x07,0x2a,0x3c}, "VIT ", 18}, + {{0x51,0x94,0x75,0xb3,0x16,0x53,0xe4,0x6d,0x20,0xcd,0x09,0xf9,0xfd,0xcf,0x3b,0x12,0xbd,0xac,0xb4,0xf5}, "VIU ", 18}, + {{0x92,0x2a,0xc4,0x73,0xa3,0xcc,0x24,0x1f,0xd3,0xa0,0x04,0x9e,0xd1,0x45,0x36,0x45,0x2d,0x58,0xd7,0x3c}, "VLD ", 18}, + {{0xc3,0xbc,0x9e,0xb7,0x1f,0x75,0xec,0x43,0x9a,0x6b,0x6c,0x8e,0x8b,0x74,0x6f,0xcf,0x5b,0x62,0xf7,0x03}, "VOC ", 18}, + {{0x83,0xeE,0xA0,0x0D,0x83,0x8f,0x92,0xdE,0xC4,0xD1,0x47,0x56,0x97,0xB9,0xf4,0xD3,0x53,0x7b,0x56,0xE3}, "VOISE ", 8}, + {{0x92,0xe7,0x8d,0xae,0x13,0x15,0x06,0x7a,0x88,0x19,0xef,0xd6,0xdc,0xa4,0x32,0xde,0x9d,0xcd,0xe2,0xe9}, "VRS ", 6}, + {{0x5c,0x54,0x3e,0x7A,0xE0,0xA1,0x10,0x4f,0x78,0x40,0x6C,0x34,0x0E,0x9C,0x64,0xFD,0x9f,0xCE,0x51,0x70}, "VSL ", 18}, + {{0x28,0x6B,0xDA,0x14,0x13,0xa2,0xDf,0x81,0x73,0x1D,0x49,0x30,0xce,0x2F,0x86,0x2a,0x35,0xA6,0x09,0xfE}, "WaBi ", 18}, + {{0x39,0xBb,0x25,0x9F,0x66,0xE1,0xC5,0x9d,0x5A,0xBE,0xF8,0x83,0x75,0x97,0x9b,0x4D,0x20,0xD9,0x80,0x22}, "WAX ", 8}, + {{0x74,0x95,0x1B,0x67,0x7d,0xe3,0x2D,0x59,0x6E,0xE8,0x51,0xA2,0x33,0x33,0x69,0x26,0xe6,0xA2,0xcd,0x09}, "WBA ", 7}, + {{0x6a,0x0a,0x97,0xe4,0x7d,0x15,0xaa,0xd1,0xd1,0x32,0xa1,0xac,0x79,0xa4,0x80,0xe3,0xf2,0x07,0x90,0x63}, "WCT ", 18}, + {{0xC0,0x2a,0xaA,0x39,0xb2,0x23,0xFE,0x8D,0x0A,0x0e,0x5C,0x4F,0x27,0xeA,0xD9,0x08,0x3C,0x75,0x6C,0xc2}, "WETH ", 18}, + {{0xf4,0xfe,0x95,0x60,0x38,0x81,0xd0,0xe0,0x79,0x54,0xfd,0x76,0x05,0xe0,0xe9,0xa9,0x16,0xe4,0x2c,0x44}, "WHEN ", 18}, + {{0xe9,0x33,0xc0,0xCd,0x97,0x84,0x41,0x4d,0x5F,0x27,0x8C,0x11,0x49,0x04,0xF5,0xA8,0x4b,0x39,0x69,0x19}, "WHO ", 18}, + {{0x62,0xcd,0x07,0xd4,0x14,0xec,0x50,0xb6,0x8c,0x7e,0xca,0xa8,0x63,0xa2,0x3d,0x34,0x4f,0x2d,0x06,0x2f}, "WIC ", 0}, + {{0x5e,0x4A,0xBE,0x64,0x19,0x65,0x0C,0xA8,0x39,0xCe,0x5B,0xB7,0xDb,0x42,0x2b,0x88,0x1a,0x60,0x64,0xbB}, "WiC ", 18}, + {{0xD3,0xC0,0x07,0x72,0xB2,0x4D,0x99,0x7A,0x81,0x22,0x49,0xca,0x63,0x7a,0x92,0x1e,0x81,0x35,0x77,0x01}, "WILD ", 18}, + {{0x66,0x70,0x88,0xb2,0x12,0xce,0x3d,0x06,0xa1,0xb5,0x53,0xa7,0x22,0x1E,0x1f,0xD1,0x90,0x00,0xd9,0xaF}, "WINGS ", 18}, + {{0xF6,0xB5,0x5a,0xcB,0xBC,0x49,0xf4,0x52,0x4A,0xa4,0x8D,0x19,0x28,0x1A,0x9A,0x77,0xc5,0x4D,0xE1,0x0f}, "WLK ", 18}, + {{0x72,0x87,0x81,0xE7,0x57,0x35,0xdc,0x09,0x62,0xDf,0x3a,0x51,0xd7,0xEf,0x47,0xE7,0x98,0xA7,0x10,0x7E}, "WOLK ", 18}, + {{0xd1,0x8e,0x45,0x4d,0x84,0x4e,0xb0,0x00,0x9d,0x32,0xe0,0x7a,0x0c,0xde,0x89,0xe1,0x8d,0x64,0xcf,0xb4}, "WORK ", 18}, + {{0x62,0x08,0x72,0x45,0x08,0x71,0x25,0xd3,0xdb,0x5b,0x9a,0x3d,0x71,0x3d,0x78,0xe7,0xbb,0xc3,0x1e,0x54}, "WPC ", 18}, + {{0x4C,0xF4,0x88,0x38,0x7F,0x03,0x5F,0xF0,0x8c,0x37,0x15,0x15,0x56,0x2C,0xBa,0x71,0x2f,0x90,0x15,0xd4}, "WPR ", 18}, + {{0x71,0xe8,0xd7,0x4f,0xf1,0xc9,0x23,0xe3,0x69,0xd0,0xe7,0x0d,0xfb,0x09,0x86,0x66,0x29,0xc4,0xdd,0x35}, "WRK ", 18}, + {{0xb7,0xcb,0x1c,0x96,0xdb,0x6b,0x22,0xb0,0xd3,0xd9,0x53,0x6e,0x01,0x08,0xd0,0x62,0xbd,0x48,0x8f,0x74}, "WTC ", 18}, + {{0xd8,0x95,0x0f,0xDe,0xaa,0x10,0x30,0x4B,0x7A,0x7F,0xd0,0x3a,0x2F,0xC6,0x6B,0xC3,0x9f,0x3c,0x71,0x1a}, "WYS ", 18}, + {{0x05,0x60,0x17,0xc5,0x5a,0xE7,0xAE,0x32,0xd1,0x2A,0xeF,0x7C,0x67,0x9d,0xF8,0x3A,0x85,0xca,0x75,0xFf}, "WYV ", 18}, + {{0x91,0x0D,0xfc,0x18,0xD6,0xEA,0x3D,0x6a,0x71,0x24,0xA6,0xF8,0xB5,0x45,0x8F,0x28,0x10,0x60,0xfa,0x4c}, "X8X ", 18}, + {{0x4D,0xF8,0x12,0xF6,0x06,0x4d,0xef,0x1e,0x5e,0x02,0x9f,0x1c,0xa8,0x58,0x77,0x7C,0xC9,0x8D,0x2D,0x81}, "XAUR ", 8}, + {{0x28,0xde,0xe0,0x1d,0x53,0xfe,0xd0,0xed,0xf5,0xf6,0xe3,0x10,0xbf,0x8e,0xf9,0x31,0x15,0x13,0xae,0x40}, "XBP ", 18}, + {{0x4d,0x82,0x9f,0x8c,0x92,0xa6,0x69,0x1c,0x56,0x30,0x0d,0x02,0x0c,0x9e,0x0d,0xb9,0x84,0xcf,0xe2,0xba}, "XCC ", 18}, + {{0x16,0xaF,0x5b,0xfb,0x4A,0xe7,0xE4,0x75,0xb9,0xaD,0xC3,0xBf,0x5C,0xb2,0xf1,0xE6,0xa5,0x0d,0x79,0x40}, "XFS ", 8}, + {{0xf6,0xb6,0xaa,0x0e,0xf0,0xf5,0xed,0xc2,0xc1,0xc5,0xd9,0x25,0x47,0x7f,0x97,0xea,0xf6,0x63,0x03,0xe7}, "XGG ", 8}, + {{0x53,0x3e,0xf0,0x98,0x4b,0x2F,0xAA,0x22,0x7A,0xcC,0x62,0x0C,0x67,0xcc,0xe1,0x2a,0xA3,0x9C,0xD8,0xCD}, "XGM ", 8}, + {{0x30,0xf4,0xA3,0xe0,0xaB,0x7a,0x76,0x73,0x3D,0x8b,0x60,0xb8,0x9D,0xD9,0x3c,0x3D,0x0b,0x4c,0x9E,0x2f}, "XGT ", 18}, + {{0xB1,0x10,0xeC,0x7B,0x1d,0xcb,0x8F,0xAB,0x8d,0xED,0xbf,0x28,0xf5,0x3B,0xc6,0x3e,0xA5,0xBE,0xdd,0x84}, "XID ", 8}, + {{0xBC,0x86,0x72,0x7E,0x77,0x0d,0xe6,0x8B,0x10,0x60,0xC9,0x1f,0x6B,0xB6,0x94,0x5c,0x73,0xe1,0x03,0x88}, "XNK ", 18}, + {{0xab,0x95,0xe9,0x15,0xc1,0x23,0xfd,0xed,0x5b,0xdf,0xb6,0x32,0x5e,0x35,0xef,0x55,0x15,0xf1,0xea,0x69}, "XNN ", 18}, + {{0x57,0x2e,0x6f,0x31,0x80,0x56,0xba,0x0c,0x5d,0x47,0xa4,0x22,0x65,0x31,0x13,0x84,0x3d,0x25,0x06,0x91}, "XNT ", 0}, + {{0xB2,0x47,0x54,0xbE,0x79,0x28,0x15,0x53,0xdc,0x1a,0xdC,0x16,0x0d,0xdF,0x5C,0xd9,0xb7,0x43,0x61,0xa4}, "XRL ", 9}, + {{0x0F,0x51,0x3f,0xFb,0x49,0x26,0xff,0x82,0xD7,0xF6,0x0A,0x05,0x06,0x90,0x47,0xAc,0xA2,0x95,0xC4,0x13}, "XSC ", 18}, + {{0x6f,0x7a,0x4b,0xac,0x33,0x15,0xb5,0x08,0x2f,0x79,0x31,0x61,0xa2,0x2e,0x26,0x66,0x6d,0x22,0x71,0x7f}, "YEED ", 18}, + {{0x0F,0x33,0xbb,0x20,0xa2,0x82,0xA7,0x64,0x9C,0x7B,0x3A,0xFf,0x64,0x4F,0x08,0x4a,0x93,0x48,0xe9,0x33}, "YUPIE ", 18}, + {{0x67,0x81,0xa0,0xf8,0x4c,0x7e,0x9e,0x84,0x6d,0xcb,0x84,0xa9,0xa5,0xbd,0x49,0x33,0x30,0x67,0xb1,0x04}, "ZAP ", 18}, + {{0x05,0xf4,0xa4,0x2e,0x25,0x1f,0x2d,0x52,0xb8,0xed,0x15,0xE9,0xFE,0xdA,0xac,0xFc,0xEF,0x1F,0xAD,0x27}, "ZIL ", 12}, + {{0x55,0x4f,0xfc,0x77,0xf4,0x25,0x1a,0x9f,0xb3,0xc0,0xe3,0x59,0x0a,0x6a,0x20,0x5f,0x8d,0x4e,0x06,0x7d}, "ZMN ", 18}, + {{0xE4,0x1d,0x24,0x89,0x57,0x1d,0x32,0x21,0x89,0x24,0x6D,0xaF,0xA5,0xeb,0xDe,0x1F,0x46,0x99,0xF4,0x98}, "ZRX ", 18}, + {{0xe3,0x86,0xb1,0x39,0xed,0x37,0x15,0xca,0x4b,0x18,0xfd,0x52,0x67,0x1b,0xdc,0xea,0x1c,0xdf,0xe4,0xb1}, "ZST ", 8}, }; -#elif defined(CHAIN_TYPE_UBIQ) +const tokenDefinition_t const TOKENS_ETHEREUM_CLASSIC[NUM_TOKENS_ETHEREUM_CLASSIC] = {}; -const tokenDefinition_t const TOKENS[NUM_TOKENS] = { +const tokenDefinition_t const TOKENS_POA[NUM_TOKENS_POA] = {}; - {{0xd2, 0x45, 0x20, 0x7c, 0xfb, 0xf6, 0xeb, 0x6f, 0x34, 0x97, - 0x0d, 0xb2, 0xa8, 0x07, 0xab, 0x1d, 0x17, 0x8f, 0xde, 0x6c}, - "APX ", - 8}, - {{0xff, 0x3b, 0xf0, 0x57, 0xad, 0xf3, 0xb0, 0xe0, 0x15, 0xb6, - 0x46, 0x53, 0x31, 0xa6, 0x23, 0x6e, 0x55, 0x68, 0x82, 0x74}, - "BEER ", - 0}, - {{0x08, 0x53, 0x3d, 0x6a, 0x06, 0xce, 0x36, 0x52, 0x98, 0xb1, - 0x2e, 0xf9, 0x2e, 0xb4, 0x07, 0xcb, 0xa8, 0xaa, 0x82, 0x73}, - "CEFS ", - 8}, - {{0x94, 0xad, 0x7e, 0x41, 0xc1, 0xd4, 0x40, 0x22, 0xc4, 0xf4, - 0x7c, 0xb1, 0xba, 0x01, 0x9f, 0xd1, 0xa0, 0x22, 0xc5, 0x36}, - "DOT ", - 8}, - {{0x4b, 0x48, 0x99, 0xa1, 0x0f, 0x3e, 0x50, 0x7d, 0xb2, 0x07, - 0xb0, 0xee, 0x24, 0x26, 0x02, 0x9e, 0xfa, 0x16, 0x8a, 0x67}, - "QWRK ", - 8}, - {{0x5e, 0x17, 0x15, 0xbb, 0x79, 0x80, 0x5b, 0xd6, 0x72, 0x72, - 0x97, 0x60, 0xb3, 0xf7, 0xf3, 0x4d, 0x6f, 0x48, 0x50, 0x98}, - "RCKS ", - 8}, +const tokenDefinition_t const TOKENS_RSK[NUM_TOKENS_RSK] = {}; +const tokenDefinition_t const TOKENS_UBIQ[NUM_TOKENS_UBIQ] = { + {{0xd2,0x45,0x20,0x7c,0xfb,0xf6,0xeb,0x6f,0x34,0x97,0x0d,0xb2,0xa8,0x07,0xab,0x1d,0x17,0x8f,0xde,0x6c}, "APX ", 8}, + {{0xff,0x3b,0xf0,0x57,0xad,0xf3,0xb0,0xe0,0x15,0xb6,0x46,0x53,0x31,0xa6,0x23,0x6e,0x55,0x68,0x82,0x74}, "BEER ", 0}, + {{0x08,0x53,0x3d,0x6a,0x06,0xce,0x36,0x52,0x98,0xb1,0x2e,0xf9,0x2e,0xb4,0x07,0xcb,0xa8,0xaa,0x82,0x73}, "CEFS ", 8}, + {{0x94,0xad,0x7e,0x41,0xc1,0xd4,0x40,0x22,0xc4,0xf4,0x7c,0xb1,0xba,0x01,0x9f,0xd1,0xa0,0x22,0xc5,0x36}, "DOT ", 8}, + {{0x4b,0x48,0x99,0xa1,0x0f,0x3e,0x50,0x7d,0xb2,0x07,0xb0,0xee,0x24,0x26,0x02,0x9e,0xfa,0x16,0x8a,0x67}, "QWARK ", 8}, + {{0x5e,0x17,0x15,0xbb,0x79,0x80,0x5b,0xd6,0x72,0x72,0x97,0x60,0xb3,0xf7,0xf3,0x4d,0x6f,0x48,0x50,0x98}, "RICKS ", 8}, }; -#elif defined(CHAIN_TYPE_EXPANSE) +const tokenDefinition_t const TOKENS_EXPANSE[NUM_TOKENS_EXPANSE] = {}; -const tokenDefinition_t const TOKENS[NUM_TOKENS] = {}; +const tokenDefinition_t const TOKENS_WANCHAIN[NUM_TOKENS_WANCHAIN] = {}; -#endif +const tokenDefinition_t const TOKENS_KUSD[NUM_TOKENS_KUSD] = {}; diff --git a/src_genericwallet/tokens.h b/src_genericwallet/tokens.h index 727c318..1066c35 100644 --- a/src_genericwallet/tokens.h +++ b/src_genericwallet/tokens.h @@ -19,16 +19,24 @@ typedef struct tokenDefinition_t { uint8_t address[20]; - uint8_t ticker[6]; + uint8_t ticker[10]; uint8_t decimals; } tokenDefinition_t; -#if defined(CHAIN_TYPE_ETHEREUM) -#define NUM_TOKENS 340 -#elif defined(CHAIN_TYPE_UBIQ) -#define NUM_TOKENS 6 -#elif defined(CHAIN_TYPE_EXPANSE) -#define NUM_TOKENS 0 -#endif +#define NUM_TOKENS_ETHEREUM 677 +#define NUM_TOKENS_ETHEREUM_CLASSIC 0 +#define NUM_TOKENS_POA 0 +#define NUM_TOKENS_RSK 0 +#define NUM_TOKENS_UBIQ 6 +#define NUM_TOKENS_EXPANSE 0 +#define NUM_TOKENS_WANCHAIN 0 +#define NUM_TOKENS_KUSD 0 -extern tokenDefinition_t const TOKENS[NUM_TOKENS]; +extern tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM]; +extern tokenDefinition_t const TOKENS_ETHEREUM_CLASSIC[NUM_TOKENS_ETHEREUM_CLASSIC]; +extern tokenDefinition_t const TOKENS_POA[NUM_TOKENS_POA]; +extern tokenDefinition_t const TOKENS_RSK[NUM_TOKENS_RSK]; +extern tokenDefinition_t const TOKENS_UBIQ[NUM_TOKENS_UBIQ]; +extern tokenDefinition_t const TOKENS_EXPANSE[NUM_TOKENS_EXPANSE]; +extern tokenDefinition_t const TOKENS_WANCHAIN[NUM_TOKENS_WANCHAIN]; +extern tokenDefinition_t const TOKENS_KUSD[NUM_TOKENS_KUSD]; diff --git a/src_genericwallet/u2f_io.c b/src_genericwallet/u2f_io.c deleted file mode 100644 index 32b51ab..0000000 --- a/src_genericwallet/u2f_io.c +++ /dev/null @@ -1,79 +0,0 @@ -#ifdef HAVE_U2F - -/* -******************************************************************************* -* Portable FIDO U2F implementation -* Ledger Blue specific initialization -* (c) 2016 Ledger -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ - -#include -#include -#include "os.h" - -#include "os_io_seproxyhal.h" - -#include "u2f_io.h" -#include "u2f_transport.h" - -extern void u2f_reset_display(void); - -volatile unsigned char u2fCommandSent = 0; -volatile unsigned char u2fFirstCommand = 0; -volatile unsigned char u2fClosed = 0; - -void u2f_io_open_session(void) { - // PRINTF("u2f_io_open_session\n"); - u2fCommandSent = 0; - u2fFirstCommand = 1; - u2fClosed = 0; -} - -unsigned char u2fSegment[MAX_SEGMENT_SIZE]; - -void u2f_io_send(uint8_t *buffer, uint16_t length, - u2f_transport_media_t media) { - if (media == U2F_MEDIA_USB) { - os_memset(u2fSegment, 0, sizeof(u2fSegment)); - } - os_memmove(u2fSegment, buffer, length); - // PRINTF("u2f_io_send\n"); - if (u2fFirstCommand) { - u2fFirstCommand = 0; - } - switch (media) { - case U2F_MEDIA_USB: - io_usb_send_apdu_data(u2fSegment, USB_SEGMENT_SIZE); - break; -#ifdef HAVE_BLE - case U2F_MEDIA_BLE: - BLE_protocol_send(buffer, length); - break; -#endif - default: - PRINTF("Request to send on unsupported media %d\n", media); - break; - } -} - -void u2f_io_close_session(void) { - // PRINTF("u2f_close_session\n"); - if (!u2fClosed) { - // u2f_reset_display(); - u2fClosed = 1; - } -} - -#endif diff --git a/src_genericwallet/u2f_io.h b/src_genericwallet/u2f_io.h deleted file mode 100644 index 495b222..0000000 --- a/src_genericwallet/u2f_io.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -******************************************************************************* -* Portable FIDO U2F implementation -* (c) 2016 Ledger -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ - -#include -#include -#include - -#ifndef __U2F_IO_H__ - -#define __U2F_IO_H__ - -#include "u2f_service.h" - -#define EXCEPTION_DISCONNECT 0x80 - -void u2f_io_open_session(void); -void u2f_io_send(uint8_t *buffer, uint16_t length, u2f_transport_media_t media); -void u2f_io_close_session(void); - -#endif diff --git a/src_genericwallet/u2f_processing.c b/src_genericwallet/u2f_processing.c deleted file mode 100644 index 407ca1f..0000000 --- a/src_genericwallet/u2f_processing.c +++ /dev/null @@ -1,281 +0,0 @@ -#ifdef HAVE_U2F - -/* -******************************************************************************* -* Portable FIDO U2F implementation -* (c) 2016 Ledger -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ - -#include -#include -#include "os.h" -#include "cx.h" -#include "u2f_service.h" -#include "u2f_transport.h" -#include "u2f_processing.h" - -void handleApdu(volatile unsigned int *flags, volatile unsigned int *tx); -void u2f_proxy_response(u2f_service_t *service, unsigned int tx); - -static const uint8_t SW_SUCCESS[] = {0x90, 0x00}; -static const uint8_t SW_PROOF_OF_PRESENCE_REQUIRED[] = {0x69, 0x85}; -static const uint8_t SW_BAD_KEY_HANDLE[] = {0x6A, 0x80}; - -static const uint8_t VERSION[] = {'U', '2', 'F', '_', 'V', '2', 0x90, 0x00}; -static const uint8_t DUMMY_ZERO[] = {0x00}; - -static const uint8_t SW_UNKNOWN_INSTRUCTION[] = {0x6d, 0x00}; -static const uint8_t SW_UNKNOWN_CLASS[] = {0x6e, 0x00}; -static const uint8_t SW_WRONG_LENGTH[] = {0x67, 0x00}; -static const uint8_t SW_INTERNAL[] = {0x6F, 0x00}; - -static const uint8_t NOTIFY_USER_PRESENCE_NEEDED[] = { - KEEPALIVE_REASON_TUP_NEEDED}; - -static const uint8_t PROXY_MAGIC[] = {'w', '0', 'w'}; - -#define INIT_U2F_VERSION 0x02 -#define INIT_DEVICE_VERSION_MAJOR 0 -#define INIT_DEVICE_VERSION_MINOR 1 -#define INIT_BUILD_VERSION 0 -#define INIT_CAPABILITIES 0x00 - -#define FIDO_CLA 0x00 -#define FIDO_INS_ENROLL 0x01 -#define FIDO_INS_SIGN 0x02 -#define FIDO_INS_GET_VERSION 0x03 - -#define FIDO_INS_PROP_GET_COUNTER 0xC0 // U2F_VENDOR_FIRST - -#define P1_SIGN_CHECK_ONLY 0x07 -#define P1_SIGN_SIGN 0x03 - -#define U2F_ENROLL_RESERVED 0x05 -#define SIGN_USER_PRESENCE_MASK 0x01 - -#define MAX_SEQ_TIMEOUT_MS 500 -#define MAX_KEEPALIVE_TIMEOUT_MS 500 - -static const uint8_t DUMMY_USER_PRESENCE[] = {SIGN_USER_PRESENCE_MASK}; - - -void u2f_handle_enroll(u2f_service_t *service, uint8_t p1, uint8_t p2, - uint8_t *buffer, uint16_t length) { - (void)p1; - (void)p2; - (void)buffer; - if (length != 32 + 32) { - u2f_send_fragmented_response(service, U2F_CMD_MSG, - (uint8_t *)SW_WRONG_LENGTH, - sizeof(SW_WRONG_LENGTH), true); - return; - } - u2f_send_fragmented_response(service, U2F_CMD_MSG, (uint8_t *)SW_INTERNAL, - sizeof(SW_INTERNAL), true); -} - -void u2f_handle_sign(u2f_service_t *service, uint8_t p1, uint8_t p2, - uint8_t *buffer, uint16_t length) { - (void)p1; - (void)p2; - (void)length; - uint8_t keyHandleLength; - uint8_t i; - volatile unsigned int flags = 0; - volatile unsigned int tx = 0; - - if (length < 32 + 32 + 1) { - u2f_send_fragmented_response(service, U2F_CMD_MSG, - (uint8_t *)SW_WRONG_LENGTH, - sizeof(SW_WRONG_LENGTH), true); - return; - } - if ((p1 != P1_SIGN_CHECK_ONLY) && (p1 != P1_SIGN_SIGN)) { - u2f_response_error(service, ERROR_PROP_INVALID_PARAMETERS_APDU, true, - service->channel); - return; - } - - - keyHandleLength = buffer[64]; - for (i = 0; i < keyHandleLength; i++) { - buffer[65 + i] ^= PROXY_MAGIC[i % sizeof(PROXY_MAGIC)]; - } - // Check magic - if (length != (32 + 32 + 1 + 5 + buffer[65 + 4])) { - u2f_send_fragmented_response(service, U2F_CMD_MSG, - (uint8_t *)SW_BAD_KEY_HANDLE, - sizeof(SW_BAD_KEY_HANDLE), true); - } - // Check that it looks like an APDU - os_memmove(G_io_apdu_buffer, buffer + 65, keyHandleLength); - handleApdu(&flags, &tx); - if ((flags & IO_ASYNCH_REPLY) == 0) { - u2f_proxy_response(service, tx); - } -} - -void u2f_handle_get_version(u2f_service_t *service, uint8_t p1, uint8_t p2, - uint8_t *buffer, uint16_t length) { - // screen_printf("U2F version\n"); - (void)p1; - (void)p2; - (void)buffer; - if (length != 0) { - u2f_send_fragmented_response(service, U2F_CMD_MSG, - (uint8_t *)SW_WRONG_LENGTH, - sizeof(SW_WRONG_LENGTH), true); - return; - } - u2f_send_fragmented_response(service, U2F_CMD_MSG, (uint8_t *)VERSION, - sizeof(VERSION), true); -} - -void u2f_handle_cmd_init(u2f_service_t *service, uint8_t *buffer, - uint16_t length, uint8_t *channelInit) { - // screen_printf("U2F init\n"); - uint8_t channel[4]; - (void)length; - uint16_t offset = 0; - if (u2f_is_channel_forbidden(channelInit)) { - u2f_response_error(service, ERROR_INVALID_CID, true, channelInit); - return; - } - if (u2f_is_channel_broadcast(channelInit)) { - cx_rng(channel, 4); - } else { - os_memmove(channel, channelInit, 4); - } - os_memmove(service->messageBuffer + offset, buffer, 8); - offset += 8; - os_memmove(service->messageBuffer + offset, channel, 4); - offset += 4; - service->messageBuffer[offset++] = INIT_U2F_VERSION; - service->messageBuffer[offset++] = INIT_DEVICE_VERSION_MAJOR; - service->messageBuffer[offset++] = INIT_DEVICE_VERSION_MINOR; - service->messageBuffer[offset++] = INIT_BUILD_VERSION; - service->messageBuffer[offset++] = INIT_CAPABILITIES; - if (u2f_is_channel_broadcast(channelInit)) { - os_memset(service->channel, 0xff, 4); - } else { - os_memmove(service->channel, channel, 4); - } - service->keepUserPresence = true; - u2f_send_fragmented_response(service, U2F_CMD_INIT, service->messageBuffer, - offset, true); - // os_memmove(service->channel, channel, 4); -} - -void u2f_handle_cmd_ping(u2f_service_t *service, uint8_t *buffer, - uint16_t length) { - // screen_printf("U2F ping\n"); - u2f_send_fragmented_response(service, U2F_CMD_PING, buffer, length, true); -} - -void u2f_handle_cmd_msg(u2f_service_t *service, uint8_t *buffer, - uint16_t length) { - // screen_printf("U2F msg\n"); - uint8_t cla = buffer[0]; - uint8_t ins = buffer[1]; - uint8_t p1 = buffer[2]; - uint8_t p2 = buffer[3]; - uint32_t dataLength = (buffer[4] << 16) | (buffer[5] << 8) | (buffer[6]); - if ((dataLength != (uint16_t)(length - 9)) && - (dataLength != (uint16_t)(length - 7))) { // Le is optional - u2f_send_fragmented_response(service, U2F_CMD_MSG, - (uint8_t *)SW_WRONG_LENGTH, - sizeof(SW_WRONG_LENGTH), true); - return; - } - if (cla != FIDO_CLA) { - u2f_send_fragmented_response(service, U2F_CMD_MSG, - (uint8_t *)SW_UNKNOWN_CLASS, - sizeof(SW_UNKNOWN_CLASS), true); - return; - } - switch (ins) { - case FIDO_INS_ENROLL: - // screen_printf("enroll\n"); - u2f_handle_enroll(service, p1, p2, buffer + 7, dataLength); - break; - case FIDO_INS_SIGN: - // screen_printf("sign\n"); - u2f_handle_sign(service, p1, p2, buffer + 7, dataLength); - break; - case FIDO_INS_GET_VERSION: - // screen_printf("version\n"); - u2f_handle_get_version(service, p1, p2, buffer + 7, dataLength); - break; - default: - // screen_printf("unsupported\n"); - u2f_send_fragmented_response(service, U2F_CMD_MSG, - (uint8_t *)SW_UNKNOWN_INSTRUCTION, - sizeof(SW_UNKNOWN_INSTRUCTION), true); - return; - } -} - -void u2f_process_message(u2f_service_t *service, uint8_t *buffer, - uint8_t *channel) { - uint8_t cmd = buffer[0]; - uint16_t length = (buffer[1] << 8) | (buffer[2]); - switch (cmd) { - case U2F_CMD_INIT: - u2f_handle_cmd_init(service, buffer + 3, length, channel); - break; - case U2F_CMD_PING: - service->pendingContinuation = false; - u2f_handle_cmd_ping(service, buffer + 3, length); - break; - case U2F_CMD_MSG: - service->pendingContinuation = false; - if (!service->noReentry && service->runningCommand) { - u2f_response_error(service, ERROR_CHANNEL_BUSY, false, - service->channel); - break; - } - service->runningCommand = true; - u2f_handle_cmd_msg(service, buffer + 3, length); - break; - } -} - -void u2f_timeout(u2f_service_t *service) { - service->timerNeedGeneralStatus = true; - if ((service->transportMedia == U2F_MEDIA_USB) && - (service->pendingContinuation)) { - service->seqTimeout += service->timerInterval; - if (service->seqTimeout > MAX_SEQ_TIMEOUT_MS) { - service->pendingContinuation = false; - u2f_response_error(service, ERROR_MSG_TIMEOUT, true, - service->lastContinuationChannel); - } - } -#ifdef HAVE_BLE - if ((service->transportMedia == U2F_MEDIA_BLE) && - (service->requireKeepalive)) { - service->keepaliveTimeout += service->timerInterval; - if (service->keepaliveTimeout > MAX_KEEPALIVE_TIMEOUT_MS) { - service->keepaliveTimeout = 0; - u2f_send_fragmented_response(service, U2F_CMD_KEEPALIVE, - (uint8_t *)NOTIFY_USER_PRESENCE_NEEDED, - sizeof(NOTIFY_USER_PRESENCE_NEEDED), - false); - } - } -#endif -} - -#endif diff --git a/src_genericwallet/u2f_processing.h b/src_genericwallet/u2f_processing.h deleted file mode 100644 index 429c9ba..0000000 --- a/src_genericwallet/u2f_processing.h +++ /dev/null @@ -1,29 +0,0 @@ -/* -******************************************************************************* -* Portable FIDO U2F implementation -* (c) 2016 Ledger -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ - -#ifndef __U2F_PROCESSING_H__ - -#define __U2F_PROCESSING_H__ - -void u2f_process_message(u2f_service_t *service, uint8_t *buffer, - uint8_t *channel); -void u2f_timeout(u2f_service_t *service); - -void u2f_handle_ux_callback(u2f_service_t *service); - -#endif diff --git a/src_genericwallet/u2f_service.c b/src_genericwallet/u2f_service.c deleted file mode 100644 index b7a7b9c..0000000 --- a/src_genericwallet/u2f_service.c +++ /dev/null @@ -1,146 +0,0 @@ -#ifdef HAVE_U2F - -/* -******************************************************************************* -* Portable FIDO U2F implementation -* (c) 2016 Ledger -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ - -#include -#include -#include "u2f_service.h" -#include "u2f_transport.h" -#include "u2f_processing.h" -#include "u2f_timer.h" - -// not too fast blinking -#define DEFAULT_TIMER_INTERVAL_MS 500 - -void u2f_reset(u2f_service_t *service, bool keepUserPresence) { - service->transportState = U2F_IDLE; - service->runningCommand = false; - // service->promptUserPresence = false; - if (service->keepUserPresence) { - keepUserPresence = true; - service->keepUserPresence = false; - } -#ifdef HAVE_NO_USER_PRESENCE_CHECK - service->keepUserPresence = true; - service->userPresence = true; -#endif // HAVE_NO_USER_PRESENCE_CHECK -} - -void u2f_initialize_service(u2f_service_t *service) { - service->handleFunction = (u2fHandle_t)u2f_process_message; - service->timeoutFunction = (u2fTimer_t)u2f_timeout; - service->timerInterval = DEFAULT_TIMER_INTERVAL_MS; - u2f_reset(service, false); - service->promptUserPresence = false; - service->userPresence = false; -#ifdef HAVE_NO_USER_PRESENCE_CHECK - service->keepUserPresence = true; - service->userPresence = true; -#endif // HAVE_NO_USER_PRESENCE_CHECK -} - -void u2f_send_direct_response_short(u2f_service_t *service, uint8_t *buffer, - uint16_t len) { - (void)service; - uint16_t maxSize = 0; - switch (service->packetMedia) { - case U2F_MEDIA_USB: - maxSize = USB_SEGMENT_SIZE; - break; -#ifdef HAVE_BLE - case U2F_MEDIA_BLE: - maxSize = service->bleMtu; - break; -#endif - default: - PRINTF("Request to send on unsupported media %d\n", - service->packetMedia); - break; - } - if (len > maxSize) { - return; - } - u2f_io_send(buffer, len, service->packetMedia); - u2f_io_close_session(); -} - -void u2f_send_fragmented_response(u2f_service_t *service, uint8_t cmd, - uint8_t *buffer, uint16_t len, - bool resetAfterSend) { - if (resetAfterSend) { - service->transportState = U2F_SENDING_RESPONSE; - } - service->sending = true; - service->sendPacketIndex = 0; - service->sendBuffer = buffer; - service->sendOffset = 0; - service->sendLength = len; - service->sendCmd = cmd; - service->resetAfterSend = resetAfterSend; - u2f_continue_sending_fragmented_response(service); -} - -void u2f_continue_sending_fragmented_response(u2f_service_t *service) { - do { - uint16_t channelHeader = - (service->transportMedia == U2F_MEDIA_USB ? 4 : 0); - uint8_t headerSize = - (service->sendPacketIndex == 0 ? (channelHeader + 3) - : (channelHeader + 1)); - uint16_t maxBlockSize = - (service->transportMedia == U2F_MEDIA_USB ? USB_SEGMENT_SIZE - : service->bleMtu); - uint16_t blockSize = ((service->sendLength - service->sendOffset) > - (maxBlockSize - headerSize) - ? (maxBlockSize - headerSize) - : service->sendLength - service->sendOffset); - uint16_t dataSize = blockSize + headerSize; - uint16_t offset = 0; - // Fragment - if (service->transportMedia == U2F_MEDIA_USB) { - os_memset(service->outputBuffer, 0, USB_SEGMENT_SIZE); - os_memmove(service->outputBuffer + offset, service->channel, 4); - offset += 4; - } - if (service->sendPacketIndex == 0) { - service->outputBuffer[offset++] = service->sendCmd; - service->outputBuffer[offset++] = (service->sendLength >> 8); - service->outputBuffer[offset++] = (service->sendLength & 0xff); - } else { - service->outputBuffer[offset++] = (service->sendPacketIndex - 1); - } - if (service->sendBuffer != NULL) { - os_memmove(service->outputBuffer + headerSize, - service->sendBuffer + service->sendOffset, blockSize); - } - u2f_io_send(service->outputBuffer, dataSize, service->packetMedia); - service->sendOffset += blockSize; - service->sendPacketIndex++; - } while (service->sendOffset != service->sendLength); - if (service->sendOffset == service->sendLength) { - u2f_io_close_session(); - service->sending = false; - if (service->resetAfterSend) { - u2f_reset(service, false); - } - } -} - - -#endif diff --git a/src_genericwallet/u2f_service.h b/src_genericwallet/u2f_service.h deleted file mode 100644 index a78319b..0000000 --- a/src_genericwallet/u2f_service.h +++ /dev/null @@ -1,112 +0,0 @@ -/* -******************************************************************************* -* Portable FIDO U2F implementation -* (c) 2016 Ledger -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ - -#include -#include -#include - -#ifndef __U2F_SERVICE_H__ - -#define __U2F_SERVICE_H__ - -struct u2f_service_t; - -typedef void (*u2fHandle_t)(struct u2f_service_t *service, uint8_t *inputBuffer, - uint8_t *channel); -typedef void (*u2fPromptUserPresence_t)(struct u2f_service_t *service, - bool enroll, - uint8_t *applicationParameter); -typedef void (*u2fTimer_t)(struct u2f_service_t *service); - -typedef enum { - U2F_IDLE, - U2F_HANDLE_SEGMENTED, - U2F_PROCESSING_COMMAND, - U2F_SENDING_RESPONSE -} u2f_transport_state_t; - -typedef enum { - U2F_MEDIA_NONE, - U2F_MEDIA_USB, - U2F_MEDIA_NFC, - U2F_MEDIA_BLE -} u2f_transport_media_t; - -typedef struct u2f_service_t { - // Internal - - uint8_t channel[4]; - uint8_t lastContinuationChannel[4]; - uint16_t transportOffset; - u2f_transport_state_t transportState; - u2f_transport_media_t transportMedia; - u2f_transport_media_t packetMedia; - uint8_t expectedContinuationPacket; - uint16_t lastCommandLength; - bool runningCommand; - - u2fHandle_t handleFunction; - - bool userPresence; - bool promptUserPresence; - bool reportUserPresence; - bool keepUserPresence; - u2fPromptUserPresence_t promptUserPresenceFunction; - - u2fTimer_t timeoutFunction; - uint32_t timerInterval; - bool timerNeedGeneralStatus; - uint32_t seqTimeout; - bool pendingContinuation; - bool requireKeepalive; - uint32_t keepaliveTimeout; - - bool sending; - uint8_t sendPacketIndex; - uint8_t *sendBuffer; - uint16_t sendOffset; - uint16_t sendLength; - uint8_t sendCmd; - bool resetAfterSend; - - // External, to be filled - - uint8_t *inputBuffer; - uint8_t *outputBuffer; - uint8_t *messageBuffer; - uint16_t messageBufferSize; - uint8_t *confirmedApplicationParameter; - bool noReentry; - uint16_t bleMtu; -} u2f_service_t; - -void u2f_initialize_service(u2f_service_t *service); -void u2f_send_direct_response_short(u2f_service_t *service, uint8_t *buffer, - uint16_t len); -void u2f_send_fragmented_response(u2f_service_t *service, uint8_t cmd, - uint8_t *buffer, uint16_t len, - bool resetAfterSend); -void u2f_confirm_user_presence(u2f_service_t *service, bool userPresence, - bool resume); -void u2f_continue_sending_fragmented_response(u2f_service_t *service); -void u2f_reset(u2f_service_t *service, bool keepUserPresence); - -// export global -extern volatile u2f_service_t u2fService; - -#endif diff --git a/src_genericwallet/u2f_timer.h b/src_genericwallet/u2f_timer.h deleted file mode 100644 index 9a845ab..0000000 --- a/src_genericwallet/u2f_timer.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -******************************************************************************* -* Portable FIDO U2F implementation -* (c) 2016 Ledger -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ - -#include -#include -#include - -#ifndef __U2F_TIMER_H__ - -#define __U2F_TIMER_H__ - -typedef void (*u2fTimer_t)(struct u2f_service_t *service); - -void u2f_timer_init(void); -void u2f_timer_register(uint32_t timerMs, u2fTimer_t timerCallback); -void u2f_timer_cancel(void); - -#endif diff --git a/src_genericwallet/u2f_transport.c b/src_genericwallet/u2f_transport.c deleted file mode 100644 index 38fe6b4..0000000 --- a/src_genericwallet/u2f_transport.c +++ /dev/null @@ -1,227 +0,0 @@ -#ifdef HAVE_U2F - -/* -******************************************************************************* -* Portable FIDO U2F implementation -* (c) 2016 Ledger -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ - -#include -#include -#include "u2f_service.h" -#include "u2f_transport.h" - -#define U2F_MASK_COMMAND 0x80 -#define U2F_COMMAND_HEADER_SIZE 3 - -static const uint8_t const BROADCAST_CHANNEL[] = {0xff, 0xff, 0xff, 0xff}; -static const uint8_t const FORBIDDEN_CHANNEL[] = {0x00, 0x00, 0x00, 0x00}; - -void u2f_transport_handle(u2f_service_t *service, uint8_t *buffer, - uint16_t size, u2f_transport_media_t media) { - uint16_t channelHeader = (media == U2F_MEDIA_USB ? 4 : 0); - uint8_t channel[4] = {0}; - if (media == U2F_MEDIA_USB) { - os_memmove(channel, buffer, 4); - } - // screen_printf("U2F transport\n"); - service->packetMedia = media; - u2f_io_open_session(); - // If busy, answer immediately - if (service->noReentry) { - if ((service->transportState == U2F_PROCESSING_COMMAND) || - (service->transportState == U2F_SENDING_RESPONSE)) { - u2f_response_error(service, ERROR_CHANNEL_BUSY, false, channel); - goto error; - } - } - if (size < (1 + channelHeader)) { - // Message to short, abort - u2f_response_error(service, ERROR_PROP_MESSAGE_TOO_SHORT, true, - channel); - goto error; - } - if ((buffer[channelHeader] & U2F_MASK_COMMAND) != 0) { - if (size < (channelHeader + 3)) { - // Message to short, abort - u2f_response_error(service, ERROR_PROP_MESSAGE_TOO_SHORT, true, - channel); - goto error; - } - // If waiting for a continuation on a different channel, reply BUSY - // immediately - if (media == U2F_MEDIA_USB) { - if ((service->pendingContinuation) && - (os_memcmp(channel, service->lastContinuationChannel, 4) != - 0) && - (buffer[channelHeader] != U2F_CMD_INIT)) { - u2f_response_error(service, ERROR_CHANNEL_BUSY, false, channel); - goto error; - } - } - // If a command was already sent, and we are not processing a INIT - // command, abort - if ((service->transportState == U2F_HANDLE_SEGMENTED) && - !((media == U2F_MEDIA_USB) && - (buffer[channelHeader] == U2F_CMD_INIT))) { - // Unexpected continuation at this stage, abort - u2f_response_error(service, ERROR_INVALID_SEQ, true, channel); - goto error; - } - // Check the length - uint16_t commandLength = - (buffer[channelHeader + 1] << 8) | (buffer[channelHeader + 2]); - if (commandLength > (service->messageBufferSize - 3)) { - // Overflow in message size, abort - u2f_response_error(service, ERROR_INVALID_LEN, true, channel); - goto error; - } - // Check if the command is supported - switch (buffer[channelHeader]) { - case U2F_CMD_PING: - case U2F_CMD_MSG: - if (media == U2F_MEDIA_USB) { - if (u2f_is_channel_broadcast(channel) || - u2f_is_channel_forbidden(channel)) { - u2f_response_error(service, ERROR_INVALID_CID, true, - channel); - goto error; - } - } - break; - case U2F_CMD_INIT: - if (media != U2F_MEDIA_USB) { - // Unknown command, abort - u2f_response_error(service, ERROR_INVALID_CMD, true, channel); - goto error; - } - break; - default: - // Unknown command, abort - u2f_response_error(service, ERROR_INVALID_CMD, true, channel); - goto error; - } - // Ok, initialize the buffer - os_memmove(service->channel, channel, 4); - service->lastCommandLength = commandLength; - service->expectedContinuationPacket = 0; - os_memmove(service->messageBuffer, buffer + channelHeader, - size - channelHeader); - service->transportOffset = size - channelHeader; - service->transportMedia = media; - } else { - // Continuation - if (size < (channelHeader + 2)) { - // Message to short, abort - u2f_response_error(service, ERROR_PROP_MESSAGE_TOO_SHORT, true, - channel); - goto error; - } - if (media != service->transportMedia) { - // Mixed medias - u2f_response_error(service, ERROR_PROP_MEDIA_MIXED, true, channel); - goto error; - } - if (service->transportState != U2F_HANDLE_SEGMENTED) { - // Unexpected continuation at this stage, abort - // TODO : review the behavior is HID only - if (media == U2F_MEDIA_USB) { - u2f_reset(service, true); - goto error; - } else { - u2f_response_error(service, ERROR_INVALID_SEQ, true, channel); - goto error; - } - } - if (media == U2F_MEDIA_USB) { - // Check the channel - if (os_memcmp(buffer, service->channel, 4) != 0) { - u2f_response_error(service, ERROR_CHANNEL_BUSY, true, channel); - goto error; - } - } - - if (buffer[channelHeader] != service->expectedContinuationPacket) { - // Bad continuation packet, abort - u2f_response_error(service, ERROR_INVALID_SEQ, true, channel); - goto error; - } - if ((service->transportOffset + (size - (channelHeader + 1))) > - (service->messageBufferSize - 3)) { - // Overflow, abort - u2f_response_error(service, ERROR_INVALID_LEN, true, channel); - goto error; - } - os_memmove(service->messageBuffer + service->transportOffset, - buffer + channelHeader + 1, size - (channelHeader + 1)); - service->transportOffset += size - (channelHeader + 1); - service->expectedContinuationPacket++; - } - // See if we can process the command - if ((media != U2F_MEDIA_USB) && - (service->transportOffset > - (service->lastCommandLength + U2F_COMMAND_HEADER_SIZE))) { - // Overflow, abort - u2f_response_error(service, ERROR_INVALID_LEN, true, channel); - goto error; - } else if (service->transportOffset >= - (service->lastCommandLength + U2F_COMMAND_HEADER_SIZE)) { - // screen_printf("Process command\n"); - service->transportState = U2F_PROCESSING_COMMAND; - service->handleFunction(service, service->messageBuffer, channel); - } else { - // screen_printf("segmented\n"); - service->seqTimeout = 0; - service->transportState = U2F_HANDLE_SEGMENTED; - service->pendingContinuation = true; - os_memmove(service->lastContinuationChannel, channel, 4); - u2f_io_close_session(); - } - return; -error: - if ((media == U2F_MEDIA_USB) && (service->pendingContinuation) && - (os_memcmp(channel, service->lastContinuationChannel, 4) == 0)) { - service->pendingContinuation = false; - } - return; -} - -void u2f_response_error(u2f_service_t *service, char errorCode, bool reset, - uint8_t *channel) { - uint8_t offset = 0; - os_memset(service->outputBuffer, 0, MAX_SEGMENT_SIZE); - if (service->transportMedia == U2F_MEDIA_USB) { - os_memmove(service->outputBuffer + offset, channel, 4); - offset += 4; - } - service->outputBuffer[offset++] = U2F_STATUS_ERROR; - service->outputBuffer[offset++] = 0x00; - service->outputBuffer[offset++] = 0x01; - service->outputBuffer[offset++] = errorCode; - u2f_send_direct_response_short(service, service->outputBuffer, offset); - if (reset) { - u2f_reset(service, true); - } -} - -bool u2f_is_channel_broadcast(uint8_t *channel) { - return (os_memcmp(channel, BROADCAST_CHANNEL, 4) == 0); -} - -bool u2f_is_channel_forbidden(uint8_t *channel) { - return (os_memcmp(channel, FORBIDDEN_CHANNEL, 4) == 0); -} - -#endif diff --git a/src_genericwallet/u2f_transport.h b/src_genericwallet/u2f_transport.h deleted file mode 100644 index 2d9dc5e..0000000 --- a/src_genericwallet/u2f_transport.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -******************************************************************************* -* Portable FIDO U2F implementation -* (c) 2016 Ledger -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ - -#ifndef __U2F_TRANSPORT_H__ - -#define __U2F_TRANSPORT_H__ - -#include "u2f_service.h" - -#define MAX_SEGMENT_SIZE \ - (USB_SEGMENT_SIZE > BLE_SEGMENT_SIZE ? USB_SEGMENT_SIZE : BLE_SEGMENT_SIZE) - -// Shared commands -#define U2F_CMD_PING 0x81 -#define U2F_CMD_MSG 0x83 - -// USB only commands -#define U2F_CMD_INIT 0x86 -#define U2F_CMD_LOCK 0x84 -#define U2F_CMD_WINK 0x88 - -// BLE only commands -#define U2F_CMD_KEEPALIVE 0x82 -#define KEEPALIVE_REASON_PROCESSING 0x01 -#define KEEPALIVE_REASON_TUP_NEEDED 0x02 - -#define U2F_STATUS_ERROR 0xBF - -// Shared errors -#define ERROR_NONE 0x00 -#define ERROR_INVALID_CMD 0x01 -#define ERROR_INVALID_PAR 0x02 -#define ERROR_INVALID_LEN 0x03 -#define ERROR_INVALID_SEQ 0x04 -#define ERROR_MSG_TIMEOUT 0x05 -#define ERROR_OTHER 0x7f -// USB only errors -#define ERROR_CHANNEL_BUSY 0x06 -#define ERROR_LOCK_REQUIRED 0x0a -#define ERROR_INVALID_CID 0x0b -#define ERROR_PROP_UNKNOWN_COMMAND 0x80 -#define ERROR_PROP_COMMAND_TOO_LONG 0x81 -#define ERROR_PROP_INVALID_CONTINUATION 0x82 -#define ERROR_PROP_UNEXPECTED_CONTINUATION 0x83 -#define ERROR_PROP_CONTINUATION_OVERFLOW 0x84 -#define ERROR_PROP_MESSAGE_TOO_SHORT 0x85 -#define ERROR_PROP_UNCONSISTENT_MSG_LENGTH 0x86 -#define ERROR_PROP_UNSUPPORTED_MSG_APDU 0x87 -#define ERROR_PROP_INVALID_DATA_LENGTH_APDU 0x88 -#define ERROR_PROP_INTERNAL_ERROR_APDU 0x89 -#define ERROR_PROP_INVALID_PARAMETERS_APDU 0x8A -#define ERROR_PROP_INVALID_DATA_APDU 0x8B -#define ERROR_PROP_DEVICE_NOT_SETUP 0x8C -#define ERROR_PROP_MEDIA_MIXED 0x8D - -void u2f_transport_handle(u2f_service_t *service, uint8_t *buffer, - uint16_t size, u2f_transport_media_t media); -void u2f_response_error(u2f_service_t *service, char errorCode, bool reset, - uint8_t *channel); -bool u2f_is_channel_broadcast(uint8_t *channel); -bool u2f_is_channel_forbidden(uint8_t *channel); - -#endif diff --git a/src_genericwallet/usbd_hid_impl.c b/src_genericwallet/usbd_hid_impl.c deleted file mode 100644 index 3b027a9..0000000 --- a/src_genericwallet/usbd_hid_impl.c +++ /dev/null @@ -1,545 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_hid.c - * @author MCD Application Team - * @version V2.2.0 - * @date 13-June-2014 - * @brief This file provides the HID core functions. - * - * @verbatim - * - * =================================================================== - * HID Class Description - * =================================================================== - * This module manages the HID class V1.11 following the "Device - *Class Definition - * for Human Interface Devices (HID) Version 1.11 Jun 27, 2001". - * This driver implements the following aspects of the specification: - * - The Boot Interface Subclass - * - Usage Page : Generic Desktop - * - Usage : Vendor - * - Collection : Application - * - * @note In HS mode and when the DMA is used, all variables and data - *structures - * dealing with the DMA during the transaction process should be - *32-bit aligned. - * - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2014 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ -#include "os.h" - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_hid.h" -#include "usbd_ctlreq.h" - -#include "usbd_core.h" -#include "usbd_conf.h" - -#include "usbd_def.h" -#include "os_io_seproxyhal.h" - -#include "u2f_service.h" -#include "u2f_transport.h" - -/** @togroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_HID - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_HID_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_HID_Private_Defines - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_HID_Private_Macros - * @{ - */ -/** - * @} - */ -/** @defgroup USBD_HID_Private_FunctionPrototypes - * @{ - */ - - -/** - * @} - */ - -/** @defgroup USBD_HID_Private_Variables - * @{ - */ - -#define HID_EPIN_ADDR 0x82 -#define HID_EPIN_SIZE 0x40 - -#define HID_EPOUT_ADDR 0x02 -#define HID_EPOUT_SIZE 0x40 - -#define USBD_LANGID_STRING 0x409 - -#ifdef HAVE_VID_PID_PROBER -#define USBD_VID 0x2581 -#define USBD_PID 0xf1d1 -#else -#define USBD_VID 0x2C97 -#if defined(TARGET_BLUE) // blue -#define USBD_PID 0x0000 -const uint8_t const USBD_PRODUCT_FS_STRING[] = { - 4 * 2 + 2, USB_DESC_TYPE_STRING, 'B', 0, 'l', 0, 'u', 0, 'e', 0, -}; - -#elif defined(TARGET_NANOS) // nano s -#define USBD_PID 0x0001 -const uint8_t const USBD_PRODUCT_FS_STRING[] = { - 6 * 2 + 2, USB_DESC_TYPE_STRING, - 'N', 0, - 'a', 0, - 'n', 0, - 'o', 0, - ' ', 0, - 'S', 0, -}; -#elif defined(TARGET_ARAMIS) // aramis -#define USBD_PID 0x0002 -const uint8_t const USBD_PRODUCT_FS_STRING[] = { - 6 * 2 + 2, USB_DESC_TYPE_STRING, - 'A', 0, - 'r', 0, - 'a', 0, - 'm', 0, - 'i', 0, - 's', 0, -}; -#else -#error unknown TARGET_ID -#endif -#endif - -/* USB Standard Device Descriptor */ -const uint8_t const USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] = { - USB_LEN_LANGID_STR_DESC, USB_DESC_TYPE_STRING, LOBYTE(USBD_LANGID_STRING), - HIBYTE(USBD_LANGID_STRING), -}; - -const uint8_t const USB_SERIAL_STRING[] = { - 4 * 2 + 2, USB_DESC_TYPE_STRING, '0', 0, '0', 0, '0', 0, '1', 0, -}; - -const uint8_t const USBD_MANUFACTURER_STRING[] = { - 6 * 2 + 2, USB_DESC_TYPE_STRING, - 'L', 0, - 'e', 0, - 'd', 0, - 'g', 0, - 'e', 0, - 'r', 0, -}; - -#define USBD_INTERFACE_FS_STRING USBD_PRODUCT_FS_STRING -#define USBD_CONFIGURATION_FS_STRING USBD_PRODUCT_FS_STRING - -const uint8_t const HID_ReportDesc[] = { - 0x06, 0xD0, 0xF1, // Usage page (vendor defined) - 0x09, 0x01, // Usage ID (vendor defined) - 0xA1, 0x01, // Collection (application) - - // The Input report - 0x09, 0x03, // Usage ID - vendor defined - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8 bits) - 0x95, HID_EPIN_SIZE, // Report Count (64 fields) - 0x81, 0x08, // Input (Data, Variable, Absolute) - - // The Output report - 0x09, 0x04, // Usage ID - vendor defined - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8 bits) - 0x95, HID_EPOUT_SIZE, // Report Count (64 fields) - 0x91, 0x08, // Output (Data, Variable, Absolute) - 0xC0}; - -#define PAGE_FIDO 0xF1D0 -#define PAGE_GENERIC 0xFFA0 - -uint8_t HID_DynReportDesc[sizeof(HID_ReportDesc)]; -bool fidoActivated; - -/* USB HID device Configuration Descriptor */ -__ALIGN_BEGIN const uint8_t const USBD_HID_CfgDesc[] __ALIGN_END = { - 0x09, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - 0x29, - /* wTotalLength: Bytes returned */ - 0x00, 0x01, /*bNumInterfaces: 1 interface*/ - 0x01, /*bConfigurationValue: Configuration value*/ - USBD_IDX_PRODUCT_STR, /*iConfiguration: Index of string descriptor -describing -the configuration*/ - 0xC0, /*bmAttributes: bus powered */ - 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ - - /************** Descriptor of CUSTOM HID interface ****************/ - /* 09 */ - 0x09, /*bLength: Interface Descriptor size*/ - USB_DESC_TYPE_INTERFACE, /*bDescriptorType: Interface descriptor type*/ - 0x00, /*bInterfaceNumber: Number of Interface*/ - 0x00, /*bAlternateSetting: Alternate setting*/ - 0x02, /*bNumEndpoints*/ - 0x03, /*bInterfaceClass: HID*/ - 0x00, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ - 0x00, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ - USBD_IDX_PRODUCT_STR, /*iInterface: Index of string descriptor*/ - /******************** Descriptor of HID *************************/ - /* 18 */ - 0x09, /*bLength: HID Descriptor size*/ - HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ - 0x11, /*bHIDUSTOM_HID: HID Class Spec release number*/ - 0x01, - 0x00, /*bCountryCode: Hardware target country*/ - 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ - 0x22, /*bDescriptorType*/ - sizeof( - HID_DynReportDesc), /*wItemLength: Total length of Report descriptor*/ - 0x00, - /******************** Descriptor of Custom HID endpoints - ********************/ - /* 27 */ - 0x07, /*bLength: Endpoint Descriptor size*/ - USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/ - HID_EPIN_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/ - 0x03, /*bmAttributes: Interrupt endpoint*/ - HID_EPIN_SIZE, /*wMaxPacketSize: 2 Byte max */ - 0x00, - 0x01, /*bInterval: Polling Interval (20 ms)*/ - /* 34 */ - - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: */ - HID_EPOUT_ADDR, /*bEndpointAddress: Endpoint Address (OUT)*/ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_EPOUT_SIZE, /* wMaxPacketSize: 2 Bytes max */ - 0x00, 0x01, /* bInterval: Polling Interval (20 ms) */ - /* 41 */ -}; - -/* USB HID device Configuration Descriptor */ -__ALIGN_BEGIN const uint8_t const USBD_HID_Desc[] __ALIGN_END = { - /* 18 */ - 0x09, /*bLength: HID Descriptor size*/ - HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ - 0x11, /*bHIDUSTOM_HID: HID Class Spec release number*/ - 0x01, 0x00, /*bCountryCode: Hardware target country*/ - 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ - 0x22, /*bDescriptorType*/ - sizeof( - HID_DynReportDesc), /*wItemLength: Total length of Report descriptor*/ - 0x00, -}; - -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN const uint8_t const USBD_HID_DeviceQualifierDesc[] __ALIGN_END = { - USB_LEN_DEV_QUALIFIER_DESC, - USB_DESC_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x01, - 0x00, -}; - -/* USB Standard Device Descriptor */ -const uint8_t const USBD_DeviceDesc[USB_LEN_DEV_DESC] = { - 0x12, /* bLength */ - USB_DESC_TYPE_DEVICE, /* bDescriptorType */ - 0x00, /* bcdUSB */ - 0x02, - 0x00, /* bDeviceClass */ - 0x00, /* bDeviceSubClass */ - 0x00, /* bDeviceProtocol */ - USB_MAX_EP0_SIZE, /* bMaxPacketSize */ - LOBYTE(USBD_VID), /* idVendor */ - HIBYTE(USBD_VID), /* idVendor */ - LOBYTE(USBD_PID), /* idVendor */ - HIBYTE(USBD_PID), /* idVendor */ - 0x00, /* bcdDevice rel. 2.00 */ - 0x02, - USBD_IDX_MFC_STR, /* Index of manufacturer string */ - USBD_IDX_PRODUCT_STR, /* Index of product string */ - USBD_IDX_SERIAL_STR, /* Index of serial number string */ - USBD_MAX_NUM_CONFIGURATION /* bNumConfigurations */ -}; /* USB_DeviceDescriptor */ - -/** - * @brief Returns the device descriptor. - * @param speed: Current device speed - * @param length: Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t *USBD_HID_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) { - UNUSED(speed); - *length = sizeof(USBD_DeviceDesc); - return (uint8_t *)USBD_DeviceDesc; -} - -/** - * @brief Returns the LangID string descriptor. - * @param speed: Current device speed - * @param length: Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t *USBD_HID_LangIDStrDescriptor(USBD_SpeedTypeDef speed, - uint16_t *length) { - UNUSED(speed); - *length = sizeof(USBD_LangIDDesc); - return (uint8_t *)USBD_LangIDDesc; -} - -/** - * @brief Returns the product string descriptor. - * @param speed: Current device speed - * @param length: Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t *USBD_HID_ProductStrDescriptor(USBD_SpeedTypeDef speed, - uint16_t *length) { - UNUSED(speed); - *length = sizeof(USBD_PRODUCT_FS_STRING); - return (uint8_t *)USBD_PRODUCT_FS_STRING; -} - -/** - * @brief Returns the manufacturer string descriptor. - * @param speed: Current device speed - * @param length: Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t *USBD_HID_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, - uint16_t *length) { - UNUSED(speed); - *length = sizeof(USBD_MANUFACTURER_STRING); - return (uint8_t *)USBD_MANUFACTURER_STRING; -} - -/** - * @brief Returns the serial number string descriptor. - * @param speed: Current device speed - * @param length: Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t *USBD_HID_SerialStrDescriptor(USBD_SpeedTypeDef speed, - uint16_t *length) { - UNUSED(speed); - *length = sizeof(USB_SERIAL_STRING); - return (uint8_t *)USB_SERIAL_STRING; -} - -/** - * @brief Returns the configuration string descriptor. - * @param speed: Current device speed - * @param length: Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t *USBD_HID_ConfigStrDescriptor(USBD_SpeedTypeDef speed, - uint16_t *length) { - UNUSED(speed); - *length = sizeof(USBD_CONFIGURATION_FS_STRING); - return (uint8_t *)USBD_CONFIGURATION_FS_STRING; -} - -/** - * @brief Returns the interface string descriptor. - * @param speed: Current device speed - * @param length: Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -uint8_t *USBD_HID_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, - uint16_t *length) { - UNUSED(speed); - *length = sizeof(USBD_INTERFACE_FS_STRING); - return (uint8_t *)USBD_INTERFACE_FS_STRING; -} - -/** -* @brief DeviceQualifierDescriptor -* return Device Qualifier descriptor -* @param length : pointer data length -* @retval pointer to descriptor buffer -*/ -uint8_t *USBD_HID_GetDeviceQualifierDesc_impl(uint16_t *length) { - *length = sizeof(USBD_HID_DeviceQualifierDesc); - return (uint8_t *)USBD_HID_DeviceQualifierDesc; -} - -/** - * @brief USBD_CUSTOM_HID_GetCfgDesc - * return configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -uint8_t *USBD_HID_GetCfgDesc_impl(uint16_t *length) { - *length = sizeof(USBD_HID_CfgDesc); - return (uint8_t *)USBD_HID_CfgDesc; -} - -uint8_t *USBD_HID_GetHidDescriptor_impl(uint16_t *len) { - *len = sizeof(USBD_HID_Desc); - return (uint8_t *)USBD_HID_Desc; -} - -uint8_t *USBD_HID_GetReportDescriptor_impl(uint16_t *len) { - *len = sizeof(HID_DynReportDesc); - return (uint8_t *)HID_DynReportDesc; -} - -/** - * @} - */ - -/** - * @brief USBD_HID_DataOut - * handle data OUT Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - * - * This function is the default behavior for our implementation when data are - * sent over the out hid endpoint - */ -extern volatile unsigned short G_io_apdu_length; - -uint8_t USBD_HID_DataOut_impl(USBD_HandleTypeDef *pdev, uint8_t epnum, - uint8_t *buffer) { - UNUSED(epnum); - - // prepare receiving the next chunk (masked time) - USBD_LL_PrepareReceive(pdev, HID_EPOUT_ADDR, HID_EPOUT_SIZE); - - if (fidoActivated) { -#ifdef HAVE_U2F - u2f_transport_handle(&u2fService, buffer, - io_seproxyhal_get_ep_rx_size(HID_EPOUT_ADDR), - U2F_MEDIA_USB); -#endif - } else { - // avoid troubles when an apdu has not been replied yet - if (G_io_apdu_media == IO_APDU_MEDIA_NONE) { - // add to the hid transport - switch (io_usb_hid_receive( - io_usb_send_apdu_data, buffer, - io_seproxyhal_get_ep_rx_size(HID_EPOUT_ADDR))) { - default: - break; - - case IO_USB_APDU_RECEIVED: - G_io_apdu_media = IO_APDU_MEDIA_USB_HID; // for application code - G_io_apdu_state = APDU_USB_HID; // for next call to io_exchange - G_io_apdu_length = G_io_usb_hid_total_length; - break; - } - } - } - - return USBD_OK; -} - -/** @defgroup USBD_HID_Private_Functions - * @{ - */ - -// note: how core lib usb calls the hid class -static const USBD_DescriptorsTypeDef const HID_Desc = { - USBD_HID_DeviceDescriptor, USBD_HID_LangIDStrDescriptor, - USBD_HID_ManufacturerStrDescriptor, USBD_HID_ProductStrDescriptor, - USBD_HID_SerialStrDescriptor, USBD_HID_ConfigStrDescriptor, - USBD_HID_InterfaceStrDescriptor, NULL, -}; - -static const USBD_ClassTypeDef const USBD_HID = { - USBD_HID_Init, USBD_HID_DeInit, USBD_HID_Setup, NULL, /*EP0_TxSent*/ - NULL, /*EP0_RxReady*/ /* STATUS STAGE IN */ - NULL, /*DataIn*/ - USBD_HID_DataOut_impl, /*DataOut*/ - NULL, /*SOF */ - NULL, NULL, USBD_HID_GetCfgDesc_impl, USBD_HID_GetCfgDesc_impl, - USBD_HID_GetCfgDesc_impl, USBD_HID_GetDeviceQualifierDesc_impl, -}; - -void USB_power_U2F(unsigned char enabled, unsigned char fido) { - uint16_t page = (fido ? PAGE_FIDO : PAGE_GENERIC); - os_memmove(HID_DynReportDesc, HID_ReportDesc, sizeof(HID_ReportDesc)); - HID_DynReportDesc[1] = (page & 0xff); - HID_DynReportDesc[2] = ((page >> 8) & 0xff); - fidoActivated = (fido ? true : false); - - os_memset(&USBD_Device, 0, sizeof(USBD_Device)); - - if (enabled) { - os_memset(&USBD_Device, 0, sizeof(USBD_Device)); - /* Init Device Library */ - USBD_Init(&USBD_Device, (USBD_DescriptorsTypeDef *)&HID_Desc, 0); - - /* Register the HID class */ - USBD_RegisterClass(&USBD_Device, (USBD_ClassTypeDef *)&USBD_HID); - - /* Start Device Process */ - USBD_Start(&USBD_Device); - } else { - USBD_DeInit(&USBD_Device); - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/src_genericwallet/usbd_hid_impl.h b/src_genericwallet/usbd_hid_impl.h deleted file mode 100644 index adb7be9..0000000 --- a/src_genericwallet/usbd_hid_impl.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef USBD_HID_IMPL_H -#define USBD_HID_IMPL_H - -#define HID_EPIN_ADDR 0x82 -#define HID_EPIN_SIZE 0x40 - -#define HID_EPOUT_ADDR 0x02 -#define HID_EPOUT_SIZE 0x40 - -#endif // USBD_HID_IMPL_H -