From 4bf47da1966e36c19e8f11dcc4eb9d1d801b62f0 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Mon, 13 May 2024 10:24:26 -0600 Subject: [PATCH 001/358] Add link to docs in error message. --- Firmware/RTK_Everywhere/UM980.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/UM980.ino b/Firmware/RTK_Everywhere/UM980.ino index cc309f4d7..dc4d5c0b2 100644 --- a/Firmware/RTK_Everywhere/UM980.ino +++ b/Firmware/RTK_Everywhere/UM980.ino @@ -184,8 +184,8 @@ bool um980ConfigureOnce() } else { - systemPrintf("Current UM980 firmware: v%d. Galileo E6 reception requires 11833 or newer. Please update the " - "firmware on your UM980 to allow for HAS operation.\r\n", + systemPrintf("Current UM980 firmware: v%d. Galileo E6 reception requires v11833 or newer. Please update the " + "firmware on your UM980 to allow for HAS operation. Please see https://bit.ly/sfe-rtk-um980-update\r\n", um980Version); } } From 3d701fe20dd1a032ab22ed1e4bde80bb13fb1713 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Mon, 13 May 2024 10:24:52 -0600 Subject: [PATCH 002/358] Increment version --- .github/workflows/compile-rtk-everywhere.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-rtk-everywhere.yml b/.github/workflows/compile-rtk-everywhere.yml index 8aabc794e..f857d81e8 100644 --- a/.github/workflows/compile-rtk-everywhere.yml +++ b/.github/workflows/compile-rtk-everywhere.yml @@ -6,7 +6,7 @@ on: env: FILENAME_PREFIX: RTK_Everywhere_Firmware FIRMWARE_VERSION_MAJOR: 1 - FIRMWARE_VERSION_MINOR: 1 + FIRMWARE_VERSION_MINOR: 2 POINTPERFECT_LBAND_TOKEN: ${{ secrets.POINTPERFECT_LBAND_TOKEN }} POINTPERFECT_IP_TOKEN: ${{ secrets.POINTPERFECT_IP_TOKEN }} POINTPERFECT_LBAND_IP_TOKEN: ${{ secrets.POINTPERFECT_LBAND_IP_TOKEN }} From cbb639b45963c033675e7657a7f2ad9066702387 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Mon, 13 May 2024 11:04:57 -0600 Subject: [PATCH 003/358] Complete last serial print before endpoint change --- Firmware/RTK_Everywhere/Tasks.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/Tasks.ino b/Firmware/RTK_Everywhere/Tasks.ino index 88445ff1a..6c83b640d 100644 --- a/Firmware/RTK_Everywhere/Tasks.ino +++ b/Firmware/RTK_Everywhere/Tasks.ino @@ -177,8 +177,8 @@ void btReadTask(void *e) btAppCommandCharsReceived++; if (btAppCommandCharsReceived == btMaxAppCommandCharacters) { + systemPrintln("Device has entered config mode over Bluetooth"); printEndpoint = PRINT_ENDPOINT_ALL; - systemPrintln("App has entered config mode"); btPrintEcho = true; runCommandMode = true; @@ -187,7 +187,7 @@ void btReadTask(void *e) } } - else // This is just a character in the stream, ignore + else // This character is not a command character, pass along to GNSS { // Pass any escape characters that turned out to not be a complete escape sequence while (btEscapeCharsReceived-- > 0) From 3e106ad007bc87ae98ca5db3384bdc51a9ed62bc Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Mon, 13 May 2024 15:40:15 -0600 Subject: [PATCH 004/358] Add debug print for whitelists --- Firmware/RTK_Everywhere/menuPP.ino | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Firmware/RTK_Everywhere/menuPP.ino b/Firmware/RTK_Everywhere/menuPP.ino index daf98ed9d..1e679af25 100644 --- a/Firmware/RTK_Everywhere/menuPP.ino +++ b/Firmware/RTK_Everywhere/menuPP.ino @@ -230,6 +230,8 @@ bool pointperfectProvisionDevice() // Override ID with testing ID snprintf(hardwareID, sizeof(hardwareID), "%02X%02X%02X%02X%02X%02X%02X", whitelistID[0], whitelistID[1], whitelistID[2], whitelistID[3], whitelistID[4], whitelistID[5], productVariant); + + systemPrintf("Using whitelist hardware ID: %s\r\n", hardwareID); #endif // WHITELISTED_ID // Given name must be between 1 and 50 characters From 8cf6c74439f3185a388a8781ab76245d5ea18759 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Mon, 13 May 2024 15:40:48 -0600 Subject: [PATCH 005/358] Add command line interface demo sketch --- .../CommandLineStructure.ino | 325 ++++++++++++++++++ .../CommandLineStructure/Other.ino | 38 ++ 2 files changed, 363 insertions(+) create mode 100644 Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino create mode 100644 Firmware/Test Sketches/CommandLineStructure/Other.ino diff --git a/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino b/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino new file mode 100644 index 000000000..e7c694bea --- /dev/null +++ b/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino @@ -0,0 +1,325 @@ +/* + Demonstration of the command line interface as specified by Avinan Malla +*/ + +int pin_UART1_TX = 4; +int pin_UART1_RX = 13; + +void setup() +{ + Serial.begin(115200); + delay(250); + Serial.println(); + Serial.println("SparkFun Command Line Interface Tests"); + + const uint16_t bufferLen = 1024; + char cmdBuffer[bufferLen]; + + sprintf(cmdBuffer, "$CMD*4A"); //Bad command + Serial.printf("command: %s (BAD) - ", cmdBuffer); + commandParser(cmdBuffer); + + sprintf(cmdBuffer, "$SPCMD*AA"); //Bad checksum + Serial.printf("command: %s (BAD) - ", cmdBuffer); + commandParser(cmdBuffer); + + sprintf(cmdBuffer, "$SPCMD*49"); //Valid command + Serial.printf("command: %s (GOOD) - ", cmdBuffer); + commandParser(cmdBuffer); + + Serial.println(); + + sprintf(cmdBuffer, "$SPGET,elvMask,15*1A"); //Bad command + Serial.printf("command: %s (BAD) - ", cmdBuffer); + commandParser(cmdBuffer); + + sprintf(cmdBuffer, "$SPGET*55"); //Bad command + Serial.printf("command: %s (BAD) - ", cmdBuffer); + commandParser(cmdBuffer); + + sprintf(cmdBuffer, "$SPGET,rando*0F"); //Unknown setting + Serial.printf("command: %s (BAD) - ", cmdBuffer); + commandParser(cmdBuffer); + + sprintf(cmdBuffer, "$SPGET,elvMask*32"); //Valid command + Serial.printf("command: %s (GOOD) - ", cmdBuffer); + commandParser(cmdBuffer); + + Serial.println(); + + sprintf(cmdBuffer, "$SPSET,elvMask*26"); //Incorrect number of arguments + Serial.printf("command: %s (BAD) - ", cmdBuffer); + commandParser(cmdBuffer); + + sprintf(cmdBuffer, "$SPSET,rando,15*33"); //Unknown setting + Serial.printf("command: %s (BAD) - ", cmdBuffer); + commandParser(cmdBuffer); + + sprintf(cmdBuffer, "$SPSET,elvMask,0.77*14"); //Valid + Serial.printf("command: %s (GOOD) - ", cmdBuffer); + commandParser(cmdBuffer); + + Serial.println(); + + sprintf(cmdBuffer, "$SPEXE*5B"); //Incorrect number of arguments + Serial.printf("command: %s (BAD) - ", cmdBuffer); + commandParser(cmdBuffer); + + sprintf(cmdBuffer, "$SPEXE,rando*01"); //Unknown command + Serial.printf("command: %s (BAD) - ", cmdBuffer); + commandParser(cmdBuffer); + + sprintf(cmdBuffer, "$SPEXE,EXIT*77"); //Valid + Serial.printf("command: %s (GOOD) - ", cmdBuffer); + commandParser(cmdBuffer); + + sprintf(cmdBuffer, "$SPEXE,APPLY*23"); //Valid + Serial.printf("command: %s (GOOD) - ", cmdBuffer); + commandParser(cmdBuffer); + + sprintf(cmdBuffer, "$SPEXE,SAVE*76"); //Valid + Serial.printf("command: %s (GOOD) - ", cmdBuffer); + commandParser(cmdBuffer); + + sprintf(cmdBuffer, "$SPEXE,REBOOT*76"); //Valid + Serial.printf("command: %s (GOOD) - ", cmdBuffer); + commandParser(cmdBuffer); + + sprintf(cmdBuffer, "$SPEXE,LIST*75"); //Valid + Serial.printf("command: %s (GOOD) - ", cmdBuffer); + commandParser(cmdBuffer); +} + +void commandParser(char *cmdBuffer) +{ + //Verify command structure + if (commandValid(cmdBuffer) == false) + { + commandSendErrorResponse("SP", "Bad command structure"); + return; + } + + //Remove $ + cmdBuffer = &cmdBuffer[1]; + + //Remove * and CRC + cmdBuffer[strlen(cmdBuffer) - 3] = '\0'; + + const uint16_t bufferLen = 1024; + const int MAX_TOKENS = 10; + char valueBuffer[100]; + char responseBuffer[200]; + + char *tokens[MAX_TOKENS]; + const char *delimiter = ","; + int tokenCount = 0; + tokens[tokenCount] = strtok(cmdBuffer, delimiter); + + while (tokens[tokenCount] != nullptr && tokenCount < MAX_TOKENS) + { + tokenCount++; + tokens[tokenCount] = strtok(nullptr, delimiter); + } + // if (tokenCount == 0) + // continue; + + //Valid commands: CMD, GET, SET, EXE, + + if (strcmp(tokens[0], "SPCMD") == 0) + { + commandSendOkResponse(tokens[0]); + } + else if (strcmp(tokens[0], "SPGET") == 0) + { + if (tokenCount != 2) + commandSendErrorResponse(tokens[0], "Incorrect number of arguments"); + else + { + auto field = tokens[1]; + if (getSettingValue(field, valueBuffer) == true) + commandSendValueResponse(tokens[0], field, valueBuffer); //Send structured response + else + commandSendErrorResponse(tokens[0], "Unknown setting"); + } + } + else if (strcmp(tokens[0], "SPSET") == 0) + { + if (tokenCount != 3) + commandSendErrorResponse(tokens[0], "Incorrect number of arguments"); //Incorrect number of arguments + else + { + auto field = tokens[1]; + auto value = tokens[2]; + if (updateSettingWithValue(field, value) == true) + commandSendValueOkResponse(tokens[0], field, value); + else + commandSendErrorResponse(tokens[0], "Unknown setting"); + } + } + else if (strcmp(tokens[0], "SPEXE") == 0) + { + if (tokenCount != 2) + commandSendErrorResponse(tokens[0], "Incorrect number of arguments"); //Incorrect number of arguments + else + { + if (strcmp(tokens[1], "EXIT") == 0) + { + commandSendExecuteOkResponse(tokens[0], tokens[1]); + //Do an exit... + } + else if (strcmp(tokens[1], "APPLY") == 0) + { + commandSendExecuteOkResponse(tokens[0], tokens[1]); + //Do an apply... + } + else if (strcmp(tokens[1], "SAVE") == 0) + { + commandSendExecuteOkResponse(tokens[0], tokens[1]); + //Do a save... + } + else if (strcmp(tokens[1], "REBOOT") == 0) + { + commandSendExecuteOkResponse(tokens[0], tokens[1]); + //Do a reboot... + } + else if (strcmp(tokens[1], "LIST") == 0) + { + Serial.println(); //TODO remove, just needed for pretty printing + + //Respond with list of variables + commandSendExecuteListResponse("observationSeconds", "int", "10"); + commandSendExecuteListResponse("observationPositionAccuracy", "float", "0.5"); + + commandSendExecuteOkResponse(tokens[0], tokens[1]); + } + else + commandSendErrorResponse(tokens[0], "Unknown command"); + } + } + else + { + commandSendErrorResponse(tokens[0], "Unknown command"); + } +} + +void loop() +{ + if (Serial.available()) + { + byte incoming = Serial.read(); + if (incoming == 'r') + ESP.restart(); + } +} + +//Given a command, send structured OK response +//Ex: SPCMD = "$SPCMD,OK*61" +void commandSendOkResponse(char *command) +{ + //Create string between $ and * for checksum calculation + char innerBuffer[200]; + sprintf(innerBuffer, "%s,OK", command); + commandSendResponse(innerBuffer); +} + +//Given a command, send response sentence with OK and checksum and +//Ex: SPEXE,EXIT = +void commandSendExecuteOkResponse(char *command, char *settingName) +{ + //Create string between $ and * for checksum calculation + char innerBuffer[200]; + sprintf(innerBuffer, "%s,%s,OK", command, settingName); + commandSendResponse(innerBuffer); +} + +//Given a command, send response sentence with OK and checksum and +//Ex: observationPositionAccuracy,float,0.5 = +void commandSendExecuteListResponse(char *settingName, char *settingType, char *settingValue) +{ + //Create string between $ and * for checksum calculation + char innerBuffer[200]; + sprintf(innerBuffer, "SPLST,%s,%s,%s", settingName, settingType, settingValue); + commandSendResponse(innerBuffer); +} + +//Given a command, and a value, send response sentence with checksum and +//Ex: SPGET,elvMask,0.25 = "$SPGET,elvMask,0.25*07" +void commandSendValueResponse(char *command, char *settingName, char *valueBuffer) +{ + //Create string between $ and * for checksum calculation + char innerBuffer[200]; + sprintf(innerBuffer, "%s,%s,%s", command, settingName, valueBuffer); + commandSendResponse(innerBuffer); +} + +//Given a command, and a value, send response sentence with OK and checksum and +//Ex: SPSET,elvMask,0.77 = "$SPSET,elvMask,0.77,OK*3C" +void commandSendValueOkResponse(char *command, char *settingName, char *valueBuffer) +{ + //Create string between $ and * for checksum calculation + char innerBuffer[200]; + sprintf(innerBuffer, "%s,%s,%s,OK", command, settingName, valueBuffer); + commandSendResponse(innerBuffer); +} + +//Given a command, send structured ERROR response +//Ex: SPGET, 'Incorrect number of arguments' = "$SPGET,ERROR,Incorrect number of arguments*1E" +void commandSendErrorResponse(char *command, char *errorVerbose) +{ + //Create string between $ and * for checksum calculation + char innerBuffer[200]; + snprintf(innerBuffer, sizeof(innerBuffer), "%s,ERROR,%s", command, errorVerbose); + commandSendResponse(innerBuffer); +} + +//Given an inner buffer, send response sentence with checksum and +//Ex: "SPGET,0.25" = "$SPGET,0.25*33" +void commandSendResponse(char *innerBuffer) +{ + char responseBuffer[200]; + + uint8_t calculatedChecksum = 0; // XOR chars between '$' and '*' + for (int x = 0; x < strlen(innerBuffer); x++) + calculatedChecksum = calculatedChecksum ^ innerBuffer[x]; + + sprintf(responseBuffer, "$%s*%02X\r\n", innerBuffer, calculatedChecksum); + + Serial.print(responseBuffer); +} + +// Checks structure of command and checksum +// If valid, returns true +// $SPCMD*49 +// $SPGET,elvMask,15*1A +// getUserInputString() has removed any trailing to the command +bool commandValid(char* commandString) +{ + //Check $/* + if (commandString[0] != '$') + return (false); + + if (commandString[strlen(commandString) - 3] != '*') + return (false); + + //Check checksum is HEX + char checksumMSN = commandString[strlen(commandString) - 2]; + char checksumLSN = commandString[strlen(commandString) - 1]; + if (isxdigit(checksumMSN) == false || isxdigit(checksumLSN) == false) + return (false); + + //Convert checksum from ASCII to int + char checksumChar[3] = {'\0'}; + checksumChar[0] = checksumMSN; + checksumChar[1] = checksumLSN; + uint8_t checksum = strtol(checksumChar, NULL, 16); + + // From: http://engineeringnotes.blogspot.com/2015/02/generate-crc-for-nmea-strings-arduino.html + uint8_t calculatedChecksum = 0; // XOR chars between '$' and '*' + for (int x = 1; x < strlen(commandString) - 3; x++) + calculatedChecksum = calculatedChecksum ^ commandString[x]; + + if (checksum != calculatedChecksum) + return (false); + + return (true); +} diff --git a/Firmware/Test Sketches/CommandLineStructure/Other.ino b/Firmware/Test Sketches/CommandLineStructure/Other.ino new file mode 100644 index 000000000..fdafff02e --- /dev/null +++ b/Firmware/Test Sketches/CommandLineStructure/Other.ino @@ -0,0 +1,38 @@ +// Given a settingName, and string value, update a given setting +bool updateSettingWithValue(const char *settingName, const char *settingValueStr) +{ + char *ptr; + double settingValue = strtod(settingValueStr, &ptr); + + bool knownSetting = false; + + if (strcmp(settingValueStr, "true") == 0) + settingValue = 1; + if (strcmp(settingValueStr, "false") == 0) + settingValue = 0; + + if (strcmp(settingName, "elvMask") == 0) + { + //settings.elvMask = value + knownSetting = true; + } + + return (knownSetting); +} + +bool getSettingValue(const char *settingName, char *settingValueStr) +{ + bool knownSetting = false; + + char truncatedName[51]; + char suffix[51]; + + if (strcmp(settingName, "elvMask") == 0) + { + sprintf(settingValueStr, "%0.2f", 0.25); + knownSetting = true; + } + + return (knownSetting); + +} From 8e790eda51418200ff7ce4c1f3b3fd992f08922a Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Mon, 13 May 2024 15:45:06 -0600 Subject: [PATCH 006/358] Whitespace format menuCommands --- Firmware/RTK_Everywhere/menuCommands.ino | 2321 ++++++++++------------ 1 file changed, 1104 insertions(+), 1217 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 774a6947d..c4f05a501 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -135,353 +135,335 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr for (int i = 0; i < numRtkSettingsEntries; i++) { // For speed, compare the first letter, then the whole string - if ((rtkSettingsEntries[i].name[0] == truncatedName[0]) && (strcmp(rtkSettingsEntries[i].name, truncatedName) == 0)) + if ((rtkSettingsEntries[i].name[0] == truncatedName[0]) && + (strcmp(rtkSettingsEntries[i].name, truncatedName) == 0)) { switch (rtkSettingsEntries[i].type) { - default: - break; - case _bool: - { - bool *ptr = (bool *)rtkSettingsEntries[i].var; - *ptr = (bool)settingValue; - knownSetting = true; - } - break; - case _int: - { - int *ptr = (int *)rtkSettingsEntries[i].var; - *ptr = (int)settingValue; - knownSetting = true; - } - break; - case _float: - { - float *ptr = (float *)rtkSettingsEntries[i].var; - *ptr = (float)settingValue; - knownSetting = true; - } - break; - case _double: - { - double *ptr = (double *)rtkSettingsEntries[i].var; - *ptr = settingValue; - knownSetting = true; - } - break; - case _uint8_t: - { - uint8_t *ptr = (uint8_t *)rtkSettingsEntries[i].var; - *ptr = (uint8_t)settingValue; - knownSetting = true; - } - break; - case _uint16_t: - { - uint16_t *ptr = (uint16_t *)rtkSettingsEntries[i].var; - *ptr = (uint16_t)settingValue; - knownSetting = true; - } - break; - case _uint32_t: - { - uint32_t *ptr = (uint32_t *)rtkSettingsEntries[i].var; - *ptr = (uint32_t)settingValue; - knownSetting = true; - } - break; - case _uint64_t: + default: + break; + case _bool: { + bool *ptr = (bool *)rtkSettingsEntries[i].var; + *ptr = (bool)settingValue; + knownSetting = true; + } + break; + case _int: { + int *ptr = (int *)rtkSettingsEntries[i].var; + *ptr = (int)settingValue; + knownSetting = true; + } + break; + case _float: { + float *ptr = (float *)rtkSettingsEntries[i].var; + *ptr = (float)settingValue; + knownSetting = true; + } + break; + case _double: { + double *ptr = (double *)rtkSettingsEntries[i].var; + *ptr = settingValue; + knownSetting = true; + } + break; + case _uint8_t: { + uint8_t *ptr = (uint8_t *)rtkSettingsEntries[i].var; + *ptr = (uint8_t)settingValue; + knownSetting = true; + } + break; + case _uint16_t: { + uint16_t *ptr = (uint16_t *)rtkSettingsEntries[i].var; + *ptr = (uint16_t)settingValue; + knownSetting = true; + } + break; + case _uint32_t: { + uint32_t *ptr = (uint32_t *)rtkSettingsEntries[i].var; + *ptr = (uint32_t)settingValue; + knownSetting = true; + } + break; + case _uint64_t: { + uint64_t *ptr = (uint64_t *)rtkSettingsEntries[i].var; + *ptr = (uint64_t)settingValue; + knownSetting = true; + } + break; + case _int8_t: { + int8_t *ptr = (int8_t *)rtkSettingsEntries[i].var; + *ptr = (int8_t)settingValue; + knownSetting = true; + } + break; + case _int16_t: { + int16_t *ptr = (int16_t *)rtkSettingsEntries[i].var; + *ptr = (int16_t)settingValue; + knownSetting = true; + } + break; + case _muxConnectionType_e: { + muxConnectionType_e *ptr = (muxConnectionType_e *)rtkSettingsEntries[i].var; + *ptr = (muxConnectionType_e)settingValue; + knownSetting = true; + } + break; + case _SystemState: { + SystemState *ptr = (SystemState *)rtkSettingsEntries[i].var; + *ptr = (SystemState)settingValue; + knownSetting = true; + } + break; + case _pulseEdgeType_e: { + pulseEdgeType_e *ptr = (pulseEdgeType_e *)rtkSettingsEntries[i].var; + *ptr = (pulseEdgeType_e)settingValue; + knownSetting = true; + } + break; + case _BluetoothRadioType_e: { + BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)rtkSettingsEntries[i].var; + *ptr = (BluetoothRadioType_e)settingValue; + knownSetting = true; + } + break; + case _PeriodicDisplay_t: { + PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)rtkSettingsEntries[i].var; + *ptr = (PeriodicDisplay_t)settingValue; + knownSetting = true; + } + break; + case _CoordinateInputType: { + CoordinateInputType *ptr = (CoordinateInputType *)rtkSettingsEntries[i].var; + *ptr = (CoordinateInputType)settingValue; + knownSetting = true; + } + break; + case _charArray: { + char *ptr = (char *)rtkSettingsEntries[i].var; + strncpy(ptr, settingValueStr, rtkSettingsEntries[i].qualifier); + // strncpy pads with zeros. No need to add them here for ntpReferenceId + knownSetting = true; + } + break; + case _IPString: { + String tempString = String(settingValueStr); + IPAddress *ptr = (IPAddress *)rtkSettingsEntries[i].var; + ptr->fromString(tempString); + knownSetting = true; + } + break; + case _ubxMessageRates: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + if ((suffix[0] == ubxMessages[x].msgTextName[0]) && + (strcmp(suffix, ubxMessages[x].msgTextName) == 0)) { - uint64_t *ptr = (uint64_t *)rtkSettingsEntries[i].var; - *ptr = (uint64_t)settingValue; + settings.ubxMessageRates[x] = (uint8_t)settingValue; knownSetting = true; + break; } - break; - case _int8_t: + } + } + break; + case _ubxConstellations: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + if ((suffix[0] == settings.ubxConstellations[x].textName[0]) && + (strcmp(suffix, settings.ubxConstellations[x].textName) == 0)) { - int8_t *ptr = (int8_t *)rtkSettingsEntries[i].var; - *ptr = (int8_t)settingValue; + settings.ubxConstellations[x].enabled = settingValue; knownSetting = true; + break; } - break; - case _int16_t: + } + } + break; + case _espnowPeers: { + int suffixNum; + if (sscanf(suffix, "%d", &suffixNum) == 1) + { + int mac[6]; + if (sscanf(settingValueStr, "%X:%X:%X:%X:%X:%X", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], + &mac[5]) == 6) { - int16_t *ptr = (int16_t *)rtkSettingsEntries[i].var; - *ptr = (int16_t)settingValue; + for (int i = 0; i < 6; i++) + settings.espnowPeers[suffixNum][i] = mac[i]; knownSetting = true; } - break; - case _muxConnectionType_e: + } + } + break; + case _ubxMessageRateBase: { + int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + if ((suffix[0] == ubxMessages[firstRTCMRecord + x].msgTextName[0]) && + (strcmp(suffix, ubxMessages[firstRTCMRecord + x].msgTextName) == 0)) { - muxConnectionType_e *ptr = (muxConnectionType_e *)rtkSettingsEntries[i].var; - *ptr = (muxConnectionType_e)settingValue; + settings.ubxMessageRatesBase[x] = (uint8_t)settingValue; knownSetting = true; + break; } - break; - case _SystemState: + } + } + break; + case _wifiNetwork: { + int network; + + if (strstr(suffix, "SSID") != nullptr) + { + if (sscanf(suffix, "%dSSID", &network) == 1) { - SystemState *ptr = (SystemState *)rtkSettingsEntries[i].var; - *ptr = (SystemState)settingValue; + strncpy(settings.wifiNetworks[network].ssid, settingValueStr, + sizeof(settings.wifiNetworks[0].ssid)); knownSetting = true; } - break; - case _pulseEdgeType_e: + } + else if (strstr(suffix, "Password") != nullptr) + { + if (sscanf(suffix, "%dPassword", &network) == 1) { - pulseEdgeType_e *ptr = (pulseEdgeType_e *)rtkSettingsEntries[i].var; - *ptr = (pulseEdgeType_e)settingValue; + strncpy(settings.wifiNetworks[network].password, settingValueStr, + sizeof(settings.wifiNetworks[0].password)); knownSetting = true; } - break; - case _BluetoothRadioType_e: + } + } + break; + case _ntripServerCasterHost: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + strncpy(&settings.ntripServer_CasterHost[server][0], settingValueStr, + sizeof(settings.ntripServer_CasterHost[server])); + knownSetting = true; + } + } + break; + case _ntripServerCasterPort: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + settings.ntripServer_CasterPort[server] = settingValue; + knownSetting = true; + } + } + break; + case _ntripServerCasterUser: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + strncpy(&settings.ntripServer_CasterUser[server][0], settingValueStr, + sizeof(settings.ntripServer_CasterUser[server])); + knownSetting = true; + } + } + break; + case _ntripServerCasterUserPW: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + strncpy(&settings.ntripServer_CasterUserPW[server][0], settingValueStr, + sizeof(settings.ntripServer_CasterUserPW[server])); + knownSetting = true; + } + } + break; + case _ntripServerMountPoint: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + strncpy(&settings.ntripServer_MountPoint[server][0], settingValueStr, + sizeof(settings.ntripServer_MountPoint[server])); + knownSetting = true; + } + } + break; + case _ntripServerMountPointPW: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + strncpy(&settings.ntripServer_MountPointPW[server][0], settingValueStr, + sizeof(settings.ntripServer_MountPointPW[server])); + knownSetting = true; + } + } + break; + case _um980MessageRatesNMEA: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + if ((suffix[0] == umMessagesNMEA[x].msgTextName[0]) && + (strcmp(suffix, umMessagesNMEA[x].msgTextName) == 0)) { - BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)rtkSettingsEntries[i].var; - *ptr = (BluetoothRadioType_e)settingValue; + settings.um980MessageRatesNMEA[x] = settingValue; knownSetting = true; + break; } - break; - case _PeriodicDisplay_t: + } + } + break; + case _um980MessageRatesRTCMRover: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && + (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) { - PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)rtkSettingsEntries[i].var; - *ptr = (PeriodicDisplay_t)settingValue; + settings.um980MessageRatesRTCMRover[x] = settingValue; knownSetting = true; + break; } - break; - case _CoordinateInputType: + } + } + break; + case _um980MessageRatesRTCMBase: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && + (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) { - CoordinateInputType *ptr = (CoordinateInputType *)rtkSettingsEntries[i].var; - *ptr = (CoordinateInputType)settingValue; + settings.um980MessageRatesRTCMBase[x] = settingValue; knownSetting = true; + break; } - break; - case _charArray: + } + } + break; + case _um980Constellations: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + if ((suffix[0] == um980ConstellationCommands[x].textName[0]) && + (strcmp(suffix, um980ConstellationCommands[x].textName) == 0)) { - char *ptr = (char *)rtkSettingsEntries[i].var; - strncpy(ptr, settingValueStr, rtkSettingsEntries[i].qualifier); - // strncpy pads with zeros. No need to add them here for ntpReferenceId + settings.um980Constellations[x] = settingValue; knownSetting = true; + break; } - break; - case _IPString: + } + } + break; + case _correctionsSourcesPriority: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + if ((suffix[0] == correctionsSourceNames[x][0]) && (strcmp(suffix, correctionsSourceNames[x]) == 0)) { - String tempString = String(settingValueStr); - IPAddress *ptr = (IPAddress *)rtkSettingsEntries[i].var; - ptr->fromString(tempString); + settings.correctionsSourcesPriority[x] = settingValue; knownSetting = true; + break; } - break; - case _ubxMessageRates: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == ubxMessages[x].msgTextName[0]) && (strcmp(suffix, ubxMessages[x].msgTextName) == 0)) - { - settings.ubxMessageRates[x] = (uint8_t)settingValue; - knownSetting = true; - break; - } - } - } - break; - case _ubxConstellations: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == settings.ubxConstellations[x].textName[0]) && (strcmp(suffix, settings.ubxConstellations[x].textName) == 0)) - { - settings.ubxConstellations[x].enabled = settingValue; - knownSetting = true; - break; - } - } - } - break; - case _espnowPeers: - { - int suffixNum; - if (sscanf(suffix, "%d", &suffixNum) == 1) - { - int mac[6]; - if (sscanf(settingValueStr, "%X:%X:%X:%X:%X:%X", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6) - { - for (int i = 0; i < 6; i++) - settings.espnowPeers[suffixNum][i] = mac[i]; - knownSetting = true; - } - } - } - break; - case _ubxMessageRateBase: - { - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); - - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == ubxMessages[firstRTCMRecord + x].msgTextName[0]) && (strcmp(suffix, ubxMessages[firstRTCMRecord + x].msgTextName) == 0)) - { - settings.ubxMessageRatesBase[x] = (uint8_t)settingValue; - knownSetting = true; - break; - } - } - } - break; - case _wifiNetwork: - { - int network; - - if (strstr(suffix, "SSID") != nullptr) - { - if (sscanf(suffix, "%dSSID", &network) == 1) - { - strncpy(settings.wifiNetworks[network].ssid, settingValueStr, sizeof(settings.wifiNetworks[0].ssid)); - knownSetting = true; - } - } - else if (strstr(suffix, "Password") != nullptr) - { - if (sscanf(suffix, "%dPassword", &network) == 1) - { - strncpy(settings.wifiNetworks[network].password, settingValueStr, sizeof(settings.wifiNetworks[0].password)); - knownSetting = true; - } - } - } - break; - case _ntripServerCasterHost: - { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - strncpy(&settings.ntripServer_CasterHost[server][0], settingValueStr, sizeof(settings.ntripServer_CasterHost[server])); - knownSetting = true; - } - } - break; - case _ntripServerCasterPort: - { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - settings.ntripServer_CasterPort[server] = settingValue; - knownSetting = true; - } - } - break; - case _ntripServerCasterUser: - { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - strncpy(&settings.ntripServer_CasterUser[server][0], settingValueStr, sizeof(settings.ntripServer_CasterUser[server])); - knownSetting = true; - } - } - break; - case _ntripServerCasterUserPW: - { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - strncpy(&settings.ntripServer_CasterUserPW[server][0], settingValueStr, sizeof(settings.ntripServer_CasterUserPW[server])); - knownSetting = true; - } - } - break; - case _ntripServerMountPoint: - { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - strncpy(&settings.ntripServer_MountPoint[server][0], settingValueStr, sizeof(settings.ntripServer_MountPoint[server])); - knownSetting = true; - } - } - break; - case _ntripServerMountPointPW: - { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - strncpy(&settings.ntripServer_MountPointPW[server][0], settingValueStr, sizeof(settings.ntripServer_MountPointPW[server])); - knownSetting = true; - } - } - break; - case _um980MessageRatesNMEA: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == umMessagesNMEA[x].msgTextName[0]) && (strcmp(suffix, umMessagesNMEA[x].msgTextName) == 0)) - { - settings.um980MessageRatesNMEA[x] = settingValue; - knownSetting = true; - break; - } - } - } - break; - case _um980MessageRatesRTCMRover: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) - { - settings.um980MessageRatesRTCMRover[x] = settingValue; - knownSetting = true; - break; - } - } - } - break; - case _um980MessageRatesRTCMBase: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) - { - settings.um980MessageRatesRTCMBase[x] = settingValue; - knownSetting = true; - break; - } - } - } - break; - case _um980Constellations: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == um980ConstellationCommands[x].textName[0]) && (strcmp(suffix, um980ConstellationCommands[x].textName) == 0)) - { - settings.um980Constellations[x] = settingValue; - knownSetting = true; - break; - } - } - } - break; - case _correctionsSourcesPriority: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == correctionsSourceNames[x][0]) && (strcmp(suffix, correctionsSourceNames[x]) == 0)) - { - settings.correctionsSourcesPriority[x] = settingValue; - knownSetting = true; - break; - } - } - } - break; - case _regionalCorrectionTopics: - { - int region; - if (sscanf(suffix, "%d", ®ion) == 1) - { - strncpy(&settings.regionalCorrectionTopics[region][0], settingValueStr, sizeof(settings.regionalCorrectionTopics[0])); - knownSetting = true; - } - } - break; + } + } + break; + case _regionalCorrectionTopics: { + int region; + if (sscanf(suffix, "%d", ®ion) == 1) + { + strncpy(&settings.regionalCorrectionTopics[region][0], settingValueStr, + sizeof(settings.regionalCorrectionTopics[0])); + knownSetting = true; + } + } + break; } } } @@ -490,7 +472,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr { // strcpy(settings.profileName, settingValueStr); - this will have been done by the for loop setProfileName(profileNumber); // Copy the current settings.profileName into the array of profile names at - // location profileNumber + // location profileNumber } else if (strcmp(settingName, "lastState") == 0) { @@ -699,7 +681,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr { endLogging(false, true); //(gotSemaphore, releaseSemaphore) Close file. Reset parser stats. beginLogging(); // Create new file based on current RTC. - setLoggingType(); // Determine if we are standard, PPP, or custom. Changes logging icon accordingly. + setLoggingType(); // Determine if we are standard, PPP, or custom. Changes logging icon accordingly. char newFileNameCSV[sizeof("logFileName,") + sizeof(logFileName) + 1]; snprintf(newFileNameCSV, sizeof(newFileNameCSV), "logFileName,%s,", logFileName); @@ -860,361 +842,321 @@ void createSettingsString(char *newSettings) snprintf(apDeviceBTID, sizeof(apDeviceBTID), "Device Bluetooth ID: %02X%02X", btMACAddress[4], btMACAddress[5]); stringRecord(newSettings, "deviceBTID", apDeviceBTID); - for (int i = 0; i < numRtkSettingsEntries; i++) { if (rtkSettingsEntries[i].inSettingsString) { switch (rtkSettingsEntries[i].type) { - default: - break; - case _bool: - { - bool *ptr = (bool *)rtkSettingsEntries[i].var; - stringRecord(newSettings, rtkSettingsEntries[i].name, *ptr); - } - break; - case _int: - { - int *ptr = (int *)rtkSettingsEntries[i].var; - stringRecord(newSettings, rtkSettingsEntries[i].name, *ptr); - } - break; - case _float: - { - float *ptr = (float *)rtkSettingsEntries[i].var; - stringRecord(newSettings, rtkSettingsEntries[i].name, (double)*ptr, rtkSettingsEntries[i].qualifier); - } - break; - case _double: - { - double *ptr = (double *)rtkSettingsEntries[i].var; - stringRecord(newSettings, rtkSettingsEntries[i].name, *ptr, rtkSettingsEntries[i].qualifier); - } - break; - case _uint8_t: - { - uint8_t *ptr = (uint8_t *)rtkSettingsEntries[i].var; - stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); - } - break; - case _uint16_t: - { - uint16_t *ptr = (uint16_t *)rtkSettingsEntries[i].var; - stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); - } - break; - case _uint32_t: - { - uint32_t *ptr = (uint32_t *)rtkSettingsEntries[i].var; - stringRecord(newSettings, rtkSettingsEntries[i].name, *ptr); - } - break; - case _uint64_t: - { - uint64_t *ptr = (uint64_t *)rtkSettingsEntries[i].var; - stringRecord(newSettings, rtkSettingsEntries[i].name, *ptr); - } - break; - case _int8_t: - { - int8_t *ptr = (int8_t *)rtkSettingsEntries[i].var; - stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); - } - break; - case _int16_t: - { - int16_t *ptr = (int16_t *)rtkSettingsEntries[i].var; - stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); - } - break; - case _muxConnectionType_e: - { - muxConnectionType_e *ptr = (muxConnectionType_e *)rtkSettingsEntries[i].var; - stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); - } - break; - case _SystemState: - { - SystemState *ptr = (SystemState *)rtkSettingsEntries[i].var; - stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); - } - break; - case _pulseEdgeType_e: - { - pulseEdgeType_e *ptr = (pulseEdgeType_e *)rtkSettingsEntries[i].var; - stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); - } - break; - case _BluetoothRadioType_e: - { - BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)rtkSettingsEntries[i].var; - stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); - } - break; - case _PeriodicDisplay_t: - { - PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)rtkSettingsEntries[i].var; - stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); - } - break; - case _CoordinateInputType: - { - CoordinateInputType *ptr = (CoordinateInputType *)rtkSettingsEntries[i].var; - stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); - } - break; - case _charArray: - { - char *ptr = (char *)rtkSettingsEntries[i].var; - stringRecord(newSettings, rtkSettingsEntries[i].name, ptr); - } - break; - case _IPString: - { - IPAddress *ptr = (IPAddress *)rtkSettingsEntries[i].var; - stringRecord(newSettings, rtkSettingsEntries[i].name, (char *)ptr->toString().c_str()); - } - break; - case _ubxMessageRates: - { - // Record message settings - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; - snprintf(tempString, sizeof(tempString), "%s%s,%d,", - rtkSettingsEntries[i].name, ubxMessages[x].msgTextName, - settings.ubxMessageRates[x]); - stringRecord(newSettings, tempString); - } - } - break; - case _ubxConstellations: - { - // Record constellation settings - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; - snprintf(tempString, sizeof(tempString), "%s%s,%s,", - rtkSettingsEntries[i].name, settings.ubxConstellations[x].textName, - settings.ubxConstellations[x].enabled ? "true" : "false" ); - stringRecord(newSettings, tempString); - } - } - break; - case _espnowPeers: - { - // Record ESP-Now peer MAC addresses - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; // espnowPeers_1=B4:C1:33:42:DE:01, - snprintf(tempString, sizeof(tempString), "%s%d,%02X:%02X:%02X:%02X:%02X:%02X,", - rtkSettingsEntries[i].name, x, - settings.espnowPeers[x][0], settings.espnowPeers[x][1], settings.espnowPeers[x][2], - settings.espnowPeers[x][3], settings.espnowPeers[x][4], settings.espnowPeers[x][5]); - stringRecord(newSettings, tempString); - } - } - break; - case _ubxMessageRateBase: - { - // Record message settings - - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); - - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; - snprintf(tempString, sizeof(tempString), "%s%s,%d,", - rtkSettingsEntries[i].name, ubxMessages[firstRTCMRecord + x].msgTextName, - settings.ubxMessageRatesBase[x]); - stringRecord(newSettings, tempString); - } - } - break; - case _wifiNetwork: - { - // Record WiFi credential table - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[100]; // wifiNetwork_0Password=parachutes - - snprintf(tempString, sizeof(tempString), "%s%dSSID,%s,", rtkSettingsEntries[i].name, x, settings.wifiNetworks[x].ssid); - stringRecord(newSettings, tempString); - snprintf(tempString, sizeof(tempString), "%s%dPassword,%s,", rtkSettingsEntries[i].name, x, settings.wifiNetworks[x].password); - stringRecord(newSettings, tempString); - } - } - break; - case _ntripServerCasterHost: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; - snprintf(tempString, sizeof(tempString), "%s%d,%s,", - rtkSettingsEntries[i].name, x, - &settings.ntripServer_CasterHost[x][0]); - stringRecord(newSettings, tempString); - } - } - break; - case _ntripServerCasterPort: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; - snprintf(tempString, sizeof(tempString), "%s%d,%d,", - rtkSettingsEntries[i].name, x, - settings.ntripServer_CasterPort[x]); - stringRecord(newSettings, tempString); - } - } - break; - case _ntripServerCasterUser: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; - snprintf(tempString, sizeof(tempString), "%s%d,%s,", - rtkSettingsEntries[i].name, x, - &settings.ntripServer_CasterUser[x][0]); - stringRecord(newSettings, tempString); - } - } - break; - case _ntripServerCasterUserPW: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; - snprintf(tempString, sizeof(tempString), "%s%d,%s,", - rtkSettingsEntries[i].name, x, - &settings.ntripServer_CasterUserPW[x][0]); - stringRecord(newSettings, tempString); - } - } - break; - case _ntripServerMountPoint: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; - snprintf(tempString, sizeof(tempString), "%s%d,%s,", - rtkSettingsEntries[i].name, x, - &settings.ntripServer_MountPoint[x][0]); - stringRecord(newSettings, tempString); - } - } - break; - case _ntripServerMountPointPW: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; - snprintf(tempString, sizeof(tempString), "%s%d,%s,", - rtkSettingsEntries[i].name, x, - &settings.ntripServer_MountPointPW[x][0]); - stringRecord(newSettings, tempString); - } - } - break; - case _um980MessageRatesNMEA: - { - // Record UM980 NMEA rates - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; // um980MessageRatesNMEA_GPDTM=0.05 - snprintf(tempString, sizeof(tempString), "%s%s,%0.2f,", rtkSettingsEntries[i].name, umMessagesNMEA[x].msgTextName, - settings.um980MessageRatesNMEA[x]); - stringRecord(newSettings, tempString); - } - } - break; - case _um980MessageRatesRTCMRover: - { - // Record UM980 Rover RTCM rates - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; // um980MessageRatesRTCMRover_RTCM1001=0.2 - snprintf(tempString, sizeof(tempString), "%s%s,%0.2f,", rtkSettingsEntries[i].name, umMessagesRTCM[x].msgTextName, - settings.um980MessageRatesRTCMRover[x]); - stringRecord(newSettings, tempString); - } - } - break; - case _um980MessageRatesRTCMBase: - { - // Record UM980 Base RTCM rates - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; // um980MessageRatesRTCMBase.RTCM1001=0.2 - snprintf(tempString, sizeof(tempString), "%s%s,%0.2f,", rtkSettingsEntries[i].name, umMessagesRTCM[x].msgTextName, - settings.um980MessageRatesRTCMBase[x]); - stringRecord(newSettings, tempString); - } - } - break; - case _um980Constellations: - { - // Record UM980 Constellations - // um980Constellations are uint8_t, but here we have to convert to bool (true / false) so the web page - // check boxes are populated correctly. (We can't make it bool, otherwise the 254 initializer will probably fail...) - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; // um980Constellations.GLONASS=true - snprintf(tempString, sizeof(tempString), "%s%s,%s,", rtkSettingsEntries[i].name, um980ConstellationCommands[x].textName, - ((settings.um980Constellations[x] == 0) ? "false" : "true")); - stringRecord(newSettings, tempString); - } - } - break; - case _correctionsSourcesPriority: - { - // Record corrections priorities - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[80]; // correctionsPriority.Ethernet_IP_(PointPerfect/MQTT)=99 - snprintf(tempString, sizeof(tempString), "%s%s,%0d,", rtkSettingsEntries[i].name, correctionsSourceNames[x], - settings.correctionsSourcesPriority[x]); - stringRecord(newSettings, tempString); - } - } - break; - case _regionalCorrectionTopics: - { - for (int r = 0; r < rtkSettingsEntries[i].qualifier; r++) - { - char tempString[50]; - snprintf(tempString, sizeof(tempString), "%s%d,%s,", rtkSettingsEntries[i].name, r, - &settings.regionalCorrectionTopics[r][0]); - stringRecord(newSettings, tempString); - } - } - break; + default: + break; + case _bool: { + bool *ptr = (bool *)rtkSettingsEntries[i].var; + stringRecord(newSettings, rtkSettingsEntries[i].name, *ptr); } - } - } - - stringRecord(newSettings, "baseTypeSurveyIn", !settings.fixedBase); - stringRecord(newSettings, "baseTypeFixed", settings.fixedBase); - - if (settings.fixedBaseCoordinateType == COORD_TYPE_ECEF) - { - stringRecord(newSettings, "fixedBaseCoordinateTypeECEF", true); - stringRecord(newSettings, "fixedBaseCoordinateTypeGeo", false); - } - else - { - stringRecord(newSettings, "fixedBaseCoordinateTypeECEF", false); - stringRecord(newSettings, "fixedBaseCoordinateTypeGeo", true); - } - - stringRecord(newSettings, "measurementRateHz", 1.0 / gnssGetRateS(), 2); // 2 = decimals to print - - // System state at power on. Convert various system states to either Rover or Base or NTP. - int lastState; // 0 = Rover, 1 = Base, 2 = NTP - if (present.ethernet_ws5500 == true) + break; + case _int: { + int *ptr = (int *)rtkSettingsEntries[i].var; + stringRecord(newSettings, rtkSettingsEntries[i].name, *ptr); + } + break; + case _float: { + float *ptr = (float *)rtkSettingsEntries[i].var; + stringRecord(newSettings, rtkSettingsEntries[i].name, (double)*ptr, rtkSettingsEntries[i].qualifier); + } + break; + case _double: { + double *ptr = (double *)rtkSettingsEntries[i].var; + stringRecord(newSettings, rtkSettingsEntries[i].name, *ptr, rtkSettingsEntries[i].qualifier); + } + break; + case _uint8_t: { + uint8_t *ptr = (uint8_t *)rtkSettingsEntries[i].var; + stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); + } + break; + case _uint16_t: { + uint16_t *ptr = (uint16_t *)rtkSettingsEntries[i].var; + stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); + } + break; + case _uint32_t: { + uint32_t *ptr = (uint32_t *)rtkSettingsEntries[i].var; + stringRecord(newSettings, rtkSettingsEntries[i].name, *ptr); + } + break; + case _uint64_t: { + uint64_t *ptr = (uint64_t *)rtkSettingsEntries[i].var; + stringRecord(newSettings, rtkSettingsEntries[i].name, *ptr); + } + break; + case _int8_t: { + int8_t *ptr = (int8_t *)rtkSettingsEntries[i].var; + stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); + } + break; + case _int16_t: { + int16_t *ptr = (int16_t *)rtkSettingsEntries[i].var; + stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); + } + break; + case _muxConnectionType_e: { + muxConnectionType_e *ptr = (muxConnectionType_e *)rtkSettingsEntries[i].var; + stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); + } + break; + case _SystemState: { + SystemState *ptr = (SystemState *)rtkSettingsEntries[i].var; + stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); + } + break; + case _pulseEdgeType_e: { + pulseEdgeType_e *ptr = (pulseEdgeType_e *)rtkSettingsEntries[i].var; + stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); + } + break; + case _BluetoothRadioType_e: { + BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)rtkSettingsEntries[i].var; + stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); + } + break; + case _PeriodicDisplay_t: { + PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)rtkSettingsEntries[i].var; + stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); + } + break; + case _CoordinateInputType: { + CoordinateInputType *ptr = (CoordinateInputType *)rtkSettingsEntries[i].var; + stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); + } + break; + case _charArray: { + char *ptr = (char *)rtkSettingsEntries[i].var; + stringRecord(newSettings, rtkSettingsEntries[i].name, ptr); + } + break; + case _IPString: { + IPAddress *ptr = (IPAddress *)rtkSettingsEntries[i].var; + stringRecord(newSettings, rtkSettingsEntries[i].name, (char *)ptr->toString().c_str()); + } + break; + case _ubxMessageRates: { + // Record message settings + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; + snprintf(tempString, sizeof(tempString), "%s%s,%d,", rtkSettingsEntries[i].name, + ubxMessages[x].msgTextName, settings.ubxMessageRates[x]); + stringRecord(newSettings, tempString); + } + } + break; + case _ubxConstellations: { + // Record constellation settings + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; + snprintf(tempString, sizeof(tempString), "%s%s,%s,", rtkSettingsEntries[i].name, + settings.ubxConstellations[x].textName, + settings.ubxConstellations[x].enabled ? "true" : "false"); + stringRecord(newSettings, tempString); + } + } + break; + case _espnowPeers: { + // Record ESP-Now peer MAC addresses + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; // espnowPeers_1=B4:C1:33:42:DE:01, + snprintf(tempString, sizeof(tempString), "%s%d,%02X:%02X:%02X:%02X:%02X:%02X,", + rtkSettingsEntries[i].name, x, settings.espnowPeers[x][0], settings.espnowPeers[x][1], + settings.espnowPeers[x][2], settings.espnowPeers[x][3], settings.espnowPeers[x][4], + settings.espnowPeers[x][5]); + stringRecord(newSettings, tempString); + } + } + break; + case _ubxMessageRateBase: { + // Record message settings + + int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; + snprintf(tempString, sizeof(tempString), "%s%s,%d,", rtkSettingsEntries[i].name, + ubxMessages[firstRTCMRecord + x].msgTextName, settings.ubxMessageRatesBase[x]); + stringRecord(newSettings, tempString); + } + } + break; + case _wifiNetwork: { + // Record WiFi credential table + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[100]; // wifiNetwork_0Password=parachutes + + snprintf(tempString, sizeof(tempString), "%s%dSSID,%s,", rtkSettingsEntries[i].name, x, + settings.wifiNetworks[x].ssid); + stringRecord(newSettings, tempString); + snprintf(tempString, sizeof(tempString), "%s%dPassword,%s,", rtkSettingsEntries[i].name, x, + settings.wifiNetworks[x].password); + stringRecord(newSettings, tempString); + } + } + break; + case _ntripServerCasterHost: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; + snprintf(tempString, sizeof(tempString), "%s%d,%s,", rtkSettingsEntries[i].name, x, + &settings.ntripServer_CasterHost[x][0]); + stringRecord(newSettings, tempString); + } + } + break; + case _ntripServerCasterPort: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; + snprintf(tempString, sizeof(tempString), "%s%d,%d,", rtkSettingsEntries[i].name, x, + settings.ntripServer_CasterPort[x]); + stringRecord(newSettings, tempString); + } + } + break; + case _ntripServerCasterUser: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; + snprintf(tempString, sizeof(tempString), "%s%d,%s,", rtkSettingsEntries[i].name, x, + &settings.ntripServer_CasterUser[x][0]); + stringRecord(newSettings, tempString); + } + } + break; + case _ntripServerCasterUserPW: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; + snprintf(tempString, sizeof(tempString), "%s%d,%s,", rtkSettingsEntries[i].name, x, + &settings.ntripServer_CasterUserPW[x][0]); + stringRecord(newSettings, tempString); + } + } + break; + case _ntripServerMountPoint: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; + snprintf(tempString, sizeof(tempString), "%s%d,%s,", rtkSettingsEntries[i].name, x, + &settings.ntripServer_MountPoint[x][0]); + stringRecord(newSettings, tempString); + } + } + break; + case _ntripServerMountPointPW: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; + snprintf(tempString, sizeof(tempString), "%s%d,%s,", rtkSettingsEntries[i].name, x, + &settings.ntripServer_MountPointPW[x][0]); + stringRecord(newSettings, tempString); + } + } + break; + case _um980MessageRatesNMEA: { + // Record UM980 NMEA rates + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; // um980MessageRatesNMEA_GPDTM=0.05 + snprintf(tempString, sizeof(tempString), "%s%s,%0.2f,", rtkSettingsEntries[i].name, + umMessagesNMEA[x].msgTextName, settings.um980MessageRatesNMEA[x]); + stringRecord(newSettings, tempString); + } + } + break; + case _um980MessageRatesRTCMRover: { + // Record UM980 Rover RTCM rates + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; // um980MessageRatesRTCMRover_RTCM1001=0.2 + snprintf(tempString, sizeof(tempString), "%s%s,%0.2f,", rtkSettingsEntries[i].name, + umMessagesRTCM[x].msgTextName, settings.um980MessageRatesRTCMRover[x]); + stringRecord(newSettings, tempString); + } + } + break; + case _um980MessageRatesRTCMBase: { + // Record UM980 Base RTCM rates + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; // um980MessageRatesRTCMBase.RTCM1001=0.2 + snprintf(tempString, sizeof(tempString), "%s%s,%0.2f,", rtkSettingsEntries[i].name, + umMessagesRTCM[x].msgTextName, settings.um980MessageRatesRTCMBase[x]); + stringRecord(newSettings, tempString); + } + } + break; + case _um980Constellations: { + // Record UM980 Constellations + // um980Constellations are uint8_t, but here we have to convert to bool (true / false) so the web page + // check boxes are populated correctly. (We can't make it bool, otherwise the 254 initializer will + // probably fail...) + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; // um980Constellations.GLONASS=true + snprintf(tempString, sizeof(tempString), "%s%s,%s,", rtkSettingsEntries[i].name, + um980ConstellationCommands[x].textName, + ((settings.um980Constellations[x] == 0) ? "false" : "true")); + stringRecord(newSettings, tempString); + } + } + break; + case _correctionsSourcesPriority: { + // Record corrections priorities + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[80]; // correctionsPriority.Ethernet_IP_(PointPerfect/MQTT)=99 + snprintf(tempString, sizeof(tempString), "%s%s,%0d,", rtkSettingsEntries[i].name, + correctionsSourceNames[x], settings.correctionsSourcesPriority[x]); + stringRecord(newSettings, tempString); + } + } + break; + case _regionalCorrectionTopics: { + for (int r = 0; r < rtkSettingsEntries[i].qualifier; r++) + { + char tempString[50]; + snprintf(tempString, sizeof(tempString), "%s%d,%s,", rtkSettingsEntries[i].name, r, + &settings.regionalCorrectionTopics[r][0]); + stringRecord(newSettings, tempString); + } + } + break; + } + } + } + + stringRecord(newSettings, "baseTypeSurveyIn", !settings.fixedBase); + stringRecord(newSettings, "baseTypeFixed", settings.fixedBase); + + if (settings.fixedBaseCoordinateType == COORD_TYPE_ECEF) + { + stringRecord(newSettings, "fixedBaseCoordinateTypeECEF", true); + stringRecord(newSettings, "fixedBaseCoordinateTypeGeo", false); + } + else + { + stringRecord(newSettings, "fixedBaseCoordinateTypeECEF", false); + stringRecord(newSettings, "fixedBaseCoordinateTypeGeo", true); + } + + stringRecord(newSettings, "measurementRateHz", 1.0 / gnssGetRateS(), 2); // 2 = decimals to print + + // System state at power on. Convert various system states to either Rover or Base or NTP. + int lastState; // 0 = Rover, 1 = Base, 2 = NTP + if (present.ethernet_ws5500 == true) { lastState = 1; // Default Base if (settings.lastState >= STATE_ROVER_NOT_STARTED && settings.lastState <= STATE_ROVER_RTK_FIX) @@ -1582,364 +1524,336 @@ bool getSettingValue(const char *settingName, char *settingValueStr) for (int i = 0; i < numRtkSettingsEntries; i++) { // For speed, compare the first letter, then the whole string - if ((rtkSettingsEntries[i].name[0] == truncatedName[0]) && (strcmp(rtkSettingsEntries[i].name, truncatedName) == 0)) + if ((rtkSettingsEntries[i].name[0] == truncatedName[0]) && + (strcmp(rtkSettingsEntries[i].name, truncatedName) == 0)) { switch (rtkSettingsEntries[i].type) { - default: - break; - case _bool: - { - bool *ptr = (bool *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, *ptr); - knownSetting = true; - } - break; - case _int: - { - int *ptr = (int *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, *ptr); - knownSetting = true; - } - break; - case _float: - { - float *ptr = (float *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (double)*ptr); - knownSetting = true; - } - break; - case _double: - { - double *ptr = (double *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, *ptr); - knownSetting = true; - } - break; - case _uint8_t: - { - uint8_t *ptr = (uint8_t *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); - knownSetting = true; - } - break; - case _uint16_t: - { - uint16_t *ptr = (uint16_t *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); - knownSetting = true; - } - break; - case _uint32_t: - { - uint32_t *ptr = (uint32_t *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, *ptr); - knownSetting = true; - } - break; - case _uint64_t: - { - uint64_t *ptr = (uint64_t *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, *ptr); - knownSetting = true; - } - break; - case _int8_t: + default: + break; + case _bool: { + bool *ptr = (bool *)rtkSettingsEntries[i].var; + writeToString(settingValueStr, *ptr); + knownSetting = true; + } + break; + case _int: { + int *ptr = (int *)rtkSettingsEntries[i].var; + writeToString(settingValueStr, *ptr); + knownSetting = true; + } + break; + case _float: { + float *ptr = (float *)rtkSettingsEntries[i].var; + writeToString(settingValueStr, (double)*ptr); + knownSetting = true; + } + break; + case _double: { + double *ptr = (double *)rtkSettingsEntries[i].var; + writeToString(settingValueStr, *ptr); + knownSetting = true; + } + break; + case _uint8_t: { + uint8_t *ptr = (uint8_t *)rtkSettingsEntries[i].var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case _uint16_t: { + uint16_t *ptr = (uint16_t *)rtkSettingsEntries[i].var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case _uint32_t: { + uint32_t *ptr = (uint32_t *)rtkSettingsEntries[i].var; + writeToString(settingValueStr, *ptr); + knownSetting = true; + } + break; + case _uint64_t: { + uint64_t *ptr = (uint64_t *)rtkSettingsEntries[i].var; + writeToString(settingValueStr, *ptr); + knownSetting = true; + } + break; + case _int8_t: { + int8_t *ptr = (int8_t *)rtkSettingsEntries[i].var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case _int16_t: { + int16_t *ptr = (int16_t *)rtkSettingsEntries[i].var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case _muxConnectionType_e: { + muxConnectionType_e *ptr = (muxConnectionType_e *)rtkSettingsEntries[i].var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case _SystemState: { + SystemState *ptr = (SystemState *)rtkSettingsEntries[i].var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case _pulseEdgeType_e: { + pulseEdgeType_e *ptr = (pulseEdgeType_e *)rtkSettingsEntries[i].var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case _BluetoothRadioType_e: { + BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)rtkSettingsEntries[i].var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case _PeriodicDisplay_t: { + PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)rtkSettingsEntries[i].var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case _CoordinateInputType: { + CoordinateInputType *ptr = (CoordinateInputType *)rtkSettingsEntries[i].var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case _charArray: { + char *ptr = (char *)rtkSettingsEntries[i].var; + writeToString(settingValueStr, ptr); + knownSetting = true; + } + break; + case _IPString: { + IPAddress *ptr = (IPAddress *)rtkSettingsEntries[i].var; + writeToString(settingValueStr, (char *)ptr->toString().c_str()); + knownSetting = true; + } + break; + case _ubxMessageRates: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + if ((suffix[0] == ubxMessages[x].msgTextName[0]) && + (strcmp(suffix, ubxMessages[x].msgTextName) == 0)) { - int8_t *ptr = (int8_t *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); + writeToString(settingValueStr, settings.ubxMessageRates[x]); knownSetting = true; + break; } - break; - case _int16_t: + } + } + break; + case _ubxConstellations: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + if ((suffix[0] == settings.ubxConstellations[x].textName[0]) && + (strcmp(suffix, settings.ubxConstellations[x].textName) == 0)) { - int16_t *ptr = (int16_t *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); + writeToString(settingValueStr, settings.ubxConstellations[x].enabled); knownSetting = true; + break; } - break; - case _muxConnectionType_e: + } + } + break; + case _espnowPeers: { + int suffixNum; + if (sscanf(suffix, "%d", &suffixNum) == 1) + { + char peer[18]; + snprintf(peer, sizeof(peer), "%X:%X:%X:%X:%X:%X", settings.espnowPeers[suffixNum][0], + settings.espnowPeers[suffixNum][1], settings.espnowPeers[suffixNum][2], + settings.espnowPeers[suffixNum][3], settings.espnowPeers[suffixNum][4], + settings.espnowPeers[suffixNum][5]); + writeToString(settingValueStr, peer); + knownSetting = true; + } + } + break; + case _ubxMessageRateBase: { + int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + if ((suffix[0] == ubxMessages[firstRTCMRecord + x].msgTextName[0]) && + (strcmp(suffix, ubxMessages[firstRTCMRecord + x].msgTextName) == 0)) { - muxConnectionType_e *ptr = (muxConnectionType_e *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); + writeToString(settingValueStr, settings.ubxMessageRatesBase[x]); knownSetting = true; + break; } - break; - case _SystemState: + } + } + break; + case _wifiNetwork: { + int network; + + if (strstr(suffix, "SSID") != nullptr) + { + if (sscanf(suffix, "%dSSID", &network) == 1) { - SystemState *ptr = (SystemState *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); + writeToString(settingValueStr, settings.wifiNetworks[network].ssid); knownSetting = true; } - break; - case _pulseEdgeType_e: + } + else if (strstr(suffix, "Password") != nullptr) + { + if (sscanf(suffix, "%dPassword", &network) == 1) { - pulseEdgeType_e *ptr = (pulseEdgeType_e *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); + writeToString(settingValueStr, settings.wifiNetworks[network].password); knownSetting = true; } - break; - case _BluetoothRadioType_e: + } + } + break; + case _ntripServerCasterHost: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + writeToString(settingValueStr, settings.ntripServer_CasterHost[server]); + knownSetting = true; + } + } + break; + case _ntripServerCasterPort: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + writeToString(settingValueStr, settings.ntripServer_CasterPort[server]); + knownSetting = true; + } + } + break; + case _ntripServerCasterUser: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + writeToString(settingValueStr, settings.ntripServer_CasterUser[server]); + knownSetting = true; + } + } + break; + case _ntripServerCasterUserPW: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + writeToString(settingValueStr, settings.ntripServer_CasterUserPW[server]); + knownSetting = true; + } + } + break; + case _ntripServerMountPoint: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + writeToString(settingValueStr, settings.ntripServer_MountPoint[server]); + knownSetting = true; + } + } + break; + case _ntripServerMountPointPW: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + writeToString(settingValueStr, settings.ntripServer_MountPointPW[server]); + knownSetting = true; + } + } + break; + case _um980MessageRatesNMEA: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + if ((suffix[0] == umMessagesNMEA[x].msgTextName[0]) && + (strcmp(suffix, umMessagesNMEA[x].msgTextName) == 0)) { - BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); + writeToString(settingValueStr, settings.um980MessageRatesNMEA[x]); knownSetting = true; + break; } - break; - case _PeriodicDisplay_t: + } + } + break; + case _um980MessageRatesRTCMRover: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && + (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) { - PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); + writeToString(settingValueStr, settings.um980MessageRatesRTCMRover[x]); knownSetting = true; + break; } - break; - case _CoordinateInputType: + } + } + break; + case _um980MessageRatesRTCMBase: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && + (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) { - CoordinateInputType *ptr = (CoordinateInputType *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); + writeToString(settingValueStr, settings.um980MessageRatesRTCMBase[x]); knownSetting = true; + break; } - break; - case _charArray: + } + } + break; + case _um980Constellations: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + if ((suffix[0] == um980ConstellationCommands[x].textName[0]) && + (strcmp(suffix, um980ConstellationCommands[x].textName) == 0)) { - char *ptr = (char *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, ptr); + writeToString(settingValueStr, settings.um980Constellations[x]); knownSetting = true; + break; } - break; - case _IPString: + } + } + break; + case _correctionsSourcesPriority: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + if ((suffix[0] == correctionsSourceNames[x][0]) && (strcmp(suffix, correctionsSourceNames[x]) == 0)) { - IPAddress *ptr = (IPAddress *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (char *)ptr->toString().c_str()); + writeToString(settingValueStr, settings.correctionsSourcesPriority[x]); knownSetting = true; + break; } - break; - case _ubxMessageRates: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == ubxMessages[x].msgTextName[0]) && (strcmp(suffix, ubxMessages[x].msgTextName) == 0)) - { - writeToString(settingValueStr, settings.ubxMessageRates[x]); - knownSetting = true; - break; - } - } - } - break; - case _ubxConstellations: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == settings.ubxConstellations[x].textName[0]) && (strcmp(suffix, settings.ubxConstellations[x].textName) == 0)) - { - writeToString(settingValueStr, settings.ubxConstellations[x].enabled); - knownSetting = true; - break; - } - } - } - break; - case _espnowPeers: - { - int suffixNum; - if (sscanf(suffix, "%d", &suffixNum) == 1) - { - char peer[18]; - snprintf(peer, sizeof(peer), "%X:%X:%X:%X:%X:%X", - settings.espnowPeers[suffixNum][0], settings.espnowPeers[suffixNum][1], - settings.espnowPeers[suffixNum][2], settings.espnowPeers[suffixNum][3], - settings.espnowPeers[suffixNum][4], settings.espnowPeers[suffixNum][5]); - writeToString(settingValueStr, peer); - knownSetting = true; - } - } - break; - case _ubxMessageRateBase: - { - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); - - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == ubxMessages[firstRTCMRecord + x].msgTextName[0]) && (strcmp(suffix, ubxMessages[firstRTCMRecord + x].msgTextName) == 0)) - { - writeToString(settingValueStr, settings.ubxMessageRatesBase[x]); - knownSetting = true; - break; - } - } - } - break; - case _wifiNetwork: - { - int network; - - if (strstr(suffix, "SSID") != nullptr) - { - if (sscanf(suffix, "%dSSID", &network) == 1) - { - writeToString(settingValueStr, settings.wifiNetworks[network].ssid); - knownSetting = true; - } - } - else if (strstr(suffix, "Password") != nullptr) - { - if (sscanf(suffix, "%dPassword", &network) == 1) - { - writeToString(settingValueStr, settings.wifiNetworks[network].password); - knownSetting = true; - } - } - } - break; - case _ntripServerCasterHost: - { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - writeToString(settingValueStr, settings.ntripServer_CasterHost[server]); - knownSetting = true; - } - } - break; - case _ntripServerCasterPort: - { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - writeToString(settingValueStr, settings.ntripServer_CasterPort[server]); - knownSetting = true; - } - } - break; - case _ntripServerCasterUser: - { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - writeToString(settingValueStr, settings.ntripServer_CasterUser[server]); - knownSetting = true; - } - } - break; - case _ntripServerCasterUserPW: - { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - writeToString(settingValueStr, settings.ntripServer_CasterUserPW[server]); - knownSetting = true; - } - } - break; - case _ntripServerMountPoint: - { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - writeToString(settingValueStr, settings.ntripServer_MountPoint[server]); - knownSetting = true; - } - } - break; - case _ntripServerMountPointPW: - { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - writeToString(settingValueStr, settings.ntripServer_MountPointPW[server]); - knownSetting = true; - } - } - break; - case _um980MessageRatesNMEA: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == umMessagesNMEA[x].msgTextName[0]) && (strcmp(suffix, umMessagesNMEA[x].msgTextName) == 0)) - { - writeToString(settingValueStr, settings.um980MessageRatesNMEA[x]); - knownSetting = true; - break; - } - } - } - break; - case _um980MessageRatesRTCMRover: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) - { - writeToString(settingValueStr, settings.um980MessageRatesRTCMRover[x]); - knownSetting = true; - break; - } - } - } - break; - case _um980MessageRatesRTCMBase: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) - { - writeToString(settingValueStr, settings.um980MessageRatesRTCMBase[x]); - knownSetting = true; - break; - } - } - } - break; - case _um980Constellations: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == um980ConstellationCommands[x].textName[0]) && (strcmp(suffix, um980ConstellationCommands[x].textName) == 0)) - { - writeToString(settingValueStr, settings.um980Constellations[x]); - knownSetting = true; - break; - } - } - } - break; - case _correctionsSourcesPriority: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == correctionsSourceNames[x][0]) && (strcmp(suffix, correctionsSourceNames[x]) == 0)) - { - writeToString(settingValueStr, settings.correctionsSourcesPriority[x]); - knownSetting = true; - break; - } - } - } - break; - case _regionalCorrectionTopics: - { - int region; - if (sscanf(suffix, "%d", ®ion) == 1) - { - writeToString(settingValueStr, settings.regionalCorrectionTopics[region]); - knownSetting = true; - } - } - break; + } + } + break; + case _regionalCorrectionTopics: { + int region; + if (sscanf(suffix, "%d", ®ion) == 1) + { + writeToString(settingValueStr, settings.regionalCorrectionTopics[region]); + knownSetting = true; + } + } + break; } } } if (knownSetting == false) { - //Report deviceID over CLI - Useful for label generation + // Report deviceID over CLI - Useful for label generation if (strcmp(settingName, "deviceId") == 0) { char hardwareID[15]; snprintf(hardwareID, sizeof(hardwareID), "%02X%02X%02X%02X%02X%02X%02X", btMACAddress[0], btMACAddress[1], - btMACAddress[2], btMACAddress[3], btMACAddress[4], btMACAddress[5], - productVariant); + btMACAddress[2], btMACAddress[3], btMACAddress[4], btMACAddress[5], productVariant); writeToString(settingValueStr, hardwareID); knownSetting = true; @@ -2068,7 +1982,6 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } } - if (knownSetting == false) { if (settings.debugWiFiConfig) @@ -2088,247 +2001,221 @@ void printAvailableSettings() { switch (rtkSettingsEntries[i].type) { - default: - break; - case _bool: - { - systemPrintf("%s,bool,", rtkSettingsEntries[i].name); - } - break; - case _int: - { - systemPrintf("%s,int,", rtkSettingsEntries[i].name); - } - break; - case _float: - { - systemPrintf("%s,float,", rtkSettingsEntries[i].name); - } - break; - case _double: - { - systemPrintf("%s,double,", rtkSettingsEntries[i].name); - } - break; - case _uint8_t: - { - systemPrintf("%s,uint8_t,", rtkSettingsEntries[i].name); - } - break; - case _uint16_t: - { - systemPrintf("%s,uint16_t,", rtkSettingsEntries[i].name); - } - break; - case _uint32_t: - { - systemPrintf("%s,uint32_t,", rtkSettingsEntries[i].name); - } - break; - case _uint64_t: - { - systemPrintf("%s,uint64_t,", rtkSettingsEntries[i].name); - } - break; - case _int8_t: - { - systemPrintf("%s,int8_t,", rtkSettingsEntries[i].name); - } - break; - case _int16_t: - { - systemPrintf("%s,int16_t,", rtkSettingsEntries[i].name); - } - break; - case _muxConnectionType_e: - { - systemPrintf("%s,muxConnectionType_e,", rtkSettingsEntries[i].name); - } - break; - case _SystemState: - { - systemPrintf("%s,SystemState,", rtkSettingsEntries[i].name); - } - break; - case _pulseEdgeType_e: - { - systemPrintf("%s,pulseEdgeType_e,", rtkSettingsEntries[i].name); - } - break; - case _BluetoothRadioType_e: - { - systemPrintf("%s,BluetoothRadioType_e,", rtkSettingsEntries[i].name); - } - break; - case _PeriodicDisplay_t: - { - systemPrintf("%s,PeriodicDisplay_t,", rtkSettingsEntries[i].name); - } - break; - case _CoordinateInputType: - { - systemPrintf("%s,CoordinateInputType,", rtkSettingsEntries[i].name); - } - break; - case _charArray: - { - systemPrintf("%s,char[%d],", rtkSettingsEntries[i].name, rtkSettingsEntries[i].qualifier); - } - break; - case _IPString: - { - systemPrintf("%s,IPAddress,", rtkSettingsEntries[i].name); - } - break; - case _ubxMessageRates: - { - // Record message settings - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - systemPrintf("%s%s,uint8_t,", rtkSettingsEntries[i].name, ubxMessages[x].msgTextName); - } - } - break; - case _ubxConstellations: - { - // Record constellation settings - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - systemPrintf("%s%s,bool,", rtkSettingsEntries[i].name, settings.ubxConstellations[x].textName); - } - } - break; - case _espnowPeers: - { - // Record ESP-Now peer MAC addresses - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - systemPrintf("%s%d,uint8_t[%d],", rtkSettingsEntries[i].name, x, sizeof(settings.espnowPeers[0])); - } - } - break; - case _ubxMessageRateBase: - { - // Record message settings - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + default: + break; + case _bool: { + systemPrintf("%s,bool,", rtkSettingsEntries[i].name); + } + break; + case _int: { + systemPrintf("%s,int,", rtkSettingsEntries[i].name); + } + break; + case _float: { + systemPrintf("%s,float,", rtkSettingsEntries[i].name); + } + break; + case _double: { + systemPrintf("%s,double,", rtkSettingsEntries[i].name); + } + break; + case _uint8_t: { + systemPrintf("%s,uint8_t,", rtkSettingsEntries[i].name); + } + break; + case _uint16_t: { + systemPrintf("%s,uint16_t,", rtkSettingsEntries[i].name); + } + break; + case _uint32_t: { + systemPrintf("%s,uint32_t,", rtkSettingsEntries[i].name); + } + break; + case _uint64_t: { + systemPrintf("%s,uint64_t,", rtkSettingsEntries[i].name); + } + break; + case _int8_t: { + systemPrintf("%s,int8_t,", rtkSettingsEntries[i].name); + } + break; + case _int16_t: { + systemPrintf("%s,int16_t,", rtkSettingsEntries[i].name); + } + break; + case _muxConnectionType_e: { + systemPrintf("%s,muxConnectionType_e,", rtkSettingsEntries[i].name); + } + break; + case _SystemState: { + systemPrintf("%s,SystemState,", rtkSettingsEntries[i].name); + } + break; + case _pulseEdgeType_e: { + systemPrintf("%s,pulseEdgeType_e,", rtkSettingsEntries[i].name); + } + break; + case _BluetoothRadioType_e: { + systemPrintf("%s,BluetoothRadioType_e,", rtkSettingsEntries[i].name); + } + break; + case _PeriodicDisplay_t: { + systemPrintf("%s,PeriodicDisplay_t,", rtkSettingsEntries[i].name); + } + break; + case _CoordinateInputType: { + systemPrintf("%s,CoordinateInputType,", rtkSettingsEntries[i].name); + } + break; + case _charArray: { + systemPrintf("%s,char[%d],", rtkSettingsEntries[i].name, rtkSettingsEntries[i].qualifier); + } + break; + case _IPString: { + systemPrintf("%s,IPAddress,", rtkSettingsEntries[i].name); + } + break; + case _ubxMessageRates: { + // Record message settings + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + systemPrintf("%s%s,uint8_t,", rtkSettingsEntries[i].name, ubxMessages[x].msgTextName); + } + } + break; + case _ubxConstellations: { + // Record constellation settings + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + systemPrintf("%s%s,bool,", rtkSettingsEntries[i].name, settings.ubxConstellations[x].textName); + } + } + break; + case _espnowPeers: { + // Record ESP-Now peer MAC addresses + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + systemPrintf("%s%d,uint8_t[%d],", rtkSettingsEntries[i].name, x, sizeof(settings.espnowPeers[0])); + } + } + break; + case _ubxMessageRateBase: { + // Record message settings + int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - systemPrintf("%s%s,uint8_t,", rtkSettingsEntries[i].name, ubxMessages[firstRTCMRecord + x].msgTextName); - } - } - break; - case _wifiNetwork: - { - // Record WiFi credential table - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - systemPrintf("%s%dSSID,char[%d],", rtkSettingsEntries[i].name, x, sizeof(settings.wifiNetworks[0].ssid)); - systemPrintf("%s%dPassword,char[%d],", rtkSettingsEntries[i].name, x, sizeof(settings.wifiNetworks[0].password)); - } - } - break; - case _ntripServerCasterHost: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - systemPrintf("%s%d,char[%d],", rtkSettingsEntries[i].name, x, sizeof(settings.ntripServer_CasterHost[x])); - } - } - break; - case _ntripServerCasterPort: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - systemPrintf("%s%d,uint16_t,", rtkSettingsEntries[i].name, x); - } - } - break; - case _ntripServerCasterUser: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - systemPrintf("%s%d,char[%d],", rtkSettingsEntries[i].name, x, sizeof(settings.ntripServer_CasterUser[x])); - } - } - break; - case _ntripServerCasterUserPW: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - systemPrintf("%s%d,char[%d],", rtkSettingsEntries[i].name, x, sizeof(settings.ntripServer_CasterUserPW[x])); - } - } - break; - case _ntripServerMountPoint: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - systemPrintf("%s%d,char[%d],", rtkSettingsEntries[i].name, x, sizeof(settings.ntripServer_MountPoint[x])); - } - } - break; - case _ntripServerMountPointPW: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - systemPrintf("%s%d,char[%d],", rtkSettingsEntries[i].name, x, sizeof(settings.ntripServer_MountPointPW[x])); - } - } - break; - case _um980MessageRatesNMEA: - { - // Record UM980 NMEA rates - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - systemPrintf("%s%s,float,", rtkSettingsEntries[i].name, umMessagesNMEA[x].msgTextName); - } - } - break; - case _um980MessageRatesRTCMRover: - { - // Record UM980 Rover RTCM rates - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - systemPrintf("%s%s,float,", rtkSettingsEntries[i].name, umMessagesRTCM[x].msgTextName); - } - } - break; - case _um980MessageRatesRTCMBase: - { - // Record UM980 Base RTCM rates - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - systemPrintf("%s%s,float,", rtkSettingsEntries[i].name, umMessagesRTCM[x].msgTextName); - } - } - break; - case _um980Constellations: - { - // Record UM980 Constellations - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - systemPrintf("%s%s,uint8_t,", rtkSettingsEntries[i].name, um980ConstellationCommands[x].textName); - } - } - break; - case _correctionsSourcesPriority: - { - // Record corrections priorities - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - systemPrintf("%s%s,int,", rtkSettingsEntries[i].name, correctionsSourceNames[x]); - } - } - break; - case _regionalCorrectionTopics: - { - for (int r = 0; r < rtkSettingsEntries[i].qualifier; r++) - { - systemPrintf("%s%d,char[%d],", rtkSettingsEntries[i].name, r, sizeof(settings.regionalCorrectionTopics[0])); - } - } - break; + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + systemPrintf("%s%s,uint8_t,", rtkSettingsEntries[i].name, + ubxMessages[firstRTCMRecord + x].msgTextName); + } + } + break; + case _wifiNetwork: { + // Record WiFi credential table + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + systemPrintf("%s%dSSID,char[%d],", rtkSettingsEntries[i].name, x, + sizeof(settings.wifiNetworks[0].ssid)); + systemPrintf("%s%dPassword,char[%d],", rtkSettingsEntries[i].name, x, + sizeof(settings.wifiNetworks[0].password)); + } + } + break; + case _ntripServerCasterHost: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + systemPrintf("%s%d,char[%d],", rtkSettingsEntries[i].name, x, + sizeof(settings.ntripServer_CasterHost[x])); + } + } + break; + case _ntripServerCasterPort: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + systemPrintf("%s%d,uint16_t,", rtkSettingsEntries[i].name, x); + } + } + break; + case _ntripServerCasterUser: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + systemPrintf("%s%d,char[%d],", rtkSettingsEntries[i].name, x, + sizeof(settings.ntripServer_CasterUser[x])); + } + } + break; + case _ntripServerCasterUserPW: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + systemPrintf("%s%d,char[%d],", rtkSettingsEntries[i].name, x, + sizeof(settings.ntripServer_CasterUserPW[x])); + } + } + break; + case _ntripServerMountPoint: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + systemPrintf("%s%d,char[%d],", rtkSettingsEntries[i].name, x, + sizeof(settings.ntripServer_MountPoint[x])); + } + } + break; + case _ntripServerMountPointPW: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + systemPrintf("%s%d,char[%d],", rtkSettingsEntries[i].name, x, + sizeof(settings.ntripServer_MountPointPW[x])); + } + } + break; + case _um980MessageRatesNMEA: { + // Record UM980 NMEA rates + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + systemPrintf("%s%s,float,", rtkSettingsEntries[i].name, umMessagesNMEA[x].msgTextName); + } + } + break; + case _um980MessageRatesRTCMRover: { + // Record UM980 Rover RTCM rates + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + systemPrintf("%s%s,float,", rtkSettingsEntries[i].name, umMessagesRTCM[x].msgTextName); + } + } + break; + case _um980MessageRatesRTCMBase: { + // Record UM980 Base RTCM rates + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + systemPrintf("%s%s,float,", rtkSettingsEntries[i].name, umMessagesRTCM[x].msgTextName); + } + } + break; + case _um980Constellations: { + // Record UM980 Constellations + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + systemPrintf("%s%s,uint8_t,", rtkSettingsEntries[i].name, um980ConstellationCommands[x].textName); + } + } + break; + case _correctionsSourcesPriority: { + // Record corrections priorities + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + systemPrintf("%s%s,int,", rtkSettingsEntries[i].name, correctionsSourceNames[x]); + } + } + break; + case _regionalCorrectionTopics: { + for (int r = 0; r < rtkSettingsEntries[i].qualifier; r++) + { + systemPrintf("%s%d,char[%d],", rtkSettingsEntries[i].name, r, + sizeof(settings.regionalCorrectionTopics[0])); + } + } + break; } } } From c84102a5ce35196dfbde8644d450edce451187e6 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Mon, 13 May 2024 16:56:59 -0600 Subject: [PATCH 007/358] Update CommandLineStructure.ino --- .../CommandLineStructure.ino | 68 +++++++++++-------- 1 file changed, 39 insertions(+), 29 deletions(-) diff --git a/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino b/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino index e7c694bea..073311148 100644 --- a/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino +++ b/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino @@ -5,6 +5,9 @@ int pin_UART1_TX = 4; int pin_UART1_RX = 13; +const uint16_t bufferLen = 1024; +char cmdBuffer[bufferLen]; + void setup() { Serial.begin(115200); @@ -12,85 +15,82 @@ void setup() Serial.println(); Serial.println("SparkFun Command Line Interface Tests"); - const uint16_t bufferLen = 1024; - char cmdBuffer[bufferLen]; - sprintf(cmdBuffer, "$CMD*4A"); //Bad command Serial.printf("command: %s (BAD) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPCMD*AA"); //Bad checksum Serial.printf("command: %s (BAD) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPCMD*49"); //Valid command Serial.printf("command: %s (GOOD) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); Serial.println(); sprintf(cmdBuffer, "$SPGET,elvMask,15*1A"); //Bad command Serial.printf("command: %s (BAD) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPGET*55"); //Bad command Serial.printf("command: %s (BAD) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPGET,rando*0F"); //Unknown setting Serial.printf("command: %s (BAD) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPGET,elvMask*32"); //Valid command Serial.printf("command: %s (GOOD) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); Serial.println(); sprintf(cmdBuffer, "$SPSET,elvMask*26"); //Incorrect number of arguments Serial.printf("command: %s (BAD) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPSET,rando,15*33"); //Unknown setting Serial.printf("command: %s (BAD) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPSET,elvMask,0.77*14"); //Valid Serial.printf("command: %s (GOOD) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); Serial.println(); sprintf(cmdBuffer, "$SPEXE*5B"); //Incorrect number of arguments Serial.printf("command: %s (BAD) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPEXE,rando*01"); //Unknown command Serial.printf("command: %s (BAD) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPEXE,EXIT*77"); //Valid Serial.printf("command: %s (GOOD) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPEXE,APPLY*23"); //Valid Serial.printf("command: %s (GOOD) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPEXE,SAVE*76"); //Valid Serial.printf("command: %s (GOOD) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPEXE,REBOOT*76"); //Valid Serial.printf("command: %s (GOOD) - ", cmdBuffer); - commandParser(cmdBuffer); - + commandParser(); + sprintf(cmdBuffer, "$SPEXE,LIST*75"); //Valid Serial.printf("command: %s (GOOD) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); } -void commandParser(char *cmdBuffer) +void commandParser() { //Verify command structure if (commandValid(cmdBuffer) == false) @@ -100,10 +100,10 @@ void commandParser(char *cmdBuffer) } //Remove $ - cmdBuffer = &cmdBuffer[1]; + char *command = cmdBuffer + 1; //Remove * and CRC - cmdBuffer[strlen(cmdBuffer) - 3] = '\0'; + command[strlen(command) - 3] = '\0'; const uint16_t bufferLen = 1024; const int MAX_TOKENS = 10; @@ -113,7 +113,7 @@ void commandParser(char *cmdBuffer) char *tokens[MAX_TOKENS]; const char *delimiter = ","; int tokenCount = 0; - tokens[tokenCount] = strtok(cmdBuffer, delimiter); + tokens[tokenCount] = strtok(command, delimiter); while (tokens[tokenCount] != nullptr && tokenCount < MAX_TOKENS) { @@ -139,7 +139,7 @@ void commandParser(char *cmdBuffer) if (getSettingValue(field, valueBuffer) == true) commandSendValueResponse(tokens[0], field, valueBuffer); //Send structured response else - commandSendErrorResponse(tokens[0], "Unknown setting"); + commandSendErrorResponse(tokens[0], field, "Unknown setting"); } } else if (strcmp(tokens[0], "SPSET") == 0) @@ -153,7 +153,7 @@ void commandParser(char *cmdBuffer) if (updateSettingWithValue(field, value) == true) commandSendValueOkResponse(tokens[0], field, value); else - commandSendErrorResponse(tokens[0], "Unknown setting"); + commandSendErrorResponse(tokens[0], field, "Unknown setting"); } } else if (strcmp(tokens[0], "SPEXE") == 0) @@ -185,7 +185,7 @@ void commandParser(char *cmdBuffer) else if (strcmp(tokens[1], "LIST") == 0) { Serial.println(); //TODO remove, just needed for pretty printing - + //Respond with list of variables commandSendExecuteListResponse("observationSeconds", "int", "10"); commandSendExecuteListResponse("observationPositionAccuracy", "float", "0.5"); @@ -193,7 +193,7 @@ void commandParser(char *cmdBuffer) commandSendExecuteOkResponse(tokens[0], tokens[1]); } else - commandSendErrorResponse(tokens[0], "Unknown command"); + commandSendErrorResponse(tokens[0], tokens[1], "Unknown command"); } } else @@ -262,6 +262,16 @@ void commandSendValueOkResponse(char *command, char *settingName, char *valueBuf commandSendResponse(innerBuffer); } +//Given a command, send structured ERROR response +//Ex: SPGET, 'Incorrect number of arguments' = "$SPGET,ERROR,Incorrect number of arguments*1E" +void commandSendErrorResponse(char *command, char *field1, char *errorVerbose) +{ + //Create string between $ and * for checksum calculation + char innerBuffer[200]; + snprintf(innerBuffer, sizeof(innerBuffer), "%s,%s,ERROR,%s", command, field1, errorVerbose); + commandSendResponse(innerBuffer); +} + //Given a command, send structured ERROR response //Ex: SPGET, 'Incorrect number of arguments' = "$SPGET,ERROR,Incorrect number of arguments*1E" void commandSendErrorResponse(char *command, char *errorVerbose) From 65fd99e01cd6cf2fcd4456573fbc6838f709dfe7 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Mon, 13 May 2024 16:58:20 -0600 Subject: [PATCH 008/358] Command line interface partially working List command is not yet complete. --- Firmware/RTK_Everywhere/menuCommands.ino | 272 ++++++++++++++++++----- 1 file changed, 216 insertions(+), 56 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index c4f05a501..bbe70ebbf 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -1,97 +1,252 @@ -const uint16_t bufferLen = 1024; -char cmdBuffer[bufferLen]; -char valueBuffer[bufferLen]; -const int MAX_TOKENS = 10; - void menuCommands() { + char cmdBuffer[200]; + char responseBuffer[200]; + char valueBuffer[100]; + const int MAX_TOKENS = 10; + char *tokens[MAX_TOKENS]; + const char *delimiter = ","; + systemPrintln("COMMAND MODE"); while (1) { - InputResponse response = getUserInputString(cmdBuffer, bufferLen, false); // Turn off echo + InputResponse response = getUserInputString(cmdBuffer, sizeof(cmdBuffer), false); // Turn off echo if (response != INPUT_RESPONSE_VALID) continue; - char *tokens[MAX_TOKENS]; - const char *delimiter = "|"; + Serial.printf("command: %s\r\n", cmdBuffer); + + // Verify command structure + if (commandValid(cmdBuffer) == false) + { + commandSendErrorResponse("SP", "Bad command structure"); + continue; + } + + // Remove $ + char *command = cmdBuffer + 1; + + // Remove * and CRC + command[strlen(command) - 3] = '\0'; + int tokenCount = 0; - tokens[tokenCount] = strtok(cmdBuffer, delimiter); + tokens[tokenCount] = strtok(command, delimiter); while (tokens[tokenCount] != nullptr && tokenCount < MAX_TOKENS) { tokenCount++; tokens[tokenCount] = strtok(nullptr, delimiter); } + if (tokenCount == 0) + { + commandSendErrorResponse(tokens[0], "Incorrect number of arguments"); continue; + } - if (strcmp(tokens[0], "SET") == 0) + // Valid commands: CMD, GET, SET, EXE, + if (strcmp(tokens[0], "SPCMD") == 0) { - auto field = tokens[1]; - if (tokens[2] == nullptr) + commandSendOkResponse(tokens[0]); + } + else if (strcmp(tokens[0], "SPGET") == 0) + { + if (tokenCount != 2) + commandSendErrorResponse(tokens[0], "Incorrect number of arguments"); + else { - if (updateSettingWithValue(field, "") == true) - systemPrintln("OK"); + auto field = tokens[1]; + if (getSettingValue(field, valueBuffer) == true) + commandSendValueResponse(tokens[0], field, valueBuffer); // Send structured response else - systemPrintln("ERROR"); + commandSendErrorResponse(tokens[0], field, "Unknown setting"); } + } + else if (strcmp(tokens[0], "SPSET") == 0) + { + if (tokenCount != 3) + commandSendErrorResponse(tokens[0], + "Incorrect number of arguments"); // Incorrect number of arguments else { + auto field = tokens[1]; auto value = tokens[2]; if (updateSettingWithValue(field, value) == true) - systemPrintln("OK"); + commandSendValueOkResponse(tokens[0], field, value); else - systemPrintln("ERROR"); + commandSendErrorResponse(tokens[0], field, "Unknown setting"); } } - else if (strcmp(tokens[0], "GET") == 0) + else if (strcmp(tokens[0], "SPEXE") == 0) { - auto field = tokens[1]; - if (getSettingValue(field, valueBuffer) == true) - { - systemPrint(">"); - systemPrintln(valueBuffer); - } + if (tokenCount != 2) + commandSendErrorResponse(tokens[0], + "Incorrect number of arguments"); // Incorrect number of arguments else { - systemPrintln("ERROR"); // Machine interface expects a structured response, not verbose. + if (strcmp(tokens[1], "EXIT") == 0) + { + commandSendExecuteOkResponse(tokens[0], tokens[1]); + break; // Exit while(1) loop + } + else if (strcmp(tokens[1], "APPLY") == 0) + { + commandSendExecuteOkResponse(tokens[0], tokens[1]); + // Do an apply... + } + else if (strcmp(tokens[1], "SAVE") == 0) + { + recordSystemSettings(); + commandSendExecuteOkResponse(tokens[0], tokens[1]); + } + else if (strcmp(tokens[1], "REBOOT") == 0) + { + commandSendExecuteOkResponse(tokens[0], tokens[1]); + delay(50); // Allow for final print + ESP.restart(); + } + else if (strcmp(tokens[1], "LIST") == 0) + { + // Respond with a list of variables, types, and current value + printAvailableSettings(); + + commandSendExecuteOkResponse(tokens[0], tokens[1]); + } + else + commandSendErrorResponse(tokens[0], tokens[1], "Unknown command"); } } - else if (strcmp(tokens[0], "CMD") == 0) - { - systemPrintln("OK"); - } - else if (strcmp(tokens[0], "EXIT") == 0) - { - systemPrintln("OK"); - printEndpoint = PRINT_ENDPOINT_SERIAL; - btPrintEcho = false; - return; - } - else if (strcmp(tokens[0], "APPLY") == 0) - { - systemPrintln("OK"); - recordSystemSettings(); - ESP.restart(); - return; - } - else if (strcmp(tokens[0], "LIST") == 0) - { - systemPrintln("OK"); - printAvailableSettings(); - return; - } - else { - systemPrintln("ERROR"); + commandSendErrorResponse(tokens[0], "Unknown command"); } - } + } // while(1) btPrintEcho = false; } +// Given a command, send structured OK response +// Ex: SPCMD = "$SPCMD,OK*61" +void commandSendOkResponse(char *command) +{ + // Create string between $ and * for checksum calculation + char innerBuffer[200]; + sprintf(innerBuffer, "%s,OK", command); + commandSendResponse(innerBuffer); +} + +// Given a command, send response sentence with OK and checksum and +// Ex: SPEXE,EXIT = +void commandSendExecuteOkResponse(char *command, char *settingName) +{ + // Create string between $ and * for checksum calculation + char innerBuffer[200]; + sprintf(innerBuffer, "%s,%s,OK", command, settingName); + commandSendResponse(innerBuffer); +} + +// Given a command, send response sentence with OK and checksum and +// Ex: observationPositionAccuracy,float,0.5 = +void commandSendExecuteListResponse(const char *settingName, char *settingType, char *settingValue) +{ + // Create string between $ and * for checksum calculation + char innerBuffer[200]; + sprintf(innerBuffer, "SPLST,%s,%s,%s", settingName, settingType, settingValue); + commandSendResponse(innerBuffer); +} + +// Given a command, and a value, send response sentence with checksum and +// Ex: SPGET,elvMask,0.25 = "$SPGET,elvMask,0.25*07" +void commandSendValueResponse(char *command, char *settingName, char *valueBuffer) +{ + // Create string between $ and * for checksum calculation + char innerBuffer[200]; + sprintf(innerBuffer, "%s,%s,%s", command, settingName, valueBuffer); + commandSendResponse(innerBuffer); +} + +// Given a command, and a value, send response sentence with OK and checksum and +// Ex: SPSET,elvMask,0.77 = "$SPSET,elvMask,0.77,OK*3C" +void commandSendValueOkResponse(char *command, char *settingName, char *valueBuffer) +{ + // Create string between $ and * for checksum calculation + char innerBuffer[200]; + sprintf(innerBuffer, "%s,%s,%s,OK", command, settingName, valueBuffer); + commandSendResponse(innerBuffer); +} + +//Given a command, send structured ERROR response +//Ex: SPGET, 'Incorrect number of arguments' = "$SPGET,ERROR,Incorrect number of arguments*1E" +void commandSendErrorResponse(char *command, char *field1, char *errorVerbose) +{ + //Create string between $ and * for checksum calculation + char innerBuffer[200]; + snprintf(innerBuffer, sizeof(innerBuffer), "%s,%s,ERROR,%s", command, field1, errorVerbose); + commandSendResponse(innerBuffer); +} +// Given a command, send structured ERROR response +// Ex: SPGET, 'Incorrect number of arguments' = "$SPGET,ERROR,Incorrect number of arguments*1E" +void commandSendErrorResponse(char *command, char *errorVerbose) +{ + // Create string between $ and * for checksum calculation + char innerBuffer[200]; + snprintf(innerBuffer, sizeof(innerBuffer), "%s,ERROR,%s", command, errorVerbose); + commandSendResponse(innerBuffer); +} + +// Given an inner buffer, send response sentence with checksum and +// Ex: "SPGET,0.25" = "$SPGET,0.25*33" +void commandSendResponse(char *innerBuffer) +{ + char responseBuffer[200]; + + uint8_t calculatedChecksum = 0; // XOR chars between '$' and '*' + for (int x = 0; x < strlen(innerBuffer); x++) + calculatedChecksum = calculatedChecksum ^ innerBuffer[x]; + + sprintf(responseBuffer, "$%s*%02X\r\n", innerBuffer, calculatedChecksum); + + systemPrint(responseBuffer); +} + +// Checks structure of command and checksum +// If valid, returns true +// $SPCMD*49 +// $SPGET,elvMask,15*1A +// getUserInputString() has removed any trailing to the command +bool commandValid(char *commandString) +{ + // Check $/* + if (commandString[0] != '$') + return (false); + + if (commandString[strlen(commandString) - 3] != '*') + return (false); + + // Check checksum is HEX + char checksumMSN = commandString[strlen(commandString) - 2]; + char checksumLSN = commandString[strlen(commandString) - 1]; + if (isxdigit(checksumMSN) == false || isxdigit(checksumLSN) == false) + return (false); + + // Convert checksum from ASCII to int + char checksumChar[3] = {'\0'}; + checksumChar[0] = checksumMSN; + checksumChar[1] = checksumLSN; + uint8_t checksum = strtol(checksumChar, NULL, 16); + + // From: http://engineeringnotes.blogspot.com/2015/02/generate-crc-for-nmea-strings-arduino.html + uint8_t calculatedChecksum = 0; // XOR chars between '$' and '*' + for (int x = 1; x < strlen(commandString) - 3; x++) + calculatedChecksum = calculatedChecksum ^ commandString[x]; + + if (checksum != calculatedChecksum) + return (false); + + return (true); +} + // Given a settingName, and string value, update a given setting bool updateSettingWithValue(const char *settingName, const char *settingValueStr) { @@ -1991,10 +2146,12 @@ bool getSettingValue(const char *settingName, char *settingValueStr) return (knownSetting); } -// List available settings and their type in CSV +// List available settings, their type in CSV, and value // See issue: https://github.com/sparkfun/SparkFun_RTK_Everywhere_Firmware/issues/190 void printAvailableSettings() { + char valueBuffer[100]; + for (int i = 0; i < numRtkSettingsEntries; i++) { if (rtkSettingsEntries[i].inCommands) @@ -2004,15 +2161,18 @@ void printAvailableSettings() default: break; case _bool: { - systemPrintf("%s,bool,", rtkSettingsEntries[i].name); + getSettingValue(rtkSettingsEntries[i].name, valueBuffer); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "bool", valueBuffer); } break; case _int: { - systemPrintf("%s,int,", rtkSettingsEntries[i].name); + getSettingValue(rtkSettingsEntries[i].name, valueBuffer); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "int", valueBuffer); } break; case _float: { - systemPrintf("%s,float,", rtkSettingsEntries[i].name); + getSettingValue(rtkSettingsEntries[i].name, valueBuffer); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "float", valueBuffer); } break; case _double: { From 592cb5e664a94ce71a7a67fad610d9be4e948809 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Mon, 13 May 2024 21:49:30 -0600 Subject: [PATCH 009/358] Finish CLI list command --- Firmware/RTK_Everywhere/menuCommands.ino | 261 ++++++++++++++++------- 1 file changed, 183 insertions(+), 78 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index bbe70ebbf..0e7852589 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -176,14 +176,14 @@ void commandSendValueOkResponse(char *command, char *settingName, char *valueBuf commandSendResponse(innerBuffer); } -//Given a command, send structured ERROR response -//Ex: SPGET, 'Incorrect number of arguments' = "$SPGET,ERROR,Incorrect number of arguments*1E" +// Given a command, send structured ERROR response +// Ex: SPGET, 'Incorrect number of arguments' = "$SPGET,ERROR,Incorrect number of arguments*1E" void commandSendErrorResponse(char *command, char *field1, char *errorVerbose) { - //Create string between $ and * for checksum calculation - char innerBuffer[200]; - snprintf(innerBuffer, sizeof(innerBuffer), "%s,%s,ERROR,%s", command, field1, errorVerbose); - commandSendResponse(innerBuffer); + // Create string between $ and * for checksum calculation + char innerBuffer[200]; + snprintf(innerBuffer, sizeof(innerBuffer), "%s,%s,ERROR,%s", command, field1, errorVerbose); + commandSendResponse(innerBuffer); } // Given a command, send structured ERROR response // Ex: SPGET, 'Incorrect number of arguments' = "$SPGET,ERROR,Incorrect number of arguments*1E" @@ -2176,70 +2176,91 @@ void printAvailableSettings() } break; case _double: { - systemPrintf("%s,double,", rtkSettingsEntries[i].name); + getSettingValue(rtkSettingsEntries[i].name, valueBuffer); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "double", valueBuffer); } break; case _uint8_t: { - systemPrintf("%s,uint8_t,", rtkSettingsEntries[i].name); + getSettingValue(rtkSettingsEntries[i].name, valueBuffer); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint8_t", valueBuffer); } break; case _uint16_t: { - systemPrintf("%s,uint16_t,", rtkSettingsEntries[i].name); + getSettingValue(rtkSettingsEntries[i].name, valueBuffer); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint16_t", valueBuffer); } break; case _uint32_t: { - systemPrintf("%s,uint32_t,", rtkSettingsEntries[i].name); + getSettingValue(rtkSettingsEntries[i].name, valueBuffer); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint32_t", valueBuffer); } break; case _uint64_t: { - systemPrintf("%s,uint64_t,", rtkSettingsEntries[i].name); + getSettingValue(rtkSettingsEntries[i].name, valueBuffer); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint64_t", valueBuffer); } break; case _int8_t: { - systemPrintf("%s,int8_t,", rtkSettingsEntries[i].name); + getSettingValue(rtkSettingsEntries[i].name, valueBuffer); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "int8_t", valueBuffer); } break; case _int16_t: { - systemPrintf("%s,int16_t,", rtkSettingsEntries[i].name); + getSettingValue(rtkSettingsEntries[i].name, valueBuffer); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "int16_t", valueBuffer); } break; case _muxConnectionType_e: { - systemPrintf("%s,muxConnectionType_e,", rtkSettingsEntries[i].name); + getSettingValue(rtkSettingsEntries[i].name, valueBuffer); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "muxConnectionType_e", valueBuffer); } break; case _SystemState: { - systemPrintf("%s,SystemState,", rtkSettingsEntries[i].name); + getSettingValue(rtkSettingsEntries[i].name, valueBuffer); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "SystemState", valueBuffer); } break; case _pulseEdgeType_e: { - systemPrintf("%s,pulseEdgeType_e,", rtkSettingsEntries[i].name); + getSettingValue(rtkSettingsEntries[i].name, valueBuffer); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "pulseEdgeType_e", valueBuffer); } break; case _BluetoothRadioType_e: { - systemPrintf("%s,BluetoothRadioType_e,", rtkSettingsEntries[i].name); + getSettingValue(rtkSettingsEntries[i].name, valueBuffer); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "BluetoothRadioType_e", valueBuffer); } break; case _PeriodicDisplay_t: { - systemPrintf("%s,PeriodicDisplay_t,", rtkSettingsEntries[i].name); + getSettingValue(rtkSettingsEntries[i].name, valueBuffer); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "PeriodicDisplay_t", valueBuffer); } break; case _CoordinateInputType: { - systemPrintf("%s,CoordinateInputType,", rtkSettingsEntries[i].name); + getSettingValue(rtkSettingsEntries[i].name, valueBuffer); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "CoordinateInputType", valueBuffer); } break; case _charArray: { - systemPrintf("%s,char[%d],", rtkSettingsEntries[i].name, rtkSettingsEntries[i].qualifier); + char temp[50]; + sprintf(temp, "char[%d]", rtkSettingsEntries[i].qualifier); + getSettingValue(rtkSettingsEntries[i].name, valueBuffer); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, temp, valueBuffer); } break; case _IPString: { - systemPrintf("%s,IPAddress,", rtkSettingsEntries[i].name); + getSettingValue(rtkSettingsEntries[i].name, valueBuffer); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "IPAddress", valueBuffer); } break; case _ubxMessageRates: { // Record message settings for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - systemPrintf("%s%s,uint8_t,", rtkSettingsEntries[i].name, ubxMessages[x].msgTextName); + char settingName[100]; + sprintf(settingName, "%s%s", rtkSettingsEntries[i].name, ubxMessages[x].msgTextName); + + getSettingValue(settingName, valueBuffer); + commandSendExecuteListResponse(settingName, "uint8_t", valueBuffer); } } break; @@ -2247,7 +2268,11 @@ void printAvailableSettings() // Record constellation settings for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - systemPrintf("%s%s,bool,", rtkSettingsEntries[i].name, settings.ubxConstellations[x].textName); + char settingName[100]; + sprintf(settingName, "%s%s", rtkSettingsEntries[i].name, settings.ubxConstellations[x].textName); + + getSettingValue(settingName, valueBuffer); + commandSendExecuteListResponse(settingName, "bool", valueBuffer); } } break; @@ -2255,7 +2280,14 @@ void printAvailableSettings() // Record ESP-Now peer MAC addresses for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - systemPrintf("%s%d,uint8_t[%d],", rtkSettingsEntries[i].name, x, sizeof(settings.espnowPeers[0])); + char settingType[100]; + sprintf(settingType, "uint8_t[%d]", sizeof(settings.espnowPeers[0])); + + char settingName[100]; + sprintf(settingName, "%s%d", rtkSettingsEntries[i].name, x); + + getSettingValue(settingName, valueBuffer); + commandSendExecuteListResponse(settingName, settingType, valueBuffer); } } break; @@ -2265,8 +2297,12 @@ void printAvailableSettings() for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - systemPrintf("%s%s,uint8_t,", rtkSettingsEntries[i].name, - ubxMessages[firstRTCMRecord + x].msgTextName); + char settingName[100]; + sprintf(settingName, "%s%s", rtkSettingsEntries[i].name, + ubxMessages[firstRTCMRecord + x].msgTextName); + + getSettingValue(settingName, valueBuffer); + commandSendExecuteListResponse(settingName, "uint8_t", valueBuffer); } } break; @@ -2274,57 +2310,95 @@ void printAvailableSettings() // Record WiFi credential table for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - systemPrintf("%s%dSSID,char[%d],", rtkSettingsEntries[i].name, x, - sizeof(settings.wifiNetworks[0].ssid)); - systemPrintf("%s%dPassword,char[%d],", rtkSettingsEntries[i].name, x, - sizeof(settings.wifiNetworks[0].password)); + char settingType[100]; + sprintf(settingType, "char[%d]", sizeof(settings.wifiNetworks[0].ssid)); + char settingName[100]; + sprintf(settingName, "%s%dSSID", rtkSettingsEntries[i].name, x); + + getSettingValue(settingName, valueBuffer); + commandSendExecuteListResponse(settingName, settingType, valueBuffer); + + sprintf(settingType, "char[%d]", sizeof(settings.wifiNetworks[0].password)); + sprintf(settingName, "%s%dPassword", rtkSettingsEntries[i].name, x); + + getSettingValue(settingName, valueBuffer); + commandSendExecuteListResponse(settingName, settingType, valueBuffer); } } break; case _ntripServerCasterHost: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - systemPrintf("%s%d,char[%d],", rtkSettingsEntries[i].name, x, - sizeof(settings.ntripServer_CasterHost[x])); + char settingType[100]; + sprintf(settingType, "char[%d]", sizeof(settings.ntripServer_CasterHost[x])); + char settingName[100]; + sprintf(settingName, "%s%d", rtkSettingsEntries[i].name, x); + + getSettingValue(settingName, valueBuffer); + commandSendExecuteListResponse(settingName, settingType, valueBuffer); } } break; case _ntripServerCasterPort: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - systemPrintf("%s%d,uint16_t,", rtkSettingsEntries[i].name, x); + char settingName[100]; + sprintf(settingName, "%s%d", rtkSettingsEntries[i].name, x); + + getSettingValue(settingName, valueBuffer); + commandSendExecuteListResponse(settingName, "uint16_t", valueBuffer); } } break; case _ntripServerCasterUser: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - systemPrintf("%s%d,char[%d],", rtkSettingsEntries[i].name, x, - sizeof(settings.ntripServer_CasterUser[x])); + char settingType[100]; + sprintf(settingType, "char[%d]", sizeof(settings.ntripServer_CasterUser[x])); + char settingName[100]; + sprintf(settingName, "%s%d", rtkSettingsEntries[i].name, x); + + getSettingValue(settingName, valueBuffer); + commandSendExecuteListResponse(settingName, settingType, valueBuffer); } } break; case _ntripServerCasterUserPW: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - systemPrintf("%s%d,char[%d],", rtkSettingsEntries[i].name, x, - sizeof(settings.ntripServer_CasterUserPW[x])); + char settingType[100]; + sprintf(settingType, "char[%d]", sizeof(settings.ntripServer_CasterUserPW[x])); + char settingName[100]; + sprintf(settingName, "%s%d", rtkSettingsEntries[i].name, x); + + getSettingValue(settingName, valueBuffer); + commandSendExecuteListResponse(settingName, settingType, valueBuffer); } } break; case _ntripServerMountPoint: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - systemPrintf("%s%d,char[%d],", rtkSettingsEntries[i].name, x, - sizeof(settings.ntripServer_MountPoint[x])); + char settingType[100]; + sprintf(settingType, "char[%d]", sizeof(settings.ntripServer_MountPoint[x])); + char settingName[100]; + sprintf(settingName, "%s%d", rtkSettingsEntries[i].name, x); + + getSettingValue(settingName, valueBuffer); + commandSendExecuteListResponse(settingName, settingType, valueBuffer); } } break; case _ntripServerMountPointPW: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - systemPrintf("%s%d,char[%d],", rtkSettingsEntries[i].name, x, - sizeof(settings.ntripServer_MountPointPW[x])); + char settingType[100]; + sprintf(settingType, "char[%d]", sizeof(settings.ntripServer_MountPointPW[x])); + char settingName[100]; + sprintf(settingName, "%s%d", rtkSettingsEntries[i].name, x); + + getSettingValue(settingName, valueBuffer); + commandSendExecuteListResponse(settingName, settingType, valueBuffer); } } break; @@ -2332,7 +2406,11 @@ void printAvailableSettings() // Record UM980 NMEA rates for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - systemPrintf("%s%s,float,", rtkSettingsEntries[i].name, umMessagesNMEA[x].msgTextName); + char settingName[100]; + sprintf(settingName, "%s%s", rtkSettingsEntries[i].name, umMessagesNMEA[x].msgTextName); + + getSettingValue(settingName, valueBuffer); + commandSendExecuteListResponse(settingName, "float", valueBuffer); } } break; @@ -2340,7 +2418,11 @@ void printAvailableSettings() // Record UM980 Rover RTCM rates for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - systemPrintf("%s%s,float,", rtkSettingsEntries[i].name, umMessagesRTCM[x].msgTextName); + char settingName[100]; + sprintf(settingName, "%s%s", rtkSettingsEntries[i].name, umMessagesRTCM[x].msgTextName); + + getSettingValue(settingName, valueBuffer); + commandSendExecuteListResponse(settingName, "float", valueBuffer); } } break; @@ -2348,7 +2430,11 @@ void printAvailableSettings() // Record UM980 Base RTCM rates for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - systemPrintf("%s%s,float,", rtkSettingsEntries[i].name, umMessagesRTCM[x].msgTextName); + char settingName[100]; + sprintf(settingName, "%s%s", rtkSettingsEntries[i].name, umMessagesRTCM[x].msgTextName); + + getSettingValue(settingName, valueBuffer); + commandSendExecuteListResponse(settingName, "float", valueBuffer); } } break; @@ -2356,7 +2442,11 @@ void printAvailableSettings() // Record UM980 Constellations for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - systemPrintf("%s%s,uint8_t,", rtkSettingsEntries[i].name, um980ConstellationCommands[x].textName); + char settingName[100]; + sprintf(settingName, "%s%s", rtkSettingsEntries[i].name, um980ConstellationCommands[x].textName); + + getSettingValue(settingName, valueBuffer); + commandSendExecuteListResponse(settingName, "uint8_t", valueBuffer); } } break; @@ -2364,15 +2454,24 @@ void printAvailableSettings() // Record corrections priorities for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - systemPrintf("%s%s,int,", rtkSettingsEntries[i].name, correctionsSourceNames[x]); + char settingName[100]; + sprintf(settingName, "%s%s", rtkSettingsEntries[i].name, correctionsSourceNames[x]); + + getSettingValue(settingName, valueBuffer); + commandSendExecuteListResponse(settingName, "int", valueBuffer); } } break; case _regionalCorrectionTopics: { for (int r = 0; r < rtkSettingsEntries[i].qualifier; r++) { - systemPrintf("%s%d,char[%d],", rtkSettingsEntries[i].name, r, - sizeof(settings.regionalCorrectionTopics[0])); + char settingType[100]; + sprintf(settingType, "char[%d]", sizeof(settings.regionalCorrectionTopics[0])); + char settingName[100]; + sprintf(settingName, "%s%d", rtkSettingsEntries[i].name, r); + + getSettingValue(settingName, valueBuffer); + commandSendExecuteListResponse(settingName, settingType, valueBuffer); } } break; @@ -2380,38 +2479,44 @@ void printAvailableSettings() } } - systemPrint("deviceId,char[18],"); + char hardwareID[15]; + snprintf(hardwareID, sizeof(hardwareID), "%02X%02X%02X%02X%02X%02X%02X", btMACAddress[0], btMACAddress[1], + btMACAddress[2], btMACAddress[3], btMACAddress[4], btMACAddress[5], productVariant); + + char settingType[100]; + sprintf(settingType, "char[%d]", sizeof(hardwareID)); + commandSendExecuteListResponse("deviceId", settingType, hardwareID); // TODO: check this! Is this really what we want? - systemPrint("fixedLatText,char[],"); - systemPrint("fixedLongText,char[],"); - systemPrint("measurementRateHz,double,"); - systemPrint("stationGeodetic,,"); // TODO - systemPrint("minCNO,uint8_t,"); - systemPrint("fixedHAEAPC,double,"); - systemPrint("baseTypeFixed,bool,"); - systemPrint("fixedBaseCoordinateTypeECEF,bool,"); - systemPrint("enableRCFirmware,bool,"); - systemPrint("firmwareFileName,char[],"); - systemPrint("factoryDefaultReset,,"); - systemPrint("exitAndReset,,"); - systemPrint("setProfile,uint8_t,"); - systemPrint("resetProfile,uint8_t,"); - systemPrint("forgetEspNowPeers,,"); - systemPrint("startNewLog,,"); - systemPrint("checkNewFirmware,,"); - systemPrint("getNewFirmware,,"); - systemPrint("measurementRateSec,double,"); - systemPrint("baseTypeSurveyIn,bool,"); - systemPrint("fixedBaseCoordinateTypeGeo,bool,"); - systemPrint("saveToArduino,,"); - systemPrint("enableFactoryDefaults,,"); - systemPrint("enableFirmwareUpdate,,"); - systemPrint("enableForgetRadios,,"); - systemPrint("nicknameECEF,,"); - systemPrint("nicknameGeodetic,,"); - systemPrint("fileSelectAll,,"); - systemPrint("fixedHAEAPC,,"); + // systemPrint("fixedLatText,char[],"); + // systemPrint("fixedLongText,char[],"); + // systemPrint("measurementRateHz,double,"); + // systemPrint("stationGeodetic,,"); // TODO + // systemPrint("minCNO,uint8_t,"); + // systemPrint("fixedHAEAPC,double,"); + // systemPrint("baseTypeFixed,bool,"); + // systemPrint("fixedBaseCoordinateTypeECEF,bool,"); + // systemPrint("enableRCFirmware,bool,"); + // systemPrint("firmwareFileName,char[],"); + // systemPrint("factoryDefaultReset,,"); + // systemPrint("exitAndReset,,"); + // systemPrint("setProfile,uint8_t,"); + // systemPrint("resetProfile,uint8_t,"); + // systemPrint("forgetEspNowPeers,,"); + // systemPrint("startNewLog,,"); + // systemPrint("checkNewFirmware,,"); + // systemPrint("getNewFirmware,,"); + // systemPrint("measurementRateSec,double,"); + // systemPrint("baseTypeSurveyIn,bool,"); + // systemPrint("fixedBaseCoordinateTypeGeo,bool,"); + // systemPrint("saveToArduino,,"); + // systemPrint("enableFactoryDefaults,,"); + // systemPrint("enableFirmwareUpdate,,"); + // systemPrint("enableForgetRadios,,"); + // systemPrint("nicknameECEF,,"); + // systemPrint("nicknameGeodetic,,"); + // systemPrint("fileSelectAll,,"); + // systemPrint("fixedHAEAPC,,"); systemPrintln(); } From 51412043b30d321d03d5798f6abd7ac54ad26f0d Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Tue, 14 May 2024 13:05:43 -0600 Subject: [PATCH 010/358] Add profile info to LIST command. --- Firmware/RTK_Everywhere/menuCommands.ino | 314 ++++++++---------- .../CommandLineStructure.ino | 37 ++- 2 files changed, 165 insertions(+), 186 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 0e7852589..dd29f80a0 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -15,10 +15,14 @@ void menuCommands() if (response != INPUT_RESPONSE_VALID) continue; - Serial.printf("command: %s\r\n", cmdBuffer); + if (strcmp(cmdBuffer, "list") == 0) + { + printAvailableSettings(); + continue; + } // Verify command structure - if (commandValid(cmdBuffer) == false) + else if (commandValid(cmdBuffer) == false) { commandSendErrorResponse("SP", "Bad command structure"); continue; @@ -177,26 +181,28 @@ void commandSendValueOkResponse(char *command, char *settingName, char *valueBuf } // Given a command, send structured ERROR response -// Ex: SPGET, 'Incorrect number of arguments' = "$SPGET,ERROR,Incorrect number of arguments*1E" -void commandSendErrorResponse(char *command, char *field1, char *errorVerbose) +// Response format: $SPxET,[setting name],,ERROR,[Verbose error description]*FF +// Ex: SPGET,maxHeight,'Unknown setting' = "$SPGET,maxHeight,,ERROR,Unknown setting*58" +void commandSendErrorResponse(char *command, char *settingName, char *errorVerbose) { // Create string between $ and * for checksum calculation char innerBuffer[200]; - snprintf(innerBuffer, sizeof(innerBuffer), "%s,%s,ERROR,%s", command, field1, errorVerbose); + snprintf(innerBuffer, sizeof(innerBuffer), "%s,%s,,ERROR,%s", command, settingName, errorVerbose); commandSendResponse(innerBuffer); } // Given a command, send structured ERROR response +// Response format: $SPxET,,,ERROR,[Verbose error description]*FF // Ex: SPGET, 'Incorrect number of arguments' = "$SPGET,ERROR,Incorrect number of arguments*1E" void commandSendErrorResponse(char *command, char *errorVerbose) { // Create string between $ and * for checksum calculation char innerBuffer[200]; - snprintf(innerBuffer, sizeof(innerBuffer), "%s,ERROR,%s", command, errorVerbose); + snprintf(innerBuffer, sizeof(innerBuffer), "%s,,,ERROR,%s", command, errorVerbose); commandSendResponse(innerBuffer); } // Given an inner buffer, send response sentence with checksum and -// Ex: "SPGET,0.25" = "$SPGET,0.25*33" +// Ex: SPGET,elvMask,0.25 = $SPGET,elvMask,0.25*07 void commandSendResponse(char *innerBuffer) { char responseBuffer[200]; @@ -2150,7 +2156,9 @@ bool getSettingValue(const char *settingName, char *settingValueStr) // See issue: https://github.com/sparkfun/SparkFun_RTK_Everywhere_Firmware/issues/190 void printAvailableSettings() { - char valueBuffer[100]; + char settingName[100]; + char settingType[100]; + char settingValue[100]; for (int i = 0; i < numRtkSettingsEntries; i++) { @@ -2161,106 +2169,105 @@ void printAvailableSettings() default: break; case _bool: { - getSettingValue(rtkSettingsEntries[i].name, valueBuffer); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "bool", valueBuffer); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "bool", settingValue); } break; case _int: { - getSettingValue(rtkSettingsEntries[i].name, valueBuffer); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "int", valueBuffer); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "int", settingValue); } break; case _float: { - getSettingValue(rtkSettingsEntries[i].name, valueBuffer); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "float", valueBuffer); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "float", settingValue); } break; case _double: { - getSettingValue(rtkSettingsEntries[i].name, valueBuffer); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "double", valueBuffer); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "double", settingValue); } break; case _uint8_t: { - getSettingValue(rtkSettingsEntries[i].name, valueBuffer); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint8_t", valueBuffer); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint8_t", settingValue); } break; case _uint16_t: { - getSettingValue(rtkSettingsEntries[i].name, valueBuffer); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint16_t", valueBuffer); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint16_t", settingValue); } break; case _uint32_t: { - getSettingValue(rtkSettingsEntries[i].name, valueBuffer); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint32_t", valueBuffer); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint32_t", settingValue); } break; case _uint64_t: { - getSettingValue(rtkSettingsEntries[i].name, valueBuffer); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint64_t", valueBuffer); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint64_t", settingValue); } break; case _int8_t: { - getSettingValue(rtkSettingsEntries[i].name, valueBuffer); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "int8_t", valueBuffer); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "int8_t", settingValue); } break; case _int16_t: { - getSettingValue(rtkSettingsEntries[i].name, valueBuffer); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "int16_t", valueBuffer); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "int16_t", settingValue); } break; case _muxConnectionType_e: { - getSettingValue(rtkSettingsEntries[i].name, valueBuffer); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "muxConnectionType_e", valueBuffer); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "muxConnectionType_e", settingValue); } break; case _SystemState: { - getSettingValue(rtkSettingsEntries[i].name, valueBuffer); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "SystemState", valueBuffer); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "SystemState", settingValue); } break; case _pulseEdgeType_e: { - getSettingValue(rtkSettingsEntries[i].name, valueBuffer); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "pulseEdgeType_e", valueBuffer); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "pulseEdgeType_e", settingValue); } break; case _BluetoothRadioType_e: { - getSettingValue(rtkSettingsEntries[i].name, valueBuffer); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "BluetoothRadioType_e", valueBuffer); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "BluetoothRadioType_e", settingValue); } break; case _PeriodicDisplay_t: { - getSettingValue(rtkSettingsEntries[i].name, valueBuffer); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "PeriodicDisplay_t", valueBuffer); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "PeriodicDisplay_t", settingValue); } break; case _CoordinateInputType: { - getSettingValue(rtkSettingsEntries[i].name, valueBuffer); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "CoordinateInputType", valueBuffer); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "CoordinateInputType", settingValue); } break; case _charArray: { - char temp[50]; - sprintf(temp, "char[%d]", rtkSettingsEntries[i].qualifier); - getSettingValue(rtkSettingsEntries[i].name, valueBuffer); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, temp, valueBuffer); + snprintf(settingType, sizeof(settingType), "char[%d]", rtkSettingsEntries[i].qualifier); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, settingType, settingValue); } break; case _IPString: { - getSettingValue(rtkSettingsEntries[i].name, valueBuffer); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "IPAddress", valueBuffer); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "IPAddress", settingValue); } break; case _ubxMessageRates: { // Record message settings for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - char settingName[100]; - sprintf(settingName, "%s%s", rtkSettingsEntries[i].name, ubxMessages[x].msgTextName); + snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, + ubxMessages[x].msgTextName); - getSettingValue(settingName, valueBuffer); - commandSendExecuteListResponse(settingName, "uint8_t", valueBuffer); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, "uint8_t", settingValue); } } break; @@ -2268,11 +2275,11 @@ void printAvailableSettings() // Record constellation settings for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - char settingName[100]; - sprintf(settingName, "%s%s", rtkSettingsEntries[i].name, settings.ubxConstellations[x].textName); + snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, + settings.ubxConstellations[x].textName); - getSettingValue(settingName, valueBuffer); - commandSendExecuteListResponse(settingName, "bool", valueBuffer); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, "bool", settingValue); } } break; @@ -2280,14 +2287,11 @@ void printAvailableSettings() // Record ESP-Now peer MAC addresses for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - char settingType[100]; - sprintf(settingType, "uint8_t[%d]", sizeof(settings.espnowPeers[0])); + snprintf(settingType, sizeof(settingType), "uint8_t[%d]", sizeof(settings.espnowPeers[0])); + snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); - char settingName[100]; - sprintf(settingName, "%s%d", rtkSettingsEntries[i].name, x); - - getSettingValue(settingName, valueBuffer); - commandSendExecuteListResponse(settingName, settingType, valueBuffer); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, settingType, settingValue); } } break; @@ -2297,12 +2301,11 @@ void printAvailableSettings() for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - char settingName[100]; - sprintf(settingName, "%s%s", rtkSettingsEntries[i].name, - ubxMessages[firstRTCMRecord + x].msgTextName); + snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, + ubxMessages[firstRTCMRecord + x].msgTextName); - getSettingValue(settingName, valueBuffer); - commandSendExecuteListResponse(settingName, "uint8_t", valueBuffer); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, "uint8_t", settingValue); } } break; @@ -2310,95 +2313,84 @@ void printAvailableSettings() // Record WiFi credential table for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - char settingType[100]; - sprintf(settingType, "char[%d]", sizeof(settings.wifiNetworks[0].ssid)); - char settingName[100]; - sprintf(settingName, "%s%dSSID", rtkSettingsEntries[i].name, x); + snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.wifiNetworks[0].ssid)); + snprintf(settingName, sizeof(settingName), "%s%dSSID", rtkSettingsEntries[i].name, x); - getSettingValue(settingName, valueBuffer); - commandSendExecuteListResponse(settingName, settingType, valueBuffer); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, settingType, settingValue); - sprintf(settingType, "char[%d]", sizeof(settings.wifiNetworks[0].password)); - sprintf(settingName, "%s%dPassword", rtkSettingsEntries[i].name, x); + snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.wifiNetworks[0].password)); + snprintf(settingName, sizeof(settingName), "%s%dPassword", rtkSettingsEntries[i].name, x); - getSettingValue(settingName, valueBuffer); - commandSendExecuteListResponse(settingName, settingType, valueBuffer); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, settingType, settingValue); } } break; case _ntripServerCasterHost: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - char settingType[100]; - sprintf(settingType, "char[%d]", sizeof(settings.ntripServer_CasterHost[x])); - char settingName[100]; - sprintf(settingName, "%s%d", rtkSettingsEntries[i].name, x); + snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.ntripServer_CasterHost[x])); + snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); - getSettingValue(settingName, valueBuffer); - commandSendExecuteListResponse(settingName, settingType, valueBuffer); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, settingType, settingValue); } } break; case _ntripServerCasterPort: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - char settingName[100]; - sprintf(settingName, "%s%d", rtkSettingsEntries[i].name, x); + snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); - getSettingValue(settingName, valueBuffer); - commandSendExecuteListResponse(settingName, "uint16_t", valueBuffer); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, "uint16_t", settingValue); } } break; case _ntripServerCasterUser: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - char settingType[100]; - sprintf(settingType, "char[%d]", sizeof(settings.ntripServer_CasterUser[x])); - char settingName[100]; - sprintf(settingName, "%s%d", rtkSettingsEntries[i].name, x); + snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.ntripServer_CasterUser[x])); + snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); - getSettingValue(settingName, valueBuffer); - commandSendExecuteListResponse(settingName, settingType, valueBuffer); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, settingType, settingValue); } } break; case _ntripServerCasterUserPW: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - char settingType[100]; - sprintf(settingType, "char[%d]", sizeof(settings.ntripServer_CasterUserPW[x])); - char settingName[100]; - sprintf(settingName, "%s%d", rtkSettingsEntries[i].name, x); + snprintf(settingType, sizeof(settingType), "char[%d]", + sizeof(settings.ntripServer_CasterUserPW[x])); + snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); - getSettingValue(settingName, valueBuffer); - commandSendExecuteListResponse(settingName, settingType, valueBuffer); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, settingType, settingValue); } } break; case _ntripServerMountPoint: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - char settingType[100]; - sprintf(settingType, "char[%d]", sizeof(settings.ntripServer_MountPoint[x])); - char settingName[100]; - sprintf(settingName, "%s%d", rtkSettingsEntries[i].name, x); + snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.ntripServer_MountPoint[x])); + snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); - getSettingValue(settingName, valueBuffer); - commandSendExecuteListResponse(settingName, settingType, valueBuffer); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, settingType, settingValue); } } break; case _ntripServerMountPointPW: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - char settingType[100]; - sprintf(settingType, "char[%d]", sizeof(settings.ntripServer_MountPointPW[x])); - char settingName[100]; - sprintf(settingName, "%s%d", rtkSettingsEntries[i].name, x); + snprintf(settingType, sizeof(settingType), "char[%d]", + sizeof(settings.ntripServer_MountPointPW[x])); + snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); - getSettingValue(settingName, valueBuffer); - commandSendExecuteListResponse(settingName, settingType, valueBuffer); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, settingType, settingValue); } } break; @@ -2406,11 +2398,11 @@ void printAvailableSettings() // Record UM980 NMEA rates for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - char settingName[100]; - sprintf(settingName, "%s%s", rtkSettingsEntries[i].name, umMessagesNMEA[x].msgTextName); + snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, + umMessagesNMEA[x].msgTextName); - getSettingValue(settingName, valueBuffer); - commandSendExecuteListResponse(settingName, "float", valueBuffer); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, "float", settingValue); } } break; @@ -2418,11 +2410,11 @@ void printAvailableSettings() // Record UM980 Rover RTCM rates for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - char settingName[100]; - sprintf(settingName, "%s%s", rtkSettingsEntries[i].name, umMessagesRTCM[x].msgTextName); + snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, + umMessagesRTCM[x].msgTextName); - getSettingValue(settingName, valueBuffer); - commandSendExecuteListResponse(settingName, "float", valueBuffer); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, "float", settingValue); } } break; @@ -2430,11 +2422,11 @@ void printAvailableSettings() // Record UM980 Base RTCM rates for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - char settingName[100]; - sprintf(settingName, "%s%s", rtkSettingsEntries[i].name, umMessagesRTCM[x].msgTextName); + snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, + umMessagesRTCM[x].msgTextName); - getSettingValue(settingName, valueBuffer); - commandSendExecuteListResponse(settingName, "float", valueBuffer); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, "float", settingValue); } } break; @@ -2442,11 +2434,11 @@ void printAvailableSettings() // Record UM980 Constellations for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - char settingName[100]; - sprintf(settingName, "%s%s", rtkSettingsEntries[i].name, um980ConstellationCommands[x].textName); + snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, + um980ConstellationCommands[x].textName); - getSettingValue(settingName, valueBuffer); - commandSendExecuteListResponse(settingName, "uint8_t", valueBuffer); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, "uint8_t", settingValue); } } break; @@ -2454,24 +2446,23 @@ void printAvailableSettings() // Record corrections priorities for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - char settingName[100]; - sprintf(settingName, "%s%s", rtkSettingsEntries[i].name, correctionsSourceNames[x]); + snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, + correctionsSourceNames[x]); - getSettingValue(settingName, valueBuffer); - commandSendExecuteListResponse(settingName, "int", valueBuffer); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, "int", settingValue); } } break; case _regionalCorrectionTopics: { for (int r = 0; r < rtkSettingsEntries[i].qualifier; r++) { - char settingType[100]; - sprintf(settingType, "char[%d]", sizeof(settings.regionalCorrectionTopics[0])); - char settingName[100]; - sprintf(settingName, "%s%d", rtkSettingsEntries[i].name, r); + snprintf(settingType, sizeof(settingType), "char[%d]", + sizeof(settings.regionalCorrectionTopics[0])); + snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, r); - getSettingValue(settingName, valueBuffer); - commandSendExecuteListResponse(settingName, settingType, valueBuffer); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, settingType, settingValue); } } break; @@ -2479,44 +2470,31 @@ void printAvailableSettings() } } + // Commands formed specifically for Man-Machine-Interface + + // Device ID - used in PointPerfect char hardwareID[15]; snprintf(hardwareID, sizeof(hardwareID), "%02X%02X%02X%02X%02X%02X%02X", btMACAddress[0], btMACAddress[1], btMACAddress[2], btMACAddress[3], btMACAddress[4], btMACAddress[5], productVariant); - char settingType[100]; - sprintf(settingType, "char[%d]", sizeof(hardwareID)); + snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(hardwareID)); commandSendExecuteListResponse("deviceId", settingType, hardwareID); - // TODO: check this! Is this really what we want? - // systemPrint("fixedLatText,char[],"); - // systemPrint("fixedLongText,char[],"); - // systemPrint("measurementRateHz,double,"); - // systemPrint("stationGeodetic,,"); // TODO - // systemPrint("minCNO,uint8_t,"); - // systemPrint("fixedHAEAPC,double,"); - // systemPrint("baseTypeFixed,bool,"); - // systemPrint("fixedBaseCoordinateTypeECEF,bool,"); - // systemPrint("enableRCFirmware,bool,"); - // systemPrint("firmwareFileName,char[],"); - // systemPrint("factoryDefaultReset,,"); - // systemPrint("exitAndReset,,"); - // systemPrint("setProfile,uint8_t,"); - // systemPrint("resetProfile,uint8_t,"); - // systemPrint("forgetEspNowPeers,,"); - // systemPrint("startNewLog,,"); - // systemPrint("checkNewFirmware,,"); - // systemPrint("getNewFirmware,,"); - // systemPrint("measurementRateSec,double,"); - // systemPrint("baseTypeSurveyIn,bool,"); - // systemPrint("fixedBaseCoordinateTypeGeo,bool,"); - // systemPrint("saveToArduino,,"); - // systemPrint("enableFactoryDefaults,,"); - // systemPrint("enableFirmwareUpdate,,"); - // systemPrint("enableForgetRadios,,"); - // systemPrint("nicknameECEF,,"); - // systemPrint("nicknameGeodetic,,"); - // systemPrint("fileSelectAll,,"); - // systemPrint("fixedHAEAPC,,"); + // Profile Names - used in Profiles + for (int index = 0; index < MAX_PROFILE_COUNT; index++) + { + char settingName[100]; + snprintf(settingName, sizeof(settingName), "profile%dName", index); + + char settingType[100]; + snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(profileNames[0])); + + commandSendExecuteListResponse(settingName, settingType, profileNames[index]); + } + + // Current Profile Number - used in Profiles + snprintf(settingValue, sizeof(settingValue), "%d", profileNumber); + commandSendExecuteListResponse("profileNumber", "uint8_t", settingValue); systemPrintln(); } diff --git a/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino b/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino index 073311148..e59379cd8 100644 --- a/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino +++ b/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino @@ -37,7 +37,7 @@ void setup() Serial.printf("command: %s (BAD) - ", cmdBuffer); commandParser(); - sprintf(cmdBuffer, "$SPGET,rando*0F"); //Unknown setting + sprintf(cmdBuffer, "$SPGET,maxHeight*0F"); //Unknown setting Serial.printf("command: %s (BAD) - ", cmdBuffer); commandParser(); @@ -51,7 +51,7 @@ void setup() Serial.printf("command: %s (BAD) - ", cmdBuffer); commandParser(); - sprintf(cmdBuffer, "$SPSET,rando,15*33"); //Unknown setting + sprintf(cmdBuffer, "$SPSET,maxHeight,15*33"); //Unknown setting Serial.printf("command: %s (BAD) - ", cmdBuffer); commandParser(); @@ -65,7 +65,7 @@ void setup() Serial.printf("command: %s (BAD) - ", cmdBuffer); commandParser(); - sprintf(cmdBuffer, "$SPEXE,rando*01"); //Unknown command + sprintf(cmdBuffer, "$SPEXE,maxHeight*01"); //Unknown command Serial.printf("command: %s (BAD) - ", cmdBuffer); commandParser(); @@ -262,28 +262,29 @@ void commandSendValueOkResponse(char *command, char *settingName, char *valueBuf commandSendResponse(innerBuffer); } -//Given a command, send structured ERROR response -//Ex: SPGET, 'Incorrect number of arguments' = "$SPGET,ERROR,Incorrect number of arguments*1E" -void commandSendErrorResponse(char *command, char *field1, char *errorVerbose) +// Given a command, send structured ERROR response +// Response format: $SPxET,[setting name],,ERROR,[Verbose error description]*FF +// Ex: SPGET,maxHeight,'Unknown setting' = "$SPGET,maxHeight,,ERROR,Unknown setting*58" +void commandSendErrorResponse(char *command, char *settingName, char *errorVerbose) { - //Create string between $ and * for checksum calculation - char innerBuffer[200]; - snprintf(innerBuffer, sizeof(innerBuffer), "%s,%s,ERROR,%s", command, field1, errorVerbose); - commandSendResponse(innerBuffer); + // Create string between $ and * for checksum calculation + char innerBuffer[200]; + snprintf(innerBuffer, sizeof(innerBuffer), "%s,%s,,ERROR,%s", command, settingName, errorVerbose); + commandSendResponse(innerBuffer); } - -//Given a command, send structured ERROR response -//Ex: SPGET, 'Incorrect number of arguments' = "$SPGET,ERROR,Incorrect number of arguments*1E" +// Given a command, send structured ERROR response +// Response format: $SPxET,,,ERROR,[Verbose error description]*FF +// Ex: SPGET, 'Incorrect number of arguments' = "$SPGET,ERROR,Incorrect number of arguments*1E" void commandSendErrorResponse(char *command, char *errorVerbose) { - //Create string between $ and * for checksum calculation - char innerBuffer[200]; - snprintf(innerBuffer, sizeof(innerBuffer), "%s,ERROR,%s", command, errorVerbose); - commandSendResponse(innerBuffer); + // Create string between $ and * for checksum calculation + char innerBuffer[200]; + snprintf(innerBuffer, sizeof(innerBuffer), "%s,,,ERROR,%s", command, errorVerbose); + commandSendResponse(innerBuffer); } //Given an inner buffer, send response sentence with checksum and -//Ex: "SPGET,0.25" = "$SPGET,0.25*33" +//Ex: SPGET,elvMask,0.25 = $SPGET,elvMask,0.25*07 void commandSendResponse(char *innerBuffer) { char responseBuffer[200]; From e99a7daf927b8fa154a6dd41268e5a17472e367f Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Tue, 14 May 2024 16:37:41 -0600 Subject: [PATCH 011/358] Combine platform specific settings into one Combine zed/um980SurveyInStartinAccuracy Combine minCNO_F9P with UM980 Rename measurementRate to measurementRateMs --- Firmware/RTK_Everywhere/Developer.ino | 1 - Firmware/RTK_Everywhere/GNSS.ino | 29 ++++-------------------- Firmware/RTK_Everywhere/UM980.ino | 15 ++++-------- Firmware/RTK_Everywhere/ZED.ino | 25 ++++++++------------ Firmware/RTK_Everywhere/menuBase.ino | 9 ++------ Firmware/RTK_Everywhere/menuCommands.ino | 2 +- Firmware/RTK_Everywhere/menuGNSS.ino | 7 +++--- Firmware/RTK_Everywhere/menuMessages.ino | 22 ++++++++++++++++-- Firmware/RTK_Everywhere/settings.h | 18 +++++---------- 9 files changed, 52 insertions(+), 76 deletions(-) diff --git a/Firmware/RTK_Everywhere/Developer.ino b/Firmware/RTK_Everywhere/Developer.ino index 6a15ee0b2..a5758f70b 100644 --- a/Firmware/RTK_Everywhere/Developer.ino +++ b/Firmware/RTK_Everywhere/Developer.ino @@ -237,7 +237,6 @@ void um980BaseRtcmDefault(){} void um980BaseRtcmLowDataRate(){} char * um980GetRtcmDefaultString() {return ("Not compiled");} char * um980GetRtcmLowDataRateString() {return ("Not compiled");} -float um980GetSurveyInStartingAccuracy() {return(0.0);} void um980MenuConstellations(){} double um980GetRateS() {return(0.0);} void um980MenuMessagesSubtype(float *localMessageRate, const char *messageType){} diff --git a/Firmware/RTK_Everywhere/GNSS.ino b/Firmware/RTK_Everywhere/GNSS.ino index b36e12dea..9d6adad64 100644 --- a/Firmware/RTK_Everywhere/GNSS.ino +++ b/Firmware/RTK_Everywhere/GNSS.ino @@ -431,31 +431,19 @@ void gnssSetMinCno(uint8_t cnoValue) if (present.gnss_zedf9p) { zedSetMinCno(cnoValue); - - // Update the setting - settings.minCNO_F9P = cnoValue; + settings.minCNO = cnoValue; // Update the setting } else if (present.gnss_um980) { um980SetMinCNO(cnoValue); - settings.minCNO_um980 = cnoValue; // Update the setting + settings.minCNO = cnoValue; // Update the setting } } } uint8_t gnssGetMinCno() { - if (present.gnss_zedf9p) - { - return (settings.minCNO_F9P); - } - else if (present.gnss_um980) - { - return (settings.minCNO_um980); - } - - // Select a default - return (settings.minCNO_F9P); + return (settings.minCNO); } double gnssGetLatitude() @@ -1272,15 +1260,8 @@ char *gnssGetRtcmLowDataRateString() float gnssGetSurveyInStartingAccuracy() { - if (present.gnss_zedf9p) - { - return (zedGetSurveyInStartingAccuracy()); - } - else if (present.gnss_um980) - { - return (um980GetSurveyInStartingAccuracy()); - } - return (0); + + return (settings.surveyInStartingAccuracy); } void gnssMenuConstellations() diff --git a/Firmware/RTK_Everywhere/UM980.ino b/Firmware/RTK_Everywhere/UM980.ino index dc4d5c0b2..f34b304ca 100644 --- a/Firmware/RTK_Everywhere/UM980.ino +++ b/Firmware/RTK_Everywhere/UM980.ino @@ -137,7 +137,7 @@ bool um980ConfigureOnce() response &= um980SetMinElevation(settings.minElev); // UM980 default is 5 degrees. Our default is 10. - response &= um980SetMinCNO(settings.minCNO_um980); + response &= um980SetMinCNO(settings.minCNO); response &= um980SetConstellations(); @@ -588,9 +588,9 @@ void um980FactoryReset() // the GNSS messages can be set. For example, 0.5 is 2Hz, 0.2 is 5Hz. // We assume, if the user wants to set the 'rate' to 5Hz, they want all // messages set to that rate. -// All NMEA/RTCM for a rover will be based on the measurementRate setting +// All NMEA/RTCM for a rover will be based on the measurementRateMs setting // ie, if a message != 0, then it will be output at the measurementRate. -// All RTCM for a base will be based on a measurementRate of 1 with messages +// All RTCM for a base will be based on a measurementRateMs of 1000 with messages // that can be reported more slowly than that (ie 1 per 10 seconds). bool um980SetRate(double secondsBetweenSolutions) { @@ -624,7 +624,7 @@ bool um980SetRate(double secondsBetweenSolutions) if (response == true) { uint16_t msBetweenSolutions = secondsBetweenSolutions * 1000; - settings.um980MeasurementRateMs = msBetweenSolutions; + settings.measurementRateMs = msBetweenSolutions; } else { @@ -638,7 +638,7 @@ bool um980SetRate(double secondsBetweenSolutions) // Returns the seconds between measurements double um980GetRateS() { - return (((double)settings.um980MeasurementRateMs) / 1000.0); + return (((double)settings.measurementRateMs) / 1000.0); } // Send data directly from ESP GNSS UART1 to UM980 UART3 @@ -1095,11 +1095,6 @@ uint8_t um980GetMessageNumberByName(const char *msgName) return (0); } -float um980GetSurveyInStartingAccuracy() -{ - return (settings.um980SurveyInStartingAccuracy); -} - // Controls the constellations that are used to generate a fix and logged void um980MenuConstellations() { diff --git a/Firmware/RTK_Everywhere/ZED.ino b/Firmware/RTK_Everywhere/ZED.ino index 84fcfc0d7..db5dcdb3d 100644 --- a/Firmware/RTK_Everywhere/ZED.ino +++ b/Firmware/RTK_Everywhere/ZED.ino @@ -353,7 +353,7 @@ bool zedConfigure() { response &= theGNSS->addCfgValset(UBLOX_CFG_NAVSPG_INFIL_MINCNO, - settings.minCNO_F9P); // Set minimum satellite signal level for navigation - default 6 + settings.minCNO); // Set minimum satellite signal level for navigation - default 6 } if (commandSupported(UBLOX_CFG_NAV2_OUT_ENABLED) == true) @@ -477,7 +477,7 @@ bool zedConfigureRover() // Set output rate response &= theGNSS->newCfgValset(); - response &= theGNSS->addCfgValset(UBLOX_CFG_RATE_MEAS, settings.measurementRate); + response &= theGNSS->addCfgValset(UBLOX_CFG_RATE_MEAS, settings.measurementRateMs); response &= theGNSS->addCfgValset(UBLOX_CFG_RATE_NAV, settings.navigationRate); // Survey mode is only available on ZED-F9P modules @@ -1015,10 +1015,10 @@ bool zedDisableLBandCommunication() return (response); } -// Given the number of seconds between desired solution reports, determine measurementRate and navigationRate -// measurementRate > 25 & <= 65535 +// Given the number of seconds between desired solution reports, determine measurementRateMs and navigationRate +// measurementRateS > 25 & <= 65535 // navigationRate >= 1 && <= 127 -// We give preference to limiting a measurementRate to 30s or below due to reported problems with measRates above 30. +// We give preference to limiting a measurementRate to 30 or below due to reported problems with measRates above 30. bool zedSetRate(double secondsBetweenSolutions) { uint16_t measRate = 0; // Calculate these locally and then attempt to apply them to ZED at completion @@ -1074,7 +1074,7 @@ bool zedSetRate(double secondsBetweenSolutions) // If we successfully set rates, only then record to settings if (response == true) { - settings.measurementRate = measRate; + settings.measurementRateMs = measRate; settings.navigationRate = navRate; } else @@ -1090,7 +1090,7 @@ bool zedSetRate(double secondsBetweenSolutions) double zedGetRateS() { // Because we may be in base mode, do not get freq from module, use settings instead - float measurementFrequency = (1000.0 / settings.measurementRate) / settings.navigationRate; + float measurementFrequency = (1000.0 / settings.measurementRateMs) / settings.navigationRate; double measurementRateS = 1.0 / measurementFrequency; // 1 / 4Hz = 0.25s return (measurementRateS); @@ -1243,7 +1243,7 @@ void zedEnableGgaForNtrip() theGNSS->setVal8(UBLOX_CFG_NMEA_MAINTALKERID, 1); theGNSS->setNMEAGPGGAcallbackPtr(&pushGPGGA); // Set up the callback for GPGGA - float measurementFrequency = (1000.0 / settings.measurementRate) / settings.navigationRate; + float measurementFrequency = (1000.0 / settings.measurementRateMs) / settings.navigationRate; if (measurementFrequency < 0.2) measurementFrequency = 0.2; // 0.2Hz * 5 = 1 measurement every 5 seconds log_d("Adjusting GGA setting to %f", measurementFrequency); @@ -1594,7 +1594,7 @@ void zedMenuMessages() setMessageRateByName("UBX_NMEA_GST", 1); // We want GSV NMEA to be reported at 1Hz to avoid swamping SPP connection - float measurementFrequency = (1000.0 / settings.measurementRate) / settings.navigationRate; + float measurementFrequency = (1000.0 / settings.measurementRateMs) / settings.navigationRate; if (measurementFrequency < 1.0) measurementFrequency = 1.0; setMessageRateByName("UBX_NMEA_GSV", measurementFrequency); // One report per second @@ -1610,7 +1610,7 @@ void zedMenuMessages() setMessageRateByName("UBX_NMEA_GST", 1); // We want GSV NMEA to be reported at 1Hz to avoid swamping SPP connection - float measurementFrequency = (1000.0 / settings.measurementRate) / settings.navigationRate; + float measurementFrequency = (1000.0 / settings.measurementRateMs) / settings.navigationRate; if (measurementFrequency < 1.0) measurementFrequency = 1.0; setMessageRateByName("UBX_NMEA_GSV", measurementFrequency); // One report per second @@ -1700,11 +1700,6 @@ char *zedGetRtcmLowDataRateString() return ((char *)"1074/1084/1094/1124 1Hz & 1005/1230 0.1Hz"); } -float zedGetSurveyInStartingAccuracy() -{ - return (settings.zedSurveyInStartingAccuracy); -} - // Controls the constellations that are used to generate a fix and logged void zedMenuConstellations() { diff --git a/Firmware/RTK_Everywhere/menuBase.ino b/Firmware/RTK_Everywhere/menuBase.ino index dd8b9ba6c..befd89ae5 100644 --- a/Firmware/RTK_Everywhere/menuBase.ino +++ b/Firmware/RTK_Everywhere/menuBase.ino @@ -245,14 +245,9 @@ void menuBase() else if (settings.fixedBase == false && incoming == 4) { // Arbitrary 0.1m minimum - if (present.gnss_zedf9p) - { - getNewSetting("Enter the positional accuracy required before Survey-In begins", 0.1, - (double)maxSurveyInStartingAccuracy, &settings.zedSurveyInStartingAccuracy); - } - else if (present.gnss_um980) + getNewSetting("Enter the positional accuracy required before Survey-In begins", 0.1, - (double)maxSurveyInStartingAccuracy, &settings.um980SurveyInStartingAccuracy); + (double)maxSurveyInStartingAccuracy, &settings.surveyInStartingAccuracy); } else if (incoming == 7) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index dd29f80a0..b6bcf4db0 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -2470,7 +2470,7 @@ void printAvailableSettings() } } - // Commands formed specifically for Man-Machine-Interface + // Below are commands formed specifically for the Man-Machine-Interface // Device ID - used in PointPerfect char hardwareID[15]; diff --git a/Firmware/RTK_Everywhere/menuGNSS.ino b/Firmware/RTK_Everywhere/menuGNSS.ino index be176469e..a6b9efb98 100644 --- a/Firmware/RTK_Everywhere/menuGNSS.ino +++ b/Firmware/RTK_Everywhere/menuGNSS.ino @@ -134,7 +134,7 @@ void menuGNSS() if (getNewSetting("Enter GNSS measurement rate in Hz", 0.00012, 20.0, &rate) == INPUT_RESPONSE_VALID) // 20Hz limit with all constellations enabled { - gnssSetRate(1.0 / rate); // Convert Hz to seconds. This will set settings.measurementRate, + gnssSetRate(1.0 / rate); // Convert Hz to seconds. This will set settings.measurementRateMs, // settings.navigationRate, and GSV message } } @@ -158,7 +158,7 @@ void menuGNSS() if (getNewSetting("Enter GNSS measurement rate in seconds between measurements", minRate, maxRate, &rate) == INPUT_RESPONSE_VALID) { - gnssSetRate(rate); // This will set settings.measurementRate, settings.navigationRate, and GSV message + gnssSetRate(rate); // This will set settings.measurementRateMs, settings.navigationRate, and GSV message } } else if (incoming == 3) @@ -237,8 +237,7 @@ void menuGNSS() if (getNewSetting("Enter minimum satellite signal level for navigation in dBHz", 0, 90, &minCNO) == INPUT_RESPONSE_VALID) { - // We don't know which platform we are using so we cannot explicitly use the settings.minCNO_F9P, eg - gnssSetMinCno(minCNO); + gnssSetMinCno(minCNO); //Set the setting and configure the GNSS receiver } } diff --git a/Firmware/RTK_Everywhere/menuMessages.ino b/Firmware/RTK_Everywhere/menuMessages.ino index 95abc117d..050b666c1 100644 --- a/Firmware/RTK_Everywhere/menuMessages.ino +++ b/Firmware/RTK_Everywhere/menuMessages.ino @@ -752,6 +752,24 @@ void checkGNSSArrayDefaults() settings.um980MessageRatesRTCMBase[x] = umMessagesRTCM[x].msgDefaultRate; } + //If defaults were applied, also default the non-array settings for this particular GNSS receiver + if(defaultsApplied == true) + { + if(present.gnss_um980) + { + settings.minCNO = 10; //Default 10 degrees + settings.surveyInStartingAccuracy = 2.0; //Default 2m + settings.measurementRateMs = 500; //Default 2Hz. + } + else if(present.gnss_zedf9p) + { + settings.minCNO = 6; //Default 6 degrees + settings.surveyInStartingAccuracy = 1.0; //Default 1m + settings.measurementRateMs = 250; //Default 4Hz. + } + + } + if (defaultsApplied == true) recordSystemSettings(); } @@ -759,7 +777,7 @@ void checkGNSSArrayDefaults() // Determine logging type // If user is logging basic 5 sentences, this is 'S'tandard logging // If user is logging 7 PPP sentences, this is 'P'PP logging -// If user has other setences turned on, it's custom logging +// If user has other sentences turned on, it's custom logging // This controls the type of icon displayed void setLoggingType() { @@ -784,7 +802,7 @@ void setLoggingType() void setLogTestFrequencyMessages(int rate, int messages) { // Set measurement frequency - gnssSetRate(1.0 / (double)rate); // Convert Hz to seconds. This will set settings.measurementRate, settings.navigationRate, + gnssSetRate(1.0 / (double)rate); // Convert Hz to seconds. This will set settings.measurementRateMs, settings.navigationRate, // and GSV message // Set messages diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 49de98dcc..1b43d9021 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1009,8 +1009,8 @@ struct Settings uint32_t dataPortBaud = (115200 * 2); // Default to 230400bps. This limits GNSS fixes at 4Hz but allows SD buffer to be reduced to 6k. uint32_t radioPortBaud = 57600; // Default to 57600bps to support connection to SiK1000 type telemetry radios - float zedSurveyInStartingAccuracy = 1.0; // Wait for this horizontal positional accuracy in meters before starting survey in - uint16_t measurementRate = 250; // Elapsed ms between GNSS measurements. 25ms to 65535ms. Default 4Hz. + float surveyInStartingAccuracy = 1.0; // Wait for this horizontal positional accuracy in meters before starting survey in + uint16_t measurementRateMs = 250; // Elapsed ms between GNSS measurements. 25ms to 65535ms. Default 4Hz. uint16_t navigationRate = 1; // Ratio between number of measurements and navigation solutions. Default 1 for 4Hz (with measurementRate). bool debugGnss = false; // Turn on to display GNSS library debug messages @@ -1123,7 +1123,7 @@ struct Settings CoordinateInputType coordinateInputType = COORDINATE_INPUT_TYPE_DD; // Default DD.ddddddddd uint16_t lbandFixTimeout_seconds = 180; // Number of seconds of no L-Band fix before resetting ZED - int16_t minCNO_F9P = 6; // Minimum satellite signal level for navigation. ZED-F9P default is 6 dBHz + int16_t minCNO = 6; // Minimum satellite signal level for navigation. ZED-F9P default is 6 dBHz uint16_t serialGNSSRxFullThreshold = 50; // RX FIFO full interrupt. Max of ~128. See pinUART2Task(). uint8_t btReadTaskPriority = 1; // Read from BT SPP and Write to GNSS. 3 being the highest, and 0 being the lowest uint8_t gnssReadTaskPriority = @@ -1270,7 +1270,6 @@ struct Settings 254}; // Mark first record with key so defaults will be applied. Int value for each supported message - Report // rates for RTCM Base. Default to Unicore recommended rates. uint8_t um980Constellations[MAX_UM980_CONSTELLATIONS] = {254}; // Mark first record with key so defaults will be applied. - int16_t minCNO_um980 = 10; // Minimum satellite signal level for navigation. bool enableTiltCompensation = true; // Allow user to disable tilt compensation on the models that have an IMU float tiltPoleLength = 1.8; // Length of the rod that the device is attached to. Should not include ARP. bool enableImuDebug = false; // Turn on to display IMU library debug messages @@ -1296,9 +1295,7 @@ struct Settings bool enablePsram = true; // Control the use on onboard PSRAM. Used for testing behavior when PSRAM is not available. bool printTaskStartStop = false; uint16_t psramMallocLevel = 40; // By default, push as much as possible to PSRAM. Needed to do secure WiFi (MQTT) + BT + PPL - float um980SurveyInStartingAccuracy = 2.0; // Wait for this horizontal positional accuracy in meters before starting survey in bool enableBeeper = true; // Some platforms have an audible notification - uint16_t um980MeasurementRateMs = 500; // Elapsed ms between GNSS measurements. 50ms to 65535ms. Default 2Hz. bool enableImuCompensationDebug = false; int correctionsSourcesPriority[correctionsSource::CORR_NUM] = { -1 }; // -1 indicates array is uninitialized @@ -1407,8 +1404,8 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { { & settings.fixedAltitude, "fixedAltitude", _double, point4float, true, true, true }, { & settings.dataPortBaud, "dataPortBaud", _uint32_t, 0, true, true, true }, { & settings.radioPortBaud, "radioPortBaud", _uint32_t, 0, true, true, true }, - { & settings.zedSurveyInStartingAccuracy, "zedSurveyInStartingAccuracy", _float, point1float, true, true, true }, - { & settings.measurementRate, "measurementRate", _uint16_t, 0, true, false, true }, + { & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", _float, point1float, true, true, true }, + { & settings.measurementRateMs, "measurementRateMs", _uint16_t, 0, true, false, true }, { & settings.navigationRate, "navigationRate", _uint16_t, 0, true, false, true }, { & settings.debugGnss, "debugGnss", _bool, 0, false, true, true }, { & settings.enableHeapReport, "enableHeapReport", _bool, 0, false, true, true }, @@ -1503,7 +1500,7 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { { & settings.coordinateInputType, "coordinateInputType", _CoordinateInputType, 0, false, true, true }, { & settings.lbandFixTimeout_seconds, "lbandFixTimeout", _uint16_t, 0, false, true, true }, - { & settings.minCNO_F9P, "minCNOF9P", _int16_t, 0, true, false, true }, + { & settings.minCNO, "minCNO", _int16_t, 0, true, false, true }, { & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", _uint16_t, 0, false, true, true }, { & settings.btReadTaskPriority, "btReadTaskPriority", _uint8_t, 0, false, true, true }, { & settings.gnssReadTaskPriority, "gnssReadTaskPriority", _uint8_t, 0, false, true, true }, @@ -1589,7 +1586,6 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { { & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", _um980MessageRatesRTCMBase, MAX_UM980_RTCM_MSG, false, false, true }, { & settings.um980Constellations, "um980Constellations_", _um980Constellations, MAX_UM980_CONSTELLATIONS, false, true, true }, - { & settings.minCNO_um980, "minCNOum980", _int16_t, 0, false, false, true }, { & settings.enableTiltCompensation, "enableTiltCompensation", _bool, 0, false, true, true }, { & settings.tiltPoleLength, "tiltPoleLength", _float, point3float, false, true, true }, { & settings.enableImuDebug, "enableImuDebug", _bool, 0, false, true, true }, @@ -1611,9 +1607,7 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { { & settings.enablePsram, "enablePsram", _bool, 0, false, true, true }, { & settings.printTaskStartStop, "printTaskStartStop", _bool, 0, false, true, true }, { & settings.psramMallocLevel, "psramMallocLevel", _uint16_t, 0, false, true, true }, - { & settings.um980SurveyInStartingAccuracy, "um980SurveyInStartingAccuracy", _float, point1float, false, true, true }, { & settings.enableBeeper, "enableBeeper", _bool, 0, false, true, true }, - { & settings.um980MeasurementRateMs, "um980MeasurementRateMs", _uint16_t, 0, false, false, true }, { & settings.enableImuCompensationDebug, "enableImuCompensationDebug", _bool, 0, false, true, true }, { & settings.correctionsSourcesPriority, "correctionsPriority_", _correctionsSourcesPriority, correctionsSource::CORR_NUM, false, true, true }, From c58299259f4f6cc024777a1d4b80319c533ff81d Mon Sep 17 00:00:00 2001 From: PaulZC Date: Wed, 15 May 2024 17:18:35 +0100 Subject: [PATCH 012/358] Rename NetworkClient and NetworkUDP to avoid name clash --- Firmware/RTK_Everywhere/Network.ino | 4 +-- Firmware/RTK_Everywhere/NtripClient.ino | 4 +-- Firmware/RTK_Everywhere/NtripServer.ino | 2 +- .../{NetworkClient.h => RTKNetworkClient.h} | 32 +++++++++---------- .../{NetworkUDP.h => RTKNetworkUDP.h} | 20 ++++++------ Firmware/RTK_Everywhere/TcpClient.ino | 8 ++--- Firmware/RTK_Everywhere/TcpServer.ino | 2 +- Firmware/RTK_Everywhere/UdpServer.ino | 4 +-- Firmware/RTK_Everywhere/settings.h | 6 ++-- 9 files changed, 41 insertions(+), 41 deletions(-) rename Firmware/RTK_Everywhere/{NetworkClient.h => RTKNetworkClient.h} (89%) rename Firmware/RTK_Everywhere/{NetworkUDP.h => RTKNetworkUDP.h} (93%) diff --git a/Firmware/RTK_Everywhere/Network.ino b/Firmware/RTK_Everywhere/Network.ino index 8a30ef37e..995133834 100644 --- a/Firmware/RTK_Everywhere/Network.ino +++ b/Firmware/RTK_Everywhere/Network.ino @@ -352,9 +352,9 @@ void menuTcpUdp() //---------------------------------------- // Allocate a network client //---------------------------------------- -NetworkClient *networkClient(uint8_t user, bool useSSL) +RTKNetworkClient *networkClient(uint8_t user, bool useSSL) { - NetworkClient *client; + RTKNetworkClient *client; int type; type = networkGetType(user); diff --git a/Firmware/RTK_Everywhere/NtripClient.ino b/Firmware/RTK_Everywhere/NtripClient.ino index 14f38052c..e41802409 100644 --- a/Firmware/RTK_Everywhere/NtripClient.ino +++ b/Firmware/RTK_Everywhere/NtripClient.ino @@ -179,7 +179,7 @@ const RtkMode_t ntripClientMode = RTK_MODE_ROVER | RTK_MODE_BASE_SURVEY_IN; //---------------------------------------- // The network connection to the NTRIP caster to obtain RTCM data. -static NetworkClient *ntripClient; +static RTKNetworkClient *ntripClient; static volatile uint8_t ntripClientState = NTRIP_CLIENT_OFF; // Throttle the time between connection attempts @@ -579,7 +579,7 @@ void ntripClientUpdate() else if (networkUserConnected(NETWORK_USER_NTRIP_CLIENT)) { // Allocate the ntripClient structure - ntripClient = new NetworkClient(NETWORK_USER_NTRIP_CLIENT); + ntripClient = new RTKNetworkClient(NETWORK_USER_NTRIP_CLIENT); if (!ntripClient) { // Failed to allocate the ntripClient structure diff --git a/Firmware/RTK_Everywhere/NtripServer.ino b/Firmware/RTK_Everywhere/NtripServer.ino index 92510d3fa..6cde18af9 100644 --- a/Firmware/RTK_Everywhere/NtripServer.ino +++ b/Firmware/RTK_Everywhere/NtripServer.ino @@ -602,7 +602,7 @@ void ntripServerUpdate(int serverIndex) else if (networkUserConnected(NETWORK_USER_NTRIP_SERVER + serverIndex)) { // Allocate the networkClient structure - ntripServer->networkClient = new NetworkClient(NETWORK_USER_NTRIP_SERVER + serverIndex); + ntripServer->networkClient = new RTKNetworkClient(NETWORK_USER_NTRIP_SERVER + serverIndex); if (!ntripServer->networkClient) { // Failed to allocate the networkClient structure diff --git a/Firmware/RTK_Everywhere/NetworkClient.h b/Firmware/RTK_Everywhere/RTKNetworkClient.h similarity index 89% rename from Firmware/RTK_Everywhere/NetworkClient.h rename to Firmware/RTK_Everywhere/RTKNetworkClient.h index 0ba9e3e95..60fde9fb3 100644 --- a/Firmware/RTK_Everywhere/NetworkClient.h +++ b/Firmware/RTK_Everywhere/RTKNetworkClient.h @@ -3,7 +3,7 @@ extern uint8_t networkGetType(uint8_t user); -class NetworkClient : public Client +class RTKNetworkClient : public Client { protected: Client *_client; // Ethernet or WiFi client @@ -14,14 +14,14 @@ class NetworkClient : public Client //------------------------------ // Create the network client //------------------------------ - NetworkClient(Client *client, uint8_t networkType) + RTKNetworkClient(Client *client, uint8_t networkType) { _friendClass = true; _networkType = networkType; _client = client; } - NetworkClient(uint8_t user) + RTKNetworkClient(uint8_t user) { _friendClass = false; _networkType = networkGetType(user); @@ -40,7 +40,7 @@ class NetworkClient : public Client //------------------------------ // Delete the network client //------------------------------ - ~NetworkClient() + ~RTKNetworkClient() { if (_client) { @@ -240,66 +240,66 @@ class NetworkClient : public Client }; #ifdef COMPILE_ETHERNET -class NetworkEthernetClient : public NetworkClient +class NetworkEthernetClient : public RTKNetworkClient { private: EthernetClient _ethernetClient; public: - NetworkEthernetClient() : NetworkClient(&_ethernetClient, NETWORK_TYPE_ETHERNET) + NetworkEthernetClient() : RTKNetworkClient(&_ethernetClient, NETWORK_TYPE_ETHERNET) { } NetworkEthernetClient(EthernetClient &client) - : _ethernetClient{client}, NetworkClient(&_ethernetClient, NETWORK_TYPE_ETHERNET) + : _ethernetClient{client}, RTKNetworkClient(&_ethernetClient, NETWORK_TYPE_ETHERNET) { } ~NetworkEthernetClient() { - this->~NetworkClient(); + this->~RTKNetworkClient(); } }; #endif // COMPILE_ETHERNET #ifdef COMPILE_WIFI -class NetworkWiFiClient : public NetworkClient +class NetworkWiFiClient : public RTKNetworkClient { protected: WiFiClient _client; public: - NetworkWiFiClient() : NetworkClient(&_client, NETWORK_TYPE_WIFI) + NetworkWiFiClient() : RTKNetworkClient(&_client, NETWORK_TYPE_WIFI) { } - NetworkWiFiClient(WiFiClient &client) : _client{client}, NetworkClient(&_client, NETWORK_TYPE_WIFI) + NetworkWiFiClient(WiFiClient &client) : _client{client}, RTKNetworkClient(&_client, NETWORK_TYPE_WIFI) { } ~NetworkWiFiClient() { - this->~NetworkClient(); + this->~RTKNetworkClient(); } }; -class NetworkSecureWiFiClient : public NetworkClient +class NetworkSecureWiFiClient : public RTKNetworkClient { protected: WiFiClientSecure _client; public: - NetworkSecureWiFiClient() : _client{WiFiClientSecure()}, NetworkClient(&_client, NETWORK_TYPE_WIFI) + NetworkSecureWiFiClient() : _client{WiFiClientSecure()}, RTKNetworkClient(&_client, NETWORK_TYPE_WIFI) { } - NetworkSecureWiFiClient(WiFiClient &client) : _client{client}, NetworkClient(&_client, NETWORK_TYPE_WIFI) + NetworkSecureWiFiClient(WiFiClient &client) : _client{client}, RTKNetworkClient(&_client, NETWORK_TYPE_WIFI) { } ~NetworkSecureWiFiClient() { - this->~NetworkClient(); + this->~RTKNetworkClient(); } WiFiClientSecure *getClient() diff --git a/Firmware/RTK_Everywhere/NetworkUDP.h b/Firmware/RTK_Everywhere/RTKNetworkUDP.h similarity index 93% rename from Firmware/RTK_Everywhere/NetworkUDP.h rename to Firmware/RTK_Everywhere/RTKNetworkUDP.h index 3548d0c75..ebf540456 100644 --- a/Firmware/RTK_Everywhere/NetworkUDP.h +++ b/Firmware/RTK_Everywhere/RTKNetworkUDP.h @@ -3,7 +3,7 @@ extern uint8_t networkGetType(uint8_t user); -class NetworkUDP : public UDP +class RTKNetworkUDP : public UDP { protected: @@ -16,14 +16,14 @@ class NetworkUDP : public UDP //------------------------------ // Create the network client //------------------------------ - NetworkUDP(UDP * udp, uint8_t networkType) + RTKNetworkUDP(UDP * udp, uint8_t networkType) { _friendClass = true; _networkType = networkType; _udp = udp; } - NetworkUDP(uint8_t user) + RTKNetworkUDP(uint8_t user) { _friendClass = false; _networkType = networkGetType(user); @@ -42,7 +42,7 @@ class NetworkUDP : public UDP //------------------------------ // Delete the network client //------------------------------ - ~NetworkUDP() + ~RTKNetworkUDP() { if (_udp) { @@ -260,7 +260,7 @@ class NetworkUDP : public UDP }; #ifdef COMPILE_ETHERNET -class NetworkEthernetUdp : public NetworkUDP +class NetworkEthernetUdp : public RTKNetworkUDP { private: @@ -270,19 +270,19 @@ class NetworkEthernetUdp : public NetworkUDP NetworkEthernetUdp(EthernetUDP& udp) : _udp{udp}, - NetworkUDP(&_udp, NETWORK_TYPE_ETHERNET) + RTKNetworkUDP(&_udp, NETWORK_TYPE_ETHERNET) { } ~NetworkEthernetUdp() { - this->~NetworkUDP(); + this->~RTKNetworkUDP(); } }; #endif // COMPILE_ETHERNET #ifdef COMPILE_WIFI -class NetworkWiFiUdp : public NetworkUDP +class NetworkWiFiUdp : public RTKNetworkUDP { private: @@ -292,13 +292,13 @@ class NetworkWiFiUdp : public NetworkUDP NetworkWiFiUdp(WiFiUDP& udp) : _udp{udp}, - NetworkUDP(&_udp, NETWORK_TYPE_WIFI) + RTKNetworkUDP(&_udp, NETWORK_TYPE_WIFI) { } ~NetworkWiFiUdp() { - this->~NetworkUDP(); + this->~RTKNetworkUDP(); } }; #endif // COMPILE_WIFI diff --git a/Firmware/RTK_Everywhere/TcpClient.ino b/Firmware/RTK_Everywhere/TcpClient.ino index 85a550e09..aaef48249 100644 --- a/Firmware/RTK_Everywhere/TcpClient.ino +++ b/Firmware/RTK_Everywhere/TcpClient.ino @@ -146,7 +146,7 @@ const RtkMode_t tcpClientMode = RTK_MODE_BASE_FIXED | RTK_MODE_BASE_SURVEY_IN | // Locals //---------------------------------------- -static NetworkClient *tcpClient; +static RTKNetworkClient *tcpClient; static IPAddress tcpClientIpAddress; static uint8_t tcpClientState; static volatile RING_BUFFER_OFFSET tcpClientTail; @@ -270,10 +270,10 @@ void discardTcpClientBytes(RING_BUFFER_OFFSET previousTail, RING_BUFFER_OFFSET n // Start the TCP client bool tcpClientStart() { - NetworkClient *client; + RTKNetworkClient *client; // Allocate the TCP client - client = new NetworkClient(NETWORK_USER_TCP_CLIENT); + client = new RTKNetworkClient(NETWORK_USER_TCP_CLIENT); if (client) { // Get the host name @@ -324,7 +324,7 @@ bool tcpClientStart() // Stop the TCP client void tcpClientStop() { - NetworkClient *client; + RTKNetworkClient *client; IPAddress ipAddress; client = tcpClient; diff --git a/Firmware/RTK_Everywhere/TcpServer.ino b/Firmware/RTK_Everywhere/TcpServer.ino index ba3929d97..fcb042f90 100644 --- a/Firmware/RTK_Everywhere/TcpServer.ino +++ b/Firmware/RTK_Everywhere/TcpServer.ino @@ -73,7 +73,7 @@ static uint32_t tcpServerTimer; static volatile uint8_t tcpServerClientConnected; static volatile uint8_t tcpServerClientDataSent; static volatile uint8_t tcpServerClientWriteError; -static NetworkClient *tcpServerClient[TCP_SERVER_MAX_CLIENTS]; +static RTKNetworkClient *tcpServerClient[TCP_SERVER_MAX_CLIENTS]; static IPAddress tcpServerClientIpAddress[TCP_SERVER_MAX_CLIENTS]; static volatile RING_BUFFER_OFFSET tcpServerClientTails[TCP_SERVER_MAX_CLIENTS]; diff --git a/Firmware/RTK_Everywhere/UdpServer.ino b/Firmware/RTK_Everywhere/UdpServer.ino index f6480d409..d7f7afcf1 100644 --- a/Firmware/RTK_Everywhere/UdpServer.ino +++ b/Firmware/RTK_Everywhere/UdpServer.ino @@ -90,7 +90,7 @@ const RtkMode_t udpServerMode = RTK_MODE_BASE_FIXED | RTK_MODE_BASE_SURVEY_IN | //---------------------------------------- // UDP server -static NetworkUDP *udpServer = nullptr; +static RTKNetworkUDP *udpServer = nullptr; static uint8_t udpServerState; static uint32_t udpServerTimer; static volatile RING_BUFFER_OFFSET udpServerTail; @@ -231,7 +231,7 @@ bool udpServerStart() systemPrintln("UDP server starting"); // Start the UDP server - udpServer = new NetworkUDP(NETWORK_USER_UDP_SERVER); + udpServer = new RTKNetworkUDP(NETWORK_USER_UDP_SERVER); if (!udpServer) return false; diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 1b43d9021..84ce68a9b 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -316,14 +316,14 @@ enum WiFiState }; volatile byte wifiState = WIFI_STATE_OFF; -#include "NetworkClient.h" // Built-in - Supports both WiFiClient and EthernetClient -#include "NetworkUDP.h" //Built-in - Supports both WiFiUdp and EthernetUdp +#include "RTKNetworkClient.h" // Built-in - Supports both WiFiClient and EthernetClient +#include "RTKNetworkUDP.h" //Built-in - Supports both WiFiUdp and EthernetUdp // NTRIP Server data typedef struct _NTRIP_SERVER_DATA { // Network connection used to push RTCM to NTRIP caster - NetworkClient *networkClient; + RTKNetworkClient *networkClient; volatile uint8_t state; // Count of bytes sent by the NTRIP server to the NTRIP caster From f476dc6dcc33c94b9e41c52758de668243a9f679 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Wed, 15 May 2024 14:51:58 -0600 Subject: [PATCH 013/358] Update comments --- Firmware/RTK_Everywhere/settings.h | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 1b43d9021..6b154ede3 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -77,7 +77,7 @@ typedef enum RTK_FACET_V2 = 1, // 0x01 RTK_FACET_MOSAIC = 2, // 0x02 RTK_TORCH = 3, // 0x03 - // Add new values just above this line + // Add new values above this line RTK_UNKNOWN } ProductVariant; ProductVariant productVariant = RTK_UNKNOWN; @@ -174,7 +174,7 @@ const SystemState platformPreviousStateTable[] = STATE_ROVER_NOT_STARTED, // Facet v2 STATE_ROVER_NOT_STARTED, // Facet mosaic STATE_ROVER_NOT_STARTED, // Torch - // Add new values just above this line + // Add new values above this line STATE_ROVER_NOT_STARTED // Unknown }; const int platformPreviousStateTableEntries = sizeof (platformPreviousStateTable) / sizeof(platformPreviousStateTable[0]); @@ -183,7 +183,7 @@ typedef enum { DISPLAY_64x48, DISPLAY_128x64, - // <-- Insert any future displays here + // Add new displays above this line DISPLAY_MAX_NONE // This represents the maximum numbers of display and also "no display" } DisplayType; @@ -403,7 +403,7 @@ typedef enum ETH_STARTED_START_DHCP, ETH_CONNECTED, ETH_CAN_NOT_BEGIN, - // Add new states here + // Add new states above this line ETH_MAX_STATE } ethernetStatus_e; @@ -483,7 +483,6 @@ typedef enum FUNCTION_LOG_CLOSURE, FUNCTION_PRINT_FILE_LIST, FUNCTION_NTPEVENT, - } SemaphoreFunction; #include //http://librarymanager/All#SparkFun_u-blox_GNSS_v3 @@ -599,7 +598,6 @@ const char * const measurementScaleName[] = "meters", "feet and inches", }; - const int measurementScaleNameEntries = sizeof(measurementScaleName) / sizeof(measurementScaleName[0]); const char * const measurementScaleUnits[] = @@ -607,7 +605,6 @@ const char * const measurementScaleUnits[] = "m", "ft", }; - const int measurementScaleUnitsEntries = sizeof(measurementScaleUnits) / sizeof(measurementScaleUnits[0]); // These are the allowable messages to broadcast and log (if enabled) @@ -887,7 +884,6 @@ const ubxMsg ubxMessages[] = { {UBLOX_CFG_MSGOUT_UBX_TIM_TM2_UART1, UBX_TIM_TM2, UBX_CLASS_TIM, 0, "UBX_TIM_TM2", 0, 112, 120}, {UBLOX_CFG_MSGOUT_UBX_TIM_TP_UART1, UBX_TIM_TP, UBX_CLASS_TIM, 0, "UBX_TIM_TP", 0, 112, 120}, {UBLOX_CFG_MSGOUT_UBX_TIM_VRFY_UART1, UBX_TIM_VRFY, UBX_CLASS_TIM, 0, "UBX_TIM_VRFY", 0, 112, 120}, - }; #define MAX_UBX_MSG (sizeof(ubxMessages) / sizeof(ubxMsg)) From 620c54a2d51909d0986e8f42fed21f76d2ac90c1 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Wed, 15 May 2024 15:05:41 -0600 Subject: [PATCH 014/358] Rename variable --- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 2 +- Firmware/RTK_Everywhere/menuPP.ino | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index dbd85ea80..c7eb6a77a 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -758,7 +758,7 @@ correctionsSource pplCorrectionsSource = CORR_NUM; // Record which source is fee bool configureViaEthernet; unsigned long lbandTimeFloatStarted; // Monitors the ZED during L-Band reception if a fix takes too long -int lbandRestarts; +int floatLockRestarts; unsigned long rtkTimeToFixMs; unsigned long lbandLastReport; diff --git a/Firmware/RTK_Everywhere/menuPP.ino b/Firmware/RTK_Everywhere/menuPP.ino index 1e679af25..eac8d6ea8 100644 --- a/Firmware/RTK_Everywhere/menuPP.ino +++ b/Firmware/RTK_Everywhere/menuPP.ino @@ -1396,7 +1396,7 @@ void menuPointPerfect() systemPrintln("Menu: PointPerfect Corrections"); if (settings.debugCorrections == true) - systemPrintf("Time to first RTK Fix: %ds Restarts: %d\r\n", rtkTimeToFixMs / 1000, lbandRestarts); + systemPrintf("Time to first RTK Fix: %ds Restarts: %d\r\n", rtkTimeToFixMs / 1000, floatLockRestarts); if (settings.debugCorrections == true) systemPrintf("settings.pointPerfectKeyDistributionTopic: %s\r\n", @@ -1617,7 +1617,7 @@ void updateLBand() lbandLastReport = millis(); if (settings.debugCorrections == true) - systemPrintf("ZED restarts: %d Time remaining before L-Band forced restart: %ds\r\n", lbandRestarts, + systemPrintf("ZED restarts: %d Time remaining before L-Band forced restart: %ds\r\n", floatLockRestarts, settings.lbandFixTimeout_seconds - ((millis() - lbandTimeFloatStarted) / 1000)); } @@ -1625,7 +1625,7 @@ void updateLBand() { if ((millis() - lbandTimeFloatStarted) > (settings.lbandFixTimeout_seconds * 1000L)) { - lbandRestarts++; + floatLockRestarts++; lbandTimeFloatStarted = millis(); // Restart timer for L-Band. Don't immediately reset ZED to achieve fix. @@ -1634,7 +1634,7 @@ void updateLBand() theGNSS->softwareResetGNSSOnly(); if (settings.debugCorrections == true) - systemPrintf("Restarting ZED. Number of L-Band restarts: %d\r\n", lbandRestarts); + systemPrintf("Restarting ZED. Number of L-Band restarts: %d\r\n", floatLockRestarts); } } } From 3f1fb97da13a3cc2bf97547b0691944c22882521 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Thu, 16 May 2024 12:01:59 +0100 Subject: [PATCH 015/358] Update form.h --- Firmware/RTK_Everywhere/form.h | 3517 ++++++++++++++++---------------- 1 file changed, 1761 insertions(+), 1756 deletions(-) diff --git a/Firmware/RTK_Everywhere/form.h b/Firmware/RTK_Everywhere/form.h index 3a0fe8485..2a5490ead 100644 --- a/Firmware/RTK_Everywhere/form.h +++ b/Firmware/RTK_Everywhere/form.h @@ -26,859 +26,862 @@ // python main_js_zipper.py static const uint8_t main_js[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x17, 0xF7, 0x3F, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, - 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x38, 0x92, 0xE8, 0xFF, - 0x3C, 0x05, 0x46, 0x3B, 0x67, 0x24, 0x8D, 0x65, 0x99, 0x92, 0x2F, 0xB1, 0xE3, 0x38, 0x7B, 0x7C, - 0x4D, 0x7C, 0xDA, 0x17, 0x1D, 0xCB, 0x4E, 0x3A, 0xC9, 0x64, 0xBD, 0xB4, 0x08, 0xCB, 0x9C, 0x48, - 0xA4, 0x96, 0xA4, 0x7C, 0x99, 0xD9, 0xBC, 0xD3, 0x3E, 0xC3, 0x3E, 0xD9, 0xA2, 0x00, 0x90, 0x04, - 0x40, 0xF0, 0x2A, 0xC9, 0x71, 0xF7, 0xB6, 0xBF, 0x99, 0xB4, 0x4D, 0x00, 0x55, 0x85, 0x42, 0xA1, - 0x00, 0x14, 0xAA, 0x0A, 0xF7, 0xA6, 0x87, 0x86, 0x66, 0x80, 0x1F, 0xCC, 0x27, 0xB4, 0x83, 0xFE, - 0xFD, 0xC1, 0x7F, 0xB3, 0xB2, 0xF2, 0xE7, 0x7F, 0x3E, 0xD8, 0x8E, 0xE5, 0x3E, 0xB4, 0x47, 0xEE, - 0xC0, 0x0C, 0x6C, 0xD7, 0x69, 0xDF, 0xB9, 0x7E, 0xE0, 0x98, 0x63, 0xFC, 0x63, 0xE5, 0xC1, 0xFF, - 0xF7, 0xED, 0x57, 0xF7, 0xA4, 0xD1, 0x03, 0xBE, 0xF1, 0xDD, 0xC1, 0x77, 0x1C, 0x6C, 0xBF, 0x7A, - 0xC5, 0xAB, 0x9B, 0x96, 0x75, 0x78, 0x8F, 0x9D, 0xE0, 0xC4, 0xF6, 0x03, 0xEC, 0x60, 0xAF, 0x51, - 0x1F, 0xB9, 0xA6, 0x55, 0x6F, 0x21, 0xD7, 0x39, 0x21, 0xBF, 0x34, 0x49, 0xCD, 0xDB, 0xA9, 0x33, - 0x00, 0x88, 0xFC, 0x53, 0x03, 0x43, 0xFD, 0x26, 0xFA, 0xE7, 0x2B, 0x44, 0x7E, 0x6C, 0xC7, 0x0E, - 0x3E, 0xE1, 0x9B, 0x3E, 0x05, 0xDB, 0x20, 0xD5, 0x7F, 0x08, 0x0D, 0x94, 0x42, 0xDE, 0x24, 0xA2, - 0x82, 0x10, 0xEF, 0xE0, 0x07, 0x14, 0xD7, 0xE0, 0x9D, 0x22, 0x50, 0xA4, 0x7A, 0x6D, 0xD7, 0x19, - 0x63, 0xDF, 0x37, 0x87, 0x98, 0xB4, 0x88, 0x80, 0x37, 0xC6, 0xFE, 0x30, 0x04, 0x09, 0x3F, 0x13, - 0xD3, 0xF3, 0xF1, 0xB1, 0x33, 0x70, 0xC7, 0xB6, 0x33, 0x84, 0xC2, 0xB6, 0x65, 0x06, 0x26, 0x87, - 0xF5, 0x43, 0x26, 0x6C, 0x88, 0x1B, 0x38, 0x6C, 0xEB, 0xE1, 0x60, 0xEA, 0x39, 0xC8, 0x72, 0x07, - 0xD3, 0x31, 0xE9, 0x58, 0x7B, 0x88, 0x83, 0xC3, 0x11, 0x86, 0x5F, 0xF7, 0x9E, 0x8E, 0x49, 0x6F, - 0x59, 0x9F, 0x80, 0x7D, 0xB7, 0xF6, 0x23, 0xB6, 0x4E, 0x4C, 0xA0, 0xDB, 0xD8, 0x16, 0xBE, 0xB8, - 0xCE, 0x30, 0xFE, 0x34, 0x19, 0x99, 0xC1, 0xAD, 0xEB, 0x8D, 0x7B, 0x1E, 0x26, 0xA5, 0xE4, 0x7B, - 0xAD, 0xC6, 0x0A, 0x86, 0xD8, 0xB5, 0x70, 0x60, 0x0F, 0x18, 0x80, 0x35, 0xA3, 0x6D, 0x74, 0x94, - 0x02, 0x42, 0xD8, 0x0E, 0x5A, 0xEE, 0x18, 0xEB, 0xED, 0xCE, 0x96, 0x5C, 0xB4, 0x3B, 0x82, 0x36, - 0x9D, 0x75, 0xC3, 0x68, 0xF3, 0x46, 0x78, 0x80, 0x6F, 0x7F, 0xA5, 0xD5, 0xBB, 0x9B, 0x46, 0xD7, - 0xD8, 0x68, 0xAF, 0x6F, 0x6C, 0xC6, 0x25, 0x9F, 0xA1, 0x64, 0xED, 0x75, 0x67, 0x63, 0xD3, 0x58, - 0x6B, 0xAF, 0x19, 0xAB, 0x71, 0xC9, 0x17, 0x8A, 0x7B, 0x73, 0x63, 0x63, 0x63, 0xBD, 0xBD, 0xB6, - 0xB9, 0xC6, 0x0A, 0x46, 0xA6, 0x1F, 0x1C, 0xD9, 0x23, 0x7C, 0x46, 0xC4, 0x45, 0xA0, 0xF8, 0x16, - 0x3E, 0x4D, 0xC7, 0x37, 0xD8, 0x8B, 0xBB, 0xE7, 0xD0, 0xBF, 0xCF, 0x6F, 0xA1, 0xBA, 0xDF, 0xC7, - 0x23, 0x3C, 0x08, 0xB0, 0x15, 0x17, 0xFB, 0xFC, 0x0B, 0x2D, 0x16, 0x40, 0xF9, 0x77, 0x2E, 0x11, - 0xB8, 0x21, 0x7C, 0x06, 0x49, 0x83, 0x71, 0x34, 0x47, 0x3E, 0x66, 0x85, 0xEE, 0x4D, 0x60, 0xDA, - 0x0E, 0xB6, 0x4E, 0xD9, 0x20, 0x17, 0xAA, 0xB0, 0x67, 0xFA, 0x58, 0xAE, 0xC4, 0x51, 0xF0, 0x3A, - 0x17, 0x97, 0xFB, 0xA7, 0x49, 0x40, 0xD0, 0xA3, 0x4B, 0xF3, 0x86, 0xFC, 0x83, 0x1F, 0x03, 0x81, - 0xBC, 0x81, 0xEB, 0x79, 0x98, 0x8A, 0x86, 0x52, 0xC0, 0xE5, 0x4E, 0xF9, 0x0A, 0xFC, 0xE2, 0x78, - 0x2E, 0x9F, 0x26, 0x38, 0xBD, 0x84, 0x53, 0x09, 0xA5, 0xB4, 0x98, 0x20, 0x71, 0x3D, 0xCB, 0x3F, - 0xDC, 0x3F, 0x3C, 0x22, 0x9F, 0xBF, 0x7E, 0xDB, 0x16, 0xBF, 0xBE, 0xE7, 0x83, 0x2D, 0x94, 0xDC, - 0x4E, 0x47, 0xA3, 0x1E, 0x81, 0x75, 0x35, 0x21, 0xB2, 0x2C, 0xF4, 0x97, 0x37, 0xF3, 0x71, 0x70, - 0x69, 0x8F, 0xB1, 0x3B, 0x0D, 0x42, 0xEE, 0x3B, 0xD6, 0x01, 0x11, 0x7A, 0xE9, 0xE3, 0xE0, 0x0E, - 0x0F, 0xBE, 0x9F, 0xE1, 0x87, 0x23, 0xDB, 0x1B, 0x3F, 0x98, 0x1E, 0x96, 0x0A, 0x89, 0xB0, 0xEB, - 0x8A, 0x5E, 0x0D, 0x5C, 0x87, 0xF0, 0x8E, 0x0C, 0xF6, 0x7E, 0xC4, 0x19, 0xBF, 0xEF, 0x4E, 0xBD, - 0x01, 0x1D, 0xD5, 0xD7, 0x2A, 0xD7, 0x78, 0x19, 0xC8, 0x8F, 0x2F, 0x90, 0x9F, 0xA8, 0xD0, 0xF3, - 0x6C, 0xD7, 0xB3, 0x03, 0x3B, 0xAA, 0xC5, 0x11, 0xED, 0xBB, 0x84, 0x01, 0xB6, 0x43, 0xFA, 0x08, - 0x5C, 0x83, 0x42, 0x36, 0x37, 0xF7, 0xCF, 0xCF, 0x2F, 0x0E, 0x8E, 0xCF, 0x76, 0x2F, 0x0F, 0xAF, - 0x8F, 0xCF, 0x7A, 0x57, 0x97, 0xD7, 0x97, 0x9F, 0x7B, 0x87, 0xD7, 0x07, 0x07, 0x6F, 0x90, 0xD1, - 0x42, 0x2B, 0x2B, 0x07, 0xF8, 0xD6, 0x9C, 0x92, 0xA9, 0x71, 0x70, 0xD0, 0xB6, 0xC2, 0x9F, 0xCC, - 0x76, 0xA7, 0xA7, 0x6F, 0x50, 0x87, 0xB6, 0x24, 0xBF, 0xB6, 0xC7, 0xF0, 0x93, 0x59, 0xFF, 0x1A, - 0x1A, 0x74, 0x59, 0x03, 0x54, 0xB4, 0xC5, 0xF5, 0xC1, 0x6E, 0xFF, 0xC3, 0x1B, 0xB4, 0xCA, 0x9A, - 0x2D, 0x17, 0x6E, 0xD6, 0xFF, 0x7C, 0xBA, 0x77, 0x7E, 0xF2, 0x06, 0xAD, 0xB1, 0x86, 0xFF, 0xFD, - 0x5F, 0x61, 0xCB, 0xF1, 0xB8, 0x9E, 0xD3, 0xAB, 0x7E, 0xFF, 0x0D, 0x5A, 0x8F, 0xC8, 0x44, 0xFD, - 0x7E, 0xDB, 0xA7, 0x3F, 0xF9, 0x38, 0x49, 0xC3, 0x8D, 0x6A, 0x0D, 0x79, 0x37, 0x5F, 0x47, 0xDD, - 0x5C, 0x2E, 0xD5, 0x3A, 0xEC, 0xED, 0x66, 0xDC, 0xDB, 0x7A, 0x04, 0xA0, 0x96, 0xDB, 0xDF, 0xEB, - 0xB3, 0xF3, 0xEB, 0x83, 0xC3, 0xFD, 0xE3, 0xD3, 0x5D, 0x02, 0x63, 0x2B, 0x1C, 0xD2, 0x7E, 0x1F, - 0x2D, 0xA3, 0x33, 0x17, 0x59, 0x78, 0x60, 0x8F, 0xCD, 0x51, 0x11, 0x3A, 0x44, 0x38, 0x1D, 0x43, - 0x64, 0x45, 0x69, 0x50, 0xC0, 0x10, 0x19, 0x5E, 0x47, 0x64, 0x4E, 0x51, 0x78, 0xC7, 0x67, 0x1F, - 0x77, 0x4F, 0x8E, 0x0F, 0xAE, 0xAF, 0xCE, 0x7E, 0x39, 0x3B, 0xFF, 0x74, 0x46, 0xC0, 0x74, 0x5B, - 0xE1, 0x12, 0x44, 0xA6, 0xCB, 0x3D, 0xF6, 0x88, 0x82, 0x8D, 0x67, 0x0C, 0x28, 0xDF, 0xB6, 0x11, - 0x4E, 0xB8, 0xF0, 0xEB, 0xB1, 0x33, 0x99, 0x06, 0x5C, 0x39, 0x29, 0xB3, 0xAB, 0x9D, 0xD6, 0x0D, - 0x71, 0xAD, 0x4F, 0xAC, 0xA6, 0xE1, 0x72, 0xB9, 0xB2, 0x02, 0x53, 0xD6, 0x1D, 0x61, 0xB2, 0xD3, - 0x18, 0x36, 0x6A, 0x61, 0x95, 0x50, 0x53, 0xBE, 0x41, 0x35, 0xB4, 0x84, 0xA0, 0x3E, 0x81, 0x06, - 0xF5, 0x81, 0x2C, 0x58, 0x88, 0x09, 0x1D, 0xB0, 0x26, 0xFB, 0x93, 0x91, 0x1D, 0x34, 0xEA, 0xAD, - 0x3A, 0x5F, 0x98, 0xC9, 0x52, 0x89, 0x1A, 0x23, 0xB2, 0x17, 0x78, 0xA4, 0x8B, 0x08, 0xF9, 0xCF, - 0x5B, 0x5A, 0xBD, 0x3D, 0xC2, 0xCE, 0x30, 0xB8, 0x23, 0x3C, 0xEB, 0xC0, 0xC7, 0xA5, 0x1D, 0xD4, - 0x15, 0x17, 0x7B, 0x80, 0x6A, 0xC3, 0xBA, 0x03, 0x75, 0xBF, 0x3E, 0x7E, 0xDB, 0x96, 0x4A, 0xEE, - 0xCD, 0x51, 0x54, 0x44, 0xA8, 0xE9, 0x08, 0xC5, 0x0A, 0xF9, 0xB6, 0xC5, 0x08, 0x26, 0xB0, 0x96, - 0x50, 0xAD, 0x05, 0x2D, 0xD9, 0x07, 0xF2, 0x4B, 0xD8, 0x03, 0xD6, 0xAC, 0x3F, 0x21, 0x03, 0x47, - 0xE0, 0x92, 0xEE, 0x8E, 0x4D, 0xC7, 0xF2, 0xA3, 0x22, 0xFB, 0x16, 0x35, 0x6C, 0xAB, 0x6D, 0x3B, - 0x83, 0xD1, 0xD4, 0xC2, 0x7E, 0xA3, 0xE6, 0x5B, 0xA7, 0xEE, 0xD4, 0x21, 0x63, 0x54, 0x6B, 0x8A, - 0x24, 0x33, 0x30, 0x97, 0xB0, 0xD7, 0x70, 0x9D, 0x15, 0xF7, 0xF6, 0x16, 0xF5, 0x0F, 0x10, 0x51, - 0xBA, 0xA6, 0x54, 0x03, 0xA0, 0x51, 0xF2, 0xC9, 0xAA, 0x41, 0x95, 0x7D, 0x4D, 0x85, 0x01, 0x3F, - 0x77, 0xB6, 0x85, 0x1B, 0x35, 0x58, 0xCD, 0x4E, 0x4D, 0x87, 0x70, 0xDD, 0xAB, 0x35, 0xB7, 0xA5, - 0x4A, 0x3F, 0xA4, 0xBF, 0x30, 0x81, 0x23, 0x41, 0x0E, 0xBC, 0xA9, 0x1E, 0x30, 0x2C, 0xA2, 0x05, - 0x01, 0xC7, 0xBF, 0x45, 0xE0, 0x61, 0x44, 0x08, 0x74, 0x79, 0x0B, 0x94, 0xC0, 0x93, 0xD8, 0x21, - 0x11, 0xAA, 0x64, 0x24, 0xD1, 0x5E, 0x2C, 0xB0, 0x83, 0x11, 0x5D, 0x40, 0x2F, 0x2E, 0x7F, 0xA1, - 0xC3, 0xA2, 0xB4, 0x25, 0x63, 0x86, 0xFA, 0x64, 0xFF, 0x36, 0xA9, 0xC9, 0x00, 0x12, 0xEB, 0x26, - 0x74, 0x58, 0xAE, 0xA2, 0x5D, 0xF2, 0x13, 0x43, 0xA1, 0xD2, 0x4A, 0xAA, 0x1D, 0x7E, 0xFC, 0x25, - 0x83, 0x75, 0x37, 0x64, 0xC5, 0xDF, 0x77, 0x9D, 0x5B, 0x7B, 0xA8, 0x72, 0x2E, 0xAE, 0x33, 0x99, - 0xE4, 0xD5, 0xC0, 0xC1, 0x1D, 0xF6, 0x1C, 0x1C, 0xE4, 0xD5, 0x73, 0x82, 0x0C, 0x50, 0x4C, 0x48, - 0x02, 0x7B, 0x44, 0xC0, 0x8C, 0x27, 0xD8, 0xF1, 0xE9, 0xB9, 0x80, 0xB0, 0x2B, 0x20, 0xF3, 0xD5, - 0x4F, 0x6F, 0x31, 0x71, 0xBD, 0xC0, 0xCF, 0xC3, 0x4C, 0x66, 0xCF, 0xA5, 0xDB, 0x3F, 0xD8, 0x37, - 0x3D, 0xAB, 0xA0, 0xEC, 0x69, 0x58, 0x79, 0x64, 0x0E, 0xC8, 0xCC, 0xBF, 0xEF, 0x2E, 0x90, 0x9F, - 0xAC, 0x4B, 0xF9, 0xFC, 0x64, 0xF5, 0xE6, 0xCC, 0x4F, 0x4E, 0xDE, 0x33, 0xF3, 0x73, 0xEC, 0xFA, - 0xA6, 0x3D, 0xF8, 0x83, 0xA7, 0xF3, 0xE1, 0xE9, 0xA5, 0xEB, 0x0D, 0xEE, 0x7E, 0x1B, 0xCC, 0x64, - 0xC8, 0xE6, 0x3E, 0xE1, 0x59, 0x25, 0x85, 0x99, 0x49, 0xE4, 0xF4, 0xE4, 0x47, 0xF4, 0x28, 0x39, - 0x5B, 0xD7, 0xAC, 0x27, 0xC7, 0x1C, 0xDB, 0x83, 0x53, 0x72, 0xA0, 0x19, 0xE9, 0x40, 0xC2, 0x82, - 0x4F, 0x8E, 0xFE, 0xE7, 0x13, 0xBA, 0xD7, 0x60, 0x66, 0x00, 0xF6, 0x47, 0xA3, 0xDE, 0x9F, 0x7A, - 0xF7, 0xF8, 0xA9, 0xDE, 0x42, 0x75, 0xA3, 0xAE, 0xEB, 0x24, 0xC5, 0x03, 0x76, 0x8B, 0x46, 0x04, - 0xA1, 0x85, 0xA6, 0x8E, 0x45, 0x46, 0x8C, 0x1C, 0x11, 0x35, 0x2D, 0xD2, 0x10, 0x5D, 0xED, 0x7E, - 0x04, 0x2C, 0x9D, 0xC5, 0x62, 0xD9, 0x9D, 0x06, 0xEE, 0xD8, 0x0D, 0xEC, 0x7B, 0x0C, 0xC8, 0xBA, - 0xD5, 0x90, 0x25, 0x9A, 0xF0, 0xBD, 0xA0, 0x1F, 0xE0, 0xD1, 0x88, 0x8E, 0xF2, 0x3E, 0x9C, 0xF2, - 0xE8, 0x89, 0xFB, 0xAD, 0x65, 0xDF, 0xA3, 0x01, 0x39, 0x88, 0xFA, 0x3B, 0x75, 0x90, 0xE5, 0x65, - 0x7A, 0x00, 0x44, 0xE3, 0x60, 0xB9, 0x53, 0x7F, 0x57, 0x4B, 0x62, 0xD7, 0x81, 0x59, 0x02, 0x38, - 0x23, 0xF3, 0x06, 0x8F, 0x92, 0x90, 0x96, 0xE9, 0xF7, 0x3A, 0xEC, 0xDC, 0x76, 0xEA, 0xD3, 0xF1, - 0xD6, 0xA6, 0xB1, 0x2F, 0x42, 0xF0, 0xAF, 0xDF, 0xF7, 0xFA, 0xF5, 0x77, 0xE4, 0x1F, 0xF4, 0x76, - 0x85, 0x56, 0x2D, 0x85, 0xD4, 0x86, 0x7D, 0xAB, 0x06, 0x29, 0xFD, 0x5E, 0x47, 0x01, 0xD9, 0xC0, - 0xEE, 0xD4, 0xE9, 0xA7, 0x1B, 0xF7, 0xB1, 0x0E, 0x5B, 0x87, 0x29, 0xF9, 0x50, 0x27, 0x1B, 0xB8, - 0x0C, 0x62, 0xCA, 0x10, 0xB0, 0x42, 0xD8, 0x57, 0xAA, 0xC1, 0x4F, 0x67, 0xF7, 0xC9, 0xF9, 0xD9, - 0x6E, 0x1F, 0x58, 0xCE, 0x7E, 0x79, 0x19, 0x6C, 0x0F, 0x89, 0xFA, 0x7D, 0xB3, 0xDE, 0x1C, 0x91, - 0x9D, 0xB2, 0x4B, 0x58, 0xCF, 0x7E, 0x79, 0x19, 0xAC, 0x0F, 0x89, 0xFA, 0x5D, 0xB3, 0x7E, 0x0F, - 0xDB, 0x07, 0xEE, 0xB4, 0xFE, 0x8E, 0xFD, 0xF7, 0x45, 0x30, 0x3E, 0x24, 0xE9, 0x77, 0xCD, 0xF7, - 0xFF, 0xFF, 0x05, 0x66, 0x35, 0xFC, 0xFB, 0x22, 0x78, 0xCE, 0xC8, 0x99, 0x07, 0xC7, 0x61, 0xDB, - 0x32, 0x74, 0x7C, 0x5F, 0x46, 0x50, 0x6B, 0x92, 0x83, 0xBD, 0x83, 0xBD, 0x0F, 0x97, 0xA7, 0x27, - 0x64, 0x71, 0xD5, 0x40, 0x55, 0xF7, 0x95, 0x89, 0x23, 0x64, 0xFA, 0x19, 0xF2, 0x3F, 0xFF, 0x33, - 0xE7, 0x54, 0xA4, 0xDB, 0x75, 0xBE, 0x98, 0x95, 0xFF, 0xE6, 0x51, 0x62, 0x55, 0xB4, 0xEC, 0xAF, - 0xFC, 0x1C, 0xE1, 0xD0, 0x92, 0xF3, 0xFB, 0x99, 0x8A, 0x6A, 0xF7, 0xFA, 0x7B, 0xBB, 0xA4, 0x7F, - 0xF0, 0xEF, 0xCF, 0x67, 0x35, 0xA3, 0xE5, 0xF7, 0xCB, 0xEB, 0x9F, 0xBF, 0xCC, 0xA7, 0x52, 0xF4, - 0xFB, 0x65, 0xFA, 0xCF, 0x5E, 0xE0, 0xD3, 0xE8, 0xF9, 0x1D, 0x8B, 0xF9, 0x4F, 0x3F, 0x48, 0xA4, - 0x52, 0xF4, 0x22, 0x17, 0x78, 0xAD, 0x01, 0x5C, 0xB8, 0x07, 0x00, 0x64, 0xE1, 0xCD, 0xEA, 0x47, - 0xEC, 0xF9, 0x04, 0xE2, 0xB1, 0x13, 0xE8, 0x2E, 0x05, 0x4E, 0x5D, 0xCB, 0xBE, 0x7D, 0x42, 0x3E, - 0xB7, 0xD4, 0x20, 0x6B, 0x8A, 0x51, 0xE0, 0xA2, 0x5B, 0xDE, 0x18, 0x8D, 0xEC, 0xB1, 0x1D, 0x30, - 0x7A, 0x17, 0xBD, 0xBD, 0x98, 0x9B, 0x19, 0xA7, 0xE7, 0x7A, 0x01, 0xDC, 0xB4, 0x3F, 0x83, 0x21, - 0xA7, 0xCF, 0x78, 0x63, 0x7A, 0x4F, 0x33, 0x98, 0x58, 0x8A, 0x22, 0xEB, 0x61, 0x32, 0xB8, 0x81, - 0x67, 0x9B, 0x0E, 0x20, 0x5B, 0x7D, 0x4E, 0xE3, 0xD1, 0xDA, 0x82, 0xD9, 0x88, 0x4D, 0xC0, 0xB2, - 0xBE, 0xE0, 0x2E, 0xD9, 0xDE, 0x8D, 0xEB, 0x39, 0x18, 0x75, 0x86, 0x80, 0x6D, 0xE3, 0x99, 0xB0, - 0x75, 0x29, 0xB6, 0xD7, 0xCF, 0x84, 0x6D, 0x8D, 0x62, 0xDB, 0x5C, 0x2C, 0xB6, 0x4F, 0x9E, 0xED, - 0x07, 0x80, 0x67, 0x6B, 0xB1, 0x78, 0xF6, 0xEC, 0xEF, 0x54, 0xFC, 0x3A, 0x73, 0x9A, 0xC6, 0xE1, - 0x45, 0xE4, 0xBB, 0x1D, 0xD4, 0xE9, 0x76, 0x74, 0x4A, 0xA8, 0xB4, 0x22, 0xCA, 0x53, 0x46, 0xA7, - 0xEE, 0x03, 0xF6, 0x68, 0x1F, 0xB4, 0xD6, 0xDE, 0x6A, 0xFD, 0xC8, 0xE2, 0xD9, 0xE1, 0x72, 0x7F, - 0xE0, 0xBA, 0x01, 0x47, 0xDA, 0x9D, 0x1F, 0xD2, 0x1F, 0xB9, 0xB7, 0xB1, 0x2B, 0x2B, 0x7D, 0xA2, - 0x9E, 0x60, 0x19, 0x19, 0x82, 0x43, 0x9F, 0x09, 0xFE, 0x59, 0x37, 0x4F, 0x08, 0x6E, 0x50, 0xA7, - 0x8E, 0x1D, 0xE4, 0x2C, 0x5A, 0xBE, 0x75, 0xE4, 0x61, 0xDC, 0x9F, 0x90, 0x45, 0xA2, 0xD6, 0x94, - 0x70, 0x91, 0xE5, 0x44, 0xA9, 0xD9, 0xB7, 0xFF, 0x91, 0x57, 0xE9, 0xCE, 0xF4, 0x2C, 0x58, 0xC2, - 0x8E, 0x0F, 0x72, 0x2A, 0x6A, 0x16, 0xCB, 0x9C, 0x16, 0x96, 0xF9, 0xE4, 0x5F, 0xE0, 0xB1, 0x69, - 0x3B, 0xA4, 0xB3, 0x39, 0x75, 0x27, 0x9E, 0x0B, 0x77, 0xDA, 0x06, 0x38, 0x28, 0x15, 0xAB, 0xDA, - 0x29, 0x5E, 0xB5, 0x5B, 0xBC, 0xEA, 0x6A, 0xF1, 0xAA, 0x6B, 0xC5, 0xAB, 0xAE, 0x17, 0xAF, 0xBA, - 0x51, 0xBC, 0xEA, 0xEB, 0x02, 0x55, 0x3D, 0xD3, 0xB2, 0xDD, 0xD3, 0xDD, 0xFD, 0xBC, 0xA1, 0xC2, - 0xF7, 0xF6, 0x00, 0xEF, 0x5D, 0xE6, 0x4A, 0xC1, 0xC8, 0x1D, 0x86, 0x7E, 0x88, 0x39, 0x35, 0x6F, - 0xCC, 0x80, 0xCC, 0xAE, 0xA7, 0x1E, 0xF6, 0x06, 0x18, 0x36, 0x55, 0x51, 0x65, 0x55, 0x9F, 0x10, - 0xF5, 0x61, 0x5B, 0xF2, 0x26, 0x4F, 0xF2, 0x37, 0xC8, 0xDB, 0xC5, 0x79, 0xC1, 0xF7, 0x84, 0x5C, - 0x6A, 0x70, 0x68, 0xEB, 0xA5, 0x63, 0x4D, 0x6F, 0x75, 0x35, 0x19, 0x12, 0xAE, 0xE2, 0xDA, 0x0C, - 0x24, 0x0F, 0xE0, 0x2A, 0xCF, 0x1B, 0x5F, 0x80, 0x7F, 0x60, 0x92, 0x58, 0xEA, 0x36, 0x08, 0x17, - 0x84, 0x44, 0x61, 0xE2, 0x46, 0xB3, 0x34, 0x58, 0x70, 0x30, 0xBC, 0xC0, 0x03, 0x6C, 0x4F, 0x34, - 0xC0, 0x93, 0x75, 0x64, 0x0C, 0x39, 0x28, 0xB8, 0xE8, 0x31, 0xA7, 0x53, 0x0D, 0xF4, 0xA9, 0xE7, - 0x91, 0xD1, 0xEE, 0x89, 0xB5, 0x74, 0x9C, 0xFD, 0x73, 0xA3, 0x46, 0xCF, 0x1B, 0x5F, 0xC1, 0xFF, - 0x79, 0x87, 0x03, 0xBD, 0x00, 0x59, 0xFD, 0xF6, 0x95, 0x9D, 0x38, 0xC0, 0x97, 0x44, 0x0B, 0x6D, - 0x09, 0xD5, 0xBE, 0x11, 0xDE, 0x93, 0x36, 0x93, 0x06, 0x3B, 0xA7, 0x60, 0xF0, 0x86, 0x06, 0xFF, - 0x91, 0x12, 0xAC, 0x0A, 0x77, 0xEE, 0x57, 0x13, 0xF0, 0xA6, 0x0E, 0x99, 0x9D, 0xEC, 0x90, 0xBE, - 0x5E, 0xA3, 0x32, 0x26, 0xD8, 0x09, 0x4F, 0xFD, 0x3C, 0x3C, 0xAC, 0x56, 0x83, 0xB9, 0x38, 0x15, - 0x3E, 0xCD, 0xC4, 0xEE, 0xCB, 0xBA, 0x09, 0x20, 0xFA, 0x36, 0xEB, 0x24, 0x7D, 0xA6, 0x39, 0x28, - 0x78, 0x48, 0x67, 0xE0, 0xA6, 0x8B, 0xF0, 0xC2, 0x70, 0xEF, 0x8E, 0x32, 0xFA, 0xCD, 0xFC, 0xB3, - 0xE7, 0x8E, 0x9B, 0x3A, 0x79, 0x27, 0xB1, 0x86, 0xBE, 0xDF, 0x0B, 0xC1, 0xF7, 0x59, 0x8F, 0xEF, - 0xF3, 0xA2, 0xF0, 0x7D, 0xD1, 0xE3, 0xFB, 0xB2, 0x10, 0x7C, 0xFE, 0xC4, 0x71, 0x1F, 0x7A, 0x18, - 0x7B, 0xFB, 0xE0, 0xA1, 0x97, 0xC4, 0x1C, 0x6D, 0x4D, 0x91, 0xD1, 0xD4, 0x1A, 0x10, 0x26, 0xA4, - 0x2D, 0x59, 0xEF, 0x54, 0xB3, 0x41, 0xAD, 0x56, 0x9C, 0x08, 0x0E, 0x42, 0xBF, 0x8A, 0x68, 0xE1, - 0x2F, 0xD1, 0x6E, 0x82, 0x6A, 0x7A, 0x7B, 0xE3, 0xBD, 0x2B, 0x81, 0xCA, 0x67, 0x07, 0x63, 0x70, - 0x37, 0xD7, 0xAD, 0x03, 0x91, 0x2F, 0x7A, 0x7B, 0x32, 0xF5, 0xEF, 0x4A, 0xEA, 0x03, 0x0E, 0x3B, - 0x74, 0x5A, 0x4F, 0x85, 0x1F, 0x56, 0xA8, 0x82, 0xE3, 0x76, 0xCC, 0x76, 0x02, 0x2A, 0x68, 0x25, - 0x5E, 0xA1, 0x94, 0x0C, 0xDC, 0x8E, 0xD9, 0xB6, 0x35, 0xA9, 0x22, 0xC5, 0xD0, 0x00, 0x6A, 0x49, - 0x0A, 0x3C, 0x64, 0x8E, 0xEC, 0xA1, 0xB3, 0x53, 0x1F, 0xE1, 0xDB, 0x20, 0x61, 0x85, 0xD2, 0xB5, - 0xB0, 0xDE, 0xC1, 0xCA, 0x22, 0xD1, 0x07, 0xC3, 0xB6, 0x02, 0x05, 0x45, 0x5B, 0x87, 0x63, 0x5D, - 0xB8, 0x11, 0x37, 0xBA, 0xA9, 0xB6, 0x35, 0x30, 0xA9, 0xE9, 0xA8, 0xA9, 0x23, 0xBA, 0x2C, 0xD6, - 0x01, 0xD8, 0xF1, 0x41, 0x3D, 0xCD, 0x58, 0x87, 0x04, 0x2F, 0x50, 0x6A, 0x09, 0xAB, 0xBF, 0x2B, - 0x48, 0xD2, 0x4A, 0x50, 0x4A, 0x4A, 0xC9, 0x28, 0x93, 0xA6, 0xC9, 0x11, 0x81, 0x68, 0x06, 0xA0, - 0xBB, 0xCC, 0x72, 0x38, 0xBD, 0x79, 0x0C, 0x03, 0x40, 0x4C, 0xBE, 0xE0, 0x92, 0x03, 0x11, 0x92, - 0x3F, 0x5F, 0x5F, 0xED, 0xFD, 0x7A, 0x7D, 0x76, 0x7A, 0xB8, 0x7B, 0x7D, 0x70, 0x79, 0xAA, 0x94, - 0x41, 0xC4, 0x06, 0x2D, 0x87, 0x00, 0x92, 0xEB, 0x8E, 0x61, 0xAC, 0xBF, 0x52, 0x6F, 0xDF, 0xB8, - 0xA7, 0x33, 0x17, 0x3E, 0xDB, 0xDA, 0x4E, 0xAB, 0x71, 0xC1, 0x7C, 0x4F, 0x13, 0x6A, 0x4C, 0x01, - 0x72, 0x42, 0x8D, 0xB5, 0x1A, 0x07, 0x54, 0xA1, 0xDE, 0x01, 0xF7, 0xA0, 0x8E, 0x5B, 0x85, 0x9E, - 0xD4, 0xD7, 0xEA, 0xD9, 0x12, 0x78, 0x22, 0xB4, 0x0A, 0x1D, 0xA9, 0xC9, 0x69, 0x7B, 0x2D, 0xED, - 0x3E, 0x71, 0x2C, 0xC5, 0xB2, 0x08, 0x8D, 0xBF, 0x76, 0xBF, 0x6D, 0xE7, 0xF1, 0x6F, 0x07, 0xC1, - 0xAF, 0xDA, 0x53, 0xBE, 0x1A, 0x27, 0xF3, 0xA7, 0x1D, 0x11, 0x55, 0xDA, 0xC9, 0x3F, 0x19, 0x5D, - 0x23, 0x34, 0xD2, 0x9F, 0xA3, 0xC5, 0x30, 0x1D, 0x2A, 0x82, 0x77, 0x9E, 0xCE, 0x04, 0xFC, 0x23, - 0xE9, 0x48, 0xA5, 0x19, 0x07, 0xB9, 0xFF, 0x30, 0x63, 0xAE, 0xA9, 0x4F, 0xBB, 0xF0, 0x79, 0x35, - 0x95, 0x2D, 0x54, 0x6C, 0xD6, 0x8C, 0xD7, 0xDD, 0x6B, 0x83, 0x80, 0x8A, 0xFE, 0xD2, 0xB2, 0x47, - 0x33, 0x4A, 0x3B, 0x3B, 0x68, 0x3D, 0x8D, 0x2F, 0x55, 0x49, 0xD5, 0x7E, 0x5E, 0x2B, 0xDB, 0x83, - 0x6B, 0x23, 0xD7, 0x16, 0xF1, 0x2A, 0x73, 0x48, 0xD4, 0xBB, 0x8D, 0xA1, 0xE7, 0x4E, 0x27, 0xC8, - 0x73, 0x1F, 0x98, 0xA6, 0x1A, 0xFB, 0x43, 0x81, 0xC6, 0x48, 0x57, 0xA9, 0xC3, 0x98, 0x00, 0xCB, - 0xAE, 0x3A, 0xE8, 0x8D, 0x86, 0xAE, 0x7D, 0x88, 0x72, 0xE0, 0x8E, 0x96, 0xFD, 0xF1, 0xF2, 0x1A, - 0x82, 0x5F, 0x36, 0xE8, 0xBF, 0x94, 0x0A, 0x76, 0x23, 0xF2, 0x4E, 0x69, 0xCA, 0xF8, 0x4B, 0xDA, - 0xBF, 0x49, 0xB9, 0x03, 0xC9, 0xEA, 0x9D, 0x84, 0x6A, 0xAD, 0x2E, 0xAB, 0x67, 0x16, 0x3F, 0xA7, - 0x28, 0x5D, 0xD7, 0x09, 0x3C, 0x77, 0x54, 0xCF, 0xC1, 0x11, 0x29, 0xF4, 0x44, 0x1F, 0xF9, 0x2D, - 0x8A, 0x50, 0x46, 0x55, 0x4F, 0x21, 0xFE, 0x4D, 0xD2, 0xC0, 0x1E, 0x7A, 0x9E, 0x1B, 0x13, 0x6A, - 0x3B, 0x23, 0xDB, 0xC1, 0xEC, 0x1B, 0x59, 0x07, 0x26, 0xB9, 0x70, 0xE9, 0x35, 0x4C, 0xE2, 0x32, - 0x26, 0x57, 0x7F, 0x83, 0x8F, 0x87, 0x20, 0x91, 0xBE, 0xEE, 0xBA, 0x04, 0x25, 0x6A, 0x51, 0x65, - 0xF4, 0xBE, 0x47, 0xD4, 0x51, 0x6E, 0x55, 0x10, 0xE8, 0x0B, 0xF7, 0x1E, 0x7B, 0x54, 0xD0, 0x89, - 0x82, 0xEF, 0x14, 0x6A, 0x42, 0xD7, 0x05, 0x6D, 0x8B, 0x2A, 0x4B, 0x02, 0x8D, 0xAE, 0x39, 0x22, - 0x67, 0xB1, 0x40, 0xD9, 0x11, 0x2D, 0x7E, 0x79, 0xC8, 0xD1, 0x22, 0x10, 0x2B, 0xF3, 0xC7, 0x3C, - 0xFE, 0x63, 0x1E, 0xCF, 0x38, 0x8F, 0x85, 0xC8, 0x4F, 0x1E, 0xF3, 0xF9, 0x94, 0x9C, 0xC9, 0x72, - 0x88, 0x68, 0xC6, 0xE4, 0x89, 0x2B, 0x85, 0xC0, 0xC2, 0x39, 0x74, 0xEC, 0xA4, 0xCD, 0xA0, 0xB8, - 0x0D, 0x9F, 0x1C, 0x32, 0xA6, 0xD4, 0xF9, 0x91, 0x24, 0x2A, 0x9C, 0x26, 0x32, 0xC4, 0xE4, 0x4C, - 0x01, 0x26, 0xE8, 0x43, 0x62, 0xC3, 0xD5, 0xFD, 0xAD, 0x3E, 0xA2, 0x56, 0xB7, 0xE0, 0xA7, 0x00, - 0xA2, 0x87, 0x28, 0x0D, 0x79, 0xCD, 0xED, 0x7C, 0x08, 0x71, 0xF0, 0xAD, 0x0A, 0x26, 0xE4, 0x6A, - 0x6E, 0x90, 0x84, 0xF6, 0x16, 0x3E, 0x0A, 0xA6, 0xBB, 0x74, 0x5D, 0x34, 0x36, 0x9D, 0x27, 0x11, - 0x35, 0xF2, 0x59, 0x1F, 0x6B, 0x65, 0x0C, 0x8D, 0x70, 0xDA, 0xB0, 0x9D, 0xA1, 0x10, 0x99, 0xAC, - 0xB1, 0x05, 0x26, 0x2B, 0x95, 0x39, 0x28, 0x38, 0x71, 0xB3, 0x54, 0xB3, 0x6E, 0xB2, 0x4E, 0x69, - 0x9B, 0x19, 0xBD, 0xD0, 0xCF, 0xEC, 0x47, 0xB2, 0x4E, 0x99, 0x6E, 0xB8, 0x81, 0x19, 0x36, 0x4B, - 0xB3, 0xFD, 0x25, 0xAA, 0x94, 0xEC, 0x04, 0xB7, 0xB4, 0x1F, 0x93, 0xA1, 0x8E, 0x6D, 0xF3, 0x3A, - 0xDB, 0x85, 0xB6, 0x62, 0xDB, 0xF7, 0x06, 0xE5, 0xED, 0xD7, 0x89, 0x28, 0x56, 0x9D, 0xA5, 0x59, - 0x17, 0xEA, 0x5A, 0xCE, 0x14, 0xC0, 0xF3, 0x39, 0xE8, 0x8C, 0x01, 0x51, 0xA6, 0x87, 0x0A, 0x10, - 0x5D, 0xB8, 0x8F, 0xD2, 0x83, 0x64, 0xA9, 0x22, 0x14, 0x98, 0xC2, 0xD5, 0x1D, 0x3D, 0x68, 0x23, - 0x72, 0x7C, 0xC7, 0x3E, 0x5A, 0x41, 0xF4, 0x7A, 0x05, 0xDD, 0x4C, 0x83, 0x40, 0xF4, 0xFC, 0x28, - 0x16, 0xCD, 0x19, 0x78, 0x4F, 0x1A, 0xB5, 0xC2, 0x2D, 0x68, 0xDC, 0xB0, 0xAD, 0x0D, 0x8C, 0xFC, - 0x81, 0x06, 0x66, 0x30, 0xB8, 0x43, 0x0D, 0x0C, 0x8B, 0x84, 0x5E, 0x37, 0x89, 0x01, 0xC0, 0xBE, - 0x3F, 0xC5, 0xE8, 0xC1, 0x26, 0xEA, 0xED, 0xF8, 0x20, 0x0C, 0xA6, 0x2D, 0x13, 0x34, 0x9A, 0x1D, - 0xED, 0x5A, 0xB0, 0x1B, 0x3C, 0x2F, 0xC2, 0x33, 0xF6, 0x43, 0x18, 0xB4, 0xDD, 0xD1, 0x08, 0x79, - 0x78, 0x38, 0x1D, 0x41, 0x50, 0x32, 0xDD, 0x23, 0xB0, 0x01, 0x34, 0x1D, 0x8B, 0x2D, 0xE9, 0xCA, - 0xD8, 0x95, 0xE8, 0x21, 0x6D, 0xAE, 0xB3, 0x21, 0x3C, 0xC3, 0x28, 0xFD, 0xD0, 0xC5, 0x7B, 0x87, - 0xD1, 0x64, 0x08, 0x2E, 0x12, 0x70, 0x1C, 0x0A, 0x46, 0x8D, 0x97, 0xEC, 0x26, 0x65, 0xFF, 0xCE, - 0x74, 0x86, 0x98, 0x6F, 0xA0, 0x15, 0x43, 0x69, 0xBD, 0xBE, 0x1D, 0x55, 0xA7, 0x17, 0x51, 0xFC, - 0xF6, 0xE5, 0x94, 0xEC, 0x1A, 0x93, 0x35, 0x39, 0x01, 0x07, 0xAE, 0x53, 0x0F, 0xD0, 0x94, 0xC5, - 0xF2, 0x12, 0x91, 0x31, 0x09, 0xBF, 0x1F, 0x30, 0x18, 0x18, 0xB1, 0x7D, 0x4F, 0x86, 0xFF, 0xC1, - 0xF4, 0x05, 0x75, 0x40, 0x86, 0xE0, 0xD6, 0x7D, 0x15, 0x2E, 0xC8, 0x6A, 0x24, 0x30, 0x93, 0x78, - 0x91, 0x5F, 0xA9, 0x39, 0x36, 0xE2, 0x01, 0x3E, 0x72, 0xC9, 0x12, 0x46, 0xC6, 0x8E, 0x66, 0x85, - 0xE1, 0x84, 0xC4, 0x63, 0x0A, 0x7D, 0x19, 0x63, 0xD3, 0x9F, 0x7A, 0xB4, 0x1C, 0xB6, 0x6C, 0x1F, - 0xFE, 0x41, 0x7A, 0x63, 0xD9, 0xFE, 0x04, 0xC6, 0x88, 0xE6, 0xD7, 0x81, 0xFB, 0x7D, 0xB4, 0x3F, - 0xF5, 0x03, 0x77, 0xCC, 0xFE, 0xAE, 0x0F, 0x28, 0x9B, 0xEA, 0x4D, 0x61, 0x14, 0x34, 0x90, 0xFA, - 0x78, 0x50, 0x19, 0x14, 0x84, 0x26, 0x82, 0x5E, 0x64, 0x11, 0x75, 0xC7, 0xCE, 0xCC, 0x80, 0x8E, - 0x40, 0x87, 0x55, 0x86, 0x42, 0x35, 0xE0, 0x1E, 0x0D, 0x97, 0x14, 0xF3, 0x11, 0x30, 0xEB, 0xF4, - 0x7C, 0x61, 0xBE, 0xC7, 0x6E, 0x65, 0x90, 0xD8, 0x01, 0x6B, 0xE6, 0x59, 0xE0, 0xD9, 0x93, 0x3E, - 0x26, 0x8C, 0xF3, 0xE6, 0x01, 0x69, 0x7F, 0x64, 0xD3, 0x6B, 0xEA, 0x8A, 0x90, 0x20, 0x95, 0x01, - 0x38, 0xD4, 0xC1, 0xD4, 0x72, 0xC0, 0x05, 0x66, 0x26, 0x8A, 0x7A, 0xAE, 0xED, 0x04, 0x3D, 0xEC, - 0xDD, 0x92, 0x3D, 0x9A, 0xB0, 0x1B, 0x9D, 0x11, 0xEA, 0xE1, 0x23, 0x59, 0xFD, 0x1D, 0x73, 0xD4, - 0x9B, 0x52, 0x3D, 0x3E, 0x1B, 0x2C, 0x7F, 0x72, 0xE6, 0x3E, 0x54, 0x06, 0x62, 0x3A, 0x01, 0x76, - 0x1C, 0xF3, 0x02, 0xDF, 0x62, 0x0F, 0x3B, 0x03, 0xD6, 0xE1, 0x19, 0x49, 0x3A, 0x71, 0x87, 0x43, - 0xEA, 0x68, 0x32, 0x13, 0x94, 0xDD, 0x8B, 0x5E, 0x15, 0x40, 0x11, 0x24, 0xA6, 0x7B, 0x60, 0xCA, - 0x40, 0x72, 0x23, 0x71, 0xA7, 0xC8, 0x4A, 0xC2, 0xDB, 0x16, 0xB5, 0x34, 0x18, 0x70, 0x11, 0xDC, - 0x83, 0x95, 0x49, 0x29, 0x61, 0x62, 0x9E, 0x28, 0x99, 0x5A, 0x93, 0xC4, 0x37, 0xEB, 0x6E, 0x30, - 0x39, 0xE4, 0xB1, 0xCA, 0x49, 0xEC, 0x64, 0xC7, 0x04, 0x3B, 0x9C, 0x64, 0xC1, 0x7E, 0xE2, 0x38, - 0x68, 0x2B, 0x54, 0x28, 0x41, 0xCB, 0x21, 0x62, 0x52, 0xC4, 0xD7, 0x22, 0x31, 0x7D, 0x17, 0x8D, - 0x48, 0x26, 0xEB, 0x17, 0xD7, 0xE2, 0x7C, 0xAD, 0xF4, 0x83, 0x27, 0xB2, 0x4A, 0x01, 0x53, 0x47, - 0x34, 0x31, 0x5A, 0xCD, 0x71, 0x1D, 0x5C, 0x93, 0x13, 0x7F, 0xD1, 0x10, 0xE9, 0xFC, 0x96, 0x37, - 0x23, 0x77, 0xF0, 0x9D, 0x35, 0x25, 0x7B, 0x32, 0x0F, 0xC3, 0xC2, 0xB0, 0xDF, 0xFF, 0x88, 0x5C, - 0xB6, 0xF8, 0x70, 0x47, 0x5D, 0x9A, 0x61, 0x44, 0x80, 0xCD, 0xB3, 0x2F, 0x45, 0x89, 0xCE, 0x58, - 0x4A, 0x26, 0x5A, 0x15, 0x1A, 0x0B, 0x26, 0x9C, 0x95, 0x95, 0xE3, 0x78, 0x9F, 0x10, 0xD5, 0x1D, - 0x8C, 0x7C, 0x9E, 0x79, 0x0C, 0xC2, 0x79, 0xA2, 0x24, 0x18, 0xFF, 0x31, 0x25, 0xBB, 0x6A, 0x96, - 0x6A, 0xCB, 0xF5, 0xC8, 0x5E, 0xA3, 0x51, 0x6B, 0x8B, 0xE6, 0x86, 0x16, 0x62, 0x7F, 0x5A, 0x9E, - 0x3B, 0xB1, 0xDC, 0x07, 0xA7, 0x96, 0x91, 0x59, 0x45, 0xC0, 0xC0, 0xCF, 0xA4, 0xE4, 0xFB, 0xD2, - 0x92, 0xB8, 0x1C, 0x0A, 0x04, 0x93, 0xF3, 0xBF, 0xD0, 0xE0, 0xEB, 0xE3, 0xB7, 0x36, 0x4F, 0x93, - 0x42, 0xBD, 0x27, 0xE4, 0x12, 0xB6, 0x51, 0xA1, 0x85, 0x3C, 0xE3, 0x5A, 0xD8, 0x53, 0x61, 0x4B, - 0xDB, 0xD2, 0xEC, 0x68, 0x57, 0x56, 0x2E, 0xF0, 0xD8, 0xBD, 0xC7, 0xF4, 0x22, 0x09, 0x8E, 0x8F, - 0x70, 0xDF, 0x44, 0xFF, 0x60, 0xE5, 0x65, 0x99, 0x12, 0x5F, 0x60, 0xBD, 0x71, 0xDC, 0xA0, 0xD1, - 0x56, 0x6F, 0xB1, 0x9A, 0x21, 0xBF, 0x28, 0x29, 0x3F, 0x87, 0x59, 0xE1, 0xBE, 0x35, 0xC9, 0x2E, - 0x1D, 0x1D, 0xE2, 0x45, 0x6D, 0x21, 0x3A, 0xA4, 0x7B, 0x5F, 0x82, 0x04, 0xF2, 0xA4, 0xD4, 0x5B, - 0x75, 0xF2, 0xAF, 0x00, 0x8A, 0xD0, 0x51, 0x0E, 0x7F, 0x74, 0x91, 0x5B, 0x8A, 0x86, 0xE8, 0x7E, - 0x58, 0x47, 0x47, 0x58, 0x58, 0x9C, 0x96, 0x4C, 0xFB, 0x4A, 0x1E, 0x49, 0x1A, 0xA3, 0x14, 0xBD, - 0x17, 0xD1, 0x03, 0x65, 0x44, 0x31, 0x7A, 0x33, 0x6C, 0x29, 0x7A, 0xDA, 0x95, 0x3D, 0xB3, 0x43, - 0xB6, 0x26, 0x43, 0xB6, 0xED, 0x8E, 0x69, 0x4A, 0xA4, 0x39, 0x04, 0x05, 0xD2, 0x90, 0xCA, 0x5F, - 0x85, 0xF7, 0xA0, 0x42, 0x56, 0x37, 0xC2, 0x8C, 0x38, 0xEF, 0x5B, 0x23, 0x2C, 0x6C, 0xA1, 0xAE, - 0x61, 0x18, 0xCD, 0xA4, 0xB6, 0xA3, 0xA6, 0x3E, 0xA2, 0xE5, 0x5A, 0x88, 0x9E, 0x14, 0xC0, 0xB0, - 0x27, 0x69, 0x3F, 0xE8, 0x23, 0x33, 0x07, 0x2A, 0xFB, 0x6F, 0xF0, 0x35, 0xA0, 0x05, 0x6F, 0x10, - 0xB0, 0x20, 0x6A, 0x0D, 0x28, 0x22, 0x0C, 0x83, 0x11, 0x36, 0xBD, 0x10, 0x45, 0x31, 0xB8, 0xF5, - 0x24, 0x8D, 0xFD, 0xE9, 0x60, 0x40, 0x8E, 0x0B, 0x94, 0x4A, 0x21, 0xD5, 0x54, 0x04, 0x87, 0x97, - 0xEB, 0x28, 0xAC, 0xB3, 0x6C, 0x53, 0x49, 0xA2, 0x62, 0x98, 0x45, 0xC1, 0x69, 0x08, 0x23, 0xC7, - 0x92, 0x90, 0x28, 0xCE, 0xBF, 0xF0, 0x7C, 0x10, 0xE5, 0xBF, 0xBC, 0xE5, 0x47, 0x30, 0xDD, 0xD1, - 0x22, 0x79, 0xB4, 0x0B, 0x0F, 0xAE, 0x60, 0x8C, 0x85, 0x35, 0xBA, 0xED, 0x51, 0xE5, 0xD7, 0xE0, - 0x76, 0xD9, 0x88, 0xB2, 0xED, 0xEC, 0x56, 0xE0, 0x30, 0x2C, 0x99, 0x72, 0xB5, 0xF6, 0x1C, 0x76, - 0x42, 0xFC, 0xA7, 0x74, 0x9C, 0x53, 0x0E, 0xA0, 0xA5, 0x29, 0x4C, 0xA0, 0xCB, 0xA3, 0x4F, 0xD3, - 0xA5, 0x6C, 0x0A, 0x35, 0x4E, 0x3E, 0xA9, 0x23, 0xCD, 0xC7, 0x28, 0x96, 0x71, 0x41, 0x7A, 0xC4, - 0xF1, 0xAB, 0x71, 0x41, 0xE6, 0xB9, 0xC9, 0x22, 0x7F, 0x3E, 0x55, 0x68, 0x84, 0xF1, 0x56, 0xB6, - 0x08, 0x1A, 0x49, 0xA1, 0x29, 0x35, 0x01, 0x2E, 0x75, 0x26, 0x62, 0x39, 0x30, 0x05, 0x78, 0xA0, - 0xE3, 0xF9, 0x21, 0xF8, 0x23, 0x2C, 0x8E, 0x82, 0x24, 0xD2, 0x32, 0xBE, 0x20, 0x84, 0x65, 0x2D, - 0x48, 0x69, 0xD8, 0x5D, 0x5F, 0x27, 0xC4, 0x9E, 0x92, 0x5D, 0x20, 0xBA, 0xC1, 0xE4, 0x7F, 0xC1, - 0x03, 0xC6, 0x0E, 0x32, 0xA8, 0x25, 0x81, 0x94, 0xD5, 0x5A, 0xA0, 0xC4, 0x46, 0x23, 0x73, 0xE2, - 0xE3, 0xF7, 0x67, 0xFD, 0x3E, 0xCB, 0xD9, 0x42, 0xCF, 0xCE, 0xB2, 0xEC, 0x26, 0x90, 0xC3, 0x11, - 0x69, 0x91, 0x04, 0x00, 0xFC, 0x5C, 0x22, 0xAE, 0x4E, 0xB7, 0x36, 0x8D, 0x22, 0x54, 0x6C, 0xA4, - 0x13, 0xB1, 0x31, 0x03, 0x13, 0x28, 0xFE, 0xA2, 0x9C, 0xA8, 0x46, 0x83, 0x96, 0x0F, 0xBC, 0x62, - 0x9F, 0xAD, 0x20, 0x44, 0x65, 0x0F, 0x98, 0x9F, 0xFF, 0xC0, 0xF4, 0xB0, 0xA8, 0x8C, 0x79, 0x81, - 0x6E, 0xF2, 0x81, 0x30, 0x87, 0x53, 0x88, 0xD4, 0x64, 0x2D, 0x75, 0x93, 0x94, 0x2C, 0x3C, 0xCB, - 0xB4, 0x74, 0x19, 0xF6, 0x82, 0x25, 0x9B, 0x4C, 0x27, 0x59, 0x0D, 0xD8, 0xA4, 0x4E, 0x22, 0x10, - 0xFB, 0x4A, 0xB6, 0x81, 0x36, 0x6C, 0xF8, 0x8F, 0x6C, 0x3C, 0xB2, 0xFC, 0x46, 0x9C, 0x34, 0x70, - 0x9F, 0x33, 0x81, 0xEF, 0x9F, 0x07, 0x71, 0x30, 0x9B, 0xCA, 0x9E, 0x88, 0xB1, 0xDC, 0x34, 0xC4, - 0x13, 0x13, 0x11, 0x8E, 0x87, 0xF6, 0x25, 0xC0, 0x1E, 0x6E, 0xDC, 0x52, 0x5B, 0xC7, 0xC3, 0x02, - 0x4D, 0x69, 0xE0, 0x5F, 0xC9, 0x76, 0x20, 0x52, 0xBC, 0x29, 0xF9, 0xB5, 0x58, 0xEB, 0xBD, 0x38, - 0x1B, 0x14, 0x69, 0x4A, 0x73, 0x43, 0x95, 0xC7, 0x4A, 0x85, 0x88, 0x37, 0x2F, 0x8C, 0xB9, 0xD7, - 0x13, 0x18, 0x25, 0x1E, 0xF0, 0x8B, 0xB5, 0x16, 0x52, 0x40, 0x51, 0x00, 0xF0, 0x67, 0xA1, 0x96, - 0x9F, 0xEC, 0x23, 0x3B, 0x6E, 0xF8, 0x60, 0xDF, 0xDA, 0xC5, 0xDA, 0x5D, 0xEE, 0xF7, 0xAE, 0x0E, - 0x04, 0x9A, 0xC9, 0x39, 0xF4, 0xCA, 0x9A, 0x14, 0x6B, 0x4B, 0x5D, 0xB9, 0xE3, 0xA6, 0x74, 0x27, - 0x5F, 0xAC, 0x65, 0xF2, 0x20, 0xFA, 0x14, 0xC3, 0x11, 0x76, 0x79, 0xC5, 0xA0, 0xF5, 0x9F, 0xFC, - 0x00, 0x8F, 0x63, 0x00, 0x3E, 0xFB, 0xBB, 0x50, 0xDB, 0x43, 0x39, 0xE3, 0x17, 0x69, 0x1D, 0xE5, - 0x00, 0x2B, 0xD4, 0xFE, 0xEC, 0x52, 0x60, 0x1E, 0xA4, 0x05, 0x2B, 0xD4, 0xEA, 0x48, 0xC8, 0xEC, - 0x48, 0xDA, 0x89, 0x87, 0xA3, 0xB0, 0x3D, 0xDB, 0x26, 0xA8, 0xEB, 0x1A, 0x9B, 0xC5, 0x7C, 0x4A, - 0x22, 0x86, 0x39, 0xA1, 0x40, 0x59, 0xE0, 0x51, 0xEC, 0xC6, 0x0F, 0x37, 0x40, 0x2D, 0x48, 0xB8, - 0xBB, 0xB6, 0x25, 0x28, 0xD3, 0x0E, 0xC4, 0xB6, 0xAE, 0x6D, 0x91, 0x96, 0xA6, 0x67, 0x0E, 0x02, - 0xEC, 0xF9, 0xA2, 0x3A, 0x95, 0x67, 0x7D, 0x33, 0x42, 0x0D, 0x33, 0x24, 0x0D, 0x2F, 0x53, 0xDC, - 0x1A, 0x23, 0x6C, 0x0B, 0x52, 0xA3, 0x1A, 0x46, 0xA7, 0xDB, 0xA2, 0xB9, 0x5D, 0x93, 0xFA, 0x9C, - 0x95, 0x52, 0xAD, 0xDE, 0x31, 0x68, 0x03, 0x9D, 0x02, 0x09, 0xB9, 0x0A, 0x28, 0xE5, 0xF0, 0xE1, - 0x46, 0x48, 0xA0, 0x8E, 0x1C, 0xDB, 0x21, 0x1F, 0xEE, 0x6B, 0x74, 0x39, 0xD9, 0x32, 0x52, 0x97, - 0x93, 0x2D, 0xA3, 0x00, 0xDA, 0x04, 0xE8, 0xFD, 0xB3, 0xF3, 0x99, 0x20, 0x47, 0xBB, 0xD7, 0x34, - 0x4B, 0x65, 0x74, 0xB9, 0x92, 0xDC, 0xD7, 0xEA, 0xC6, 0xDC, 0x89, 0x1B, 0xEF, 0x9B, 0x84, 0x43, - 0xDE, 0x07, 0xD7, 0x0F, 0xF8, 0xE8, 0xAF, 0x27, 0x46, 0x7F, 0x3D, 0x65, 0xF4, 0x93, 0xBD, 0x4F, - 0xE1, 0x40, 0x02, 0x1D, 0x68, 0x30, 0x86, 0x6E, 0x0B, 0x7E, 0x54, 0x8C, 0xF4, 0x63, 0x39, 0x4C, - 0x9A, 0x9E, 0xD1, 0xC4, 0xAE, 0xCC, 0x9A, 0x48, 0x51, 0xAD, 0x1A, 0x2A, 0x9E, 0x55, 0xA3, 0x72, - 0xCF, 0x58, 0x3F, 0xAE, 0x7C, 0xEC, 0x69, 0xBA, 0x07, 0x9F, 0xA9, 0xAE, 0x0B, 0xBE, 0x77, 0x87, - 0x6E, 0x7B, 0xE0, 0x8E, 0xE1, 0x2F, 0xF8, 0x8A, 0xC6, 0x80, 0x7F, 0x4A, 0x96, 0x56, 0xA2, 0x3F, - 0x6C, 0xB2, 0x25, 0x1D, 0x9B, 0xF6, 0x08, 0x91, 0xC5, 0xDA, 0x23, 0x5B, 0x9F, 0x05, 0x50, 0xF0, - 0xF0, 0xF0, 0xD0, 0x9E, 0x2B, 0x15, 0xDA, 0x83, 0x09, 0x3B, 0x58, 0x32, 0xB2, 0xD2, 0x85, 0x4B, - 0x64, 0x87, 0xD8, 0xA7, 0xEC, 0xC6, 0x5C, 0x54, 0xBA, 0x1D, 0xA3, 0x53, 0xA4, 0x91, 0x34, 0xE8, - 0xB5, 0x9B, 0x91, 0xE5, 0x5D, 0xF7, 0x27, 0xA6, 0xF7, 0xFD, 0x68, 0xEA, 0x74, 0x6A, 0xE5, 0x00, - 0xF4, 0x3E, 0x95, 0x20, 0x33, 0x64, 0x78, 0x80, 0xFD, 0xE0, 0xFF, 0xC2, 0x3F, 0x25, 0xBB, 0x09, - 0xED, 0x09, 0x42, 0x02, 0xA1, 0xA6, 0xD8, 0xA2, 0x85, 0xAA, 0x97, 0x9E, 0xE9, 0xF8, 0x63, 0x3B, - 0x78, 0xFF, 0x7E, 0xB7, 0xA6, 0xBF, 0x17, 0x56, 0x0C, 0x79, 0xB0, 0x7F, 0xBB, 0xDA, 0xFB, 0x35, - 0x74, 0x14, 0x12, 0x4C, 0x98, 0x2B, 0x2B, 0x63, 0x7A, 0x9C, 0x83, 0x1A, 0xB6, 0xE5, 0x23, 0x3F, - 0x30, 0x3D, 0x6A, 0x26, 0xA5, 0xD7, 0x8E, 0x8A, 0xA7, 0x69, 0x64, 0xF4, 0x8C, 0xBF, 0x67, 0xDB, - 0xF7, 0xEA, 0x2C, 0xA2, 0xCB, 0xB6, 0xFE, 0x6D, 0x47, 0x01, 0xF5, 0x2D, 0x2B, 0x97, 0xB4, 0x00, - 0x3E, 0xCD, 0x4A, 0x94, 0x74, 0xE0, 0x13, 0x1A, 0x31, 0x43, 0x9E, 0x32, 0x5D, 0xA4, 0x63, 0x9D, - 0xD0, 0x54, 0x12, 0xE8, 0x32, 0xEC, 0xA0, 0xDE, 0x85, 0xF3, 0x63, 0x09, 0x05, 0xF7, 0x73, 0xD9, - 0x42, 0x8F, 0x59, 0x3A, 0xD6, 0x24, 0x85, 0x09, 0x4E, 0x65, 0x1A, 0x71, 0xAA, 0xCA, 0x09, 0xAD, - 0x6F, 0xE8, 0xCF, 0x65, 0x06, 0x3B, 0xF8, 0xA6, 0x09, 0xCA, 0xBC, 0x3A, 0x1A, 0x7B, 0xB6, 0xFE, - 0x6F, 0xE9, 0xED, 0x0B, 0x90, 0xF3, 0xD8, 0xA6, 0x90, 0x21, 0xEC, 0xF4, 0x19, 0x10, 0x61, 0xEF, - 0x1A, 0x6E, 0xBB, 0x34, 0x17, 0xF4, 0x05, 0x77, 0x5D, 0x7C, 0x17, 0xE4, 0xDE, 0x10, 0x1D, 0x7F, - 0xCF, 0xD3, 0xFC, 0x92, 0x93, 0xB9, 0x05, 0x4B, 0xED, 0x06, 0x58, 0x2F, 0x0C, 0xDD, 0xAE, 0x70, - 0xC3, 0x80, 0x2D, 0x0A, 0x29, 0x13, 0x17, 0xE4, 0x3D, 0x6D, 0x02, 0xE3, 0x6C, 0x64, 0x3D, 0xD7, - 0xB7, 0xE1, 0xBF, 0xBB, 0x83, 0xC1, 0x94, 0xEC, 0x75, 0x9E, 0xD8, 0x6E, 0x68, 0xBD, 0xDD, 0xD1, - 0x20, 0xED, 0xB4, 0x29, 0xD6, 0xF5, 0x76, 0x06, 0xD6, 0x94, 0x25, 0x8D, 0xDE, 0xEE, 0x1F, 0xD2, - 0x20, 0xC8, 0x96, 0xF4, 0xD2, 0x4D, 0xEA, 0x22, 0x18, 0xB5, 0xF8, 0x0C, 0x2D, 0x84, 0x17, 0x70, - 0xF2, 0x5B, 0x7C, 0x21, 0x2D, 0x84, 0x97, 0x71, 0xB2, 0x1B, 0x9C, 0x98, 0x01, 0xD8, 0xC2, 0x69, - 0x93, 0xB6, 0xB1, 0x65, 0x74, 0xB7, 0xD6, 0x5E, 0x6F, 0xE5, 0x34, 0x71, 0x9D, 0x21, 0x6F, 0xC3, - 0xDE, 0xF8, 0xD9, 0x5C, 0x37, 0xD6, 0x5F, 0x6F, 0x74, 0xB2, 0x5B, 0xED, 0x8E, 0x02, 0x3B, 0x98, - 0x5A, 0xF4, 0x1C, 0xB5, 0xBE, 0x41, 0x70, 0x6D, 0xA6, 0xA3, 0xE1, 0xD7, 0xDE, 0x1F, 0xB0, 0x3D, - 0xBC, 0x03, 0x34, 0x46, 0x5E, 0x4D, 0xE5, 0x82, 0x3C, 0x6E, 0x51, 0x60, 0x4B, 0x96, 0x22, 0x7A, - 0xA9, 0x28, 0xB3, 0xA5, 0x87, 0x48, 0x87, 0x28, 0x06, 0xE1, 0x04, 0xC9, 0x76, 0x19, 0xC9, 0x98, - 0x2B, 0x15, 0x87, 0xAD, 0xFA, 0xD0, 0x55, 0x1A, 0xBE, 0x72, 0x43, 0x58, 0x6E, 0x18, 0x93, 0xCE, - 0xB2, 0xF2, 0x6C, 0x96, 0xE7, 0xD6, 0x6B, 0x83, 0xFE, 0xB4, 0x50, 0xF4, 0x4B, 0x34, 0x8F, 0xC3, - 0x32, 0x98, 0xC4, 0xFC, 0xD7, 0x7C, 0xF5, 0x91, 0x87, 0xF4, 0xF3, 0xCF, 0x40, 0xFA, 0x65, 0x11, - 0x48, 0x7F, 0x64, 0xF9, 0xF6, 0x95, 0x57, 0x67, 0xD5, 0x54, 0x5A, 0x29, 0xB5, 0x96, 0xE4, 0x57, - 0xEC, 0xB7, 0x41, 0x16, 0xAB, 0x8F, 0xD8, 0x83, 0x64, 0x64, 0xE4, 0xDB, 0x0A, 0x75, 0x57, 0x8D, - 0xA3, 0x1E, 0x0A, 0x31, 0x5A, 0x90, 0xF8, 0xE5, 0x4E, 0xC7, 0x58, 0x5D, 0x6B, 0xA1, 0xCD, 0x4D, - 0xC9, 0xFE, 0xC3, 0x3E, 0x03, 0x93, 0xA1, 0xA0, 0xC0, 0xA2, 0x90, 0x82, 0x4E, 0x9D, 0x2B, 0xCB, - 0xF0, 0x3E, 0x9A, 0xD1, 0x42, 0xFC, 0x3F, 0x02, 0xBE, 0x75, 0x3E, 0xA8, 0xF4, 0x97, 0xCA, 0x72, - 0x94, 0x36, 0xDB, 0x96, 0xBB, 0x06, 0x99, 0xD8, 0xF4, 0x02, 0xB6, 0x2D, 0xE1, 0xA5, 0x1F, 0x00, - 0x2F, 0xFD, 0xA5, 0xA8, 0x28, 0xFD, 0x48, 0x35, 0xCD, 0x44, 0xEE, 0x68, 0x55, 0x4C, 0x33, 0xAC, - 0x71, 0x7C, 0x7A, 0xBE, 0x36, 0x4A, 0x9B, 0xE6, 0x62, 0xAA, 0xCF, 0x2E, 0x2F, 0x8E, 0x7B, 0x45, - 0x2C, 0x34, 0x22, 0x56, 0x38, 0x76, 0x87, 0x58, 0x8B, 0xD9, 0x68, 0x0A, 0x22, 0xD4, 0xF4, 0x33, - 0x3E, 0x72, 0x2F, 0xAE, 0x9F, 0x99, 0x68, 0x7B, 0x9F, 0xE6, 0x87, 0xB8, 0xA8, 0x81, 0x44, 0x3B, - 0xC4, 0xC5, 0x4D, 0x24, 0xDA, 0xB1, 0xCA, 0x37, 0x92, 0x88, 0xCD, 0xC0, 0xE4, 0xC0, 0xB0, 0x96, - 0x31, 0x5A, 0xA8, 0x10, 0x38, 0xEF, 0x6A, 0x85, 0x9A, 0x29, 0x23, 0xCD, 0xEC, 0x33, 0xD6, 0x83, - 0x13, 0x3C, 0x38, 0xDD, 0x92, 0x00, 0x42, 0xBC, 0x9F, 0x2E, 0xD6, 0x1F, 0x2E, 0xDC, 0xB5, 0x0F, - 0x25, 0xC8, 0xA6, 0xEC, 0xEE, 0x14, 0x26, 0x5A, 0x60, 0x72, 0x27, 0x73, 0xA3, 0xA6, 0xE7, 0x70, - 0x59, 0x44, 0x9C, 0xA9, 0x9D, 0x2A, 0x4C, 0xAD, 0xD2, 0xA8, 0x14, 0x2E, 0x81, 0x81, 0xDD, 0x2A, - 0x0C, 0xEC, 0x56, 0x60, 0x60, 0xB7, 0x1A, 0x03, 0xBB, 0x55, 0x18, 0xD8, 0xAD, 0xC6, 0xC0, 0x6E, - 0x15, 0x06, 0xAE, 0x56, 0x61, 0xE0, 0x6A, 0x05, 0x06, 0xAE, 0x56, 0x63, 0xE0, 0x6A, 0x15, 0x06, - 0xAE, 0x56, 0x63, 0xA0, 0xD4, 0x2C, 0x3A, 0x8A, 0x8B, 0xBE, 0xCF, 0xBA, 0x23, 0x79, 0x9E, 0x87, - 0x74, 0xC6, 0xD2, 0x1B, 0xC6, 0x6A, 0xD0, 0x50, 0x08, 0x01, 0xC0, 0x01, 0xCD, 0x7E, 0xC6, 0xEF, - 0xB5, 0x2E, 0xDD, 0xEF, 0x18, 0xCE, 0xF9, 0xB4, 0xF2, 0xF6, 0x2B, 0x25, 0xF1, 0xCC, 0x14, 0x47, - 0xE9, 0x1A, 0xD4, 0x0C, 0x34, 0xDA, 0x7B, 0xB6, 0x6C, 0x2C, 0x2D, 0xB4, 0xBA, 0xC1, 0xFE, 0x1F, - 0xAD, 0x3F, 0xAB, 0x1B, 0x69, 0xD7, 0x6E, 0xBD, 0xD2, 0x46, 0xF9, 0x5C, 0xEC, 0x09, 0xBB, 0xB3, - 0x39, 0x0D, 0xDC, 0x5F, 0xF0, 0xD3, 0x05, 0x76, 0xF0, 0x83, 0x39, 0xCA, 0xB3, 0x37, 0xC3, 0xCD, - 0x72, 0xDE, 0x4D, 0x23, 0xDC, 0x37, 0x9F, 0xE1, 0xE0, 0xC1, 0xF5, 0xBE, 0x5F, 0x1B, 0xFD, 0xFE, - 0xF1, 0x01, 0xBB, 0x13, 0x93, 0xD6, 0x5C, 0x23, 0x73, 0xCD, 0x15, 0xEE, 0xAF, 0x35, 0xF7, 0x6D, - 0x5A, 0x3C, 0x3D, 0xD3, 0xF7, 0xC9, 0x6F, 0xD6, 0x33, 0xE0, 0xEA, 0x3C, 0x53, 0x9F, 0x3A, 0xCF, - 0xD8, 0xA7, 0xEE, 0x33, 0xF5, 0xA9, 0xFB, 0x8C, 0x7D, 0x5A, 0x7D, 0xA6, 0x3E, 0xAD, 0xCE, 0xB1, - 0x4F, 0xB2, 0xCA, 0xBB, 0x1C, 0x24, 0xAF, 0x7E, 0x8B, 0x1E, 0x30, 0xA2, 0xE8, 0x82, 0xF8, 0x12, - 0x76, 0x63, 0x7D, 0x7D, 0x35, 0x71, 0xED, 0x4B, 0x3F, 0x66, 0x13, 0xF5, 0x43, 0x4F, 0x5A, 0xD5, - 0xA3, 0x4F, 0x14, 0xDD, 0xB0, 0x18, 0xCA, 0xAE, 0xAC, 0xCA, 0x94, 0x4D, 0xAD, 0x39, 0x53, 0xB6, - 0xB2, 0x72, 0xEE, 0xA0, 0xD0, 0xAB, 0xA4, 0x85, 0x2E, 0xF7, 0x7B, 0x88, 0x0D, 0x0A, 0x75, 0x05, - 0x60, 0xB8, 0xD0, 0xC0, 0x74, 0x90, 0xE3, 0x52, 0xE8, 0xAC, 0x07, 0x16, 0x32, 0x03, 0xB8, 0xB2, - 0x45, 0x3E, 0xD8, 0xBE, 0x03, 0x7B, 0x8C, 0x43, 0x9B, 0xF5, 0x34, 0x80, 0x47, 0xE0, 0x11, 0xA0, - 0x6B, 0x41, 0x8D, 0x27, 0xDA, 0xF8, 0x06, 0xB7, 0xDB, 0xED, 0x30, 0x30, 0x90, 0xFA, 0x43, 0xF0, - 0x7C, 0x53, 0xA7, 0xD3, 0x00, 0x3F, 0x26, 0x85, 0x09, 0xFC, 0x5A, 0x94, 0x41, 0x24, 0x9F, 0x2A, - 0x13, 0x97, 0xCE, 0x08, 0x4E, 0x13, 0x73, 0xC9, 0x49, 0x5F, 0xD9, 0xE3, 0xE8, 0x9B, 0x72, 0x96, - 0xF6, 0xB1, 0xF9, 0x48, 0x9A, 0x5E, 0xDA, 0xA1, 0x47, 0x4B, 0xC7, 0x58, 0xEF, 0x74, 0x8D, 0xC4, - 0xF5, 0x7F, 0xA7, 0x45, 0xBE, 0xB7, 0xBA, 0xB2, 0x95, 0x41, 0x72, 0x13, 0xCA, 0x3E, 0x34, 0x33, - 0x34, 0x27, 0x74, 0x0F, 0x30, 0x1F, 0x44, 0x05, 0x16, 0x72, 0xA9, 0x6F, 0x1B, 0x06, 0xFA, 0x2B, - 0xEA, 0xA6, 0x9B, 0xBF, 0x15, 0x0A, 0xE5, 0xEA, 0x5A, 0xDB, 0x85, 0x14, 0xF3, 0x54, 0x8E, 0xEB, - 0x71, 0xD3, 0x63, 0x27, 0x00, 0xF3, 0xF1, 0x88, 0xCF, 0x94, 0x24, 0x43, 0x36, 0xE6, 0xC2, 0x0A, - 0x3D, 0x42, 0x43, 0xDD, 0x45, 0x86, 0xD3, 0x2C, 0xEA, 0x6D, 0x81, 0x77, 0x62, 0xC5, 0xEE, 0x1D, - 0xF7, 0x76, 0x99, 0x67, 0x44, 0xFC, 0xF2, 0x23, 0x39, 0xEE, 0x0B, 0x5D, 0x72, 0x1C, 0xA7, 0x2D, - 0xFC, 0x5F, 0xEC, 0xD9, 0x61, 0xEA, 0x53, 0x91, 0x39, 0x18, 0x0E, 0xCE, 0xFA, 0x8B, 0x46, 0xF1, - 0xDE, 0x0C, 0xC8, 0xCE, 0xEE, 0x69, 0xD1, 0x68, 0xFA, 0xD3, 0x1B, 0xF2, 0xEF, 0x5C, 0xB1, 0x70, - 0x81, 0x0B, 0x31, 0x9C, 0x05, 0x13, 0xAE, 0x97, 0x8D, 0xA4, 0x5E, 0x36, 0xB4, 0x7A, 0x59, 0x8F, - 0x27, 0x12, 0x99, 0xB3, 0xCB, 0x5E, 0x55, 0x69, 0x89, 0x0C, 0x6A, 0x84, 0xA6, 0xD1, 0xE8, 0xF0, - 0x71, 0xE2, 0x3A, 0x4C, 0xB5, 0xAE, 0x12, 0xD9, 0x7C, 0x2D, 0xEE, 0xEE, 0xA9, 0x66, 0x78, 0x2D, - 0x52, 0x15, 0xBB, 0x09, 0xE6, 0x59, 0xEB, 0x26, 0x84, 0x9A, 0x81, 0x4D, 0x33, 0x61, 0xB4, 0xD0, - 0x32, 0x78, 0x36, 0x49, 0xC6, 0xCC, 0x55, 0xDA, 0x6B, 0xA3, 0x22, 0xEC, 0x0B, 0xD7, 0x25, 0x67, - 0x84, 0x11, 0x15, 0x0D, 0x30, 0xD1, 0x1A, 0x09, 0xE3, 0x3B, 0x33, 0xD0, 0x1A, 0x2D, 0xF8, 0xAA, - 0x58, 0x69, 0xCB, 0xE2, 0xB1, 0xFD, 0x09, 0x4F, 0xE9, 0xB1, 0x08, 0x64, 0xB1, 0xD9, 0x6F, 0x12, - 0x99, 0x82, 0x8F, 0x2D, 0x6E, 0xEB, 0x4B, 0x98, 0xFA, 0xE8, 0x6E, 0xCC, 0xCF, 0x44, 0x20, 0x9C, - 0x4D, 0xBD, 0x8C, 0x33, 0xA9, 0x1A, 0x5F, 0x5B, 0x4E, 0x93, 0x62, 0xB1, 0x35, 0xA8, 0xFA, 0x3D, - 0x76, 0x3D, 0xCB, 0xA0, 0x85, 0x4A, 0x55, 0xE5, 0x13, 0xD7, 0xAC, 0x3A, 0x3E, 0xF5, 0xF4, 0x8F, - 0xC6, 0xE6, 0xA1, 0x16, 0x97, 0xB6, 0x99, 0x11, 0xC6, 0xDE, 0x24, 0x42, 0xC2, 0x99, 0x38, 0x34, - 0x2B, 0xCD, 0x7B, 0x32, 0x11, 0xCD, 0xE5, 0x9F, 0xD8, 0xB7, 0x98, 0x6F, 0x2F, 0xC8, 0x44, 0x27, - 0xEB, 0xAD, 0x40, 0xD2, 0x3A, 0x95, 0x95, 0xAE, 0x44, 0x4B, 0xBA, 0x1B, 0x71, 0x33, 0x0A, 0x0D, - 0x49, 0x49, 0x56, 0xAD, 0x04, 0x89, 0x40, 0x88, 0x2F, 0xAF, 0x22, 0xC4, 0x8D, 0xCA, 0x4E, 0xF4, - 0x82, 0xB3, 0xA6, 0xE8, 0x97, 0xBB, 0x83, 0xA4, 0xC7, 0x13, 0xE2, 0x60, 0xAF, 0xBA, 0x6F, 0xDE, - 0xE3, 0xBD, 0x00, 0x1E, 0x28, 0xA9, 0xF5, 0xC8, 0xF2, 0x46, 0xD6, 0x3B, 0xBA, 0xCA, 0xD1, 0xF0, - 0x17, 0x01, 0x02, 0xBC, 0x9E, 0x4E, 0xFF, 0x4C, 0x18, 0x57, 0xC2, 0xE0, 0xA9, 0x08, 0x92, 0x50, - 0x61, 0xA1, 0xC9, 0xB5, 0x85, 0x25, 0x5A, 0xE9, 0xEE, 0xBB, 0xB9, 0xF5, 0xD6, 0x7F, 0x91, 0xDD, - 0xFD, 0xA7, 0x64, 0x29, 0x29, 0x92, 0x4A, 0xE3, 0xC4, 0x35, 0x21, 0xAC, 0xB0, 0x8D, 0x78, 0xAF, - 0x1F, 0x4C, 0x3B, 0x20, 0x9B, 0xF3, 0xBA, 0xE8, 0x4E, 0xA1, 0x97, 0x41, 0xBD, 0xC7, 0x4D, 0xE8, - 0x6E, 0x93, 0xEC, 0xE8, 0x9B, 0x90, 0xF8, 0xC8, 0x6E, 0xF5, 0x4A, 0x4C, 0xD2, 0xCA, 0x82, 0x9E, - 0xD5, 0x0D, 0xA3, 0x3C, 0x38, 0x42, 0xB1, 0x18, 0xF1, 0x27, 0x0E, 0x5E, 0xDF, 0xBC, 0x87, 0xEE, - 0xB4, 0xDB, 0xD2, 0xE5, 0x9F, 0x12, 0x1E, 0x59, 0x8B, 0x73, 0x86, 0xB4, 0xB2, 0x18, 0xDF, 0x92, - 0x80, 0x0C, 0x71, 0x5A, 0x58, 0x49, 0x22, 0xC0, 0x45, 0x8C, 0xB4, 0x99, 0x25, 0xC0, 0x64, 0xF6, - 0x20, 0x93, 0x59, 0x02, 0x4D, 0xE6, 0x13, 0x6C, 0x32, 0x7B, 0xC0, 0xC9, 0x6C, 0x41, 0x27, 0xB3, - 0x04, 0x9E, 0xCC, 0x1A, 0x7C, 0x32, 0xFF, 0x30, 0x92, 0x59, 0x43, 0x49, 0xE6, 0x11, 0x4E, 0x52, - 0x3D, 0xA4, 0x64, 0xD6, 0xB0, 0x92, 0x64, 0x16, 0x07, 0x98, 0xFA, 0x0C, 0xDF, 0x6F, 0x60, 0xE5, - 0x7B, 0x59, 0x0B, 0x93, 0x76, 0xDD, 0x58, 0x94, 0x2A, 0xE6, 0x3B, 0xAD, 0x44, 0x68, 0xA5, 0x1A, - 0x09, 0x23, 0x44, 0x44, 0xCF, 0xE9, 0x51, 0x3A, 0x0A, 0x0A, 0x74, 0xB7, 0xEE, 0x75, 0x57, 0x79, - 0x0B, 0xCC, 0x82, 0xB2, 0xA3, 0x96, 0x7F, 0xF9, 0x0B, 0x4A, 0x69, 0xC8, 0x5E, 0xCE, 0xAC, 0xD6, - 0x98, 0xBD, 0x01, 0x59, 0x11, 0x31, 0x7B, 0xCB, 0x50, 0xD7, 0x58, 0x97, 0x4C, 0x4F, 0x17, 0x2E, - 0x91, 0xB7, 0x54, 0x29, 0xE2, 0x97, 0x7C, 0xEC, 0x50, 0x94, 0xC4, 0x3B, 0xD7, 0x25, 0xFF, 0x21, - 0x27, 0x49, 0xF9, 0xCD, 0x43, 0xD5, 0x0F, 0x26, 0x96, 0xD3, 0xA5, 0xA5, 0x34, 0xA7, 0x27, 0x8D, - 0x1B, 0x12, 0xA5, 0x40, 0xFB, 0xDC, 0xA2, 0x6A, 0x4C, 0xD5, 0x08, 0xC3, 0xA5, 0xEB, 0x0D, 0xEE, - 0x6A, 0x7A, 0x41, 0xD0, 0x3D, 0x78, 0x5E, 0x54, 0x16, 0xD2, 0x1F, 0x4B, 0xAF, 0xDC, 0xBE, 0x8C, - 0x44, 0xE8, 0xD0, 0xFF, 0x21, 0x14, 0x92, 0x50, 0x24, 0x74, 0xCC, 0x9E, 0x1D, 0x9C, 0x9A, 0x93, - 0x38, 0x30, 0x7B, 0x6C, 0x3B, 0xE4, 0x1F, 0xF3, 0xB1, 0x85, 0x6E, 0x68, 0x89, 0x90, 0xD5, 0xA2, - 0x15, 0x2D, 0x4F, 0xC7, 0x07, 0xC2, 0x7A, 0x12, 0x5E, 0xC9, 0x46, 0xD9, 0xF4, 0x18, 0xAE, 0xB1, - 0xE9, 0x7F, 0x67, 0x05, 0x0C, 0x90, 0x54, 0x48, 0xC5, 0x8D, 0xB5, 0x7D, 0x0B, 0x28, 0x99, 0xDA, - 0x62, 0x1F, 0xDE, 0x01, 0x7A, 0xF6, 0xA1, 0x41, 0x81, 0x90, 0xE1, 0xED, 0xA0, 0xB7, 0x6F, 0x19, - 0x2E, 0x32, 0x6C, 0x64, 0x04, 0x0D, 0x69, 0xF4, 0xB2, 0xD3, 0x61, 0xE8, 0x53, 0x6C, 0x08, 0x6D, - 0x85, 0x5E, 0xE5, 0x8D, 0x75, 0x72, 0x5C, 0x32, 0x4C, 0x9E, 0x61, 0xD2, 0x0E, 0x81, 0xF7, 0x61, - 0x58, 0x06, 0xE9, 0xBF, 0xC6, 0xFD, 0xCF, 0x47, 0xF0, 0x16, 0xA9, 0x85, 0x07, 0xF6, 0x84, 0xEC, - 0x2C, 0xC0, 0x24, 0xA1, 0x0C, 0x56, 0xE4, 0x46, 0x28, 0xE4, 0x3F, 0xB2, 0xE1, 0x72, 0x57, 0x76, - 0xBE, 0xDD, 0x8E, 0x13, 0x1E, 0x45, 0x5D, 0x43, 0x3B, 0x5A, 0xE7, 0xB8, 0x38, 0x59, 0xA0, 0x85, - 0x03, 0xB2, 0xE9, 0xC0, 0xD6, 0x11, 0x51, 0x15, 0x1C, 0x4E, 0x9C, 0x1D, 0x31, 0xCA, 0xAB, 0x74, - 0x1F, 0x66, 0x60, 0x04, 0x2F, 0x61, 0x96, 0xBF, 0xD3, 0xB6, 0xC8, 0xF1, 0xC0, 0xBE, 0x7D, 0x8A, - 0xB2, 0x84, 0x36, 0x44, 0x61, 0x68, 0x46, 0xE3, 0x2D, 0x37, 0xDB, 0x41, 0xB2, 0xC7, 0xB1, 0xDF, - 0xDE, 0x3F, 0x3F, 0xBF, 0x38, 0x38, 0x3E, 0xDB, 0xBD, 0x3C, 0xBC, 0x3E, 0x3E, 0xEB, 0x5D, 0x5D, - 0x5E, 0x5F, 0x7E, 0xEE, 0xC1, 0xAF, 0x1F, 0x77, 0x4F, 0x8E, 0x0F, 0xAE, 0xAF, 0xCE, 0x7E, 0x39, - 0x3B, 0xFF, 0x74, 0xA6, 0xC6, 0x15, 0x44, 0x23, 0x0A, 0x44, 0xC6, 0x10, 0x21, 0x54, 0x81, 0xF4, - 0x02, 0x4D, 0x9D, 0xEF, 0x0E, 0x64, 0x6C, 0xDA, 0x7E, 0x69, 0xB2, 0x42, 0x27, 0x00, 0x51, 0x01, - 0xF7, 0xD8, 0x23, 0x3C, 0x17, 0x08, 0x7F, 0x8B, 0x96, 0x3B, 0x9B, 0x06, 0x13, 0x7F, 0x5D, 0x39, - 0xD9, 0x0C, 0x6D, 0xCA, 0xD2, 0x9F, 0x60, 0x43, 0xEC, 0x96, 0xB9, 0xC9, 0xCC, 0x70, 0x9B, 0xC6, - 0x8B, 0x63, 0x40, 0xEA, 0x54, 0x61, 0xE2, 0x22, 0xC8, 0x74, 0xE8, 0x19, 0xBE, 0xAD, 0x91, 0x3F, - 0x96, 0xEC, 0xB5, 0xBC, 0x00, 0xD2, 0x76, 0x7F, 0x48, 0xE0, 0x1F, 0x12, 0x98, 0x2E, 0x81, 0x09, - 0x79, 0xF9, 0xD3, 0x8E, 0xA4, 0xF8, 0x32, 0xFB, 0xCF, 0x74, 0xA8, 0xCF, 0x42, 0x76, 0x69, 0x90, - 0xE2, 0x0B, 0xE9, 0x7E, 0xA6, 0xB2, 0x17, 0xE9, 0x98, 0x78, 0xB6, 0x43, 0x5F, 0x97, 0x8E, 0x27, - 0x55, 0xB5, 0xD9, 0x92, 0xCA, 0xF6, 0xAA, 0x64, 0x48, 0x83, 0xC0, 0x13, 0x08, 0xC2, 0x82, 0x66, - 0xC1, 0x5D, 0x3A, 0x5C, 0x65, 0x6B, 0xF2, 0x56, 0xB7, 0xC2, 0xD9, 0x08, 0xE5, 0x64, 0x4F, 0xB4, - 0x32, 0x82, 0x11, 0x0D, 0x60, 0xB4, 0x58, 0x38, 0x64, 0xB4, 0xCC, 0x2A, 0x69, 0x16, 0xE3, 0xD4, - 0x31, 0xF2, 0x0A, 0x1B, 0xAF, 0x8C, 0x7C, 0x86, 0x50, 0x54, 0x8D, 0xB0, 0x4E, 0x4B, 0x47, 0x44, - 0x9C, 0xF8, 0x45, 0xD1, 0x6C, 0x99, 0xC0, 0x48, 0xA5, 0x2C, 0x68, 0xC9, 0xE8, 0x02, 0x96, 0x65, - 0xD7, 0xA7, 0x5D, 0x0D, 0xF9, 0xCB, 0xBB, 0x9F, 0xDC, 0xFD, 0x25, 0xF2, 0xF2, 0xC4, 0xDB, 0xBF, - 0x8A, 0xDB, 0xBE, 0x82, 0x3B, 0x3B, 0x0E, 0x00, 0x76, 0x16, 0x3F, 0x69, 0x2B, 0xC7, 0x1E, 0x13, - 0x88, 0xB7, 0x47, 0x3B, 0xA9, 0x49, 0x8F, 0xE6, 0x74, 0x4E, 0xF8, 0x51, 0x1A, 0x35, 0xCB, 0x75, - 0x94, 0x81, 0x5E, 0x8C, 0x72, 0x28, 0x8E, 0xBE, 0x92, 0x56, 0x4C, 0x13, 0x1D, 0x7E, 0x59, 0x37, - 0x67, 0xD9, 0x89, 0xDF, 0x73, 0x90, 0x45, 0x28, 0x76, 0xDE, 0x04, 0x49, 0x9A, 0x97, 0xE0, 0x64, - 0x8C, 0x47, 0x22, 0x60, 0x60, 0x4E, 0xA3, 0x21, 0x25, 0x0A, 0xE0, 0x7E, 0xBC, 0xB3, 0x36, 0x35, - 0x4A, 0x09, 0x81, 0x7A, 0x82, 0x7C, 0x86, 0x95, 0x35, 0x4D, 0x86, 0x62, 0x07, 0x04, 0x29, 0x8B, - 0x62, 0x39, 0xE1, 0x81, 0x45, 0xD8, 0x62, 0x0F, 0x91, 0x30, 0x51, 0xE1, 0xEF, 0x8F, 0xB4, 0xEB, - 0x82, 0x37, 0x5E, 0xC3, 0x12, 0x9E, 0x02, 0xFB, 0x13, 0x3C, 0xD8, 0xF6, 0x4A, 0x78, 0xFF, 0x98, - 0x15, 0x7F, 0x35, 0xBE, 0x71, 0xC5, 0x44, 0xBF, 0xD9, 0xFE, 0x99, 0x79, 0xD6, 0x60, 0xF7, 0x1E, - 0x61, 0x79, 0xB3, 0xC9, 0xCA, 0xC2, 0xEA, 0x6F, 0x91, 0x21, 0x7F, 0x78, 0x07, 0xB9, 0xDC, 0x9A, - 0x3A, 0xE0, 0x9D, 0x1C, 0xE0, 0x1D, 0x19, 0x78, 0x47, 0x05, 0xDE, 0xC9, 0x02, 0xDE, 0xCD, 0x01, - 0xDE, 0x95, 0x81, 0x77, 0x55, 0xE0, 0xDD, 0x2C, 0xE0, 0xAB, 0x39, 0xC0, 0x57, 0x65, 0xE0, 0xAB, - 0x2A, 0xF0, 0xD5, 0x08, 0xF8, 0xCB, 0x3B, 0xBB, 0x97, 0x16, 0x59, 0x21, 0x91, 0x0B, 0xC8, 0xEC, - 0x8D, 0x69, 0xC1, 0xEF, 0x10, 0x9A, 0x9E, 0x23, 0xC0, 0xA1, 0xCB, 0x81, 0x3E, 0xE1, 0x0A, 0x97, - 0xE8, 0x76, 0xE0, 0x9E, 0xB8, 0x0F, 0xD4, 0xB5, 0x1F, 0x2E, 0xAD, 0x81, 0xED, 0x62, 0x90, 0x51, - 0xB6, 0xE3, 0x23, 0xD0, 0xC3, 0xA3, 0xA2, 0xF4, 0x94, 0x54, 0xEF, 0xBC, 0xEC, 0x8A, 0x68, 0x5B, - 0x04, 0x8D, 0x6D, 0x75, 0x0B, 0xF4, 0x98, 0x9D, 0xC8, 0x3A, 0x1A, 0x9F, 0x0A, 0x6E, 0xBC, 0x23, - 0x60, 0x92, 0x85, 0x09, 0x39, 0xE9, 0x54, 0x17, 0x14, 0x82, 0xE0, 0xC5, 0x5A, 0x88, 0x3A, 0xFA, - 0xFB, 0x04, 0xE0, 0x89, 0xD6, 0x6E, 0x27, 0x3A, 0xD4, 0xC1, 0x68, 0xB3, 0x73, 0xAE, 0x9C, 0x4E, - 0x53, 0x78, 0xD7, 0x22, 0xD4, 0x90, 0x59, 0xC3, 0x4B, 0x9F, 0x8A, 0xB8, 0x74, 0x8F, 0x4C, 0xB8, - 0xA7, 0x7E, 0x3A, 0xC0, 0xB7, 0xE6, 0x74, 0x14, 0xF8, 0xF2, 0x06, 0x58, 0x2E, 0x4B, 0x3E, 0x28, - 0x51, 0x0B, 0x8B, 0xD0, 0xEE, 0x84, 0xE8, 0x5E, 0x6C, 0x49, 0x17, 0xE7, 0x34, 0x7B, 0x04, 0x7B, - 0xA7, 0x9E, 0x61, 0x83, 0xCB, 0x0F, 0x6D, 0x82, 0x5E, 0x05, 0x13, 0x7D, 0x65, 0xBD, 0xD5, 0x69, - 0xD5, 0xF4, 0x24, 0x6B, 0x6E, 0x0A, 0x13, 0xE4, 0x17, 0x4A, 0x74, 0x2C, 0xBC, 0xDE, 0x94, 0x92, - 0xC8, 0x22, 0x27, 0x49, 0xF1, 0x0E, 0x7A, 0x94, 0xBC, 0x66, 0x72, 0x32, 0xB3, 0x8B, 0x7D, 0xF9, - 0x07, 0xF6, 0xDC, 0x30, 0x23, 0x86, 0x90, 0xD3, 0xB1, 0x44, 0xBA, 0x1F, 0xD4, 0x00, 0xC7, 0x5E, - 0x4D, 0x96, 0x9A, 0xE6, 0x6F, 0x35, 0x11, 0xD0, 0x50, 0xCE, 0xF8, 0x11, 0x49, 0xB4, 0xA1, 0xCB, - 0x01, 0xA4, 0x4F, 0x4A, 0xC3, 0x86, 0xE1, 0x37, 0x99, 0xE2, 0x26, 0xB5, 0xF7, 0x6D, 0xA3, 0x18, - 0x03, 0xE2, 0x64, 0x35, 0x73, 0xE3, 0xC2, 0x4F, 0xCA, 0x7F, 0x53, 0x84, 0x15, 0xEA, 0x64, 0x02, - 0xD1, 0x9F, 0x69, 0x42, 0xD1, 0xB9, 0xA3, 0x9B, 0x54, 0xF3, 0x9C, 0x50, 0xCF, 0x9F, 0x5E, 0x67, - 0xB6, 0x49, 0x15, 0xA5, 0x04, 0xFA, 0x1D, 0x24, 0x1A, 0x2A, 0x2B, 0x55, 0x7C, 0xB9, 0x61, 0x99, - 0x84, 0x88, 0xD0, 0x24, 0x16, 0x19, 0x59, 0x87, 0x6F, 0xCF, 0xFB, 0xAA, 0x9E, 0xDF, 0x79, 0x6B, - 0x5F, 0x89, 0x66, 0xB9, 0xE5, 0xC2, 0x1E, 0x74, 0xB6, 0x8B, 0x35, 0xEA, 0x57, 0x6A, 0x74, 0x59, - 0xA5, 0xD1, 0x47, 0xA1, 0xD1, 0x5A, 0xB1, 0x46, 0x17, 0xA7, 0xFB, 0x49, 0x4C, 0x8A, 0xFD, 0xBA, - 0xD0, 0xD5, 0x76, 0x74, 0x35, 0xAC, 0x79, 0xCF, 0x56, 0x66, 0x9C, 0xD1, 0x5E, 0xDF, 0x2E, 0xD6, - 0xAC, 0x5F, 0xB1, 0xD9, 0x65, 0xB5, 0x66, 0x22, 0xFB, 0x3A, 0x6D, 0xA3, 0x58, 0x33, 0x99, 0x81, - 0x11, 0xB6, 0x1F, 0x62, 0x4E, 0x76, 0x2E, 0xD4, 0x3C, 0x22, 0xE3, 0x0F, 0x91, 0x7E, 0x66, 0x91, - 0xCE, 0x6B, 0x75, 0xF1, 0xEB, 0xE9, 0xF5, 0xC5, 0xEE, 0xA7, 0x5F, 0x4B, 0xD1, 0x07, 0x8D, 0xFA, - 0x47, 0x17, 0x7B, 0xBF, 0xFE, 0x31, 0x7D, 0xE6, 0x3C, 0x7D, 0xB2, 0xDB, 0xA9, 0xEF, 0x5E, 0x77, - 0xB6, 0x4A, 0xA1, 0x55, 0x9B, 0x77, 0x8D, 0x99, 0x9A, 0xAF, 0x75, 0x67, 0x6B, 0xBE, 0xA1, 0x6B, - 0xAE, 0x5D, 0x11, 0xA1, 0x81, 0x56, 0x73, 0xC8, 0x7B, 0xB0, 0x67, 0xD0, 0x1E, 0x74, 0x13, 0x41, - 0xA7, 0x00, 0x21, 0xE9, 0xBA, 0x63, 0x18, 0xEB, 0x45, 0x27, 0x8E, 0xDA, 0xF2, 0xF5, 0x5A, 0xE5, - 0x96, 0xAF, 0x6B, 0x89, 0x5D, 0x55, 0xB1, 0x96, 0x9B, 0x95, 0x71, 0x6E, 0x2A, 0x38, 0x4B, 0x34, - 0xDD, 0xAA, 0x8C, 0x74, 0xAB, 0x6A, 0x47, 0x3B, 0xDD, 0xAA, 0x38, 0x3B, 0xDD, 0xAA, 0x38, 0xBB, - 0xAB, 0xD2, 0x6C, 0x2A, 0xC3, 0xA3, 0x35, 0xE3, 0x75, 0xF7, 0xDA, 0xA8, 0x86, 0x97, 0xB6, 0xED, - 0xD4, 0x52, 0xB6, 0xD9, 0x73, 0xD0, 0xC3, 0xD1, 0xD6, 0x99, 0xCD, 0x5A, 0x59, 0xE0, 0x0B, 0x4D, - 0x7A, 0xA1, 0xF5, 0xEA, 0xAA, 0xC4, 0xA3, 0xB2, 0xCD, 0xE5, 0x39, 0x53, 0xB6, 0xF5, 0xE6, 0x4C, - 0xAD, 0xB7, 0x66, 0x69, 0xAD, 0x08, 0x64, 0xAE, 0xB2, 0x3B, 0x71, 0x1F, 0xF6, 0x4C, 0xC7, 0x7A, - 0xB0, 0xAD, 0xE0, 0xEE, 0x25, 0x2B, 0x3C, 0xA3, 0xB2, 0xC6, 0xEB, 0xFE, 0x04, 0x8D, 0xD7, 0xFD, - 0x19, 0x1A, 0xAF, 0xFB, 0x13, 0x34, 0x5E, 0xF7, 0x0F, 0x8D, 0xB7, 0x20, 0x8D, 0xD7, 0xFD, 0x99, - 0x1A, 0xAF, 0x3B, 0x93, 0xC6, 0xEB, 0xCE, 0xA4, 0xF1, 0xBA, 0x33, 0x69, 0xBC, 0xAE, 0x5E, 0xE3, - 0x4D, 0x7D, 0x9A, 0x06, 0x36, 0x76, 0xFB, 0xF1, 0x93, 0xFE, 0x30, 0x2C, 0xD7, 0x66, 0x0C, 0x0A, - 0xC3, 0xDF, 0xDB, 0xC9, 0x3A, 0x9F, 0x95, 0x3A, 0x9F, 0x35, 0x75, 0xBE, 0x28, 0x75, 0xBE, 0x48, - 0xAF, 0x87, 0x11, 0x6A, 0xC2, 0xC7, 0x0C, 0x33, 0x29, 0x4A, 0x7A, 0xE8, 0x0C, 0xC3, 0x17, 0x5B, - 0xCD, 0x20, 0xDF, 0x03, 0x27, 0xAA, 0xEC, 0x3A, 0x4A, 0xE5, 0x0F, 0xBB, 0x87, 0xBB, 0xBD, 0x7D, - 0x4D, 0xD5, 0xDD, 0x51, 0xC0, 0x27, 0x97, 0x1C, 0xC9, 0x38, 0x36, 0xBD, 0xEF, 0x52, 0x18, 0x63, - 0x27, 0x27, 0x56, 0x31, 0xA7, 0x79, 0x57, 0xD7, 0x9C, 0xB9, 0xB2, 0x73, 0xFC, 0xA6, 0xF5, 0xF7, - 0xA9, 0x1F, 0x10, 0x42, 0xD5, 0xEB, 0x05, 0x6A, 0xE8, 0x3C, 0xC3, 0x0F, 0xE4, 0x9C, 0x1F, 0x71, - 0x2C, 0x11, 0xF6, 0x17, 0xD7, 0xD1, 0x5C, 0xB6, 0xE0, 0x47, 0x3B, 0x50, 0x42, 0x89, 0xE8, 0x1B, - 0xB1, 0xB5, 0xB1, 0x69, 0x3B, 0x3D, 0x1A, 0x3B, 0xB9, 0x1D, 0x3D, 0x0A, 0xC7, 0x5F, 0x1E, 0x3F, - 0x76, 0x7A, 0x9E, 0x0B, 0x91, 0x2F, 0x51, 0xA4, 0xA0, 0x8A, 0x13, 0xA0, 0xEE, 0x3A, 0x96, 0x78, - 0xC3, 0x03, 0xD5, 0xD8, 0x5A, 0xAB, 0x7B, 0x8C, 0x31, 0x26, 0x43, 0xFB, 0x1C, 0x23, 0x6D, 0x08, - 0xAF, 0xDC, 0x8E, 0x70, 0x10, 0x47, 0xFB, 0xD2, 0x7B, 0xAF, 0x10, 0x82, 0x08, 0x9B, 0xA3, 0xD3, - 0x77, 0x84, 0x7D, 0x4D, 0x76, 0x44, 0xE9, 0x64, 0x88, 0xAD, 0x16, 0xFA, 0xA2, 0xED, 0x9B, 0x23, - 0xC8, 0xAB, 0xF2, 0x70, 0x87, 0x99, 0x3B, 0xDA, 0x61, 0xBF, 0xB7, 0xDA, 0x45, 0x77, 0xF4, 0x05, - 0x75, 0x42, 0xB8, 0x37, 0x26, 0x85, 0xF4, 0x61, 0xF5, 0x49, 0x00, 0xAF, 0xDD, 0x52, 0x97, 0x05, - 0x38, 0x78, 0xC5, 0xCC, 0x41, 0xB7, 0x9E, 0x3B, 0x46, 0xBB, 0x3D, 0xD6, 0x60, 0x88, 0x26, 0x84, - 0x2A, 0xF1, 0xB1, 0x33, 0x0A, 0x05, 0xE2, 0x90, 0x2E, 0x18, 0x18, 0xC1, 0xBE, 0x7D, 0x40, 0x28, - 0xF1, 0xC6, 0xB6, 0x83, 0x09, 0x7E, 0x7B, 0x70, 0x87, 0xC4, 0xA7, 0x73, 0x99, 0xF7, 0x9B, 0xEB, - 0xD9, 0x43, 0x32, 0x77, 0x46, 0xEC, 0x69, 0xDD, 0x70, 0x87, 0xA2, 0xBE, 0x80, 0xF9, 0xA7, 0x1D, - 0xE4, 0x4C, 0x47, 0xA3, 0xA6, 0x7A, 0x63, 0xA9, 0x3E, 0x8A, 0x29, 0x33, 0x32, 0x33, 0xE0, 0x89, - 0x7D, 0x7B, 0x83, 0x76, 0x47, 0x23, 0xD4, 0x27, 0xDF, 0xAD, 0xEC, 0xA4, 0x21, 0xE2, 0xF3, 0x9E, - 0x57, 0xCC, 0x87, 0x16, 0x91, 0xFF, 0x13, 0x3E, 0x11, 0xA6, 0x25, 0x79, 0xA0, 0x8F, 0x70, 0x80, - 0x4A, 0x0F, 0xA6, 0x87, 0xAF, 0x26, 0x23, 0xD7, 0xB4, 0x3E, 0x99, 0x76, 0x20, 0xB9, 0xCE, 0xD3, - 0x97, 0x96, 0x58, 0x3A, 0x39, 0x7F, 0x7A, 0x33, 0xB6, 0x83, 0x23, 0x5E, 0x1F, 0xA2, 0xED, 0xC8, - 0x64, 0xA3, 0x6F, 0xE4, 0x7E, 0x35, 0xBE, 0xC5, 0x0E, 0x26, 0xB0, 0x66, 0x71, 0x27, 0x13, 0x78, - 0x4D, 0x1A, 0xFC, 0x16, 0xC5, 0x80, 0xB0, 0xB0, 0xB8, 0x6D, 0x4E, 0x26, 0x6C, 0x52, 0x25, 0xC1, - 0xB6, 0x28, 0xDA, 0x66, 0x0C, 0xD3, 0xFC, 0xBB, 0xF9, 0xC8, 0xE1, 0xFD, 0x7A, 0x7A, 0xF2, 0x21, - 0x80, 0xAC, 0x07, 0xFF, 0x31, 0xC5, 0xF1, 0xF3, 0xD2, 0x50, 0xA1, 0xED, 0x12, 0x80, 0x8D, 0x5A, - 0xEF, 0xBC, 0x7F, 0x09, 0xF1, 0x7F, 0x2B, 0x53, 0xDA, 0xA3, 0x9A, 0x58, 0x83, 0x4E, 0xA9, 0x90, - 0x82, 0x70, 0xC6, 0x31, 0xF5, 0x25, 0x72, 0x41, 0x73, 0x6F, 0x0B, 0x8F, 0x3F, 0xB2, 0x42, 0x1B, - 0xBC, 0x0D, 0x27, 0x52, 0xB4, 0xB3, 0xF2, 0xBE, 0xB3, 0x0C, 0xAC, 0x1F, 0x98, 0xC1, 0xD4, 0x07, - 0xDF, 0x2C, 0x59, 0x11, 0x67, 0x23, 0x24, 0xD5, 0xB3, 0x80, 0x26, 0x26, 0x30, 0x9B, 0x6E, 0xFA, - 0x4A, 0xB5, 0xD4, 0x49, 0x2C, 0x21, 0x70, 0xBD, 0x21, 0x0E, 0x7A, 0xA6, 0xED, 0x61, 0x8B, 0x2A, - 0x55, 0x79, 0xE5, 0xB8, 0x09, 0x9C, 0x23, 0x5A, 0x83, 0x95, 0x69, 0x58, 0x04, 0x52, 0x4B, 0x5F, - 0x41, 0xF3, 0x29, 0x2C, 0x37, 0x08, 0xB0, 0xD3, 0x16, 0xA2, 0x27, 0x26, 0x18, 0x7B, 0xA7, 0xBB, - 0xFB, 0xBE, 0xDA, 0xEE, 0x8C, 0xBD, 0x90, 0xAD, 0xBD, 0xE5, 0xA6, 0x18, 0xD9, 0x43, 0xEC, 0x3D, - 0xD2, 0xDC, 0xD7, 0xA8, 0x5D, 0x42, 0x18, 0x55, 0x8E, 0x6A, 0x02, 0x83, 0x61, 0xA8, 0x9A, 0x78, - 0x81, 0x86, 0x62, 0xDA, 0x8E, 0xDE, 0x6E, 0xF1, 0x48, 0xF3, 0xB4, 0xDB, 0x76, 0x11, 0x4E, 0x4C, - 0x42, 0x74, 0x95, 0x63, 0x5A, 0x16, 0x7D, 0x2E, 0x1D, 0x5C, 0x1E, 0xB0, 0x03, 0x0F, 0x17, 0x1D, - 0x9C, 0x9F, 0x12, 0x1D, 0x1C, 0xC0, 0x37, 0x32, 0x10, 0x18, 0x32, 0x73, 0x34, 0x30, 0x54, 0x69, - 0xA2, 0x9D, 0x77, 0x84, 0xC0, 0x48, 0xB2, 0x39, 0xC3, 0x0A, 0xDC, 0x0B, 0x25, 0x23, 0xE2, 0xA5, - 0xAB, 0x20, 0xEA, 0xF5, 0x0F, 0x9B, 0x49, 0xEA, 0x5F, 0x48, 0x7E, 0x61, 0x90, 0xA3, 0x7B, 0x20, - 0x1B, 0x1C, 0x05, 0xCD, 0x47, 0xF2, 0x8B, 0x7C, 0x21, 0xC4, 0xAA, 0x7D, 0xB5, 0xBF, 0xB5, 0x5D, - 0x67, 0x30, 0xB2, 0x07, 0x10, 0x90, 0x14, 0xF1, 0xB6, 0x91, 0x48, 0x67, 0x2F, 0xE7, 0x8A, 0x48, - 0x49, 0x1B, 0x3D, 0xD4, 0xBE, 0x83, 0xD6, 0xD4, 0xF0, 0x89, 0xC1, 0x83, 0x09, 0xAF, 0x45, 0xA9, - 0x01, 0xD4, 0xC7, 0x03, 0xF9, 0x24, 0x8A, 0x56, 0x52, 0xF1, 0x09, 0x8E, 0x1D, 0x3F, 0xC4, 0xD9, - 0xAE, 0x05, 0x39, 0x0F, 0xE2, 0x62, 0xAC, 0x59, 0xB4, 0x09, 0x5D, 0xD0, 0x10, 0xA7, 0x79, 0x8F, - 0xA3, 0x34, 0x69, 0xD5, 0xDE, 0xF6, 0x88, 0xF5, 0x88, 0xCF, 0xEB, 0xEB, 0xD3, 0x92, 0x33, 0x3D, - 0x42, 0x77, 0x7C, 0xA9, 0xF9, 0xC3, 0x75, 0x3D, 0x3A, 0x82, 0x16, 0xF3, 0xE8, 0x4E, 0x08, 0xA8, - 0x50, 0x5F, 0x52, 0xE8, 0x8C, 0x3B, 0x92, 0xDE, 0x59, 0x4D, 0x5F, 0xB2, 0x1F, 0x83, 0xA8, 0xDC, - 0xB3, 0x99, 0xDE, 0x98, 0x60, 0xFD, 0x84, 0xF3, 0x40, 0x56, 0x37, 0x87, 0xD1, 0xD1, 0xA0, 0x7A, - 0x37, 0xDF, 0xD3, 0x28, 0xD5, 0x79, 0xF7, 0xF2, 0xBD, 0x1A, 0xFB, 0xAA, 0xEB, 0x24, 0xEB, 0x44, - 0x7A, 0x27, 0x19, 0x13, 0x92, 0x9D, 0x94, 0x2A, 0xA5, 0x59, 0x9A, 0x98, 0x31, 0x69, 0xEC, 0xFA, - 0xA6, 0x3D, 0x28, 0x6B, 0x72, 0x92, 0x72, 0xCB, 0x6A, 0xB3, 0xF3, 0xC7, 0x2A, 0x61, 0xA3, 0xD3, - 0x5E, 0x93, 0xC9, 0xFE, 0x21, 0xC7, 0xB4, 0x96, 0x3A, 0xFC, 0x97, 0xC1, 0xDC, 0x31, 0xA4, 0x03, - 0x70, 0x0A, 0xEA, 0x6A, 0xB0, 0x8D, 0x74, 0xC8, 0x1A, 0xD1, 0xD2, 0xBD, 0x25, 0x50, 0x59, 0xA2, - 0x4A, 0x3E, 0x4C, 0x10, 0x0B, 0x8A, 0xC6, 0xA9, 0xBC, 0xE0, 0x73, 0x1A, 0x4C, 0x10, 0x0B, 0xB4, - 0x4F, 0xEB, 0x75, 0x94, 0xE1, 0x74, 0x1E, 0xBD, 0x2E, 0xF2, 0x52, 0xA6, 0xD2, 0x6B, 0xEE, 0x51, - 0x5B, 0xB9, 0xD7, 0xD9, 0xED, 0x35, 0xBD, 0x56, 0x3C, 0x26, 0x67, 0xEF, 0x79, 0x12, 0x60, 0x4E, - 0xEF, 0x35, 0xBE, 0x99, 0xA4, 0x91, 0x65, 0xFB, 0x2C, 0xC1, 0x27, 0x0F, 0x77, 0x2F, 0xC8, 0x8A, - 0x5C, 0x60, 0x71, 0x1A, 0xE9, 0x14, 0xB6, 0xC0, 0xE9, 0x03, 0xF2, 0xCE, 0x40, 0x66, 0x25, 0x07, - 0x8F, 0x66, 0x61, 0x48, 0x12, 0x54, 0x14, 0x36, 0x64, 0xE8, 0x65, 0x20, 0x6C, 0xB1, 0x67, 0x4E, - 0xAD, 0x03, 0xCF, 0x9D, 0xC0, 0x0B, 0xDA, 0xFA, 0x15, 0x43, 0xCA, 0x99, 0x96, 0x2B, 0x2F, 0x05, - 0x28, 0xEA, 0xE8, 0x95, 0x7A, 0x11, 0x8A, 0xF8, 0x1A, 0x57, 0x8A, 0xA2, 0xAA, 0xB8, 0x4A, 0xF4, - 0x5E, 0x23, 0xED, 0xE9, 0x69, 0xDB, 0x67, 0x94, 0xFA, 0xDC, 0x7C, 0xF0, 0xFA, 0xF1, 0x9E, 0x10, - 0x35, 0x45, 0x0F, 0x39, 0x7E, 0x25, 0x86, 0xE5, 0x37, 0xD7, 0xF0, 0x40, 0x4D, 0x13, 0x38, 0x63, - 0xCF, 0x4B, 0x64, 0x1D, 0xCC, 0x94, 0x95, 0x03, 0x1C, 0x98, 0xF6, 0xC8, 0x2F, 0xC9, 0x81, 0x32, - 0x80, 0x74, 0xBC, 0xA0, 0xA7, 0xD7, 0x39, 0x30, 0x21, 0x84, 0x53, 0xA8, 0xF7, 0xF4, 0x58, 0x57, - 0xAD, 0xBF, 0xD9, 0x4D, 0x75, 0xFA, 0x5D, 0xB0, 0x0B, 0xCC, 0x41, 0xB9, 0xCB, 0xD0, 0x52, 0x64, - 0x5B, 0x63, 0x92, 0x98, 0x4D, 0xA3, 0x67, 0x02, 0xCB, 0xD5, 0xE8, 0x6A, 0x5E, 0xE7, 0x19, 0x79, - 0x90, 0x48, 0x55, 0x9C, 0x22, 0xE2, 0x62, 0xE5, 0x8A, 0xC2, 0x5D, 0x08, 0x84, 0xA6, 0xAF, 0x52, - 0x42, 0xE5, 0x19, 0xBB, 0x5B, 0x34, 0x39, 0xB3, 0xDA, 0xF3, 0xB8, 0xDD, 0x2C, 0x9D, 0x2F, 0x00, - 0x25, 0x79, 0x36, 0x8A, 0x5E, 0x18, 0xAB, 0xD0, 0x79, 0xE9, 0x0E, 0x22, 0x01, 0x5E, 0x7E, 0x51, - 0x6C, 0x51, 0xE0, 0x13, 0x9B, 0xF9, 0x39, 0xA3, 0x91, 0xEF, 0x83, 0xE6, 0x08, 0x3C, 0xF2, 0x7B, - 0x7E, 0x62, 0x7E, 0xCF, 0x4F, 0xE8, 0x2D, 0x72, 0xA6, 0xE3, 0xFD, 0x44, 0x3A, 0x55, 0x52, 0x94, - 0x74, 0x7D, 0xBE, 0x99, 0x06, 0x81, 0xEB, 0x70, 0xCF, 0x67, 0x9A, 0x24, 0x0F, 0x02, 0x4E, 0xF6, - 0xE8, 0x57, 0xC8, 0x88, 0xF6, 0x24, 0xDD, 0x11, 0xC6, 0xB5, 0xB5, 0x5D, 0x00, 0x6B, 0x59, 0x6A, - 0x0F, 0xC2, 0x60, 0x98, 0x18, 0xFE, 0x3E, 0xD4, 0x6F, 0x3C, 0x89, 0xC2, 0x25, 0x24, 0x36, 0x6B, - 0xBE, 0x52, 0x23, 0xEC, 0x53, 0xA2, 0x62, 0x32, 0xE2, 0x75, 0x52, 0xF8, 0xA0, 0xB8, 0x80, 0x57, - 0xE7, 0x60, 0x1C, 0x08, 0x9C, 0x1E, 0xE4, 0xF3, 0x44, 0x43, 0x20, 0x1F, 0x75, 0xE7, 0xD4, 0x22, - 0x03, 0xF0, 0xB8, 0xAD, 0x3B, 0x82, 0x8A, 0x03, 0x01, 0x29, 0x09, 0xB8, 0x6D, 0x95, 0xA6, 0x03, - 0x50, 0x48, 0x81, 0x4A, 0x40, 0x45, 0xCE, 0x89, 0x54, 0x8E, 0x16, 0xD3, 0x8C, 0x13, 0x7C, 0x63, - 0x7F, 0xC7, 0x57, 0x47, 0xE8, 0xD8, 0x19, 0x78, 0xD4, 0xF0, 0x3F, 0xE1, 0x61, 0x54, 0x68, 0x19, - 0xF9, 0x0F, 0xE6, 0x84, 0xBD, 0x0F, 0x40, 0x6D, 0xB6, 0x44, 0x73, 0xC5, 0x34, 0x21, 0x9F, 0xD2, - 0xC4, 0x82, 0x27, 0xA0, 0x8E, 0x03, 0xF9, 0x14, 0xEE, 0xC8, 0xCC, 0xC6, 0x7E, 0x9C, 0xB7, 0x3D, - 0x46, 0x45, 0x5F, 0xDC, 0x51, 0xBD, 0xF5, 0xCD, 0xEF, 0xF8, 0x14, 0x7F, 0x80, 0x36, 0xDE, 0xB6, - 0xA6, 0x84, 0x46, 0x41, 0x6E, 0x27, 0x47, 0xB7, 0xB4, 0x5C, 0x14, 0x19, 0xDD, 0x47, 0x3A, 0xBA, - 0x49, 0xDE, 0x88, 0x3F, 0x22, 0xC1, 0x71, 0xC0, 0x97, 0xDE, 0xEA, 0x50, 0x0C, 0x9F, 0xC8, 0xA1, - 0x65, 0x72, 0x8A, 0x48, 0xC7, 0x4A, 0x99, 0x91, 0x85, 0xF4, 0xC7, 0x1C, 0x19, 0x45, 0xED, 0x32, - 0x62, 0x6F, 0x75, 0x74, 0xE5, 0xF4, 0x6E, 0x19, 0xDC, 0xFB, 0x44, 0xD1, 0xCA, 0x61, 0x96, 0x80, - 0x93, 0xF6, 0x55, 0x87, 0x92, 0x40, 0x3B, 0x73, 0x03, 0xFC, 0x06, 0xD5, 0x72, 0x90, 0x2F, 0x11, - 0xE4, 0x35, 0xE4, 0x3A, 0xA3, 0x27, 0x04, 0x0F, 0xBB, 0xF8, 0x21, 0xB1, 0xE4, 0x6F, 0xFB, 0x56, - 0x07, 0x36, 0x03, 0x1E, 0xCD, 0xCB, 0x45, 0x96, 0x92, 0x16, 0x7D, 0x3D, 0xC3, 0xA7, 0x71, 0xB6, - 0x6D, 0x74, 0x05, 0x73, 0xC5, 0xF4, 0x7C, 0x7C, 0x4C, 0x66, 0x2B, 0x99, 0x2B, 0x18, 0x23, 0xF3, - 0xC6, 0xBD, 0xC7, 0x65, 0xD9, 0xB4, 0x14, 0xB2, 0xE9, 0x00, 0x67, 0xB2, 0xE9, 0x87, 0x14, 0xA2, - 0x83, 0x8E, 0x6F, 0x91, 0x39, 0x22, 0xF5, 0xAD, 0x27, 0x3A, 0xFB, 0xF8, 0xC4, 0x8B, 0x66, 0x6F, - 0x8B, 0x72, 0x12, 0xD9, 0x01, 0x1A, 0x11, 0x5E, 0xF2, 0x19, 0xA9, 0xEC, 0x16, 0xE8, 0xBD, 0xCA, - 0xEE, 0xF8, 0x03, 0x6B, 0xFA, 0xBC, 0xF3, 0x0C, 0x74, 0x01, 0x74, 0xC3, 0x40, 0xB6, 0x8F, 0x3E, - 0x08, 0x5A, 0x43, 0x02, 0x15, 0x11, 0x97, 0x94, 0x7B, 0xF8, 0xB9, 0x21, 0xFD, 0xFF, 0xFE, 0x3C, - 0xD3, 0x01, 0xF2, 0xFF, 0x44, 0xD4, 0x2C, 0x78, 0x32, 0xA4, 0xD8, 0x2B, 0x73, 0xE3, 0x4F, 0xB5, - 0x7D, 0x02, 0xAD, 0x42, 0x11, 0x9F, 0xC4, 0x72, 0x90, 0x2E, 0x5C, 0x65, 0x23, 0x57, 0x61, 0xEB, - 0xB0, 0x7F, 0x78, 0x14, 0x2D, 0xDD, 0x62, 0x16, 0xD9, 0xC8, 0x33, 0xCF, 0x21, 0x8B, 0x0E, 0x5C, - 0xF1, 0x41, 0xCD, 0xC8, 0xB2, 0xEA, 0xE1, 0x31, 0x99, 0x2C, 0x7B, 0xA6, 0xB5, 0x0F, 0x09, 0xFC, - 0x1B, 0xC9, 0x3A, 0xE1, 0xAE, 0x48, 0xFB, 0x36, 0x80, 0x50, 0x7B, 0x86, 0x57, 0x40, 0x75, 0xAF, - 0x42, 0x2D, 0xFC, 0xF9, 0xE6, 0x67, 0x7D, 0xB6, 0xF9, 0xD9, 0x9E, 0x6B, 0x4E, 0xC9, 0x23, 0x2C, - 0x2D, 0xF9, 0x61, 0xFA, 0x43, 0x18, 0x39, 0x64, 0x0E, 0x4D, 0xDB, 0xF1, 0x79, 0x4E, 0x26, 0x5B, - 0x10, 0x4C, 0x96, 0xE3, 0xCD, 0xC2, 0x8F, 0xB2, 0xEB, 0x21, 0x9D, 0xC4, 0xDB, 0xBC, 0xE4, 0x2D, - 0xF8, 0xD0, 0xB8, 0x9E, 0xE5, 0x53, 0x71, 0x09, 0xEF, 0x81, 0x97, 0x96, 0x68, 0xA9, 0x3A, 0x3B, - 0x01, 0x20, 0x51, 0xD4, 0x81, 0x4F, 0xA5, 0x2E, 0x6A, 0xF6, 0x95, 0x56, 0xFE, 0x16, 0x26, 0x0A, - 0x41, 0x6A, 0x92, 0x95, 0x28, 0x55, 0x83, 0x28, 0x6B, 0x82, 0xC5, 0x8F, 0x82, 0x84, 0x6C, 0x20, - 0x9A, 0xA9, 0x9A, 0x44, 0x03, 0xD3, 0x33, 0x39, 0x0D, 0x96, 0x50, 0x9D, 0xE6, 0x1D, 0x88, 0xA5, - 0x2D, 0xAD, 0xE0, 0x73, 0x5A, 0xC1, 0x17, 0xF5, 0xA9, 0xC3, 0x92, 0xCA, 0x91, 0xA5, 0x3A, 0xA3, - 0xEC, 0xDE, 0xD1, 0x70, 0x55, 0x7E, 0x24, 0x51, 0x2C, 0x9F, 0x4C, 0xFD, 0xBB, 0xC6, 0x42, 0xFB, - 0xD4, 0xD4, 0xC4, 0xD3, 0x03, 0x22, 0x38, 0xA7, 0xA8, 0x8A, 0xC8, 0xC2, 0xE0, 0x0E, 0x12, 0xE9, - 0xA2, 0xC8, 0x09, 0x81, 0x00, 0xE2, 0x3E, 0x3E, 0xE0, 0xAC, 0x42, 0x6A, 0x0A, 0xEE, 0x83, 0xE2, - 0x88, 0xC6, 0xEE, 0xDA, 0xD0, 0xE2, 0x1D, 0x4D, 0x74, 0x22, 0xAF, 0x94, 0x3A, 0x11, 0x22, 0x75, - 0xF5, 0x02, 0x04, 0x0D, 0x80, 0x37, 0xFC, 0x34, 0x10, 0xCA, 0x8A, 0x70, 0x67, 0xC7, 0x96, 0x49, - 0xEA, 0xC8, 0xD4, 0xA8, 0x1D, 0x50, 0xEA, 0xC9, 0x52, 0x3D, 0xA0, 0x34, 0xD2, 0x0C, 0xD6, 0x51, - 0xF3, 0x25, 0x54, 0xFB, 0xD7, 0x5A, 0x33, 0xCD, 0x68, 0x20, 0x0E, 0x09, 0x50, 0x32, 0xC0, 0xD0, - 0x03, 0xA2, 0x13, 0x35, 0x1E, 0x0C, 0xF9, 0x6C, 0x04, 0xDF, 0x1A, 0x49, 0xA1, 0xFF, 0x44, 0x1E, - 0xA6, 0xBA, 0x99, 0x32, 0x6E, 0x76, 0xBE, 0xA5, 0x54, 0xFD, 0x9C, 0xA8, 0xDA, 0x4D, 0xAB, 0xFA, - 0x25, 0x51, 0x75, 0x55, 0xA9, 0xAA, 0x9F, 0xFD, 0xC2, 0x80, 0xEA, 0x52, 0xF0, 0x8A, 0x54, 0xE7, - 0xD4, 0xF8, 0x9C, 0x5B, 0xE3, 0x4B, 0x5A, 0x0D, 0x99, 0x34, 0x29, 0xCD, 0x6C, 0x94, 0x11, 0x4F, - 0x60, 0x34, 0xD9, 0xC5, 0x7A, 0x26, 0xD9, 0x17, 0x32, 0x01, 0xA0, 0xEF, 0xC2, 0x8D, 0x5D, 0xC7, - 0xF5, 0x27, 0x26, 0x39, 0xC5, 0x51, 0xB7, 0x21, 0xAA, 0x86, 0x95, 0x93, 0x7A, 0x2C, 0x28, 0x82, - 0xEF, 0x51, 0xAA, 0x18, 0xF0, 0xD4, 0x4A, 0xF1, 0xD2, 0x0F, 0xC2, 0x90, 0x54, 0x2A, 0x89, 0x95, - 0x81, 0xD9, 0xAC, 0xD2, 0xC0, 0xC6, 0xDD, 0x17, 0xBB, 0x0C, 0xAE, 0xBB, 0xAA, 0xB7, 0x95, 0x90, - 0x2A, 0x0F, 0xE2, 0xFB, 0x5D, 0x0F, 0x5B, 0xB5, 0xAC, 0x8C, 0xEE, 0xD4, 0xE0, 0x36, 0x33, 0x5A, - 0x5E, 0xFA, 0x06, 0xFD, 0xBA, 0xF2, 0x79, 0xE5, 0x4B, 0x4D, 0xCE, 0x2C, 0xA6, 0xE9, 0xFD, 0x5B, - 0xB4, 0xDE, 0x4C, 0x18, 0x69, 0x53, 0x79, 0xEA, 0xDB, 0xFF, 0xC0, 0x48, 0xA7, 0x9A, 0x25, 0xED, - 0x18, 0xED, 0x71, 0xE3, 0xA5, 0xB3, 0xEC, 0x5A, 0x09, 0x13, 0xD4, 0x9D, 0xD0, 0xB1, 0x17, 0x7C, - 0xB6, 0x60, 0xB7, 0x4A, 0xC4, 0x80, 0xE7, 0x9B, 0xA9, 0xB3, 0x0A, 0xE2, 0x34, 0x65, 0x5F, 0xA8, - 0xED, 0x42, 0xBB, 0xC0, 0x26, 0x6A, 0x86, 0x73, 0x88, 0x16, 0xCB, 0xB3, 0x2D, 0x95, 0x09, 0x90, - 0x6C, 0x87, 0x35, 0x97, 0x17, 0x85, 0x3F, 0x37, 0x6A, 0xFF, 0xA2, 0x6F, 0xC4, 0xB1, 0x91, 0xB6, - 0xD8, 0x1C, 0xDC, 0x35, 0xF4, 0x96, 0x2C, 0x51, 0x27, 0xFD, 0xB9, 0x11, 0xDC, 0xD9, 0x3E, 0x33, - 0xC2, 0x34, 0x9A, 0x99, 0x5A, 0xDD, 0x91, 0xB5, 0x7A, 0xDB, 0x9F, 0xDE, 0xB0, 0x53, 0x61, 0x03, - 0x9E, 0xC3, 0x5A, 0x97, 0x5E, 0xB7, 0x11, 0x80, 0x46, 0x4D, 0xC9, 0x82, 0xC7, 0xF2, 0x0D, 0x85, - 0x9A, 0x2C, 0x5A, 0x02, 0x43, 0x7D, 0xA5, 0x7C, 0x58, 0xFD, 0xC6, 0x40, 0xC4, 0x06, 0x43, 0x65, - 0x13, 0x1E, 0x3A, 0xC7, 0x17, 0xDB, 0x88, 0x87, 0xB5, 0xF3, 0x36, 0xE3, 0x72, 0xBD, 0x22, 0x1B, - 0xF2, 0xB0, 0xC5, 0xBC, 0x36, 0xE5, 0x71, 0x6E, 0xCB, 0xCC, 0xED, 0x6C, 0x64, 0xB2, 0x26, 0x3B, - 0xDA, 0x4E, 0xC7, 0x58, 0x5D, 0x6B, 0xA1, 0xCD, 0x4D, 0x09, 0x3B, 0xFB, 0x0C, 0x24, 0x40, 0x41, - 0xE9, 0x4D, 0xB3, 0x6C, 0xB9, 0x06, 0x2C, 0xEB, 0x74, 0xB3, 0xCC, 0xFF, 0x23, 0xA0, 0x59, 0xE7, - 0x3B, 0x66, 0xFA, 0x4B, 0x55, 0x3C, 0x8A, 0x09, 0x9B, 0xE0, 0xEB, 0x1A, 0x46, 0xDB, 0xA0, 0x5E, - 0xEF, 0x6D, 0x09, 0x1F, 0xFD, 0x00, 0xF8, 0xE8, 0x2F, 0x2F, 0x6E, 0x7F, 0x1E, 0x49, 0x50, 0xF9, - 0x3D, 0x7A, 0xD8, 0xB4, 0xEC, 0x3E, 0x3D, 0x12, 0xC1, 0x72, 0x7B, 0x75, 0x05, 0x9D, 0xB0, 0x5F, - 0x57, 0x66, 0x8B, 0xB4, 0x5B, 0xE5, 0xF1, 0x26, 0xDA, 0x22, 0x1E, 0x5E, 0xA2, 0x2B, 0x0B, 0xE5, - 0x55, 0x29, 0x93, 0xA4, 0x4C, 0x5F, 0x26, 0x4B, 0xC6, 0x02, 0xF6, 0xFE, 0xCA, 0x88, 0x69, 0xF7, - 0xFF, 0x51, 0x1D, 0xE9, 0x0C, 0xF0, 0xE2, 0xF9, 0xA4, 0x3B, 0x4F, 0x84, 0x44, 0xA7, 0x9F, 0x29, - 0x12, 0xAA, 0x35, 0x6F, 0x4B, 0xAC, 0x0A, 0x60, 0xE9, 0x6D, 0x71, 0x24, 0x8A, 0x2F, 0xE7, 0x78, - 0x11, 0x8D, 0x6D, 0xF1, 0x23, 0x46, 0x16, 0x67, 0x85, 0x3B, 0x30, 0xF1, 0xB0, 0x76, 0x67, 0xE2, - 0x53, 0x1C, 0xDC, 0xB9, 0x56, 0xB1, 0x37, 0xD4, 0xE2, 0x18, 0xA9, 0xE4, 0x03, 0x6A, 0x02, 0xC8, - 0x98, 0xFF, 0x02, 0x7C, 0xC5, 0x63, 0x27, 0x79, 0xAF, 0x97, 0x7E, 0xDF, 0xAE, 0xBB, 0x28, 0x4D, - 0xBD, 0x50, 0x27, 0x28, 0xC9, 0x37, 0x9E, 0x28, 0x33, 0x25, 0x9A, 0xAC, 0x89, 0x96, 0x51, 0x43, - 0xA8, 0xA2, 0x5E, 0x93, 0xF2, 0x4A, 0x2B, 0xF4, 0xA5, 0x4D, 0x32, 0x5E, 0xC9, 0xAA, 0x7A, 0xFF, - 0xC5, 0xB0, 0x49, 0x33, 0x9B, 0xF6, 0x70, 0x13, 0x40, 0x48, 0x6D, 0x07, 0x2E, 0x75, 0x40, 0x6E, - 0xAC, 0xE6, 0x3D, 0xA0, 0x97, 0xCA, 0x2C, 0xB9, 0xFB, 0x39, 0xBC, 0x52, 0x38, 0xAB, 0x67, 0x96, - 0x4A, 0x6A, 0x93, 0xB0, 0xE0, 0xB9, 0xD9, 0x95, 0x08, 0xFF, 0xD3, 0x33, 0x4B, 0x3D, 0x4A, 0xBF, - 0x44, 0xDD, 0x91, 0xBD, 0x56, 0x6A, 0x4E, 0xB6, 0x19, 0xC1, 0x95, 0x19, 0x27, 0x71, 0x4D, 0x74, - 0xA5, 0xFE, 0x30, 0xAE, 0x1D, 0xBE, 0xA8, 0xF6, 0x9A, 0xBE, 0x76, 0xAA, 0xC3, 0x2E, 0x6B, 0xB5, - 0xFE, 0x4D, 0x09, 0x78, 0x4E, 0x93, 0xF9, 0xF8, 0xD0, 0x9F, 0xF2, 0x20, 0x65, 0xB1, 0x30, 0xCE, - 0x30, 0x0E, 0xB3, 0x20, 0x8C, 0x6E, 0x46, 0x28, 0xA8, 0xDE, 0x4F, 0x20, 0xD3, 0x00, 0x10, 0x8F, - 0x62, 0x86, 0x29, 0x21, 0x1A, 0xBC, 0xAC, 0x3A, 0xD1, 0x98, 0x65, 0x54, 0x8A, 0xB9, 0xA8, 0xAF, - 0xA4, 0x8C, 0x67, 0x66, 0x25, 0x75, 0x18, 0x33, 0x8D, 0x18, 0x61, 0x37, 0xAB, 0x19, 0x32, 0xE4, - 0xE5, 0x28, 0xD3, 0x98, 0x21, 0xCC, 0x8A, 0x2C, 0x83, 0x86, 0xB2, 0x53, 0x2A, 0x6C, 0xD4, 0xD0, - 0x0D, 0x97, 0x3A, 0x94, 0x0B, 0x34, 0x6E, 0x54, 0x44, 0x1F, 0x19, 0x39, 0xC2, 0x97, 0x8B, 0x56, - 0x88, 0x20, 0xE8, 0x6D, 0x1D, 0x2A, 0x63, 0x0A, 0xDA, 0x3B, 0x04, 0xB6, 0xCB, 0x36, 0x0F, 0xF5, - 0x10, 0x51, 0xD2, 0xEE, 0x51, 0xE4, 0x0C, 0x32, 0x4F, 0xDB, 0x87, 0x72, 0x92, 0x98, 0xCD, 0xFE, - 0x21, 0x30, 0xA5, 0x9C, 0x0D, 0x24, 0x9A, 0x2D, 0x3F, 0xD5, 0x0E, 0x22, 0x89, 0x07, 0xAD, 0x17, - 0xE5, 0xF0, 0xDF, 0x41, 0xAF, 0xD5, 0xCD, 0xE6, 0xDC, 0xAC, 0x25, 0x89, 0x03, 0x91, 0x5C, 0x61, - 0x4D, 0x6D, 0xB1, 0xAE, 0x7E, 0xD8, 0xC8, 0x03, 0xF1, 0x5A, 0xB2, 0xC8, 0xE4, 0x3A, 0xE5, 0x2D, - 0xC4, 0x0E, 0x24, 0xC8, 0xC0, 0x8F, 0x44, 0x28, 0xBC, 0x64, 0xD0, 0x11, 0x22, 0x74, 0xD9, 0xEE, - 0x83, 0xFC, 0x2B, 0x8C, 0x6C, 0xFB, 0xEF, 0x44, 0xFD, 0x36, 0xEA, 0xF5, 0x28, 0x2C, 0x59, 0xA9, - 0xD2, 0xCA, 0xAF, 0xF2, 0xB7, 0xBF, 0x25, 0xEA, 0x78, 0x38, 0x98, 0x7A, 0x0E, 0xDD, 0xB9, 0x28, - 0xD4, 0x0D, 0x71, 0x00, 0xC1, 0xD0, 0x92, 0x2A, 0xA6, 0x71, 0xE8, 0x44, 0x65, 0x11, 0xE9, 0x09, - 0xCB, 0xE2, 0xC7, 0xFA, 0x14, 0xB5, 0x26, 0xD5, 0xE1, 0x3B, 0x4E, 0xC1, 0x8A, 0x71, 0x7C, 0x4B, - 0xAD, 0x16, 0x81, 0x79, 0x83, 0x1E, 0x4C, 0x1F, 0xC1, 0x32, 0x8A, 0x20, 0x80, 0x1A, 0x5B, 0x2D, - 0xC4, 0xA6, 0x34, 0xA2, 0xAF, 0xCA, 0xB0, 0x48, 0x7B, 0x7F, 0xE0, 0x41, 0xBA, 0x53, 0x65, 0xBB, - 0x10, 0x3D, 0xB0, 0x7A, 0x09, 0x35, 0x13, 0x21, 0xD3, 0xB4, 0xFD, 0xBB, 0xB7, 0x81, 0x87, 0xCC, - 0x91, 0x3D, 0x74, 0x76, 0xEA, 0x23, 0x7C, 0x1B, 0xD4, 0xC9, 0x87, 0xBB, 0x77, 0x70, 0xA8, 0x7A, - 0xBB, 0x42, 0x7E, 0x81, 0x3F, 0xFA, 0x44, 0x91, 0xF1, 0x3F, 0xAC, 0x77, 0x6F, 0xE3, 0xB7, 0xDE, - 0x76, 0xD8, 0xC2, 0x7F, 0xE3, 0x3E, 0xD6, 0x91, 0x6D, 0xED, 0xD4, 0x01, 0x21, 0x3B, 0xE3, 0xEC, - 0x8E, 0x46, 0x75, 0x44, 0xB3, 0x8C, 0x93, 0xAF, 0xAE, 0x37, 0x5E, 0xA6, 0x15, 0x97, 0x59, 0x53, - 0xF1, 0xE1, 0x57, 0xF8, 0x5C, 0x47, 0xDC, 0xA7, 0x8B, 0x41, 0x08, 0x49, 0x76, 0x87, 0x43, 0x08, - 0x61, 0x25, 0xF4, 0xAC, 0x00, 0xDA, 0x95, 0xC0, 0x8B, 0xFE, 0xA1, 0x74, 0x0B, 0x6A, 0x1B, 0x9A, - 0xD1, 0x2E, 0x86, 0x8F, 0x17, 0xD5, 0x04, 0x56, 0x3E, 0x8E, 0x47, 0x77, 0x41, 0x30, 0xC9, 0x0C, - 0x4F, 0x17, 0xEA, 0xF1, 0x28, 0xF5, 0xF7, 0x87, 0x2C, 0x48, 0x1D, 0x56, 0x61, 0x1A, 0x43, 0x5F, - 0x4B, 0x6E, 0x90, 0xC2, 0x16, 0x34, 0x06, 0x59, 0xD4, 0x13, 0xDC, 0xA3, 0x66, 0xE0, 0x8E, 0x41, - 0x8D, 0x84, 0xD5, 0x3C, 0xEC, 0x4F, 0x5C, 0xC7, 0xA7, 0x44, 0xD2, 0x67, 0x6E, 0x78, 0x46, 0x06, - 0xB4, 0xDF, 0xFF, 0xC8, 0x72, 0x28, 0x90, 0xED, 0x83, 0x4B, 0x17, 0xFF, 0x57, 0xC5, 0x07, 0x72, - 0x69, 0x47, 0xEE, 0x7E, 0xCE, 0x62, 0x2A, 0x4B, 0x9D, 0x70, 0x74, 0xF9, 0xA1, 0x0A, 0x37, 0x4F, - 0xBD, 0x92, 0x90, 0x6F, 0xF7, 0x26, 0x30, 0x6D, 0x22, 0x86, 0x42, 0xB9, 0x56, 0xC6, 0xB5, 0xF5, - 0x54, 0x39, 0x67, 0xD1, 0xB7, 0x51, 0x05, 0x55, 0x44, 0x85, 0x31, 0xE6, 0xB5, 0x16, 0x33, 0xC2, - 0x61, 0xC6, 0xAB, 0x9F, 0x38, 0xC8, 0x69, 0x5C, 0x20, 0xE3, 0x2B, 0x74, 0x3D, 0x7F, 0xAC, 0xF6, - 0xD8, 0x7B, 0x0B, 0x99, 0xE3, 0x05, 0x75, 0x8A, 0x8E, 0x19, 0xAB, 0x9B, 0x33, 0x6E, 0xEC, 0x95, - 0x9F, 0x9F, 0x3B, 0x76, 0xFC, 0x8D, 0xF2, 0x17, 0x30, 0x7E, 0x09, 0x6E, 0xE4, 0x8F, 0xA1, 0x30, - 0xC5, 0x0F, 0xDC, 0x07, 0x07, 0x8E, 0xDD, 0x71, 0xEA, 0x08, 0xEE, 0xB7, 0x0A, 0xF3, 0xB6, 0x78, - 0x26, 0x02, 0x80, 0x78, 0x7C, 0x20, 0x18, 0x95, 0x18, 0x5A, 0x87, 0xDA, 0x11, 0xCE, 0x6F, 0x29, - 0xB0, 0x7E, 0xE8, 0x11, 0x5B, 0x19, 0xA8, 0xB4, 0x9B, 0x85, 0x52, 0x66, 0xA7, 0x88, 0xAD, 0xEA, - 0xC0, 0xF6, 0x23, 0x96, 0x8B, 0x80, 0x30, 0xB3, 0x0F, 0x09, 0x7A, 0x20, 0x55, 0x06, 0xD1, 0x05, - 0x50, 0x22, 0x67, 0xF8, 0x89, 0xAA, 0x0A, 0xD2, 0x2B, 0xC2, 0xDC, 0xD1, 0x53, 0xDF, 0xE4, 0x8B, - 0x74, 0x6C, 0x2F, 0x9B, 0x7A, 0xA3, 0xC0, 0x1D, 0x40, 0x8A, 0x74, 0x22, 0x6D, 0x2B, 0x00, 0xE2, - 0x5F, 0x29, 0xF9, 0x60, 0x32, 0x94, 0xB8, 0xF9, 0x35, 0x06, 0x0F, 0x99, 0xB5, 0xC1, 0x8C, 0xF8, - 0x17, 0x93, 0x52, 0xB3, 0x63, 0xF1, 0x61, 0xE0, 0x62, 0x2C, 0x26, 0x73, 0x89, 0xC0, 0x73, 0x9E, - 0x12, 0xA5, 0x4A, 0x6A, 0xB7, 0x43, 0xCB, 0x64, 0xFB, 0xCE, 0xC3, 0xB7, 0x90, 0xB8, 0x3B, 0xAC, - 0x16, 0x7A, 0xC6, 0x47, 0xB8, 0xE0, 0x59, 0x8D, 0x94, 0xD1, 0x0F, 0x97, 0x3D, 0xC1, 0xD4, 0x12, - 0x2E, 0xB2, 0xE5, 0x07, 0x3F, 0x2D, 0x01, 0x05, 0x9C, 0x0F, 0x62, 0xA8, 0x52, 0x0A, 0x0A, 0x27, - 0x91, 0x80, 0x22, 0xAE, 0x08, 0x49, 0x28, 0xA2, 0xE8, 0x8F, 0x68, 0x65, 0x8A, 0x56, 0xFC, 0x38, - 0x36, 0x24, 0x4F, 0xC2, 0xB1, 0x9C, 0x1A, 0x65, 0x5E, 0xF2, 0xFD, 0x2A, 0xCD, 0x66, 0x9C, 0x18, - 0xF7, 0x70, 0xFF, 0x0E, 0xAF, 0xAA, 0xD3, 0xD5, 0x9D, 0x1B, 0x8F, 0x13, 0x0A, 0x51, 0x94, 0x2C, - 0xF5, 0xB0, 0x26, 0x38, 0x62, 0xEA, 0x80, 0x6B, 0x53, 0xBB, 0x17, 0x97, 0xCC, 0xC7, 0x84, 0x40, - 0xD2, 0xBE, 0xD4, 0xB6, 0x0B, 0xAB, 0xCE, 0x4C, 0xDD, 0x19, 0x11, 0x92, 0xAF, 0x31, 0x85, 0xBE, - 0xAF, 0xAC, 0x5C, 0xE0, 0x5B, 0xA2, 0x22, 0xEF, 0x58, 0xDE, 0xA1, 0xE8, 0x4A, 0x2D, 0x73, 0x67, - 0x21, 0x6D, 0x94, 0x65, 0xC1, 0x67, 0x29, 0x80, 0xA4, 0x49, 0xAF, 0x24, 0x35, 0x82, 0x5F, 0x3B, - 0x73, 0xC9, 0x63, 0xC4, 0x20, 0x55, 0x4C, 0x5D, 0xC4, 0x08, 0xD5, 0x04, 0x99, 0x4C, 0x3C, 0x77, - 0x08, 0xCF, 0x7E, 0x11, 0xC0, 0xE1, 0xAF, 0x1F, 0x4C, 0xC7, 0x1A, 0x61, 0x4F, 0x66, 0x2C, 0x85, - 0x92, 0x6C, 0x4E, 0x35, 0x0C, 0xBC, 0x38, 0xC4, 0x32, 0x01, 0x95, 0x69, 0x4A, 0xEF, 0x40, 0x6B, - 0xFC, 0xE1, 0xA2, 0x32, 0x0D, 0xCD, 0x1B, 0xD7, 0x83, 0xEB, 0x58, 0xFA, 0xDF, 0xF4, 0x86, 0x4A, - 0xB6, 0xA6, 0xCC, 0x3C, 0x4D, 0x42, 0x92, 0x3B, 0x85, 0x0B, 0x61, 0x56, 0x9D, 0x78, 0x70, 0x27, - 0xD8, 0x1B, 0xB0, 0xD8, 0x10, 0x56, 0xD6, 0x1E, 0xD1, 0x0C, 0x3C, 0x68, 0x05, 0xB1, 0x3F, 0x03, - 0x37, 0x80, 0x83, 0xDE, 0x5F, 0xC1, 0x8C, 0x2D, 0x24, 0x27, 0xE2, 0x60, 0xF7, 0x4C, 0x4F, 0xB0, - 0x7C, 0x9E, 0x9A, 0xC1, 0x5D, 0xDB, 0x73, 0xA7, 0x84, 0x1A, 0x0E, 0x56, 0x78, 0xA1, 0x72, 0x2A, - 0xA4, 0x77, 0x52, 0x36, 0x27, 0x9A, 0x76, 0x30, 0xD5, 0xFE, 0x0F, 0x17, 0x48, 0x6C, 0xC5, 0x0F, - 0xFB, 0xD0, 0x33, 0x3F, 0x27, 0xF9, 0x1D, 0xE4, 0x69, 0x30, 0x12, 0xF9, 0x1D, 0xD3, 0xF1, 0xD4, - 0x84, 0xC7, 0x83, 0x5A, 0xE8, 0x01, 0xDC, 0x8F, 0x9D, 0x21, 0x13, 0x6F, 0xB2, 0x89, 0xA0, 0x32, - 0xFD, 0x44, 0x86, 0x65, 0x5C, 0xD3, 0xE4, 0xB5, 0x57, 0x64, 0x42, 0x66, 0x64, 0x1E, 0x5E, 0x96, - 0x60, 0x0A, 0x45, 0x19, 0xA6, 0xF2, 0x18, 0x19, 0x5A, 0x06, 0xE7, 0x31, 0xC1, 0xE9, 0xB7, 0x48, - 0x89, 0x43, 0x7E, 0x28, 0x66, 0x7B, 0xDA, 0x7B, 0x3A, 0xB6, 0xCA, 0x52, 0x2D, 0xF0, 0x43, 0x94, - 0xF3, 0x4A, 0xCC, 0x38, 0x32, 0x09, 0x91, 0x96, 0x0C, 0x54, 0x9C, 0x03, 0x95, 0x80, 0xEE, 0x02, - 0x00, 0x0E, 0x35, 0x06, 0x1B, 0x0C, 0x78, 0x16, 0x86, 0x3D, 0x58, 0x37, 0x1B, 0xEA, 0xC3, 0x69, - 0x2C, 0xAE, 0xF1, 0x72, 0x50, 0x28, 0x3B, 0x04, 0x33, 0x81, 0x46, 0x10, 0x65, 0xEF, 0x0B, 0xED, - 0x39, 0x8F, 0xD9, 0x6C, 0x53, 0x5A, 0x84, 0x7D, 0x8B, 0x8A, 0x21, 0xDA, 0x5E, 0xCC, 0xA4, 0xB9, - 0xB5, 0xB6, 0xA9, 0x5B, 0xBF, 0x49, 0x7D, 0x96, 0x4E, 0x23, 0xA7, 0x4B, 0x45, 0xD2, 0x7C, 0x44, - 0x5D, 0xD2, 0x25, 0xE8, 0xC8, 0xEE, 0x52, 0x5A, 0x4A, 0x8F, 0xA1, 0x58, 0x5C, 0xB0, 0x4B, 0x53, - 0x6B, 0x92, 0xD5, 0x99, 0x2B, 0xAB, 0x44, 0x67, 0xA6, 0x56, 0x4A, 0x1C, 0x7E, 0x46, 0x77, 0x52, - 0xDB, 0x44, 0xF2, 0x67, 0xE9, 0x3B, 0xD4, 0x31, 0x3A, 0x1D, 0x6D, 0xBE, 0xD3, 0xC0, 0x1E, 0xD1, - 0x6C, 0x8E, 0xD8, 0xF1, 0xE9, 0x56, 0x34, 0x73, 0xAC, 0x94, 0xBA, 0x45, 0x7A, 0x39, 0x21, 0x5B, - 0xE0, 0x13, 0xBA, 0xBB, 0x29, 0xDC, 0xC9, 0xF4, 0x26, 0x92, 0x97, 0xC2, 0xDD, 0x60, 0x72, 0x18, - 0xDC, 0x61, 0xCF, 0xC1, 0x41, 0x92, 0x5E, 0x5E, 0x70, 0xF0, 0x61, 0xBF, 0x97, 0x4D, 0xA5, 0x90, - 0xF9, 0xEA, 0xB8, 0x27, 0xF3, 0x36, 0x84, 0x9E, 0x49, 0xB2, 0x90, 0x91, 0x2A, 0xBF, 0xBD, 0x48, - 0x3F, 0x29, 0x80, 0x08, 0x2D, 0xEA, 0x92, 0x24, 0x6F, 0xDE, 0x15, 0xEF, 0x35, 0xF8, 0xF6, 0x60, - 0xDF, 0xDA, 0x67, 0xAC, 0x41, 0xE1, 0x17, 0x87, 0x84, 0x36, 0xDF, 0xEA, 0xF0, 0xE2, 0x60, 0x54, - 0xF6, 0xE7, 0x9D, 0x7E, 0x5F, 0xDD, 0xEB, 0x2B, 0xDB, 0x53, 0x11, 0x61, 0xDA, 0xEE, 0x14, 0x98, - 0x2D, 0xD6, 0x83, 0x0D, 0xA8, 0xF2, 0x5E, 0xAD, 0xD1, 0x54, 0xA2, 0x67, 0xA5, 0x17, 0x02, 0x25, - 0x73, 0x29, 0x2D, 0xD3, 0x3D, 0xBF, 0x78, 0x86, 0x1F, 0xC2, 0x54, 0x92, 0xD2, 0x38, 0x2B, 0x0C, - 0x54, 0xAF, 0xA1, 0x60, 0x60, 0x4E, 0xFD, 0x21, 0xBB, 0x78, 0xAB, 0x87, 0x69, 0x14, 0xF7, 0x39, - 0x44, 0x52, 0x02, 0xF9, 0x39, 0x3F, 0xD9, 0x47, 0x36, 0x5D, 0xB2, 0x20, 0x1C, 0x0B, 0x8F, 0x27, - 0xC1, 0x93, 0x38, 0xA1, 0x34, 0x5B, 0x79, 0x9E, 0x57, 0x60, 0x5F, 0x21, 0x2C, 0xCD, 0x17, 0x80, - 0x13, 0x91, 0x8A, 0x9F, 0x08, 0x8A, 0x03, 0xC1, 0x46, 0xF0, 0x2E, 0xB7, 0x8B, 0x80, 0x9A, 0x9A, - 0x92, 0xDD, 0x16, 0x46, 0x9F, 0xA7, 0x34, 0x04, 0x7B, 0x82, 0x60, 0x0B, 0x21, 0x67, 0x63, 0xB2, - 0xA7, 0x42, 0x83, 0xA9, 0xE7, 0xC1, 0x4E, 0x83, 0x76, 0x05, 0xC6, 0x95, 0xDE, 0x0C, 0xF6, 0x3E, - 0xF9, 0xB1, 0x40, 0x8D, 0x7C, 0xBE, 0x9E, 0x56, 0x93, 0x9D, 0x0C, 0x31, 0x11, 0x40, 0xA7, 0x49, - 0x89, 0x40, 0xFC, 0xD2, 0x8E, 0xD8, 0x20, 0x3E, 0xAF, 0xB4, 0xE0, 0x2C, 0xA3, 0x94, 0x84, 0xDE, - 0x4D, 0xA4, 0x50, 0x1A, 0x00, 0x59, 0x23, 0x5D, 0xEC, 0x0B, 0x23, 0xA0, 0xCE, 0xF2, 0x14, 0x12, - 0x12, 0x4D, 0x5B, 0x50, 0x3B, 0x44, 0x23, 0x3D, 0x0D, 0x9A, 0xD7, 0x90, 0x8E, 0x54, 0x2B, 0x1C, - 0x10, 0xA5, 0xB6, 0x2A, 0xBC, 0x90, 0x65, 0x32, 0x74, 0x25, 0x15, 0xF3, 0xBC, 0x86, 0xE5, 0xD4, - 0x9A, 0x41, 0xDA, 0xBF, 0xE1, 0x87, 0xCF, 0x10, 0x58, 0x53, 0x9B, 0xC0, 0x52, 0x2A, 0x8F, 0xDD, - 0x2A, 0x05, 0x7C, 0xDA, 0x54, 0xC2, 0x09, 0xA2, 0x74, 0x09, 0x85, 0x69, 0x25, 0x02, 0x5C, 0x37, - 0xF3, 0xA4, 0x84, 0xB8, 0x29, 0x28, 0x9B, 0x49, 0x03, 0x48, 0x6D, 0x1F, 0xDA, 0x51, 0x39, 0xE7, - 0x64, 0x81, 0x38, 0xA5, 0xB4, 0x8F, 0x1C, 0x37, 0x73, 0xA7, 0x0F, 0x27, 0x34, 0x4A, 0xA5, 0x8A, - 0xC8, 0xCA, 0xE7, 0xD3, 0x95, 0x69, 0x5B, 0x51, 0xB6, 0x11, 0x8E, 0x8F, 0xAC, 0x46, 0xE3, 0x56, - 0xFE, 0x5B, 0xEA, 0x5F, 0x2A, 0x4E, 0xE1, 0x79, 0x03, 0xA5, 0x3D, 0x7B, 0xDE, 0xE0, 0xE2, 0xE2, - 0xFC, 0xA2, 0x56, 0x4D, 0x0B, 0x11, 0x76, 0xB0, 0x95, 0x9B, 0x46, 0xDB, 0x9A, 0xF7, 0x64, 0xEB, - 0xC9, 0x2C, 0xF7, 0xDB, 0xCA, 0x5A, 0x65, 0xD9, 0xF7, 0xEF, 0x71, 0x20, 0x29, 0x1F, 0x79, 0x0F, - 0x90, 0xAB, 0x9F, 0x14, 0xF7, 0x23, 0x59, 0xCD, 0x49, 0xD9, 0x9F, 0x74, 0x9D, 0xDC, 0xBF, 0xBA, - 0xB8, 0x38, 0x3C, 0xBB, 0xD4, 0x75, 0x33, 0xB5, 0x87, 0x91, 0x8C, 0x13, 0x35, 0x3B, 0x9D, 0x80, - 0xAE, 0x03, 0xDF, 0x84, 0x67, 0xEF, 0x9B, 0xA8, 0xC2, 0x55, 0x3C, 0xEA, 0x5E, 0x9D, 0x3A, 0x59, - 0x10, 0x42, 0xEF, 0x6B, 0xD4, 0x2B, 0x53, 0xE2, 0xC3, 0x76, 0x26, 0x20, 0x3D, 0x35, 0x72, 0x8A, - 0x60, 0x80, 0xDE, 0x4B, 0x3B, 0x57, 0xE9, 0xE5, 0x50, 0x6E, 0x24, 0x48, 0x23, 0x4F, 0x02, 0xA6, - 0x63, 0x9D, 0x62, 0xF4, 0x57, 0x27, 0xF4, 0x33, 0xAE, 0xA5, 0x3F, 0x7F, 0x7C, 0xB5, 0x0B, 0x74, - 0xA1, 0xE9, 0x9E, 0x90, 0xEE, 0xE4, 0x50, 0x90, 0xFE, 0xBF, 0xE7, 0x89, 0x87, 0xC1, 0x2E, 0x74, - 0x2B, 0x74, 0xEF, 0x8F, 0x65, 0x5C, 0x5E, 0xC6, 0x35, 0x4B, 0xA5, 0x2C, 0x9A, 0x8B, 0x5E, 0x28, - 0x65, 0x6C, 0xDA, 0x65, 0x52, 0x21, 0x48, 0xB7, 0x48, 0x0E, 0x19, 0x5C, 0x71, 0x4A, 0x09, 0xEE, - 0x06, 0xA1, 0xEB, 0x22, 0x28, 0xCC, 0x4E, 0x2D, 0x35, 0xA3, 0xBC, 0x96, 0x94, 0xA6, 0x56, 0x15, - 0x87, 0xD0, 0x92, 0x6B, 0xCC, 0x82, 0xA6, 0x56, 0x9E, 0x4E, 0xA7, 0xDA, 0x20, 0x64, 0x83, 0x2C, - 0xF5, 0xD2, 0x03, 0x0F, 0xF2, 0xB1, 0xC7, 0x0D, 0xCC, 0x10, 0x3B, 0x4F, 0xA3, 0xCE, 0x4D, 0x65, - 0xA1, 0x09, 0x47, 0xBB, 0xD1, 0x48, 0xE3, 0x53, 0xF1, 0xE9, 0xA9, 0x60, 0x61, 0xB6, 0x3B, 0x35, - 0x9D, 0x7A, 0x51, 0x1D, 0xAD, 0x00, 0x13, 0xEE, 0x11, 0x54, 0x34, 0x3B, 0x09, 0xFB, 0x9F, 0xF2, - 0x5A, 0x83, 0xE4, 0xFA, 0xF7, 0xDE, 0xBE, 0xC7, 0x0E, 0x32, 0xE1, 0xD9, 0x0F, 0xAF, 0xEE, 0xF3, - 0x94, 0x1B, 0xC0, 0xCC, 0x27, 0x58, 0x89, 0xC8, 0x30, 0x3B, 0x81, 0x7D, 0xCB, 0x12, 0x5F, 0x80, - 0x37, 0x05, 0x55, 0x11, 0xFC, 0xFC, 0x04, 0xDF, 0x62, 0x47, 0x39, 0x64, 0x3B, 0xE8, 0xE0, 0xA0, - 0x6D, 0x85, 0x3F, 0xD4, 0xB6, 0x6D, 0x0A, 0xCE, 0x81, 0x21, 0xAC, 0x63, 0xD0, 0x15, 0x90, 0xB1, - 0xB7, 0x01, 0x38, 0x0F, 0x1D, 0x82, 0x4A, 0x3E, 0x8B, 0x86, 0x10, 0xA3, 0x8A, 0xA4, 0xFB, 0x72, - 0xAE, 0x5F, 0xBF, 0xBD, 0x7F, 0x7E, 0x7E, 0x71, 0x70, 0x7C, 0xB6, 0x7B, 0x79, 0x78, 0x7D, 0x7C, - 0xD6, 0xBB, 0xBA, 0xBC, 0xBE, 0xFC, 0xDC, 0x83, 0x5F, 0x3F, 0xEE, 0x9E, 0x1C, 0x1F, 0x5C, 0x5F, - 0x9D, 0xFD, 0x72, 0x76, 0xFE, 0xE9, 0x2C, 0xB6, 0x9F, 0x5B, 0xA6, 0x7F, 0x27, 0x84, 0x68, 0x45, - 0xEA, 0x11, 0x1C, 0x19, 0x35, 0xDF, 0x2D, 0x3C, 0xB0, 0xC7, 0xE6, 0x48, 0x53, 0xC2, 0x54, 0xD5, - 0xF9, 0xED, 0x09, 0xA6, 0x39, 0xFC, 0xD5, 0x8B, 0x44, 0xA2, 0x3C, 0xC8, 0x76, 0x2A, 0x80, 0x54, - 0xD1, 0x11, 0x5F, 0x58, 0x6A, 0x5B, 0x08, 0xF9, 0x01, 0xF1, 0x42, 0x0F, 0x77, 0x26, 0x5D, 0xAE, - 0x86, 0x94, 0xF1, 0x84, 0xC7, 0x53, 0x3F, 0xD2, 0xCA, 0x03, 0xD3, 0x41, 0x18, 0x18, 0x42, 0x55, - 0xA6, 0xED, 0x90, 0xC1, 0x27, 0x7A, 0x0E, 0xC2, 0xB8, 0x7C, 0x5E, 0x65, 0x17, 0xB1, 0x6F, 0xAC, - 0x16, 0x3C, 0x76, 0x41, 0x13, 0xAF, 0xB0, 0x2B, 0x47, 0xBF, 0x85, 0x96, 0x5B, 0xE0, 0xC5, 0xD4, - 0xA2, 0xC3, 0xD4, 0x96, 0xAF, 0xD5, 0xC4, 0x27, 0x7E, 0x43, 0xC6, 0xAB, 0xAA, 0x57, 0x8E, 0x57, - 0xF1, 0x2D, 0x7B, 0x68, 0x07, 0xF1, 0x30, 0x11, 0xED, 0x9A, 0x1A, 0xBD, 0x00, 0x0D, 0x64, 0xB6, - 0xD1, 0x05, 0x5D, 0xCB, 0xAF, 0xA5, 0xA5, 0xAC, 0xF4, 0x9F, 0x22, 0x3A, 0x80, 0x52, 0x5F, 0xAE, - 0x37, 0xE3, 0x01, 0x24, 0x47, 0x79, 0x60, 0xC3, 0x68, 0x84, 0x86, 0xAE, 0x6B, 0x15, 0x68, 0x8D, - 0x48, 0xEB, 0x78, 0x9C, 0x4B, 0x37, 0x6F, 0x03, 0x72, 0xA1, 0x5F, 0x59, 0x00, 0x42, 0xBB, 0x42, - 0x25, 0x61, 0xE5, 0x57, 0xCF, 0xF4, 0xC0, 0x42, 0xC4, 0x08, 0x5C, 0x1C, 0x7C, 0x49, 0x04, 0x68, - 0x24, 0x9F, 0x7C, 0xCF, 0x45, 0xB6, 0xEF, 0x20, 0x44, 0x13, 0xD7, 0xF7, 0x6D, 0xF0, 0xB2, 0x62, - 0x52, 0x01, 0xF3, 0x34, 0x94, 0x97, 0x78, 0x4A, 0xC6, 0x1F, 0x4E, 0x4F, 0xDB, 0x63, 0xF6, 0x13, - 0x7F, 0x43, 0xBA, 0x8F, 0xCB, 0xBA, 0x8F, 0xA7, 0xA7, 0xFD, 0x7E, 0xDB, 0xA7, 0x3F, 0x52, 0x73, - 0xA4, 0xF9, 0x4C, 0x00, 0x2C, 0xC7, 0x9F, 0x5F, 0x69, 0xE5, 0xE4, 0x1D, 0x84, 0x87, 0xCC, 0xCE, - 0xB9, 0xFF, 0x07, 0xAE, 0x67, 0x8E, 0xDB, 0x46, 0x6B, 0x64, 0xB6, 0x6D, 0x19, 0xAB, 0xAB, 0x6B, - 0xAF, 0x69, 0xC2, 0x1B, 0xCA, 0xBF, 0x76, 0xEC, 0xF7, 0x16, 0xCF, 0xF8, 0x77, 0xA8, 0x3B, 0x0F, - 0xC4, 0xE7, 0x30, 0xFF, 0x0C, 0x1A, 0x84, 0x49, 0x66, 0x5A, 0x17, 0xDE, 0x3C, 0x77, 0x1F, 0xB0, - 0x05, 0x84, 0x20, 0x63, 0x1D, 0x75, 0xD7, 0xDB, 0x5D, 0x63, 0x6D, 0x4B, 0x43, 0x4A, 0xAC, 0x93, - 0xDE, 0xA1, 0xD5, 0x39, 0x53, 0xD2, 0xA5, 0xC4, 0xAC, 0xC6, 0xC4, 0x2C, 0x77, 0x8C, 0xF5, 0xE5, - 0x4E, 0x67, 0xD9, 0x58, 0x6F, 0x77, 0x36, 0xBA, 0x3A, 0x72, 0xF4, 0x9A, 0xED, 0x1D, 0xB8, 0x8E, - 0xCE, 0x89, 0xB4, 0xD7, 0x40, 0xD3, 0x2D, 0x7E, 0xC0, 0x1E, 0xA3, 0xA7, 0xD3, 0x01, 0x6A, 0x36, - 0x37, 0xB7, 0xB6, 0xBA, 0xA8, 0x71, 0xC0, 0x24, 0x0B, 0xAA, 0xB0, 0xDF, 0x9A, 0x11, 0x8D, 0xF1, - 0x76, 0xD6, 0xC1, 0x43, 0x33, 0x20, 0x7A, 0xB3, 0x6F, 0x0F, 0x1D, 0x79, 0xF7, 0x20, 0xCF, 0x5D, - 0x23, 0x56, 0x1C, 0xB1, 0x96, 0x8A, 0x8A, 0xD9, 0xBE, 0x0B, 0xDC, 0x35, 0x77, 0x05, 0xE5, 0xD6, - 0x02, 0xD6, 0x81, 0x47, 0x25, 0xBD, 0x5E, 0x02, 0x9F, 0x4E, 0xA2, 0xBC, 0x28, 0x2B, 0x98, 0xFA, - 0x88, 0x3D, 0xB8, 0x65, 0x22, 0xE4, 0x28, 0x9C, 0x68, 0x50, 0x97, 0x97, 0x01, 0x10, 0x64, 0xAE, - 0x8A, 0xC7, 0x99, 0x68, 0x6B, 0x58, 0x33, 0x6D, 0x87, 0xA5, 0x82, 0xA5, 0x25, 0x98, 0x69, 0x70, - 0x96, 0xF0, 0x8A, 0x46, 0x80, 0x72, 0xA4, 0x21, 0x1A, 0xE4, 0x13, 0x3C, 0xAA, 0x39, 0x4A, 0x94, - 0x63, 0xA6, 0x68, 0xFF, 0xF2, 0x17, 0x51, 0xA2, 0xE2, 0x6F, 0x29, 0xE3, 0xBA, 0x43, 0x7D, 0x82, - 0x21, 0x45, 0x7D, 0x6A, 0xF9, 0x46, 0xB3, 0xD9, 0x84, 0x97, 0x8E, 0x12, 0x33, 0x5E, 0x7C, 0x3C, - 0xA8, 0xFA, 0x5A, 0xCD, 0xE0, 0x0A, 0x0E, 0x00, 0x2C, 0xDA, 0x95, 0xDE, 0xF4, 0x30, 0xE7, 0x70, - 0x7A, 0xFF, 0x49, 0xD8, 0xEB, 0x0C, 0xC2, 0x18, 0xA4, 0x78, 0xC3, 0x40, 0x87, 0x89, 0x6C, 0x3E, - 0x11, 0x97, 0x1B, 0x09, 0x0A, 0xD7, 0x2F, 0x32, 0x08, 0x01, 0x34, 0x0B, 0x3E, 0x32, 0x44, 0x18, - 0xF1, 0xC2, 0x17, 0x57, 0x5B, 0xDE, 0x89, 0x54, 0x15, 0xBB, 0xE8, 0x95, 0x02, 0x96, 0x68, 0xEE, - 0x3C, 0xDB, 0x99, 0x06, 0xD4, 0x1D, 0x24, 0x03, 0x51, 0x84, 0xE6, 0xF4, 0x54, 0x74, 0x9D, 0x3D, - 0xB2, 0xC9, 0x12, 0x4D, 0x96, 0x17, 0x69, 0xC9, 0x8D, 0x17, 0x66, 0xEA, 0xB2, 0x7E, 0x7E, 0xDB, - 0xA0, 0x0B, 0x10, 0x19, 0x8D, 0xE5, 0x8E, 0x6A, 0xD7, 0x9E, 0x95, 0xF5, 0xD7, 0x67, 0xE7, 0xD7, - 0x07, 0x87, 0xFB, 0xC7, 0xA7, 0xBB, 0x27, 0xCA, 0x28, 0xF8, 0x98, 0x2C, 0x40, 0x16, 0x74, 0x2B, - 0xA2, 0x47, 0x61, 0xB7, 0x28, 0x0E, 0xEC, 0x70, 0xC5, 0x5A, 0x68, 0x59, 0x16, 0x4F, 0x28, 0x91, - 0xD1, 0x62, 0x93, 0x90, 0x8F, 0x7F, 0x8D, 0xF8, 0xC5, 0x1B, 0x10, 0x96, 0x09, 0x0F, 0x55, 0x69, - 0xB6, 0x56, 0x21, 0xB2, 0xA5, 0x18, 0xC8, 0x0A, 0xDA, 0x20, 0x4B, 0x00, 0x0D, 0x5D, 0x0B, 0x71, - 0xAC, 0xA0, 0xD5, 0x0D, 0x08, 0xDA, 0x6E, 0xCA, 0x41, 0x14, 0xF2, 0x4C, 0xD6, 0xEF, 0x6B, 0x74, - 0x68, 0xFF, 0x0A, 0xC3, 0xA1, 0x0F, 0xC8, 0x8C, 0x36, 0x12, 0xCA, 0x04, 0x85, 0xB9, 0x28, 0x4F, - 0x4F, 0x3A, 0x3B, 0x53, 0x27, 0xDF, 0x3A, 0xCC, 0xCD, 0xD4, 0xD2, 0xB5, 0x68, 0x66, 0x4A, 0xEB, - 0xF3, 0xFC, 0x26, 0x66, 0xC1, 0x69, 0x19, 0xCF, 0x47, 0x49, 0x3E, 0x52, 0x26, 0xA3, 0x3A, 0x31, - 0xCA, 0x4E, 0xBF, 0xD4, 0xC9, 0xA7, 0x97, 0x52, 0x89, 0x35, 0xD4, 0xC1, 0x93, 0x37, 0xD0, 0x00, - 0xD6, 0x8B, 0x68, 0x59, 0x91, 0x5B, 0xA8, 0x74, 0xC9, 0xE2, 0x25, 0xC9, 0x52, 0x87, 0x49, 0xC3, - 0xF2, 0x82, 0xC4, 0xE1, 0xFA, 0xF4, 0xF4, 0xFA, 0x60, 0xB7, 0xFF, 0x41, 0x11, 0x0A, 0xEE, 0xD6, - 0x14, 0xAB, 0x2C, 0x1E, 0x9F, 0xB0, 0xAC, 0xC6, 0xAF, 0xC4, 0x12, 0xC0, 0xD5, 0x38, 0xB4, 0x84, - 0x14, 0x01, 0xF1, 0x70, 0xA5, 0x0C, 0xAC, 0x58, 0xBF, 0xF3, 0x4D, 0x50, 0xA4, 0x89, 0xB1, 0x7D, - 0x51, 0x43, 0x95, 0x3E, 0x52, 0xDD, 0x68, 0xA4, 0xC2, 0x7D, 0xF1, 0xDC, 0x47, 0x8A, 0x28, 0xF6, - 0x17, 0x36, 0x58, 0x2F, 0x66, 0xD5, 0x13, 0xD8, 0x53, 0x64, 0xF1, 0x13, 0x3B, 0xD4, 0x8D, 0x3B, - 0x94, 0x5C, 0xFD, 0x7E, 0xDB, 0x4B, 0x13, 0x13, 0xC9, 0xD8, 0x70, 0x33, 0x57, 0x89, 0xDC, 0xCE, - 0x61, 0x52, 0xAC, 0xBA, 0x7F, 0x52, 0xF7, 0xB9, 0xEE, 0x44, 0x8B, 0xD3, 0x9D, 0x05, 0x67, 0x22, - 0xFA, 0x43, 0x6D, 0xA6, 0x8F, 0x52, 0x37, 0x1A, 0x25, 0xB4, 0x98, 0xB3, 0x08, 0x53, 0x0D, 0x2F, - 0x68, 0xA8, 0x5E, 0x9A, 0xD2, 0xFC, 0xDF, 0xA5, 0x2F, 0xB9, 0x09, 0x4B, 0xBA, 0x0B, 0xD2, 0x34, - 0x67, 0xD7, 0x41, 0x9A, 0x82, 0x28, 0x61, 0xC5, 0x56, 0x53, 0x09, 0xD1, 0xD4, 0x0C, 0x46, 0xF8, - 0xA0, 0x71, 0x68, 0x8A, 0x17, 0x6C, 0xEA, 0x60, 0xC6, 0x8D, 0x43, 0x19, 0x5B, 0xC8, 0x9D, 0x06, - 0xF0, 0x87, 0xC9, 0xED, 0xF4, 0xA4, 0x51, 0xDF, 0x95, 0xAD, 0xEE, 0x60, 0x42, 0xBE, 0x21, 0xBC, - 0x1A, 0x63, 0x54, 0x57, 0x26, 0x4C, 0xBD, 0x85, 0x70, 0x30, 0x90, 0x1E, 0x38, 0x06, 0xBA, 0x29, - 0x1D, 0x02, 0x5D, 0x2D, 0x9D, 0xC0, 0xE8, 0x2D, 0xF4, 0xDC, 0x5C, 0x29, 0x5C, 0x2D, 0xB2, 0xC0, - 0x06, 0x8D, 0xBC, 0x15, 0x17, 0xB8, 0xA6, 0x76, 0x52, 0xC7, 0xF2, 0x15, 0x7F, 0x6B, 0x0A, 0x6C, - 0x56, 0xEF, 0x67, 0x45, 0x32, 0xF4, 0xB7, 0x5B, 0x33, 0x92, 0x79, 0x2D, 0x9C, 0x73, 0xC8, 0x59, - 0x6D, 0x46, 0x68, 0x73, 0x05, 0x16, 0x6E, 0xD8, 0xE7, 0x0C, 0xB2, 0xFF, 0xF9, 0x74, 0xEF, 0xFC, - 0x84, 0x02, 0x55, 0x23, 0x46, 0x46, 0xAE, 0x33, 0xA4, 0xA9, 0x2A, 0x0E, 0xF0, 0xD0, 0xC3, 0xAA, - 0x45, 0x24, 0x31, 0x12, 0xCA, 0xD0, 0x92, 0x03, 0x99, 0x0A, 0x40, 0x5B, 0x8F, 0x4C, 0xD6, 0x0D, - 0x63, 0x5B, 0x49, 0xBC, 0x14, 0x95, 0xBE, 0x45, 0xA9, 0x7A, 0x2F, 0x9C, 0xE6, 0x7A, 0xB9, 0x1A, - 0x24, 0xA7, 0xED, 0xEB, 0x66, 0x22, 0xC1, 0xD3, 0x8C, 0xC3, 0x9B, 0x46, 0x5A, 0x34, 0x85, 0x12, - 0x2C, 0x5C, 0x22, 0xB3, 0x8A, 0x6A, 0x97, 0xB0, 0xEA, 0x76, 0xF2, 0xBA, 0x62, 0x4E, 0x82, 0x52, - 0x89, 0xB8, 0xE5, 0xE7, 0xA0, 0x8E, 0xC9, 0x5C, 0x25, 0xFA, 0xFE, 0xFB, 0xBF, 0x64, 0x02, 0xE1, - 0x5B, 0xBD, 0x26, 0x93, 0x59, 0x05, 0x2E, 0xD2, 0xF5, 0x5B, 0xD1, 0x2D, 0x73, 0xE9, 0x7A, 0xBF, - 0x29, 0x4E, 0xE0, 0xD9, 0x45, 0x70, 0xCE, 0x00, 0x85, 0xD3, 0xD4, 0x22, 0xE0, 0xAA, 0x23, 0x3F, - 0x27, 0x16, 0x08, 0x1B, 0x99, 0x45, 0x50, 0xBD, 0x58, 0xE8, 0xCA, 0xC9, 0xB5, 0xF9, 0x5B, 0x57, - 0xC3, 0x12, 0xCD, 0xA7, 0x3A, 0x63, 0x7A, 0x19, 0x9A, 0x39, 0x80, 0x2C, 0x9A, 0x0B, 0x2F, 0x00, - 0x1B, 0x73, 0x5F, 0x00, 0xC4, 0xD9, 0x57, 0x72, 0x09, 0x48, 0xB0, 0xE8, 0x99, 0x96, 0x86, 0xC4, - 0xEC, 0x2E, 0xBB, 0x3A, 0xE8, 0x08, 0x5F, 0x7E, 0x26, 0xCA, 0x67, 0x5E, 0x39, 0x74, 0xC4, 0xD7, - 0x93, 0x4B, 0xCA, 0xDF, 0x6A, 0xB5, 0x45, 0xF5, 0xA1, 0x59, 0x79, 0x79, 0xD2, 0xD1, 0x8E, 0x16, - 0xCD, 0xF8, 0x54, 0xF5, 0x3A, 0x27, 0x71, 0x17, 0xE2, 0x21, 0xB5, 0x6A, 0x61, 0xCE, 0x02, 0x34, - 0x63, 0x4F, 0xB2, 0xC7, 0xE1, 0x99, 0xFB, 0xA2, 0x2E, 0x1C, 0xF3, 0x9F, 0xD1, 0x59, 0x1D, 0x4A, - 0x84, 0xDD, 0xC8, 0xF8, 0x14, 0x2F, 0xC7, 0xD0, 0xED, 0x68, 0x00, 0xEF, 0x16, 0xF1, 0x36, 0x2B, - 0x7F, 0xB3, 0x56, 0xDA, 0x01, 0xC4, 0x3B, 0x0F, 0x9A, 0xDB, 0x48, 0xCE, 0xC7, 0x10, 0xDE, 0xE4, - 0x93, 0x23, 0x71, 0x8B, 0x65, 0xFA, 0x22, 0x27, 0xD8, 0x3B, 0x4F, 0x74, 0x8B, 0x64, 0x69, 0xCA, - 0xDE, 0xC1, 0xA9, 0x39, 0x0C, 0x14, 0x5A, 0x16, 0xDC, 0x4E, 0xC8, 0x67, 0xE9, 0x90, 0x0E, 0xD5, - 0xA4, 0x04, 0x5B, 0x3C, 0x89, 0xD9, 0x12, 0xC0, 0x05, 0xFF, 0x4F, 0xA9, 0x9C, 0x01, 0x5F, 0xA2, - 0x39, 0x5A, 0xC5, 0x73, 0xBC, 0x23, 0x9D, 0xDC, 0x39, 0x68, 0x13, 0x9E, 0x8D, 0x72, 0x58, 0x4E, - 0x24, 0x7E, 0x86, 0x17, 0x82, 0x92, 0x79, 0x49, 0xEC, 0x21, 0x97, 0x71, 0x12, 0xF7, 0x1F, 0xEC, - 0x60, 0x70, 0x87, 0xB2, 0xAA, 0x50, 0x87, 0x04, 0xF6, 0xB8, 0xF4, 0x1B, 0x25, 0xD5, 0x2C, 0x1B, - 0x89, 0xDA, 0x95, 0xF3, 0xDD, 0xD1, 0xBC, 0x5D, 0xAC, 0x24, 0x35, 0x1E, 0x40, 0x74, 0x70, 0xA3, - 0xF0, 0xF9, 0x3D, 0x05, 0x97, 0x68, 0xA6, 0x98, 0x2B, 0x42, 0x72, 0xB8, 0x4A, 0x45, 0x19, 0xDB, - 0x3C, 0xE7, 0x8A, 0xF2, 0x3A, 0x0B, 0x27, 0x5A, 0x1C, 0x52, 0xB6, 0x1E, 0xA7, 0x62, 0x5E, 0x5E, - 0x10, 0x66, 0xBA, 0x7B, 0xC9, 0xE0, 0x71, 0x64, 0x62, 0x9A, 0x7B, 0x7F, 0xB3, 0xF0, 0x4A, 0xC6, - 0xAD, 0xB9, 0xF7, 0x57, 0x54, 0x97, 0x99, 0x5D, 0x5F, 0x40, 0x9F, 0x0B, 0xE1, 0x66, 0xDD, 0x5F, - 0x04, 0x76, 0x75, 0xB5, 0xC8, 0x92, 0xB7, 0xE5, 0x4C, 0x12, 0x7E, 0xBC, 0x4A, 0x53, 0x37, 0x3F, - 0xFE, 0x07, 0x4A, 0x7F, 0xE2, 0xF4, 0xFB, 0x51, 0x00 + 0x1F, 0x8B, 0x08, 0x08, 0xCF, 0xE4, 0x45, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, + 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x3A, 0x92, 0xE0, 0xFF, + 0xFE, 0xBE, 0x7E, 0x07, 0xB4, 0xB6, 0xB7, 0x25, 0xB5, 0x65, 0x99, 0x92, 0x2F, 0xB1, 0xE3, 0xD8, + 0xB3, 0xBE, 0x26, 0xDE, 0xE3, 0x8B, 0xD6, 0xB2, 0x93, 0x93, 0x9C, 0xCE, 0x78, 0x68, 0x11, 0x96, + 0x39, 0x91, 0x48, 0x0D, 0x49, 0xF9, 0xD2, 0x3D, 0x79, 0xA7, 0x79, 0x86, 0x79, 0xB2, 0x45, 0x01, + 0x20, 0x09, 0x80, 0xE0, 0x55, 0x92, 0xE3, 0x3E, 0x13, 0x7F, 0xDD, 0x39, 0x36, 0x01, 0x54, 0x15, + 0x0A, 0x85, 0x02, 0x50, 0xA8, 0x2A, 0x3C, 0x98, 0x1E, 0x1A, 0x9A, 0x01, 0x7E, 0x34, 0x9F, 0xD1, + 0x0E, 0xFA, 0xB7, 0x47, 0xFF, 0xED, 0xCA, 0xCA, 0x9F, 0xFF, 0xF1, 0x68, 0x3B, 0x96, 0xFB, 0xD8, + 0x1E, 0xB9, 0x03, 0x33, 0xB0, 0x5D, 0xA7, 0x7D, 0xEF, 0xFA, 0x81, 0x63, 0x8E, 0xF1, 0xF7, 0x95, + 0x47, 0xFF, 0xDF, 0xB6, 0xFF, 0xF8, 0x87, 0x07, 0xD2, 0xEA, 0x11, 0xDF, 0xFA, 0xEE, 0xE0, 0x1B, + 0x0E, 0xC8, 0xDF, 0x7F, 0xFC, 0x03, 0x6F, 0x61, 0x5A, 0xD6, 0xD1, 0x03, 0x76, 0x82, 0x53, 0xDB, + 0x0F, 0xB0, 0x83, 0xBD, 0x46, 0x7D, 0xE4, 0x9A, 0x56, 0xBD, 0x85, 0x5C, 0xE7, 0x94, 0xFC, 0xD2, + 0xA4, 0x75, 0xEF, 0xA6, 0xCE, 0x00, 0xC0, 0xF2, 0x8F, 0x0D, 0x0C, 0x2D, 0x9A, 0xE8, 0x1F, 0x7F, + 0xFC, 0x03, 0x22, 0x3F, 0xB6, 0x63, 0x07, 0x9F, 0xF0, 0x6D, 0x9F, 0xC2, 0x6E, 0x40, 0x8B, 0xEF, + 0x52, 0x23, 0xA5, 0x3C, 0x6C, 0x16, 0x91, 0x43, 0xBA, 0xE1, 0xE0, 0x47, 0x14, 0x57, 0xE1, 0xDD, + 0x03, 0x48, 0x52, 0xC5, 0xB6, 0xEB, 0x8C, 0xB1, 0xEF, 0x9B, 0x43, 0x4C, 0x9A, 0x44, 0xE0, 0x1B, + 0x63, 0x7F, 0x18, 0x01, 0x85, 0x9F, 0x89, 0xE9, 0xF9, 0xF8, 0xC4, 0x19, 0xB8, 0x63, 0xDB, 0x19, + 0x42, 0x69, 0xDB, 0x32, 0x03, 0x33, 0x84, 0xF6, 0x3D, 0x41, 0xDF, 0x10, 0x37, 0x70, 0x04, 0xC0, + 0xC3, 0xC1, 0xD4, 0x73, 0x90, 0xE5, 0x0E, 0xA6, 0x63, 0xD2, 0xC9, 0xF6, 0x10, 0x07, 0x47, 0x23, + 0x0C, 0xBF, 0xEE, 0x3F, 0x9F, 0x90, 0x9E, 0x47, 0xDD, 0x03, 0x8E, 0xDE, 0xD9, 0x4F, 0xD8, 0x3A, + 0x35, 0xA1, 0x07, 0xC6, 0xB6, 0xF8, 0xC9, 0x75, 0x86, 0xC2, 0xB7, 0xC9, 0xC8, 0x0C, 0xEE, 0x5C, + 0x6F, 0xDC, 0xF3, 0x30, 0x29, 0x26, 0x05, 0xB5, 0x1A, 0x2F, 0x19, 0x62, 0xD7, 0xC2, 0x81, 0x3D, + 0x60, 0x30, 0xD6, 0x8C, 0xB6, 0xD1, 0x51, 0x4B, 0x08, 0x81, 0x3B, 0x68, 0xB9, 0x63, 0xAC, 0xB7, + 0x3B, 0x5B, 0x4A, 0xD9, 0xDE, 0x08, 0x5A, 0x75, 0xD6, 0x0D, 0xA3, 0x1D, 0x36, 0xC3, 0x03, 0x7C, + 0xF7, 0x2B, 0x6D, 0xD0, 0xDD, 0x34, 0xBA, 0xC6, 0x46, 0x7B, 0x7D, 0x63, 0x53, 0x28, 0xFA, 0x0C, + 0x45, 0x6B, 0x6F, 0x3A, 0x1B, 0x9B, 0xC6, 0x5A, 0x7B, 0xCD, 0x58, 0x15, 0x8A, 0xBE, 0x50, 0x02, + 0x36, 0x37, 0x36, 0x36, 0xD6, 0xDB, 0x6B, 0x9B, 0x6B, 0xBC, 0x64, 0x64, 0xFA, 0xC1, 0xB1, 0x3D, + 0xC2, 0xE7, 0x44, 0x96, 0x44, 0xC2, 0xEF, 0xE0, 0xDB, 0x74, 0x7C, 0x8B, 0x3D, 0xA1, 0x9F, 0x0E, + 0xFD, 0x70, 0x71, 0x07, 0x0D, 0xFC, 0x3E, 0x1E, 0xE1, 0x41, 0x80, 0x2D, 0xA1, 0xDC, 0xE7, 0x9F, + 0x68, 0xB9, 0x08, 0xCD, 0xBF, 0x77, 0x89, 0x38, 0x0E, 0xE1, 0x3B, 0xC8, 0x21, 0x8C, 0xAE, 0x39, + 0xF2, 0x31, 0x2F, 0x75, 0x6F, 0x03, 0xD3, 0x76, 0xB0, 0x75, 0xC6, 0xC6, 0xBE, 0x58, 0x8D, 0x7D, + 0xD3, 0xC7, 0x4A, 0x2D, 0x8E, 0x85, 0x57, 0xBA, 0xBC, 0x3A, 0x38, 0xD3, 0x80, 0x82, 0x8E, 0x5D, + 0x99, 0xB7, 0xE4, 0x1F, 0xFC, 0x14, 0x88, 0x34, 0x0E, 0x5C, 0xCF, 0xC3, 0x54, 0x60, 0xD4, 0x12, + 0x2E, 0x93, 0xEA, 0x67, 0x60, 0x1D, 0xC7, 0x75, 0xF5, 0x3C, 0xC1, 0x19, 0x45, 0x9C, 0x56, 0x5A, + 0xCC, 0x2A, 0x10, 0x4C, 0xAE, 0x67, 0xF9, 0x47, 0x07, 0x47, 0xC7, 0xA4, 0xE0, 0xB7, 0xAF, 0xDB, + 0xD2, 0xE7, 0xF7, 0x7C, 0xFC, 0xC5, 0xA2, 0xBB, 0xE9, 0x68, 0xD4, 0x23, 0xF0, 0xAE, 0x27, 0x44, + 0xD8, 0xC5, 0x9E, 0x87, 0x2D, 0x7D, 0x1C, 0x5C, 0xD9, 0x63, 0xEC, 0x4E, 0x83, 0x68, 0x34, 0x1C, + 0xEB, 0x90, 0x4C, 0x0C, 0xF9, 0xEB, 0xE0, 0x1E, 0x0F, 0xBE, 0x9D, 0xE3, 0xC7, 0x63, 0xDB, 0x1B, + 0x3F, 0x9A, 0x1E, 0x96, 0x4B, 0xC9, 0x6C, 0xD0, 0x96, 0xFD, 0xF1, 0x0F, 0x03, 0xD7, 0x21, 0xBC, + 0x24, 0x12, 0x70, 0x10, 0xF1, 0xC9, 0xEF, 0xBB, 0x53, 0x6F, 0x40, 0x47, 0xFA, 0x4D, 0x82, 0x89, + 0xBC, 0x10, 0xE4, 0xCA, 0x17, 0xFB, 0x91, 0xA8, 0xD1, 0xF3, 0x6C, 0xD7, 0xB3, 0x03, 0x3B, 0xAE, + 0x16, 0x22, 0x3B, 0x70, 0x09, 0x33, 0x6C, 0x87, 0x74, 0x17, 0x98, 0x08, 0xC5, 0x7C, 0x0E, 0x1F, + 0x5C, 0x5C, 0x5C, 0x1E, 0x9E, 0x9C, 0xEF, 0x5D, 0x1D, 0xDD, 0x9C, 0x9C, 0xF7, 0xAE, 0xAF, 0x6E, + 0xAE, 0x3E, 0xF7, 0x8E, 0x6E, 0x0E, 0x0F, 0xDF, 0x22, 0xA3, 0x85, 0x56, 0x56, 0x0E, 0xF1, 0x9D, + 0x39, 0x25, 0x53, 0xE7, 0xF0, 0xB0, 0x6D, 0x85, 0x3F, 0xD9, 0x0D, 0xCF, 0xCE, 0xDE, 0xA2, 0x0E, + 0x6D, 0x4A, 0x7E, 0x6D, 0x8F, 0xE1, 0x27, 0xBB, 0xC1, 0x0D, 0xB4, 0xE8, 0xB2, 0x16, 0xA8, 0x70, + 0x93, 0x9B, 0xC3, 0xBD, 0xFE, 0x87, 0xB7, 0x68, 0x95, 0xB5, 0x5B, 0x2E, 0xDE, 0xAE, 0xFF, 0xF9, + 0x6C, 0xFF, 0xE2, 0xF4, 0x2D, 0x5A, 0x63, 0x2D, 0xFF, 0xFB, 0xBF, 0xC2, 0xA6, 0xE3, 0x71, 0x3D, + 0xAF, 0x67, 0xFD, 0xFE, 0x5B, 0xB4, 0x1E, 0x51, 0x8A, 0xFA, 0xFD, 0xB6, 0x4F, 0x7F, 0x0A, 0x60, + 0x25, 0x2D, 0x37, 0x2A, 0xB6, 0xE4, 0x5D, 0x7D, 0x13, 0x75, 0x75, 0xB9, 0x5C, 0xF3, 0xB0, 0xC7, + 0x9B, 0x71, 0x8F, 0xEB, 0x11, 0x84, 0x5A, 0x7E, 0x9F, 0x6F, 0xCE, 0x2F, 0x6E, 0x0E, 0x8F, 0x0E, + 0x4E, 0xCE, 0xF6, 0x08, 0x90, 0xAD, 0x70, 0x68, 0xFB, 0x7D, 0xB4, 0x8C, 0xCE, 0x5D, 0x64, 0xE1, + 0x81, 0x3D, 0x36, 0x47, 0x85, 0x28, 0x11, 0x01, 0x75, 0x0C, 0x91, 0x1D, 0xE5, 0x61, 0x01, 0x53, + 0x64, 0x80, 0x1D, 0x91, 0x41, 0x85, 0x01, 0x9E, 0x9C, 0x7F, 0xDC, 0x3B, 0x3D, 0x39, 0xBC, 0xB9, + 0x3E, 0xFF, 0xE5, 0xFC, 0xE2, 0xD3, 0x39, 0x81, 0xD3, 0x6D, 0x09, 0xCB, 0x16, 0x99, 0x3E, 0x0F, + 0xD8, 0x23, 0x8A, 0x38, 0x9E, 0x41, 0xA0, 0xA5, 0xDB, 0x46, 0x34, 0x07, 0xC3, 0xCF, 0x27, 0xCE, + 0x64, 0x1A, 0x70, 0xED, 0xA5, 0x4C, 0xB7, 0x76, 0x5A, 0x5F, 0xE4, 0x1D, 0x43, 0x62, 0x31, 0x8E, + 0x56, 0xDA, 0x95, 0x15, 0x98, 0xC6, 0xEE, 0x08, 0x93, 0x5D, 0xCB, 0xB0, 0x51, 0x0B, 0xEB, 0x84, + 0xEA, 0xF4, 0x2D, 0xAA, 0xA1, 0x25, 0x04, 0x0D, 0x28, 0x40, 0x68, 0x01, 0xB4, 0xC1, 0x52, 0x4E, + 0x88, 0x81, 0x55, 0xDD, 0x9F, 0x8C, 0xEC, 0xA0, 0x51, 0x6F, 0xD5, 0xC3, 0xA5, 0x9D, 0xAC, 0xB1, + 0xA8, 0x31, 0x22, 0x1B, 0x8A, 0x27, 0xBA, 0xE8, 0x90, 0xFF, 0xBC, 0xA3, 0xF5, 0xDB, 0x23, 0xEC, + 0x0C, 0x83, 0x7B, 0xC2, 0xBE, 0x0E, 0x7C, 0x5C, 0xDA, 0x41, 0x5D, 0x69, 0xC3, 0x00, 0x70, 0x6D, + 0x58, 0xA8, 0xA0, 0xF2, 0x6F, 0x4F, 0x5F, 0xB7, 0xE5, 0xA2, 0x07, 0x73, 0x14, 0x95, 0x11, 0x92, + 0x3A, 0x62, 0xB9, 0xD2, 0x09, 0xDB, 0x62, 0x64, 0x13, 0x68, 0x4B, 0xA8, 0xD6, 0x82, 0xA6, 0xEC, + 0x03, 0xF9, 0x25, 0xEE, 0x07, 0x6B, 0xD8, 0x9F, 0x90, 0x81, 0x24, 0xA0, 0x49, 0xB7, 0xC7, 0xA6, + 0x63, 0xF9, 0x71, 0x99, 0x7D, 0x87, 0x1A, 0xB6, 0xD5, 0xB6, 0x9D, 0xC1, 0x68, 0x6A, 0x61, 0xBF, + 0x51, 0xF3, 0xAD, 0x33, 0x77, 0xEA, 0x90, 0x01, 0xAB, 0x35, 0x25, 0xC2, 0x19, 0xA0, 0x2B, 0xD8, + 0xB0, 0xB8, 0xCE, 0x8A, 0x7B, 0x77, 0x87, 0xFA, 0x87, 0x88, 0x28, 0x66, 0x53, 0xAE, 0x02, 0xF0, + 0x68, 0x27, 0xC8, 0x1A, 0x43, 0x97, 0x85, 0x5A, 0x02, 0x0A, 0xFC, 0xDC, 0xDB, 0x16, 0x6E, 0xD4, + 0x60, 0x01, 0x3C, 0x33, 0x1D, 0x32, 0x02, 0x5E, 0xAD, 0xB9, 0x2D, 0xD7, 0xFA, 0x2E, 0xFF, 0x89, + 0x09, 0x28, 0x09, 0x78, 0xE0, 0x4D, 0x53, 0x60, 0xC3, 0xDA, 0x5B, 0x18, 0xB6, 0xF0, 0x6B, 0x84, + 0x02, 0xC6, 0x87, 0x60, 0x90, 0xB7, 0x52, 0x49, 0x5C, 0x89, 0xAD, 0x16, 0x21, 0x4D, 0x41, 0x14, + 0x6D, 0xED, 0x02, 0x3B, 0x18, 0xD1, 0x75, 0xF7, 0xF2, 0xEA, 0x17, 0x3A, 0x48, 0x4A, 0x63, 0x32, + 0x82, 0xA8, 0x4F, 0xB6, 0x83, 0x93, 0x9A, 0x02, 0x21, 0xB1, 0xD6, 0x42, 0xBF, 0x95, 0x3A, 0xFA, + 0xED, 0x42, 0x72, 0x5C, 0x54, 0x82, 0x49, 0xC5, 0xA3, 0x8F, 0xBF, 0x64, 0x31, 0xF1, 0x96, 0xEC, + 0x16, 0x0E, 0x5C, 0xE7, 0xCE, 0x1E, 0x26, 0x78, 0x18, 0x57, 0x9A, 0x4C, 0x72, 0xAB, 0xE0, 0xE0, + 0x1E, 0x7B, 0x0E, 0x0E, 0x72, 0x2B, 0x3A, 0x41, 0x16, 0x30, 0x26, 0x35, 0x81, 0x3D, 0x22, 0x80, + 0xC6, 0x13, 0xEC, 0xF8, 0xF4, 0x00, 0x42, 0xF8, 0x16, 0x90, 0xC9, 0xEC, 0x67, 0x34, 0x99, 0xB8, + 0x5E, 0xE0, 0xE7, 0x22, 0x27, 0xD3, 0xEA, 0xCA, 0xED, 0x1F, 0x1E, 0x98, 0x9E, 0x55, 0x58, 0x1C, + 0x35, 0x3C, 0x3D, 0x36, 0x07, 0x44, 0x2F, 0x3C, 0x74, 0x17, 0xCB, 0x58, 0xD6, 0xB1, 0x02, 0x8C, + 0x65, 0x15, 0xE7, 0xCE, 0x58, 0x4E, 0xE2, 0xCB, 0x33, 0x76, 0xEC, 0xFA, 0xA6, 0x3D, 0xF8, 0xC9, + 0xDC, 0x39, 0x33, 0xF7, 0xCA, 0xF5, 0x06, 0xF7, 0xFF, 0x44, 0x5C, 0x65, 0xF8, 0x16, 0xA0, 0x0B, + 0x58, 0x2D, 0x95, 0xAB, 0x1A, 0x02, 0xE8, 0x09, 0x93, 0x68, 0x5B, 0x72, 0xA6, 0xAF, 0x59, 0xCF, + 0x8E, 0x39, 0xB6, 0x07, 0x67, 0xE4, 0xB0, 0x34, 0xD2, 0x42, 0x85, 0xAD, 0x82, 0x83, 0x1F, 0x2F, + 0x26, 0x74, 0xA7, 0xC2, 0xAC, 0x10, 0xEC, 0x8F, 0x46, 0xBD, 0x3F, 0xF5, 0x1E, 0xF0, 0x73, 0xBD, + 0x85, 0xEA, 0x46, 0x5D, 0xDB, 0x55, 0x8A, 0x09, 0xCC, 0x27, 0x8D, 0x08, 0x44, 0x0B, 0x4D, 0x1D, + 0x8B, 0x0C, 0x1E, 0x39, 0x89, 0xEA, 0x9A, 0xA4, 0xA1, 0xBA, 0xDE, 0xFB, 0x08, 0x78, 0x3A, 0x8B, + 0xC6, 0xB3, 0x37, 0x0D, 0xDC, 0xB1, 0x1B, 0xD8, 0x0F, 0x18, 0xD0, 0x75, 0xAB, 0xA2, 0x4B, 0x36, + 0xE2, 0x7B, 0x4A, 0x3F, 0xC0, 0xA3, 0x11, 0x1D, 0xF1, 0x03, 0x38, 0x44, 0xD2, 0x13, 0xFE, 0x3B, + 0xCB, 0x7E, 0x40, 0x03, 0x72, 0xDE, 0xF5, 0x77, 0xEA, 0x20, 0xDC, 0xCB, 0xF4, 0x7C, 0x89, 0xC6, + 0xC1, 0x72, 0xA7, 0xBE, 0x5B, 0xD3, 0x10, 0xA0, 0x83, 0xB3, 0x04, 0x80, 0x46, 0xE6, 0x2D, 0x1E, + 0x25, 0x41, 0x2D, 0xD3, 0xEF, 0x75, 0xD8, 0xFB, 0xED, 0xD4, 0xA7, 0xE3, 0xAD, 0x4D, 0xE3, 0x40, + 0x84, 0xE0, 0xDF, 0xBC, 0xEF, 0xF5, 0xEB, 0xBB, 0xE4, 0x1F, 0xF4, 0x6E, 0x85, 0x56, 0x2D, 0x87, + 0xD5, 0x86, 0x0D, 0xB0, 0x06, 0x2B, 0xFD, 0x5E, 0x47, 0x01, 0xD9, 0x09, 0xEF, 0xD4, 0xE9, 0xA7, + 0x5B, 0xF7, 0xA9, 0x0E, 0xBB, 0x8D, 0x29, 0xF9, 0x50, 0x27, 0x1B, 0xC0, 0x0C, 0x6A, 0x4A, 0x51, + 0xB0, 0x42, 0x38, 0x58, 0xAE, 0xC5, 0x8F, 0x67, 0xF9, 0xE9, 0xC5, 0xF9, 0x5E, 0x1F, 0xD8, 0xCE, + 0x7E, 0x79, 0x25, 0xAC, 0x0F, 0xA9, 0xFA, 0xDD, 0xB3, 0xDF, 0x1C, 0x91, 0x7D, 0xB6, 0x4B, 0xD8, + 0xCF, 0x7E, 0x79, 0x25, 0xEC, 0x0F, 0xA9, 0xFA, 0xBD, 0xB3, 0x7F, 0x1F, 0xDB, 0x87, 0xEE, 0xB4, + 0xBE, 0xCB, 0xFE, 0xFB, 0x3A, 0x98, 0x1F, 0xD2, 0xF4, 0x7B, 0xE7, 0xFD, 0xFF, 0xFB, 0x02, 0x13, + 0x1C, 0xFE, 0x7D, 0x1D, 0x7C, 0x67, 0xF4, 0xCC, 0x87, 0xEB, 0xB0, 0xA5, 0x19, 0x3A, 0xBE, 0x2F, + 0xA3, 0xA8, 0x35, 0xDB, 0xB6, 0xE3, 0x60, 0xEF, 0xC3, 0xD5, 0xD9, 0x29, 0x59, 0x70, 0x35, 0x60, + 0x93, 0xDB, 0xCF, 0xE4, 0x29, 0x34, 0xFD, 0x18, 0xFA, 0x9F, 0xFF, 0x99, 0x73, 0x9E, 0xD2, 0xEE, + 0x4E, 0x5F, 0xCF, 0x8E, 0xE0, 0xF6, 0x49, 0xE2, 0x57, 0xB4, 0x1D, 0x58, 0xF9, 0x41, 0x42, 0xA2, + 0xA5, 0xE7, 0x77, 0x35, 0x2D, 0xD5, 0x1E, 0xF6, 0xF7, 0xF7, 0x48, 0x17, 0xE1, 0xDF, 0x57, 0xC0, + 0x6E, 0x46, 0xCC, 0xEF, 0x9A, 0xDF, 0xAF, 0x60, 0xF9, 0x4F, 0x25, 0xE9, 0x77, 0xCD, 0xF8, 0x1F, + 0xBE, 0xF0, 0xA7, 0x11, 0xF4, 0xFB, 0x16, 0xF7, 0x1F, 0x7F, 0xD8, 0x48, 0x25, 0xE9, 0xF5, 0x2E, + 0xFC, 0x7A, 0x13, 0xBB, 0x70, 0xE5, 0x00, 0x08, 0xC3, 0x7B, 0xDE, 0x8F, 0xD8, 0xF3, 0x09, 0xD4, + 0x13, 0x27, 0xD0, 0xDE, 0x3F, 0x9C, 0xB9, 0x96, 0x7D, 0xF7, 0x8C, 0x7C, 0x6E, 0xE6, 0x41, 0xD6, + 0x14, 0xA3, 0xC0, 0x45, 0x77, 0xBC, 0x35, 0x1A, 0xD9, 0x63, 0x3B, 0x60, 0x44, 0x2F, 0x7E, 0xE7, + 0x31, 0x3F, 0x0B, 0x50, 0xCF, 0xF5, 0x02, 0x70, 0x04, 0x78, 0x11, 0x1B, 0x50, 0x9F, 0x31, 0xC8, + 0xF4, 0x9E, 0x67, 0xB2, 0xCD, 0x14, 0x45, 0xD7, 0xC3, 0x64, 0x90, 0x03, 0xCF, 0x36, 0x1D, 0x40, + 0xB7, 0xFA, 0xB2, 0x96, 0xA7, 0xB5, 0x85, 0x33, 0x13, 0x9B, 0x80, 0x67, 0x7D, 0xE1, 0xDD, 0xB2, + 0xBD, 0x5B, 0xD7, 0x73, 0x30, 0xEA, 0x0C, 0x01, 0xDF, 0xC6, 0x8B, 0xE1, 0xEB, 0x52, 0x7C, 0x6F, + 0x5E, 0x0C, 0xDF, 0x1A, 0xC5, 0xB7, 0xB9, 0x68, 0x7C, 0x9F, 0x3C, 0xDB, 0x0F, 0x00, 0xD3, 0xD6, + 0xA2, 0x31, 0xED, 0xDB, 0xDF, 0xA8, 0x28, 0x76, 0xE6, 0x36, 0xB1, 0xC3, 0x6B, 0xD0, 0xDD, 0x1D, + 0xD4, 0xE9, 0x76, 0xB4, 0xAA, 0xA9, 0xBC, 0x7A, 0xCA, 0x53, 0x51, 0x67, 0xEE, 0x23, 0xF6, 0x68, + 0x3F, 0xF4, 0xC6, 0xE3, 0x8A, 0x7D, 0xC9, 0xE2, 0xDC, 0xD1, 0x72, 0x7F, 0xE0, 0xBA, 0x01, 0x47, + 0xDB, 0x9D, 0x27, 0xDA, 0xEF, 0x45, 0x2E, 0x84, 0x57, 0x56, 0xFA, 0x44, 0x6F, 0xC1, 0x32, 0x33, + 0x04, 0x77, 0x45, 0x13, 0x3C, 0xCC, 0x6E, 0x9F, 0x11, 0x5C, 0xE1, 0x4E, 0x1D, 0x3B, 0xC8, 0x5B, + 0xD6, 0x7C, 0xEB, 0xD8, 0xC3, 0xB8, 0x3F, 0x21, 0x8B, 0x48, 0xAD, 0x29, 0xE3, 0x23, 0xEB, 0x8D, + 0x52, 0xB5, 0x6F, 0xFF, 0x3D, 0xB7, 0xD6, 0xBD, 0xE9, 0x59, 0xB0, 0xCA, 0x9D, 0x1C, 0xE6, 0xD5, + 0xD4, 0xAC, 0xA8, 0x79, 0x4D, 0x2C, 0xF3, 0xD9, 0xBF, 0xC4, 0x63, 0xD3, 0x76, 0x48, 0x8F, 0xF3, + 0x2A, 0x4F, 0x3C, 0x17, 0xEE, 0xD7, 0x0D, 0x70, 0xA9, 0x2A, 0x58, 0xB7, 0x53, 0xA2, 0x6E, 0xB7, + 0x44, 0xDD, 0xD5, 0x12, 0x75, 0xD7, 0x4A, 0xD4, 0x5D, 0x2F, 0x51, 0x77, 0xA3, 0x44, 0xDD, 0x37, + 0x45, 0xEA, 0x7A, 0xA6, 0x65, 0xBB, 0x67, 0x7B, 0x07, 0xB9, 0x83, 0x86, 0x1F, 0xEC, 0x01, 0xDE, + 0xBF, 0xCA, 0x97, 0x88, 0x91, 0x3B, 0x0C, 0x7D, 0x2B, 0xF3, 0xAA, 0xDE, 0x9A, 0x01, 0x99, 0x73, + 0xCF, 0x3D, 0xEC, 0x0D, 0x30, 0x6C, 0xC3, 0xE2, 0xDA, 0x09, 0x55, 0x43, 0x34, 0x8B, 0x6D, 0xC9, + 0x9B, 0x43, 0xD9, 0x09, 0x22, 0x77, 0xEF, 0xE7, 0x05, 0xDF, 0x12, 0x82, 0xAA, 0x43, 0xA3, 0xAD, + 0x98, 0x81, 0x38, 0xBD, 0xD9, 0xF5, 0x64, 0x48, 0xD8, 0x8B, 0x6B, 0x33, 0x91, 0x3D, 0x80, 0xFB, + 0x43, 0x6F, 0x7C, 0x09, 0xAE, 0x8E, 0x1A, 0x82, 0xA9, 0x0B, 0x24, 0xDC, 0x4B, 0x12, 0x8D, 0x8A, + 0x1B, 0xCD, 0x0A, 0x90, 0xC1, 0x5B, 0xF2, 0x12, 0x0F, 0xB0, 0x3D, 0xD1, 0xC1, 0x4F, 0x56, 0x52, + 0x91, 0xE4, 0xA1, 0xE1, 0xD2, 0xC8, 0xFC, 0x6A, 0x75, 0x18, 0xA6, 0x9E, 0x47, 0x46, 0xBF, 0x27, + 0x56, 0xD3, 0x32, 0xF9, 0xCF, 0x8D, 0x1A, 0x3D, 0xB8, 0xFC, 0x06, 0x2E, 0xE0, 0x3B, 0x1C, 0xEC, + 0x25, 0xC8, 0xEF, 0xD7, 0xDF, 0xD8, 0xD1, 0x05, 0xDC, 0x5D, 0xB4, 0xE0, 0x96, 0x50, 0xED, 0x2B, + 0x19, 0x06, 0xD2, 0x66, 0xD2, 0x60, 0x07, 0x1E, 0x0C, 0xDE, 0xE0, 0xE0, 0xE1, 0x52, 0x8A, 0x65, + 0xE1, 0xEE, 0xFF, 0x7A, 0x02, 0xFE, 0xE4, 0x21, 0xDB, 0x35, 0x9D, 0xD2, 0x57, 0x6C, 0xCC, 0x80, + 0x0C, 0xF6, 0xD2, 0x53, 0x3F, 0x17, 0x15, 0xAB, 0xD6, 0xE0, 0x9E, 0x59, 0xC5, 0x0F, 0x46, 0xB1, + 0xCB, 0xB6, 0x76, 0x56, 0x88, 0x0E, 0xDD, 0x5A, 0xF1, 0x9F, 0x71, 0x72, 0x0A, 0x8E, 0xE1, 0x59, + 0xF8, 0xE9, 0xC2, 0xBD, 0x48, 0xFC, 0x7B, 0xA3, 0xAC, 0xFE, 0x33, 0xD7, 0xF4, 0x45, 0xE0, 0xA7, + 0x1E, 0xEE, 0x1A, 0xCC, 0xA1, 0xE7, 0xFB, 0xA2, 0x70, 0x7E, 0x4E, 0xC1, 0xF9, 0x79, 0x81, 0x38, + 0xBF, 0xA4, 0xE0, 0xFC, 0xB2, 0x28, 0x9C, 0xFE, 0xC4, 0x71, 0x1F, 0x7B, 0x18, 0x7B, 0x07, 0xE0, + 0x6F, 0xA8, 0xC1, 0x1E, 0x6D, 0x73, 0x91, 0xD1, 0xD4, 0x5B, 0x2A, 0x26, 0xA4, 0x35, 0x59, 0x25, + 0x55, 0xFB, 0x44, 0xAD, 0x56, 0x86, 0x10, 0x0E, 0x24, 0x65, 0xD9, 0xD1, 0xA2, 0x58, 0xA2, 0xBD, + 0x05, 0xFD, 0xF5, 0xEE, 0xD6, 0xDB, 0x2D, 0x85, 0xCD, 0x67, 0x87, 0x6F, 0xF0, 0xB6, 0xD7, 0xAE, + 0x1B, 0x91, 0x2F, 0x7E, 0x7B, 0x32, 0xF5, 0xEF, 0x4B, 0x6B, 0x0C, 0x0E, 0x3E, 0xF4, 0xDA, 0x4F, + 0x47, 0x11, 0xD6, 0xA8, 0x86, 0xE6, 0x6E, 0xCC, 0x36, 0x12, 0x09, 0xE8, 0x4A, 0x0C, 0x47, 0x49, + 0x99, 0xB8, 0x1B, 0xB3, 0x6D, 0xB0, 0x46, 0x9B, 0x8A, 0x91, 0x12, 0xD4, 0x84, 0x15, 0x78, 0xC8, + 0x1C, 0xD9, 0x43, 0x67, 0xA7, 0x3E, 0xC2, 0x77, 0x41, 0xD2, 0xFE, 0xA5, 0x6B, 0x62, 0xED, 0xC2, + 0x5A, 0x24, 0xD1, 0x08, 0x63, 0xB8, 0x02, 0x05, 0x85, 0x9B, 0x87, 0x23, 0x5F, 0xBC, 0x15, 0xB7, + 0xF8, 0xA9, 0x86, 0x3D, 0xB0, 0xE7, 0xE9, 0xE8, 0xA9, 0x23, 0xBA, 0x94, 0xD6, 0x01, 0xD8, 0xC9, + 0x61, 0x3D, 0xCD, 0x52, 0x88, 0x04, 0x0F, 0x57, 0x6A, 0x84, 0xAB, 0xEF, 0x16, 0xA5, 0x69, 0x25, + 0x28, 0x29, 0xB5, 0x64, 0xBC, 0x49, 0x63, 0xCD, 0xC0, 0x40, 0x60, 0x07, 0xD0, 0x5E, 0x6E, 0x0D, + 0x9D, 0xDE, 0x3E, 0x85, 0x91, 0x31, 0x26, 0x5F, 0xA8, 0xC9, 0x61, 0x0B, 0xC9, 0x9F, 0x6F, 0xAE, + 0xF7, 0x7F, 0xBD, 0x39, 0x3F, 0x3B, 0xDA, 0xBB, 0x39, 0xBC, 0x3A, 0x53, 0xCA, 0x20, 0x8A, 0x85, + 0x96, 0x43, 0x64, 0xCD, 0x4D, 0xC7, 0x30, 0xD6, 0x65, 0xB2, 0x84, 0x50, 0x19, 0x2E, 0x89, 0xB6, + 0xB5, 0x9D, 0x5A, 0xE5, 0x92, 0x79, 0xD6, 0x26, 0xB5, 0x9C, 0x02, 0xE6, 0x94, 0xDA, 0x8C, 0xB5, + 0xEE, 0xB5, 0x42, 0xCD, 0x43, 0xEE, 0x35, 0x1E, 0xB7, 0x0B, 0xBD, 0xC7, 0x6F, 0x12, 0x27, 0x58, + 0xE0, 0x8C, 0xD0, 0x2C, 0x74, 0x1E, 0x27, 0x07, 0xFB, 0xB5, 0xD4, 0xBB, 0xCE, 0xB1, 0x14, 0xE7, + 0x23, 0xB4, 0xFE, 0xAD, 0xFB, 0x75, 0x3B, 0x8F, 0x8D, 0x3B, 0x08, 0x7E, 0xD5, 0x9B, 0x14, 0xD4, + 0x20, 0xA2, 0x3F, 0xED, 0x88, 0xB8, 0x52, 0xCD, 0x0C, 0xC9, 0xD8, 0x23, 0xA1, 0x55, 0xCA, 0x89, + 0x5D, 0x0C, 0x63, 0xA2, 0x12, 0x79, 0xEF, 0x69, 0xCD, 0xD1, 0xDF, 0x75, 0x2E, 0x60, 0x9A, 0x11, + 0x91, 0xB9, 0x00, 0x93, 0xE8, 0x86, 0x7A, 0xF4, 0x0B, 0x9F, 0x57, 0x53, 0x99, 0x43, 0x65, 0x68, + 0xCD, 0x78, 0xD3, 0xBD, 0x31, 0x08, 0xA8, 0xE8, 0x2F, 0x3D, 0x93, 0x34, 0xA3, 0xB5, 0xB3, 0x83, + 0xD6, 0x53, 0xB9, 0x53, 0x95, 0x58, 0xED, 0xE7, 0xB5, 0xB2, 0x7D, 0xB8, 0x31, 0x8A, 0x98, 0x3E, + 0xE4, 0x0F, 0x89, 0xB1, 0x51, 0xEF, 0x5C, 0x86, 0x9E, 0x3B, 0x9D, 0x20, 0xCF, 0x7D, 0x64, 0x2A, + 0x6C, 0xEC, 0x0F, 0x05, 0x3A, 0x23, 0x25, 0x96, 0x18, 0xCF, 0x04, 0x5C, 0x76, 0x05, 0x43, 0x6F, + 0x5A, 0x74, 0x00, 0x42, 0x9C, 0x03, 0x77, 0xB4, 0xEC, 0x8F, 0x97, 0xD7, 0x10, 0xFC, 0xB2, 0x41, + 0xFF, 0xA5, 0x64, 0xB0, 0x9B, 0x9A, 0x5D, 0xA5, 0x29, 0x63, 0x32, 0x69, 0xFF, 0x36, 0xED, 0x6E, + 0x26, 0xAB, 0x7F, 0x12, 0xAE, 0xB5, 0xBA, 0xAC, 0xB9, 0x59, 0xC8, 0xA1, 0xA2, 0x8F, 0x5D, 0x27, + 0xF0, 0xDC, 0x51, 0x3D, 0x0F, 0x49, 0xA4, 0xEC, 0x13, 0xBD, 0xE4, 0xD7, 0x3B, 0x42, 0x19, 0x55, + 0x47, 0xC5, 0x58, 0x38, 0x49, 0x83, 0x7B, 0xE4, 0x79, 0x6E, 0x4C, 0xAA, 0xED, 0x8C, 0x6C, 0x07, + 0xB3, 0x6F, 0x64, 0x91, 0x98, 0xE4, 0x03, 0xA6, 0x17, 0x44, 0xC9, 0x6B, 0xA2, 0x7C, 0xCD, 0x0E, + 0x8E, 0x29, 0x82, 0x70, 0xFA, 0xDA, 0x5B, 0x1C, 0x94, 0xA8, 0x46, 0x15, 0xD4, 0xFB, 0x1E, 0x51, + 0x51, 0xF9, 0x75, 0x41, 0xBA, 0x2F, 0xDD, 0x07, 0xEC, 0x51, 0xA9, 0x27, 0xCA, 0xBF, 0x53, 0xAC, + 0x0D, 0x5D, 0x34, 0xF4, 0x4D, 0x2A, 0xAD, 0x17, 0x34, 0xDC, 0xE8, 0x98, 0x1C, 0xEF, 0x02, 0x75, + 0xFF, 0xF4, 0x22, 0x6B, 0x47, 0x8E, 0x66, 0xE9, 0x7C, 0xDD, 0xFE, 0x39, 0xB3, 0x7F, 0xCE, 0xEC, + 0xB9, 0xCD, 0x6C, 0x21, 0x58, 0x96, 0x87, 0xC9, 0x3E, 0x6B, 0xE6, 0xB6, 0x1C, 0x56, 0x9B, 0x35, + 0x97, 0xE2, 0x5A, 0x21, 0xB8, 0x70, 0x4A, 0x9D, 0x38, 0xA9, 0x13, 0x2A, 0x6E, 0xC4, 0x67, 0x8A, + 0x8C, 0x2B, 0x7D, 0xB2, 0x24, 0xE9, 0x0A, 0xE7, 0x8C, 0x0C, 0x52, 0x37, 0x6D, 0x80, 0x15, 0xFA, + 0x60, 0xE2, 0x70, 0x07, 0xF0, 0x4E, 0x1F, 0x8C, 0xAC, 0xDD, 0x14, 0xA4, 0x40, 0xA2, 0xC7, 0x30, + 0x0D, 0x85, 0xCD, 0xED, 0x02, 0x20, 0xE2, 0xB8, 0x65, 0x15, 0x4E, 0xC8, 0xDB, 0x02, 0x81, 0x21, + 0x7A, 0xF7, 0x81, 0x28, 0xDC, 0xF0, 0xCA, 0x75, 0xD1, 0xD8, 0x74, 0x9E, 0x45, 0xEC, 0xC8, 0x67, + 0x1D, 0xAD, 0x95, 0xB3, 0x70, 0xC2, 0x61, 0xC5, 0x76, 0x86, 0x42, 0x74, 0xB7, 0xCE, 0x00, 0x99, + 0xAC, 0x55, 0xEE, 0x90, 0xE1, 0xC4, 0x0D, 0xD3, 0x2D, 0xCB, 0xC9, 0x4A, 0x15, 0x8C, 0x74, 0xD4, + 0x17, 0x21, 0xBB, 0x37, 0xC9, 0x4A, 0xE5, 0x3A, 0xE3, 0x06, 0x66, 0xD8, 0x30, 0xD5, 0xE4, 0x98, + 0xA8, 0x53, 0xBA, 0x2B, 0xDC, 0xF2, 0x7F, 0x42, 0x06, 0x3E, 0xBE, 0x2C, 0xD0, 0x9A, 0x45, 0xB4, + 0x35, 0xDB, 0xBE, 0x37, 0xA8, 0x62, 0x4A, 0x4F, 0x44, 0x00, 0x6B, 0x2D, 0xDE, 0xBA, 0x38, 0xE1, + 0xB2, 0xF6, 0x05, 0x9E, 0x43, 0x43, 0x6B, 0x61, 0x88, 0xD2, 0x6B, 0x54, 0x02, 0xEA, 0xC2, 0xA5, + 0x59, 0x0A, 0x54, 0x96, 0xA1, 0x23, 0x01, 0x56, 0xBC, 0x68, 0xA4, 0x07, 0x78, 0x74, 0xEB, 0x3E, + 0x61, 0x1F, 0xAD, 0x20, 0x7A, 0xFD, 0x83, 0x6E, 0xA7, 0x41, 0x20, 0xF9, 0xB1, 0x14, 0x8C, 0x81, + 0x0D, 0xBC, 0x67, 0x9D, 0xE2, 0xE1, 0x26, 0x3B, 0x6E, 0x67, 0xD7, 0x47, 0x92, 0x7E, 0x47, 0x03, + 0x33, 0x18, 0xDC, 0xA3, 0x06, 0x86, 0x15, 0x25, 0x45, 0x7F, 0x89, 0x81, 0xD4, 0xBE, 0x3F, 0xC5, + 0xE8, 0xD1, 0x26, 0x3A, 0xF0, 0xE4, 0x30, 0x0C, 0x47, 0x2E, 0x19, 0x6D, 0x9B, 0x13, 0x2D, 0x5C, + 0xB4, 0x37, 0x61, 0x0E, 0x8A, 0x17, 0xEE, 0x8E, 0x38, 0x88, 0x7B, 0xA3, 0x11, 0xF2, 0xF0, 0x70, + 0x3A, 0x82, 0x18, 0x6F, 0xBA, 0xBD, 0x60, 0x03, 0x6A, 0x3A, 0x16, 0xDB, 0x0C, 0xA8, 0x63, 0x59, + 0xAA, 0xAB, 0x14, 0x82, 0xD6, 0x4C, 0xF1, 0x42, 0xA3, 0xF6, 0x5D, 0x1B, 0x4B, 0x1F, 0x46, 0xDC, + 0x21, 0xB8, 0xE7, 0xC0, 0x62, 0xB0, 0x1C, 0x35, 0x9F, 0xB2, 0x0B, 0x9F, 0x83, 0x7B, 0xD3, 0x19, + 0x62, 0xBE, 0x21, 0x57, 0xAC, 0xB5, 0xF5, 0xFA, 0x76, 0x5C, 0x9F, 0x5E, 0x9C, 0xF1, 0x5B, 0xA2, + 0x33, 0xB2, 0xFD, 0xD4, 0x54, 0x0D, 0xA9, 0x38, 0x74, 0x9D, 0x7A, 0x80, 0xA6, 0x2C, 0x2E, 0x9A, + 0x08, 0x92, 0x49, 0xB8, 0xFF, 0x88, 0xC1, 0xBE, 0x89, 0xED, 0x07, 0x22, 0x12, 0x8F, 0xA6, 0x2F, + 0x68, 0x0D, 0x32, 0x20, 0x77, 0x2E, 0xCF, 0x21, 0x44, 0x84, 0x4E, 0x0D, 0xAB, 0x66, 0xB3, 0x41, + 0x62, 0x5D, 0x46, 0x96, 0x93, 0x78, 0xC8, 0x8F, 0x5D, 0xB2, 0xFE, 0x91, 0xC1, 0xA4, 0x59, 0x7B, + 0x38, 0x31, 0xC2, 0x28, 0x43, 0x97, 0xC6, 0xD8, 0xF4, 0xA7, 0x1E, 0xAD, 0x00, 0xFB, 0xBF, 0x0F, + 0x7F, 0x27, 0x9D, 0xB2, 0x6C, 0x7F, 0x02, 0x43, 0x46, 0xD3, 0x21, 0x81, 0xD3, 0x02, 0x3A, 0x98, + 0xFA, 0x81, 0x3B, 0x66, 0x7F, 0xD7, 0x07, 0x94, 0x5D, 0xF5, 0xA6, 0x38, 0x26, 0x1A, 0x50, 0x7D, + 0x3C, 0xA8, 0x0E, 0x0B, 0xC2, 0x39, 0x41, 0x8B, 0xB2, 0xE0, 0xC3, 0x13, 0x67, 0x76, 0x48, 0xC7, + 0xA0, 0xEC, 0xAA, 0x83, 0xA1, 0xBA, 0x72, 0x9F, 0x06, 0x99, 0x8A, 0xC9, 0x1F, 0x98, 0xA5, 0x7C, + 0xCE, 0x40, 0xDF, 0x63, 0xB7, 0x3A, 0x4C, 0xEC, 0x80, 0x35, 0xF5, 0x3C, 0xF0, 0xEC, 0x49, 0x1F, + 0x13, 0xE6, 0x79, 0x73, 0x01, 0x75, 0x30, 0xB2, 0xE9, 0x6D, 0x7B, 0x55, 0x50, 0x90, 0x33, 0x02, + 0xDC, 0x08, 0x61, 0xAA, 0x39, 0xE0, 0xE3, 0x33, 0x1B, 0x4D, 0x3D, 0xD7, 0x76, 0x82, 0x1E, 0xF6, + 0xEE, 0xC8, 0x56, 0x4F, 0xD8, 0xD9, 0xCE, 0x0A, 0xF6, 0xE8, 0x89, 0x6C, 0x1B, 0x1C, 0x73, 0xD4, + 0x9B, 0x52, 0x65, 0x3F, 0x23, 0x30, 0x7F, 0x72, 0xEE, 0x3E, 0x56, 0x87, 0x62, 0x3A, 0x01, 0x76, + 0x1C, 0xF3, 0x12, 0xDF, 0x61, 0x0F, 0x3B, 0x03, 0xD6, 0xE7, 0x59, 0x89, 0x3A, 0x75, 0x87, 0x43, + 0xEA, 0x41, 0x33, 0x1B, 0x98, 0xBD, 0xCB, 0x5E, 0x25, 0x48, 0x31, 0x2C, 0xA6, 0x8C, 0x60, 0xFA, + 0x40, 0xEA, 0x29, 0x69, 0xBB, 0xC9, 0x8A, 0xC2, 0x2B, 0xA0, 0x44, 0x71, 0x30, 0xE0, 0xD2, 0xB8, + 0x0F, 0xCB, 0x97, 0x5A, 0xC4, 0x64, 0x3E, 0x59, 0x34, 0xB5, 0x26, 0xC9, 0x8F, 0xD6, 0xFD, 0x60, + 0x72, 0xC4, 0x03, 0xBE, 0x35, 0x24, 0x90, 0x0D, 0x17, 0xEC, 0x8E, 0x34, 0x25, 0x07, 0x89, 0xE3, + 0xA6, 0xAD, 0x92, 0xA2, 0x84, 0x7E, 0x87, 0xC8, 0x49, 0x51, 0xB4, 0x5E, 0xC9, 0xC9, 0xD7, 0x68, + 0x64, 0x37, 0x59, 0xE9, 0x42, 0x2D, 0xCF, 0x17, 0x56, 0x3F, 0x78, 0x26, 0x8B, 0x19, 0xF0, 0x78, + 0x44, 0xF3, 0xDC, 0xD5, 0x1C, 0xD7, 0xC1, 0xB5, 0x44, 0xEA, 0x36, 0x1A, 0x70, 0x5E, 0xA0, 0xF5, + 0xED, 0xC8, 0x1D, 0x7C, 0x8B, 0x9A, 0x93, 0xAD, 0x9D, 0x87, 0x61, 0xFD, 0x38, 0xE8, 0x7F, 0x44, + 0x2E, 0x5B, 0xA5, 0xB8, 0xF7, 0x32, 0x4D, 0xF3, 0x22, 0x22, 0xE0, 0x49, 0xB2, 0xE2, 0xB4, 0x75, + 0x2C, 0x75, 0x16, 0xAD, 0x0C, 0xCD, 0x25, 0xEB, 0xD1, 0xCA, 0xCA, 0x49, 0xBC, 0xC5, 0x88, 0xAB, + 0x0F, 0x46, 0x3E, 0xCF, 0x21, 0x07, 0x11, 0x50, 0x51, 0xFE, 0x91, 0xFF, 0x98, 0x92, 0xDD, 0x3A, + 0x4B, 0x93, 0xE6, 0x7A, 0x64, 0x9F, 0xD2, 0xA8, 0xB5, 0x45, 0x2B, 0x47, 0x0B, 0xB1, 0x3F, 0x2D, + 0xCF, 0x9D, 0x58, 0xEE, 0xA3, 0x53, 0xCB, 0x4A, 0x73, 0x23, 0xA0, 0xE0, 0x07, 0x60, 0xF2, 0x7D, + 0x69, 0x49, 0x5A, 0x3C, 0x05, 0xAA, 0x97, 0x76, 0xC4, 0x16, 0xBF, 0x3D, 0x7D, 0x6D, 0xF3, 0x8C, + 0x35, 0xD4, 0x2F, 0x44, 0x2E, 0x61, 0x7B, 0x1C, 0x5A, 0xB8, 0x1D, 0x0D, 0x62, 0xD8, 0x5F, 0x61, + 0x8F, 0xDC, 0xD2, 0x6D, 0x91, 0x57, 0x56, 0x2E, 0xF1, 0xD8, 0x7D, 0xC0, 0xF4, 0xC6, 0x0B, 0xCE, + 0xAA, 0x70, 0x33, 0x46, 0xFF, 0xE0, 0x15, 0xCA, 0xF2, 0x26, 0xBE, 0x6B, 0x7B, 0xEB, 0xB8, 0x41, + 0xA3, 0xAD, 0x5E, 0xB8, 0x35, 0x43, 0xB6, 0x51, 0x62, 0x7E, 0x14, 0xCF, 0xC2, 0x2D, 0xB0, 0x96, + 0x6B, 0x3A, 0x5A, 0xC4, 0x4B, 0xE6, 0x62, 0xB4, 0x48, 0xB7, 0xD6, 0x04, 0x11, 0xE4, 0xAB, 0xA9, + 0xB7, 0xEA, 0xE4, 0x5F, 0x01, 0x16, 0xA1, 0xA5, 0x34, 0x0D, 0xD1, 0x2D, 0x74, 0x39, 0x3A, 0xA2, + 0xEB, 0x6D, 0x1D, 0x2D, 0x61, 0x61, 0x29, 0x7A, 0x32, 0xED, 0x3B, 0xB9, 0x64, 0x69, 0x6C, 0x63, + 0xF4, 0xEE, 0x46, 0x0F, 0x95, 0x11, 0xC6, 0x68, 0xCE, 0x30, 0xE5, 0xA4, 0xD2, 0xAF, 0x6C, 0xBF, + 0x1D, 0xB2, 0xAD, 0x19, 0xB2, 0x5D, 0x7C, 0x4C, 0x56, 0x32, 0x9F, 0x25, 0x68, 0x97, 0x86, 0x5C, + 0x81, 0x55, 0x51, 0x72, 0xF3, 0x11, 0x9E, 0xC4, 0xE9, 0xFB, 0x1A, 0x61, 0x61, 0x0B, 0x75, 0x0D, + 0xC3, 0x68, 0x6A, 0x95, 0x22, 0xB5, 0x3E, 0x12, 0x5D, 0xD8, 0x42, 0xF4, 0xFC, 0x01, 0xA6, 0x46, + 0x59, 0x49, 0x42, 0x6F, 0x99, 0x89, 0x52, 0xD9, 0xCE, 0x83, 0xF7, 0x04, 0x2D, 0x78, 0x8B, 0x80, + 0x19, 0x51, 0x73, 0x86, 0x26, 0x42, 0x32, 0x18, 0x61, 0xD3, 0x0B, 0xB1, 0x14, 0x04, 0x5D, 0xD7, + 0x92, 0xDA, 0x9F, 0x0E, 0x06, 0xE4, 0x10, 0x42, 0x89, 0x15, 0xF3, 0x83, 0x45, 0xB0, 0x78, 0x05, + 0x1D, 0xA1, 0x75, 0x96, 0x22, 0x4C, 0x47, 0x5B, 0x0C, 0xB6, 0x30, 0x44, 0x3D, 0x7D, 0xE4, 0xC8, + 0x13, 0xD2, 0xC6, 0xB9, 0x19, 0x9E, 0x3B, 0xE2, 0x0C, 0xA8, 0x77, 0xFC, 0x9C, 0xA7, 0x3D, 0xB4, + 0x68, 0x8E, 0x90, 0xE1, 0x49, 0x19, 0x0C, 0xC6, 0xB0, 0xD4, 0xB7, 0x3D, 0xAA, 0x25, 0x1B, 0xDC, + 0x76, 0x1C, 0xD1, 0xB7, 0x9D, 0xD3, 0x0C, 0xDC, 0xAB, 0x25, 0x7B, 0x73, 0x8A, 0x69, 0x89, 0x9D, + 0x45, 0xFF, 0xA1, 0x9C, 0x1A, 0xD5, 0xF3, 0x6E, 0x79, 0x42, 0x93, 0x48, 0xF3, 0xC8, 0xD4, 0x75, + 0x2D, 0x97, 0x50, 0x8D, 0x67, 0x53, 0xC6, 0xF0, 0xF3, 0x41, 0x8B, 0xA7, 0x80, 0x28, 0x55, 0xE2, + 0x88, 0xD6, 0xB8, 0x9C, 0xF3, 0x44, 0x73, 0xB1, 0x97, 0x63, 0x42, 0x98, 0x04, 0x19, 0x50, 0xF7, + 0x1A, 0x7A, 0x09, 0xA2, 0x59, 0x55, 0x01, 0x3A, 0x75, 0xA4, 0xE2, 0x39, 0x50, 0x45, 0xA8, 0xB0, + 0x40, 0xF0, 0xB3, 0xF7, 0x47, 0x58, 0x60, 0x45, 0x39, 0xA5, 0x85, 0x7C, 0x39, 0x09, 0x0B, 0x5B, + 0x90, 0xBB, 0xB2, 0xBB, 0xBE, 0x4E, 0xA8, 0x3E, 0x23, 0xFB, 0x4C, 0x74, 0x8B, 0xC9, 0xFF, 0x82, + 0x47, 0x8C, 0x1D, 0x64, 0x50, 0x63, 0x06, 0x29, 0xAB, 0xB5, 0x40, 0xED, 0x8D, 0x46, 0xE6, 0xC4, + 0xC7, 0xEF, 0xCF, 0xFB, 0x7D, 0x96, 0x50, 0x87, 0x1E, 0xD9, 0x13, 0x92, 0x9D, 0x20, 0x00, 0x0E, + 0x64, 0x0B, 0x25, 0x02, 0x10, 0x14, 0x21, 0xE4, 0xFA, 0x6C, 0x6B, 0xD3, 0x28, 0x44, 0xC9, 0x46, + 0x3A, 0x21, 0x1B, 0xB3, 0x31, 0x83, 0xD2, 0x50, 0x98, 0x23, 0xD5, 0xE8, 0x48, 0xE3, 0x07, 0xAF, + 0xDB, 0x67, 0x4B, 0x10, 0xD1, 0xF6, 0x03, 0x16, 0x3B, 0x31, 0x30, 0x3D, 0x2C, 0x29, 0x71, 0x5E, + 0xA2, 0x9B, 0x9D, 0x20, 0xE5, 0xD1, 0x14, 0x23, 0x55, 0x59, 0x5B, 0xDD, 0x34, 0x26, 0x0B, 0xD7, + 0x32, 0x2D, 0x5D, 0x86, 0x3D, 0x66, 0xD9, 0x36, 0xD3, 0x49, 0x66, 0x0B, 0x36, 0xEF, 0x35, 0x28, + 0xE4, 0x2E, 0x93, 0x1D, 0xA6, 0x0D, 0xE7, 0x8B, 0x63, 0x1B, 0x8F, 0x2C, 0xBF, 0x21, 0x64, 0x88, + 0x3C, 0xE0, 0xCC, 0xE0, 0x5B, 0xF4, 0x81, 0x10, 0x44, 0xA8, 0xF2, 0x29, 0x62, 0x32, 0xB7, 0x54, + 0xF1, 0x6C, 0x52, 0x84, 0xFB, 0xA1, 0xBD, 0x0B, 0x48, 0x88, 0x36, 0x84, 0xA9, 0xCD, 0xE3, 0x31, + 0x82, 0xB6, 0x34, 0xEE, 0xB2, 0x6C, 0x43, 0x10, 0x32, 0xDE, 0x96, 0xFC, 0x5A, 0xB0, 0xF9, 0x7E, + 0x9C, 0xCA, 0x8B, 0xB4, 0xA5, 0x89, 0xBD, 0x2A, 0xE0, 0xA5, 0x42, 0xC5, 0xDB, 0x17, 0xC7, 0xDD, + 0xEB, 0x09, 0xDC, 0x12, 0x8D, 0x0C, 0x05, 0x9B, 0x0B, 0xD9, 0xBB, 0x28, 0x04, 0xF8, 0xB3, 0x58, + 0xD3, 0x4F, 0xF6, 0xB1, 0x1D, 0xB7, 0x7C, 0xB4, 0xEF, 0xEC, 0x82, 0x0D, 0xAF, 0x0E, 0x7A, 0xD7, + 0x87, 0x02, 0xD9, 0xE4, 0x10, 0x7C, 0x6D, 0x4D, 0x0A, 0x36, 0xA6, 0xAE, 0xF0, 0x71, 0x5B, 0x7A, + 0x54, 0x28, 0xD8, 0x34, 0x79, 0x06, 0x7E, 0x8E, 0x01, 0x09, 0x3B, 0xC7, 0x82, 0xE0, 0xFA, 0xCF, + 0x7E, 0x80, 0xC7, 0x31, 0x04, 0x9F, 0xFD, 0x5D, 0xAC, 0xF1, 0x91, 0x9C, 0xB5, 0x8D, 0x34, 0x8F, + 0xF2, 0xB8, 0x15, 0x03, 0x70, 0x7E, 0x25, 0x70, 0x10, 0x52, 0xBB, 0x15, 0x6B, 0x76, 0x2C, 0xA4, + 0xF1, 0x24, 0x0D, 0xC5, 0x23, 0x58, 0x04, 0x80, 0xEF, 0x30, 0x92, 0x4B, 0x20, 0x9B, 0xD8, 0x7C, + 0x92, 0x22, 0x86, 0x3E, 0xA9, 0x5F, 0x59, 0x90, 0x57, 0x1C, 0x12, 0x01, 0x77, 0x59, 0x2D, 0xC8, + 0xC1, 0xBC, 0xB6, 0x25, 0xE8, 0xDA, 0x0E, 0xC4, 0x19, 0xAF, 0x6D, 0x91, 0x96, 0xA6, 0x67, 0x0E, + 0x02, 0xEC, 0xF9, 0xA2, 0xB6, 0x95, 0x15, 0x41, 0x53, 0xC0, 0x0E, 0x53, 0x26, 0x15, 0x35, 0x53, + 0xED, 0x1A, 0x13, 0x71, 0x0B, 0x52, 0xE4, 0x1A, 0x46, 0xA7, 0xDB, 0xA2, 0x89, 0x7E, 0x93, 0x1A, + 0x9F, 0x95, 0x52, 0xBD, 0xDF, 0x31, 0x68, 0x03, 0x9D, 0x56, 0x89, 0xD8, 0x0B, 0x38, 0xE5, 0x98, + 0xEE, 0x46, 0x4C, 0xA4, 0x8E, 0x22, 0xDB, 0x21, 0x1F, 0x1E, 0x6A, 0x74, 0xCD, 0xD9, 0x32, 0x52, + 0xD7, 0x9C, 0x2D, 0xA3, 0x08, 0xE6, 0x04, 0xEC, 0x83, 0xF3, 0x8B, 0xD9, 0x40, 0xC7, 0x7B, 0xE1, + 0x34, 0x33, 0x6A, 0x74, 0x33, 0xA4, 0xD9, 0x25, 0xEB, 0x46, 0xDF, 0x89, 0x5B, 0x1F, 0x98, 0x84, + 0x4F, 0xDE, 0x07, 0xD7, 0x0F, 0xB8, 0x1C, 0xAC, 0x27, 0xE4, 0x60, 0x3D, 0x45, 0x0E, 0x34, 0x1C, + 0x48, 0xE1, 0x42, 0x02, 0x1F, 0x68, 0x36, 0x86, 0x6F, 0x0B, 0x7E, 0x54, 0x94, 0xF4, 0x63, 0x49, + 0x54, 0x9A, 0xBE, 0xD1, 0xE4, 0xBE, 0xCC, 0xD0, 0x49, 0x71, 0xAD, 0x1A, 0x2A, 0xA2, 0x55, 0xA3, + 0x7A, 0xDF, 0x58, 0x4F, 0xAE, 0x7D, 0xEC, 0x69, 0x3A, 0x08, 0x9F, 0xA9, 0x0A, 0x0C, 0xBE, 0x75, + 0x87, 0x6E, 0x7B, 0xE0, 0x8E, 0xE1, 0x2F, 0xF8, 0x8A, 0xC6, 0x40, 0xC0, 0x94, 0xAC, 0xBD, 0x44, + 0xA7, 0xD8, 0x64, 0x37, 0x3B, 0x36, 0xED, 0x11, 0x22, 0x2B, 0xBA, 0x47, 0xF6, 0x49, 0x8B, 0x20, + 0xE1, 0xF1, 0xF1, 0xB1, 0x3D, 0x5F, 0x32, 0x52, 0x8E, 0x39, 0xEC, 0xE8, 0xCA, 0x28, 0x4B, 0x97, + 0x31, 0x91, 0x25, 0x52, 0xBF, 0xB2, 0x5B, 0x73, 0x89, 0xE9, 0x76, 0x8C, 0x4E, 0xA1, 0x56, 0xD2, + 0xD8, 0xD7, 0x6E, 0x47, 0x96, 0x77, 0xD3, 0x9F, 0x98, 0xDE, 0xB7, 0xE3, 0xA9, 0xD3, 0xA9, 0x95, + 0x84, 0xD0, 0xFB, 0x54, 0x86, 0xD2, 0x90, 0xEF, 0x01, 0xF6, 0x83, 0xFF, 0x03, 0xFF, 0x94, 0xED, + 0x2A, 0x00, 0x20, 0x28, 0x09, 0x88, 0x9A, 0x6A, 0x2F, 0x17, 0xEA, 0x5E, 0x79, 0xA6, 0xE3, 0x8F, + 0xED, 0xE0, 0xFD, 0xFB, 0xBD, 0x5A, 0xCA, 0x4D, 0x77, 0xC2, 0x9E, 0x08, 0xBB, 0xBD, 0xEB, 0xFD, + 0x5F, 0x43, 0x47, 0x29, 0xD1, 0x9E, 0xBA, 0xB2, 0x32, 0xA6, 0x47, 0x44, 0xA8, 0x62, 0x5B, 0x3E, + 0xF2, 0x03, 0xD3, 0xA3, 0x86, 0x5B, 0x7A, 0x75, 0xAA, 0x78, 0xE1, 0xC6, 0x26, 0xD8, 0xB8, 0x20, + 0xDB, 0xCC, 0x58, 0x67, 0x71, 0x73, 0xB6, 0xF5, 0xAF, 0x3B, 0x0A, 0xAC, 0xAF, 0x99, 0x69, 0xC6, + 0x05, 0xF8, 0xA9, 0x06, 0xAA, 0xA4, 0x43, 0xA3, 0xD0, 0x8A, 0xD9, 0x13, 0xD5, 0xF9, 0x23, 0x9D, + 0x10, 0x85, 0xB6, 0x8A, 0x84, 0x97, 0x61, 0x0A, 0xF5, 0xB8, 0x9C, 0x23, 0x63, 0x28, 0xBC, 0x1F, + 0xCE, 0x1C, 0x7A, 0x56, 0xD3, 0x33, 0x48, 0x23, 0x5A, 0x70, 0xBA, 0xD3, 0x09, 0x57, 0x55, 0x86, + 0x68, 0x3D, 0x67, 0x7F, 0x38, 0x4F, 0xD8, 0x41, 0x3A, 0x5D, 0x6A, 0xE6, 0xD5, 0xDB, 0xD8, 0xF7, + 0xF7, 0x7F, 0x54, 0x97, 0x5F, 0x87, 0xE0, 0xC7, 0x96, 0x8A, 0x6C, 0xE9, 0xA7, 0x6F, 0xCC, 0x88, + 0x5B, 0xDE, 0x70, 0x9F, 0xA6, 0xF1, 0x39, 0x28, 0xBA, 0x4D, 0xE3, 0xBB, 0x26, 0xF7, 0x96, 0x2C, + 0x04, 0x0F, 0x3C, 0xD5, 0x33, 0x39, 0xEC, 0x5B, 0xB0, 0x2E, 0x6F, 0x80, 0x5D, 0xC4, 0xD0, 0xED, + 0x24, 0x37, 0x0C, 0xD8, 0xD1, 0x90, 0x32, 0x71, 0xF5, 0xDE, 0xD7, 0x27, 0xB2, 0xCE, 0xC6, 0xD6, + 0x73, 0x7D, 0x1B, 0xFE, 0xBB, 0x37, 0x18, 0x4C, 0xC9, 0xDE, 0xE8, 0x99, 0xED, 0x9E, 0xD6, 0xDB, + 0x1D, 0x0D, 0xD6, 0x4E, 0x9B, 0xA2, 0x5D, 0x6F, 0x67, 0xA1, 0x4D, 0x5B, 0xFA, 0xA8, 0xC7, 0xC2, + 0x11, 0x0D, 0x3C, 0x6D, 0x49, 0x4F, 0x2B, 0xA5, 0xAF, 0x96, 0x51, 0x93, 0xCF, 0xD0, 0x44, 0x78, + 0x72, 0xA9, 0x40, 0x93, 0x2F, 0xA4, 0x89, 0xF0, 0x14, 0x53, 0x4E, 0x8B, 0x53, 0x33, 0x00, 0xFB, + 0x3C, 0x6D, 0xD3, 0x36, 0xB6, 0x8C, 0xEE, 0xD6, 0xDA, 0x9B, 0xAD, 0xBC, 0x36, 0xAE, 0x33, 0xE4, + 0x8D, 0xD8, 0xD3, 0x52, 0x9B, 0xEB, 0xC6, 0xFA, 0x9B, 0x8D, 0x4E, 0x4E, 0xB3, 0xBD, 0x51, 0x60, + 0x07, 0x53, 0x8B, 0x1E, 0xC5, 0xD6, 0x37, 0x08, 0xB6, 0xCD, 0x0C, 0x44, 0xFC, 0x26, 0xFF, 0x03, + 0xB6, 0x87, 0xF7, 0x80, 0xC8, 0xC8, 0xAD, 0xAA, 0x5C, 0xFA, 0x0B, 0x4D, 0x0A, 0xED, 0xE4, 0x52, + 0xE4, 0x30, 0x1D, 0x6D, 0xB6, 0x28, 0x11, 0x51, 0x91, 0x65, 0x22, 0x9C, 0x31, 0xD9, 0x4E, 0x31, + 0x59, 0x93, 0xA7, 0xEA, 0x08, 0xCE, 0x30, 0x8A, 0xD5, 0x46, 0xB2, 0xE4, 0x68, 0x96, 0x1C, 0x51, + 0x8D, 0x53, 0xB1, 0x3C, 0xC7, 0xE5, 0xF9, 0xF6, 0xC6, 0xA0, 0x3F, 0x2D, 0x14, 0xFD, 0x12, 0xCD, + 0xEE, 0xB0, 0x0C, 0xA6, 0x36, 0xFF, 0xB5, 0x80, 0x56, 0xC9, 0xC3, 0xFA, 0xF9, 0x87, 0x60, 0xFD, + 0xB2, 0x10, 0xAC, 0xDF, 0xB3, 0xDD, 0x1B, 0x2B, 0xE8, 0xB9, 0x8A, 0xBA, 0xAE, 0x9C, 0xBE, 0xD3, + 0xB0, 0x2D, 0xF6, 0x4B, 0x21, 0xCB, 0xD9, 0x47, 0xEC, 0x41, 0xCE, 0x39, 0xF2, 0x6D, 0x85, 0xBA, + 0xF2, 0xC6, 0x91, 0x23, 0xC5, 0x18, 0x2E, 0xC8, 0xFF, 0x72, 0xA7, 0x63, 0xAC, 0xAE, 0xB5, 0xD0, + 0xE6, 0xA6, 0x64, 0x5B, 0x62, 0x9F, 0x81, 0xD9, 0x50, 0x50, 0x68, 0xD1, 0x48, 0x41, 0xA8, 0x4E, + 0x9D, 0x65, 0x78, 0xB1, 0xCF, 0x68, 0x21, 0xFE, 0x1F, 0x01, 0xE3, 0x3A, 0x1F, 0x5E, 0xFA, 0x4B, + 0x75, 0x91, 0x4A, 0x9B, 0x7C, 0xCB, 0x5D, 0x83, 0xCC, 0x74, 0x7A, 0x6D, 0xDC, 0x96, 0x10, 0xD3, + 0x0F, 0x80, 0x98, 0xFE, 0x52, 0x5C, 0xAA, 0xBE, 0x67, 0x18, 0x7D, 0x22, 0x37, 0xBC, 0x4A, 0x46, + 0x1F, 0xD6, 0x3A, 0x3E, 0x90, 0xDF, 0x18, 0xA5, 0xCD, 0x7F, 0x31, 0xE9, 0xE7, 0x57, 0x97, 0x27, + 0xBD, 0x42, 0xB6, 0x1F, 0x11, 0x2D, 0x9C, 0xE4, 0x43, 0xB4, 0xC5, 0xAC, 0x3F, 0x45, 0x31, 0x6A, + 0x7A, 0x1A, 0x1F, 0xE2, 0x17, 0xD8, 0xD3, 0x4C, 0xBC, 0xBD, 0x4F, 0x73, 0xC4, 0x5C, 0xDC, 0xF2, + 0xA2, 0x1D, 0xE8, 0x12, 0xB6, 0x17, 0xED, 0x88, 0x15, 0xB0, 0xBE, 0x88, 0xED, 0xC0, 0x90, 0xC1, + 0xF0, 0x96, 0xB2, 0x85, 0xA8, 0x20, 0x38, 0x07, 0x6B, 0xC5, 0xDA, 0x29, 0x23, 0xCE, 0x4C, 0x3F, + 0xD6, 0xA3, 0x13, 0x3C, 0x3A, 0xDD, 0xB2, 0x10, 0x42, 0xCC, 0x9F, 0x2E, 0xD7, 0x1F, 0x2F, 0xDD, + 0xB5, 0x0F, 0x65, 0x28, 0xA7, 0x4C, 0xEF, 0x14, 0xA7, 0x5B, 0x60, 0x75, 0x27, 0x7B, 0x57, 0xA7, + 0xE7, 0x73, 0x69, 0x54, 0x9C, 0xB5, 0x9D, 0x4A, 0xAC, 0xAD, 0xD4, 0xAA, 0x1C, 0x36, 0x81, 0x8D, + 0xDD, 0x4A, 0x6C, 0xEC, 0x56, 0x61, 0x63, 0xB7, 0x22, 0x1B, 0xBB, 0x95, 0xD8, 0xD8, 0xAD, 0xC8, + 0xC6, 0x6E, 0x25, 0x36, 0xAE, 0x56, 0x62, 0xE3, 0x6A, 0x15, 0x36, 0xAE, 0x56, 0x64, 0xE3, 0x6A, + 0x25, 0x36, 0xAE, 0x56, 0x64, 0xA3, 0xDC, 0x4E, 0x38, 0xD5, 0x8B, 0x1E, 0xE1, 0xDA, 0xD3, 0x7D, + 0x9E, 0xE3, 0x78, 0xD6, 0xE2, 0x1C, 0x06, 0xB7, 0xD0, 0x98, 0x11, 0x01, 0xC2, 0x21, 0x4D, 0x70, + 0xC7, 0x6F, 0xD7, 0xAE, 0xDC, 0x6F, 0x18, 0x6C, 0x06, 0xB4, 0xF2, 0xB6, 0x7C, 0x58, 0xA2, 0xDF, + 0xA2, 0xFC, 0x19, 0x89, 0x8C, 0x41, 0xDA, 0xFB, 0xBE, 0x6C, 0x3C, 0x2D, 0xB4, 0xBA, 0xC1, 0xFE, + 0x1F, 0x2D, 0x50, 0xAB, 0x1B, 0x69, 0xD7, 0x7F, 0xBD, 0x2A, 0xD7, 0x01, 0xB9, 0x04, 0x24, 0x8D, + 0xDD, 0xE6, 0x34, 0x70, 0x7F, 0xC1, 0xCF, 0x97, 0xD8, 0xC1, 0x8F, 0xE6, 0xA8, 0x80, 0x91, 0x1B, + 0x2E, 0xBD, 0x73, 0x6F, 0x3E, 0xE1, 0x2E, 0xFC, 0x1C, 0x07, 0x8F, 0xAE, 0xF7, 0xED, 0xC6, 0xE8, + 0xF7, 0x4F, 0x0E, 0xD9, 0xE5, 0x9C, 0xB4, 0x38, 0x1B, 0x99, 0x8B, 0xB3, 0x70, 0xB7, 0xAE, 0xBB, + 0xF9, 0xD3, 0x22, 0xEA, 0x99, 0xBE, 0x4F, 0x7E, 0xB3, 0x5E, 0x02, 0x59, 0xE7, 0xA5, 0x7A, 0xD5, + 0x79, 0xC9, 0x5E, 0x75, 0x5F, 0xAA, 0x57, 0xDD, 0x97, 0xEC, 0xD5, 0xEA, 0x4B, 0xF5, 0x6A, 0x75, + 0x9E, 0xBD, 0x92, 0xB5, 0xE0, 0xD5, 0x20, 0x79, 0x13, 0x5D, 0xF8, 0x54, 0x12, 0xC5, 0x5F, 0xC4, + 0x57, 0xC2, 0x1B, 0xEB, 0xEB, 0xAB, 0x89, 0x5B, 0x68, 0xFA, 0x31, 0x87, 0xAC, 0xEF, 0x29, 0xD4, + 0x55, 0x3E, 0x32, 0x45, 0x11, 0x20, 0x8B, 0x22, 0xEE, 0xDA, 0xAA, 0x4E, 0xDC, 0xD4, 0x9A, 0x3B, + 0x71, 0x2B, 0x2B, 0x17, 0x0E, 0x0A, 0xBD, 0x5F, 0x5A, 0xE8, 0xEA, 0xA0, 0x87, 0xD8, 0xE0, 0x50, + 0x27, 0x05, 0x86, 0x0D, 0x0D, 0x4C, 0x07, 0x39, 0x2E, 0x85, 0xCF, 0x3A, 0x61, 0x21, 0x33, 0x80, + 0x5B, 0x64, 0xE4, 0x83, 0x9D, 0x3D, 0xB0, 0xC7, 0x38, 0x32, 0x8E, 0x4F, 0x09, 0x14, 0xD7, 0x41, + 0x80, 0xB1, 0x05, 0x55, 0x9E, 0x69, 0xEB, 0x5B, 0xDC, 0x6E, 0xB7, 0xA3, 0x00, 0x4B, 0xEA, 0xAE, + 0xC1, 0x13, 0x85, 0x9D, 0x4D, 0x03, 0xFC, 0x94, 0x94, 0x2B, 0xF0, 0xC0, 0x51, 0x06, 0x93, 0x7C, + 0xAA, 0x4C, 0x5E, 0x06, 0x33, 0x42, 0xAA, 0x98, 0xFF, 0x50, 0xC6, 0xD2, 0x1F, 0x07, 0x2C, 0x95, + 0xB4, 0xEA, 0x8F, 0xCD, 0x27, 0xD2, 0xF6, 0xCA, 0x0E, 0x1D, 0x6F, 0x3A, 0xC6, 0x7A, 0xA7, 0x6B, + 0x24, 0x3C, 0x13, 0x3A, 0x2D, 0xF2, 0xBD, 0xD5, 0x95, 0xCD, 0x15, 0x92, 0x57, 0x53, 0xCE, 0xB9, + 0x9B, 0xE1, 0x39, 0xA5, 0x9B, 0x84, 0x39, 0x61, 0x2A, 0xB4, 0xD0, 0x4B, 0xFD, 0xDB, 0x30, 0xD0, + 0x5F, 0x51, 0x37, 0xC3, 0xD2, 0xAE, 0x50, 0xA9, 0xD4, 0x4F, 0xB1, 0x83, 0x48, 0xF1, 0x62, 0x25, + 0xD9, 0x1F, 0xB7, 0x3D, 0x71, 0x02, 0xB0, 0x52, 0x8F, 0xF8, 0xD4, 0x49, 0x32, 0x66, 0x63, 0x5E, + 0x2C, 0xD1, 0xE3, 0x34, 0x34, 0xFB, 0xCE, 0x70, 0xEE, 0xC5, 0xBD, 0x2E, 0xF2, 0x8E, 0xB1, 0xD8, + 0xCD, 0x93, 0xDE, 0x1E, 0xF3, 0xE1, 0x88, 0x1F, 0x1F, 0x3D, 0xE9, 0xD5, 0x84, 0xAE, 0x39, 0x8E, + 0xD3, 0x16, 0xFE, 0x2F, 0xF6, 0xF0, 0x28, 0xFD, 0xB5, 0xD2, 0x1C, 0x14, 0x87, 0xE7, 0xFD, 0x85, + 0xE3, 0x78, 0x6F, 0x06, 0x64, 0x1F, 0xF8, 0xBC, 0x70, 0x3C, 0xFD, 0xE9, 0x2D, 0xF9, 0x77, 0xBE, + 0x68, 0xB8, 0xF0, 0x85, 0x28, 0xCE, 0x83, 0x09, 0x57, 0xDA, 0x46, 0x52, 0x69, 0x1B, 0x5A, 0xA5, + 0x9D, 0x82, 0x48, 0x90, 0x9D, 0xF3, 0xAB, 0x5E, 0x75, 0xB1, 0x89, 0x8C, 0x75, 0x84, 0xB0, 0xD1, + 0xE8, 0xE8, 0x69, 0xE2, 0x3A, 0x4C, 0xF1, 0xAE, 0x12, 0x49, 0x7D, 0x23, 0x1E, 0x0B, 0xA8, 0xCA, + 0x78, 0x23, 0x92, 0x16, 0x7B, 0x3B, 0xE6, 0x9A, 0x02, 0x27, 0x84, 0x9E, 0x81, 0x4D, 0xF3, 0x93, + 0xB4, 0xD0, 0x32, 0xF8, 0x63, 0x49, 0xF6, 0xD2, 0x55, 0xDA, 0x77, 0xA3, 0x2A, 0xF0, 0x4B, 0xD7, + 0x25, 0x67, 0x8B, 0x11, 0x95, 0x11, 0xB0, 0x03, 0x1B, 0x09, 0x5B, 0x3F, 0xB3, 0x02, 0x1B, 0x2D, + 0xF8, 0xAA, 0x98, 0x82, 0x4B, 0x23, 0xB2, 0xFD, 0x09, 0x4F, 0xB5, 0xB2, 0x10, 0x6C, 0xB1, 0x51, + 0x71, 0x12, 0x19, 0x9C, 0x4F, 0x2C, 0x6E, 0x49, 0x4C, 0x18, 0x12, 0xE9, 0xDE, 0xCD, 0xCF, 0xC6, + 0x20, 0x9D, 0x6F, 0xBD, 0xAC, 0x73, 0xAD, 0x1A, 0xB9, 0x5C, 0x52, 0xC7, 0x62, 0xB1, 0x39, 0xAC, + 0x04, 0xFB, 0xEC, 0xB2, 0x98, 0x81, 0x0B, 0xD5, 0xAD, 0xCA, 0x2D, 0xAE, 0x73, 0x75, 0xDC, 0xEA, + 0xA5, 0x3C, 0x63, 0x9C, 0x87, 0x5B, 0x5C, 0xFD, 0x66, 0xC7, 0x28, 0xFA, 0xBC, 0x08, 0x79, 0x81, + 0xE2, 0x28, 0xB6, 0x54, 0x2F, 0xD0, 0x44, 0xE4, 0x9B, 0x7F, 0x6A, 0xDF, 0x61, 0xBE, 0x15, 0x21, + 0x73, 0x9F, 0x2C, 0xCB, 0x02, 0x59, 0xEB, 0x54, 0x6C, 0xBA, 0x12, 0x3D, 0xE9, 0xEE, 0xD1, 0x4D, + 0x31, 0x34, 0x26, 0x25, 0x93, 0x79, 0x22, 0x48, 0x06, 0x62, 0xA8, 0x79, 0x25, 0x31, 0x02, 0x57, + 0x0E, 0x17, 0x90, 0x5C, 0x4F, 0x45, 0x8F, 0xE3, 0x1D, 0x24, 0x3F, 0xC4, 0x11, 0x07, 0xC6, 0xD5, + 0x7D, 0xF3, 0x01, 0xEF, 0x07, 0xF0, 0xFA, 0x4D, 0xAD, 0x47, 0xD6, 0x40, 0xB2, 0x2A, 0xD2, 0xA5, + 0x90, 0x86, 0x02, 0x09, 0x20, 0x96, 0xC8, 0x07, 0xFA, 0x67, 0xD2, 0x68, 0x13, 0xC6, 0x97, 0x45, + 0xA0, 0xC4, 0x1A, 0x8B, 0x4D, 0xC0, 0x2E, 0x2E, 0xE6, 0x4A, 0x9F, 0x77, 0xE7, 0xD7, 0x65, 0xFF, + 0xD5, 0xF6, 0xF9, 0x1F, 0xB2, 0xFD, 0xA5, 0x48, 0x3E, 0x93, 0x53, 0xD7, 0x84, 0x90, 0xCC, 0x36, + 0xE2, 0x5D, 0x7F, 0x34, 0xED, 0x80, 0x6C, 0xEE, 0xEB, 0xB2, 0xD3, 0x87, 0x5E, 0x2A, 0xF5, 0x2E, + 0x42, 0xA1, 0x7F, 0x50, 0xB2, 0xB7, 0x6F, 0xC3, 0x1E, 0xC4, 0x56, 0x31, 0x31, 0x4A, 0x35, 0x0C, + 0x28, 0x4F, 0xEC, 0x35, 0xE5, 0x61, 0x12, 0xCB, 0xC5, 0x30, 0x49, 0x71, 0x1C, 0xFB, 0xE6, 0x03, + 0x74, 0xAA, 0xDD, 0x56, 0x2E, 0x22, 0x95, 0x08, 0xD3, 0x5A, 0x9C, 0xBF, 0xA5, 0x95, 0x35, 0x06, + 0x2D, 0x05, 0xCC, 0x10, 0xA7, 0x45, 0xD5, 0x24, 0x82, 0x7C, 0xA4, 0x80, 0xA3, 0x99, 0xE2, 0x6B, + 0xE6, 0x10, 0x63, 0x33, 0x53, 0x9C, 0xCD, 0x9C, 0x62, 0x6D, 0xE6, 0x10, 0x6F, 0x33, 0x63, 0xCC, + 0xCD, 0x4C, 0x71, 0x37, 0x33, 0xC7, 0xDE, 0x2C, 0x20, 0x88, 0x66, 0xE6, 0x40, 0x9A, 0xB9, 0x04, + 0xD3, 0xCC, 0x10, 0x50, 0x33, 0x73, 0x50, 0x8D, 0x36, 0x83, 0x06, 0xE8, 0x03, 0x86, 0xF4, 0x9F, + 0x66, 0x89, 0x7C, 0x7D, 0x0B, 0x58, 0xCA, 0xF2, 0xB2, 0x40, 0x6D, 0x1D, 0xED, 0xD4, 0x34, 0xA1, + 0xA8, 0x6A, 0x54, 0x90, 0x18, 0x67, 0x3E, 0xAF, 0x07, 0x13, 0x29, 0x2C, 0xD0, 0xF0, 0xBA, 0x27, + 0x89, 0xE5, 0xBD, 0x34, 0x0B, 0x76, 0x8F, 0x9B, 0xFE, 0xE5, 0x2F, 0x28, 0xA5, 0x25, 0x7B, 0xE7, + 0xB5, 0x62, 0x6B, 0xF6, 0x5C, 0x69, 0x55, 0xD4, 0xEC, 0xCD, 0x4D, 0x5D, 0x6B, 0x6D, 0xB2, 0x44, + 0x5D, 0xD8, 0x48, 0xEE, 0xA2, 0xA6, 0x08, 0x64, 0xF2, 0x51, 0x4E, 0x51, 0x36, 0xEF, 0x5D, 0x97, + 0xFC, 0x87, 0x9C, 0x4F, 0xE5, 0xB7, 0x39, 0x13, 0x0E, 0x3C, 0xB1, 0xE8, 0x2E, 0x2D, 0xA5, 0x3B, + 0x6E, 0xE9, 0x1C, 0xA9, 0x28, 0x15, 0xDA, 0xA7, 0x41, 0x93, 0xB6, 0x5C, 0x8D, 0x60, 0x5C, 0xB9, + 0xDE, 0xE0, 0xBE, 0x96, 0x22, 0x14, 0x9A, 0xC7, 0xCC, 0x8B, 0xCB, 0x85, 0xAE, 0x71, 0x29, 0xD1, + 0x48, 0x7D, 0xC2, 0x7E, 0x06, 0x02, 0x7E, 0x0A, 0x88, 0x56, 0x40, 0x34, 0xEA, 0x67, 0xDF, 0x0E, + 0xCE, 0xCC, 0x49, 0x1C, 0xE2, 0x3E, 0xB6, 0x1D, 0xF2, 0x8F, 0xF9, 0xD4, 0x42, 0xB7, 0xB4, 0x44, + 0x48, 0x2A, 0xD2, 0x8A, 0x16, 0xB4, 0x93, 0x43, 0x71, 0xF5, 0x09, 0x2F, 0x8E, 0xA3, 0x24, 0x89, + 0x1C, 0xE1, 0xD8, 0xF4, 0xBF, 0xB1, 0x12, 0x06, 0x4A, 0x2E, 0xA5, 0xE2, 0xC7, 0x5A, 0xBF, 0x03, + 0xAC, 0x4C, 0xA7, 0xB1, 0x0F, 0xBB, 0x40, 0x01, 0xFB, 0xD0, 0xA0, 0x50, 0xC8, 0x58, 0x77, 0xD0, + 0xBB, 0x77, 0x0C, 0x1B, 0x19, 0x43, 0x32, 0x9C, 0x86, 0x3C, 0x94, 0xD9, 0xD9, 0x48, 0x52, 0x92, + 0x9C, 0x08, 0x8D, 0x85, 0xAE, 0xE5, 0x8E, 0xBC, 0x66, 0x90, 0x32, 0x6D, 0xAE, 0x61, 0xE6, 0x14, + 0x65, 0x20, 0xC2, 0x30, 0x15, 0xC2, 0x09, 0x8D, 0x6F, 0xA3, 0x8F, 0xE0, 0x3D, 0x5D, 0x0B, 0x0F, + 0xEC, 0x09, 0xD9, 0x9A, 0x80, 0x05, 0x44, 0x1D, 0xBA, 0xC8, 0x49, 0x52, 0x4C, 0x57, 0x65, 0xC3, + 0x55, 0xB4, 0xEC, 0x6A, 0xBC, 0x2D, 0x64, 0xA7, 0x8A, 0x7A, 0x89, 0x76, 0xB4, 0x8E, 0x7F, 0x42, + 0x2A, 0x48, 0x0B, 0x07, 0x64, 0xDF, 0x82, 0xAD, 0x63, 0xA2, 0x49, 0x38, 0xA4, 0x38, 0x09, 0xA6, + 0x90, 0x08, 0xEB, 0x21, 0xCC, 0xB6, 0x09, 0x8E, 0xD1, 0x2C, 0x83, 0xAB, 0x6D, 0x91, 0x23, 0x87, + 0x7D, 0xF7, 0x1C, 0xA5, 0x8A, 0x6D, 0x88, 0xE2, 0xD1, 0x8C, 0x05, 0x40, 0x6E, 0xB7, 0x83, 0x64, + 0x2F, 0x6B, 0xBF, 0x7D, 0x70, 0x71, 0x71, 0x79, 0x78, 0x72, 0xBE, 0x77, 0x75, 0x74, 0x73, 0x72, + 0xDE, 0xBB, 0xBE, 0xBA, 0xB9, 0xFA, 0xDC, 0x83, 0x5F, 0x3F, 0xEE, 0x9D, 0x9E, 0x1C, 0xDE, 0x5C, + 0x9F, 0xFF, 0x72, 0x7E, 0xF1, 0xE9, 0x3C, 0x11, 0x62, 0x11, 0x0D, 0x31, 0x10, 0x1A, 0x83, 0x84, + 0xB0, 0x0D, 0xD2, 0x13, 0x34, 0x75, 0xBE, 0x39, 0x90, 0x63, 0x6B, 0xFB, 0x55, 0x4A, 0x0F, 0x9D, + 0x17, 0x44, 0x49, 0x3C, 0x60, 0x8F, 0x30, 0x5F, 0xA0, 0xFE, 0x1D, 0x5A, 0xEE, 0x6C, 0x1A, 0x6C, + 0x56, 0xE8, 0xCA, 0xC9, 0x6E, 0x6A, 0x53, 0x99, 0x14, 0x09, 0x66, 0xC4, 0xEE, 0xA7, 0x9B, 0xCC, + 0x10, 0xB8, 0x69, 0xBC, 0x4E, 0x36, 0x64, 0x4C, 0x21, 0x2E, 0x3D, 0x82, 0x9C, 0x87, 0xAE, 0xF1, + 0xDB, 0x3A, 0x81, 0x64, 0xC9, 0x7F, 0x2B, 0x48, 0x24, 0x6D, 0xF8, 0x53, 0x24, 0x7F, 0x8A, 0x64, + 0x61, 0x91, 0x4C, 0x88, 0xCF, 0x9F, 0x76, 0x24, 0xCD, 0x98, 0xCD, 0x08, 0xA6, 0x67, 0x7D, 0x16, + 0x04, 0x4D, 0x63, 0x3C, 0x5F, 0x11, 0x1F, 0x32, 0x17, 0x05, 0x91, 0x94, 0x89, 0x67, 0x3B, 0xF4, + 0x29, 0xF5, 0x78, 0xA6, 0x55, 0x9B, 0x41, 0x59, 0x03, 0x50, 0x95, 0x12, 0x69, 0x30, 0xE2, 0x0C, + 0x91, 0xB0, 0xFE, 0x59, 0xE0, 0x13, 0x00, 0x37, 0xF2, 0x9A, 0x44, 0xE7, 0xAD, 0x70, 0x9A, 0x42, + 0x39, 0xD9, 0x56, 0xAD, 0x8C, 0x60, 0x70, 0x03, 0x18, 0x37, 0x1E, 0x50, 0x1A, 0x2D, 0xCC, 0x4A, + 0x5A, 0x4D, 0x21, 0x83, 0x8F, 0xBC, 0x26, 0xC7, 0x2B, 0x29, 0x9F, 0x37, 0x14, 0x59, 0x23, 0xAC, + 0xD3, 0xD2, 0x91, 0x21, 0x64, 0xDF, 0x51, 0x14, 0x5F, 0x26, 0x34, 0x52, 0x29, 0x13, 0x5C, 0x32, + 0xE0, 0x82, 0x65, 0x5C, 0xF6, 0x69, 0x77, 0x43, 0x36, 0x73, 0x16, 0x68, 0xF7, 0x90, 0x89, 0x3C, + 0x49, 0xF1, 0x26, 0xB2, 0xF2, 0xE6, 0xB1, 0xE0, 0xF6, 0x90, 0x43, 0x80, 0x0D, 0xC9, 0x8F, 0xDB, + 0x0F, 0xB2, 0x07, 0x2A, 0xE2, 0x9D, 0xD5, 0x4E, 0x6A, 0x36, 0xAA, 0xB9, 0x1D, 0x3E, 0xBE, 0x97, + 0xC7, 0xCE, 0x72, 0x50, 0x65, 0x51, 0x20, 0x06, 0x80, 0x94, 0xA1, 0xA0, 0xB2, 0xDE, 0x4C, 0x97, + 0x25, 0x7E, 0xD3, 0x38, 0x77, 0x61, 0x8A, 0x5F, 0x0C, 0x91, 0x65, 0x2A, 0xF6, 0x5C, 0x05, 0xD1, + 0x9A, 0x9F, 0x24, 0x65, 0x0C, 0x4E, 0x22, 0x9E, 0x62, 0x6E, 0x43, 0x23, 0x65, 0x66, 0xE0, 0x0E, + 0xCD, 0x33, 0xB7, 0x35, 0x4A, 0xCA, 0x44, 0xE2, 0x98, 0xFA, 0x52, 0x8B, 0x71, 0xBA, 0x50, 0xC5, + 0x8E, 0x15, 0x52, 0xB2, 0xCC, 0xB2, 0xD2, 0x04, 0x2B, 0xB7, 0xC5, 0x9E, 0xBF, 0x61, 0xB2, 0xC3, + 0x5F, 0xBD, 0x69, 0xD7, 0x45, 0x5F, 0xC4, 0x86, 0x25, 0x3C, 0x51, 0xF7, 0x27, 0x78, 0x50, 0x30, + 0xA6, 0x99, 0x1E, 0x6C, 0xA1, 0xFC, 0x37, 0xE3, 0x2B, 0x57, 0x5E, 0xF4, 0x9B, 0xED, 0x9F, 0x9B, + 0xE7, 0x0D, 0x76, 0x49, 0x13, 0x96, 0x37, 0x9B, 0xAC, 0x2C, 0xAC, 0xFE, 0x0E, 0x19, 0xF2, 0x87, + 0x5D, 0xC8, 0xC4, 0xD7, 0xD4, 0x42, 0xEF, 0xE4, 0x40, 0xEF, 0xC8, 0xD0, 0x3B, 0x2A, 0xF4, 0x4E, + 0x26, 0xF4, 0x6E, 0x0E, 0xF4, 0xAE, 0x0C, 0xBD, 0xAB, 0x42, 0xEF, 0x66, 0x42, 0x5F, 0xCD, 0x81, + 0xBE, 0x2A, 0x43, 0x5F, 0x55, 0xA1, 0xAF, 0x46, 0xD0, 0x5F, 0xA9, 0x9D, 0xA0, 0x92, 0x08, 0x0B, + 0xD9, 0x75, 0x40, 0x86, 0x6F, 0x4D, 0x0B, 0x7E, 0x87, 0x3C, 0x00, 0x79, 0x02, 0x1D, 0x7A, 0x53, + 0xE8, 0x73, 0xE0, 0x70, 0x09, 0x6F, 0x07, 0xEE, 0xA9, 0xFB, 0x48, 0xE3, 0x1F, 0xE0, 0x12, 0x1E, + 0x06, 0x40, 0x0C, 0xCF, 0xCA, 0x71, 0xFF, 0x04, 0x8A, 0x78, 0x4C, 0x99, 0x9E, 0x96, 0x59, 0x99, + 0x20, 0xBB, 0x64, 0xDA, 0x16, 0x41, 0x66, 0x5B, 0xDD, 0x22, 0x3D, 0x67, 0xC7, 0xBD, 0x8E, 0xC6, + 0x6D, 0x84, 0xDB, 0x11, 0x09, 0x9C, 0x64, 0x61, 0x52, 0x72, 0x3A, 0x33, 0x88, 0x0E, 0x41, 0xF1, + 0xBA, 0x0D, 0x54, 0x9D, 0x94, 0x9B, 0x0F, 0xE0, 0x4D, 0xAA, 0x11, 0x51, 0xF4, 0x2A, 0x04, 0x01, + 0x60, 0x07, 0x6A, 0x25, 0x71, 0xAA, 0xF0, 0x76, 0x4A, 0xA4, 0x46, 0x73, 0x06, 0x9C, 0xBE, 0x44, + 0x72, 0xE5, 0x1E, 0x9B, 0x70, 0x01, 0xFF, 0x7C, 0x88, 0xEF, 0xCC, 0xE9, 0x28, 0xF0, 0x95, 0x2D, + 0xB5, 0x5C, 0x98, 0x7C, 0xB0, 0xA4, 0x16, 0x16, 0xA1, 0xBD, 0x09, 0x51, 0xD2, 0xD8, 0x92, 0x9C, + 0x02, 0x68, 0x1E, 0x0F, 0x8B, 0x06, 0x7E, 0x30, 0x74, 0x70, 0x5F, 0xA3, 0x4F, 0xDC, 0xAC, 0xA0, + 0xBA, 0x84, 0xDA, 0xAD, 0x4E, 0xAB, 0x96, 0x4A, 0xB7, 0xE6, 0xDA, 0x33, 0xD9, 0x87, 0x42, 0x99, + 0xB0, 0x85, 0xC7, 0xC5, 0xD2, 0xF2, 0x8A, 0xE4, 0x64, 0xB1, 0xDE, 0x41, 0x4F, 0xAA, 0xBB, 0x50, + 0x5E, 0x92, 0x7F, 0xB9, 0x4F, 0x7F, 0xC7, 0x9E, 0x1B, 0xA6, 0x29, 0x11, 0x53, 0x76, 0x96, 0x48, + 0xCF, 0x84, 0x1A, 0xE0, 0x00, 0xAD, 0x49, 0x27, 0xD4, 0xFC, 0x67, 0x4E, 0xDC, 0x34, 0x94, 0x53, + 0xB1, 0x44, 0x72, 0x6E, 0xE8, 0x73, 0x36, 0xE9, 0x93, 0x07, 0xF1, 0x11, 0xF9, 0x67, 0xCD, 0x45, + 0x94, 0xCA, 0x83, 0xB6, 0x51, 0x94, 0x0D, 0x71, 0x56, 0xA1, 0xF9, 0xF1, 0xE2, 0xC7, 0x65, 0x2A, + 0x2A, 0xC6, 0x90, 0xE4, 0x0C, 0x83, 0xE9, 0x30, 0xDB, 0x2C, 0xA3, 0x13, 0x4A, 0x37, 0xD3, 0xE6, + 0x3A, 0xCB, 0x7E, 0x48, 0x32, 0xA4, 0x59, 0x67, 0x5A, 0x94, 0xC5, 0xE9, 0x77, 0x92, 0x1C, 0xAA, + 0x8A, 0x90, 0xF1, 0xA5, 0x89, 0x65, 0x7F, 0x22, 0x22, 0x94, 0x5C, 0x90, 0x64, 0x45, 0xBF, 0x3D, + 0x7F, 0x4F, 0x04, 0x7E, 0x9F, 0xAF, 0x7D, 0x1F, 0x9D, 0x65, 0x0D, 0x0C, 0x3B, 0xD2, 0xD9, 0x2E, + 0xD8, 0xAA, 0x5F, 0xAD, 0xD5, 0x55, 0xA5, 0x56, 0x1F, 0x85, 0x56, 0x6B, 0x05, 0x5B, 0x5D, 0x9E, + 0x1D, 0x68, 0x70, 0xA9, 0x06, 0xF6, 0x62, 0x97, 0xF6, 0xD1, 0x8D, 0xB7, 0xE6, 0xF1, 0x66, 0x99, + 0x7F, 0x46, 0x7B, 0x7D, 0xBB, 0x60, 0xBB, 0x7E, 0xD5, 0x76, 0x57, 0x15, 0xDB, 0x89, 0x5C, 0xEC, + 0xB4, 0x8D, 0x82, 0xED, 0x64, 0x3E, 0xC6, 0xF8, 0xBE, 0xCB, 0x49, 0xFC, 0xB9, 0x94, 0xF3, 0xE8, + 0x96, 0x9F, 0x32, 0xFE, 0x83, 0x64, 0x3C, 0xB7, 0xDD, 0xE5, 0xAF, 0x67, 0x37, 0x97, 0x7B, 0x9F, + 0x7E, 0x2D, 0x47, 0x23, 0xB4, 0xEA, 0x1F, 0x5F, 0xEE, 0xFF, 0xFA, 0x73, 0x4A, 0x2D, 0x68, 0x4A, + 0xE5, 0xB4, 0x54, 0x5F, 0x7F, 0xEF, 0x6C, 0x95, 0xC3, 0xAC, 0xB6, 0xEF, 0x1A, 0xB3, 0xB5, 0x5F, + 0xEB, 0xCE, 0xD8, 0x7E, 0x43, 0xDB, 0x3E, 0x6D, 0xF1, 0x84, 0x46, 0x7A, 0x9D, 0x22, 0x6F, 0xDF, + 0x5E, 0x44, 0xAF, 0xD0, 0x9D, 0x07, 0x9D, 0x15, 0x84, 0xAA, 0x9B, 0x8E, 0x61, 0xAC, 0x17, 0x9E, + 0x4C, 0x6A, 0xD3, 0x37, 0x6B, 0xD5, 0x9B, 0xBE, 0xA9, 0x25, 0xF7, 0x63, 0xC5, 0x9A, 0x6E, 0x56, + 0xC7, 0xBA, 0xA9, 0x62, 0x2D, 0xD3, 0x78, 0xAB, 0x3A, 0xDE, 0xAD, 0xCA, 0xBD, 0xED, 0x74, 0x2B, + 0x63, 0xED, 0x74, 0x2B, 0x63, 0xED, 0xAE, 0x4A, 0x13, 0xAC, 0x1C, 0xA7, 0xD6, 0x8C, 0x37, 0xDD, + 0x1B, 0xA3, 0x22, 0x6A, 0xDA, 0xB8, 0x53, 0x4B, 0xDD, 0xAB, 0xCF, 0x43, 0x4F, 0x47, 0xFB, 0x6F, + 0x36, 0x99, 0xE5, 0x09, 0x50, 0x4C, 0x19, 0x08, 0xCD, 0x57, 0x57, 0x25, 0x56, 0x95, 0x6E, 0x2F, + 0x4F, 0xA2, 0xD2, 0xCD, 0x37, 0x67, 0x6B, 0xBE, 0x35, 0x53, 0x73, 0x45, 0x3A, 0x0B, 0x29, 0xC2, + 0x53, 0xF7, 0x71, 0xDF, 0x74, 0xAC, 0x47, 0xDB, 0x0A, 0xEE, 0x5F, 0xB9, 0x32, 0x34, 0xAA, 0x6B, + 0xC3, 0xEE, 0x0F, 0xD1, 0x86, 0xDD, 0x1F, 0xA4, 0x0D, 0xBB, 0x3F, 0x44, 0x1B, 0x76, 0x7F, 0x6A, + 0xC3, 0x05, 0x6B, 0xC3, 0xEE, 0x8F, 0xD5, 0x86, 0xDD, 0xD9, 0xB4, 0x61, 0x77, 0x36, 0x6D, 0xD8, + 0x9D, 0x4D, 0x1B, 0x76, 0xD3, 0xB5, 0xE1, 0xD4, 0xA7, 0xC9, 0x80, 0x63, 0x1F, 0x27, 0x5F, 0xE3, + 0xF5, 0xC3, 0xD2, 0xAC, 0xC6, 0xF0, 0x30, 0xFC, 0xBD, 0xAD, 0xA9, 0xF4, 0x59, 0xA9, 0xF4, 0x59, + 0x57, 0xE9, 0x8B, 0x52, 0xE9, 0x8B, 0xF2, 0x8A, 0x1D, 0x21, 0x29, 0x7C, 0x83, 0x33, 0x9B, 0xAC, + 0xA4, 0x33, 0xD2, 0x30, 0x7C, 0x92, 0xD8, 0x0C, 0x0A, 0x38, 0x1B, 0x45, 0xB5, 0x5D, 0x47, 0xAD, + 0xFD, 0x61, 0xEF, 0x68, 0xAF, 0x77, 0xA0, 0xA9, 0xBB, 0x37, 0x0A, 0xA2, 0x39, 0x27, 0x47, 0x91, + 0x8E, 0x4D, 0xEF, 0x9B, 0x14, 0x42, 0xDA, 0xC9, 0x8B, 0x13, 0xCD, 0x69, 0xDF, 0xD5, 0xB5, 0x67, + 0x51, 0x00, 0x11, 0x09, 0xA6, 0xF5, 0xEF, 0x53, 0x3F, 0x20, 0xD4, 0x6A, 0x6E, 0x3D, 0xA8, 0xA5, + 0xF5, 0x1C, 0x3F, 0x9E, 0xBA, 0x82, 0x27, 0x57, 0x22, 0xDC, 0x32, 0xAE, 0xA4, 0xBF, 0x0F, 0xC2, + 0x4F, 0x76, 0xA0, 0x86, 0x6C, 0xD1, 0x87, 0x90, 0x6B, 0x63, 0xD3, 0x76, 0x7A, 0x34, 0x7E, 0x75, + 0x3B, 0x7E, 0xAF, 0xB0, 0x51, 0xA3, 0xEB, 0xEB, 0x89, 0xD3, 0xF3, 0x5C, 0x88, 0x2A, 0x12, 0xC2, + 0x34, 0x55, 0xD4, 0x00, 0x79, 0xCF, 0xB1, 0xA4, 0xBB, 0x28, 0xA8, 0xC7, 0x16, 0x68, 0xDD, 0x6B, + 0xA2, 0x31, 0x2D, 0x69, 0xEF, 0x89, 0xD2, 0xB6, 0xF0, 0xAA, 0xF3, 0x08, 0x07, 0x42, 0x18, 0x36, + 0xBD, 0xAB, 0x0B, 0xA1, 0x88, 0xF0, 0x43, 0x9C, 0x29, 0x3D, 0x62, 0x9F, 0x35, 0x3D, 0x52, 0xBA, + 0x1B, 0x62, 0xAC, 0x09, 0x5E, 0x79, 0x07, 0xE6, 0x08, 0x12, 0xE5, 0x3C, 0xDE, 0x63, 0xE6, 0x98, + 0x77, 0xD4, 0xEF, 0xAD, 0x76, 0xD1, 0xBD, 0xE9, 0x83, 0x93, 0xDB, 0x9D, 0xED, 0x8D, 0x49, 0xA1, + 0x47, 0xE4, 0xDF, 0x9E, 0x04, 0xF0, 0xB0, 0x33, 0xF5, 0xC8, 0x80, 0x73, 0x5D, 0xCC, 0x27, 0x74, + 0xE7, 0xB9, 0x63, 0xB4, 0xD7, 0x63, 0x0D, 0x86, 0x68, 0x42, 0x48, 0x93, 0x5E, 0xDF, 0xA3, 0x60, + 0x20, 0xE6, 0xEB, 0x92, 0xC1, 0x11, 0xAD, 0xEE, 0x87, 0x84, 0x1C, 0x6F, 0x6C, 0x3B, 0x98, 0x50, + 0x60, 0x0F, 0xEE, 0x91, 0xF8, 0x4C, 0x34, 0xF3, 0x04, 0x74, 0x3D, 0x7B, 0x48, 0xE6, 0xD6, 0x88, + 0xBF, 0x23, 0x1D, 0xEE, 0x70, 0xD4, 0xF7, 0x5C, 0xFF, 0xB4, 0x83, 0x9C, 0xE9, 0x68, 0xD4, 0x4C, + 0x5C, 0xBB, 0xAA, 0x6F, 0xBC, 0x2A, 0x2C, 0xCD, 0x0C, 0x2F, 0x63, 0xDF, 0xDE, 0xA2, 0xBD, 0xD1, + 0x08, 0xF5, 0xC9, 0x77, 0x2B, 0x37, 0xFB, 0x8B, 0xF8, 0x68, 0xED, 0x35, 0x73, 0x37, 0x46, 0xE4, + 0xFF, 0x84, 0x5F, 0x84, 0x79, 0x49, 0x56, 0xA4, 0x87, 0x8D, 0x40, 0xC5, 0x47, 0xD3, 0xC3, 0xD7, + 0x93, 0x91, 0x6B, 0x5A, 0x9F, 0x4C, 0x3B, 0x90, 0x23, 0x10, 0xE8, 0x5B, 0x5F, 0x2C, 0x93, 0xA0, + 0x3F, 0xBD, 0x1D, 0xDB, 0xC1, 0x31, 0x6F, 0x00, 0x51, 0x8F, 0x64, 0x46, 0xD2, 0x07, 0xA1, 0x7F, + 0x33, 0xBE, 0x0A, 0xDE, 0x34, 0xB0, 0xDC, 0x71, 0x8F, 0x1A, 0x78, 0x5C, 0x1D, 0x5C, 0x3A, 0xA5, + 0x48, 0xBC, 0xB0, 0xBC, 0x6D, 0x4E, 0x26, 0x6C, 0xD6, 0x25, 0x01, 0xB7, 0x28, 0xE2, 0xA6, 0x00, + 0xD5, 0xFC, 0x77, 0xF3, 0x89, 0x43, 0xFC, 0xF5, 0xEC, 0xF4, 0x43, 0x00, 0x49, 0x2B, 0xFE, 0x63, + 0x8A, 0x85, 0xC7, 0xD6, 0xA1, 0x46, 0xDB, 0x25, 0x20, 0x1B, 0xB5, 0xDE, 0x45, 0xFF, 0x0A, 0x62, + 0x31, 0x57, 0xA6, 0xB4, 0x5B, 0x35, 0xA9, 0x0A, 0x9D, 0x6F, 0x21, 0x11, 0xF1, 0x84, 0x64, 0xDA, + 0x4E, 0xE4, 0x86, 0xE6, 0x06, 0x1A, 0xDE, 0x2E, 0x65, 0x85, 0x36, 0x38, 0x62, 0x4E, 0xA4, 0x98, + 0xF4, 0xE4, 0x2B, 0xE7, 0x32, 0xBC, 0x7E, 0x60, 0x06, 0x53, 0x1F, 0x5C, 0xD4, 0x14, 0xED, 0x9D, + 0x8D, 0x94, 0xD4, 0xCF, 0x01, 0x9C, 0x9C, 0xE2, 0x6C, 0x36, 0xEA, 0x6B, 0xD5, 0x32, 0xA6, 0xB9, + 0x82, 0xC5, 0xF5, 0x86, 0x38, 0xE8, 0x99, 0xB6, 0x87, 0x2D, 0xAA, 0x8C, 0x95, 0x75, 0xE7, 0x36, + 0x70, 0x8E, 0x69, 0x15, 0x56, 0xA8, 0xE1, 0x17, 0x48, 0x34, 0x7D, 0xA4, 0xCF, 0xA7, 0xC0, 0xDC, + 0x20, 0xC0, 0x4E, 0x5B, 0x8C, 0x4B, 0x99, 0x60, 0xEC, 0x9D, 0xED, 0x1D, 0xF8, 0x6A, 0xC3, 0x73, + 0xFE, 0x6A, 0xBC, 0xF6, 0xF6, 0x9E, 0xE2, 0x3C, 0xF2, 0x27, 0xE7, 0xEE, 0x63, 0x8F, 0xB4, 0xF7, + 0xF5, 0xBA, 0x9A, 0x50, 0x47, 0xB5, 0x69, 0x22, 0x0D, 0xC5, 0x30, 0xD4, 0x62, 0xBC, 0x44, 0x43, + 0x37, 0x6D, 0x48, 0x2F, 0xE6, 0x78, 0x82, 0x80, 0x54, 0x57, 0x02, 0x11, 0x90, 0x44, 0x47, 0x74, + 0x05, 0x65, 0x5A, 0xD6, 0xD1, 0x03, 0xF9, 0x05, 0x5C, 0x3C, 0xB0, 0x03, 0x2F, 0x69, 0x1D, 0x5E, + 0x9C, 0x11, 0xC5, 0x1D, 0xC0, 0x37, 0x32, 0x2E, 0x18, 0x72, 0xAE, 0x34, 0x30, 0x54, 0x69, 0xA2, + 0x9D, 0x5D, 0xA0, 0x32, 0x16, 0x7B, 0xCE, 0xBC, 0x02, 0x37, 0x5A, 0xC9, 0x74, 0x06, 0xF2, 0x25, + 0x16, 0x0D, 0xA4, 0x80, 0x9D, 0x2A, 0xF5, 0xBF, 0x24, 0xBF, 0x30, 0xD0, 0xD1, 0x0D, 0x96, 0x0D, + 0x6E, 0x94, 0xE6, 0x13, 0xF9, 0x45, 0xB9, 0xCA, 0x62, 0xF5, 0x7E, 0xB3, 0xBF, 0xB6, 0x5D, 0x67, + 0x30, 0xB2, 0x07, 0x10, 0x06, 0x16, 0x31, 0xB9, 0x91, 0x7C, 0x26, 0x41, 0xCE, 0xFD, 0x91, 0x91, + 0x7B, 0x7C, 0xA8, 0x7D, 0xAC, 0xAF, 0xA9, 0x61, 0x18, 0x83, 0x09, 0x5A, 0x41, 0x8F, 0x57, 0x03, + 0xA9, 0x8F, 0x07, 0xF2, 0x09, 0x18, 0xAD, 0xA4, 0x22, 0x14, 0x1D, 0x59, 0xBE, 0xCB, 0x1A, 0x41, + 0x0B, 0x75, 0x2E, 0x04, 0xC6, 0x98, 0xB3, 0xE8, 0x13, 0xBA, 0xA1, 0x27, 0x50, 0xF3, 0x0A, 0x4C, + 0x79, 0xF2, 0x2A, 0x3E, 0x29, 0x13, 0x6B, 0x1A, 0x9F, 0x37, 0x48, 0x49, 0x75, 0xCF, 0x34, 0x0D, + 0xDD, 0x4B, 0x66, 0xE4, 0xA4, 0xD7, 0x77, 0xEC, 0x18, 0x5A, 0xCD, 0xA5, 0x57, 0x21, 0xA4, 0x62, + 0x5D, 0x4A, 0xA3, 0x36, 0xEE, 0x4F, 0x46, 0xA7, 0xF5, 0x5D, 0xCA, 0x7E, 0x7F, 0xA4, 0x7A, 0x07, + 0x67, 0x7B, 0xD7, 0x84, 0x75, 0x17, 0xCE, 0x1E, 0x99, 0xBD, 0x1D, 0x46, 0xA7, 0x90, 0xD9, 0x7A, + 0xFB, 0x9E, 0xC6, 0x12, 0xCF, 0xBD, 0xB3, 0xEF, 0xD5, 0x10, 0x65, 0x6D, 0x5F, 0x59, 0x57, 0x32, + 0xFA, 0xCA, 0x98, 0xA1, 0xE9, 0xAB, 0x5C, 0x2D, 0xCD, 0xF8, 0xC5, 0xEC, 0x5B, 0x63, 0xD7, 0x37, + 0xED, 0x41, 0x69, 0x2B, 0x98, 0x94, 0x9A, 0x58, 0xFB, 0x12, 0x44, 0xAC, 0x30, 0x36, 0x3A, 0xED, + 0x35, 0x85, 0xF4, 0xEF, 0x4A, 0xF0, 0x71, 0x39, 0x13, 0x44, 0x19, 0xE4, 0x1D, 0x43, 0x3E, 0x82, + 0xA7, 0x61, 0xAF, 0x08, 0xDE, 0xC8, 0x02, 0xAE, 0x97, 0x35, 0xDD, 0xF3, 0x15, 0xD5, 0x45, 0xAC, + 0xEC, 0x63, 0x18, 0xB1, 0xE0, 0x68, 0x9C, 0xF4, 0x8B, 0x3F, 0xE9, 0xC2, 0x84, 0xB3, 0x10, 0x88, + 0xF4, 0xEE, 0x47, 0x89, 0x72, 0xE7, 0xD2, 0xFD, 0x42, 0x0F, 0xC0, 0x2A, 0xDD, 0xE7, 0xEE, 0xC8, + 0xB3, 0x74, 0x3F, 0x0F, 0x84, 0xB6, 0xFB, 0x8A, 0x73, 0xE9, 0x1C, 0x58, 0x90, 0x84, 0x98, 0xC7, + 0x06, 0x8D, 0x1F, 0x2B, 0x69, 0x65, 0xD9, 0x3E, 0xCB, 0x13, 0xCB, 0xF3, 0x16, 0x14, 0xE7, 0x49, + 0x2E, 0x3C, 0x21, 0x4F, 0x79, 0x3A, 0x7F, 0xE0, 0xA0, 0x03, 0x69, 0x87, 0x20, 0xD1, 0x96, 0x83, + 0x47, 0x33, 0x71, 0x26, 0x09, 0x2B, 0x8A, 0xDA, 0x32, 0x52, 0xA4, 0x22, 0x6C, 0xB2, 0x6F, 0x4E, + 0xAD, 0x43, 0xCF, 0x9D, 0xC0, 0x63, 0xF2, 0x29, 0x8B, 0x8C, 0x94, 0x5C, 0xAF, 0x80, 0x08, 0x15, + 0xA0, 0xAA, 0x93, 0xB2, 0x08, 0x14, 0xA2, 0x8A, 0xAF, 0x8D, 0x25, 0xA9, 0xAA, 0x8E, 0xAF, 0x14, + 0x17, 0xB4, 0xB3, 0x20, 0xFD, 0xC5, 0x80, 0x59, 0x67, 0x43, 0xEE, 0x5B, 0x04, 0x29, 0xC3, 0x3F, + 0x21, 0xDA, 0x8C, 0x9E, 0xA5, 0xFC, 0xAA, 0xAC, 0x2B, 0x02, 0x41, 0xCB, 0x0C, 0x35, 0xCD, 0xE4, + 0xAC, 0x2C, 0x28, 0x93, 0xB6, 0x32, 0x53, 0x7C, 0x0E, 0x71, 0x60, 0xDA, 0x23, 0xBF, 0x3C, 0x2B, + 0xCA, 0xC1, 0xD2, 0x33, 0x85, 0x1E, 0x9C, 0xE7, 0xC1, 0x8D, 0x10, 0x50, 0x31, 0x36, 0xD0, 0x73, + 0x64, 0xE5, 0x8E, 0xE7, 0xB5, 0xD6, 0x2F, 0x09, 0x82, 0x75, 0x62, 0x1E, 0xEB, 0x81, 0x0C, 0x2E, + 0x4D, 0xEC, 0x35, 0xA6, 0x91, 0x99, 0x17, 0x81, 0x4C, 0x78, 0x85, 0x16, 0x01, 0x35, 0xAB, 0xF8, + 0xAC, 0xCC, 0x48, 0x24, 0xC8, 0x4E, 0x93, 0x7E, 0xB1, 0x76, 0x75, 0xB9, 0x2F, 0x08, 0x45, 0xDB, + 0x69, 0x29, 0x9D, 0xF7, 0xAC, 0xFD, 0x2E, 0x9C, 0x1B, 0x5C, 0x65, 0x41, 0xDC, 0x70, 0x46, 0x2E, + 0x14, 0x02, 0xA4, 0x3B, 0x8C, 0x45, 0x6F, 0xE7, 0x55, 0xE1, 0x82, 0x7C, 0xB9, 0xA2, 0x41, 0x21, + 0xBF, 0x96, 0xB7, 0x48, 0x14, 0x89, 0x93, 0xC3, 0x02, 0x50, 0xC9, 0x17, 0x5F, 0x73, 0x46, 0x10, + 0x79, 0x95, 0x3F, 0x33, 0xAF, 0xF2, 0x67, 0xF4, 0x0E, 0x39, 0xD3, 0xF1, 0x41, 0x22, 0x8B, 0x2F, + 0x29, 0xD2, 0x38, 0x96, 0xDF, 0x4E, 0x83, 0xC0, 0x75, 0xB8, 0x5F, 0x39, 0x4D, 0xBB, 0x08, 0x01, + 0x3F, 0xFB, 0xF4, 0x2B, 0xE4, 0xD4, 0x7B, 0x96, 0xAF, 0x47, 0xE3, 0xEA, 0xDA, 0x8E, 0x80, 0x49, + 0x2F, 0xBD, 0x1F, 0x61, 0x44, 0x52, 0x8C, 0xE1, 0x00, 0x1A, 0x34, 0x9E, 0x25, 0x99, 0x93, 0xF3, + 0xE2, 0x35, 0xE5, 0x4B, 0xD5, 0xAC, 0xE8, 0xA4, 0xAC, 0xE0, 0xA9, 0x14, 0x8E, 0xA8, 0xAE, 0xF6, + 0x33, 0x30, 0x33, 0x0E, 0xEA, 0x4E, 0x0F, 0xB9, 0x7A, 0xA6, 0xA1, 0xAB, 0x4F, 0xDA, 0xC3, 0x72, + 0x91, 0xC1, 0x78, 0xDA, 0xD6, 0x9E, 0x82, 0xC5, 0x41, 0x81, 0xE4, 0x13, 0xDC, 0x20, 0x4C, 0xB3, + 0x3E, 0x28, 0xC4, 0x40, 0x25, 0xA0, 0x23, 0xFF, 0x50, 0x9C, 0x88, 0xE7, 0xD3, 0x0C, 0x1C, 0x7C, + 0x63, 0x7F, 0x0B, 0xF7, 0x63, 0xE8, 0xC4, 0x19, 0x78, 0xF4, 0x2E, 0x63, 0xC2, 0xE3, 0xDB, 0xD0, + 0x32, 0xF2, 0x1F, 0xCD, 0x09, 0x7B, 0xD7, 0x82, 0x5A, 0x9B, 0x89, 0x9A, 0x8B, 0x49, 0x43, 0x3E, + 0x25, 0x8D, 0xC5, 0xAD, 0x40, 0x1D, 0x07, 0x12, 0x68, 0xDC, 0x93, 0xA9, 0x8F, 0x7D, 0xE1, 0x71, + 0x81, 0x18, 0x19, 0x7D, 0x46, 0x2A, 0x11, 0x21, 0x61, 0x7E, 0xC3, 0x67, 0xF8, 0x03, 0xB4, 0xF2, + 0xB6, 0x75, 0x45, 0x34, 0x7E, 0x75, 0x5B, 0x33, 0xD6, 0xE5, 0xC5, 0xA4, 0xC8, 0x58, 0x3F, 0xD1, + 0xB1, 0xD6, 0x70, 0x48, 0xFC, 0x11, 0x89, 0x16, 0xA2, 0xF1, 0x52, 0x0C, 0x21, 0xC5, 0x50, 0x8A, + 0x8C, 0x5A, 0x26, 0x47, 0x96, 0x0C, 0xC4, 0x94, 0x25, 0xD9, 0x78, 0xBF, 0xCF, 0x95, 0x61, 0xD4, + 0x64, 0x24, 0x76, 0x5A, 0x4B, 0x5C, 0x4E, 0x1F, 0x97, 0xC1, 0x47, 0x52, 0x14, 0xB4, 0x5C, 0xA6, + 0x09, 0x68, 0x69, 0x97, 0xB5, 0x58, 0x09, 0xC0, 0x73, 0x37, 0xC0, 0x6F, 0x51, 0x2D, 0x07, 0xFF, + 0x12, 0xC1, 0x5F, 0x43, 0xAE, 0x33, 0x7A, 0x46, 0xF0, 0x5A, 0x91, 0x1F, 0xD2, 0x4B, 0xFE, 0xB6, + 0xEF, 0xB4, 0x70, 0x33, 0x00, 0xD2, 0x64, 0x6E, 0x64, 0xE5, 0x69, 0xD1, 0x77, 0x60, 0x7C, 0x1A, + 0x2F, 0xDD, 0x46, 0xD7, 0x30, 0x7B, 0x4C, 0xCF, 0xC7, 0x27, 0x64, 0x1A, 0x93, 0xD9, 0x83, 0x31, + 0x32, 0x6F, 0xDD, 0x07, 0x5C, 0x9A, 0x57, 0x4B, 0x21, 0xAF, 0x0E, 0x71, 0x0E, 0xAF, 0xBE, 0x2B, + 0xE1, 0x52, 0xE8, 0xE4, 0x0E, 0x99, 0x23, 0xD2, 0xC6, 0x7A, 0xA6, 0x93, 0x92, 0xCF, 0xC7, 0x68, + 0x52, 0xB7, 0x28, 0x43, 0x91, 0x1D, 0xA0, 0x11, 0x61, 0x69, 0x38, 0x51, 0xD5, 0xFD, 0x06, 0xBD, + 0x29, 0xDA, 0x1B, 0x7F, 0x60, 0x8D, 0x5F, 0x7A, 0xF6, 0x81, 0x96, 0x80, 0xAE, 0x18, 0xC8, 0xF6, + 0xD1, 0x07, 0x51, 0xA1, 0x48, 0xB0, 0x22, 0xFA, 0x34, 0x53, 0x01, 0x7E, 0x6E, 0x09, 0x17, 0xBE, + 0xBD, 0xDC, 0x14, 0x81, 0xE4, 0x50, 0x11, 0x49, 0x8B, 0x9F, 0x20, 0x69, 0xE6, 0xD5, 0xDC, 0xD8, + 0x61, 0x6D, 0xC7, 0x40, 0xE5, 0x50, 0xDC, 0xA7, 0x82, 0x54, 0x64, 0x8A, 0x5B, 0x95, 0xB8, 0x63, + 0xD8, 0x7A, 0x1C, 0x1C, 0x1D, 0xC7, 0x6B, 0xBE, 0x98, 0xCE, 0x58, 0x70, 0x73, 0x74, 0xC8, 0x2A, + 0x05, 0x97, 0x99, 0x50, 0x39, 0xB2, 0x09, 0x7B, 0x78, 0x4C, 0xA6, 0xD2, 0xBE, 0x69, 0x1D, 0xC0, + 0x33, 0x14, 0x8D, 0x64, 0x9D, 0x78, 0x73, 0xA5, 0x7D, 0xE3, 0x42, 0xA8, 0x3F, 0xC3, 0x5B, 0xB9, + 0xDA, 0xC7, 0xD0, 0x16, 0xFF, 0xF4, 0xF9, 0xCB, 0x3E, 0x79, 0xFE, 0x72, 0x4F, 0x9D, 0xA7, 0x65, + 0xB6, 0x96, 0x37, 0x0A, 0x61, 0x66, 0x4D, 0x18, 0x3F, 0x64, 0x0E, 0x4D, 0xDB, 0xF1, 0x79, 0xF2, + 0x2E, 0x5B, 0x94, 0x55, 0x96, 0x28, 0xD0, 0xC2, 0x4F, 0x8A, 0x2B, 0x27, 0x9D, 0xDE, 0xDB, 0xBC, + 0xE8, 0x1D, 0x38, 0x19, 0xB9, 0x9E, 0xE5, 0x53, 0xC1, 0x09, 0xAF, 0xBE, 0x97, 0x96, 0x68, 0x69, + 0x62, 0xDA, 0x02, 0x48, 0xA2, 0xD1, 0x03, 0x9F, 0x0A, 0x60, 0xD4, 0xEE, 0x37, 0x5A, 0xFB, 0x6B, + 0x98, 0x29, 0x06, 0x25, 0x52, 0xEE, 0x44, 0xD9, 0x39, 0x44, 0xA9, 0x13, 0x4C, 0x92, 0x14, 0x26, + 0x64, 0x83, 0xD1, 0x4D, 0xE1, 0x24, 0x22, 0x98, 0xB6, 0xC9, 0x39, 0xB1, 0x84, 0xEA, 0x34, 0xC3, + 0x44, 0x2C, 0x77, 0x69, 0x05, 0x9F, 0xD3, 0x0A, 0xBE, 0x24, 0x1E, 0xFF, 0x2C, 0xAF, 0x3D, 0x59, + 0x9E, 0x3C, 0xCA, 0xF6, 0x1D, 0x0D, 0x73, 0x95, 0x97, 0x43, 0xC5, 0x0A, 0x93, 0xA9, 0x7F, 0xDF, + 0x58, 0x68, 0xC7, 0x9A, 0xFA, 0x44, 0x09, 0x80, 0x0B, 0xCE, 0x3F, 0x1A, 0x1D, 0x65, 0x61, 0xF0, + 0x90, 0x89, 0xD5, 0x54, 0xEC, 0x88, 0x41, 0x00, 0x72, 0x3F, 0x28, 0x70, 0xE3, 0x21, 0x75, 0x05, + 0x6F, 0x4C, 0x71, 0x7C, 0x05, 0xEF, 0x78, 0x68, 0xB2, 0x4B, 0x93, 0xDE, 0x28, 0x8B, 0xAB, 0x4E, + 0xA6, 0x48, 0xE5, 0x14, 0x89, 0x82, 0x16, 0xC0, 0x26, 0x7E, 0xC4, 0x08, 0x85, 0x47, 0xBA, 0x93, + 0x64, 0x4B, 0x2B, 0x75, 0xFB, 0x6A, 0xD4, 0x0E, 0x69, 0x27, 0xC8, 0x12, 0x3F, 0xA0, 0x84, 0xD2, + 0x34, 0xEB, 0x11, 0x80, 0x25, 0x54, 0xFB, 0x97, 0x5A, 0x33, 0xD5, 0x60, 0x21, 0x0E, 0x10, 0x50, + 0x33, 0xC0, 0xD0, 0x0D, 0xA2, 0x31, 0xF5, 0x8E, 0x1C, 0x85, 0x98, 0x0A, 0xCE, 0x47, 0xB2, 0xE6, + 0xFF, 0xB1, 0x0C, 0x4D, 0xF5, 0xE4, 0x65, 0xAC, 0xED, 0x7C, 0x4D, 0xAB, 0xFB, 0x39, 0x51, 0xB7, + 0x9B, 0x5A, 0xF7, 0x4B, 0xA2, 0xEE, 0xAA, 0x5A, 0x57, 0xAF, 0x1E, 0xC4, 0x01, 0xD6, 0x25, 0x85, + 0x16, 0x29, 0xCF, 0xAB, 0xF2, 0x39, 0xBF, 0xCA, 0x97, 0xD4, 0x2A, 0x32, 0x79, 0x89, 0x74, 0xC7, + 0x51, 0x9E, 0x45, 0x81, 0xE9, 0x64, 0x63, 0xEC, 0x99, 0x64, 0x97, 0xC9, 0x44, 0x82, 0x3E, 0x9A, + 0x38, 0x76, 0x1D, 0xD7, 0x9F, 0x98, 0xE4, 0xA8, 0x48, 0x7D, 0xAB, 0x98, 0xCE, 0x56, 0x6C, 0x03, + 0xB1, 0xEC, 0x88, 0x2E, 0x5A, 0xA9, 0x62, 0xC1, 0xD3, 0x70, 0x89, 0x7B, 0x06, 0x90, 0x8E, 0xA4, + 0xF2, 0x49, 0xAE, 0x25, 0xCC, 0x8C, 0x96, 0x06, 0x59, 0x60, 0x84, 0xD8, 0x79, 0x70, 0x94, 0x56, + 0xBD, 0xD3, 0x84, 0x1C, 0x8C, 0x90, 0xC5, 0xC1, 0xF5, 0xB0, 0x55, 0xCB, 0x79, 0x91, 0x80, 0x9A, + 0x02, 0x67, 0x47, 0xCD, 0x4B, 0xDF, 0xA2, 0x5F, 0x57, 0x3E, 0xAF, 0x7C, 0xA9, 0x29, 0xE9, 0xE9, + 0x34, 0x4C, 0x78, 0x87, 0xD6, 0x9B, 0x49, 0x83, 0x72, 0x2A, 0x77, 0x7D, 0xFB, 0xEF, 0x18, 0xE9, + 0x54, 0xB9, 0xAA, 0x4C, 0xA3, 0x7D, 0x73, 0xBC, 0xEA, 0x96, 0x5E, 0x65, 0x61, 0xF2, 0xBA, 0x13, + 0x2A, 0x0A, 0x82, 0x8B, 0x1B, 0x6C, 0x80, 0x89, 0x54, 0xF0, 0x3C, 0x44, 0x75, 0x56, 0x41, 0x9A, + 0xC2, 0xEC, 0x13, 0x35, 0x9C, 0x68, 0xD7, 0xE6, 0x64, 0xD5, 0x70, 0x76, 0xD1, 0x72, 0x65, 0x22, + 0xA6, 0xF2, 0x02, 0x12, 0x32, 0xB1, 0xF6, 0x89, 0xA5, 0xE4, 0xCF, 0x8D, 0xDA, 0xFF, 0xD2, 0xB7, + 0xE3, 0x18, 0x49, 0x73, 0x6C, 0x0E, 0xEE, 0x1B, 0x29, 0x76, 0x35, 0x51, 0x6D, 0xFD, 0xB9, 0x11, + 0xDC, 0xDB, 0x3E, 0xB3, 0x03, 0x35, 0x9A, 0xD9, 0xAB, 0x80, 0x23, 0xAF, 0x02, 0x6D, 0x7F, 0x7A, + 0xCB, 0x0E, 0xA0, 0x0D, 0x78, 0x22, 0x6E, 0x5D, 0x7E, 0xD7, 0x49, 0x00, 0x1B, 0xB5, 0x25, 0x8B, + 0x25, 0x4B, 0x4D, 0x15, 0x6A, 0xBB, 0x68, 0xF9, 0x0C, 0x55, 0x9A, 0xF2, 0x61, 0xF5, 0x2B, 0x03, + 0x21, 0x9A, 0x31, 0x13, 0x3B, 0xFB, 0x30, 0x46, 0xA1, 0xF0, 0xEE, 0x3E, 0x6C, 0x90, 0xB7, 0xC3, + 0x97, 0xEB, 0x15, 0xDB, 0xE5, 0x87, 0x6D, 0xE6, 0xB6, 0xD3, 0x8F, 0x13, 0xAA, 0x66, 0x6F, 0x91, + 0x23, 0x03, 0x3B, 0xD9, 0x25, 0x77, 0x3A, 0xC6, 0xEA, 0x5A, 0x0B, 0x6D, 0x6E, 0x4A, 0xF8, 0xD9, + 0x67, 0x20, 0x02, 0x0A, 0xCA, 0xEF, 0xC4, 0x65, 0x23, 0x3B, 0xA0, 0x59, 0xA7, 0x3B, 0x70, 0xFE, + 0x1F, 0x01, 0xCF, 0x3A, 0xDF, 0x86, 0xD3, 0x5F, 0x2A, 0x23, 0x52, 0x4C, 0xED, 0x04, 0x61, 0xD7, + 0x30, 0xDA, 0x06, 0x8D, 0x38, 0x68, 0x4B, 0x08, 0xE9, 0x07, 0x40, 0x48, 0x7F, 0x79, 0x9D, 0xBB, + 0xFE, 0x48, 0x98, 0x2A, 0xEC, 0xFC, 0xC3, 0xB6, 0xA5, 0x77, 0xFF, 0x91, 0x34, 0x96, 0x3C, 0x01, + 0x28, 0x08, 0x85, 0x53, 0x80, 0x32, 0x77, 0xA4, 0xED, 0x2F, 0x0F, 0x03, 0xD2, 0x16, 0xF1, 0xA0, + 0x1F, 0x5D, 0x59, 0x28, 0xB9, 0x4A, 0x99, 0x24, 0x6E, 0xFA, 0x32, 0x59, 0x42, 0x16, 0x74, 0xA2, + 0x50, 0x06, 0x4E, 0x7F, 0xAA, 0x88, 0x2A, 0x49, 0x27, 0x8B, 0x57, 0xCF, 0xAC, 0x94, 0x53, 0x4A, + 0x48, 0x77, 0xE6, 0x49, 0x25, 0xA9, 0x76, 0xF3, 0xB6, 0xD6, 0xAA, 0x34, 0x56, 0xD8, 0x5E, 0x47, + 0x82, 0xF9, 0xBA, 0xCE, 0x2C, 0xD1, 0x40, 0x97, 0x3A, 0xB7, 0xE4, 0xB0, 0x59, 0xB8, 0xC6, 0x93, + 0xCF, 0x83, 0xF7, 0x26, 0x3E, 0xC3, 0xC1, 0xBD, 0x6B, 0x15, 0x7B, 0x67, 0x30, 0x8E, 0x67, 0xD3, + 0x3C, 0x32, 0x28, 0xC0, 0x14, 0x86, 0x43, 0xC0, 0xA0, 0x7A, 0x31, 0x25, 0x2F, 0x28, 0x33, 0xBC, + 0x0B, 0x74, 0xD7, 0xBF, 0xE9, 0xCE, 0x03, 0x04, 0x2B, 0xF9, 0xC8, 0x73, 0xB3, 0xA6, 0x44, 0x00, + 0x36, 0xD1, 0x32, 0x6A, 0x08, 0x55, 0xD4, 0x9B, 0x5F, 0x5E, 0x69, 0x85, 0x3E, 0x59, 0x4B, 0x46, + 0x2F, 0x59, 0x55, 0xEF, 0xFB, 0x19, 0x36, 0x69, 0xE6, 0x50, 0x1F, 0x6E, 0x19, 0x08, 0xAD, 0xED, + 0xC0, 0xA5, 0x6E, 0xDD, 0x8D, 0xD5, 0x02, 0xEF, 0x4D, 0xA6, 0xB2, 0x4C, 0xE1, 0x41, 0x0E, 0xC7, + 0x54, 0x06, 0xEB, 0x59, 0xA6, 0xD2, 0xDB, 0x24, 0x8C, 0x78, 0x71, 0xA6, 0x25, 0x22, 0x37, 0xD3, + 0x58, 0x96, 0x3C, 0xB1, 0xBF, 0x56, 0xD5, 0x92, 0xBD, 0xB4, 0xEA, 0x4E, 0xCF, 0x19, 0x21, 0xB2, + 0x59, 0x27, 0x7E, 0x4D, 0x8C, 0x6C, 0xCA, 0xA1, 0x5F, 0x3B, 0x94, 0x51, 0xF5, 0xB5, 0x94, 0xEA, + 0xA9, 0xFE, 0xCF, 0xAC, 0xD9, 0xFA, 0xD7, 0x44, 0x38, 0x7B, 0xDA, 0x3C, 0x10, 0xEC, 0x0B, 0x69, + 0xAF, 0xBA, 0x16, 0x8B, 0xC7, 0x8D, 0xE2, 0x69, 0x0B, 0x02, 0xE9, 0x66, 0x05, 0xF5, 0xA6, 0xF9, + 0x42, 0x64, 0x5B, 0x1B, 0xE2, 0x21, 0xCD, 0xB2, 0x5C, 0x44, 0x23, 0x99, 0x59, 0x29, 0x1A, 0xC0, + 0xAC, 0x5A, 0x31, 0x3F, 0x53, 0x6A, 0x29, 0xA3, 0x9B, 0x5D, 0x4B, 0x1D, 0xD4, 0x5C, 0xB3, 0x49, + 0xD8, 0xDF, 0x8A, 0xA6, 0x13, 0x79, 0xF9, 0xCA, 0x36, 0x9F, 0x08, 0xB3, 0x25, 0xDB, 0x84, 0xA2, + 0xEC, 0xB6, 0x8A, 0x9B, 0x51, 0xB4, 0x83, 0xA7, 0x8E, 0xEC, 0x62, 0xCD, 0x29, 0x55, 0x49, 0x88, + 0xCC, 0x2A, 0xE1, 0xEB, 0x5D, 0x2B, 0x44, 0x30, 0x52, 0xAC, 0x2B, 0x2A, 0x7F, 0x8A, 0x5A, 0x58, + 0x84, 0x01, 0x90, 0xAD, 0x2C, 0xEA, 0xB9, 0xA4, 0xBC, 0xA5, 0xA5, 0xD0, 0xC9, 0x66, 0xAE, 0xD6, + 0x16, 0xE5, 0x78, 0x32, 0xAB, 0xC5, 0x45, 0xE0, 0x4D, 0x69, 0xAB, 0x4B, 0x34, 0x87, 0x7E, 0xB4, + 0xE5, 0x45, 0x96, 0x16, 0x5A, 0x33, 0x7A, 0x8B, 0x62, 0x07, 0xBD, 0x49, 0xEC, 0x5C, 0xE7, 0x66, + 0xA1, 0x49, 0x9E, 0xB7, 0xE4, 0x1A, 0x6B, 0x6A, 0x93, 0x75, 0xF5, 0xC3, 0x46, 0x2E, 0x8C, 0x37, + 0xB2, 0x1D, 0xA8, 0x80, 0xD3, 0xE2, 0x62, 0x0C, 0x50, 0x92, 0x40, 0x7C, 0xD7, 0x65, 0x3D, 0x90, + 0x0C, 0x49, 0x62, 0xB8, 0x35, 0xDB, 0xBD, 0x90, 0x7F, 0x85, 0x91, 0x6E, 0xFF, 0x3B, 0xD1, 0xD4, + 0x8D, 0x7A, 0x3D, 0x0E, 0x36, 0x57, 0xEA, 0xB4, 0x0A, 0xD4, 0xF9, 0xDB, 0xDF, 0x92, 0x95, 0x3C, + 0x1C, 0x4C, 0x3D, 0x87, 0xEE, 0x7D, 0x92, 0x44, 0x0E, 0x71, 0x00, 0x81, 0xEE, 0xB2, 0xDA, 0xA6, + 0x09, 0x07, 0x88, 0x5E, 0x23, 0x32, 0x15, 0x16, 0xC6, 0x6F, 0x5D, 0xAA, 0xCA, 0x4F, 0xAA, 0x14, + 0xEE, 0x60, 0x45, 0xFB, 0xC9, 0xC9, 0x1D, 0xB5, 0x97, 0x04, 0xE6, 0x2D, 0x7A, 0x34, 0x7D, 0x04, + 0x4B, 0x30, 0x82, 0xF0, 0x78, 0x6C, 0xB5, 0x10, 0x9B, 0xF3, 0x88, 0xBE, 0xA8, 0xC4, 0x12, 0x2B, + 0xF8, 0x03, 0x0F, 0x72, 0xED, 0xAA, 0x1B, 0x8E, 0xE8, 0x2D, 0xE3, 0x2B, 0xA8, 0x9A, 0x08, 0x87, + 0xA7, 0x00, 0x76, 0xDF, 0x05, 0x1E, 0x32, 0x47, 0xF6, 0xD0, 0xD9, 0xA9, 0x8F, 0xF0, 0x5D, 0x50, + 0x27, 0x1F, 0xEE, 0x77, 0xE1, 0xE4, 0xF6, 0x6E, 0x85, 0xFC, 0x02, 0x7F, 0xF4, 0x89, 0xBA, 0xE3, + 0x7F, 0x58, 0xBB, 0xEF, 0xE2, 0x77, 0x11, 0x77, 0xD8, 0xBE, 0xE1, 0xD6, 0x7D, 0xAA, 0x23, 0xDB, + 0xDA, 0xA9, 0x03, 0x42, 0x76, 0x7E, 0xDA, 0x1B, 0x8D, 0xEA, 0x88, 0xA6, 0xC6, 0x27, 0x5F, 0x5D, + 0x6F, 0xBC, 0x4C, 0x2B, 0x2E, 0xB3, 0xA6, 0xE2, 0x1B, 0xCB, 0xF0, 0xB9, 0x8E, 0xB8, 0x77, 0x1B, + 0x83, 0x10, 0x92, 0xEC, 0x0E, 0x87, 0x10, 0x82, 0x4C, 0xE8, 0x59, 0x01, 0xB4, 0x2B, 0x81, 0x17, + 0xFD, 0x43, 0xE9, 0x16, 0xD5, 0x3B, 0xB4, 0xA3, 0x7D, 0x0C, 0x5F, 0xF0, 0xAA, 0x49, 0xEC, 0x7C, + 0x1A, 0x8F, 0xEE, 0x83, 0x60, 0x92, 0x9D, 0x81, 0x40, 0xA8, 0xC8, 0x13, 0x11, 0xBC, 0x3F, 0x62, + 0x79, 0x08, 0x60, 0xED, 0xA6, 0xA9, 0x12, 0x6A, 0x9A, 0x4D, 0x56, 0xD8, 0x84, 0x06, 0x94, 0xCB, + 0x6A, 0x84, 0xFB, 0x13, 0x0D, 0xDC, 0x31, 0xE8, 0x99, 0xB0, 0xA2, 0x87, 0xFD, 0x89, 0xEB, 0xF8, + 0x94, 0x54, 0xFA, 0xC6, 0x13, 0x4F, 0xC6, 0x81, 0x0E, 0xFA, 0x1F, 0x59, 0xEA, 0x0C, 0xB2, 0xF7, + 0x70, 0xE9, 0xAE, 0x21, 0xB9, 0x85, 0xCC, 0x18, 0xD1, 0xA5, 0x1D, 0x99, 0x0D, 0xF9, 0x2B, 0xB0, + 0x2C, 0x84, 0xE2, 0xC1, 0xE8, 0xBB, 0x46, 0xE2, 0x79, 0x86, 0x9E, 0xA4, 0xD0, 0xBB, 0xB7, 0x81, + 0x69, 0x13, 0xC1, 0x14, 0x2A, 0xE8, 0x05, 0x5F, 0x5B, 0x31, 0x29, 0xFC, 0x2C, 0x90, 0x3A, 0xAA, + 0xA2, 0x8A, 0xAD, 0x38, 0xEE, 0xBC, 0xDA, 0xC2, 0x46, 0x3D, 0xCC, 0x9B, 0xF6, 0xA3, 0x07, 0x3E, + 0x8D, 0x1D, 0x64, 0xCC, 0x05, 0x16, 0x14, 0x1B, 0xBC, 0x7D, 0xF6, 0xA0, 0x48, 0xF6, 0x00, 0x42, + 0xA5, 0xC2, 0x83, 0xC8, 0x2A, 0xE7, 0x0E, 0x24, 0x7B, 0xF5, 0xEA, 0xC7, 0x0F, 0x26, 0xA5, 0xE3, + 0xF5, 0x0C, 0x68, 0x82, 0x2D, 0xC5, 0x06, 0x55, 0xD0, 0x05, 0x87, 0xEE, 0xA3, 0x03, 0x87, 0x7E, + 0x21, 0x83, 0x08, 0xF7, 0xF9, 0x85, 0xE9, 0x5D, 0x3C, 0xFF, 0x04, 0x80, 0x3C, 0x39, 0x14, 0x6C, + 0x5C, 0x1C, 0xB7, 0x43, 0x8D, 0x19, 0x17, 0x77, 0x14, 0x5A, 0x3F, 0x74, 0x27, 0xAE, 0x0C, 0x55, + 0xDE, 0x27, 0x43, 0x31, 0xB3, 0x96, 0x08, 0x97, 0x00, 0x30, 0x04, 0xC7, 0x2C, 0x03, 0x05, 0x61, + 0x6B, 0x1F, 0x12, 0x3B, 0x41, 0xD6, 0x14, 0xA2, 0x2F, 0xA0, 0x24, 0x91, 0x1D, 0x2A, 0xAA, 0x2D, + 0x4A, 0xB5, 0x08, 0x78, 0x47, 0xDF, 0x87, 0x26, 0x5F, 0xE6, 0x05, 0x2B, 0xDE, 0xD4, 0x1B, 0x05, + 0xEE, 0x00, 0x32, 0xFC, 0x13, 0x11, 0x5C, 0x01, 0x18, 0xFF, 0x42, 0x7B, 0x01, 0x26, 0x4D, 0x89, + 0xAB, 0xBF, 0xC5, 0xF0, 0x21, 0x1F, 0x3C, 0x98, 0x39, 0xFF, 0x62, 0x52, 0x7A, 0x76, 0x2C, 0x3E, + 0x1E, 0xA1, 0x70, 0x8B, 0x09, 0x7F, 0x22, 0xF8, 0x21, 0x73, 0x89, 0x16, 0x26, 0xF5, 0xDB, 0xA1, + 0xED, 0xB4, 0x7D, 0xEF, 0xE1, 0x3B, 0x48, 0x38, 0x1F, 0xD6, 0x8B, 0xC3, 0x0E, 0x22, 0x7C, 0xF4, + 0x25, 0x99, 0x54, 0x69, 0x08, 0x17, 0x4E, 0xD1, 0xF0, 0x13, 0xAE, 0xD3, 0xE5, 0x85, 0x21, 0x35, + 0x0D, 0x09, 0x9C, 0x42, 0x62, 0xB0, 0x52, 0x22, 0x12, 0x27, 0x99, 0x86, 0x24, 0xAE, 0x09, 0xA9, + 0x48, 0xA2, 0xC0, 0x9B, 0x68, 0x55, 0x8B, 0xB6, 0x0D, 0x71, 0x58, 0x4E, 0x11, 0xC1, 0xC7, 0x4A, + 0xE2, 0x9C, 0xB9, 0x89, 0xBD, 0xE8, 0x04, 0x2F, 0x1B, 0xB9, 0x13, 0x82, 0x10, 0x9E, 0x11, 0x88, + 0x00, 0x50, 0xDA, 0x7C, 0x6E, 0xED, 0x4E, 0xAA, 0x4E, 0x49, 0xD8, 0x92, 0xE7, 0x43, 0xC1, 0x83, + 0x55, 0x87, 0x40, 0xFF, 0x4C, 0x41, 0x71, 0x79, 0x7D, 0x4A, 0x88, 0x29, 0xED, 0x50, 0x6D, 0xBB, + 0x84, 0x92, 0xCD, 0x56, 0xB3, 0x11, 0x2D, 0x45, 0x94, 0xAB, 0xC4, 0x83, 0x95, 0x95, 0x4B, 0x7C, + 0x47, 0xD4, 0xE9, 0x3D, 0x4B, 0x59, 0x15, 0xDF, 0x12, 0x66, 0x6F, 0x53, 0xA4, 0x7D, 0x78, 0x62, + 0x4E, 0xB0, 0xF4, 0x51, 0xB2, 0x62, 0x50, 0xB2, 0x62, 0xC1, 0xAF, 0x9D, 0x39, 0x25, 0xC2, 0x62, + 0xB0, 0x2A, 0xE7, 0xBE, 0x62, 0xD4, 0x6A, 0x42, 0x7C, 0x26, 0x9E, 0x3B, 0x84, 0x97, 0xF2, 0x08, + 0xE8, 0xF0, 0xD7, 0x0F, 0xA6, 0x63, 0x8D, 0xB0, 0xA7, 0xB0, 0x99, 0x82, 0x49, 0xB6, 0xA7, 0x9A, + 0x08, 0x5E, 0xE3, 0x62, 0x09, 0xA4, 0x4A, 0xB5, 0xA5, 0x77, 0xBC, 0x35, 0xFE, 0xAA, 0x57, 0xA9, + 0x96, 0xE6, 0xAD, 0xEB, 0xC1, 0x8D, 0x33, 0xFD, 0x6F, 0x46, 0x4B, 0x25, 0xE5, 0x57, 0x4E, 0xB2, + 0x2F, 0x31, 0xB7, 0xA2, 0xC2, 0x8C, 0x30, 0x07, 0x93, 0x30, 0xD0, 0x13, 0xEC, 0x0D, 0x58, 0x54, + 0x0E, 0x2B, 0x6C, 0x8F, 0x68, 0xC2, 0x26, 0xB4, 0x82, 0xD8, 0x9F, 0x81, 0x1B, 0xC0, 0xF1, 0xF2, + 0xAF, 0x60, 0x81, 0x17, 0xB3, 0x5A, 0x71, 0xC0, 0xFB, 0xA6, 0x27, 0x98, 0x69, 0xCF, 0xCC, 0xE0, + 0xBE, 0xED, 0xB9, 0x53, 0x42, 0x11, 0x87, 0x2B, 0x3E, 0x02, 0x3B, 0x15, 0x72, 0x84, 0x29, 0x7B, + 0x1C, 0x4D, 0x43, 0x98, 0x85, 0xFF, 0x9B, 0xCB, 0x27, 0xB6, 0x84, 0xA7, 0xAE, 0xA8, 0xE1, 0x81, + 0x53, 0xBD, 0x0B, 0xA9, 0x3A, 0x8C, 0x64, 0xA6, 0xD1, 0x74, 0x4C, 0x35, 0xE1, 0x41, 0xAD, 0x16, + 0x7A, 0x04, 0x5F, 0x6E, 0x67, 0xC8, 0xC4, 0x9D, 0x6C, 0x43, 0xA8, 0x8C, 0x3F, 0x93, 0xF1, 0x19, + 0xD7, 0xF4, 0xAF, 0x35, 0x28, 0x12, 0xA2, 0x30, 0x34, 0x0F, 0x37, 0x4B, 0x53, 0x86, 0xA2, 0x3C, + 0x65, 0xB9, 0x0C, 0x8D, 0x8D, 0x97, 0x73, 0x9A, 0xFD, 0xEC, 0x6B, 0xA4, 0xF3, 0x21, 0xCB, 0x18, + 0x33, 0x8B, 0xED, 0x3F, 0x9F, 0x58, 0xA5, 0x89, 0x17, 0x39, 0x23, 0x8A, 0x7F, 0x35, 0xB6, 0x1C, + 0x9B, 0x84, 0x52, 0x4B, 0x85, 0x2B, 0x4E, 0x8E, 0x6A, 0x70, 0xF7, 0x00, 0x42, 0x04, 0x58, 0x00, + 0x1D, 0x0C, 0x78, 0x1E, 0x8E, 0x7D, 0x58, 0x74, 0x1B, 0x89, 0xB7, 0x07, 0x59, 0x30, 0xEA, 0xD5, + 0xA0, 0x58, 0x92, 0x10, 0x66, 0xAF, 0x8D, 0x60, 0x2A, 0x0E, 0x28, 0x29, 0x47, 0x4C, 0x66, 0x67, + 0x4E, 0x6B, 0x14, 0x76, 0x32, 0x2A, 0x87, 0xF4, 0x0A, 0x62, 0xA2, 0xD7, 0xAD, 0xB5, 0xCD, 0xB4, + 0x2D, 0x00, 0x69, 0xC3, 0x72, 0xAC, 0xE4, 0x75, 0xAE, 0x50, 0x02, 0x98, 0xA8, 0x73, 0xDA, 0xBC, + 0x2D, 0x79, 0x9D, 0x4B, 0x4D, 0xF6, 0x32, 0x14, 0xCB, 0x4B, 0x74, 0x6E, 0x6A, 0x4D, 0x32, 0xBB, + 0x75, 0x6D, 0x95, 0xE9, 0xD6, 0xD4, 0x4A, 0x4B, 0xBF, 0x90, 0xD9, 0xB1, 0xF4, 0x66, 0x91, 0x70, + 0x5A, 0xFA, 0xAE, 0x75, 0x8C, 0x4E, 0x27, 0x35, 0x45, 0x6F, 0x60, 0x8F, 0x68, 0x82, 0x51, 0xEC, + 0xF8, 0x74, 0xB7, 0x9B, 0x3D, 0x7E, 0x4A, 0xE5, 0x42, 0xFD, 0x9D, 0x90, 0x8D, 0xF6, 0x29, 0xDD, + 0x2F, 0x95, 0xE9, 0x6E, 0x56, 0x2B, 0xC5, 0x73, 0xE3, 0x7E, 0x30, 0x39, 0x0A, 0xEE, 0xB1, 0xE7, + 0xE0, 0x40, 0x43, 0x38, 0x2F, 0x39, 0xFC, 0x70, 0xD0, 0xCB, 0x21, 0x57, 0xC8, 0xAA, 0x76, 0xD2, + 0x93, 0x79, 0x1D, 0xC2, 0xCF, 0xA3, 0x5D, 0x48, 0x75, 0x56, 0x04, 0x84, 0xDC, 0x11, 0x52, 0x08, + 0xB1, 0x74, 0xD4, 0x81, 0x4B, 0x39, 0x2C, 0x24, 0xDC, 0xFE, 0xE0, 0xEB, 0xA3, 0x7D, 0x67, 0x9F, + 0xB3, 0x36, 0x85, 0xDF, 0xE8, 0x12, 0xDA, 0x7C, 0xAD, 0xC3, 0xF3, 0x9E, 0x51, 0xD9, 0x9F, 0x77, + 0xFA, 0xFD, 0xC4, 0xE9, 0x42, 0xD9, 0x04, 0x8B, 0x18, 0x53, 0xF7, 0xC0, 0xC0, 0x79, 0xB1, 0x22, + 0x6C, 0x73, 0x95, 0x67, 0xA4, 0x8D, 0xA6, 0x1A, 0x10, 0xAD, 0xBC, 0xC6, 0x29, 0x5B, 0x7C, 0x69, + 0x71, 0xCA, 0xAB, 0xA7, 0xE7, 0xF8, 0x31, 0xCC, 0x74, 0x2A, 0x0F, 0xBE, 0xC2, 0xCD, 0xC4, 0x9D, + 0x1B, 0x0C, 0xD5, 0x99, 0x3F, 0x64, 0xD7, 0x8D, 0xF5, 0x30, 0xB5, 0xE7, 0x01, 0x87, 0x49, 0x4A, + 0x20, 0x95, 0xEC, 0x27, 0xFB, 0xD8, 0xA6, 0xAB, 0x1F, 0x04, 0xCF, 0xE1, 0xF1, 0x24, 0x78, 0x96, + 0x66, 0x9D, 0xFE, 0xF8, 0xC0, 0xF3, 0x4B, 0x1C, 0x28, 0xE4, 0xA5, 0xBA, 0x48, 0x70, 0x4A, 0x52, + 0x89, 0x20, 0xF2, 0xE3, 0x40, 0x40, 0x18, 0xD9, 0x39, 0x90, 0x4D, 0x03, 0x90, 0x54, 0x4B, 0xA4, + 0x6A, 0x06, 0x79, 0xE0, 0x29, 0x36, 0xC1, 0xD4, 0x21, 0x19, 0x6B, 0xC8, 0x71, 0x9D, 0xEC, 0xDA, + 0xD0, 0x60, 0xEA, 0x79, 0xB0, 0x8B, 0xA1, 0x7D, 0x82, 0xB1, 0xA6, 0x97, 0xA2, 0xBD, 0x4F, 0xBE, + 0x20, 0x67, 0x23, 0x9F, 0x2F, 0xD0, 0xD5, 0x04, 0x2A, 0x4B, 0x76, 0x04, 0xD8, 0xA9, 0xA2, 0x23, + 0xF4, 0x60, 0x69, 0x47, 0x6C, 0x11, 0x1F, 0x95, 0x5A, 0x70, 0x8C, 0x52, 0x4A, 0x42, 0xD7, 0x30, + 0x52, 0xA8, 0x8E, 0x85, 0xAC, 0xBF, 0x2E, 0x0F, 0x84, 0xC1, 0x50, 0x55, 0x41, 0x1A, 0x19, 0x89, + 0xB6, 0x2D, 0xA8, 0x1E, 0xA1, 0x92, 0x1F, 0xEA, 0xCD, 0x6B, 0x4A, 0x87, 0xAD, 0x15, 0x8F, 0x8D, + 0x52, 0x5F, 0x15, 0x69, 0xC8, 0x80, 0x1A, 0xBB, 0xE8, 0x8A, 0x59, 0x8A, 0xC3, 0x1A, 0xD4, 0xD4, + 0x42, 0x20, 0xBC, 0xE5, 0xC7, 0xE0, 0x10, 0x5C, 0x53, 0x9F, 0x5F, 0x55, 0xAE, 0x20, 0x78, 0xAB, + 0x0A, 0x48, 0xB5, 0xD9, 0xB1, 0x13, 0x94, 0xA5, 0xE4, 0xC8, 0xA6, 0xF5, 0x08, 0x06, 0xED, 0xBC, + 0x94, 0x32, 0x3B, 0xA7, 0xA0, 0x6D, 0x6A, 0x4C, 0x34, 0xB5, 0x03, 0x68, 0x48, 0x27, 0x00, 0xA7, + 0x0D, 0x24, 0x2C, 0x05, 0x80, 0xE0, 0x14, 0x9B, 0x3B, 0xB3, 0x38, 0xB1, 0x51, 0xFE, 0x5F, 0x44, + 0x56, 0x4F, 0x9F, 0x2E, 0x6C, 0xDB, 0x49, 0xED, 0x1C, 0x21, 0xFA, 0xC8, 0x2A, 0x35, 0xEE, 0xE4, + 0xBF, 0xE5, 0x6E, 0xA6, 0xE2, 0x15, 0x1F, 0xFC, 0x50, 0x20, 0xB0, 0x07, 0x3F, 0x2E, 0x2F, 0x2F, + 0x2E, 0x6B, 0x15, 0x75, 0x15, 0x61, 0x0B, 0xDB, 0x03, 0xD0, 0x50, 0x6A, 0xF3, 0x81, 0x6C, 0x72, + 0xD9, 0xB5, 0xC4, 0xB6, 0xBA, 0xCE, 0x59, 0xF6, 0xC3, 0x7B, 0x1C, 0x48, 0xFA, 0x49, 0xD9, 0x4F, + 0xE4, 0xEA, 0x30, 0xD5, 0x71, 0x4B, 0x55, 0x87, 0x52, 0x5A, 0x31, 0x5D, 0x57, 0x0F, 0xAE, 0x2F, + 0x2F, 0x8F, 0xCE, 0xAF, 0xB4, 0x9D, 0x4D, 0xED, 0x67, 0x24, 0xF9, 0x44, 0x25, 0x4F, 0x27, 0xA0, + 0x12, 0xC1, 0x71, 0xE3, 0xC7, 0xF4, 0x50, 0x52, 0xF8, 0x2A, 0x32, 0xF5, 0x78, 0x40, 0x1D, 0x51, + 0x08, 0xB9, 0x0F, 0x35, 0xEA, 0xF8, 0x2A, 0xB1, 0x63, 0x3B, 0x1B, 0x52, 0x0A, 0x49, 0x72, 0xBA, + 0x6B, 0x80, 0xDF, 0x4B, 0x3D, 0xD8, 0xE9, 0x05, 0x53, 0x6E, 0x25, 0x8A, 0x27, 0xCF, 0x35, 0xA7, + 0xE5, 0x61, 0xE2, 0x32, 0x23, 0x31, 0xDB, 0x5F, 0x76, 0x1D, 0x7E, 0x25, 0xE3, 0xAD, 0x5F, 0xDE, + 0x8B, 0x69, 0x83, 0x84, 0xD4, 0x27, 0x47, 0x86, 0xF0, 0xE1, 0x3D, 0xCF, 0xA2, 0x0D, 0xA6, 0xAB, + 0x3B, 0xB1, 0x97, 0x3F, 0x77, 0x01, 0xFA, 0x5D, 0x80, 0x66, 0x8D, 0x95, 0xC5, 0xF5, 0x45, 0x56, + 0x58, 0x19, 0xA5, 0x76, 0x7D, 0x55, 0xA8, 0x4A, 0x59, 0x5D, 0x87, 0x0C, 0xB8, 0x38, 0xDD, 0x44, + 0x7F, 0x8C, 0xD0, 0x35, 0x14, 0x74, 0x6B, 0xA7, 0x96, 0xFE, 0xA8, 0x82, 0x96, 0x9E, 0x66, 0x8A, + 0xE2, 0x0E, 0x01, 0x6A, 0xD6, 0xA5, 0x85, 0xCD, 0xBB, 0xBC, 0x35, 0x80, 0x6A, 0x8B, 0x90, 0x1B, + 0xF2, 0x6C, 0x90, 0x5F, 0x41, 0x49, 0x1C, 0xB2, 0xDC, 0xC0, 0x0C, 0x49, 0xE0, 0xEF, 0x07, 0x70, + 0xEB, 0x5E, 0x68, 0x69, 0xD2, 0x6F, 0x56, 0x52, 0x39, 0x56, 0x62, 0xF6, 0x2A, 0x88, 0x98, 0xC9, + 0x31, 0xF1, 0x8A, 0x40, 0x51, 0x9D, 0xAE, 0x40, 0x93, 0x6E, 0x48, 0x54, 0x4C, 0x3B, 0x49, 0xC3, + 0xA5, 0xF2, 0x96, 0x49, 0xC2, 0xAF, 0xF2, 0xBD, 0xFD, 0x80, 0x1D, 0x64, 0xC2, 0x7B, 0x39, 0x5E, + 0xDD, 0xE7, 0x49, 0x59, 0x80, 0xB7, 0xCF, 0xB0, 0x84, 0x91, 0x71, 0x77, 0x02, 0xFB, 0x8E, 0x65, + 0x45, 0x01, 0xC7, 0x13, 0xAA, 0x45, 0xF8, 0x79, 0x0D, 0xBE, 0xC5, 0xFE, 0x87, 0xC8, 0x76, 0xD0, + 0xE1, 0x61, 0xDB, 0x0A, 0x7F, 0xA8, 0x99, 0xDE, 0x14, 0x3D, 0x2F, 0x43, 0x60, 0x27, 0xA0, 0x4E, + 0x20, 0xF7, 0x74, 0x03, 0x90, 0x1E, 0x39, 0x04, 0x97, 0x72, 0x0A, 0x0E, 0x61, 0x46, 0x35, 0x09, + 0x1F, 0xE4, 0xB4, 0xD5, 0x7E, 0xFB, 0xE0, 0xE2, 0xE2, 0xF2, 0xF0, 0xE4, 0x7C, 0xEF, 0xEA, 0xE8, + 0xE6, 0xE4, 0xBC, 0x77, 0x7D, 0x75, 0x73, 0xF5, 0xB9, 0x07, 0xBF, 0x7E, 0xDC, 0x3B, 0x3D, 0x39, + 0xBC, 0xB9, 0x3E, 0xFF, 0xE5, 0xFC, 0xE2, 0xD3, 0xB9, 0x70, 0x19, 0x60, 0x99, 0xFE, 0xBD, 0x18, + 0x56, 0x17, 0xE9, 0x51, 0xF0, 0x14, 0xD5, 0x15, 0x58, 0x78, 0x60, 0x8F, 0xCD, 0x91, 0xAE, 0x88, + 0x69, 0xB4, 0x8B, 0xBB, 0x53, 0x4C, 0x1F, 0xB4, 0x48, 0x5C, 0xA2, 0x12, 0xFD, 0x42, 0xB6, 0x66, + 0x01, 0xE4, 0x41, 0x8F, 0xD8, 0xC3, 0xF2, 0x33, 0x43, 0x7C, 0x16, 0xC8, 0x1B, 0x7A, 0xBC, 0x37, + 0xE9, 0x22, 0x37, 0xA4, 0xFC, 0x27, 0xAC, 0x9E, 0xFA, 0x82, 0x06, 0x1F, 0x98, 0x0E, 0xC2, 0xC0, + 0x18, 0xAA, 0x5C, 0x6D, 0x87, 0x08, 0x03, 0x51, 0x88, 0x10, 0x7C, 0xE7, 0x87, 0x75, 0xF6, 0x10, + 0xFB, 0xC8, 0xAA, 0xC1, 0x8B, 0x30, 0x34, 0x4B, 0x0F, 0xBB, 0x6D, 0xF5, 0x5B, 0x68, 0xB9, 0x05, + 0xCE, 0x60, 0x2D, 0x3A, 0x60, 0x6D, 0xE5, 0x22, 0x51, 0x7C, 0x94, 0x3B, 0x1C, 0x82, 0x84, 0x9A, + 0x56, 0x22, 0x8B, 0x7C, 0xCB, 0x1E, 0xDA, 0x41, 0x3C, 0x64, 0x44, 0x15, 0xA7, 0x87, 0x96, 0x40, + 0x0B, 0x99, 0x7F, 0x74, 0x3B, 0xA0, 0xE5, 0xDB, 0xD2, 0x52, 0x76, 0x9E, 0x5A, 0x11, 0x23, 0xC0, + 0xA9, 0x2F, 0xD7, 0x9B, 0xF1, 0x68, 0x2E, 0x2D, 0x01, 0x4F, 0xE1, 0xBD, 0x8C, 0xA1, 0xEB, 0x5A, + 0x45, 0x9A, 0x23, 0xD2, 0x3C, 0x1E, 0xF4, 0xF2, 0xED, 0xDB, 0x80, 0x5E, 0xE8, 0x5B, 0x26, 0x84, + 0xD0, 0xB4, 0x51, 0x49, 0x7A, 0xF9, 0x15, 0x3C, 0x3D, 0x10, 0x11, 0x91, 0x02, 0xEF, 0x0F, 0x5F, + 0x12, 0x06, 0x1A, 0x89, 0x99, 0xB8, 0xD0, 0x23, 0x27, 0x03, 0x90, 0xA9, 0x89, 0xEB, 0xFB, 0x36, + 0xF8, 0xA9, 0x31, 0x09, 0x81, 0xD9, 0x1B, 0x09, 0x4F, 0x3C, 0x53, 0x85, 0x2F, 0x67, 0x67, 0xED, + 0x31, 0xFB, 0x11, 0x3E, 0x22, 0xED, 0xD7, 0x65, 0xED, 0xD7, 0xB3, 0xB3, 0x7E, 0xBF, 0xED, 0xD3, + 0x1F, 0x19, 0x02, 0xD2, 0x7D, 0x27, 0x30, 0x96, 0x85, 0xEF, 0xB1, 0x56, 0x93, 0x04, 0x67, 0x17, + 0x42, 0x78, 0x66, 0xE7, 0xE2, 0xFF, 0x05, 0x2F, 0x3E, 0xC7, 0x6D, 0xA3, 0x35, 0x32, 0x0B, 0xB7, + 0x8C, 0xD5, 0xD5, 0xB5, 0x37, 0x34, 0x51, 0x12, 0xE5, 0x65, 0x5B, 0x70, 0x23, 0x8C, 0xB5, 0xC1, + 0x2E, 0xEA, 0xCE, 0x03, 0xF3, 0x05, 0xCC, 0x4A, 0x83, 0x46, 0xD4, 0x92, 0xE9, 0xD7, 0x45, 0xE6, + 0x08, 0x72, 0x48, 0x59, 0x40, 0x09, 0x32, 0xD6, 0x51, 0x77, 0xBD, 0xDD, 0x35, 0xD6, 0xB6, 0x74, + 0xB4, 0xC4, 0x1A, 0x6B, 0x17, 0xAD, 0xCE, 0x99, 0x94, 0x2E, 0xA5, 0x66, 0x35, 0xA6, 0x66, 0xB9, + 0x63, 0xAC, 0x2F, 0x77, 0x3A, 0xCB, 0xC6, 0x7A, 0xBB, 0xB3, 0xD1, 0xD5, 0xD2, 0xA3, 0xD7, 0x7A, + 0xBB, 0xE0, 0x9F, 0x3B, 0x27, 0xDA, 0xDE, 0x00, 0x51, 0x77, 0xF8, 0x11, 0x7B, 0x8C, 0xA0, 0x4E, + 0x07, 0xC8, 0xD9, 0xDC, 0xDC, 0xDA, 0xEA, 0xA2, 0xC6, 0x21, 0x13, 0x30, 0xA8, 0xC2, 0x7E, 0x6B, + 0x46, 0x44, 0x8A, 0xFB, 0x62, 0x07, 0x0F, 0xCD, 0x80, 0x28, 0xD5, 0xBE, 0x3D, 0x74, 0x94, 0x1D, + 0x87, 0x3C, 0x9D, 0x8D, 0x58, 0x9B, 0x08, 0xDA, 0x2B, 0x2A, 0x67, 0xDB, 0x36, 0xF0, 0x85, 0xDD, + 0x13, 0xB4, 0x5E, 0x0B, 0xF8, 0x07, 0xBE, 0xAA, 0xF4, 0xEA, 0x0C, 0x1C, 0x66, 0x89, 0x52, 0xA3, + 0xEC, 0x60, 0x3A, 0x45, 0xF0, 0x9D, 0x97, 0xE9, 0x50, 0x42, 0xA5, 0xA2, 0xB1, 0x5D, 0x5E, 0x06, + 0x50, 0x90, 0x03, 0x2D, 0x1E, 0x6E, 0xA2, 0xCB, 0x61, 0x6D, 0xB5, 0x1D, 0x96, 0xB3, 0x98, 0x96, + 0x60, 0xA6, 0xDF, 0x59, 0xEA, 0x34, 0x1A, 0xCF, 0xCB, 0xD1, 0x86, 0x78, 0x90, 0x4F, 0x10, 0x69, + 0xAC, 0x62, 0xA2, 0x48, 0x33, 0x2D, 0xFC, 0x97, 0xBF, 0x88, 0xB2, 0x15, 0x7F, 0x4B, 0x19, 0xE0, + 0x1D, 0xEA, 0x81, 0x0D, 0x4F, 0x32, 0xA4, 0x96, 0x6F, 0x34, 0x9B, 0x4D, 0x78, 0x2D, 0x2C, 0xA9, + 0x01, 0xA4, 0xC7, 0xB7, 0xAA, 0x2F, 0xEB, 0x0C, 0xB2, 0xE4, 0x06, 0xC1, 0x22, 0x98, 0xE9, 0xDD, + 0x15, 0x73, 0xCC, 0xA7, 0xB7, 0xBD, 0x84, 0xCD, 0xCE, 0x20, 0x0C, 0x17, 0x8B, 0xB7, 0x17, 0x74, + 0xBC, 0xC8, 0xE6, 0x15, 0x71, 0x21, 0x92, 0xC1, 0x70, 0x85, 0x23, 0xC3, 0x10, 0x60, 0xB3, 0x40, + 0x31, 0x43, 0x04, 0x22, 0x2C, 0x8E, 0x71, 0xBD, 0xE5, 0x9D, 0x48, 0x79, 0xB1, 0xAB, 0x6D, 0x39, + 0xBA, 0x8C, 0xA6, 0x67, 0xB4, 0x9D, 0x69, 0x40, 0x3D, 0x64, 0x32, 0x50, 0x45, 0x88, 0xCE, 0xCE, + 0x64, 0xD7, 0xE4, 0x63, 0x9B, 0x2C, 0xE6, 0x64, 0x01, 0x92, 0x97, 0xE6, 0x78, 0x09, 0xA7, 0x21, + 0x03, 0x17, 0x77, 0x0D, 0xBA, 0x46, 0x91, 0x71, 0x59, 0xEE, 0x24, 0x0C, 0xF0, 0xB3, 0x8E, 0xC1, + 0xCD, 0xF9, 0xC5, 0xCD, 0xE1, 0xD1, 0xC1, 0xC9, 0xD9, 0xDE, 0x69, 0x62, 0x38, 0x7C, 0x4C, 0x56, + 0x29, 0x0B, 0x3A, 0x17, 0x91, 0xA4, 0xF0, 0x5D, 0x92, 0x0D, 0x76, 0x66, 0x63, 0x4D, 0xB4, 0xAC, + 0x8B, 0xE7, 0x98, 0xC4, 0x71, 0xB1, 0x4D, 0xC8, 0xCF, 0xBF, 0x46, 0x7C, 0xE3, 0x2D, 0x80, 0x75, + 0xC2, 0xB3, 0x6F, 0x9A, 0xED, 0x58, 0x88, 0x6E, 0x29, 0x86, 0xB2, 0x82, 0x36, 0xC8, 0xF2, 0x40, + 0x23, 0x0E, 0x43, 0x24, 0x2B, 0x68, 0x75, 0x03, 0x02, 0xF3, 0x9B, 0x4A, 0x48, 0x8B, 0x3C, 0xBD, + 0x53, 0xB6, 0x41, 0x3A, 0xC4, 0x7F, 0x85, 0x61, 0x49, 0x0D, 0xAE, 0x8D, 0xB6, 0x1D, 0xCA, 0xAC, + 0x85, 0x09, 0x2A, 0xCF, 0x59, 0x3A, 0x65, 0x53, 0x67, 0xE4, 0x3A, 0x4C, 0xD8, 0xD4, 0xD2, 0xB5, + 0x68, 0xBA, 0xCA, 0xAB, 0xF8, 0x1C, 0x67, 0x6B, 0xE1, 0xB9, 0x1A, 0x4F, 0x52, 0x49, 0x56, 0xD2, + 0x66, 0xA8, 0x3A, 0x57, 0x4A, 0xCF, 0xC9, 0xF4, 0x19, 0xA9, 0x17, 0x5A, 0x99, 0x43, 0xD4, 0x5B, + 0x96, 0xB7, 0xD0, 0x80, 0x4E, 0x91, 0xD8, 0xB2, 0x02, 0xB8, 0x78, 0x59, 0x53, 0xA4, 0x4D, 0x12, + 0xAD, 0x0E, 0x13, 0x8E, 0xE5, 0x85, 0x49, 0xC7, 0xCD, 0xD9, 0xD9, 0xCD, 0xE1, 0x5E, 0xFF, 0x43, + 0x42, 0x46, 0xB8, 0xD7, 0x57, 0xAC, 0xD0, 0x78, 0x98, 0xC8, 0x72, 0x22, 0xB0, 0x28, 0x16, 0x08, + 0xAE, 0xEB, 0xA1, 0x29, 0x24, 0x86, 0x88, 0xC7, 0x2E, 0x6D, 0x98, 0xC5, 0x06, 0x9D, 0xAF, 0x82, + 0xAE, 0x4D, 0x8E, 0xF4, 0xEB, 0x1B, 0xB7, 0xF4, 0x51, 0xEB, 0x46, 0xA3, 0x16, 0xEE, 0xAA, 0x17, + 0x30, 0x6A, 0x44, 0xFF, 0xBF, 0xC2, 0x81, 0x7B, 0x55, 0x8B, 0xA4, 0xC0, 0xA6, 0x62, 0x6B, 0xA5, + 0xD8, 0xAD, 0x6E, 0xDC, 0x2D, 0xCD, 0x62, 0xF9, 0x3B, 0x58, 0xC7, 0x98, 0x90, 0xC6, 0x56, 0xA2, + 0x39, 0xCB, 0xE8, 0x76, 0x1E, 0xB3, 0x62, 0x1D, 0xFF, 0x23, 0xD9, 0xC0, 0x35, 0x2C, 0x5A, 0xA4, + 0x86, 0x2D, 0x3C, 0x47, 0xD1, 0x4F, 0xE5, 0x9A, 0x3F, 0x62, 0xDD, 0x68, 0xC4, 0xD0, 0xA2, 0x4E, + 0x38, 0x4C, 0x71, 0xBC, 0xB2, 0x61, 0x7B, 0x8D, 0xAA, 0xF5, 0x7F, 0xA6, 0x56, 0x0D, 0x2D, 0x67, + 0xD2, 0xDD, 0x95, 0x06, 0x04, 0xBB, 0xBE, 0xD2, 0x14, 0x44, 0xF9, 0x4B, 0xB6, 0x9A, 0x6A, 0xA8, + 0xAD, 0x66, 0x58, 0x84, 0x37, 0xC8, 0xC3, 0x2B, 0x02, 0xC1, 0xD6, 0x0F, 0x46, 0xE5, 0x38, 0x1A, + 0xB5, 0x85, 0xDC, 0x69, 0x00, 0x7F, 0x98, 0xFC, 0xFE, 0x00, 0x5A, 0xF5, 0x5D, 0xF9, 0x3A, 0x00, + 0x4C, 0xDA, 0xB7, 0x84, 0x6D, 0x63, 0x8C, 0xEA, 0xCA, 0x44, 0xAA, 0xB7, 0x10, 0x0E, 0x06, 0xF2, + 0xA3, 0xE4, 0x40, 0x3D, 0x25, 0x46, 0x20, 0xAE, 0xA5, 0x93, 0x9F, 0x94, 0xAB, 0x03, 0x6E, 0x36, + 0x95, 0xAE, 0x46, 0x59, 0x50, 0x89, 0x46, 0x02, 0x8B, 0x8B, 0x60, 0x53, 0x3F, 0xDF, 0x63, 0x81, + 0x8B, 0xBF, 0x35, 0x05, 0x86, 0x27, 0xAE, 0x9A, 0x45, 0x42, 0xD2, 0x2E, 0xE4, 0x66, 0x24, 0xF5, + 0x46, 0x3C, 0x44, 0x91, 0xD3, 0xE0, 0x8C, 0xE0, 0xE6, 0x0B, 0x2D, 0x3C, 0x02, 0xCC, 0x1B, 0x66, + 0xFF, 0xF3, 0xD9, 0xFE, 0xC5, 0x29, 0x83, 0x9A, 0x88, 0xD8, 0x19, 0xB9, 0xCE, 0x90, 0xE6, 0x2C, + 0x39, 0xC4, 0x43, 0x0F, 0xAB, 0x56, 0x98, 0xE4, 0x80, 0x28, 0x63, 0x4C, 0xCE, 0x7B, 0x2A, 0x04, + 0x7D, 0x45, 0x32, 0x89, 0x37, 0x8C, 0x6D, 0x35, 0x63, 0x57, 0x54, 0xFC, 0x0E, 0xA5, 0xAB, 0xC5, + 0x48, 0x01, 0xA4, 0x48, 0xD9, 0x20, 0x39, 0x9D, 0xDF, 0x34, 0x35, 0xE9, 0xC1, 0x66, 0x1C, 0xEA, + 0x54, 0xFA, 0xA2, 0x69, 0x95, 0xE0, 0xE5, 0x12, 0x99, 0x69, 0x54, 0xF1, 0x84, 0x55, 0xB7, 0x35, + 0x97, 0x29, 0x73, 0x92, 0x9A, 0x6A, 0xE4, 0x2D, 0xBF, 0x08, 0x7D, 0x4C, 0x02, 0xAB, 0x51, 0xF8, + 0xDF, 0xFF, 0x25, 0x93, 0x08, 0xDF, 0xEA, 0x35, 0x85, 0xD0, 0x4A, 0x90, 0x91, 0xB6, 0xEF, 0xAA, + 0xC6, 0x99, 0x4B, 0xFF, 0xFB, 0x4D, 0x69, 0x52, 0xCF, 0x2E, 0x8C, 0xF3, 0x86, 0x28, 0x9C, 0xD0, + 0x16, 0x02, 0x38, 0x21, 0x01, 0x73, 0xE2, 0x82, 0xB0, 0xF1, 0x59, 0x08, 0xDD, 0x0B, 0x06, 0xAF, + 0x9C, 0x88, 0x9B, 0xBF, 0x13, 0xF5, 0x2C, 0x51, 0x7E, 0xA6, 0x33, 0xEF, 0x97, 0xA2, 0x9C, 0x43, + 0xC8, 0xA6, 0xBC, 0xF8, 0xE2, 0xB0, 0xB1, 0x80, 0xC5, 0x41, 0x9A, 0x8F, 0x25, 0x97, 0x87, 0x04, + 0xA7, 0x5E, 0x6A, 0xD9, 0x48, 0x4E, 0xF8, 0xB2, 0x2B, 0x87, 0x8E, 0xF4, 0xE5, 0x97, 0xA2, 0x7D, + 0xF6, 0x55, 0x45, 0x47, 0x7E, 0x3D, 0xB9, 0xDC, 0xFC, 0xAD, 0x56, 0x5B, 0x58, 0x2F, 0x9A, 0xD5, + 0x97, 0x2E, 0x1D, 0xF5, 0x68, 0xE1, 0xCC, 0x4F, 0xD7, 0xBA, 0x73, 0x12, 0x7B, 0x21, 0x42, 0x55, + 0xAF, 0x25, 0xE6, 0x2C, 0x46, 0xB3, 0xF6, 0x25, 0x7B, 0x2C, 0x5E, 0xBA, 0x37, 0xEA, 0x8A, 0xB2, + 0x80, 0xB9, 0x9D, 0xD9, 0x25, 0x4D, 0x00, 0x93, 0x8C, 0x32, 0xE9, 0xD8, 0x19, 0xBA, 0x51, 0x0D, + 0xE0, 0xB5, 0x2E, 0xDE, 0x6C, 0xE5, 0x6F, 0xD6, 0x4A, 0x3B, 0x80, 0xB0, 0xF4, 0x41, 0x73, 0x1B, + 0xA9, 0x09, 0x36, 0x42, 0x17, 0x04, 0x72, 0xB2, 0x6E, 0xB1, 0x9C, 0x70, 0xE4, 0x18, 0x7C, 0xEF, + 0x49, 0xBE, 0xA0, 0x2C, 0xA9, 0xDD, 0x2E, 0x9C, 0xBE, 0xC3, 0xE0, 0xAB, 0x65, 0xC1, 0x6F, 0x86, + 0x7C, 0x96, 0x0F, 0xFC, 0x50, 0x4F, 0x4A, 0xC3, 0xC6, 0x73, 0xDE, 0x2D, 0x01, 0x64, 0x70, 0x7E, + 0x95, 0xCA, 0x19, 0xF4, 0x25, 0x96, 0x13, 0x58, 0xB6, 0x09, 0x38, 0x92, 0x15, 0x80, 0x43, 0x37, + 0xE1, 0xDD, 0x34, 0x87, 0xE5, 0xC8, 0x0A, 0xED, 0x01, 0x42, 0xEC, 0x38, 0x2F, 0x8A, 0xBD, 0x00, + 0xB3, 0x0E, 0xF5, 0xFE, 0xA3, 0x1D, 0x0C, 0xEE, 0x51, 0x66, 0x1D, 0xEA, 0x4F, 0xC1, 0x5E, 0x79, + 0x7F, 0xAB, 0x66, 0x38, 0x66, 0xE3, 0x52, 0xBB, 0x76, 0xBE, 0x39, 0xBA, 0x77, 0xC3, 0xD5, 0xEC, + 0xDA, 0x03, 0x08, 0xE2, 0x6E, 0x14, 0x36, 0x06, 0xA4, 0xA1, 0x13, 0x0D, 0x1F, 0x73, 0xC6, 0x49, + 0xCE, 0x66, 0xE9, 0x58, 0x63, 0x33, 0xEB, 0x9C, 0xB1, 0xDE, 0x64, 0xA2, 0x45, 0x8B, 0xC4, 0xCB, + 0x96, 0xED, 0x74, 0xE4, 0xCB, 0x0B, 0x43, 0x4E, 0x77, 0x3A, 0x59, 0xCC, 0x8E, 0x0C, 0x58, 0x0B, + 0xE8, 0x75, 0x26, 0x6A, 0xC9, 0x7A, 0xB6, 0x80, 0x5E, 0x8B, 0x4A, 0x35, 0x9B, 0x01, 0x0B, 0xE9, + 0x79, 0x31, 0xF4, 0x8C, 0x09, 0x8B, 0x21, 0x40, 0x5D, 0x59, 0x32, 0xC5, 0x6F, 0x39, 0x87, 0x8A, + 0xEF, 0xF2, 0x22, 0x21, 0x29, 0xA3, 0xEF, 0xFF, 0x1F, 0x87, 0x37, 0x3A, 0x5E, 0xDE, 0x5A, 0x00 }; ///main_js //To convert AP-Config\index.html to index_html[], run the Python index_html_zipper.py script in the Tools folder: @@ -886,909 +889,911 @@ static const uint8_t main_js[] PROGMEM = { // python index_html_zipper.py static const uint8_t index_html[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x17, 0xF7, 0x3F, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, - 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x52, 0xE3, 0x4A, - 0x93, 0xE0, 0xFF, 0xF3, 0x14, 0x35, 0x9E, 0x9D, 0x81, 0x9E, 0xC1, 0xC6, 0x17, 0xA0, 0x69, 0xBE, - 0x6E, 0x22, 0xB8, 0x76, 0xB3, 0x1F, 0x74, 0x3B, 0x30, 0xFD, 0x9D, 0xCB, 0xC6, 0xEE, 0x09, 0x21, - 0x95, 0x6D, 0x7D, 0xC8, 0x92, 0x8E, 0x2E, 0xD0, 0x9C, 0x89, 0x99, 0x98, 0xC7, 0xD8, 0x7D, 0x90, - 0x7D, 0x81, 0x7D, 0x94, 0x79, 0x92, 0xCD, 0xCC, 0x2A, 0xC9, 0x92, 0x2C, 0xDB, 0x25, 0x21, 0x1B, - 0x1B, 0xE8, 0x13, 0x07, 0x8C, 0xAC, 0xBA, 0x65, 0x65, 0x66, 0x65, 0x66, 0xE5, 0xE5, 0xE3, 0x3F, - 0x9C, 0x7E, 0x3B, 0xB9, 0xF9, 0xB5, 0x7B, 0xC6, 0x86, 0xC1, 0xC8, 0x3A, 0xFC, 0xE9, 0x23, 0xFE, - 0x62, 0x96, 0x66, 0x0F, 0x3E, 0xD5, 0xB8, 0x5D, 0x3B, 0xFC, 0x09, 0x9E, 0x70, 0xCD, 0x38, 0xFC, - 0x89, 0xC1, 0xBF, 0x8F, 0x23, 0x1E, 0x68, 0x4C, 0x1F, 0x6A, 0x9E, 0xCF, 0x83, 0x4F, 0xB5, 0x30, - 0xE8, 0xD7, 0xF7, 0x6B, 0x6C, 0x3B, 0xF9, 0xE5, 0x30, 0x08, 0xDC, 0x3A, 0xFF, 0x23, 0x34, 0xEF, - 0x3F, 0xD5, 0x7E, 0xA9, 0x7F, 0x3F, 0xAA, 0x9F, 0x38, 0x23, 0x57, 0x0B, 0xCC, 0x5B, 0x8B, 0xD7, - 0x98, 0xEE, 0xD8, 0x01, 0xB7, 0xA1, 0xE5, 0xC5, 0xD9, 0x27, 0x6E, 0x0C, 0xF8, 0x96, 0x3E, 0xF4, - 0x9C, 0x11, 0xFF, 0xD4, 0x1A, 0x77, 0x12, 0x98, 0x81, 0xC5, 0x0F, 0x7B, 0xAE, 0xE6, 0xDD, 0x9D, - 0x87, 0x36, 0xBB, 0xBE, 0xF9, 0x2B, 0xEB, 0xF1, 0x20, 0x74, 0x3F, 0x6E, 0x8B, 0x6F, 0x12, 0x43, - 0xD9, 0x1A, 0x34, 0xAD, 0xDD, 0x9B, 0xFC, 0xC1, 0x75, 0xBC, 0xA0, 0x46, 0xDF, 0xE0, 0xBF, 0x78, - 0x94, 0x07, 0xD3, 0x08, 0x86, 0x9F, 0x0C, 0x7E, 0x6F, 0xEA, 0xBC, 0x4E, 0x7F, 0x6C, 0x31, 0xD3, - 0x36, 0x03, 0x53, 0xB3, 0xEA, 0xBE, 0xAE, 0x59, 0x30, 0xF0, 0x16, 0x1B, 0x69, 0x3F, 0xCC, 0x51, - 0x38, 0x1A, 0x3F, 0x08, 0x7D, 0xEE, 0xD1, 0x5F, 0x1A, 0xCC, 0xF9, 0x53, 0x73, 0x8B, 0xF9, 0x43, - 0xCF, 0xB4, 0xEF, 0xEA, 0x81, 0x53, 0xEF, 0x9B, 0xC1, 0xA7, 0x47, 0xEE, 0x8F, 0x67, 0x6B, 0xC1, - 0x17, 0xCC, 0xE3, 0xD6, 0xA7, 0x9A, 0x1F, 0x3C, 0x5A, 0xDC, 0x1F, 0x72, 0x1E, 0xD4, 0xD8, 0xD0, - 0xE3, 0x7D, 0x78, 0xE2, 0xE9, 0xDB, 0xB7, 0x8E, 0x13, 0xF8, 0x81, 0xA7, 0xB9, 0x8D, 0x91, 0x69, - 0x37, 0x74, 0xDF, 0xAF, 0x29, 0x36, 0xA4, 0xA7, 0xC9, 0x06, 0xBE, 0xEE, 0x99, 0x6E, 0xC0, 0xE0, - 0x3B, 0xF1, 0xC2, 0xDF, 0xFF, 0x08, 0xB9, 0xF7, 0x58, 0xEF, 0x34, 0xF6, 0x1A, 0x4D, 0xEA, 0xFC, - 0xEF, 0xF0, 0xEA, 0xC7, 0x6D, 0xF1, 0xDA, 0x94, 0x36, 0xE9, 0xD9, 0x14, 0x6A, 0x70, 0x1B, 0xDA, - 0x06, 0x4C, 0x68, 0xB2, 0x5D, 0xB2, 0xE1, 0x61, 0xBC, 0x05, 0xFF, 0x6D, 0xD3, 0x70, 0xF4, 0x70, - 0x04, 0xBB, 0xF0, 0xAE, 0xE1, 0xD8, 0x9B, 0x1B, 0xBA, 0x65, 0xEA, 0x77, 0x1B, 0x5B, 0x6C, 0xA3, - 0x11, 0x38, 0x83, 0x81, 0xC5, 0xEB, 0xB7, 0x81, 0x0D, 0x7F, 0xF6, 0x43, 0x5B, 0x0F, 0x4C, 0xC7, - 0x66, 0x9B, 0xFC, 0x1D, 0xFB, 0xB7, 0xB8, 0xB5, 0xE8, 0x01, 0x96, 0x1F, 0x7A, 0x1E, 0x74, 0x71, - 0xA3, 0x79, 0x03, 0x1E, 0x34, 0xF4, 0xA1, 0x69, 0x19, 0xF0, 0xF7, 0xFF, 0x68, 0xFE, 0xCF, 0x77, - 0xB2, 0x9B, 0x13, 0x4B, 0xF3, 0xFD, 0xCD, 0x0D, 0x13, 0x76, 0xBC, 0xAE, 0x6B, 0x1E, 0x0F, 0xEA, - 0x86, 0xF3, 0x60, 0xB3, 0xC4, 0xDF, 0xA1, 0xBB, 0xF1, 0xEE, 0x2F, 0x71, 0xC7, 0xFF, 0xFE, 0x4E, - 0x4C, 0x37, 0x3B, 0x7B, 0x04, 0xF6, 0x78, 0xF2, 0x0D, 0x3F, 0x00, 0x84, 0xD5, 0xEB, 0x03, 0xCF, - 0x09, 0xDD, 0xCC, 0xB4, 0x86, 0xDC, 0x1C, 0x0C, 0x83, 0x03, 0xD6, 0xFC, 0x4B, 0xEA, 0xB1, 0x73, - 0xCF, 0xBD, 0xBE, 0xE5, 0x3C, 0x1C, 0xB0, 0xA1, 0x69, 0x18, 0xDC, 0x4E, 0x7F, 0x0B, 0x10, 0xB4, - 0x7D, 0x13, 0x17, 0x7A, 0x20, 0x3B, 0x60, 0xCD, 0xC6, 0x8E, 0xCF, 0xB8, 0xE6, 0xF3, 0xF4, 0x9B, - 0xB7, 0x8E, 0x67, 0x00, 0xF6, 0xDD, 0x3A, 0x41, 0xE0, 0x8C, 0x0E, 0x98, 0xEF, 0x58, 0xA6, 0xC1, - 0x5A, 0xEE, 0x0F, 0xF6, 0x8F, 0x7A, 0x13, 0xFF, 0x4B, 0x2C, 0xE5, 0xA7, 0xF1, 0x7C, 0x2D, 0xD3, - 0x0F, 0x56, 0x7B, 0xB6, 0xF8, 0xCF, 0xD5, 0x0C, 0xC3, 0xB4, 0x07, 0x75, 0x4F, 0xCC, 0x69, 0xB7, - 0xE9, 0xFE, 0xC8, 0x5F, 0x8E, 0xE8, 0x16, 0x88, 0xC2, 0x67, 0x81, 0xB1, 0x95, 0xFF, 0x7C, 0x98, - 0x59, 0xA9, 0xF8, 0xEE, 0x80, 0xD9, 0x8E, 0x9D, 0x99, 0xE4, 0x08, 0xB0, 0xC7, 0xB4, 0xEB, 0x16, - 0xEF, 0x23, 0x20, 0xA6, 0x8C, 0x79, 0x1B, 0xC2, 0x12, 0xEC, 0x83, 0x3E, 0x20, 0xAD, 0x9F, 0xE9, - 0xD9, 0x09, 0x03, 0x20, 0x56, 0x9E, 0x02, 0x62, 0x72, 0xB6, 0xA6, 0x8D, 0x5F, 0x9F, 0x79, 0x9E, - 0xE3, 0x65, 0x5A, 0x1A, 0xA6, 0xEF, 0x5A, 0xDA, 0xE3, 0x01, 0x13, 0xAF, 0xA4, 0xA7, 0xA5, 0x3B, - 0x96, 0x03, 0xF3, 0xF5, 0xB8, 0x91, 0x7E, 0xDE, 0x07, 0xE6, 0x55, 0xF7, 0xCD, 0x3F, 0x61, 0x40, - 0x7F, 0xA4, 0x59, 0x16, 0xF7, 0x66, 0x0D, 0xDB, 0x0B, 0x75, 0x1D, 0xE1, 0x51, 0x7C, 0xE0, 0x81, - 0xC7, 0xB3, 0x1B, 0x3F, 0x6B, 0xE8, 0xF8, 0xFB, 0x07, 0x89, 0x52, 0xB7, 0x8E, 0x65, 0x4C, 0xDB, - 0xBE, 0x1F, 0x75, 0x6A, 0x9F, 0x99, 0xD5, 0xF4, 0x8D, 0xC0, 0x7F, 0xC4, 0x9E, 0x0F, 0x58, 0xA7, - 0xF9, 0x4F, 0xD3, 0x7B, 0x15, 0x3D, 0xB4, 0x9B, 0xB3, 0x3A, 0x6E, 0xCF, 0x40, 0xAB, 0xA8, 0x87, - 0x9D, 0x99, 0x3D, 0xEC, 0x4C, 0xEF, 0x41, 0x0B, 0x02, 0x60, 0xBA, 0x99, 0xC6, 0xAE, 0x13, 0x51, - 0x8B, 0x76, 0x0B, 0x24, 0x10, 0x06, 0x19, 0x80, 0xFF, 0x59, 0x37, 0x6D, 0x83, 0xFF, 0x38, 0x60, - 0xAD, 0x66, 0x33, 0x43, 0x12, 0x92, 0x14, 0x5A, 0x13, 0xD0, 0x80, 0x43, 0xA9, 0x2E, 0x21, 0xB2, - 0xD7, 0xCC, 0xF9, 0x96, 0xA6, 0x1B, 0x38, 0x2E, 0x90, 0x51, 0x7A, 0xB2, 0x92, 0xBD, 0x09, 0x86, - 0xF6, 0x71, 0x5B, 0x1C, 0xDD, 0x3F, 0x7D, 0xBC, 0x75, 0x8C, 0x47, 0xC9, 0xE3, 0x0D, 0xF3, 0x9E, - 0xE9, 0xC8, 0x37, 0x3F, 0xD5, 0xF0, 0xA0, 0xD4, 0x00, 0x41, 0xBC, 0x1A, 0x33, 0x8D, 0x4F, 0x35, - 0xB9, 0xBC, 0x0B, 0x78, 0x5C, 0x1B, 0x73, 0x43, 0x6A, 0xA0, 0x59, 0xE6, 0xC0, 0xFE, 0x54, 0xA3, - 0xF9, 0xD6, 0xA2, 0xE6, 0xF2, 0xFD, 0xC4, 0xBB, 0xF4, 0xBE, 0x39, 0x1A, 0x64, 0xBB, 0x3B, 0x37, - 0x2D, 0xFE, 0x15, 0x4E, 0xEB, 0xDA, 0xF8, 0x68, 0x39, 0x16, 0xDF, 0xB6, 0x7F, 0x3F, 0x19, 0xD2, - 0x6A, 0x06, 0x0D, 0xD7, 0x1E, 0xD4, 0x60, 0x20, 0x38, 0xB7, 0xE5, 0x77, 0xCC, 0xE2, 0xF7, 0xDC, - 0xAA, 0x1D, 0x02, 0x83, 0x76, 0x35, 0x3B, 0xD9, 0x67, 0x97, 0x7B, 0x3A, 0x1C, 0x0C, 0xB5, 0xD4, - 0xC0, 0x84, 0xDC, 0x62, 0x66, 0x84, 0x7E, 0x30, 0x18, 0x82, 0xE1, 0x53, 0x2D, 0x22, 0x07, 0x49, - 0x0D, 0xB5, 0xC3, 0x7F, 0xDD, 0x7B, 0x0F, 0x30, 0x82, 0x3E, 0x13, 0xAB, 0xDC, 0x86, 0x65, 0x4A, - 0x08, 0x89, 0x8F, 0xB3, 0xA0, 0x95, 0xE9, 0x98, 0x98, 0x4E, 0x72, 0x57, 0x08, 0x09, 0xC7, 0x7B, - 0x28, 0xB6, 0x50, 0x00, 0xD9, 0xE3, 0x20, 0x3A, 0x5D, 0xD8, 0x5D, 0xCF, 0x41, 0xC2, 0x4D, 0xC2, - 0xF9, 0xF6, 0xF0, 0x1A, 0xBF, 0x0B, 0x00, 0x16, 0x1F, 0xB7, 0x6F, 0x0F, 0x3F, 0xDE, 0x7A, 0xF4, - 0x3F, 0x4A, 0x40, 0x42, 0x84, 0x61, 0xA6, 0x0F, 0xFC, 0x02, 0xCF, 0x64, 0x04, 0x17, 0xEB, 0x5A, - 0xC8, 0x91, 0xD9, 0x83, 0x66, 0x06, 0x8D, 0x46, 0x63, 0x59, 0x53, 0x47, 0x71, 0xCE, 0xE2, 0x01, - 0xCF, 0x99, 0x39, 0x3B, 0x85, 0xCE, 0xA6, 0x4C, 0x7D, 0xA8, 0xF9, 0xC0, 0x9B, 0x1F, 0x18, 0xF5, - 0xB1, 0x8C, 0xC9, 0xF6, 0x4D, 0x6F, 0xF4, 0x00, 0x22, 0xC0, 0x77, 0xD7, 0x72, 0x34, 0x23, 0x7F, - 0xD6, 0xD9, 0xF9, 0x9E, 0xCB, 0x36, 0x2C, 0x74, 0x0D, 0x2D, 0xE0, 0xC0, 0x2A, 0x45, 0xAB, 0x06, - 0x4B, 0x6F, 0x82, 0x58, 0x48, 0xB4, 0x11, 0x8A, 0x8B, 0x39, 0xFC, 0x29, 0x97, 0xA4, 0x10, 0x8F, - 0x71, 0xA9, 0xF1, 0xFB, 0x20, 0x9A, 0x8E, 0xEA, 0xAD, 0x36, 0xC8, 0x58, 0x48, 0x48, 0x31, 0xBD, - 0x78, 0xC1, 0x5D, 0xDD, 0x47, 0x41, 0x38, 0x41, 0x27, 0x29, 0x29, 0xF9, 0x67, 0xF3, 0xDC, 0x14, - 0xA2, 0x32, 0x8A, 0x67, 0x89, 0xD9, 0x28, 0x83, 0x39, 0x01, 0xD8, 0xD6, 0x74, 0xC0, 0x8E, 0xA0, - 0x51, 0x57, 0x1B, 0x70, 0xC5, 0x05, 0x79, 0xCE, 0xC3, 0xC4, 0x3E, 0xDE, 0x5A, 0x8E, 0x7E, 0xF7, - 0x97, 0x64, 0x07, 0x73, 0x3A, 0x11, 0xC7, 0x09, 0xB2, 0xE7, 0x0C, 0xB3, 0xC1, 0x7F, 0xB8, 0xF8, - 0x68, 0xE7, 0x0E, 0x12, 0xBC, 0x02, 0x20, 0x16, 0x3D, 0xFE, 0x1B, 0xF7, 0x7C, 0xE0, 0xD0, 0xD3, - 0x39, 0xC2, 0x7D, 0xB3, 0xD1, 0x94, 0x2C, 0x01, 0x11, 0x61, 0x62, 0x8C, 0x71, 0xAF, 0x03, 0xDB, - 0xF7, 0x95, 0xBB, 0xFD, 0xFC, 0xB5, 0xD7, 0x4B, 0xCC, 0x2D, 0x31, 0x0A, 0x9B, 0x33, 0x8C, 0x40, - 0xB6, 0xE3, 0x9B, 0x8B, 0xD3, 0xE9, 0xBD, 0x9F, 0x0A, 0x84, 0x3C, 0xB6, 0x42, 0x1E, 0x00, 0x2E, - 0x0E, 0xD9, 0xC5, 0x29, 0x1C, 0xAC, 0xF0, 0x4F, 0x71, 0x0C, 0xDD, 0x01, 0xA1, 0xC9, 0xB4, 0x01, - 0xD3, 0xFD, 0xCB, 0xCB, 0x2F, 0xD3, 0xC7, 0xB9, 0xBC, 0x1C, 0x1E, 0x4C, 0x74, 0x93, 0x81, 0x0A, - 0x77, 0x0C, 0x0E, 0x32, 0xF3, 0xA5, 0x16, 0x4C, 0xEF, 0x67, 0x07, 0x96, 0xFF, 0xA1, 0xD9, 0xFE, - 0xB0, 0xF3, 0xFE, 0x83, 0x9C, 0xE1, 0x96, 0x6A, 0xB7, 0xB3, 0x80, 0x5C, 0x6F, 0x35, 0x77, 0x1B, - 0xAD, 0xFD, 0xDD, 0xE6, 0xEE, 0xFB, 0xBD, 0x56, 0xC1, 0x8E, 0x8F, 0xAC, 0x19, 0xF3, 0x6D, 0xED, - 0xEE, 0xC1, 0x8C, 0xF7, 0xA3, 0xC9, 0xB2, 0xCD, 0xA3, 0xEE, 0xC9, 0xBB, 0x49, 0x78, 0x2A, 0xA1, - 0x4D, 0x02, 0xD6, 0x67, 0x27, 0x67, 0xE7, 0xD3, 0x07, 0xC5, 0x6F, 0xE7, 0x41, 0x9B, 0xEB, 0xBC, - 0xFF, 0xCB, 0x2C, 0x80, 0xB4, 0xF7, 0x9B, 0xED, 0xE6, 0x5E, 0x63, 0x77, 0x6F, 0x5F, 0x11, 0x1E, - 0xD8, 0xE3, 0xAF, 0x33, 0x7A, 0xDC, 0x79, 0xDF, 0xDA, 0xDB, 0x6F, 0xEE, 0x34, 0x76, 0x9A, 0x9D, - 0x02, 0x3D, 0xFE, 0x36, 0x0B, 0x17, 0xF6, 0xF7, 0xF6, 0xF6, 0x76, 0x1B, 0x3B, 0xFB, 0x3B, 0xD9, - 0xA3, 0x78, 0x1E, 0x60, 0x93, 0x0C, 0x2D, 0xF7, 0xEF, 0xA1, 0x17, 0xF1, 0x8D, 0x51, 0x50, 0x6F, - 0x66, 0x45, 0x99, 0x49, 0x66, 0x47, 0xA7, 0xC8, 0x04, 0x37, 0xFA, 0x87, 0x7A, 0x9D, 0xD5, 0xA3, - 0x7F, 0x0C, 0xCE, 0xEB, 0x3E, 0x08, 0x31, 0xEC, 0xC4, 0xB1, 0xFB, 0xE6, 0x20, 0xF1, 0x45, 0xBD, - 0x7E, 0x38, 0xC9, 0xC5, 0xE4, 0xF0, 0x06, 0x28, 0x65, 0xA0, 0x11, 0x0D, 0x34, 0xB7, 0xDE, 0xCE, - 0x61, 0x5C, 0x1F, 0x85, 0xD6, 0x11, 0x8B, 0x53, 0x81, 0xCD, 0xE0, 0xFF, 0xBA, 0xEB, 0x99, 0x30, - 0xB9, 0x47, 0x36, 0xD6, 0x94, 0x05, 0xE3, 0x75, 0xC5, 0x14, 0xC4, 0x0C, 0x6A, 0x2C, 0x78, 0x74, - 0x61, 0x19, 0xA2, 0x8B, 0x1A, 0x83, 0xF3, 0x4A, 0xAB, 0x8B, 0x16, 0x74, 0x88, 0x58, 0x9A, 0xEB, - 0xF3, 0x5A, 0xEE, 0x1E, 0x89, 0x57, 0x49, 0xA7, 0xFE, 0x54, 0xFB, 0xC7, 0xE8, 0xDD, 0x6E, 0xBA, - 0x77, 0xCD, 0x33, 0xB5, 0x3A, 0xFF, 0x01, 0x1B, 0x60, 0x70, 0x3C, 0x4D, 0x35, 0x0B, 0xBA, 0x13, - 0x4F, 0xF1, 0xE0, 0xF0, 0x1C, 0xCB, 0x1F, 0x8F, 0x93, 0x6E, 0x7B, 0x98, 0x3B, 0x6A, 0x1A, 0x80, - 0xA1, 0xA7, 0x91, 0xDE, 0xFF, 0xD1, 0x4C, 0x2D, 0x0D, 0x55, 0xF6, 0xF1, 0x51, 0x48, 0x0A, 0x3C, - 0xEA, 0xF2, 0xEC, 0xD6, 0x64, 0x19, 0x1D, 0x1F, 0xCF, 0x38, 0x33, 0x0F, 0x67, 0x04, 0x40, 0x72, - 0x31, 0x66, 0xDA, 0x36, 0x45, 0xCB, 0x60, 0xA3, 0x5B, 0xD8, 0x27, 0x49, 0xAE, 0x6A, 0x2B, 0x4B, - 0x75, 0xA3, 0x79, 0x06, 0xC3, 0x1F, 0x75, 0x94, 0xB6, 0xB3, 0xF8, 0x94, 0xD7, 0xA2, 0xEF, 0x78, - 0x23, 0xA9, 0xB7, 0x03, 0xA6, 0xB6, 0xA7, 0x40, 0x2E, 0x01, 0xBD, 0x83, 0xA9, 0x2F, 0x08, 0xC2, - 0x93, 0xFD, 0x06, 0x81, 0x44, 0x88, 0x5B, 0xBF, 0x0E, 0x64, 0xA7, 0xF3, 0x11, 0x99, 0xC3, 0x84, - 0xF4, 0x3E, 0xB5, 0x0B, 0xD2, 0xFD, 0xD1, 0xC6, 0x06, 0x82, 0x05, 0xB7, 0xB8, 0x1E, 0x30, 0x8D, - 0xC9, 0x8D, 0x61, 0x80, 0x06, 0xA0, 0x73, 0x73, 0x9B, 0x41, 0xFF, 0x70, 0x40, 0x33, 0x29, 0xA7, - 0x82, 0x22, 0xEE, 0xC0, 0x73, 0x2D, 0x88, 0x5E, 0x6C, 0xB0, 0xA3, 0x40, 0xC8, 0x78, 0x5B, 0x49, - 0x99, 0xE9, 0xC1, 0x84, 0xE3, 0x3B, 0x04, 0x08, 0xFB, 0xD4, 0x31, 0x37, 0xC6, 0xEF, 0x47, 0x78, - 0xA1, 0x0F, 0x35, 0x7B, 0xC0, 0x7D, 0x86, 0xE2, 0x97, 0xAF, 0xDD, 0xC3, 0x2B, 0x0F, 0x34, 0x1E, - 0x28, 0xB3, 0xFD, 0x3E, 0x47, 0x33, 0x50, 0x3C, 0x19, 0x90, 0xC0, 0xE2, 0x7E, 0x40, 0xE9, 0xA6, - 0xF7, 0x36, 0x7A, 0xD0, 0x26, 0x8D, 0x5C, 0x1B, 0xF8, 0xA2, 0x0B, 0x93, 0xF1, 0xB9, 0xD1, 0x98, - 0x01, 0xDB, 0x09, 0xF0, 0x11, 0xAA, 0x99, 0x76, 0xDF, 0xA9, 0xEB, 0xA6, 0xA7, 0xC3, 0x80, 0x01, - 0xFF, 0x11, 0xC4, 0x64, 0x39, 0xF2, 0x71, 0xA7, 0xA6, 0x31, 0xAD, 0x0C, 0xF3, 0xCA, 0x47, 0x81, - 0x0C, 0xC3, 0x52, 0x40, 0x0F, 0x94, 0xA2, 0x0E, 0xE7, 0x6C, 0x7E, 0x3E, 0xAB, 0x4D, 0xE9, 0xB6, - 0x11, 0xA7, 0x9B, 0x09, 0x0A, 0xD3, 0x76, 0xC3, 0x40, 0xB2, 0x17, 0x4F, 0x33, 0x4C, 0xA7, 0x26, - 0x2D, 0xAD, 0x12, 0xFE, 0xD7, 0xE2, 0xD9, 0xBD, 0x06, 0x72, 0xC7, 0xA7, 0x5A, 0x73, 0x5E, 0x77, - 0x96, 0x76, 0xCB, 0xAD, 0x24, 0x95, 0x37, 0x49, 0x13, 0x3C, 0x94, 0x1B, 0x0F, 0x27, 0x36, 0xBD, - 0xF1, 0x24, 0x50, 0xBE, 0x08, 0x48, 0xB6, 0x0A, 0x43, 0xB2, 0x25, 0x20, 0xD9, 0x6A, 0x77, 0x76, - 0x76, 0xF7, 0xDE, 0xEF, 0x7F, 0x68, 0x8E, 0x3F, 0xBD, 0x41, 0x55, 0x42, 0xB5, 0x5D, 0x18, 0xAA, - 0x6D, 0x01, 0xD5, 0x37, 0x08, 0x4A, 0x08, 0x76, 0x0A, 0x43, 0xB0, 0xF3, 0x06, 0xC1, 0x14, 0x04, - 0x77, 0x0A, 0x43, 0x70, 0xE7, 0x0D, 0x82, 0x29, 0x08, 0xEE, 0x16, 0x86, 0xE0, 0xEE, 0x1B, 0x04, - 0x53, 0x10, 0xDC, 0x2B, 0x0C, 0xC1, 0xBD, 0x37, 0x08, 0xA6, 0x20, 0xF8, 0xBE, 0x30, 0x04, 0xDF, - 0x57, 0x07, 0xC1, 0x0A, 0x41, 0x28, 0xA6, 0x09, 0xEF, 0xC7, 0xF3, 0x14, 0xA6, 0xF9, 0x48, 0x0D, - 0x4D, 0x5E, 0xB4, 0x48, 0x73, 0x64, 0x87, 0x3E, 0xEC, 0xD0, 0x4F, 0x1A, 0x88, 0xFA, 0x88, 0x65, - 0xB8, 0x99, 0x60, 0xC1, 0xCE, 0x0F, 0xE6, 0x83, 0x20, 0xAD, 0x8F, 0xE1, 0xA0, 0xFB, 0x34, 0xDC, - 0xFB, 0x22, 0x9B, 0x88, 0x82, 0x7A, 0x2D, 0x05, 0x11, 0xA9, 0xAC, 0xA6, 0x34, 0x68, 0xB1, 0x2B, - 0xB3, 0x7B, 0x75, 0xB3, 0x0D, 0xE8, 0x82, 0x2F, 0xEE, 0x3B, 0x71, 0xE9, 0x87, 0xFB, 0xEB, 0xCE, - 0xDA, 0xDB, 0xA9, 0x14, 0x30, 0x39, 0xD0, 0x09, 0x29, 0x41, 0x57, 0xA0, 0xB2, 0xA0, 0x81, 0x35, - 0x3D, 0x98, 0xBC, 0xEA, 0x9B, 0x31, 0x5C, 0xF5, 0xA8, 0x32, 0x69, 0x2F, 0x91, 0x77, 0xBD, 0xBB, - 0x0A, 0xD4, 0x25, 0xAD, 0x1B, 0x69, 0x3B, 0x05, 0x5D, 0xE2, 0x04, 0x36, 0xDD, 0x17, 0x48, 0xEC, - 0xA9, 0x4D, 0x33, 0x80, 0xE4, 0x62, 0xE2, 0x6C, 0xFD, 0x95, 0x2E, 0x6C, 0xED, 0x13, 0xF4, 0x36, - 0x98, 0x18, 0x67, 0xF3, 0x5D, 0x4D, 0xDE, 0x53, 0xC8, 0x07, 0xF9, 0xC6, 0x82, 0x05, 0x69, 0xD6, - 0x09, 0xED, 0x5A, 0x4C, 0x22, 0xAB, 0x0A, 0xA3, 0x2A, 0xDD, 0xD7, 0xF4, 0xC0, 0x81, 0x95, 0x1B, - 0xBC, 0xAF, 0x85, 0x56, 0xE0, 0xCF, 0x53, 0x5B, 0x17, 0xA2, 0xBA, 0xCE, 0xE3, 0x48, 0xEA, 0x58, - 0xED, 0x25, 0xA0, 0x7F, 0xE5, 0x0F, 0x2A, 0x43, 0xE8, 0x3C, 0x7B, 0x4E, 0xCE, 0xAB, 0x19, 0x13, - 0x1E, 0x19, 0xE3, 0x97, 0x68, 0xBF, 0x1B, 0x05, 0xC0, 0x37, 0x93, 0x46, 0xBC, 0x8A, 0x2D, 0x76, - 0xB8, 0x9E, 0x52, 0xE6, 0xBA, 0x44, 0xC3, 0x7C, 0xB8, 0x27, 0x20, 0x95, 0x31, 0xD4, 0xE1, 0xED, - 0xC7, 0x33, 0x5B, 0xE9, 0xD2, 0x06, 0xBA, 0x99, 0x6B, 0x99, 0x6E, 0x9D, 0x63, 0x6E, 0x50, 0x6F, - 0xCD, 0x34, 0xD1, 0xD1, 0x55, 0x17, 0xD7, 0xFC, 0xD0, 0x23, 0x1A, 0xBF, 0xD6, 0x02, 0x7E, 0x81, - 0x27, 0xCD, 0x0C, 0x8A, 0xBC, 0x1A, 0xBF, 0xCE, 0xF0, 0xFD, 0x03, 0xA5, 0xD3, 0x6E, 0x36, 0x0B, - 0x9E, 0x72, 0x36, 0xB6, 0x89, 0x1F, 0xB6, 0xDA, 0x48, 0xD2, 0x1D, 0x36, 0x66, 0xE8, 0x2A, 0xFC, - 0x22, 0x71, 0xFE, 0x67, 0x16, 0xF8, 0xE5, 0xCF, 0xD4, 0x3D, 0x64, 0xF2, 0xA4, 0xBF, 0xB0, 0xE7, - 0x76, 0x8C, 0xFF, 0xBE, 0xFC, 0x79, 0xA0, 0xF4, 0x5E, 0x85, 0x4C, 0x35, 0xC3, 0x5C, 0x6F, 0x86, - 0x9C, 0xD9, 0xE1, 0xE8, 0x96, 0x7B, 0xCC, 0xE9, 0x33, 0xF2, 0xC7, 0x00, 0xFC, 0xF5, 0xD1, 0x50, - 0x68, 0x39, 0xBA, 0x40, 0xE6, 0xFF, 0xFA, 0xCF, 0xFF, 0xDD, 0x37, 0x7F, 0x70, 0xFF, 0xBF, 0xFE, - 0xF3, 0xFF, 0x30, 0x17, 0x5E, 0xF4, 0x39, 0xA0, 0xAD, 0xD1, 0x60, 0x47, 0xF6, 0x63, 0x30, 0x34, - 0xED, 0x01, 0xD3, 0x6E, 0x9D, 0x7B, 0xCE, 0x76, 0xBE, 0xFC, 0x09, 0x32, 0xE5, 0x23, 0x60, 0x0D, - 0x9A, 0x2E, 0xC7, 0xD7, 0x6C, 0xF0, 0xF2, 0x80, 0xFB, 0xD4, 0x13, 0xD0, 0xDB, 0x36, 0xF5, 0x3C, - 0x40, 0x17, 0x06, 0x74, 0xBC, 0xD1, 0x3D, 0x0E, 0x4B, 0xD3, 0x4D, 0xEE, 0x37, 0xD8, 0x57, 0x07, - 0x90, 0x80, 0xE1, 0x8C, 0x12, 0x80, 0x66, 0x1E, 0x5E, 0x2D, 0x9B, 0x3E, 0x79, 0x61, 0x79, 0xE4, - 0x7F, 0x85, 0xAC, 0xBF, 0x05, 0x83, 0x91, 0x25, 0xD3, 0xB4, 0xD9, 0x31, 0xDE, 0xEB, 0x8F, 0x1C, - 0x83, 0x37, 0xD8, 0xA9, 0x38, 0x09, 0x0E, 0x70, 0x32, 0x0D, 0x76, 0x69, 0x8E, 0x4C, 0x74, 0x9E, - 0x69, 0x34, 0x9B, 0xCD, 0x56, 0xBB, 0x4D, 0xED, 0x9A, 0xF0, 0x85, 0xC2, 0xB6, 0x2F, 0xF4, 0xB8, - 0x50, 0x3D, 0x36, 0xC6, 0xEF, 0xCD, 0x11, 0x07, 0x15, 0xCE, 0x98, 0x29, 0x94, 0x21, 0x84, 0xD4, - 0xDD, 0x32, 0x84, 0x91, 0x94, 0x24, 0x05, 0x0A, 0xE5, 0xCA, 0x92, 0x89, 0x6B, 0x82, 0x49, 0xFA, - 0x51, 0x18, 0xC6, 0xCD, 0x6F, 0x5A, 0x56, 0xC0, 0x9C, 0x27, 0xF9, 0x25, 0xC6, 0x4D, 0xDD, 0xA6, - 0x13, 0x80, 0xF0, 0x82, 0x0C, 0xD7, 0xD3, 0x84, 0x41, 0xF8, 0xE8, 0xD0, 0xF1, 0x3E, 0x6E, 0xC3, - 0x2F, 0x1A, 0x6F, 0x35, 0x58, 0x52, 0x8F, 0xEB, 0xB5, 0xC3, 0x1E, 0xD1, 0xA7, 0xCF, 0x6E, 0x79, - 0xF0, 0xC0, 0x81, 0x44, 0x12, 0xEF, 0xF8, 0x2B, 0xC6, 0x6F, 0x66, 0xCC, 0xB4, 0x01, 0x9C, 0x00, - 0xC8, 0x5E, 0x60, 0x99, 0x89, 0x3E, 0x8C, 0xC0, 0x06, 0x6C, 0x60, 0x02, 0x40, 0xEC, 0xD0, 0x34, - 0xC8, 0x63, 0x13, 0x78, 0xEF, 0x02, 0xAF, 0x02, 0xFF, 0xE9, 0x87, 0x96, 0xE0, 0x0F, 0x81, 0x76, - 0x47, 0x2C, 0x2A, 0xF5, 0x32, 0xBF, 0x47, 0x7F, 0xA9, 0x3E, 0x7F, 0x88, 0x67, 0xA0, 0xE9, 0x9E, - 0xE3, 0xC3, 0x2F, 0xE0, 0x4D, 0xF0, 0x36, 0xBC, 0x78, 0xCF, 0x1F, 0xD9, 0x66, 0x7B, 0xE7, 0x5F, - 0xD9, 0xD0, 0x09, 0x3D, 0xFF, 0x5D, 0x15, 0xDC, 0x29, 0x66, 0x47, 0x2D, 0x7C, 0x67, 0xBF, 0xF5, - 0x61, 0x2F, 0x1A, 0x1E, 0x38, 0x12, 0x81, 0x5C, 0x19, 0x9A, 0x09, 0xE7, 0xAD, 0x37, 0xA6, 0x54, - 0x29, 0x53, 0x22, 0x0A, 0x2A, 0xC9, 0x95, 0xA0, 0x6D, 0x05, 0x6C, 0xA9, 0xC4, 0xD7, 0x25, 0x55, - 0x59, 0xE1, 0x3A, 0xF3, 0x68, 0x6B, 0x23, 0x53, 0xBF, 0x02, 0x0C, 0xB5, 0x4E, 0x3D, 0xC7, 0x15, - 0x82, 0xA8, 0x92, 0x3D, 0x24, 0xD9, 0xB4, 0x96, 0xBB, 0x87, 0x7B, 0x13, 0x36, 0x90, 0x53, 0xD1, - 0x86, 0x51, 0xA3, 0x83, 0x25, 0xAB, 0x92, 0x47, 0xC6, 0xDF, 0x43, 0x3F, 0x88, 0x78, 0x49, 0xC0, - 0x3D, 0x5B, 0xB3, 0x98, 0x66, 0x0D, 0x1C, 0xCF, 0x0C, 0x86, 0x23, 0xA4, 0xCA, 0x91, 0x16, 0xE8, - 0x43, 0xFA, 0x1E, 0xD4, 0x03, 0xA1, 0x70, 0x6A, 0xAE, 0x0B, 0x0A, 0xB2, 0x10, 0x85, 0xB8, 0x7D, - 0x6F, 0x7A, 0x8E, 0x8D, 0x63, 0x4B, 0xFE, 0x24, 0xAF, 0x76, 0x99, 0x39, 0x02, 0xC5, 0xF4, 0x9E, - 0x8B, 0xBE, 0x3D, 0xAE, 0x73, 0x13, 0x38, 0xC2, 0x86, 0x2F, 0x86, 0x71, 0x41, 0xC2, 0x17, 0x1D, - 0x00, 0xE7, 0x4A, 0x32, 0x39, 0x79, 0x53, 0x1C, 0xE2, 0xCD, 0xAB, 0x73, 0x6F, 0x1A, 0x78, 0xA3, - 0x0B, 0xCC, 0xC2, 0x03, 0x56, 0xA6, 0xEB, 0x21, 0x31, 0x97, 0xC8, 0x5F, 0x16, 0x3D, 0xAB, 0x01, - 0xB7, 0x1B, 0xE8, 0xB4, 0x46, 0x23, 0x26, 0x07, 0xC2, 0xA9, 0x03, 0xAC, 0x42, 0xDB, 0x0F, 0xCD, - 0x00, 0x03, 0x31, 0x18, 0xC0, 0x28, 0x40, 0xB8, 0x13, 0xEB, 0xA1, 0xFD, 0xA2, 0x06, 0x03, 0x78, - 0xDB, 0x9E, 0xB6, 0x24, 0x64, 0x64, 0x96, 0x79, 0xC7, 0x2D, 0xF4, 0xA6, 0xC0, 0x7B, 0x69, 0x10, - 0xA5, 0x90, 0x85, 0x21, 0x57, 0x04, 0xE6, 0x08, 0x73, 0x8F, 0xC7, 0x03, 0x39, 0x10, 0x7B, 0x07, - 0xD1, 0x4D, 0x70, 0xDD, 0x78, 0x96, 0x62, 0xDE, 0xFA, 0xE3, 0xEA, 0xAA, 0xE2, 0xC5, 0x4D, 0x6B, - 0x12, 0x97, 0xE7, 0x5E, 0x8A, 0x0B, 0x37, 0x00, 0x61, 0x13, 0x4D, 0xD3, 0x46, 0x96, 0xD0, 0xD2, - 0x4C, 0xC9, 0x90, 0x64, 0x27, 0xB8, 0xD2, 0xDC, 0xF5, 0xD1, 0x30, 0xCB, 0xE4, 0x13, 0x6A, 0xDC, - 0x60, 0x64, 0xDA, 0x67, 0x16, 0xBF, 0x57, 0x65, 0x04, 0x57, 0x80, 0x58, 0xBD, 0xBF, 0x31, 0x6C, - 0x42, 0x88, 0xB8, 0x6C, 0x5E, 0x00, 0xE3, 0x63, 0x20, 0x13, 0xE3, 0xD1, 0x04, 0x10, 0xD3, 0x0D, - 0x8E, 0x8E, 0xFE, 0x3E, 0x91, 0x8B, 0x26, 0x14, 0x7B, 0x1F, 0x88, 0xD0, 0xB2, 0xCC, 0x80, 0x2C, - 0x4E, 0xB7, 0x1C, 0x85, 0x0B, 0x43, 0x10, 0x05, 0x28, 0x45, 0x8D, 0x57, 0x88, 0xE6, 0x8A, 0x47, - 0xAC, 0x3C, 0x5D, 0x25, 0x52, 0x28, 0xD9, 0x8F, 0xE5, 0xCB, 0x0B, 0xB0, 0x1D, 0x2F, 0x1A, 0xF1, - 0x4F, 0xBE, 0x7E, 0x2B, 0x82, 0xF7, 0x27, 0xDB, 0x5F, 0x9B, 0xCF, 0x85, 0xEF, 0x63, 0x7C, 0x46, - 0xD7, 0x24, 0xCD, 0x12, 0x61, 0x03, 0xB9, 0xC8, 0x3D, 0x56, 0xA7, 0xF7, 0x8C, 0x63, 0x10, 0x69, - 0x91, 0x2A, 0x7E, 0x3B, 0x3B, 0xAD, 0x9F, 0x7F, 0xE8, 0x12, 0xD3, 0x6F, 0x35, 0xE3, 0xC7, 0xDF, - 0xAF, 0x3E, 0xEC, 0x37, 0xDF, 0xA8, 0x61, 0x3E, 0x35, 0x20, 0xA6, 0xA8, 0x12, 0x03, 0xBC, 0xBB, - 0x1A, 0xB4, 0x80, 0xB6, 0xD9, 0xC8, 0x90, 0x68, 0xFB, 0x88, 0x3F, 0xC4, 0x31, 0x4F, 0x86, 0x5C, - 0xBF, 0x3B, 0x76, 0x7E, 0x70, 0x5F, 0x91, 0x52, 0xC8, 0x1E, 0x9A, 0xEC, 0x01, 0x1A, 0xA6, 0xFF, - 0x56, 0xB8, 0xFA, 0xAA, 0xD4, 0x75, 0xEF, 0x26, 0x29, 0x44, 0x81, 0xF8, 0xA3, 0x6B, 0x2E, 0x89, - 0x4F, 0x20, 0xEB, 0xC0, 0x52, 0x65, 0x44, 0x25, 0xC8, 0x43, 0xE2, 0x1D, 0x14, 0xBB, 0x04, 0xD5, - 0xC0, 0x11, 0xE1, 0x39, 0x20, 0x5C, 0x01, 0x75, 0x98, 0xAE, 0xC5, 0xC7, 0x54, 0x15, 0xAB, 0x92, - 0xF1, 0x57, 0x29, 0x90, 0x81, 0x5A, 0xDB, 0x73, 0x46, 0x3C, 0x29, 0x81, 0xF9, 0xCC, 0x30, 0xF5, - 0x00, 0x45, 0x3D, 0x14, 0xD0, 0x6C, 0x0E, 0x14, 0x88, 0x6E, 0x82, 0xA1, 0x87, 0xD2, 0x22, 0x4C, - 0x83, 0x7B, 0x18, 0x78, 0x90, 0xEE, 0x86, 0xE6, 0xE3, 0xE2, 0x27, 0x24, 0x52, 0x21, 0x11, 0x08, - 0x35, 0x57, 0x08, 0x78, 0xE9, 0x97, 0xC9, 0x9F, 0x50, 0x98, 0xE5, 0xB2, 0x42, 0x23, 0x2C, 0x06, - 0xA5, 0xCD, 0x60, 0xE8, 0xF8, 0x3C, 0x5E, 0x1A, 0x88, 0xAB, 0xD0, 0x49, 0x24, 0x64, 0x8E, 0xC4, - 0x52, 0x6F, 0x39, 0xFE, 0x4D, 0x0C, 0xC2, 0x08, 0x3D, 0xFC, 0x1C, 0xCB, 0x7C, 0xBA, 0x66, 0xE9, - 0x61, 0xBC, 0xBE, 0x98, 0x69, 0x7C, 0xEE, 0xF6, 0xB6, 0x58, 0xEF, 0xF8, 0x08, 0x7E, 0x7E, 0xBE, - 0xFC, 0xF6, 0xF5, 0xA8, 0x07, 0x1F, 0x8E, 0xB9, 0x79, 0xEA, 0x84, 0x5B, 0xC4, 0x3E, 0x3E, 0x6B, - 0x96, 0x69, 0x71, 0x67, 0xA5, 0x9C, 0x0D, 0x53, 0x06, 0xED, 0x3C, 0x74, 0x2D, 0x7D, 0xC7, 0x53, - 0xE6, 0x94, 0x49, 0xB0, 0x83, 0xC9, 0xB9, 0x3C, 0x07, 0x6B, 0xC0, 0x99, 0x04, 0xA6, 0x45, 0x61, - 0x4D, 0xDC, 0xF6, 0x69, 0x22, 0x52, 0x1F, 0xF1, 0x6B, 0x05, 0x16, 0xAF, 0x23, 0xE7, 0x10, 0x6C, - 0x45, 0xD9, 0xDE, 0x35, 0xD1, 0x5E, 0x9E, 0xA8, 0x82, 0xB5, 0x70, 0x1B, 0xE9, 0xF6, 0x26, 0x33, - 0xB7, 0xDA, 0xE1, 0x19, 0x3D, 0x67, 0xF8, 0x05, 0x4B, 0x7E, 0xA3, 0x66, 0xBE, 0x10, 0xDC, 0x7D, - 0x72, 0x64, 0x7A, 0x1E, 0x5D, 0x51, 0xD1, 0xA3, 0x5B, 0xE7, 0x47, 0xEC, 0xFA, 0x20, 0x58, 0xE5, - 0x94, 0x19, 0x8D, 0x2F, 0x5C, 0xB3, 0x80, 0x24, 0x4E, 0x8A, 0xD7, 0xAE, 0x4B, 0x96, 0x0C, 0xBE, - 0x23, 0x5F, 0x40, 0xF8, 0xE8, 0x89, 0xC9, 0x24, 0xE8, 0x58, 0x80, 0xD0, 0x58, 0xF5, 0xDB, 0xD5, - 0xF9, 0xF4, 0xEC, 0x3A, 0x16, 0xBF, 0xE4, 0xF6, 0x20, 0x18, 0xCE, 0xBC, 0xCF, 0x7B, 0x32, 0xC9, - 0x66, 0x8F, 0x3D, 0x04, 0x6E, 0x37, 0x1E, 0x5B, 0xCD, 0x66, 0xAA, 0x26, 0x4C, 0x62, 0xAF, 0x4C, - 0x74, 0xCB, 0x36, 0x47, 0xEF, 0x9E, 0xDB, 0xBA, 0x4B, 0xD3, 0xB1, 0xC4, 0x74, 0xC8, 0xE2, 0x30, - 0x03, 0xAB, 0x5A, 0x8D, 0xFD, 0xD1, 0x8B, 0xBC, 0x88, 0x79, 0x92, 0x3C, 0x59, 0x4E, 0xAE, 0xCC, - 0x20, 0x98, 0xE2, 0x10, 0x6E, 0x4E, 0xDB, 0xA7, 0xD8, 0x2F, 0x55, 0x0D, 0xBE, 0xCB, 0x31, 0x73, - 0x2A, 0x1D, 0x31, 0x05, 0x8E, 0x96, 0xAF, 0x81, 0x67, 0xBA, 0xC0, 0xB9, 0x31, 0x90, 0x3A, 0x3A, - 0x55, 0xBE, 0xDE, 0x5C, 0x5F, 0x74, 0x99, 0x78, 0x38, 0x5F, 0x70, 0x7D, 0xFA, 0x61, 0x92, 0x9A, - 0xC3, 0x92, 0x24, 0x64, 0x3A, 0x1D, 0xD0, 0xD2, 0x29, 0x16, 0xAB, 0xD3, 0xE8, 0x28, 0x3A, 0xA2, - 0xC5, 0x0A, 0x83, 0x85, 0x01, 0xAF, 0x41, 0x4A, 0x16, 0x89, 0x49, 0x70, 0x24, 0x21, 0x2E, 0x6A, - 0x20, 0x15, 0xFA, 0x24, 0x42, 0xFA, 0xDC, 0xC3, 0xA8, 0x96, 0x06, 0xFB, 0xD5, 0x09, 0xBD, 0x28, - 0xC4, 0x65, 0x14, 0xFA, 0x01, 0x2A, 0x9C, 0x0F, 0x26, 0x5E, 0x21, 0x8B, 0x68, 0x5C, 0x0F, 0xBD, - 0xB9, 0x98, 0x16, 0x30, 0xBC, 0x6F, 0x0B, 0xCC, 0x11, 0x4F, 0x0A, 0x93, 0xA7, 0xA6, 0xAF, 0x74, - 0x0A, 0xAD, 0x56, 0x68, 0x0A, 0x6E, 0x9D, 0x3D, 0xDE, 0xB4, 0xC8, 0xFF, 0x24, 0x37, 0x92, 0x6A, - 0x11, 0xB2, 0x63, 0xE2, 0x10, 0x4A, 0x4E, 0x03, 0x76, 0x86, 0x7B, 0x5F, 0x1C, 0x5F, 0x81, 0xC3, - 0xCF, 0x75, 0x73, 0xDC, 0x9D, 0x38, 0x94, 0x44, 0xF7, 0x73, 0x7B, 0xC6, 0xF1, 0x0F, 0xD4, 0xC4, - 0xB0, 0x69, 0xDE, 0x8E, 0x7B, 0x45, 0xAF, 0x84, 0xE6, 0x78, 0x3C, 0xE6, 0xC3, 0x48, 0xF9, 0x3A, - 0x28, 0xB7, 0xF9, 0xE2, 0x6F, 0x84, 0x96, 0x8C, 0x37, 0xDD, 0x54, 0xF6, 0xA8, 0xE5, 0xE3, 0x0D, - 0x8E, 0xBF, 0x6C, 0xBC, 0x99, 0x7B, 0x02, 0xE7, 0x43, 0xA9, 0x3C, 0xE6, 0x60, 0xF3, 0x17, 0x87, - 0x39, 0x70, 0x94, 0x78, 0xCF, 0x89, 0x39, 0x38, 0xFE, 0xAA, 0x73, 0x1C, 0x82, 0x51, 0x79, 0xBC, - 0xC1, 0xE6, 0x2F, 0x12, 0x6F, 0xBA, 0x3F, 0x3F, 0x09, 0x73, 0xA6, 0x29, 0x50, 0x05, 0x30, 0x87, - 0x75, 0x7F, 0x2E, 0x8D, 0x3C, 0xEF, 0x05, 0xE2, 0x2E, 0x03, 0x79, 0x00, 0x50, 0x4F, 0x43, 0x9F, - 0xEE, 0xCF, 0x2F, 0x08, 0x81, 0xAE, 0x9C, 0xD0, 0x06, 0xF5, 0xC6, 0xB4, 0x83, 0x5A, 0x19, 0xC6, - 0x42, 0xCD, 0x15, 0x4E, 0x24, 0xE8, 0x7F, 0x75, 0x19, 0x4B, 0x02, 0x06, 0x65, 0x30, 0x63, 0xDC, - 0xFC, 0x45, 0xE2, 0xC5, 0x82, 0x18, 0x4B, 0x01, 0xCC, 0x99, 0xFF, 0xD6, 0x0A, 0x33, 0x9E, 0x14, - 0x20, 0x9F, 0x86, 0x5E, 0xAB, 0xC5, 0x78, 0x62, 0xFB, 0x41, 0x2B, 0x15, 0x59, 0xA3, 0x86, 0x6E, - 0xB3, 0x0D, 0x0A, 0x89, 0xD5, 0xDF, 0x60, 0xF6, 0xC8, 0x91, 0x19, 0x7C, 0xFE, 0x7C, 0x54, 0x3B, - 0x8C, 0xFE, 0x60, 0xF0, 0x17, 0x6A, 0xD8, 0x82, 0x27, 0x2F, 0xDE, 0x52, 0x3D, 0x65, 0x3E, 0x73, - 0x37, 0x33, 0xB4, 0xA9, 0x43, 0x6E, 0x2C, 0xDB, 0x62, 0x4D, 0x57, 0x68, 0x3A, 0x41, 0x07, 0x73, - 0xBC, 0xFD, 0x11, 0x9A, 0xE8, 0x31, 0x05, 0x9F, 0x06, 0xA1, 0xA5, 0x79, 0xE3, 0x8B, 0x29, 0x99, - 0x98, 0x8C, 0x0C, 0x12, 0x74, 0xF3, 0x85, 0x6E, 0x9A, 0x6C, 0x13, 0xC1, 0x3B, 0x12, 0x51, 0x63, - 0xEF, 0x98, 0x2F, 0x53, 0x72, 0xE0, 0xF7, 0xA2, 0x4B, 0xF8, 0x65, 0x33, 0x2D, 0x0C, 0x9C, 0x11, - 0xE6, 0x35, 0xD5, 0x2C, 0xEB, 0x51, 0x46, 0x1F, 0xC9, 0x0B, 0x3A, 0xCD, 0xE3, 0x7E, 0xC0, 0xB4, - 0x7B, 0xCD, 0xA4, 0x9C, 0xB7, 0x59, 0xFB, 0x47, 0x8E, 0xD1, 0x62, 0x0D, 0xE3, 0x92, 0x94, 0x4C, - 0x1B, 0x12, 0x88, 0xE8, 0xFB, 0x78, 0x2C, 0xE2, 0x74, 0x66, 0x8C, 0x25, 0xC3, 0x7F, 0xE2, 0xEB, - 0x8F, 0x01, 0x0F, 0x64, 0xE8, 0xDE, 0xA5, 0xE9, 0x07, 0x9B, 0xEF, 0x26, 0x02, 0xDB, 0x46, 0x06, - 0xFD, 0x92, 0x19, 0x45, 0xA7, 0x06, 0x0A, 0xCD, 0x36, 0x62, 0x29, 0x04, 0x11, 0xCD, 0x0D, 0x18, - 0xC2, 0x60, 0xAC, 0x99, 0xA3, 0x94, 0x8C, 0x27, 0xC2, 0x7E, 0x67, 0x6F, 0xA0, 0x04, 0x10, 0xC5, - 0xC7, 0xF8, 0xC9, 0xA8, 0x22, 0x68, 0xFA, 0xF4, 0xC0, 0xA2, 0xF1, 0x5E, 0xCF, 0x8B, 0xEC, 0xAB, - 0xD6, 0xA4, 0xF8, 0xF5, 0xEA, 0xEC, 0x88, 0x6E, 0x80, 0xAF, 0x8F, 0x7E, 0xFE, 0x85, 0x52, 0xD8, - 0x20, 0x61, 0x05, 0x0F, 0x0E, 0x1B, 0x39, 0x3E, 0x5D, 0x18, 0x8C, 0x1C, 0x9B, 0x2E, 0xDD, 0x31, - 0x53, 0x35, 0xDE, 0x87, 0xC3, 0x2E, 0xFA, 0xC2, 0x77, 0x52, 0xC0, 0xE3, 0x36, 0x0C, 0xD2, 0x57, - 0xD9, 0x7E, 0xE8, 0xE2, 0xBB, 0xBE, 0x70, 0x9E, 0x04, 0x82, 0xB6, 0xD9, 0xFB, 0x66, 0x22, 0x19, - 0x8E, 0x6C, 0xE8, 0x37, 0xD8, 0x99, 0xA6, 0x0F, 0xE3, 0x7E, 0x84, 0xFB, 0xB6, 0x60, 0x9D, 0x72, - 0xA3, 0xD8, 0xC3, 0xD0, 0x1C, 0xBF, 0x21, 0x32, 0xEC, 0x18, 0x92, 0x8E, 0xD9, 0x66, 0xF3, 0x1D, - 0x4D, 0x7C, 0xE8, 0x3C, 0xC0, 0x74, 0x02, 0xF4, 0xF6, 0x26, 0x87, 0x70, 0xD1, 0x1B, 0x25, 0x9C, - 0x94, 0x53, 0xDE, 0x6C, 0xB1, 0x4F, 0x80, 0xEB, 0xE3, 0x2F, 0xE3, 0x6F, 0x30, 0x84, 0xA6, 0x85, - 0xFE, 0x35, 0x5B, 0x6C, 0x57, 0xBE, 0x23, 0xBE, 0x93, 0x6E, 0xE9, 0xBB, 0x8C, 0xA2, 0x6D, 0xDE, - 0x25, 0xF8, 0x08, 0x01, 0x0C, 0xB8, 0xD6, 0x16, 0xFB, 0xDC, 0xA3, 0x1F, 0x37, 0xF8, 0xE3, 0x6F, - 0xE2, 0x1A, 0xFD, 0xFA, 0xEA, 0x44, 0x86, 0xBA, 0xF8, 0x07, 0xAC, 0x89, 0xE7, 0x46, 0xBB, 0xB9, - 0x96, 0x09, 0x7C, 0xE6, 0x85, 0xAC, 0xCD, 0x26, 0x97, 0x19, 0xB9, 0xA5, 0x72, 0x92, 0x98, 0xED, - 0xE6, 0xE4, 0x30, 0xCB, 0xED, 0xB1, 0x6C, 0x3C, 0x6F, 0x92, 0xE5, 0x4D, 0xC6, 0xF4, 0xDA, 0x23, - 0xAE, 0xC9, 0xDD, 0xF5, 0xA7, 0x05, 0xF4, 0xAA, 0xDD, 0xBE, 0xC5, 0xEC, 0x94, 0xA2, 0x47, 0x6F, - 0x9C, 0x1E, 0x85, 0x2E, 0x98, 0xF6, 0x20, 0xEA, 0x7E, 0x1C, 0xC7, 0x0B, 0x98, 0x11, 0x7F, 0x1B, - 0xE1, 0x96, 0xAF, 0x18, 0xD5, 0xAB, 0xE8, 0xC7, 0xBF, 0x18, 0x68, 0xC9, 0x78, 0xB1, 0xC5, 0x00, - 0xEC, 0x32, 0xDD, 0x79, 0x0A, 0x5C, 0xF2, 0xBB, 0x72, 0xC0, 0x52, 0x40, 0xAE, 0xC4, 0x19, 0x8A, - 0x67, 0x60, 0x6D, 0xC1, 0x17, 0x67, 0x0A, 0x8F, 0x73, 0xE7, 0x9E, 0x89, 0x0C, 0xA6, 0x88, 0x96, - 0xE7, 0x8C, 0x0C, 0x16, 0xA9, 0x8D, 0xFD, 0x45, 0xE5, 0xF6, 0x3B, 0x4E, 0x74, 0x5D, 0xE8, 0x64, - 0x4F, 0x34, 0x9C, 0xB2, 0x0F, 0x08, 0xC8, 0x9C, 0x2C, 0xBD, 0xB5, 0xC3, 0x09, 0xF0, 0x45, 0xFF, - 0x12, 0xC0, 0xCE, 0x04, 0x17, 0x13, 0x04, 0x56, 0x29, 0xB8, 0x78, 0xE6, 0xF2, 0x4B, 0xA6, 0xFE, - 0xC3, 0xFE, 0x45, 0x34, 0xD6, 0x85, 0x2D, 0xF2, 0x8B, 0xCC, 0xBD, 0x60, 0x4D, 0x25, 0x28, 0x89, - 0x00, 0x75, 0x03, 0x0F, 0x7B, 0xB2, 0x9F, 0x28, 0x6D, 0x49, 0xF4, 0x3C, 0xAD, 0xE8, 0xCA, 0x86, - 0x73, 0x35, 0x9B, 0xA4, 0x61, 0x61, 0x62, 0x84, 0x43, 0xF1, 0xA9, 0x7E, 0x61, 0x2F, 0xD9, 0x9F, - 0xF1, 0x42, 0x44, 0xC6, 0xB9, 0x20, 0x18, 0x99, 0x80, 0x38, 0x71, 0x0C, 0x2F, 0xC8, 0x4E, 0x1A, - 0xC3, 0x69, 0x32, 0x5F, 0x46, 0xA2, 0x50, 0x62, 0xE6, 0x80, 0xDD, 0xD9, 0x54, 0x02, 0x22, 0xA0, - 0xD0, 0xDD, 0x5B, 0xCE, 0x9C, 0x5B, 0x4A, 0x73, 0x0C, 0xA2, 0xF7, 0x23, 0x06, 0xFE, 0xFA, 0xD1, - 0x81, 0x81, 0xC1, 0xBF, 0xD8, 0x73, 0xD4, 0x63, 0x83, 0x42, 0xE1, 0xA8, 0x47, 0xE8, 0x09, 0x25, - 0x16, 0x72, 0x1C, 0x46, 0x69, 0x86, 0x26, 0x2E, 0x22, 0x5B, 0xB4, 0x3B, 0x94, 0xA0, 0x5C, 0xD7, - 0x73, 0x7E, 0x00, 0x2D, 0x07, 0x18, 0x59, 0xB2, 0xD7, 0x8C, 0x83, 0xEE, 0x1E, 0x40, 0xE8, 0x19, - 0x8A, 0xB0, 0x12, 0xCD, 0x88, 0xF2, 0x23, 0x8A, 0x09, 0xE0, 0x6C, 0x51, 0xCB, 0xEA, 0xC3, 0xCC, - 0xE2, 0x45, 0xE0, 0x68, 0x06, 0x73, 0xEC, 0x6C, 0xF0, 0x5F, 0x14, 0x2B, 0x38, 0xE2, 0xC1, 0xD0, - 0x31, 0x18, 0x08, 0x78, 0x26, 0xC7, 0x50, 0x9C, 0xFF, 0xE8, 0x34, 0xF5, 0x51, 0x4E, 0x24, 0x0D, - 0x4A, 0x8F, 0xA8, 0xE3, 0xDD, 0x03, 0x77, 0x69, 0xB0, 0x0B, 0x5B, 0x87, 0xF1, 0xFD, 0x28, 0xA4, - 0x26, 0xF2, 0x93, 0xFE, 0x76, 0x8B, 0x17, 0xD7, 0x62, 0xE0, 0x1B, 0x73, 0xC4, 0xA3, 0xE0, 0xE5, - 0x6B, 0xA1, 0x6E, 0x1A, 0x18, 0xBF, 0x6E, 0x33, 0x4C, 0x2A, 0x9C, 0x70, 0xB2, 0x34, 0x45, 0x5F, - 0x3C, 0x0E, 0x83, 0xA1, 0xB1, 0x48, 0x98, 0xC5, 0x08, 0x1D, 0x98, 0x82, 0x89, 0x91, 0x43, 0xC7, - 0x1C, 0xF3, 0xB2, 0x8F, 0x5F, 0x32, 0xFD, 0x68, 0xD2, 0x06, 0xDD, 0x88, 0x53, 0x14, 0x62, 0x1D, - 0x5E, 0x19, 0xC5, 0xB1, 0xD2, 0x32, 0xC8, 0x86, 0xD2, 0x3A, 0x62, 0x1E, 0x08, 0xCA, 0x69, 0x3E, - 0xF6, 0xCF, 0x6E, 0x8A, 0x50, 0xA2, 0xDD, 0x46, 0x73, 0x34, 0x16, 0x06, 0xF7, 0x48, 0x1A, 0xFC, - 0xD0, 0x6C, 0xFA, 0x5B, 0xAC, 0xD5, 0xA0, 0x3F, 0xE8, 0x85, 0xB5, 0xBB, 0x42, 0x8F, 0x38, 0xC0, - 0x73, 0xDE, 0x9F, 0x3B, 0x63, 0x7C, 0x90, 0x01, 0xB6, 0x33, 0x2D, 0xCA, 0xAD, 0x76, 0x9E, 0xE7, - 0x3F, 0x62, 0xD6, 0xFC, 0x8C, 0x2C, 0x09, 0xCC, 0x43, 0x37, 0x08, 0xB6, 0xE9, 0xBF, 0x2B, 0x6D, - 0x00, 0x4C, 0xC5, 0x52, 0x2A, 0xC4, 0x17, 0x15, 0xBF, 0xFA, 0xCC, 0x01, 0x8C, 0xB2, 0x1D, 0x70, - 0xB2, 0xED, 0xBA, 0xDB, 0x98, 0x13, 0x2B, 0xEA, 0x4A, 0x7E, 0x73, 0x14, 0x85, 0xC4, 0x3D, 0xC5, - 0xCE, 0x9C, 0x83, 0x4F, 0x11, 0x27, 0x9A, 0xDB, 0x2D, 0x71, 0xAA, 0xCE, 0x29, 0xEB, 0x05, 0xC0, - 0x23, 0xF0, 0xEC, 0x8D, 0xB9, 0xD6, 0xDC, 0xA6, 0xE8, 0x54, 0x58, 0x1E, 0xF5, 0x08, 0xE9, 0x24, - 0xFE, 0xDD, 0xAA, 0xF9, 0xFA, 0x96, 0x45, 0xBD, 0x09, 0x60, 0x97, 0xC1, 0xC1, 0x6C, 0x27, 0x2B, - 0x1A, 0xCD, 0x2B, 0x0A, 0x36, 0xC0, 0x89, 0xFB, 0x54, 0x89, 0xE8, 0x1C, 0x3B, 0x99, 0x14, 0x87, - 0xE2, 0x0C, 0xAB, 0x39, 0x82, 0x51, 0x31, 0x81, 0x48, 0x0C, 0x70, 0x48, 0xBF, 0x52, 0xC7, 0x8A, - 0x28, 0x39, 0x72, 0xC8, 0x36, 0x4F, 0x86, 0x0E, 0x86, 0x1E, 0x60, 0x1E, 0x77, 0xE6, 0xCC, 0xBF, - 0x88, 0xFD, 0x2C, 0x33, 0xD1, 0xBF, 0x8B, 0xD2, 0x9D, 0x3F, 0x8B, 0x78, 0x95, 0x14, 0xAB, 0x82, - 0x84, 0x18, 0x14, 0x0B, 0x53, 0x28, 0x5D, 0x80, 0x30, 0x45, 0x65, 0x19, 0x84, 0x60, 0xC4, 0xE1, - 0x58, 0x87, 0x23, 0x5F, 0xAE, 0x33, 0x5E, 0x07, 0x4B, 0x64, 0xBA, 0x47, 0x51, 0x44, 0xB8, 0xDA, - 0x61, 0xCC, 0x6E, 0xDA, 0xBE, 0x25, 0xA4, 0x8B, 0xD1, 0x88, 0x1B, 0xA6, 0x10, 0xA3, 0x6E, 0xF9, - 0xC0, 0x8C, 0x62, 0x82, 0xC9, 0xCD, 0xEE, 0xFA, 0xE6, 0xE4, 0x6A, 0xD2, 0x14, 0x7D, 0x24, 0x45, - 0xB3, 0x58, 0xF6, 0x31, 0x7D, 0x21, 0x58, 0xC5, 0x72, 0x1E, 0xC9, 0x1B, 0xDD, 0x6E, 0x97, 0x6D, - 0xBA, 0xA2, 0x42, 0x8A, 0xCF, 0x41, 0x0A, 0x0C, 0x3D, 0x16, 0x84, 0x81, 0x03, 0x7A, 0x8E, 0xF5, - 0x8E, 0xB2, 0x46, 0xE3, 0x5B, 0x19, 0xF9, 0x83, 0x69, 0x03, 0xE8, 0x02, 0x4D, 0xE1, 0x30, 0x4F, - 0xB2, 0xB3, 0xE9, 0xB1, 0x78, 0x99, 0x90, 0x4D, 0xA2, 0xB2, 0x1B, 0x1B, 0xFE, 0x18, 0x6E, 0x98, - 0x17, 0xC1, 0x09, 0x2D, 0x83, 0x7B, 0x5B, 0xA0, 0xDC, 0x58, 0x0E, 0xE0, 0x96, 0xB3, 0x7E, 0x62, - 0x09, 0x81, 0xB6, 0x02, 0x99, 0x44, 0x21, 0x0E, 0x62, 0x1A, 0x25, 0xD3, 0x14, 0x84, 0xE2, 0x15, - 0xE1, 0x11, 0xD2, 0x9D, 0x28, 0x9A, 0x20, 0xB3, 0x33, 0xCA, 0xAD, 0x4F, 0xD1, 0x76, 0x53, 0xF9, - 0x30, 0x1A, 0xD3, 0x7E, 0x89, 0x7B, 0x30, 0x62, 0x06, 0xB3, 0xE6, 0x48, 0x05, 0x1C, 0xD8, 0xF8, - 0x0B, 0x3F, 0x22, 0xE8, 0xDC, 0x02, 0x11, 0x85, 0x4E, 0xF2, 0xA8, 0xAC, 0xC2, 0x9C, 0x0D, 0x5A, - 0x60, 0x08, 0x40, 0xA2, 0x71, 0xAA, 0x9A, 0x56, 0xEA, 0xE2, 0x7F, 0x7F, 0xE2, 0x5C, 0x57, 0xF3, - 0xDE, 0x9E, 0x6A, 0x2D, 0x0B, 0x7D, 0x02, 0x6D, 0x02, 0xA6, 0x4A, 0x29, 0x03, 0xD5, 0x9D, 0xFD, - 0x63, 0x0B, 0xDA, 0xE4, 0x48, 0x68, 0x3D, 0xBB, 0x44, 0x9F, 0x60, 0xDA, 0xD6, 0x73, 0xBC, 0x77, - 0xFB, 0xED, 0xEC, 0x54, 0xCD, 0x6C, 0xB6, 0x80, 0xEB, 0xC2, 0x0C, 0xF7, 0xEE, 0x86, 0x32, 0xF7, - 0x83, 0x8C, 0xEB, 0x13, 0xB3, 0x4C, 0x70, 0x60, 0xCC, 0xD6, 0xE0, 0xD0, 0x1B, 0x82, 0x6B, 0xFE, - 0xB2, 0xFD, 0xEB, 0xF6, 0x6F, 0x08, 0x25, 0xEE, 0xAF, 0x61, 0xD2, 0x28, 0x55, 0x4F, 0xFC, 0xE5, - 0x50, 0x40, 0x2A, 0xEF, 0x51, 0x47, 0x15, 0xCB, 0xB3, 0x6C, 0xE4, 0x4C, 0xD4, 0x72, 0x99, 0x46, - 0x55, 0x49, 0x32, 0xFA, 0xE5, 0x40, 0x3D, 0x5C, 0x63, 0x3E, 0xAC, 0x66, 0xAA, 0x57, 0xFB, 0x0B, - 0x89, 0xEA, 0x48, 0x2C, 0xB8, 0x50, 0x44, 0xC7, 0xB8, 0xDD, 0xF2, 0xA2, 0x39, 0xD6, 0x0D, 0x87, - 0x7E, 0x55, 0xC3, 0xA1, 0x5F, 0x5F, 0x0C, 0x0E, 0xFD, 0x5A, 0x12, 0x87, 0x7E, 0x7D, 0xC3, 0xA1, - 0x69, 0x38, 0xF4, 0x9B, 0x1A, 0x0E, 0xFD, 0xF6, 0x62, 0x70, 0xE8, 0xB7, 0x92, 0x38, 0xF4, 0xDB, - 0x1B, 0x0E, 0x65, 0x3D, 0x11, 0x41, 0x7E, 0x42, 0xE9, 0x5C, 0xC8, 0xE9, 0x2A, 0x58, 0xA4, 0x96, - 0x17, 0xFC, 0x59, 0x11, 0x69, 0x9E, 0xD3, 0x60, 0x72, 0xCD, 0x85, 0x10, 0x29, 0xD9, 0xF2, 0x45, - 0xA0, 0x92, 0xD8, 0xC5, 0x93, 0xC8, 0xCF, 0xE5, 0x3B, 0x5E, 0x6B, 0x24, 0xA4, 0xE8, 0x67, 0xCF, - 0xD1, 0x48, 0x79, 0xC0, 0xD0, 0x48, 0xD0, 0x4F, 0x49, 0xC7, 0xD2, 0xAA, 0x41, 0x39, 0x20, 0x40, - 0x4E, 0xFE, 0x23, 0x84, 0x7D, 0x81, 0xE9, 0xEB, 0x8E, 0xFB, 0xB8, 0xED, 0xA2, 0xEB, 0x9C, 0x34, - 0x80, 0x4C, 0x48, 0xD4, 0xEB, 0x2D, 0x47, 0xAB, 0xE7, 0x39, 0x5C, 0x2C, 0xF7, 0x29, 0xA2, 0x3E, - 0x65, 0xC9, 0xE6, 0x86, 0x68, 0x73, 0x5A, 0x79, 0xC1, 0xAF, 0xF2, 0xCD, 0x03, 0xB1, 0x53, 0x33, - 0x0B, 0x62, 0xE6, 0x8F, 0x99, 0x4C, 0x7D, 0xD6, 0x13, 0x26, 0xA0, 0x93, 0x6C, 0x0D, 0x47, 0x9C, - 0xD3, 0xB4, 0xEF, 0xB0, 0x8E, 0x36, 0xD6, 0x2D, 0x51, 0xC6, 0x8D, 0xD8, 0xD3, 0x24, 0x2A, 0xBA, - 0xDA, 0xD9, 0x6D, 0xAA, 0xF9, 0x99, 0xC4, 0x93, 0x76, 0x28, 0x81, 0x4A, 0xA2, 0x9E, 0xD4, 0xA5, - 0x34, 0x4F, 0x1D, 0xB1, 0x64, 0x4D, 0x48, 0x96, 0x2C, 0xE7, 0xC8, 0x52, 0x95, 0x18, 0x45, 0x0F, - 0xA5, 0x87, 0x6C, 0x8F, 0x87, 0x3C, 0x5E, 0xD2, 0x90, 0x1D, 0x1A, 0xF2, 0x64, 0x49, 0xA3, 0xED, - 0xD4, 0x0E, 0x8F, 0xF0, 0xE0, 0xBA, 0x19, 0x6A, 0xC1, 0x85, 0x7F, 0xE3, 0x38, 0x97, 0x8E, 0x3D, - 0xB8, 0x71, 0x8E, 0xF9, 0xA9, 0xC0, 0x40, 0xE0, 0x23, 0x53, 0x27, 0x52, 0x28, 0x17, 0x6A, 0xE9, - 0x49, 0xCF, 0x4F, 0xA7, 0xB7, 0xAA, 0x32, 0xC8, 0xC4, 0x25, 0x51, 0x85, 0x26, 0x24, 0xCD, 0x30, - 0xD2, 0x92, 0x49, 0xB5, 0x76, 0x23, 0xD9, 0x3D, 0x1A, 0x8B, 0x8E, 0x0C, 0xA3, 0xA0, 0x75, 0x68, - 0x86, 0x97, 0x98, 0xB6, 0xD0, 0x59, 0x47, 0xFD, 0x47, 0x36, 0xAE, 0xAA, 0xE6, 0x6D, 0x70, 0x2C, - 0x9A, 0xBD, 0xC8, 0x99, 0x8F, 0x47, 0xC0, 0xB9, 0x9F, 0xD2, 0x5F, 0xAB, 0x62, 0x93, 0x03, 0x04, - 0x00, 0x59, 0x62, 0x4B, 0x24, 0x9C, 0xD7, 0x0C, 0xF2, 0xD5, 0xDF, 0x22, 0x13, 0x5C, 0x5C, 0xF1, - 0xC3, 0xE3, 0x3A, 0x9C, 0x16, 0x09, 0x49, 0x82, 0xDE, 0x16, 0x8B, 0x62, 0x66, 0xF0, 0x82, 0x2D, - 0x73, 0x55, 0xDC, 0x64, 0x57, 0x7F, 0xB9, 0xF0, 0x99, 0x3B, 0x33, 0xEF, 0x16, 0x5A, 0xCF, 0x7F, - 0xB7, 0x80, 0x53, 0x3C, 0x8C, 0xEE, 0xD8, 0xAA, 0xBD, 0x52, 0x88, 0x6A, 0x61, 0x97, 0xBC, 0xF7, - 0x59, 0xE3, 0x5B, 0x85, 0xCF, 0xF1, 0xCA, 0xC7, 0x37, 0x0B, 0xCA, 0x94, 0xA7, 0xC2, 0xD9, 0x52, - 0x37, 0x0B, 0x39, 0xA3, 0xC5, 0xB7, 0x0B, 0x97, 0x97, 0x43, 0xE5, 0x81, 0x57, 0xFE, 0x12, 0x02, - 0x16, 0x93, 0xBD, 0x77, 0xC0, 0x47, 0x6F, 0xB7, 0x0E, 0x55, 0xA4, 0xDE, 0x22, 0x78, 0x5E, 0x6A, - 0x01, 0xE9, 0x3F, 0x45, 0x12, 0x6F, 0xE5, 0x91, 0xD6, 0xB4, 0xBA, 0x6E, 0xD0, 0xBF, 0x19, 0x84, - 0x46, 0x11, 0xFB, 0x4C, 0xA5, 0xF9, 0xA1, 0xE6, 0x18, 0x5E, 0x52, 0x30, 0x28, 0x6E, 0xC1, 0x93, - 0x2D, 0x5F, 0x8E, 0xE1, 0x25, 0x89, 0x19, 0xA8, 0x8F, 0x2C, 0x14, 0x35, 0x60, 0x80, 0xD5, 0xC7, - 0x8D, 0x08, 0x0A, 0x25, 0x90, 0x43, 0x36, 0x7D, 0x31, 0x16, 0x5E, 0x21, 0x91, 0x07, 0x24, 0x79, - 0x9E, 0x63, 0x86, 0xFB, 0x20, 0xD7, 0x3E, 0x5B, 0xCC, 0xE6, 0x3B, 0x2D, 0x1C, 0x18, 0x64, 0x71, - 0x31, 0x12, 0x13, 0x43, 0xA9, 0x23, 0x49, 0xDA, 0xD2, 0x93, 0x9E, 0xF0, 0x6C, 0x5B, 0xCF, 0xBA, - 0xDE, 0x1F, 0x17, 0x6E, 0x9C, 0x4B, 0xF0, 0x47, 0x96, 0x60, 0xD5, 0xB5, 0xF9, 0xC4, 0x3C, 0x19, - 0xD3, 0xFF, 0xE5, 0xE8, 0x4C, 0xF9, 0x34, 0xBE, 0xD2, 0xBC, 0xBB, 0x6D, 0x18, 0x4D, 0x39, 0x2B, - 0xE3, 0x82, 0xA4, 0x8E, 0x84, 0xE4, 0xF1, 0x85, 0x63, 0x53, 0x76, 0x44, 0xD5, 0xBA, 0xCE, 0x2C, - 0xCB, 0x74, 0x7D, 0xC7, 0x34, 0xE2, 0x62, 0x3A, 0x30, 0xE1, 0xA8, 0xE6, 0x8E, 0x14, 0x50, 0x62, - 0xC9, 0x0B, 0xF5, 0x2D, 0x4D, 0x42, 0x2E, 0xF9, 0x3E, 0x3E, 0x1F, 0x39, 0x76, 0x48, 0xC5, 0x23, - 0xA4, 0x5F, 0x3E, 0x6E, 0x91, 0x6D, 0x14, 0x11, 0x5C, 0x16, 0x2E, 0xBC, 0x14, 0x11, 0x60, 0x94, - 0x4D, 0xBE, 0x73, 0xD9, 0xF5, 0x4E, 0x11, 0xD9, 0xAD, 0xF8, 0x85, 0x5C, 0x8C, 0xC9, 0xAA, 0x6B, - 0x52, 0xBB, 0x11, 0x52, 0x7C, 0xCD, 0x9D, 0x9C, 0xC8, 0xC2, 0x2B, 0x72, 0x3D, 0x89, 0x93, 0xA8, - 0x56, 0x42, 0xDE, 0x29, 0x60, 0x45, 0x9E, 0x5E, 0x11, 0x19, 0x89, 0x23, 0x5D, 0x0E, 0xB9, 0x55, - 0x4B, 0xDA, 0xBF, 0xB0, 0x0C, 0x0D, 0x70, 0x93, 0xB9, 0xC9, 0x7E, 0x33, 0x7C, 0x8C, 0xA2, 0xAD, - 0x34, 0x4B, 0x87, 0xA6, 0xC8, 0x5F, 0x30, 0x7D, 0x91, 0xC8, 0xBC, 0xCD, 0x19, 0x3C, 0x22, 0x9E, - 0x53, 0xE2, 0x04, 0x59, 0x84, 0x96, 0x73, 0xD1, 0x67, 0x22, 0x65, 0xA5, 0xB1, 0x15, 0x4F, 0x4D, - 0xE4, 0x57, 0x97, 0x13, 0xA6, 0x00, 0xA3, 0x7F, 0xF1, 0xC3, 0xDB, 0xC0, 0xD3, 0x28, 0x77, 0xF9, - 0xBF, 0x88, 0xAA, 0x3B, 0xD2, 0x63, 0xF6, 0x08, 0x7E, 0xDB, 0xB6, 0xC6, 0x24, 0xCF, 0xC2, 0xD8, - 0x96, 0xA3, 0xEB, 0xEE, 0x38, 0x93, 0x43, 0xCC, 0x8D, 0xE2, 0xB0, 0x6A, 0xE8, 0x0E, 0xBF, 0xA0, - 0x9A, 0x1D, 0x91, 0xDB, 0xEC, 0x98, 0x9F, 0x0D, 0xA1, 0x87, 0x47, 0x51, 0x93, 0x4B, 0x04, 0x0E, - 0xC9, 0xA2, 0x60, 0x38, 0x2D, 0xF2, 0x6D, 0xD5, 0xE4, 0xDD, 0x15, 0xE6, 0x08, 0x66, 0xC3, 0xD4, - 0xA8, 0x5B, 0x14, 0xC4, 0x13, 0xDA, 0xE2, 0x05, 0x6A, 0x12, 0x17, 0x0D, 0x49, 0xD6, 0x05, 0x8B, - 0xD7, 0x49, 0x5B, 0x4E, 0x41, 0x3D, 0xD6, 0x83, 0xF6, 0xE8, 0x4B, 0x03, 0x96, 0xCC, 0xEB, 0x3E, - 0xC4, 0x70, 0xBE, 0x29, 0x17, 0x7F, 0x8C, 0x6A, 0xF7, 0xAC, 0xA1, 0xD2, 0xA7, 0x92, 0x8A, 0xA2, - 0x50, 0x25, 0xB0, 0xF5, 0x23, 0xF0, 0xF6, 0x14, 0x02, 0x67, 0x4A, 0x39, 0x52, 0xF2, 0x09, 0xDD, - 0x82, 0x2E, 0x8E, 0xBA, 0x27, 0x59, 0x3A, 0x87, 0x47, 0x2B, 0x4A, 0xE6, 0x30, 0xB3, 0x1C, 0x2A, - 0xD7, 0x0C, 0x43, 0x95, 0xC0, 0x25, 0x85, 0xA8, 0x92, 0xF7, 0x1B, 0xF1, 0x15, 0x21, 0xBE, 0x25, - 0x69, 0xD6, 0x9A, 0xD8, 0x5A, 0xB1, 0xB3, 0x0A, 0x82, 0xF6, 0x64, 0xDA, 0x35, 0x89, 0x1C, 0x6A, - 0x35, 0x74, 0x69, 0x98, 0xCD, 0xD1, 0xF3, 0x67, 0x3F, 0x3F, 0x35, 0xFD, 0x80, 0x0A, 0xA2, 0xC5, - 0xA7, 0x14, 0xC5, 0x85, 0x48, 0x79, 0x59, 0x42, 0x25, 0x42, 0x43, 0x21, 0x3E, 0xA7, 0x44, 0xE6, - 0xF8, 0xB0, 0x0A, 0xFD, 0x90, 0xB2, 0x0E, 0x51, 0x56, 0x14, 0x27, 0xA0, 0x1A, 0x3D, 0x94, 0x53, - 0xDD, 0x89, 0xA2, 0x7B, 0x4D, 0x7F, 0x24, 0x4E, 0x2A, 0xA4, 0x1B, 0xCD, 0x7E, 0x64, 0x80, 0x6B, - 0xDC, 0xF6, 0x45, 0x01, 0x8E, 0xA3, 0x11, 0xA6, 0xD4, 0x22, 0x12, 0x30, 0x24, 0xE2, 0x23, 0x75, - 0xDC, 0xF2, 0x3E, 0xE6, 0x46, 0x81, 0x39, 0x7A, 0x14, 0x30, 0x22, 0x4C, 0x8D, 0x38, 0xC5, 0xF5, - 0xF5, 0xC9, 0x28, 0x6F, 0x4C, 0xD9, 0x5D, 0x88, 0xAB, 0x5C, 0x1A, 0xF5, 0x0B, 0x99, 0x53, 0x52, - 0x4D, 0x5F, 0x9A, 0xB1, 0x4D, 0x2E, 0xEE, 0x3A, 0x0A, 0x13, 0x9A, 0x96, 0x91, 0x51, 0xB2, 0x86, - 0xA7, 0x71, 0x84, 0x78, 0x14, 0x91, 0x5E, 0x6F, 0x15, 0x58, 0x03, 0x1E, 0x6D, 0x52, 0xAB, 0x36, - 0x8A, 0x70, 0x89, 0xE8, 0x4F, 0x77, 0x88, 0xEF, 0xE8, 0x74, 0x78, 0x4E, 0xF2, 0x09, 0x20, 0x38, - 0x3B, 0x18, 0x47, 0xC6, 0xFB, 0xA6, 0x31, 0xD1, 0x9F, 0xAC, 0x8C, 0x9B, 0x38, 0x98, 0x65, 0x11, - 0x9F, 0xE8, 0x05, 0xF8, 0xC6, 0xBC, 0xF5, 0xA4, 0x4C, 0x5B, 0x9C, 0x83, 0xC8, 0x63, 0x15, 0xCF, - 0x70, 0xFF, 0x80, 0x9D, 0x03, 0xB8, 0x02, 0x76, 0x59, 0x3F, 0xC6, 0x61, 0x37, 0xF7, 0x3E, 0xC0, - 0x0E, 0xB0, 0x1B, 0xC7, 0xD3, 0x87, 0x9B, 0xAD, 0x66, 0x1B, 0xFE, 0x78, 0x7D, 0x75, 0x1F, 0x16, - 0xCA, 0x6E, 0x32, 0x64, 0x55, 0x86, 0xED, 0xA4, 0xBB, 0x78, 0x91, 0xB6, 0x7E, 0x29, 0x4B, 0x97, - 0x91, 0x47, 0xA4, 0x68, 0xBB, 0x02, 0x15, 0x56, 0x66, 0xDB, 0xF0, 0x22, 0xA1, 0xBA, 0x4B, 0xEC, - 0xE2, 0x24, 0xC3, 0x2E, 0x88, 0x37, 0x84, 0xA3, 0x2C, 0x6B, 0x10, 0xCA, 0xEE, 0x56, 0x8A, 0xC7, - 0x88, 0xCC, 0x62, 0x24, 0xA3, 0x88, 0xAF, 0x49, 0xD4, 0x46, 0xCF, 0x4F, 0x8F, 0x71, 0x43, 0x94, - 0x98, 0xDD, 0x62, 0xFE, 0x10, 0x15, 0x62, 0x2C, 0xF4, 0x82, 0x34, 0x89, 0xA6, 0x67, 0x8A, 0x89, - 0x05, 0xE1, 0xBA, 0xF1, 0x46, 0xE1, 0x15, 0x9A, 0xFA, 0x22, 0xCC, 0x8D, 0xD2, 0xD0, 0x15, 0xBF, - 0xA6, 0x11, 0x3D, 0x2C, 0x8D, 0xAC, 0xC9, 0xD3, 0x62, 0x39, 0xA4, 0x1D, 0x39, 0xB9, 0x46, 0xEE, - 0x02, 0xB5, 0x32, 0xB7, 0x74, 0xE4, 0x5C, 0xFF, 0xCC, 0x94, 0xFD, 0x19, 0x34, 0x5A, 0x11, 0xFD, - 0x4D, 0x49, 0x62, 0x98, 0xC6, 0xA2, 0xA5, 0x45, 0xE7, 0xAE, 0x50, 0xA3, 0x31, 0xBC, 0x5C, 0x4A, - 0x07, 0x71, 0xA2, 0x44, 0xF2, 0xC8, 0x4E, 0x7A, 0x5D, 0xA3, 0xF7, 0x76, 0xE3, 0xAD, 0xBA, 0x52, - 0x15, 0x37, 0xA4, 0x13, 0x08, 0x56, 0x2A, 0x74, 0x21, 0x6A, 0xFD, 0x16, 0xBE, 0xB0, 0x70, 0x42, - 0xAA, 0x3E, 0x7C, 0xE1, 0x52, 0x0B, 0xB6, 0xF1, 0xA2, 0x1B, 0xEF, 0xF3, 0xDE, 0xA2, 0x18, 0x9E, - 0x29, 0x8A, 0x21, 0xA2, 0x20, 0xC5, 0x48, 0x06, 0xE5, 0xED, 0x49, 0x6E, 0x6E, 0xE5, 0x81, 0x0F, - 0xE3, 0x53, 0x29, 0x3F, 0xF8, 0x61, 0xFC, 0xFD, 0x8A, 0x05, 0x40, 0xEC, 0x34, 0x1B, 0xCD, 0x0F, - 0xCD, 0xF6, 0x87, 0x9D, 0xF7, 0x1F, 0x58, 0xBD, 0xD5, 0xDC, 0x6D, 0xB4, 0xF6, 0x77, 0x9B, 0xBB, - 0xEF, 0xF7, 0x5A, 0xAC, 0xB5, 0xBB, 0x07, 0xDF, 0xED, 0x7F, 0xA8, 0x36, 0xFA, 0x61, 0x09, 0xE3, - 0x45, 0xA1, 0x0F, 0x4B, 0x18, 0x4A, 0x21, 0xEE, 0x61, 0xEA, 0x2C, 0x0A, 0x5D, 0x9B, 0x97, 0x9B, - 0xF1, 0x5B, 0xD0, 0xC3, 0x94, 0xA0, 0x87, 0x49, 0x21, 0xB2, 0xF2, 0xC0, 0x87, 0x68, 0x88, 0x05, - 0x04, 0x3F, 0x2C, 0x7A, 0xF6, 0xC9, 0x31, 0x16, 0x13, 0x04, 0xB1, 0xE8, 0x15, 0xA4, 0x47, 0x59, - 0xFB, 0x60, 0x88, 0xE4, 0xD1, 0xF5, 0x6A, 0x62, 0x22, 0xD6, 0xB3, 0x70, 0x68, 0x8F, 0x7B, 0xF7, - 0x58, 0xD8, 0x2B, 0x55, 0x38, 0x54, 0x3C, 0x5C, 0x5A, 0xE1, 0xD0, 0x68, 0x0E, 0xCF, 0x53, 0x38, - 0xD4, 0xA7, 0xD1, 0x51, 0xF0, 0x0E, 0x5D, 0x42, 0xEE, 0xC8, 0xF4, 0xBD, 0xE1, 0x4F, 0x54, 0x10, - 0xA5, 0x5C, 0xA9, 0x13, 0xF5, 0x43, 0xBF, 0x51, 0x06, 0x35, 0x51, 0x40, 0x54, 0x48, 0xF3, 0x01, - 0xFA, 0x73, 0x68, 0x3A, 0xE6, 0x23, 0x93, 0x0A, 0x71, 0xBA, 0x9F, 0x50, 0xA4, 0x29, 0xB3, 0x53, - 0xB5, 0x4B, 0x5F, 0x4E, 0x51, 0x51, 0xB1, 0xA1, 0x65, 0xF3, 0x5B, 0xCD, 0x17, 0xC6, 0xA7, 0xE4, - 0xE5, 0xAE, 0xA2, 0x2E, 0x07, 0xE1, 0x49, 0xF1, 0xDA, 0x1C, 0x13, 0xCB, 0x56, 0x38, 0x05, 0x94, - 0x52, 0x78, 0xE7, 0x74, 0x3C, 0x9F, 0x69, 0x25, 0xA9, 0x98, 0xB5, 0x30, 0x2F, 0x77, 0x05, 0xC5, - 0x38, 0x04, 0x0A, 0xCC, 0x2D, 0xC8, 0x31, 0x66, 0x76, 0x6A, 0x15, 0x11, 0x52, 0x19, 0xBB, 0x0B, - 0xAF, 0xB6, 0x54, 0x71, 0x85, 0x99, 0x93, 0xAB, 0x44, 0x34, 0x9C, 0x30, 0x06, 0x26, 0xD6, 0x15, - 0x17, 0x60, 0xFD, 0xBD, 0x59, 0x3C, 0x4A, 0xA9, 0xFA, 0xDA, 0x93, 0xB1, 0xBB, 0x82, 0x72, 0xD5, - 0xDB, 0x19, 0xD6, 0xAE, 0xFD, 0x42, 0xD6, 0xAE, 0xC2, 0x16, 0xAF, 0x29, 0x50, 0x2C, 0x30, 0x9A, - 0x3B, 0xAB, 0xA3, 0xA7, 0xDA, 0xC0, 0x14, 0xE5, 0x05, 0x55, 0xE5, 0x64, 0xF1, 0x58, 0x88, 0xC5, - 0x5C, 0x57, 0x0B, 0x0B, 0xD5, 0x6B, 0xE8, 0x2E, 0x0E, 0x0B, 0xD5, 0x6A, 0xEA, 0xE6, 0xC0, 0xF1, - 0xE9, 0x78, 0x28, 0x3A, 0x7A, 0x75, 0x78, 0x88, 0xD5, 0x3D, 0x57, 0x0B, 0x0F, 0xD5, 0x2B, 0xF2, - 0xAE, 0x0E, 0x37, 0x94, 0x50, 0x7C, 0x3A, 0x16, 0x8A, 0x8E, 0x5E, 0x25, 0x16, 0x76, 0x7F, 0xAE, - 0x08, 0x0F, 0x9F, 0x58, 0xD7, 0x37, 0x89, 0x87, 0xCA, 0x65, 0x36, 0x67, 0xA0, 0xE2, 0xFB, 0x42, - 0x57, 0xC1, 0x95, 0xA0, 0x22, 0x81, 0xB2, 0x1A, 0x64, 0xC4, 0xAE, 0x5E, 0x11, 0x3A, 0x8E, 0x2B, - 0x8F, 0x2E, 0x98, 0x29, 0xAA, 0xD5, 0x82, 0x1D, 0x9F, 0xCD, 0xCA, 0xD5, 0x84, 0x57, 0x81, 0x29, - 0xA6, 0xA0, 0xF8, 0x14, 0x3C, 0x4C, 0x76, 0xF4, 0x2A, 0xB1, 0x70, 0xE1, 0x4C, 0xB1, 0x04, 0x1E, - 0xAE, 0x15, 0x53, 0xCC, 0x80, 0xB2, 0x1A, 0x64, 0x7C, 0x1E, 0xA6, 0xF8, 0x84, 0x57, 0x54, 0x32, - 0x99, 0xAC, 0xBD, 0xDD, 0xA7, 0xB5, 0x28, 0xBB, 0x4F, 0xAB, 0xA8, 0xDD, 0xA7, 0xBD, 0xCE, 0x76, - 0x9F, 0xD6, 0x4B, 0xB6, 0xFB, 0xB4, 0xDE, 0xEC, 0x3E, 0x15, 0xD8, 0x7D, 0x5A, 0x55, 0xD9, 0x7D, - 0x5A, 0xAF, 0xD3, 0xEE, 0xD3, 0x7A, 0xB3, 0xFB, 0x54, 0x62, 0xF7, 0x69, 0x55, 0x65, 0xF7, 0x69, - 0xBD, 0x4E, 0xBB, 0x4F, 0xEB, 0xCD, 0xEE, 0x53, 0x81, 0xDD, 0xA7, 0x55, 0x95, 0xDD, 0xA7, 0xF5, - 0x5A, 0xED, 0x3E, 0xAD, 0x37, 0xBB, 0x4F, 0x55, 0x76, 0x9F, 0x56, 0x75, 0x76, 0x9F, 0xD6, 0xEB, - 0xB4, 0xFB, 0xB4, 0xDE, 0xEC, 0x3E, 0x15, 0xD8, 0x7D, 0x5A, 0x55, 0xD9, 0x7D, 0x5A, 0xAF, 0xD5, - 0xEE, 0xD3, 0x7A, 0xB3, 0xFB, 0x54, 0x65, 0xF7, 0x69, 0x55, 0x67, 0xF7, 0x69, 0xBD, 0xD9, 0x7D, - 0x56, 0xCD, 0xEE, 0xD3, 0x5E, 0x94, 0xDD, 0xA7, 0x5D, 0xD4, 0xEE, 0xD3, 0x59, 0x67, 0xBB, 0x4F, - 0xFB, 0x25, 0xDB, 0x7D, 0xDA, 0x6F, 0x76, 0x9F, 0x0A, 0xEC, 0x3E, 0xED, 0xAA, 0xEC, 0x3E, 0xED, - 0xD7, 0x69, 0xF7, 0x69, 0xBF, 0xD9, 0x7D, 0x2A, 0xB1, 0xFB, 0xB4, 0xAB, 0xB2, 0xFB, 0xB4, 0x5F, - 0xA7, 0xDD, 0xA7, 0xFD, 0x66, 0xF7, 0xA9, 0xC0, 0xEE, 0xD3, 0xAE, 0xCA, 0xEE, 0xD3, 0x7E, 0xAD, - 0x76, 0x9F, 0xF6, 0x9B, 0xDD, 0xA7, 0x2A, 0xBB, 0x4F, 0xBB, 0x3A, 0xBB, 0x4F, 0xFB, 0x75, 0xDA, - 0x7D, 0xDA, 0x6F, 0x76, 0x9F, 0x0A, 0xEC, 0x3E, 0xED, 0xAA, 0xEC, 0x3E, 0xED, 0xD7, 0x6A, 0xF7, - 0x69, 0xBF, 0xD9, 0x7D, 0xAA, 0xB2, 0xFB, 0xB4, 0xAB, 0xB3, 0xFB, 0xB4, 0xDF, 0xEC, 0x3E, 0xAB, - 0x66, 0xF7, 0xE9, 0x2C, 0xCA, 0xEE, 0xD3, 0x29, 0x6A, 0xF7, 0xD9, 0x59, 0x67, 0xBB, 0x4F, 0xE7, - 0x25, 0xDB, 0x7D, 0x3A, 0x6F, 0x76, 0x9F, 0x0A, 0xEC, 0x3E, 0x9D, 0xAA, 0xEC, 0x3E, 0x9D, 0xD7, - 0x69, 0xF7, 0xE9, 0xBC, 0xD9, 0x7D, 0x2A, 0xB1, 0xFB, 0x74, 0xAA, 0xB2, 0xFB, 0x74, 0x5E, 0xA7, - 0xDD, 0xA7, 0xF3, 0x66, 0xF7, 0xA9, 0xC0, 0xEE, 0xD3, 0xA9, 0xCA, 0xEE, 0xD3, 0x79, 0xAD, 0x76, - 0x9F, 0xCE, 0x9B, 0xDD, 0xA7, 0x2A, 0xBB, 0x4F, 0xA7, 0x3A, 0xBB, 0x4F, 0xE7, 0x75, 0xDA, 0x7D, - 0x3A, 0x6F, 0x76, 0x9F, 0x0A, 0xEC, 0x3E, 0x9D, 0xAA, 0xEC, 0x3E, 0x9D, 0xD7, 0x6A, 0xF7, 0xE9, - 0xBC, 0xD9, 0x7D, 0xAA, 0xB2, 0xFB, 0x74, 0xAA, 0xB3, 0xFB, 0x74, 0x5E, 0x8C, 0xDD, 0x67, 0x5E, - 0x0E, 0xA1, 0x19, 0xBD, 0x4A, 0x5B, 0x50, 0x9C, 0x33, 0x6D, 0xC0, 0x83, 0x2B, 0xEE, 0xFB, 0xDA, - 0x80, 0x5F, 0x9A, 0x7E, 0x80, 0xA5, 0xB6, 0xA9, 0xA8, 0x51, 0xF5, 0xA6, 0xA2, 0x12, 0x66, 0xA2, - 0xE8, 0x39, 0x56, 0x05, 0x12, 0x06, 0x8E, 0x2B, 0x7F, 0x80, 0x53, 0x9C, 0x3D, 0x92, 0x92, 0xA5, - 0x68, 0x7A, 0xDF, 0xB3, 0x77, 0xED, 0xFA, 0xE6, 0xE4, 0x8A, 0x5D, 0x53, 0xF2, 0xD8, 0x8F, 0x26, - 0xA1, 0x1B, 0x26, 0xB9, 0x82, 0xB6, 0x27, 0x68, 0x19, 0xAA, 0x55, 0x61, 0x3A, 0x52, 0x30, 0x1B, - 0x55, 0x9A, 0xC9, 0x8B, 0x96, 0x84, 0x09, 0xE4, 0x3D, 0xCD, 0xF6, 0x47, 0x66, 0x90, 0xA8, 0xC7, - 0x44, 0xB5, 0x2B, 0x34, 0xCC, 0x56, 0x6D, 0x88, 0xA4, 0x5A, 0x98, 0x74, 0xB7, 0xF5, 0xE5, 0x4F, - 0xCA, 0x0A, 0x3F, 0x12, 0x78, 0xE3, 0xB3, 0x56, 0xB3, 0xB9, 0xBB, 0x05, 0x3F, 0xDF, 0xEF, 0xE0, - 0xCF, 0x7D, 0xFA, 0xF9, 0x01, 0x7F, 0xB6, 0xDA, 0x3B, 0x22, 0xD5, 0x7C, 0xB3, 0x11, 0x35, 0x6A, - 0xB5, 0x3B, 0x4D, 0x99, 0xB3, 0x5E, 0x26, 0xEC, 0xB5, 0x9C, 0x07, 0x2A, 0x19, 0x85, 0xDF, 0x52, - 0x11, 0x2E, 0x5F, 0x94, 0x6C, 0x83, 0xE7, 0x30, 0xBE, 0x6D, 0x50, 0xFA, 0x53, 0x4C, 0x7F, 0x17, - 0x68, 0xA6, 0xE5, 0x78, 0xB2, 0xD4, 0x93, 0x9C, 0x2B, 0x56, 0xC7, 0xD9, 0xD6, 0x2C, 0x4B, 0xEC, - 0x4B, 0x34, 0xA3, 0x06, 0xBB, 0x34, 0xE1, 0x4B, 0xFF, 0x80, 0x35, 0xF1, 0xE5, 0x76, 0x33, 0x59, - 0x4A, 0x4A, 0x14, 0x88, 0x23, 0x28, 0xC1, 0x78, 0x01, 0x15, 0x93, 0x72, 0x80, 0x57, 0x78, 0xA6, - 0x61, 0x70, 0x1B, 0xDF, 0xC7, 0xB9, 0x52, 0x2D, 0x39, 0xD3, 0x66, 0x88, 0x12, 0x6C, 0xE4, 0x18, - 0x7C, 0xBD, 0x92, 0x88, 0xE5, 0xDA, 0x0B, 0xCB, 0xE0, 0x7C, 0x29, 0x93, 0xE1, 0x7C, 0x23, 0x64, - 0xBA, 0xE9, 0xAD, 0x03, 0xF8, 0x3E, 0x4A, 0x1A, 0x1C, 0x55, 0xEC, 0xD9, 0x69, 0x8E, 0x92, 0x9F, - 0x52, 0x32, 0x51, 0xB5, 0xCD, 0xE3, 0x3E, 0x0F, 0x6E, 0x1C, 0x44, 0x14, 0x99, 0x21, 0x8E, 0x2A, - 0xCE, 0x5F, 0xE3, 0x63, 0xDC, 0xF5, 0xE8, 0xA1, 0x5A, 0xB6, 0x48, 0xD5, 0x82, 0x77, 0xCF, 0xBB, - 0xD0, 0x4B, 0xE7, 0xE1, 0x38, 0x22, 0xA1, 0xD4, 0x62, 0xE1, 0x0B, 0x16, 0x7F, 0x03, 0xD4, 0x62, - 0xDF, 0x15, 0x5A, 0xF6, 0xFC, 0x75, 0x23, 0xBE, 0x8D, 0xD2, 0x07, 0x4B, 0x6D, 0xD1, 0x09, 0x20, - 0x15, 0x1E, 0xE7, 0x0D, 0xF2, 0xF1, 0x1F, 0xEA, 0x75, 0x56, 0x8F, 0xFE, 0x45, 0x02, 0x13, 0xF7, - 0xFA, 0x98, 0xFA, 0x59, 0xD0, 0x49, 0xE2, 0xEB, 0x7A, 0x3D, 0xD3, 0x63, 0x82, 0x40, 0x0C, 0x90, - 0x26, 0x4D, 0x83, 0x0D, 0x34, 0xB7, 0x9E, 0x77, 0x5F, 0x35, 0xE5, 0x22, 0x66, 0xDA, 0x71, 0x4A, - 0x30, 0x74, 0xDD, 0x28, 0x01, 0xA0, 0xCA, 0x01, 0x9A, 0x0B, 0x9D, 0xFC, 0x43, 0xB5, 0xDB, 0x8D, - 0x3A, 0x2E, 0x74, 0x5E, 0xC6, 0xCD, 0x72, 0x87, 0xCA, 0xE4, 0xED, 0xB6, 0x1D, 0x7B, 0xDA, 0xAE, - 0x0B, 0xA1, 0x2C, 0x05, 0xE4, 0x50, 0xD4, 0x27, 0x8A, 0xCE, 0x55, 0x37, 0xF1, 0xC6, 0xD3, 0x0F, - 0xD7, 0x7C, 0xF4, 0xCE, 0xC3, 0x90, 0xB9, 0xEC, 0x33, 0x06, 0x41, 0xCE, 0x28, 0xD3, 0xB9, 0x65, - 0x29, 0x71, 0xED, 0x94, 0xB2, 0x61, 0xB2, 0x8B, 0xD3, 0x83, 0x48, 0xB8, 0x1D, 0x42, 0x87, 0x0F, - 0xB0, 0xD8, 0x8B, 0xD3, 0x19, 0x59, 0xD2, 0xB7, 0x8F, 0x50, 0x9E, 0x9D, 0x99, 0xE6, 0xFC, 0x14, - 0x8B, 0x27, 0x82, 0x70, 0x6C, 0x5A, 0xEC, 0x8E, 0xC3, 0x47, 0xD8, 0x7F, 0xD3, 0xE3, 0xF1, 0x30, - 0x06, 0x7C, 0x7D, 0xCD, 0x47, 0x9A, 0x69, 0x9B, 0xF6, 0x60, 0xC6, 0x48, 0x0E, 0xFB, 0x2B, 0xB4, - 0x9E, 0x2A, 0x3D, 0x3F, 0x6B, 0x66, 0xD6, 0x24, 0x8A, 0x9D, 0xC4, 0xA9, 0x43, 0xFD, 0x38, 0x4B, - 0x6B, 0x06, 0x05, 0xE3, 0x17, 0xD8, 0x32, 0x52, 0xB6, 0x4E, 0x9D, 0xDC, 0x12, 0xD3, 0xB7, 0xCA, - 0x0A, 0x5E, 0xDB, 0xEC, 0xA2, 0x9B, 0x06, 0x86, 0x9E, 0x00, 0x06, 0x09, 0x42, 0xDA, 0x3D, 0xC8, - 0x5E, 0x54, 0x3F, 0x73, 0x32, 0xBB, 0xEA, 0xDA, 0x25, 0x57, 0x1D, 0x70, 0x67, 0xE0, 0x69, 0xEE, - 0xD0, 0xD4, 0xAF, 0xF9, 0x00, 0xD6, 0x78, 0xEA, 0x39, 0xAE, 0xE0, 0x1C, 0xF3, 0xB0, 0x8E, 0x90, - 0x2B, 0xDB, 0xBC, 0x76, 0xF8, 0x39, 0x7E, 0xC2, 0xC4, 0xA3, 0xF9, 0xBA, 0x76, 0xBA, 0xB2, 0xC0, - 0x44, 0x97, 0xB9, 0xF3, 0x4C, 0x6B, 0xCF, 0x86, 0x9C, 0x75, 0x94, 0x08, 0x76, 0xE6, 0x1E, 0xA4, - 0xF3, 0xD7, 0x37, 0x6B, 0x87, 0xDF, 0x7B, 0x6A, 0x39, 0xE5, 0x27, 0x8B, 0x08, 0x9C, 0x7D, 0x2F, - 0xD5, 0x12, 0xA6, 0x78, 0x54, 0xAE, 0x25, 0x70, 0x83, 0xBF, 0x5E, 0x97, 0x6A, 0xB9, 0x53, 0x3B, - 0xFC, 0xEF, 0x1A, 0xE0, 0xCA, 0xFC, 0xC6, 0xF3, 0x53, 0xE6, 0x57, 0x4B, 0x7D, 0x3D, 0xB1, 0xFB, - 0x8F, 0x4E, 0xE8, 0xB1, 0xF1, 0x36, 0x33, 0x8F, 0xF6, 0x59, 0xAA, 0x47, 0xA0, 0x71, 0x01, 0x93, - 0x15, 0x99, 0x8F, 0x25, 0xA5, 0xF6, 0x3D, 0xFE, 0x47, 0xC8, 0x6D, 0xFD, 0x91, 0x94, 0x2A, 0x81, - 0x15, 0x9A, 0x95, 0xE0, 0x5D, 0x20, 0x3E, 0xB8, 0xA6, 0x9E, 0x20, 0xD2, 0xEF, 0xBD, 0x55, 0x22, - 0x4F, 0x21, 0x04, 0x79, 0x4F, 0xA0, 0x5D, 0xD7, 0xED, 0xF1, 0x00, 0xF3, 0x46, 0xFB, 0x53, 0xCF, - 0xE0, 0xA7, 0x9D, 0x2F, 0xCA, 0x67, 0x8C, 0x16, 0x06, 0x0E, 0x9C, 0x7D, 0xD7, 0xDC, 0xE6, 0x0F, - 0x1A, 0x96, 0xB0, 0x84, 0xBF, 0xF1, 0x30, 0x64, 0xF2, 0x89, 0x62, 0x4D, 0x96, 0xA7, 0x9C, 0x24, - 0xD9, 0x29, 0xA8, 0x6F, 0xF4, 0xD3, 0xD2, 0xDA, 0x4B, 0x24, 0xFE, 0x19, 0x4F, 0x06, 0x12, 0x1E, - 0x90, 0x17, 0x81, 0x2A, 0x8F, 0x1A, 0x7B, 0x7B, 0x9F, 0xA1, 0xEC, 0x80, 0x3A, 0x06, 0x89, 0x14, - 0x8F, 0x5B, 0x0C, 0xA7, 0x89, 0xC5, 0xE3, 0x74, 0xAA, 0x66, 0xA9, 0x05, 0x01, 0x1F, 0xB9, 0xA4, - 0x84, 0x00, 0xB6, 0xD9, 0x48, 0x06, 0xF0, 0x71, 0xE3, 0x8B, 0x33, 0xE2, 0x1B, 0xEC, 0x67, 0xF3, - 0xDC, 0xDC, 0x02, 0x4D, 0x06, 0x64, 0x1E, 0x0D, 0xFB, 0xD9, 0xC2, 0xEF, 0x3C, 0x5C, 0x1F, 0x0D, - 0x94, 0x40, 0x6C, 0x71, 0x86, 0x1B, 0xCA, 0xA5, 0xC3, 0x2B, 0x4E, 0x80, 0x3F, 0x9F, 0x0A, 0xE6, - 0x7B, 0x6D, 0x95, 0x32, 0x43, 0x27, 0x4F, 0xA2, 0xA4, 0x84, 0x2C, 0x24, 0xC5, 0xAE, 0xE7, 0xF4, - 0x4D, 0x8B, 0xDF, 0x38, 0x77, 0x5C, 0xC1, 0x73, 0x6B, 0xEE, 0x1D, 0xC8, 0x64, 0x29, 0x35, 0x29, - 0x90, 0xCA, 0x71, 0x18, 0x0D, 0x74, 0x50, 0x6C, 0x0B, 0x9E, 0x5E, 0x52, 0x61, 0x5C, 0x9D, 0x9C, - 0x18, 0xA8, 0xE3, 0x0D, 0x34, 0xDB, 0xFC, 0x53, 0x28, 0x0F, 0x43, 0xCD, 0xC7, 0xE4, 0xF2, 0x8E, - 0xE7, 0x3A, 0x64, 0xDC, 0x01, 0x56, 0x6A, 0x0F, 0x7A, 0x81, 0xC7, 0xB5, 0x11, 0x31, 0xCD, 0x94, - 0x9C, 0xA3, 0xE9, 0x3A, 0x1A, 0x88, 0xB7, 0x44, 0x22, 0x7B, 0x93, 0x84, 0x1D, 0x8F, 0x63, 0xAF, - 0x0C, 0xA9, 0x92, 0x7A, 0xD7, 0x43, 0x1F, 0xD0, 0x57, 0xE6, 0xA5, 0x67, 0xAE, 0x5C, 0x78, 0x80, - 0x0B, 0x4F, 0xA2, 0x23, 0xA0, 0xF4, 0x23, 0xAB, 0x33, 0x91, 0x15, 0x9F, 0xB3, 0x9E, 0xAB, 0x79, - 0x77, 0xE7, 0xA1, 0x2D, 0x20, 0x54, 0x2B, 0x51, 0x79, 0xA2, 0xCA, 0x52, 0x0D, 0x6A, 0x18, 0xAD, - 0xC2, 0xAE, 0xA6, 0xDD, 0x50, 0xBD, 0x57, 0x21, 0xC4, 0x02, 0xD7, 0x01, 0x73, 0x50, 0x5B, 0x61, - 0x30, 0x57, 0xA1, 0x9F, 0xA7, 0x5C, 0x08, 0xA8, 0x99, 0xEF, 0x97, 0x60, 0xAD, 0xF0, 0x02, 0xFF, - 0xF9, 0xAD, 0x14, 0x38, 0x8B, 0x45, 0x19, 0x2A, 0x92, 0x7D, 0x17, 0xB3, 0x55, 0x24, 0x5A, 0x4E, - 0xB3, 0x42, 0x8C, 0xA1, 0x37, 0x61, 0x7E, 0xC0, 0xC6, 0x2B, 0x65, 0x77, 0x98, 0xB9, 0x9C, 0x72, - 0xA6, 0x07, 0x1A, 0x80, 0xAC, 0xEE, 0xD8, 0xFB, 0xC9, 0x50, 0x83, 0x13, 0xD9, 0x8A, 0x15, 0xA2, - 0xA8, 0xBF, 0x39, 0x2A, 0x46, 0xF2, 0x4C, 0x8A, 0xFB, 0x3A, 0xD6, 0x42, 0x38, 0x9D, 0xAF, 0xF1, - 0x4F, 0x02, 0x33, 0xC3, 0x07, 0x74, 0x73, 0x72, 0xC0, 0x0A, 0xAA, 0x47, 0xE9, 0x3E, 0xD3, 0x53, - 0x16, 0x8F, 0xF2, 0x14, 0xA3, 0x62, 0x3A, 0xD1, 0xCE, 0x7E, 0x13, 0xD4, 0x22, 0xFC, 0x59, 0x4A, - 0xD5, 0xF8, 0xB0, 0x87, 0xCD, 0xF1, 0x67, 0x39, 0xBD, 0xEA, 0x43, 0x1B, 0xDB, 0xD3, 0xAF, 0x72, - 0x4A, 0xD2, 0xFE, 0x0E, 0x76, 0x40, 0xBF, 0x4A, 0x75, 0xB0, 0xFB, 0x9E, 0x56, 0x40, 0xBF, 0xCA, - 0x2D, 0xA1, 0xB5, 0x2B, 0xD6, 0x40, 0xBF, 0xCB, 0xE9, 0x88, 0x9D, 0x26, 0xAD, 0x42, 0xFC, 0x2E, - 0xA7, 0xF2, 0xED, 0x35, 0xC5, 0x46, 0xD2, 0xEF, 0x72, 0x5B, 0xD9, 0x6E, 0x89, 0xCD, 0xA4, 0xDF, - 0xAB, 0xA7, 0x3B, 0xDE, 0xD0, 0xBD, 0x1C, 0xD0, 0x12, 0xC9, 0x37, 0x78, 0x6B, 0x86, 0x02, 0xC7, - 0xF5, 0xD1, 0xE9, 0xC5, 0x37, 0x86, 0x4C, 0x2B, 0xBA, 0x57, 0xD3, 0x81, 0x98, 0x07, 0xE2, 0xB6, - 0x0C, 0xA4, 0x6F, 0x7D, 0xC8, 0x34, 0x2A, 0xF0, 0x8C, 0xF5, 0x78, 0x86, 0x0E, 0xCA, 0x32, 0x4E, - 0x5F, 0xDC, 0xB7, 0x25, 0xC4, 0x18, 0xDA, 0xFE, 0x5B, 0xD7, 0x7F, 0x59, 0x4A, 0x23, 0x82, 0xBB, - 0x22, 0xF6, 0x96, 0xE9, 0xAA, 0x76, 0x78, 0x15, 0xFE, 0x60, 0xF2, 0x8F, 0xC2, 0x7C, 0x2D, 0xDB, - 0x59, 0xDE, 0x64, 0xAB, 0xE0, 0x6D, 0x80, 0xCC, 0x5F, 0xAF, 0xCE, 0x8E, 0xCA, 0x5A, 0x7C, 0xBA, - 0xDD, 0xDE, 0xF6, 0xD9, 0x3D, 0x5E, 0x97, 0xDE, 0x00, 0x96, 0x0E, 0xB0, 0xA4, 0x55, 0x29, 0x03, - 0x90, 0xB8, 0x13, 0x0A, 0x7F, 0xC8, 0x95, 0x01, 0xC8, 0x2F, 0xDA, 0x27, 0x65, 0x4D, 0x42, 0x47, - 0xA7, 0x27, 0xDB, 0xA7, 0x47, 0x27, 0xAB, 0x49, 0x9E, 0xA7, 0x47, 0x37, 0x47, 0x69, 0x5A, 0x94, - 0x12, 0x86, 0xBC, 0xE6, 0x36, 0xCC, 0x7E, 0x1F, 0x14, 0x0D, 0x2C, 0x03, 0xED, 0xBA, 0x96, 0x29, - 0xAA, 0x64, 0x82, 0x76, 0x8B, 0xBB, 0x84, 0x6A, 0x08, 0xD5, 0xB0, 0xC5, 0x17, 0x81, 0x5E, 0x4D, - 0xCD, 0x62, 0x37, 0xBF, 0x6C, 0x5F, 0xFF, 0x82, 0xF4, 0x6A, 0xC9, 0x8A, 0x9A, 0xC9, 0x8A, 0xEC, - 0x0D, 0x86, 0x1B, 0x24, 0xB7, 0x26, 0xD5, 0xDA, 0x0D, 0x41, 0x3A, 0x62, 0x2E, 0xC7, 0x7E, 0x60, - 0x06, 0x06, 0x73, 0xC2, 0x00, 0x25, 0x70, 0xD4, 0x83, 0x76, 0x6D, 0x1F, 0xD5, 0x9F, 0x90, 0x98, - 0x48, 0x10, 0x35, 0x46, 0x01, 0x1D, 0xE6, 0x01, 0xFB, 0x12, 0x77, 0x84, 0xFA, 0x94, 0x4D, 0xC5, - 0xA9, 0x03, 0x61, 0x6D, 0xEA, 0x9D, 0x1E, 0x6D, 0xF7, 0x4E, 0x2E, 0x45, 0x09, 0x2E, 0x5D, 0xEC, - 0x65, 0x83, 0xFD, 0x3C, 0xE4, 0xDC, 0xDA, 0x3E, 0x35, 0x3D, 0x76, 0x63, 0xEA, 0x77, 0xA9, 0x69, - 0x90, 0xFE, 0xEF, 0x04, 0x58, 0x00, 0xDB, 0xC4, 0xEA, 0xF3, 0x7D, 0x4D, 0x07, 0x9D, 0xAC, 0xC1, - 0xE4, 0x16, 0xA6, 0xDE, 0x95, 0xDA, 0x56, 0xDF, 0xF4, 0x46, 0x78, 0xCB, 0x91, 0x81, 0x4F, 0xCC, - 0xA7, 0x10, 0x50, 0x6B, 0x67, 0x77, 0x8E, 0x28, 0x1B, 0x45, 0x96, 0x2A, 0x78, 0x90, 0x90, 0xB0, - 0x4E, 0x71, 0x1B, 0x9E, 0x28, 0x60, 0xA5, 0x7A, 0x9C, 0x98, 0xEB, 0x9B, 0x78, 0xF5, 0x26, 0x5E, - 0xBD, 0x1E, 0xF1, 0xEA, 0xC2, 0x16, 0x6C, 0x18, 0x7D, 0x7E, 0xB6, 0xA4, 0x13, 0x54, 0x56, 0xD8, - 0x9A, 0xE4, 0xEF, 0x53, 0x65, 0xAD, 0x04, 0x03, 0x4B, 0xF0, 0x2F, 0x01, 0xBF, 0x15, 0x13, 0xB4, - 0x94, 0x98, 0x18, 0x0C, 0xC9, 0x3D, 0x38, 0x06, 0xBA, 0x78, 0xB6, 0xCC, 0xA9, 0x4D, 0xF8, 0x4C, - 0x96, 0x79, 0x71, 0xC1, 0x7A, 0x96, 0x9C, 0x68, 0x7C, 0xE7, 0x1B, 0x3D, 0x65, 0xF4, 0x78, 0xF1, - 0x26, 0xFA, 0xDC, 0xB9, 0x2C, 0xD9, 0x4E, 0xFF, 0x99, 0xDB, 0x9C, 0xD0, 0x57, 0x13, 0xAB, 0x46, - 0xDF, 0x16, 0xD6, 0x93, 0x12, 0x01, 0x1C, 0xCF, 0xF0, 0xDE, 0x48, 0xBA, 0xFA, 0x8D, 0x42, 0xC0, - 0xDD, 0x3E, 0x45, 0x12, 0x6C, 0x09, 0x2F, 0x3C, 0xD8, 0x6F, 0xF4, 0x95, 0x93, 0xB2, 0x82, 0xFE, - 0xD8, 0x60, 0xD7, 0xFC, 0x8F, 0xD0, 0xF4, 0xB8, 0xCF, 0xD0, 0x8D, 0x0C, 0x0B, 0xD6, 0x72, 0x37, - 0x83, 0xDD, 0xD2, 0x36, 0x2F, 0x3A, 0x68, 0x35, 0x9B, 0x5B, 0xCD, 0x66, 0x33, 0xF4, 0xA5, 0x38, - 0x62, 0x71, 0x7B, 0x00, 0x8F, 0x51, 0x06, 0xF9, 0x10, 0x7F, 0x25, 0x66, 0xC0, 0x83, 0x07, 0xCE, - 0x6D, 0xF1, 0x9E, 0xDF, 0x58, 0x6B, 0xD3, 0xFE, 0x14, 0x52, 0x39, 0xE5, 0xE8, 0xC4, 0xE8, 0x17, - 0xA6, 0x98, 0x27, 0x7B, 0xAE, 0x27, 0xE5, 0x87, 0xD4, 0xBC, 0x6E, 0x00, 0xF2, 0xC7, 0x02, 0xF0, - 0x02, 0x3B, 0x95, 0x2C, 0xD5, 0x25, 0x6E, 0x0E, 0x6E, 0x26, 0xB7, 0x98, 0x6D, 0xFE, 0xBF, 0xFF, - 0xEB, 0xBF, 0x53, 0xB8, 0x3E, 0x50, 0xF5, 0x5C, 0x7F, 0x92, 0x79, 0x7A, 0xC2, 0x44, 0x3D, 0x37, - 0xB2, 0x71, 0x36, 0x20, 0x15, 0x47, 0x74, 0xE7, 0x77, 0xF5, 0x54, 0xBF, 0xF5, 0x95, 0x28, 0xF3, - 0x3E, 0x0D, 0x01, 0x2F, 0x89, 0x1F, 0x2C, 0x0C, 0xED, 0xBA, 0x49, 0xA6, 0x23, 0xF0, 0x6D, 0x2D, - 0xD0, 0x49, 0x82, 0xA5, 0x3C, 0x12, 0x89, 0x0E, 0x56, 0x09, 0x75, 0xC8, 0xAA, 0x4E, 0xF8, 0x6C, - 0x0C, 0x78, 0x51, 0x05, 0x68, 0x2E, 0x1E, 0x75, 0x1D, 0x4B, 0xF3, 0xCC, 0xE0, 0x71, 0xC1, 0x98, - 0x14, 0x0D, 0x73, 0x50, 0x80, 0x2B, 0xA5, 0x74, 0xAD, 0xFC, 0x49, 0x4F, 0xEE, 0xDF, 0xF8, 0xAB, - 0x12, 0xDA, 0xD7, 0x74, 0x43, 0xD0, 0xB5, 0x49, 0x45, 0xB3, 0x71, 0x0B, 0xD4, 0xC4, 0xF7, 0xE9, - 0x76, 0xA1, 0x73, 0xCD, 0xB2, 0x8A, 0xF7, 0x35, 0x5F, 0x9E, 0x5F, 0xEC, 0xAD, 0x31, 0xDA, 0x67, - 0x84, 0x24, 0xE2, 0x9B, 0x03, 0x94, 0x04, 0x1F, 0x4C, 0xCB, 0x42, 0x19, 0x7E, 0x08, 0x5D, 0x49, - 0x6F, 0x37, 0x9D, 0x8C, 0x15, 0x9B, 0x9E, 0x80, 0x15, 0x87, 0xF5, 0xBD, 0x43, 0x49, 0x09, 0xFD, - 0x1B, 0x52, 0x2F, 0xF4, 0x25, 0x04, 0xE8, 0x8D, 0x84, 0x00, 0x94, 0x00, 0xF2, 0x7A, 0x5C, 0xFD, - 0x3E, 0x39, 0x03, 0xCD, 0xD2, 0xC4, 0xF9, 0x2F, 0xD2, 0xFF, 0x95, 0x0C, 0x92, 0x97, 0xCE, 0x60, - 0x80, 0xFE, 0xA9, 0x59, 0xE9, 0x7E, 0x2E, 0x54, 0x84, 0x39, 0x53, 0x36, 0x5F, 0xA8, 0x16, 0x30, - 0x77, 0x2A, 0x93, 0x5A, 0x42, 0xFE, 0x12, 0x97, 0xAC, 0x34, 0xC0, 0xB8, 0x2C, 0xE2, 0x47, 0xB1, - 0xB8, 0xC6, 0x71, 0x46, 0xFE, 0x3B, 0x21, 0xD8, 0x77, 0x9A, 0xB1, 0x09, 0x51, 0x7F, 0x64, 0xD7, - 0x57, 0xBD, 0x06, 0x7A, 0x3F, 0xF4, 0x43, 0x4B, 0xAA, 0xC9, 0xE8, 0xA4, 0xC5, 0x2C, 0xF3, 0x0E, - 0x74, 0x87, 0x10, 0x2F, 0x01, 0x03, 0xCF, 0x04, 0x25, 0x39, 0xB4, 0xA4, 0x2E, 0xDC, 0xE3, 0xC2, - 0x53, 0x02, 0x85, 0x1D, 0xC0, 0xEB, 0x3B, 0xB4, 0x51, 0x12, 0x83, 0x71, 0xFA, 0xF4, 0xFC, 0xB7, - 0xB3, 0xD3, 0xFA, 0xF9, 0x87, 0x2E, 0xBB, 0xB0, 0x03, 0x3E, 0x90, 0x57, 0xB3, 0x57, 0x9A, 0x1D, - 0x6A, 0xA2, 0xFF, 0x91, 0xE3, 0xF1, 0xB4, 0x15, 0x74, 0xBE, 0x5E, 0xA2, 0xE8, 0xB1, 0xFA, 0xDC, - 0x9A, 0xC5, 0xCA, 0x39, 0x52, 0x7F, 0x3F, 0xBA, 0xBE, 0x69, 0x7F, 0x3F, 0xFE, 0xE5, 0xC2, 0x8E, - 0x29, 0x0D, 0xFE, 0x82, 0x9D, 0x41, 0x8A, 0xF8, 0x66, 0xCF, 0x5C, 0x33, 0x6D, 0x06, 0x75, 0xB0, - 0x0C, 0xAF, 0xEA, 0xE4, 0x4C, 0x97, 0x64, 0x2F, 0x4A, 0x00, 0x44, 0xCC, 0x1F, 0xF0, 0x74, 0xBC, - 0x68, 0x56, 0x67, 0xBC, 0x31, 0x68, 0x24, 0x3C, 0xAA, 0x85, 0xDD, 0xBC, 0xEF, 0x39, 0xE8, 0x8F, - 0x34, 0x26, 0xB1, 0xAF, 0x67, 0xDF, 0xEA, 0xA7, 0x1F, 0x4E, 0x12, 0xD8, 0x7A, 0xAE, 0x15, 0x34, - 0x16, 0x2C, 0xC9, 0x3E, 0x54, 0x8D, 0xDF, 0x0A, 0x7A, 0xFA, 0x3D, 0xAB, 0xDB, 0x4A, 0xC5, 0x5E, - 0x2A, 0xB8, 0x9E, 0x52, 0x4E, 0x2A, 0x89, 0x86, 0xF9, 0x60, 0x4F, 0x40, 0x2A, 0xE3, 0xA2, 0xF2, - 0x60, 0xF6, 0xCD, 0x95, 0xF2, 0x50, 0x99, 0xB9, 0x96, 0x92, 0x0E, 0x2A, 0x93, 0x0A, 0x27, 0x6C, - 0xE5, 0x2C, 0x4D, 0xE1, 0x2B, 0x68, 0xCE, 0x8E, 0x77, 0xE7, 0x1F, 0x2C, 0x8D, 0x01, 0x00, 0x09, - 0x33, 0xDD, 0xE3, 0x06, 0x34, 0x34, 0x61, 0xAF, 0xE9, 0x7C, 0x82, 0x79, 0x06, 0x0E, 0xDB, 0x11, - 0xBB, 0x67, 0xCB, 0x29, 0x35, 0xD8, 0x11, 0xC8, 0x9A, 0xD1, 0x5F, 0xB1, 0xE4, 0x09, 0x27, 0x23, - 0x5E, 0xB4, 0xD9, 0x86, 0x30, 0x37, 0x73, 0x3F, 0x88, 0xDE, 0x19, 0x07, 0x5E, 0xC4, 0x2F, 0xE3, - 0x55, 0xD9, 0x5A, 0xC6, 0xA2, 0x2A, 0x9B, 0x0C, 0x92, 0x2A, 0x1E, 0xA2, 0xB8, 0xDC, 0xD0, 0xDF, - 0x9B, 0xBD, 0x1E, 0x46, 0x3D, 0x25, 0x14, 0xF2, 0xCE, 0x84, 0x92, 0x86, 0xAF, 0xB0, 0x96, 0x42, - 0xFC, 0x45, 0x59, 0xD5, 0xBE, 0x88, 0x13, 0x63, 0xCE, 0xE4, 0xE5, 0x99, 0x15, 0xC0, 0x1E, 0xCF, - 0x1B, 0xC8, 0xCD, 0xEF, 0xA3, 0xAC, 0x46, 0x5F, 0x95, 0x70, 0xF1, 0xA4, 0x1D, 0xEC, 0x42, 0x3F, - 0xF0, 0xC9, 0x98, 0xB3, 0x8B, 0xDD, 0x9F, 0x67, 0x82, 0x66, 0x25, 0xF7, 0x37, 0x5E, 0x5A, 0xF1, - 0x6D, 0x8D, 0x9A, 0xAE, 0xF3, 0xD6, 0xB6, 0x54, 0x89, 0xB3, 0xBD, 0x82, 0x9B, 0x27, 0x26, 0x5F, - 0x78, 0xE3, 0x5A, 0xEB, 0x4E, 0x8F, 0xAD, 0x6A, 0xE8, 0x71, 0x25, 0xB7, 0xB4, 0x3C, 0x3D, 0xB6, - 0x5E, 0x02, 0x3D, 0xB6, 0x55, 0xE9, 0xB1, 0xB3, 0x82, 0x9B, 0xD7, 0x2E, 0x47, 0x8F, 0xED, 0x75, - 0xA7, 0xC7, 0x76, 0x35, 0xF4, 0xB8, 0x92, 0x5B, 0x5A, 0x9E, 0x1E, 0xDB, 0x2F, 0x81, 0x1E, 0x3B, - 0xAA, 0xF4, 0xB8, 0xB3, 0x82, 0x9B, 0xD7, 0x29, 0x47, 0x8F, 0x9D, 0x75, 0xA7, 0xC7, 0x4E, 0x35, - 0xF4, 0xB8, 0x92, 0x5B, 0x5A, 0x9E, 0x1E, 0x3B, 0xCF, 0x49, 0x8F, 0xB1, 0xDD, 0x83, 0xCC, 0x0C, - 0x37, 0xB0, 0xEC, 0xC9, 0x9B, 0x44, 0x25, 0xC3, 0x67, 0xBC, 0xD9, 0xA2, 0xA7, 0x6F, 0xF7, 0xDC, - 0x3B, 0xEA, 0xD6, 0x0E, 0x23, 0x43, 0x0B, 0x67, 0x57, 0x8E, 0x51, 0xDC, 0x93, 0x32, 0x3D, 0xB5, - 0x5A, 0x66, 0xBA, 0x72, 0x90, 0x0A, 0xFC, 0x29, 0x5B, 0xB5, 0xC3, 0xA3, 0x6E, 0x29, 0xFF, 0xBB, - 0x66, 0xED, 0x10, 0x6D, 0x12, 0x2B, 0xE9, 0x78, 0x77, 0xD4, 0x4D, 0xB8, 0xDD, 0xC9, 0x88, 0x4B, - 0x61, 0xF7, 0xF0, 0x1C, 0xCD, 0xD0, 0x35, 0x3F, 0x88, 0xDC, 0x91, 0x75, 0x9D, 0xFB, 0x3E, 0xA3, - 0xE8, 0x3E, 0x86, 0x71, 0xC5, 0xDC, 0x60, 0xD7, 0x37, 0x7F, 0xAD, 0x0B, 0x30, 0x37, 0x18, 0xF4, - 0x45, 0x86, 0x97, 0xFC, 0xDE, 0x12, 0x71, 0xC7, 0xE8, 0x50, 0x6D, 0x89, 0x77, 0xD1, 0xFE, 0x92, - 0x70, 0xD5, 0x26, 0xA3, 0x0B, 0x46, 0xD4, 0x63, 0x63, 0x91, 0xF7, 0x04, 0x06, 0xB9, 0xE8, 0xA2, - 0x2B, 0xB4, 0x07, 0x83, 0xAF, 0x85, 0x0D, 0xA6, 0x9C, 0x6D, 0xF6, 0xE6, 0xA4, 0xCB, 0xB6, 0xD9, - 0xF7, 0xD3, 0xEE, 0x4B, 0x32, 0xD0, 0xC2, 0xA2, 0x60, 0x45, 0xA5, 0x4C, 0xB4, 0xA9, 0xA6, 0xF9, - 0x1B, 0x90, 0x05, 0x59, 0xC6, 0x52, 0x1B, 0xE8, 0xEE, 0x77, 0xC3, 0x5D, 0x29, 0x5B, 0xED, 0x9C, - 0x45, 0x55, 0x60, 0xAD, 0xAD, 0xFA, 0x1A, 0xEA, 0x46, 0x77, 0x4F, 0x2C, 0x13, 0xB8, 0x4A, 0xED, - 0x10, 0xC1, 0x2D, 0x3E, 0x2F, 0xE3, 0x56, 0x69, 0x3C, 0xF0, 0x4C, 0x8A, 0x8F, 0x13, 0xB0, 0x05, - 0xD1, 0xFB, 0xC7, 0xCE, 0x0F, 0x4E, 0x49, 0xE6, 0x96, 0xC5, 0x42, 0xFB, 0x4C, 0xCC, 0xD8, 0xD8, - 0x9A, 0xC6, 0xF0, 0x62, 0x56, 0xE7, 0x86, 0xFE, 0x50, 0x78, 0x3A, 0x63, 0x3A, 0x45, 0x60, 0x72, - 0x03, 0xF3, 0x9E, 0xDB, 0x84, 0xC8, 0xBE, 0x28, 0x85, 0x82, 0x49, 0x11, 0x13, 0xDF, 0xA0, 0xBF, - 0x73, 0x63, 0x0D, 0xEE, 0xA3, 0x52, 0xA2, 0x42, 0xBC, 0x15, 0xC5, 0xD3, 0x85, 0x94, 0xC9, 0xC8, - 0x10, 0x0F, 0x87, 0xB1, 0x13, 0xB5, 0x52, 0x5E, 0x46, 0x58, 0xD2, 0xA1, 0x42, 0xD7, 0x98, 0xD8, - 0xED, 0x05, 0xF6, 0x95, 0x3C, 0xD6, 0x61, 0xB7, 0x43, 0x3F, 0x99, 0xC7, 0xA9, 0xFD, 0x61, 0x67, - 0xFF, 0x2D, 0x41, 0x41, 0x51, 0x59, 0x3A, 0xBD, 0xD3, 0xCA, 0xF9, 0x08, 0x52, 0xCD, 0x9E, 0x27, - 0xFD, 0x40, 0xF5, 0xC8, 0x8E, 0xF5, 0x60, 0x4A, 0x21, 0x3B, 0x36, 0xC4, 0xBE, 0xE6, 0x42, 0x6F, - 0xCC, 0xEF, 0x0F, 0x9E, 0xD1, 0x6D, 0x0C, 0x45, 0x7C, 0xF2, 0x98, 0x17, 0x12, 0x60, 0xE4, 0xA9, - 0x32, 0xC4, 0x55, 0x3C, 0x0C, 0x4D, 0x7D, 0x28, 0x1C, 0x5A, 0x60, 0xAE, 0x3A, 0xCD, 0x55, 0x5C, - 0xF5, 0x47, 0x17, 0x77, 0xC8, 0x70, 0x29, 0x44, 0xA4, 0xF1, 0x46, 0x6D, 0xA5, 0xA9, 0x4D, 0xA0, - 0x9A, 0xFA, 0x2D, 0x5A, 0x1E, 0xE9, 0x61, 0x1F, 0x2B, 0x95, 0xF9, 0xA3, 0xBC, 0xDD, 0xC2, 0xCD, - 0x93, 0x52, 0xCA, 0xAC, 0xED, 0x59, 0xFD, 0x8B, 0x60, 0xE6, 0x22, 0x5D, 0xBB, 0x10, 0xEC, 0xC4, - 0xE7, 0x25, 0x09, 0x76, 0x72, 0x60, 0x65, 0xC1, 0x4E, 0xBC, 0xBF, 0x2A, 0x82, 0x1D, 0x68, 0xBE, - 0xCE, 0x03, 0x33, 0xED, 0x5B, 0x27, 0x04, 0x91, 0x8E, 0x38, 0x8F, 0x10, 0xF5, 0x28, 0x75, 0x63, - 0x5A, 0xCC, 0xCB, 0x11, 0xE7, 0xA4, 0x37, 0x6B, 0xC4, 0xAE, 0x30, 0x27, 0xB7, 0x68, 0xBE, 0x9A, - 0x2E, 0x06, 0xF3, 0x24, 0xBD, 0x64, 0x29, 0xBC, 0x25, 0x48, 0x7A, 0x62, 0xB8, 0x37, 0x49, 0xEF, - 0xE5, 0x9F, 0x3D, 0x89, 0x9D, 0x2E, 0x72, 0xDC, 0x8C, 0x9B, 0xBD, 0xCC, 0xE3, 0x46, 0xAC, 0x6F, - 0xED, 0x8E, 0x9B, 0xEF, 0x46, 0x7C, 0xDC, 0xA0, 0xC1, 0x66, 0x79, 0xC7, 0xCD, 0x78, 0x60, 0xB5, - 0xE3, 0x26, 0x34, 0xDC, 0x55, 0x39, 0x68, 0xC6, 0x06, 0x58, 0x3A, 0x4B, 0x7C, 0xE8, 0x96, 0xDB, - 0x3A, 0x17, 0x95, 0x13, 0xD0, 0xEE, 0xB5, 0x6E, 0xC7, 0x45, 0x68, 0x3C, 0x21, 0x93, 0x68, 0x99, - 0x03, 0x23, 0x34, 0x56, 0xF5, 0xC0, 0x40, 0x22, 0xC8, 0x3F, 0x30, 0x5A, 0xCD, 0x56, 0xAB, 0xF9, - 0x76, 0x62, 0x14, 0x3D, 0x31, 0xD2, 0x5B, 0xAD, 0x7C, 0x62, 0xA4, 0x9A, 0xBD, 0xC0, 0x13, 0x23, - 0x66, 0x7F, 0x55, 0x9E, 0x18, 0xE5, 0x6E, 0x38, 0x44, 0x5A, 0xBA, 0x17, 0x74, 0xBB, 0x41, 0x0B, - 0x2A, 0x75, 0xB9, 0x91, 0x6C, 0x99, 0x0F, 0xFA, 0x24, 0xB0, 0x32, 0xF7, 0x1A, 0x94, 0x3F, 0x6C, - 0xA5, 0xAE, 0x35, 0x66, 0x2F, 0x67, 0x05, 0x6F, 0x35, 0xCE, 0x7C, 0xF7, 0x2B, 0xD2, 0xD0, 0x59, - 0xAF, 0x5B, 0x87, 0x0F, 0x4B, 0x29, 0x3E, 0x10, 0x8D, 0xB9, 0xC4, 0x94, 0x58, 0x94, 0xF9, 0x09, - 0x03, 0x5D, 0x60, 0x9D, 0x9D, 0x76, 0x94, 0x37, 0x25, 0xCE, 0x30, 0x25, 0xAE, 0x72, 0x81, 0x04, - 0xEA, 0xF4, 0x61, 0x0B, 0xCD, 0x6C, 0xF1, 0xA3, 0x11, 0x1C, 0x46, 0xA6, 0xB8, 0xEB, 0x25, 0x84, - 0x23, 0x07, 0x7B, 0x2A, 0xF8, 0x24, 0xCB, 0x40, 0xF9, 0x3E, 0x05, 0x7A, 0x7D, 0x71, 0x1E, 0xF8, - 0x3D, 0x66, 0xAE, 0x38, 0x86, 0x15, 0x07, 0x8E, 0x13, 0x0C, 0x59, 0xAF, 0xDB, 0xC5, 0xB1, 0x6C, - 0x27, 0x18, 0x0F, 0x17, 0x90, 0x16, 0xEC, 0xA3, 0x31, 0x0F, 0xF3, 0x4E, 0xFC, 0x05, 0x1F, 0x27, - 0x9A, 0x1C, 0x5F, 0x9E, 0x25, 0x8E, 0xC0, 0x6F, 0xFD, 0xFE, 0xDA, 0xE5, 0x68, 0x21, 0x20, 0x95, - 0x4D, 0x35, 0x91, 0x8F, 0xF0, 0xF3, 0xAA, 0xA2, 0xD1, 0xB6, 0x5C, 0x1D, 0x9D, 0xC4, 0x05, 0x44, - 0x68, 0x0E, 0xF0, 0x60, 0x7A, 0xED, 0x90, 0xA3, 0xA3, 0x83, 0xE3, 0xE3, 0x83, 0x93, 0x93, 0x83, - 0xD3, 0xD3, 0x83, 0xB3, 0xB3, 0x83, 0xF3, 0xF3, 0xB2, 0x3E, 0x23, 0xA5, 0x67, 0xDD, 0xD5, 0x4C, - 0xCC, 0xC8, 0x46, 0x93, 0xF7, 0x0F, 0x8A, 0xE5, 0x3E, 0x50, 0xE9, 0x3F, 0x71, 0x02, 0xBA, 0x9C, - 0x7B, 0x00, 0x0D, 0x7F, 0x56, 0x29, 0x15, 0x9B, 0x57, 0x74, 0xB2, 0x2F, 0x40, 0x90, 0x5D, 0x4C, - 0x29, 0x2B, 0x2A, 0x9F, 0x17, 0xD8, 0xB8, 0x0F, 0x62, 0x13, 0xA6, 0x55, 0xB7, 0x62, 0xB9, 0x72, - 0xB2, 0x9A, 0x01, 0x3F, 0x56, 0xA7, 0xDC, 0x78, 0x18, 0x2C, 0x71, 0x68, 0xC8, 0x60, 0x50, 0xE0, - 0x6F, 0x5E, 0xC8, 0x41, 0xBA, 0x86, 0x6F, 0x25, 0x2A, 0xA8, 0x95, 0xC2, 0x5A, 0xE0, 0x5D, 0x43, - 0x22, 0x35, 0xFE, 0x83, 0x23, 0xF5, 0x30, 0x7F, 0x8B, 0xF1, 0x1F, 0x66, 0x80, 0x3E, 0x32, 0x52, - 0x6E, 0x11, 0xCE, 0x2D, 0x64, 0xE4, 0xA3, 0xEB, 0x08, 0x9F, 0x07, 0xB0, 0x99, 0x12, 0xD0, 0xA2, - 0xB4, 0xCF, 0x06, 0xAE, 0x6A, 0x03, 0x0D, 0x7B, 0x3E, 0xC7, 0x7C, 0xE5, 0xDF, 0x6D, 0x33, 0x90, - 0x71, 0x47, 0xFE, 0x83, 0xE6, 0x22, 0xC5, 0x46, 0xB7, 0x19, 0xDC, 0x97, 0x1E, 0x30, 0x00, 0x63, - 0x18, 0x7E, 0x34, 0x0A, 0x6D, 0xCA, 0x5B, 0x65, 0x0F, 0x90, 0x63, 0xDA, 0xC0, 0xC6, 0x80, 0x21, - 0x3F, 0xE0, 0xB5, 0xB0, 0xDD, 0x78, 0xB5, 0x41, 0xED, 0x45, 0x53, 0xF4, 0x28, 0x47, 0xC2, 0x17, - 0x14, 0x1A, 0xCE, 0x1D, 0x94, 0xFF, 0x24, 0xCD, 0x44, 0x31, 0xB9, 0xE2, 0x21, 0x86, 0x98, 0x29, - 0xED, 0x4E, 0x84, 0xEB, 0xAA, 0x59, 0x2C, 0x9E, 0x2E, 0x76, 0xA4, 0x66, 0xAD, 0x34, 0xC7, 0xD0, - 0xA6, 0x0E, 0xB9, 0xF1, 0x8C, 0xA4, 0x08, 0xC4, 0x45, 0xD9, 0x02, 0x34, 0x5D, 0x37, 0x31, 0xC4, - 0x0F, 0x64, 0x18, 0x83, 0x5B, 0x3C, 0x8A, 0x55, 0x77, 0xC5, 0x21, 0x22, 0x2B, 0x57, 0xA2, 0x64, - 0x11, 0xC1, 0x80, 0x8D, 0x42, 0xBC, 0xDE, 0x34, 0x3D, 0x3F, 0x10, 0x39, 0xE2, 0x68, 0x25, 0xF0, - 0xB1, 0x8F, 0xB1, 0xEB, 0x14, 0xEA, 0x27, 0x68, 0x15, 0xC8, 0x93, 0x28, 0x78, 0xBE, 0xD5, 0x7D, - 0x1D, 0x28, 0xEB, 0x69, 0xC7, 0xE5, 0xAC, 0x73, 0x22, 0x85, 0x3F, 0xD3, 0xEA, 0x20, 0x16, 0x3B, - 0x13, 0xFA, 0xD4, 0xA5, 0x10, 0x04, 0x26, 0xCF, 0x86, 0xC3, 0x31, 0x49, 0x15, 0x3F, 0x1A, 0xDC, - 0xBC, 0x69, 0x5F, 0xF9, 0x83, 0x8C, 0xE2, 0xDB, 0x0B, 0xC9, 0x97, 0xB1, 0x32, 0xB5, 0x7E, 0xFD, - 0x38, 0x9A, 0xEF, 0xDA, 0xCE, 0xC3, 0x71, 0x64, 0x60, 0xAC, 0x1D, 0xC6, 0x1F, 0xD9, 0x37, 0x51, - 0x96, 0x95, 0x2F, 0x89, 0x49, 0x65, 0x26, 0xF2, 0xFC, 0xDC, 0x87, 0x2A, 0xEC, 0xA0, 0x78, 0xB2, - 0x15, 0x55, 0xA8, 0x85, 0x53, 0x1A, 0x45, 0x49, 0x71, 0x56, 0xFB, 0xDC, 0x36, 0x7C, 0xBC, 0x03, - 0x14, 0x8E, 0x06, 0xF7, 0xA6, 0x96, 0xB0, 0xD3, 0x06, 0x0E, 0x7D, 0x43, 0xEA, 0x96, 0x8F, 0x95, - 0x6C, 0x3D, 0x4C, 0x51, 0x09, 0x6C, 0x07, 0x4E, 0xF3, 0xA1, 0x76, 0xCF, 0x59, 0xA4, 0x70, 0x4A, - 0x7B, 0x6F, 0xB9, 0x3C, 0x19, 0xEB, 0x7C, 0xCC, 0x57, 0x9A, 0xCF, 0x20, 0x59, 0x3F, 0xB0, 0xEB, - 0x99, 0x0E, 0xA6, 0x6E, 0x7A, 0x49, 0x06, 0xA6, 0xC4, 0xFA, 0xA2, 0xE5, 0x95, 0x32, 0x37, 0x4D, - 0xEF, 0x27, 0x7F, 0x13, 0x93, 0x70, 0xCD, 0x35, 0x41, 0x25, 0x6A, 0x15, 0x2E, 0xD8, 0x10, 0x55, - 0xD0, 0x12, 0x55, 0x64, 0xA5, 0x95, 0xE5, 0x46, 0x50, 0x8F, 0x73, 0x49, 0xC0, 0xAD, 0xE7, 0x84, - 0x1E, 0x9C, 0x41, 0x97, 0x66, 0x9F, 0xA3, 0x41, 0x24, 0xE7, 0x72, 0x62, 0x27, 0x56, 0xBA, 0xF6, - 0xE8, 0xC3, 0xDE, 0xC4, 0xE5, 0x44, 0x72, 0x9F, 0x44, 0x7F, 0x2C, 0xEA, 0xEF, 0x60, 0xC9, 0xA9, - 0x8B, 0x8E, 0x92, 0xD9, 0x56, 0x7C, 0x31, 0x17, 0x51, 0xDE, 0x14, 0xF8, 0x60, 0x9F, 0xD9, 0x8E, - 0x60, 0x97, 0x20, 0x75, 0x61, 0x92, 0x20, 0xF3, 0x5E, 0xA6, 0x1E, 0xA7, 0x1A, 0x50, 0x23, 0xCD, - 0x7E, 0x94, 0xD9, 0xD2, 0xFD, 0xC6, 0x98, 0x90, 0x23, 0x1F, 0x2E, 0xE1, 0x3A, 0x21, 0x1D, 0x66, - 0x49, 0x27, 0xC2, 0xAC, 0x61, 0x98, 0xB0, 0x41, 0x8C, 0x23, 0x0B, 0x8F, 0x1F, 0xB0, 0x5D, 0xAA, - 0x23, 0x0E, 0xBA, 0x6A, 0xD4, 0xD7, 0xEA, 0xE6, 0x1C, 0x52, 0x8F, 0x4C, 0xDA, 0x90, 0x38, 0x20, - 0xAE, 0xA6, 0x76, 0x36, 0xD4, 0x23, 0x93, 0x36, 0x44, 0xF2, 0xC3, 0x8D, 0xA8, 0xA3, 0xE4, 0x9D, - 0xC9, 0x46, 0x86, 0x8A, 0xB3, 0xD8, 0x58, 0xDE, 0x26, 0xE4, 0xB2, 0xD9, 0x5D, 0x2F, 0xFC, 0xE6, - 0x5A, 0x29, 0x5F, 0xC9, 0x24, 0xE5, 0x8C, 0x4F, 0x90, 0x65, 0xE5, 0x30, 0x39, 0xF2, 0x31, 0x19, - 0x1E, 0x61, 0xB5, 0x1B, 0xE1, 0x3C, 0xE8, 0x36, 0x5C, 0xD3, 0x87, 0xA9, 0x62, 0xB0, 0x11, 0x96, - 0x93, 0xF4, 0x8C, 0xD1, 0x31, 0x5A, 0x44, 0x60, 0x80, 0xEE, 0xA6, 0xAD, 0x7B, 0x1C, 0xB3, 0x08, - 0xA3, 0x8D, 0x21, 0xEA, 0x26, 0x7A, 0x97, 0x1C, 0x25, 0x25, 0xAD, 0x50, 0x96, 0xEC, 0x3B, 0x7C, - 0x8F, 0x1E, 0x5B, 0xCE, 0x03, 0x3C, 0x6D, 0x50, 0x19, 0x8D, 0x01, 0x9A, 0x21, 0x3C, 0xB4, 0xCE, - 0x22, 0x59, 0x92, 0x7B, 0xD2, 0x46, 0x0F, 0xA5, 0x95, 0x14, 0xEF, 0xDF, 0x28, 0xA0, 0x32, 0xAD, - 0x64, 0x2E, 0x94, 0xE4, 0x59, 0x2F, 0x19, 0xEA, 0xE8, 0x47, 0x1D, 0x0B, 0x25, 0x08, 0x6C, 0xC9, - 0x22, 0x6E, 0x84, 0x0F, 0x58, 0x4A, 0x7D, 0x16, 0x41, 0x14, 0x2A, 0x18, 0x1F, 0x8D, 0x81, 0x9D, - 0x1F, 0xD3, 0xBB, 0xCD, 0xDA, 0x61, 0x73, 0xBE, 0x86, 0xF3, 0xD4, 0x51, 0x5A, 0xB5, 0xC3, 0xD6, - 0xE2, 0x47, 0x81, 0x9D, 0x6C, 0x2F, 0x7E, 0x14, 0xD0, 0x82, 0x3A, 0x8B, 0x1F, 0x65, 0xA7, 0x76, - 0xB8, 0xB3, 0xF8, 0x51, 0x76, 0x6B, 0x87, 0xBB, 0x8B, 0x1F, 0x65, 0xAF, 0x76, 0xB8, 0xA7, 0x32, - 0x8A, 0x57, 0x74, 0x0A, 0x53, 0x48, 0x46, 0x6A, 0x35, 0x25, 0x0D, 0x06, 0xB1, 0xA1, 0x00, 0x98, - 0x0D, 0x0F, 0x6E, 0x9C, 0x93, 0xE9, 0x03, 0xA0, 0x97, 0xCE, 0x35, 0xBE, 0x85, 0xFC, 0x2D, 0x7A, - 0x38, 0x7B, 0xA5, 0x95, 0x6A, 0x20, 0xBD, 0x47, 0x3F, 0xE0, 0xA3, 0x97, 0xA4, 0x73, 0x88, 0x15, - 0x95, 0x52, 0x33, 0x52, 0x4D, 0xF3, 0x81, 0x9F, 0x82, 0x57, 0x46, 0xA9, 0xF0, 0x45, 0xF3, 0x95, - 0xD2, 0x27, 0xE6, 0x2C, 0xE9, 0x09, 0xF5, 0xFF, 0x42, 0xD7, 0x72, 0x34, 0xE3, 0x2B, 0x7F, 0x38, - 0x97, 0x65, 0x77, 0x4E, 0xCD, 0xFB, 0x82, 0x85, 0x69, 0x66, 0x9B, 0x78, 0x26, 0x06, 0xA8, 0x1D, - 0x4A, 0xE8, 0x47, 0x0F, 0x54, 0x2A, 0xA6, 0xE3, 0x39, 0x4E, 0x57, 0x8B, 0xC1, 0x5D, 0xD4, 0xEC, - 0x6F, 0xDC, 0xC3, 0xAB, 0xDF, 0xEF, 0xEE, 0xC0, 0xD3, 0x0C, 0x3E, 0xFD, 0x72, 0xED, 0xBE, 0xD9, - 0x68, 0x3E, 0xE5, 0xDC, 0x9E, 0x23, 0x1E, 0x6B, 0x16, 0x48, 0x4F, 0x00, 0x76, 0xF4, 0x8A, 0xF3, - 0xE6, 0xC9, 0x23, 0xB3, 0x2C, 0x9C, 0x27, 0x08, 0xBA, 0x24, 0x9C, 0x54, 0xEE, 0xC3, 0xE6, 0x2B, - 0x46, 0x31, 0x17, 0xD3, 0x33, 0xFD, 0x23, 0xCF, 0xA2, 0x31, 0x49, 0x03, 0x82, 0x2F, 0xE2, 0x0D, - 0x19, 0x63, 0xEE, 0x92, 0xB5, 0x37, 0x31, 0x9D, 0xB8, 0x7E, 0x2E, 0xF0, 0x52, 0x9F, 0x73, 0xD2, - 0xDB, 0x60, 0x76, 0x71, 0x5D, 0x28, 0x90, 0xFF, 0xC6, 0xA9, 0xF1, 0x62, 0xED, 0x4D, 0xDC, 0x94, - 0xAD, 0xAC, 0xAE, 0x95, 0x50, 0x4A, 0xA2, 0x85, 0x44, 0x1B, 0x8E, 0x76, 0x61, 0xA1, 0x74, 0xCC, - 0x35, 0xC7, 0x56, 0x7A, 0x91, 0x74, 0x7D, 0x32, 0x26, 0xC9, 0x23, 0x0A, 0x26, 0x38, 0xE6, 0xA0, - 0x1B, 0x8F, 0xB1, 0x60, 0x79, 0xB7, 0x43, 0xC9, 0xA9, 0x3C, 0x93, 0xBD, 0x95, 0xD6, 0x1E, 0xE3, - 0x18, 0x9E, 0x2A, 0x9A, 0x69, 0xFB, 0x52, 0xD9, 0x47, 0x25, 0x85, 0xF5, 0xB9, 0x16, 0x84, 0x68, - 0x48, 0x00, 0xEA, 0x00, 0x25, 0xE6, 0x91, 0x49, 0xCF, 0x12, 0x3F, 0xC0, 0x25, 0x34, 0xD8, 0x57, - 0xF8, 0x13, 0x04, 0x04, 0x67, 0x04, 0x53, 0x30, 0xA4, 0x61, 0xA1, 0x6F, 0x72, 0x0B, 0x74, 0x19, - 0xC7, 0xBB, 0x7B, 0x41, 0x17, 0xA7, 0x33, 0x05, 0xB7, 0x22, 0xDC, 0x52, 0x94, 0x1B, 0x33, 0xEF, - 0x3F, 0xF3, 0x20, 0xC5, 0xF8, 0x32, 0xAC, 0xDC, 0x76, 0x6C, 0xFE, 0x14, 0xCE, 0x9A, 0xED, 0xBE, - 0x5A, 0xBE, 0x3A, 0x48, 0xF5, 0x8E, 0x5C, 0xF5, 0xBB, 0x6B, 0x50, 0x65, 0x3D, 0x87, 0xDD, 0x77, - 0x1A, 0xAD, 0x9D, 0x46, 0x6B, 0x57, 0x95, 0xA3, 0x0A, 0xB8, 0x1C, 0x7E, 0x74, 0x3D, 0x67, 0x40, - 0xF7, 0xFA, 0x49, 0x7E, 0x21, 0xBA, 0xED, 0xCA, 0xAF, 0x8E, 0x35, 0x2F, 0x26, 0xA5, 0x16, 0x68, - 0x8D, 0x23, 0xED, 0x07, 0x7C, 0x68, 0x36, 0xD5, 0x90, 0x5E, 0x42, 0xF8, 0xC1, 0x34, 0x82, 0xE1, - 0x41, 0xA7, 0xD9, 0x24, 0x4F, 0x0E, 0xE0, 0x41, 0xB2, 0x73, 0xE5, 0x2B, 0xAE, 0xFC, 0xB9, 0xCD, - 0xB8, 0xE9, 0xEA, 0xBC, 0xFF, 0x27, 0x85, 0xCB, 0x2E, 0x09, 0x87, 0x85, 0x64, 0x91, 0x51, 0x3D, - 0xB0, 0xD3, 0x9C, 0x34, 0xAB, 0x39, 0x14, 0xC8, 0xCC, 0x83, 0x25, 0xC7, 0x6B, 0x32, 0x47, 0xCC, - 0x2D, 0x10, 0x33, 0xFD, 0x49, 0x92, 0x66, 0x78, 0x3B, 0x32, 0x83, 0x08, 0x73, 0xCE, 0xE9, 0xB9, - 0x63, 0x8B, 0x7A, 0x62, 0x49, 0xD0, 0xA2, 0x00, 0xF5, 0xB3, 0x66, 0x06, 0x78, 0x3D, 0xB9, 0x3D, - 0x7B, 0x60, 0xF1, 0x32, 0x3B, 0xBE, 0xF8, 0xFA, 0x04, 0xAB, 0x5F, 0xA5, 0xE6, 0xA5, 0x88, 0x18, - 0x80, 0x8F, 0x86, 0xB6, 0x19, 0x6C, 0xF8, 0x63, 0x26, 0x7B, 0xFB, 0xC8, 0x84, 0x74, 0x48, 0x8E, - 0x26, 0x20, 0x59, 0xDB, 0x48, 0x86, 0x08, 0x1F, 0x91, 0x23, 0x9B, 0x2E, 0xD4, 0xA3, 0xA0, 0x34, - 0xE6, 0x0E, 0x81, 0x0D, 0xA0, 0x6F, 0x60, 0xF7, 0xE4, 0xB9, 0xEC, 0x3E, 0xB3, 0x35, 0xD3, 0x2C, - 0x45, 0xE0, 0xCA, 0xCA, 0xDC, 0xF9, 0xCE, 0x42, 0xEE, 0xA9, 0x1C, 0x36, 0x16, 0xE8, 0x61, 0xAC, - 0xA0, 0x17, 0x00, 0xC8, 0x9F, 0x52, 0x66, 0x32, 0xEE, 0x24, 0x16, 0xD6, 0x2F, 0x60, 0xEF, 0xB0, - 0x1C, 0x29, 0x3D, 0x2D, 0x9C, 0x1A, 0x69, 0xDC, 0x5F, 0x7A, 0x8E, 0x15, 0x55, 0xB8, 0xBD, 0x76, - 0xEE, 0x4B, 0x56, 0xA6, 0x6D, 0xD5, 0x0E, 0x8F, 0x35, 0x9F, 0x97, 0xAC, 0x6A, 0x7B, 0xF8, 0xF5, - 0xA6, 0xBB, 0x7A, 0xC9, 0x94, 0xBA, 0xA1, 0xF4, 0x72, 0x15, 0x3B, 0x67, 0xDA, 0x70, 0x10, 0x79, - 0x0E, 0x39, 0xC7, 0x52, 0xA1, 0x37, 0x94, 0xF6, 0x6F, 0x44, 0xB6, 0xA5, 0xD8, 0xBD, 0xAB, 0x4B, - 0xEE, 0x5D, 0xDF, 0x6C, 0xFC, 0x92, 0x0C, 0x19, 0x8D, 0xB5, 0xF3, 0x7C, 0xB5, 0x9C, 0xC1, 0x8D, - 0xD3, 0x3B, 0x05, 0xC5, 0xDD, 0x78, 0xEE, 0xFA, 0x83, 0x71, 0xE1, 0x0E, 0xAC, 0xA4, 0x01, 0xD0, - 0xEF, 0x9D, 0x32, 0x9C, 0xD6, 0xB2, 0x4A, 0x0E, 0x3E, 0x57, 0xDD, 0x90, 0x8B, 0x3E, 0x70, 0xF1, - 0x91, 0xA9, 0x7B, 0xB0, 0x0D, 0x64, 0x82, 0x60, 0xA4, 0x97, 0x05, 0xC4, 0xBF, 0xB7, 0xC8, 0x25, - 0x61, 0x04, 0xAC, 0x4F, 0x43, 0x43, 0x7F, 0x74, 0xAB, 0x06, 0xBB, 0x36, 0x48, 0x39, 0x20, 0xC8, - 0x02, 0x82, 0xEB, 0x5F, 0x01, 0x30, 0xB9, 0x15, 0xF3, 0x1C, 0xB2, 0x97, 0x53, 0x7B, 0x0D, 0x44, - 0x44, 0x98, 0xCF, 0xCD, 0xBC, 0x6B, 0x5E, 0x11, 0x83, 0xF6, 0x7E, 0xE2, 0x9A, 0xF7, 0x4A, 0xFB, - 0x11, 0x95, 0xCD, 0x51, 0x92, 0x31, 0xA9, 0xEA, 0xDF, 0xE6, 0xC8, 0xB4, 0x15, 0xCA, 0xFC, 0x2D, - 0x40, 0xAF, 0x4B, 0x20, 0xE6, 0x37, 0x5B, 0x17, 0x12, 0x08, 0x40, 0x00, 0x31, 0x4E, 0xD4, 0x9C, - 0x44, 0x3B, 0x82, 0x3E, 0x34, 0xF9, 0x3D, 0x22, 0xA7, 0x25, 0x16, 0x26, 0x73, 0x26, 0xE1, 0x55, - 0x56, 0x83, 0xDD, 0xA0, 0x5D, 0x41, 0x54, 0xA8, 0x8E, 0x4A, 0xDB, 0x58, 0x78, 0xC5, 0x8B, 0xEF, - 0x59, 0x0E, 0xFC, 0x00, 0x01, 0x72, 0x24, 0xDC, 0x73, 0x6C, 0x9C, 0xD7, 0x16, 0xAA, 0x82, 0x81, - 0xA9, 0x33, 0x3F, 0xF4, 0xEE, 0xF9, 0xA3, 0x4F, 0x7E, 0x38, 0xD0, 0x99, 0x87, 0xAA, 0x64, 0x54, - 0x87, 0x0E, 0x13, 0x87, 0xC0, 0xE8, 0xC9, 0x48, 0xBB, 0x1D, 0x80, 0x3D, 0x80, 0x29, 0x0C, 0xB8, - 0x1F, 0x5F, 0x22, 0xB7, 0xB0, 0x71, 0x7B, 0x7F, 0x7F, 0xFC, 0x8D, 0xA2, 0xFE, 0xB8, 0x50, 0x1D, - 0x52, 0x55, 0x8F, 0x54, 0x92, 0x33, 0x73, 0x85, 0xE5, 0x19, 0x95, 0xF2, 0x48, 0x41, 0xF3, 0x47, - 0xC0, 0x46, 0x64, 0x39, 0xF9, 0x31, 0x3A, 0x2B, 0xEB, 0x2B, 0xE3, 0x36, 0x15, 0x04, 0xD9, 0x2D, - 0x93, 0x6A, 0x65, 0x4D, 0xC0, 0x27, 0xD0, 0xAD, 0xD2, 0xE6, 0xA2, 0x12, 0xC2, 0x2E, 0x65, 0xC5, - 0x44, 0x22, 0xDD, 0x85, 0x53, 0x25, 0x10, 0x58, 0x9A, 0x34, 0xD2, 0x84, 0xA9, 0x91, 0xF1, 0x0F, - 0x89, 0x36, 0x3A, 0x32, 0xF0, 0xA6, 0x19, 0xB3, 0x54, 0xE4, 0xD1, 0x27, 0x7D, 0x87, 0xF4, 0x29, - 0xE2, 0x86, 0x2C, 0x3A, 0x60, 0x64, 0xA4, 0xB2, 0x26, 0x88, 0x56, 0x10, 0xE7, 0x2B, 0xA2, 0xBF, - 0x05, 0x13, 0xA0, 0x72, 0xB5, 0xCA, 0x14, 0x09, 0x3E, 0xBD, 0x44, 0x65, 0xA1, 0xDA, 0x93, 0x80, - 0x05, 0x42, 0xBF, 0x96, 0x43, 0x29, 0x92, 0x61, 0x82, 0x86, 0x15, 0x6B, 0x54, 0x4E, 0x68, 0x52, - 0x99, 0x81, 0x13, 0xAC, 0x20, 0x65, 0x6F, 0x22, 0x51, 0x91, 0x54, 0x5F, 0xD4, 0x98, 0x0E, 0x04, - 0x0A, 0x29, 0x23, 0x1C, 0xFE, 0x4B, 0x2C, 0xF3, 0xAB, 0x36, 0x9A, 0x71, 0x21, 0xD2, 0x3B, 0x3F, - 0xFB, 0x1D, 0x46, 0x6B, 0x84, 0xB7, 0x3F, 0x8A, 0xE1, 0x9D, 0x2A, 0x3F, 0x5F, 0x85, 0x92, 0xB3, - 0x4F, 0x0D, 0x5A, 0x9A, 0x6D, 0x54, 0x84, 0x73, 0xDE, 0x43, 0xAB, 0x1F, 0x80, 0xB1, 0x22, 0x73, - 0xE2, 0x84, 0x59, 0x31, 0x31, 0x04, 0xDA, 0x14, 0x7B, 0xF8, 0x27, 0xDD, 0xD2, 0xC0, 0x03, 0x75, - 0x4F, 0xF4, 0xC5, 0xCA, 0x55, 0x27, 0x96, 0x83, 0xB1, 0x43, 0x64, 0xA7, 0x09, 0x3D, 0x0F, 0x23, - 0x25, 0x90, 0x51, 0x93, 0x7F, 0x32, 0xCE, 0xD7, 0x97, 0xDC, 0xDB, 0xB1, 0xF9, 0x1A, 0xB2, 0xCF, - 0xC5, 0x60, 0x71, 0xAC, 0x6F, 0xB6, 0x32, 0x0C, 0xA0, 0xCA, 0xAB, 0x9D, 0xA3, 0xEB, 0x6E, 0xB6, - 0x3E, 0x26, 0x3C, 0x2A, 0x54, 0xF4, 0xB2, 0x22, 0x5D, 0x34, 0x31, 0x93, 0xE7, 0xF7, 0xA9, 0x4F, - 0x66, 0x38, 0x41, 0xA4, 0x3D, 0xC2, 0x4C, 0x26, 0xB6, 0xC6, 0xAE, 0x79, 0x9F, 0x7B, 0x98, 0xD3, - 0x84, 0x75, 0x1D, 0xDF, 0x24, 0x1B, 0x0F, 0x19, 0x20, 0x29, 0xCE, 0xB8, 0xD5, 0x6C, 0xEE, 0x6E, - 0xC3, 0x8F, 0xBD, 0x58, 0x00, 0xD1, 0x0C, 0x83, 0x92, 0xF9, 0x49, 0x0F, 0xB6, 0xC1, 0x3A, 0x5D, - 0xED, 0xA8, 0x1D, 0x97, 0xD9, 0xBD, 0x7B, 0x4A, 0xED, 0xFA, 0x27, 0xF3, 0xF2, 0xEC, 0x91, 0x3A, - 0x9E, 0x16, 0xD6, 0x07, 0xF5, 0x00, 0xE9, 0x4A, 0x89, 0xC5, 0xD0, 0x8D, 0x32, 0x47, 0x92, 0xE3, - 0xB1, 0x68, 0x40, 0xB6, 0xE9, 0x2B, 0x2A, 0xB5, 0x0B, 0x62, 0xC0, 0x69, 0xA4, 0x46, 0xDA, 0x8E, - 0x14, 0x58, 0x90, 0x87, 0x55, 0x71, 0x3C, 0x6D, 0x83, 0x41, 0x5B, 0xA0, 0x29, 0xD7, 0x27, 0xF3, - 0x5B, 0x66, 0x9D, 0xA2, 0x0B, 0xF0, 0xF0, 0x85, 0xF3, 0xF1, 0x22, 0xBC, 0xBC, 0x90, 0xF8, 0xF2, - 0x14, 0x89, 0x38, 0x07, 0x35, 0x0B, 0x55, 0x71, 0x9F, 0x6C, 0xBF, 0xBC, 0x22, 0xEE, 0x8B, 0xB8, - 0x6B, 0xA3, 0x0B, 0xD8, 0x28, 0xBB, 0x02, 0x45, 0xC1, 0xE5, 0x57, 0x6D, 0x00, 0x2E, 0xC2, 0x0A, - 0x94, 0x6E, 0x98, 0xEC, 0xB2, 0x76, 0x38, 0x4E, 0xE2, 0xD0, 0xF5, 0x9C, 0xC0, 0x01, 0x6A, 0x2F, - 0x7C, 0x4B, 0x91, 0xD3, 0xED, 0x94, 0x15, 0x54, 0x74, 0x6F, 0xD1, 0xEB, 0x76, 0x4B, 0xDF, 0x5A, - 0x5C, 0x9E, 0x95, 0xBD, 0xB4, 0xC0, 0xBC, 0x18, 0xFF, 0xCC, 0xCA, 0x76, 0x00, 0x7B, 0xF4, 0xAD, - 0xDF, 0x5F, 0xBD, 0x5B, 0x8F, 0x93, 0x38, 0x6C, 0x1D, 0x73, 0x7D, 0x20, 0x27, 0x3C, 0xC1, 0x9E, - 0x4D, 0x3D, 0x99, 0x11, 0x84, 0x7B, 0x78, 0x87, 0x85, 0x39, 0x96, 0x10, 0x4B, 0x48, 0xDD, 0xDA, - 0x04, 0x70, 0xBC, 0x4B, 0xA6, 0x0D, 0xB9, 0x74, 0x1E, 0xEA, 0x67, 0x36, 0xF7, 0x06, 0x8F, 0x6C, - 0x13, 0x80, 0xF4, 0x8E, 0xF2, 0x91, 0x04, 0xA1, 0x67, 0x27, 0xDE, 0x71, 0xFA, 0xFD, 0x84, 0x01, - 0x21, 0x06, 0xE8, 0xFA, 0xD6, 0xE6, 0xAC, 0x3A, 0xB3, 0xCD, 0xB9, 0xA6, 0x07, 0x8E, 0x37, 0x76, - 0xC0, 0x8D, 0xE3, 0xD4, 0xC5, 0xF3, 0x84, 0x8F, 0xEC, 0xE2, 0x33, 0xDE, 0x64, 0xE7, 0xA2, 0x22, - 0x87, 0x56, 0x8B, 0x9B, 0xD9, 0x55, 0x8B, 0x93, 0x97, 0x7B, 0x78, 0x1B, 0x87, 0xE7, 0x6B, 0xE8, - 0x73, 0x0F, 0x53, 0x38, 0x50, 0x4A, 0x3A, 0x52, 0x9F, 0x3C, 0xE1, 0x4C, 0x9C, 0x4C, 0x9E, 0x23, - 0x03, 0x96, 0x3C, 0x72, 0x8B, 0x03, 0x06, 0x77, 0x17, 0xB7, 0x68, 0xC0, 0x21, 0xFF, 0x28, 0x0D, - 0x5D, 0x36, 0x5E, 0x36, 0xE1, 0xE5, 0xFA, 0x48, 0x33, 0xC9, 0x85, 0x89, 0x0C, 0x65, 0xB9, 0x91, - 0xEC, 0xE3, 0x31, 0x16, 0x18, 0xB5, 0xBE, 0x52, 0xC9, 0xFF, 0x8A, 0x44, 0x40, 0x4F, 0x57, 0xFE, - 0xFB, 0x59, 0x7C, 0xAA, 0xC2, 0xB9, 0x3C, 0x83, 0xA4, 0xA9, 0x48, 0xF4, 0xD8, 0xB3, 0x7C, 0x92, - 0x7A, 0xE6, 0xFA, 0xD2, 0xBB, 0x79, 0x53, 0x7E, 0x82, 0x57, 0xC2, 0x4F, 0xF3, 0x19, 0x83, 0x88, - 0x62, 0x21, 0x66, 0x60, 0xF0, 0xDB, 0x70, 0xF0, 0x1B, 0xB9, 0x6F, 0x9D, 0xE2, 0x47, 0x86, 0x9F, - 0x67, 0xFB, 0xFB, 0x56, 0xA0, 0x30, 0x17, 0xF1, 0x81, 0x44, 0xD0, 0x9E, 0x0A, 0x0B, 0x19, 0xCC, - 0x51, 0x7C, 0x10, 0x37, 0xE0, 0xEC, 0xC4, 0x09, 0x91, 0xF6, 0x96, 0xC1, 0xA2, 0x52, 0xD3, 0x58, - 0x3E, 0x7F, 0x3A, 0x62, 0x24, 0xC3, 0x32, 0x21, 0xE9, 0xE6, 0xEB, 0xB9, 0xD2, 0x8C, 0x08, 0xFC, - 0xC8, 0x88, 0x72, 0xC3, 0x90, 0x6F, 0xA4, 0x68, 0xE2, 0x60, 0x6C, 0x25, 0xA0, 0x3E, 0xBA, 0x11, - 0xD4, 0xE1, 0x83, 0xE0, 0x2D, 0xFA, 0x23, 0x10, 0x39, 0xB0, 0xA7, 0xEF, 0xBE, 0x74, 0x87, 0x24, - 0x7C, 0x40, 0xF1, 0xB6, 0x78, 0xC4, 0xF9, 0xFA, 0x96, 0xBB, 0x3F, 0x03, 0x38, 0x79, 0x36, 0x21, - 0xD4, 0xF3, 0x85, 0x67, 0x10, 0xAE, 0xC9, 0x89, 0x44, 0x51, 0x15, 0x15, 0x87, 0x6C, 0x9C, 0x65, - 0xBA, 0x2F, 0x14, 0xB4, 0x91, 0x69, 0xFC, 0xD3, 0x0C, 0xA7, 0x45, 0x05, 0xB7, 0xD0, 0x0C, 0xC8, - 0x33, 0x11, 0x1E, 0x31, 0x1C, 0x56, 0x29, 0x79, 0x61, 0x06, 0x00, 0xAB, 0x9E, 0xBF, 0x50, 0xCE, - 0xF6, 0xF4, 0xCB, 0x49, 0x17, 0x84, 0xBB, 0x08, 0xDC, 0x21, 0x9A, 0x83, 0xF1, 0xD9, 0x82, 0x99, - 0x66, 0x72, 0x74, 0xB5, 0x63, 0xD6, 0x18, 0xEA, 0x6E, 0x34, 0x4D, 0x3C, 0x5C, 0x97, 0xCC, 0x61, - 0x93, 0x96, 0xC7, 0x18, 0x5A, 0xC4, 0x67, 0x31, 0x01, 0x21, 0xAE, 0xA3, 0x11, 0x31, 0x42, 0x99, - 0x8A, 0x97, 0xA1, 0x37, 0xFA, 0x0F, 0x51, 0x76, 0xEE, 0x48, 0xA4, 0xE9, 0xDA, 0x62, 0xA7, 0x5F, - 0x7B, 0x5B, 0xEC, 0x33, 0xA8, 0x38, 0x0F, 0xC0, 0x89, 0x51, 0x4E, 0xEC, 0x85, 0xB7, 0xD8, 0xD3, - 0x95, 0xE6, 0xDF, 0x15, 0xF6, 0xA1, 0x59, 0x1D, 0x6D, 0x64, 0xBE, 0x57, 0x23, 0x81, 0xE2, 0xA2, - 0x9B, 0x4E, 0xDB, 0x1C, 0x01, 0x72, 0xD1, 0xE9, 0x9B, 0x23, 0x74, 0xBB, 0xE8, 0xA6, 0x6A, 0x81, - 0xEE, 0x4E, 0x98, 0x14, 0xCF, 0x33, 0x1B, 0x76, 0xF0, 0x7C, 0x76, 0x6E, 0x44, 0x29, 0x72, 0xBF, - 0x92, 0xA7, 0x6B, 0x1E, 0xDA, 0x91, 0x81, 0x2F, 0x8B, 0x64, 0x2F, 0x39, 0xE5, 0xF3, 0x6E, 0xC5, - 0xC9, 0x9E, 0x13, 0x88, 0xA1, 0x7C, 0xFD, 0x3D, 0x6E, 0xB3, 0xE6, 0x25, 0xA0, 0x62, 0x26, 0xFC, - 0xB5, 0x37, 0x87, 0x2C, 0xE0, 0x8D, 0x75, 0xA0, 0x04, 0x5C, 0xC8, 0x1B, 0xF2, 0x17, 0x46, 0x7E, - 0x35, 0xB0, 0x65, 0xB0, 0x1F, 0x1A, 0xBD, 0x10, 0xF4, 0x97, 0xA7, 0xF1, 0x1C, 0x12, 0x90, 0x6F, - 0xAD, 0x03, 0x19, 0x44, 0x0B, 0x7A, 0x23, 0x85, 0xC2, 0xA4, 0xA0, 0x0E, 0xBA, 0x0C, 0x39, 0xC8, - 0x86, 0x2F, 0x84, 0x24, 0x84, 0x50, 0x3A, 0x87, 0x22, 0x12, 0x92, 0xEB, 0x3A, 0x50, 0x85, 0x2F, - 0xA6, 0x3B, 0x82, 0xE9, 0xBE, 0x51, 0x46, 0x71, 0xCA, 0x90, 0x28, 0x51, 0x98, 0x30, 0x44, 0xBB, - 0x67, 0x2D, 0x88, 0x51, 0x46, 0x65, 0x79, 0x4A, 0x72, 0xB6, 0x68, 0xE9, 0x5F, 0x03, 0x37, 0x55, - 0x2E, 0x26, 0x9F, 0x8C, 0x62, 0x74, 0xC5, 0x90, 0x9E, 0xF9, 0x55, 0x62, 0x8A, 0x57, 0x88, 0x99, - 0x18, 0x20, 0xD6, 0x33, 0x91, 0x6E, 0x5A, 0xED, 0xCE, 0x4B, 0xC8, 0x6E, 0xA6, 0x8A, 0xFE, 0xAA, - 0x7E, 0x01, 0x69, 0xE4, 0x8F, 0x76, 0x52, 0x29, 0x3B, 0x40, 0xA6, 0x51, 0x59, 0xD4, 0x2F, 0x81, - 0xD7, 0xE5, 0xAC, 0x9B, 0x88, 0x16, 0xCF, 0x6D, 0xD8, 0xB4, 0x03, 0x77, 0x41, 0x36, 0x4D, 0x58, - 0x5D, 0x29, 0x73, 0xE6, 0xB8, 0xDD, 0x13, 0x2D, 0x99, 0x63, 0xF0, 0x66, 0x8C, 0x98, 0xB8, 0xE6, - 0x55, 0xB2, 0x5F, 0x8E, 0x57, 0xBC, 0x12, 0x29, 0x2E, 0x6D, 0x24, 0x1F, 0xCB, 0x3A, 0xFB, 0xE1, - 0x02, 0x6C, 0xED, 0x79, 0x5C, 0x14, 0x5F, 0x65, 0xD1, 0xBB, 0xCB, 0xCE, 0x59, 0x29, 0xC2, 0x18, - 0xC4, 0xB5, 0x8A, 0xF4, 0xA6, 0x1D, 0x69, 0x3F, 0xCC, 0x51, 0x38, 0x8A, 0xFD, 0xB1, 0xD8, 0x2D, - 0x0F, 0x1E, 0x38, 0xB7, 0x41, 0x0C, 0xA1, 0x7B, 0x3A, 0xF3, 0x9E, 0xC7, 0xA1, 0x74, 0x0D, 0x76, - 0xD6, 0x18, 0x34, 0xC4, 0x1D, 0x8D, 0x64, 0xCC, 0x64, 0x2C, 0xC5, 0x3B, 0x99, 0x3D, 0xBC, 0x23, - 0xF6, 0xC7, 0xF7, 0xC8, 0xD8, 0x15, 0xC6, 0x35, 0xFC, 0xAF, 0x3D, 0xF6, 0x89, 0xED, 0xED, 0xF8, - 0x6F, 0xBC, 0x7B, 0x1A, 0xEF, 0xCE, 0xE2, 0x8F, 0x12, 0xEF, 0xCE, 0x34, 0x5A, 0x1C, 0xEF, 0x5E, - 0x18, 0xC9, 0x78, 0x5C, 0x37, 0x31, 0xAB, 0xD2, 0x3C, 0x7A, 0x89, 0xDE, 0x5B, 0x01, 0x5A, 0x71, - 0xA3, 0xB9, 0x44, 0x35, 0xB9, 0x65, 0xDC, 0xB3, 0x6E, 0x39, 0xFA, 0xDD, 0x2C, 0xE2, 0xA8, 0x53, - 0x8A, 0xD6, 0x20, 0xDB, 0x0B, 0xD1, 0x07, 0x7E, 0xF7, 0x89, 0xFD, 0x47, 0x2B, 0x7C, 0x23, 0x91, - 0x99, 0x24, 0x12, 0xE3, 0x8B, 0x32, 0x7D, 0x44, 0x2D, 0xD6, 0x8F, 0x38, 0xAE, 0x1D, 0x27, 0x38, - 0xE5, 0xD6, 0x5C, 0x5B, 0x0F, 0xBE, 0xC7, 0xE8, 0xC5, 0x15, 0xA0, 0x8E, 0xC0, 0x21, 0x57, 0x1F, - 0xAC, 0x11, 0x5D, 0x0F, 0x3C, 0xD3, 0xC5, 0xFA, 0x15, 0xDA, 0x63, 0x74, 0xA9, 0xEF, 0xC5, 0x4E, - 0xC1, 0x44, 0x2D, 0x98, 0x2A, 0x3E, 0xF4, 0x13, 0x17, 0x49, 0xCD, 0x37, 0xEC, 0x9F, 0x81, 0xFD, - 0x63, 0x84, 0x50, 0xC5, 0xFE, 0xB8, 0xC5, 0x9A, 0x62, 0x3F, 0xC8, 0xAB, 0x22, 0xEB, 0x9E, 0x12, - 0x09, 0xC4, 0x6F, 0xAF, 0x90, 0x44, 0xC5, 0x11, 0xC8, 0x80, 0xF7, 0x16, 0x08, 0xD3, 0xF7, 0x5C, - 0x95, 0x0E, 0x5A, 0xCD, 0xE6, 0x1B, 0x29, 0xCC, 0x25, 0x85, 0x31, 0x76, 0x14, 0xA2, 0x87, 0xB8, - 0xD9, 0x1A, 0x12, 0x45, 0x84, 0x37, 0x17, 0xC6, 0x3C, 0x8A, 0x88, 0x31, 0xEC, 0xE2, 0xF4, 0x59, - 0xC8, 0x41, 0xC7, 0x74, 0x2F, 0xE4, 0xFA, 0x69, 0xF6, 0x4D, 0x49, 0x14, 0x19, 0xB4, 0x4F, 0x20, - 0xFC, 0xE7, 0x6E, 0x6F, 0x1C, 0x0A, 0x8D, 0x49, 0xDF, 0x87, 0x9A, 0xA7, 0xE9, 0xA0, 0x41, 0xBC, - 0x5E, 0x79, 0x68, 0x8E, 0xA5, 0x33, 0x83, 0x0D, 0xCA, 0x14, 0x30, 0x6E, 0xB3, 0xF2, 0xA6, 0x1E, - 0x4A, 0x0E, 0x70, 0xA5, 0xD9, 0xA0, 0x75, 0x7A, 0xD5, 0x1A, 0x7B, 0x1C, 0x5B, 0x8F, 0x93, 0xE9, - 0xE1, 0x28, 0x98, 0xEB, 0x1C, 0xBD, 0x74, 0x84, 0xEB, 0x87, 0xC5, 0xE5, 0xA0, 0xB5, 0x72, 0xD9, - 0x88, 0x67, 0xD8, 0x7B, 0xB2, 0xA6, 0xA1, 0x29, 0x66, 0xA0, 0xF3, 0xE4, 0x1C, 0x72, 0x0D, 0x41, - 0xB9, 0x63, 0x4C, 0x31, 0x0E, 0xA5, 0x7A, 0x53, 0x37, 0x05, 0xA5, 0xC0, 0x2F, 0xAD, 0x40, 0x09, - 0xE0, 0xAC, 0x94, 0x35, 0x28, 0xB9, 0xC4, 0xCA, 0xEC, 0x41, 0xAA, 0x99, 0xFB, 0x7A, 0xA7, 0xAC, - 0x67, 0xFE, 0xC9, 0xE3, 0x7A, 0xA4, 0xBE, 0x81, 0x7F, 0x4E, 0x0F, 0x88, 0x6F, 0xB2, 0xAB, 0x63, - 0xA4, 0x30, 0xB6, 0xCD, 0xCE, 0x3D, 0x9E, 0x6C, 0x87, 0x7F, 0xF6, 0x5C, 0x60, 0xBB, 0xB3, 0x79, - 0xED, 0xBC, 0x8E, 0x8B, 0x5F, 0x2F, 0x50, 0x4A, 0xD1, 0xEC, 0x0E, 0xDF, 0xE0, 0xC3, 0x59, 0x87, - 0x53, 0xE0, 0x49, 0x18, 0x6D, 0x58, 0xBC, 0x1F, 0xCC, 0xAB, 0xD1, 0x11, 0x0C, 0x0F, 0x31, 0x51, - 0xC0, 0xC7, 0x6D, 0xF8, 0x30, 0xF7, 0x4D, 0x84, 0xA0, 0xCA, 0x9B, 0xC6, 0x61, 0x8A, 0x69, 0x8E, - 0x1D, 0xF8, 0xA2, 0xB5, 0xF4, 0x28, 0x2A, 0xE8, 0xC8, 0xB2, 0x6A, 0x53, 0x9D, 0xFF, 0x0A, 0x96, - 0x71, 0x4B, 0x00, 0x88, 0xC8, 0x19, 0xC3, 0xE5, 0x61, 0xAA, 0xB3, 0x7C, 0xFB, 0xB6, 0x03, 0xAF, - 0x3A, 0x30, 0x1A, 0x94, 0x51, 0xE1, 0xEC, 0x07, 0x45, 0x44, 0xFC, 0x1E, 0xB9, 0xA8, 0xFD, 0xDE, - 0x6C, 0x04, 0x3F, 0x82, 0xD9, 0xF3, 0x88, 0xDA, 0xEF, 0x12, 0x9E, 0xA8, 0xBC, 0x39, 0x05, 0xB8, - 0x22, 0x7E, 0x0D, 0x21, 0x71, 0x71, 0x2A, 0x40, 0x3D, 0x7D, 0x4A, 0x6A, 0xE0, 0x9D, 0xB2, 0x37, - 0x2C, 0xC9, 0x70, 0x54, 0x6A, 0xC8, 0x3D, 0xDB, 0x3E, 0xB4, 0xDB, 0xAD, 0x66, 0xA7, 0xF5, 0x7B, - 0xB3, 0xDD, 0x6C, 0x35, 0xF7, 0x44, 0xAE, 0x0B, 0x15, 0x00, 0x43, 0x33, 0xF6, 0xD7, 0x45, 0x6E, - 0xC6, 0xC4, 0xBC, 0x5E, 0xDD, 0x7E, 0xB4, 0x9B, 0x1F, 0xD4, 0xF7, 0x63, 0xA7, 0xB9, 0xBF, 0xAC, - 0xFD, 0x90, 0xF3, 0x5A, 0x8B, 0xFD, 0x80, 0x6F, 0xF0, 0x30, 0x38, 0x9C, 0x71, 0x7A, 0x28, 0x6D, - 0xA4, 0x38, 0x4B, 0x15, 0xB6, 0x72, 0xF6, 0xB5, 0x5C, 0x6D, 0x2C, 0xC1, 0x25, 0x00, 0x70, 0x8A, - 0xA5, 0x52, 0x89, 0x1D, 0x8B, 0x4F, 0x6A, 0x69, 0x4B, 0x14, 0xF7, 0xBA, 0xCA, 0xB7, 0xCA, 0xAC, - 0x0D, 0xC4, 0x28, 0x4C, 0xF0, 0x4A, 0xAB, 0x93, 0x9F, 0xAB, 0x58, 0x9F, 0xC2, 0x96, 0x4F, 0x77, - 0x48, 0x98, 0xA1, 0xB1, 0x16, 0x4E, 0x63, 0x3C, 0x35, 0x85, 0x31, 0x7E, 0x6E, 0x8D, 0xCF, 0xF3, - 0x56, 0x32, 0x67, 0xB1, 0x48, 0xE7, 0x8B, 0xC2, 0xDF, 0x9C, 0x5C, 0xC5, 0x22, 0x3B, 0xEE, 0x4F, - 0x85, 0x15, 0xB9, 0xFC, 0x0C, 0xD9, 0x6E, 0x4E, 0x4E, 0xEC, 0x66, 0x22, 0x25, 0xF6, 0xDC, 0x74, - 0xD7, 0xB3, 0x33, 0x4E, 0x4B, 0x71, 0x50, 0x2C, 0x0E, 0xF3, 0xD6, 0x86, 0xFE, 0xB4, 0x84, 0xFD, - 0x25, 0x23, 0x84, 0x6C, 0x23, 0xA3, 0x4F, 0xA5, 0xDF, 0x1E, 0x7A, 0xD3, 0xE5, 0xEF, 0x7C, 0x7B, - 0x45, 0x5E, 0xB2, 0xF5, 0x8C, 0xEE, 0x8B, 0x41, 0xCC, 0x3E, 0x28, 0x04, 0xF0, 0xB9, 0x45, 0xE6, - 0x8A, 0x56, 0x3B, 0x7A, 0xD4, 0x9C, 0x95, 0xD7, 0x63, 0x46, 0x56, 0x24, 0xED, 0x9E, 0x1F, 0x07, - 0x93, 0x15, 0x81, 0x44, 0xFA, 0x88, 0x34, 0x29, 0xE1, 0xBB, 0xE2, 0xBE, 0x98, 0xB2, 0x1B, 0xC1, - 0x5F, 0x33, 0x8A, 0xA4, 0xA5, 0xAE, 0xBF, 0x27, 0x8C, 0x0B, 0xD8, 0x15, 0x1A, 0x12, 0x5A, 0xB1, - 0x21, 0x61, 0x4E, 0xE5, 0x1D, 0x37, 0x39, 0xDB, 0x52, 0x85, 0xE0, 0x52, 0x3D, 0x44, 0xB1, 0x93, - 0x45, 0x22, 0x2A, 0xA7, 0x05, 0x98, 0x29, 0x6C, 0x9B, 0xD8, 0xAA, 0xC2, 0x9B, 0x83, 0x05, 0xE4, - 0xF3, 0x36, 0xC7, 0x09, 0x03, 0x9C, 0x6E, 0xEE, 0x26, 0x61, 0x9B, 0xF1, 0x26, 0x9D, 0x61, 0x09, - 0x7A, 0x50, 0x7A, 0xA7, 0x6E, 0x14, 0x45, 0x31, 0x4E, 0xEE, 0x8F, 0xC7, 0x47, 0xCE, 0xBD, 0xB4, - 0xFB, 0xC4, 0xA3, 0x94, 0xD8, 0x30, 0xB9, 0x82, 0xBC, 0x0D, 0x53, 0x08, 0x5F, 0x75, 0x0F, 0xFF, - 0xD9, 0xBE, 0xF5, 0xDD, 0xBF, 0xA8, 0x6E, 0x47, 0xE6, 0x51, 0xF6, 0x4F, 0x5F, 0xF7, 0x4C, 0x37, - 0x60, 0xBE, 0xA7, 0x03, 0x1E, 0x78, 0xFA, 0x36, 0x86, 0x5B, 0x37, 0xFE, 0x4E, 0x33, 0x10, 0x5F, - 0x89, 0x77, 0x13, 0xCD, 0x3E, 0x26, 0x9F, 0x93, 0x08, 0xE1, 0xD8, 0x54, 0x10, 0xCF, 0xC1, 0x4C, - 0x85, 0x3E, 0xFB, 0xC4, 0x0C, 0x47, 0x0F, 0xD1, 0xBE, 0xD7, 0xF8, 0x23, 0xE4, 0xDE, 0xA3, 0x50, - 0x94, 0x1C, 0x0F, 0x54, 0xA5, 0xCD, 0x8D, 0x46, 0x10, 0x6C, 0xBC, 0x8B, 0x5B, 0x46, 0x6D, 0x1A, - 0x20, 0x7E, 0x9C, 0x69, 0xFA, 0x70, 0x33, 0x60, 0x9F, 0x0E, 0xD9, 0xBF, 0xA5, 0xE6, 0x8F, 0x79, - 0xB7, 0x6E, 0x1D, 0x27, 0xF0, 0x03, 0x4F, 0x73, 0x1B, 0x37, 0xA2, 0xC5, 0x66, 0x30, 0xEE, 0xE4, - 0xDF, 0xDF, 0xC9, 0x19, 0x46, 0xF3, 0x82, 0x4D, 0x00, 0x0D, 0x1C, 0x78, 0xCF, 0xC7, 0xED, 0x61, - 0x30, 0xB2, 0x0E, 0xFF, 0x3F, 0xF5, 0x0E, 0x1E, 0x94, 0x11, 0xF7, 0x00 + 0x1F, 0x8B, 0x08, 0x08, 0xCE, 0xE4, 0x45, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xD9, 0x72, 0xE3, 0x48, + 0x92, 0xE0, 0xFB, 0x9A, 0xED, 0x3F, 0x44, 0x73, 0x76, 0x46, 0xCA, 0x19, 0x91, 0xE2, 0x21, 0x29, + 0x95, 0xEA, 0x4C, 0x99, 0xE9, 0xCC, 0xD2, 0xB6, 0x94, 0x49, 0x13, 0x95, 0x5D, 0xC7, 0xDA, 0x6E, + 0x1B, 0x04, 0x04, 0x49, 0xB4, 0x40, 0x00, 0x85, 0x43, 0x47, 0x8D, 0xCD, 0xD8, 0x7C, 0xC6, 0xEE, + 0x87, 0xEC, 0x0F, 0xEC, 0xA7, 0xCC, 0x97, 0xAC, 0xBB, 0x47, 0x00, 0x04, 0xC0, 0x2B, 0x00, 0x82, + 0x14, 0x29, 0x31, 0xCB, 0x4A, 0xA2, 0x40, 0xC4, 0xE5, 0xE1, 0xEE, 0xE1, 0xE1, 0xE7, 0xE7, 0x3F, + 0x9D, 0x7F, 0x3F, 0xBB, 0xFB, 0xB5, 0x7D, 0xC1, 0xFA, 0xC1, 0xC0, 0x3A, 0xFE, 0xAF, 0xFF, 0xE5, + 0x33, 0xFE, 0x66, 0x96, 0x66, 0xF7, 0xBE, 0x54, 0xB8, 0x5D, 0x81, 0x27, 0xF8, 0x8C, 0x6B, 0x06, + 0x7C, 0x62, 0xF0, 0xEF, 0xF3, 0x80, 0x07, 0x1A, 0xD3, 0xFB, 0x9A, 0xE7, 0xF3, 0xE0, 0x4B, 0x25, + 0x0C, 0xBA, 0xD5, 0xC3, 0x0A, 0xDB, 0x4D, 0x7D, 0xDB, 0x0F, 0x02, 0xB7, 0xCA, 0x7F, 0x0F, 0xCD, + 0xC7, 0x2F, 0x95, 0x5F, 0xAA, 0x3F, 0x4E, 0xAA, 0x67, 0xCE, 0xC0, 0xD5, 0x02, 0xF3, 0xDE, 0xE2, + 0x15, 0xA6, 0x3B, 0x76, 0xC0, 0x6D, 0x68, 0x7A, 0x75, 0xF1, 0x85, 0x1B, 0x3D, 0xBE, 0xA3, 0xF7, + 0x3D, 0x67, 0xC0, 0xBF, 0x34, 0x12, 0xBD, 0x04, 0x66, 0x60, 0xF1, 0xE3, 0x8E, 0xAB, 0x79, 0x0F, + 0x97, 0xA1, 0xCD, 0x6E, 0xEF, 0xFE, 0xC2, 0x3A, 0x3C, 0x08, 0xDD, 0xCF, 0xBB, 0xE2, 0x9B, 0xE4, + 0x60, 0xB6, 0x06, 0x8D, 0x2B, 0x8F, 0x26, 0x7F, 0x72, 0x1D, 0x2F, 0xA8, 0x88, 0xAF, 0xF0, 0x5F, + 0x3C, 0xD0, 0x93, 0x69, 0x04, 0xFD, 0x2F, 0x06, 0x7F, 0x34, 0x75, 0x5E, 0xA5, 0x3F, 0x76, 0x98, + 0x69, 0x9B, 0x81, 0xA9, 0x59, 0x55, 0x5F, 0xD7, 0x2C, 0x18, 0x7B, 0x87, 0x0D, 0xB4, 0x67, 0x73, + 0x10, 0x0E, 0x86, 0x0F, 0x42, 0x9F, 0x7B, 0xF4, 0x97, 0x06, 0xD3, 0xFE, 0x52, 0xDF, 0x61, 0x7E, + 0xDF, 0x33, 0xED, 0x87, 0x6A, 0xE0, 0x54, 0xBB, 0x66, 0xF0, 0xE5, 0x85, 0xFB, 0x89, 0x09, 0x5B, + 0xF0, 0x0D, 0xF3, 0xB8, 0xF5, 0xA5, 0xE2, 0x07, 0x2F, 0x16, 0xF7, 0xFB, 0x9C, 0x07, 0x15, 0xD6, + 0xF7, 0x78, 0x17, 0x9E, 0x78, 0xFA, 0xEE, 0xBD, 0xE3, 0x04, 0x7E, 0xE0, 0x69, 0x6E, 0x6D, 0x60, + 0xDA, 0x35, 0xDD, 0xF7, 0x2B, 0xAA, 0x2D, 0xE9, 0x69, 0xAA, 0x85, 0xAF, 0x7B, 0xA6, 0x1B, 0x30, + 0xF8, 0x52, 0xBC, 0xF1, 0xF7, 0xDF, 0x43, 0xEE, 0xBD, 0x54, 0x5B, 0xB5, 0x83, 0x5A, 0x9D, 0xBA, + 0xFF, 0x3B, 0xBC, 0xFB, 0x79, 0x57, 0xBC, 0x36, 0xA9, 0x51, 0x7A, 0x42, 0xF9, 0x5A, 0xDC, 0x87, + 0xB6, 0x01, 0x73, 0x1A, 0xD3, 0x30, 0xD5, 0xF4, 0x78, 0xB8, 0x15, 0xFF, 0x6D, 0xDB, 0x70, 0xF4, + 0x70, 0x00, 0xBB, 0xF1, 0xA1, 0xE6, 0xD8, 0xDB, 0x5B, 0xBA, 0x65, 0xEA, 0x0F, 0x5B, 0x3B, 0x6C, + 0xAB, 0x16, 0x38, 0xBD, 0x9E, 0xC5, 0xAB, 0xF7, 0x81, 0x0D, 0x7F, 0x76, 0x43, 0x5B, 0x0F, 0x4C, + 0xC7, 0x66, 0xDB, 0xFC, 0x03, 0xFB, 0xD7, 0x61, 0x73, 0xD1, 0x05, 0x40, 0x21, 0xF4, 0x3C, 0xE8, + 0xE3, 0x4E, 0xF3, 0x7A, 0x3C, 0xA8, 0xE9, 0x7D, 0xD3, 0x32, 0xE0, 0xEF, 0xFF, 0x51, 0xFF, 0x9F, + 0x1F, 0x64, 0x3F, 0x67, 0x96, 0xE6, 0xFB, 0xDB, 0x5B, 0x26, 0x6C, 0x7D, 0x55, 0xD7, 0x3C, 0x1E, + 0x54, 0x0D, 0xE7, 0xC9, 0x66, 0x89, 0xBF, 0x43, 0x77, 0xEB, 0xC3, 0x9F, 0x87, 0x3D, 0xFF, 0xDB, + 0x07, 0x39, 0xE5, 0xD1, 0x35, 0x20, 0xDC, 0x13, 0x4B, 0xA8, 0xF9, 0x01, 0x60, 0xB0, 0x5E, 0xED, + 0x79, 0x4E, 0xE8, 0x66, 0x27, 0xD7, 0xE7, 0x66, 0xAF, 0x1F, 0x1C, 0xB1, 0xFA, 0x9F, 0xD3, 0xCF, + 0x9D, 0x47, 0xEE, 0x75, 0x2D, 0xE7, 0xE9, 0x88, 0xF5, 0x4D, 0xC3, 0xE0, 0x76, 0xE6, 0x6B, 0x80, + 0xA6, 0xED, 0x9B, 0xB8, 0xE2, 0x23, 0xD9, 0x05, 0xAB, 0xD7, 0xF6, 0x7C, 0xC6, 0x35, 0x9F, 0x67, + 0x5E, 0xBD, 0x77, 0x3C, 0x03, 0xF0, 0xF1, 0xDE, 0x09, 0x02, 0x67, 0x70, 0xC4, 0x7C, 0xC7, 0x32, + 0x0D, 0xD6, 0x70, 0x9F, 0xD9, 0x3F, 0xE8, 0x75, 0xFC, 0x2F, 0xB9, 0xA6, 0x68, 0x0D, 0x34, 0x6D, + 0xCB, 0xF4, 0x83, 0x35, 0x98, 0x34, 0xFE, 0x73, 0x35, 0xC3, 0x30, 0xED, 0x5E, 0xD5, 0x13, 0xF3, + 0xDA, 0xAF, 0xBB, 0xCF, 0x13, 0x97, 0x25, 0xBA, 0x06, 0x7A, 0xF1, 0x59, 0x60, 0xEC, 0x4C, 0xF8, + 0xA2, 0x9F, 0x5D, 0xB2, 0xF8, 0xF2, 0x88, 0xD9, 0x8E, 0x9D, 0x9D, 0xEB, 0x00, 0x90, 0xCA, 0xB4, + 0xAB, 0x16, 0xEF, 0x22, 0x48, 0x26, 0x8F, 0x7C, 0x1F, 0xC2, 0x62, 0xEC, 0xA3, 0x2E, 0xE0, 0xB3, + 0x9F, 0xED, 0xDE, 0x09, 0x03, 0x20, 0x67, 0x9E, 0x06, 0x69, 0x7A, 0xDE, 0xA6, 0x8D, 0x6F, 0x5C, + 0x78, 0x9E, 0xE3, 0x65, 0x5B, 0x1B, 0xA6, 0xEF, 0x5A, 0xDA, 0xCB, 0x11, 0x13, 0xEF, 0x64, 0xE6, + 0xA7, 0x3B, 0x96, 0x03, 0x33, 0xF7, 0xB8, 0x91, 0xF9, 0xA2, 0x0B, 0x6C, 0xAE, 0xEA, 0x9B, 0x7F, + 0xC0, 0xB0, 0xFE, 0x40, 0xB3, 0x2C, 0xEE, 0xCD, 0x18, 0xBC, 0x13, 0xEA, 0x3A, 0x82, 0xA7, 0xC8, + 0xF0, 0x3D, 0x8F, 0x8F, 0x20, 0xC4, 0xD4, 0x09, 0xC4, 0x2F, 0x3C, 0x49, 0x6C, 0xBB, 0x77, 0x2C, + 0x63, 0xCA, 0xAE, 0x3E, 0x57, 0xA9, 0x8F, 0xEC, 0xE4, 0xA6, 0xEC, 0x0E, 0xFE, 0x23, 0xA6, 0x7E, + 0xC4, 0x5A, 0xF5, 0x7F, 0x9C, 0xDA, 0xB5, 0xE8, 0xA5, 0x59, 0x9F, 0xDA, 0x7B, 0x73, 0x3A, 0xDA, + 0x45, 0xBD, 0xEC, 0x4D, 0xEF, 0x65, 0x6F, 0x6A, 0x2F, 0x5A, 0x10, 0x00, 0xCB, 0xCE, 0x76, 0xE0, + 0x3A, 0x11, 0x5D, 0x69, 0xF7, 0x40, 0x2B, 0x61, 0x90, 0xDD, 0x84, 0x3F, 0xAA, 0xA6, 0x6D, 0xF0, + 0xE7, 0x23, 0xD6, 0xA8, 0xD7, 0xB3, 0xC4, 0x23, 0x89, 0xA6, 0x31, 0x0A, 0x1C, 0x38, 0xD9, 0xAA, + 0x12, 0x40, 0x07, 0xF5, 0x71, 0x5F, 0xD3, 0xB4, 0x03, 0xC7, 0x05, 0x92, 0xCB, 0x4E, 0x5A, 0xF2, + 0x46, 0xC9, 0x0B, 0x3F, 0xEF, 0x4A, 0x41, 0x00, 0x3E, 0xDE, 0x3B, 0xC6, 0x4B, 0x74, 0x54, 0x18, + 0xE6, 0x23, 0xD3, 0x91, 0xF5, 0x7E, 0xA9, 0xE0, 0xA1, 0xAB, 0x01, 0xFA, 0x78, 0x15, 0x66, 0x1A, + 0x5F, 0x2A, 0x72, 0xA5, 0x57, 0xF0, 0xB8, 0x92, 0x60, 0xA6, 0xD4, 0x42, 0xB3, 0xCC, 0x9E, 0xFD, + 0xA5, 0x42, 0x13, 0xAF, 0x44, 0xED, 0x65, 0x83, 0xE4, 0xCB, 0xD4, 0xC0, 0x1C, 0xF4, 0xB2, 0x1D, + 0x5E, 0x9A, 0x16, 0xFF, 0x06, 0x87, 0x7F, 0x65, 0x78, 0x46, 0x9D, 0x8A, 0x6F, 0x9B, 0x7F, 0x3B, + 0xEB, 0xD3, 0xAA, 0x7A, 0x35, 0xD7, 0xEE, 0x55, 0x60, 0x24, 0x90, 0x02, 0xE4, 0x77, 0xCC, 0xE2, + 0x8F, 0xDC, 0xAA, 0x1C, 0x03, 0x87, 0x77, 0x35, 0x3B, 0xD9, 0x67, 0x9B, 0x7B, 0x3A, 0x9C, 0x2E, + 0x95, 0xF4, 0xC8, 0x84, 0xFC, 0x62, 0x6E, 0x84, 0x99, 0x30, 0x1A, 0x42, 0xE3, 0x4B, 0x25, 0xA2, + 0x17, 0x49, 0x2E, 0x95, 0xE3, 0x7F, 0x39, 0xF8, 0x08, 0xA0, 0x82, 0x4E, 0x93, 0x0B, 0xDD, 0x85, + 0x95, 0x46, 0x60, 0x92, 0x9F, 0xA7, 0x02, 0x2D, 0xD3, 0x39, 0x31, 0xAA, 0xE4, 0x16, 0x11, 0x76, + 0x0E, 0x77, 0x54, 0x6C, 0xA8, 0x80, 0xB5, 0xC7, 0x41, 0x22, 0xBB, 0xB2, 0xDB, 0x9E, 0x83, 0xE4, + 0x9D, 0x02, 0xF7, 0xFD, 0xF1, 0x2D, 0x7E, 0x19, 0x00, 0x44, 0x3E, 0xEF, 0xDE, 0x1F, 0x7F, 0xBE, + 0xF7, 0xE8, 0x7F, 0x94, 0xAB, 0x84, 0x58, 0xC4, 0x4C, 0x1F, 0x58, 0x0B, 0x1E, 0xF1, 0x08, 0x34, + 0xD6, 0xB6, 0x90, 0x9B, 0xB3, 0x27, 0xCD, 0x0C, 0x6A, 0xB5, 0xDA, 0x12, 0xA7, 0x8F, 0x82, 0xA2, + 0xC5, 0x03, 0x3E, 0x6E, 0xF6, 0xEC, 0x1C, 0x7A, 0x9B, 0x30, 0xFD, 0xBE, 0xE6, 0x03, 0x53, 0x7F, + 0x62, 0xD4, 0xC9, 0x92, 0x26, 0xDC, 0x35, 0xBD, 0xC1, 0x13, 0x08, 0x15, 0x3F, 0x5C, 0xCB, 0xD1, + 0x8C, 0x09, 0x33, 0xCF, 0xCE, 0xF9, 0x52, 0x36, 0x62, 0xA1, 0x6B, 0x68, 0x01, 0x07, 0xBE, 0x2A, + 0x9A, 0xD5, 0x58, 0x7A, 0x33, 0xC4, 0x62, 0xA2, 0x0D, 0x51, 0x5F, 0xD0, 0x71, 0x92, 0xD1, 0x24, + 0xC9, 0x0C, 0x51, 0x1B, 0x17, 0x1C, 0xB7, 0x00, 0xD9, 0x77, 0x50, 0x6D, 0x34, 0x41, 0x7E, 0x43, + 0xDA, 0x8A, 0x49, 0xC8, 0x0B, 0x1E, 0xAA, 0x3E, 0xCA, 0xDA, 0x09, 0xD2, 0x49, 0x09, 0xE2, 0x3F, + 0x9B, 0x97, 0xA6, 0x90, 0xC6, 0x51, 0xF4, 0x4B, 0xCD, 0x28, 0x07, 0xC0, 0x13, 0x20, 0x6E, 0x4C, + 0x06, 0xF1, 0x00, 0x1A, 0xB5, 0xB5, 0x1E, 0x57, 0x5E, 0x96, 0xE7, 0x3C, 0x8D, 0xEC, 0xE9, 0xBD, + 0xE5, 0xE8, 0x0F, 0x7F, 0x4E, 0x77, 0x31, 0xA3, 0x1B, 0x71, 0x06, 0x21, 0x27, 0xCF, 0x32, 0x22, + 0xFC, 0x87, 0x50, 0xB8, 0x00, 0x21, 0xE9, 0xE5, 0xA9, 0xCF, 0x61, 0x27, 0xA3, 0x2D, 0x3D, 0x4A, + 0xB0, 0x14, 0x80, 0x62, 0xF4, 0xF8, 0xAF, 0xDC, 0xF3, 0x81, 0xA9, 0x4F, 0xE6, 0x1B, 0x8F, 0xF5, + 0x5A, 0x5D, 0x32, 0x0E, 0xC4, 0x90, 0xD1, 0xF1, 0x86, 0xDD, 0xF6, 0x6C, 0xDF, 0x57, 0xEE, 0xF7, + 0xEB, 0xB7, 0x4E, 0x27, 0x31, 0xB9, 0xC4, 0x30, 0x6C, 0xD6, 0x38, 0x02, 0x0F, 0x4F, 0xEF, 0xAE, + 0xCE, 0x27, 0x77, 0x7F, 0x2E, 0x70, 0xF5, 0xD4, 0x0A, 0x79, 0x00, 0x68, 0xDA, 0x67, 0x57, 0xE7, + 0x70, 0x34, 0xC3, 0x3F, 0xD5, 0x41, 0x74, 0x07, 0xA4, 0x31, 0xD3, 0x06, 0x2A, 0xF0, 0xAF, 0xAF, + 0x7F, 0x9A, 0x3C, 0xD0, 0xF5, 0x75, 0xFF, 0x68, 0xB4, 0x9F, 0x0C, 0x60, 0xB8, 0x63, 0x70, 0x10, + 0xCF, 0xAF, 0xB5, 0x60, 0x72, 0x47, 0x7B, 0x00, 0x81, 0x4F, 0xF5, 0xE6, 0xA7, 0xBD, 0x8F, 0x9F, + 0xE4, 0x1C, 0x77, 0x94, 0xFB, 0x9D, 0x06, 0xE8, 0x6A, 0xA3, 0xBE, 0x5F, 0x6B, 0x1C, 0xEE, 0xD7, + 0xF7, 0x3F, 0x1E, 0x34, 0xF2, 0xF6, 0x7C, 0x62, 0x4D, 0x99, 0x71, 0x63, 0xFF, 0x00, 0xE6, 0x7C, + 0x18, 0x4D, 0x97, 0x6D, 0x9F, 0xB4, 0xCF, 0x3E, 0x8C, 0x81, 0xA9, 0x1A, 0xF6, 0x24, 0x00, 0x7E, + 0x71, 0x76, 0x71, 0x39, 0x79, 0x58, 0xFC, 0x76, 0x26, 0xC8, 0xB9, 0xCE, 0xBB, 0xBF, 0x4C, 0x03, + 0x4A, 0xF3, 0xB0, 0xDE, 0xAC, 0x1F, 0xD4, 0xF6, 0x0F, 0x0E, 0x55, 0x61, 0x82, 0x5D, 0xFE, 0x3A, + 0xA5, 0xCB, 0xBD, 0x8F, 0x8D, 0x83, 0xC3, 0xFA, 0x5E, 0x6D, 0xAF, 0xDE, 0xCA, 0xD3, 0xE5, 0x6F, + 0xD3, 0x50, 0xE2, 0xF0, 0xE0, 0xE0, 0x60, 0xBF, 0xB6, 0x77, 0xB8, 0x37, 0x72, 0x76, 0xCF, 0x84, + 0x6E, 0x9A, 0xDF, 0x4D, 0x78, 0xD2, 0xF7, 0x22, 0xA6, 0x32, 0x08, 0xAA, 0xF5, 0x11, 0x21, 0x68, + 0x94, 0x1D, 0xD2, 0x89, 0x33, 0x86, 0x5B, 0xFD, 0xA9, 0x5A, 0x65, 0xD5, 0xE8, 0x1F, 0x83, 0x53, + 0xBE, 0x0B, 0xF2, 0x0F, 0x3B, 0x73, 0xEC, 0xAE, 0xD9, 0x4B, 0x7C, 0x51, 0xAD, 0x1E, 0x8F, 0x61, + 0x73, 0x72, 0x0A, 0x06, 0xDC, 0x04, 0xE1, 0x0A, 0xD6, 0xD3, 0xDC, 0x6A, 0x73, 0x1C, 0x67, 0xFB, + 0x2C, 0x6E, 0x37, 0xB1, 0x30, 0x16, 0xD8, 0x0C, 0xFE, 0xAF, 0xBA, 0x9E, 0x09, 0x13, 0x7C, 0x61, + 0xC3, 0xCB, 0xBA, 0x60, 0xCF, 0xAE, 0x98, 0x84, 0x98, 0x43, 0x85, 0x05, 0x2F, 0x2E, 0x2C, 0x45, + 0x74, 0x51, 0x61, 0x70, 0xBC, 0x69, 0x55, 0xD1, 0x82, 0x8E, 0x1B, 0x4B, 0x73, 0x7D, 0x5E, 0x19, + 0xBF, 0x5F, 0xE2, 0x5D, 0xBA, 0xD6, 0x7F, 0xA9, 0xFC, 0x43, 0xF4, 0x72, 0x3B, 0xDD, 0xBD, 0xE6, + 0x99, 0x5A, 0x95, 0x3F, 0xC3, 0x5E, 0x18, 0x1C, 0x8F, 0x5F, 0xCD, 0x82, 0xFE, 0xC4, 0x53, 0x3C, + 0x5F, 0x3C, 0xC7, 0xF2, 0x87, 0x03, 0xA5, 0xDB, 0x1E, 0x8F, 0x1F, 0x36, 0x0D, 0xC4, 0xD0, 0xD3, + 0x48, 0xF9, 0xF0, 0xD9, 0x4C, 0x2D, 0x0E, 0xD5, 0x06, 0xC3, 0x63, 0x93, 0x94, 0x08, 0xA8, 0x4F, + 0x60, 0xF7, 0x26, 0xCB, 0xE8, 0x19, 0xF0, 0x3C, 0x34, 0xC7, 0x22, 0x90, 0x80, 0xC9, 0x04, 0xF4, + 0x99, 0xB4, 0x59, 0xD1, 0x52, 0xD8, 0xE0, 0x1E, 0x76, 0x4B, 0x52, 0xB0, 0xE2, 0xEA, 0x52, 0xFD, + 0x68, 0x9E, 0xC1, 0xF0, 0x47, 0x15, 0x65, 0xF6, 0x51, 0xCC, 0x1A, 0xD7, 0xA6, 0xEB, 0x78, 0x03, + 0xA9, 0x35, 0x00, 0xB4, 0x6D, 0x4E, 0x02, 0x60, 0x02, 0x88, 0x47, 0x93, 0xDF, 0x10, 0xD4, 0x28, + 0x7B, 0x0E, 0x02, 0x89, 0x1A, 0xF7, 0x7E, 0x15, 0x68, 0x51, 0xE7, 0x03, 0xD2, 0xD1, 0x89, 0x5B, + 0xC0, 0xE4, 0x3E, 0x48, 0xF3, 0x80, 0xBA, 0x3F, 0x90, 0x46, 0xB8, 0xC5, 0xF5, 0x80, 0x69, 0x4C, + 0xEE, 0x10, 0x03, 0x84, 0x80, 0xBB, 0x3E, 0xB7, 0x19, 0x0C, 0x00, 0xA7, 0x39, 0x93, 0x92, 0xAE, + 0x0F, 0xF8, 0x0A, 0xCF, 0xB5, 0x20, 0x7A, 0xB1, 0xC6, 0x4E, 0x02, 0x21, 0x21, 0xEE, 0x24, 0xA5, + 0xAD, 0x27, 0x13, 0xCE, 0xFA, 0x10, 0xE0, 0xEC, 0x53, 0xC7, 0xDC, 0x18, 0xBE, 0x1F, 0x21, 0x88, + 0xDE, 0xD7, 0xEC, 0x1E, 0xF7, 0x19, 0x0A, 0x6E, 0xBE, 0xF6, 0x08, 0xAF, 0x3C, 0xD1, 0x78, 0x70, + 0x69, 0xEE, 0x76, 0x39, 0xEA, 0xA4, 0xE2, 0xC9, 0x80, 0xEC, 0x16, 0xF7, 0x03, 0x77, 0x7C, 0x7A, + 0x6F, 0xAB, 0x03, 0x6D, 0xD2, 0x58, 0xB6, 0x85, 0x2F, 0xBA, 0x30, 0x19, 0x9F, 0x1B, 0xB5, 0x69, + 0xE0, 0x1D, 0x01, 0x20, 0x21, 0x9D, 0x69, 0x77, 0x9D, 0xAA, 0x6E, 0x7A, 0x3A, 0x8C, 0x18, 0xF0, + 0xE7, 0x20, 0x26, 0xD1, 0x81, 0x8F, 0xBB, 0x35, 0x91, 0x97, 0x65, 0x78, 0xDA, 0x04, 0x44, 0x18, + 0xE1, 0x62, 0x0A, 0x68, 0x82, 0x92, 0xD7, 0xF1, 0x2C, 0x1C, 0x18, 0xCF, 0x86, 0x53, 0x37, 0xE7, + 0x98, 0xFD, 0x4D, 0x05, 0x88, 0x69, 0xBB, 0x61, 0x20, 0x19, 0x8E, 0xA7, 0x19, 0xA6, 0x53, 0x91, + 0x7A, 0x60, 0xB9, 0x0D, 0xB7, 0xE2, 0xD9, 0xA3, 0x06, 0xD2, 0xC9, 0x97, 0x4A, 0x7D, 0x66, 0x7F, + 0x96, 0x76, 0xCF, 0xAD, 0x24, 0xD9, 0xD7, 0xE9, 0x66, 0x79, 0x2C, 0x11, 0x00, 0x4E, 0x75, 0x7A, + 0x63, 0x5E, 0x88, 0xBE, 0x11, 0x78, 0x36, 0xF2, 0xC3, 0xB3, 0x21, 0xE0, 0xD9, 0x68, 0xB6, 0xF6, + 0xF6, 0x0F, 0x3E, 0x1E, 0x7E, 0xAA, 0x0F, 0x3F, 0x6D, 0x60, 0x9B, 0x84, 0x6D, 0x33, 0x3F, 0x6C, + 0x9B, 0x02, 0xB6, 0x1B, 0x38, 0x26, 0xE1, 0xD8, 0xCA, 0x0F, 0xC7, 0xD6, 0x06, 0x8E, 0xA3, 0x70, + 0xDC, 0xCB, 0x0F, 0xC7, 0xBD, 0x0D, 0x1C, 0x47, 0xE1, 0xB8, 0x9F, 0x1F, 0x8E, 0xFB, 0x1B, 0x38, + 0x8E, 0xC2, 0xF1, 0x20, 0x3F, 0x1C, 0x0F, 0x36, 0x70, 0x1C, 0x85, 0xE3, 0xC7, 0xFC, 0x70, 0xFC, + 0x58, 0x2A, 0x1C, 0x4B, 0x85, 0xA4, 0x98, 0x2B, 0x34, 0x88, 0x27, 0x2B, 0x2C, 0x03, 0xD1, 0x45, + 0x36, 0x69, 0xFC, 0x91, 0xAA, 0xCF, 0x16, 0x7D, 0xD8, 0xA3, 0x9F, 0x34, 0x12, 0xF5, 0x11, 0x8B, + 0x7C, 0xD3, 0x81, 0x83, 0xBD, 0x1F, 0x29, 0x00, 0x22, 0x7D, 0x9D, 0xC3, 0x61, 0x0F, 0x69, 0xC0, + 0x8F, 0xB9, 0x76, 0x13, 0x25, 0xFC, 0x4A, 0x0A, 0x2A, 0xF2, 0xC2, 0x9B, 0xBA, 0x86, 0x8B, 0xDD, + 0x99, 0xD1, 0xAD, 0x9B, 0x6D, 0x41, 0xA6, 0xC8, 0xB8, 0xF3, 0x84, 0x79, 0x12, 0x37, 0xDA, 0x9D, + 0xBA, 0xC9, 0x93, 0xE9, 0x61, 0x74, 0xA8, 0x33, 0xBA, 0x41, 0xDD, 0xC0, 0x7D, 0x07, 0xD5, 0xB9, + 0xE9, 0xE1, 0xA4, 0x41, 0x72, 0xDA, 0x80, 0x0B, 0x41, 0x9A, 0x51, 0xFD, 0x8B, 0xB4, 0x54, 0xEF, + 0xAB, 0x90, 0x9B, 0x54, 0x95, 0xA4, 0x95, 0x1E, 0x64, 0x4E, 0x0A, 0x6C, 0xB2, 0x57, 0x48, 0x44, + 0xAA, 0x4C, 0xD2, 0xA6, 0x8C, 0x45, 0xCA, 0x19, 0x57, 0x60, 0xB2, 0x32, 0xDB, 0x67, 0xE8, 0x3E, + 0x31, 0x32, 0xD0, 0xF6, 0x87, 0x8A, 0x34, 0x94, 0xC8, 0x07, 0x13, 0xF4, 0x0E, 0x8B, 0xBA, 0x9E, + 0x27, 0xAE, 0xE8, 0x62, 0x1A, 0xD9, 0xFB, 0x34, 0xDE, 0xC7, 0xBB, 0x9A, 0x1E, 0x38, 0xB0, 0x78, + 0x83, 0x77, 0xB5, 0xD0, 0x0A, 0xFC, 0x99, 0x77, 0xDF, 0xC5, 0xDC, 0x7F, 0x67, 0x72, 0xA9, 0x1C, + 0x18, 0xEE, 0x25, 0xF6, 0xE0, 0xC6, 0xEF, 0x95, 0x89, 0xDC, 0x63, 0x55, 0x44, 0x63, 0xDF, 0xCE, + 0xA8, 0x07, 0x49, 0xF7, 0xBF, 0x54, 0xDD, 0xE0, 0x20, 0x00, 0x8E, 0x9A, 0x54, 0x10, 0x96, 0xAD, + 0x0D, 0xC4, 0x25, 0x15, 0x52, 0x05, 0x26, 0x1A, 0x4E, 0xD8, 0x80, 0x04, 0xB4, 0x32, 0x4A, 0x40, + 0x34, 0xB8, 0xBC, 0xBE, 0x06, 0x30, 0xAD, 0xFC, 0x9B, 0xBE, 0x9E, 0xC9, 0x9A, 0x3F, 0xE6, 0x06, + 0xD5, 0xC6, 0x0C, 0xF5, 0x1F, 0x19, 0xDD, 0xB8, 0xE6, 0x87, 0x1E, 0x11, 0xFE, 0xAD, 0x16, 0xF0, + 0x2B, 0x3C, 0x88, 0xA6, 0x51, 0xE9, 0xCD, 0xF0, 0x7D, 0x86, 0x0D, 0x8E, 0xD4, 0xCE, 0xC3, 0x19, + 0xDC, 0x79, 0xC2, 0xF1, 0xD9, 0x24, 0x4E, 0xD9, 0x68, 0x22, 0xA1, 0xB7, 0xD8, 0x90, 0xD9, 0x2B, + 0xB1, 0x91, 0x84, 0x94, 0x90, 0x59, 0xE4, 0x4F, 0x7F, 0xA4, 0x2C, 0xA3, 0x49, 0x79, 0xE0, 0xCA, + 0x9E, 0xDD, 0x33, 0xFE, 0xFB, 0xE9, 0x8F, 0x23, 0xB5, 0x17, 0xCB, 0xE4, 0xB7, 0x19, 0xBE, 0x7B, + 0xD7, 0xE7, 0xCC, 0x0E, 0x07, 0xF7, 0xDC, 0x63, 0x4E, 0x97, 0x91, 0x0F, 0x09, 0x20, 0xB3, 0x8F, + 0x8A, 0x48, 0xCB, 0xD1, 0x05, 0x66, 0xFF, 0xE7, 0x7F, 0xFC, 0xEF, 0xAE, 0xF9, 0xCC, 0xFD, 0xFF, + 0xFC, 0x8F, 0xFF, 0xC3, 0x5C, 0x78, 0xD1, 0xE7, 0x80, 0xC3, 0x46, 0x8D, 0x9D, 0xD8, 0x2F, 0x41, + 0xDF, 0xB4, 0x7B, 0x4C, 0xBB, 0x77, 0x1E, 0x39, 0xDB, 0xFB, 0xE9, 0x0F, 0x90, 0x41, 0x5F, 0x00, + 0x7D, 0x50, 0x35, 0x3A, 0xB4, 0xF2, 0xC1, 0xCB, 0x3D, 0xEE, 0x53, 0x4F, 0x40, 0x7D, 0xBB, 0xD4, + 0x73, 0x0F, 0x5D, 0x2D, 0xD0, 0x81, 0x48, 0xF7, 0x38, 0xAC, 0x4D, 0x37, 0xB9, 0x5F, 0x63, 0xDF, + 0x1C, 0x40, 0x05, 0x86, 0x33, 0x4A, 0xC0, 0x9A, 0x79, 0x68, 0xF4, 0x36, 0x7D, 0x72, 0x32, 0xF3, + 0xC8, 0xBD, 0x0C, 0x4F, 0x85, 0x06, 0x0C, 0x46, 0x9A, 0x52, 0xD3, 0x66, 0xA7, 0xE8, 0x79, 0x30, + 0x70, 0x0C, 0x5E, 0x63, 0xE7, 0xE2, 0x90, 0x38, 0xC2, 0xC9, 0xD4, 0xD8, 0xB5, 0x39, 0x30, 0xD1, + 0xFB, 0xA7, 0x56, 0xAF, 0xD7, 0x1B, 0xCD, 0x26, 0xB5, 0xAB, 0xC3, 0x17, 0x2A, 0x5B, 0xBF, 0xD8, + 0x93, 0x44, 0xF9, 0x44, 0x19, 0xBE, 0x38, 0x4B, 0x72, 0x54, 0x39, 0x7F, 0x26, 0x90, 0x88, 0x10, + 0x69, 0xF7, 0x0B, 0x51, 0x48, 0x52, 0xEA, 0x14, 0x88, 0x34, 0x56, 0xEE, 0x4C, 0x98, 0x24, 0x46, + 0x09, 0x49, 0x65, 0x1C, 0x77, 0x7C, 0xDB, 0xC2, 0xC2, 0xE8, 0x6C, 0x19, 0x31, 0x31, 0x74, 0xCA, + 0xC8, 0x4F, 0x50, 0x42, 0xD3, 0x1C, 0xAE, 0xA9, 0x0E, 0xE3, 0xF0, 0xC1, 0xB1, 0xE3, 0x7D, 0xDE, + 0x85, 0x5F, 0x62, 0xC8, 0x55, 0x61, 0x51, 0x1D, 0xAE, 0x57, 0x8E, 0x3B, 0x44, 0xAC, 0x3E, 0xBB, + 0xE7, 0xC1, 0x13, 0x07, 0x7A, 0x49, 0xBC, 0xE3, 0xAF, 0x1C, 0xFB, 0x99, 0x32, 0xD7, 0x1A, 0x30, + 0x06, 0xE0, 0x02, 0x02, 0xDD, 0x4C, 0x74, 0xD5, 0x04, 0xAE, 0x60, 0x03, 0x4F, 0x00, 0xDA, 0x87, + 0xA6, 0xC1, 0x38, 0xAE, 0x81, 0x66, 0x1E, 0x78, 0x15, 0xD8, 0x51, 0x37, 0xB4, 0x04, 0xBB, 0x08, + 0xB4, 0x07, 0xE2, 0x58, 0xA9, 0x97, 0x39, 0xBA, 0x66, 0xB0, 0x2E, 0x7F, 0x8A, 0x67, 0xA0, 0xE9, + 0x9E, 0xE3, 0xC3, 0x2F, 0x60, 0x55, 0xF0, 0x36, 0xBC, 0xF8, 0xC8, 0x5F, 0xD8, 0x76, 0x73, 0xEF, + 0x5F, 0x58, 0xDF, 0x09, 0x3D, 0xFF, 0x43, 0x19, 0xCC, 0x2A, 0xE6, 0x4E, 0x0D, 0x7C, 0xE7, 0xB0, + 0xF1, 0xE9, 0x20, 0x1A, 0x1E, 0x18, 0x14, 0xC1, 0x5C, 0x1D, 0x9C, 0x09, 0x9F, 0xB3, 0x0D, 0x8F, + 0x2A, 0x9F, 0x47, 0x11, 0x25, 0x15, 0x65, 0x52, 0xD0, 0xB8, 0x14, 0x2E, 0x55, 0xE4, 0xFB, 0xC2, + 0xB7, 0x60, 0xE1, 0xD4, 0xF3, 0x62, 0x6B, 0x03, 0x53, 0xBF, 0x01, 0x6C, 0xB5, 0xCE, 0x3D, 0xC7, + 0x15, 0x02, 0xAB, 0x9A, 0x52, 0x25, 0xD9, 0xB6, 0x32, 0x76, 0x2F, 0x0F, 0x46, 0x14, 0x29, 0xE7, + 0xA2, 0x0D, 0xA3, 0x46, 0x47, 0x4B, 0xBF, 0x83, 0x9E, 0x18, 0x7F, 0x0F, 0xFD, 0x20, 0x62, 0x2D, + 0x01, 0xF7, 0x6C, 0xCD, 0x62, 0x9A, 0xD5, 0x73, 0x3C, 0x33, 0xE8, 0x0F, 0x90, 0x48, 0x07, 0x5A, + 0xA0, 0xF7, 0xE9, 0x7B, 0xB8, 0x4A, 0x88, 0x9B, 0xAA, 0xE6, 0xBA, 0x70, 0xB7, 0x16, 0x82, 0x12, + 0xB7, 0x1F, 0x4D, 0xCF, 0xB1, 0x71, 0x70, 0xC9, 0xAE, 0xA4, 0x61, 0x99, 0x99, 0x03, 0xB8, 0xD1, + 0x3E, 0x72, 0xD1, 0xB7, 0xC7, 0x75, 0x6E, 0x02, 0x83, 0xD8, 0xF2, 0xC5, 0x30, 0x2E, 0x5C, 0x06, + 0x44, 0x07, 0xC0, 0xC8, 0x92, 0x3C, 0x4F, 0xDA, 0xA9, 0x43, 0xB4, 0xFB, 0x3A, 0x8F, 0xA6, 0x81, + 0xF6, 0x64, 0xE0, 0x1D, 0x1E, 0x70, 0x36, 0x5D, 0x0F, 0x89, 0xD7, 0x44, 0x1E, 0xC0, 0xE8, 0x49, + 0x0E, 0x48, 0x5E, 0x43, 0x3F, 0x3B, 0x1A, 0x31, 0x39, 0x10, 0x4E, 0x1D, 0x80, 0x15, 0xDA, 0x7E, + 0x68, 0x06, 0x18, 0x9C, 0xC2, 0x00, 0x48, 0x01, 0x42, 0x9E, 0x38, 0x11, 0xED, 0x18, 0x35, 0xE8, + 0xC1, 0xDB, 0xF6, 0xA4, 0x25, 0x21, 0x5F, 0xB3, 0xCC, 0x07, 0x6E, 0xA1, 0x5B, 0x07, 0x5A, 0xC5, + 0x41, 0xD0, 0x42, 0x8E, 0x86, 0x4C, 0x12, 0x78, 0x25, 0xCC, 0x3D, 0x1E, 0x0F, 0xA4, 0x44, 0xEC, + 0x1D, 0x04, 0x3B, 0xC1, 0x84, 0xE3, 0x59, 0x8A, 0x79, 0xEB, 0x2F, 0x2B, 0x7D, 0x87, 0x2F, 0xA0, + 0xA3, 0x93, 0x18, 0x3D, 0xDB, 0x2C, 0x2F, 0x3C, 0x11, 0x84, 0x96, 0x35, 0x4D, 0x22, 0x59, 0x82, + 0x4B, 0xB3, 0x28, 0x43, 0x92, 0x9F, 0xE0, 0x51, 0xB3, 0xD7, 0x48, 0xE3, 0x2C, 0x9B, 0x69, 0x28, + 0xB2, 0x86, 0x81, 0x69, 0x5F, 0x58, 0xFC, 0x51, 0x95, 0x2B, 0xDC, 0x00, 0x8E, 0x75, 0xFE, 0xCA, + 0xB0, 0x09, 0xE1, 0xE4, 0xF2, 0x19, 0x03, 0xCC, 0x00, 0x23, 0xBD, 0x18, 0x8F, 0xA6, 0x80, 0x68, + 0x6F, 0x70, 0x0C, 0x6D, 0xF0, 0x89, 0x76, 0x34, 0xA1, 0x10, 0xF0, 0x81, 0x22, 0x2D, 0xCB, 0x0C, + 0x48, 0x6F, 0x75, 0xCF, 0x51, 0xF0, 0x30, 0x04, 0x85, 0xC0, 0xFD, 0xA9, 0xF6, 0x5E, 0x71, 0x5E, + 0xF1, 0xF4, 0x95, 0x07, 0xAF, 0xC4, 0x0D, 0x35, 0xAD, 0xB4, 0x7C, 0x7B, 0x21, 0x1A, 0xE9, 0x25, + 0x50, 0xC1, 0xD9, 0xB7, 0xEF, 0x79, 0x88, 0xE0, 0x6C, 0xF7, 0x5B, 0xFD, 0xF5, 0x90, 0x7F, 0x88, + 0xDC, 0xE8, 0x32, 0xA5, 0x59, 0x22, 0x2C, 0x62, 0x2C, 0xA6, 0x0F, 0xAF, 0xE1, 0x07, 0xC6, 0x29, + 0xC8, 0xBE, 0x48, 0x22, 0xBF, 0x5D, 0x9C, 0x57, 0x2F, 0x3F, 0xB5, 0xE9, 0x38, 0x68, 0xD4, 0xE3, + 0xC7, 0x3F, 0x6E, 0x3E, 0x1D, 0xD6, 0x37, 0xA4, 0xA1, 0x48, 0x1A, 0x88, 0x30, 0xCA, 0x94, 0x01, + 0x2F, 0xAF, 0x0E, 0x61, 0xA0, 0xB2, 0x37, 0x52, 0x4A, 0xDA, 0x3E, 0x62, 0x12, 0x31, 0xD2, 0xB3, + 0x3E, 0xD7, 0x1F, 0x4E, 0x9D, 0x67, 0xEE, 0xAB, 0x92, 0x0D, 0xE9, 0x57, 0x93, 0x5D, 0x40, 0xCB, + 0xF4, 0xDF, 0x2A, 0x56, 0xB6, 0x72, 0xFD, 0x0B, 0xEF, 0x92, 0xB2, 0x16, 0x48, 0x49, 0xBA, 0xE6, + 0x92, 0x94, 0x05, 0x22, 0x11, 0xAC, 0x56, 0xC6, 0xA0, 0x82, 0xD8, 0x24, 0xDE, 0x41, 0xE9, 0x4C, + 0x90, 0x10, 0x1C, 0x1E, 0x9E, 0x03, 0x32, 0x18, 0x90, 0x8A, 0xE9, 0x5A, 0x7C, 0x48, 0x62, 0xF1, + 0x05, 0x34, 0xFE, 0x2A, 0x05, 0x35, 0xB8, 0x0C, 0x77, 0x9C, 0x01, 0x4F, 0x0A, 0x6A, 0x3E, 0x33, + 0x4C, 0x3D, 0x40, 0x89, 0x10, 0xE5, 0x38, 0x9B, 0x03, 0x39, 0xA2, 0x2F, 0x63, 0xE8, 0xA1, 0x50, + 0x09, 0xD3, 0xE0, 0x1E, 0x86, 0x53, 0xA4, 0xBB, 0xA1, 0xF9, 0xB8, 0xF8, 0x09, 0x29, 0x56, 0x88, + 0x0C, 0xE2, 0x72, 0x2C, 0xE4, 0xC0, 0xF4, 0xCB, 0xE4, 0xF4, 0x28, 0x74, 0x7B, 0x59, 0xD9, 0x12, + 0x16, 0x83, 0x42, 0x69, 0xD0, 0x77, 0x7C, 0x1E, 0x2F, 0x0D, 0xA4, 0x5A, 0xE8, 0x24, 0x92, 0x45, + 0x07, 0x62, 0xA9, 0xF7, 0x1C, 0xFF, 0x26, 0x6E, 0x61, 0x84, 0x1E, 0x7E, 0x8E, 0x45, 0x43, 0x5D, + 0xB3, 0xF4, 0x30, 0x5E, 0x5F, 0xCC, 0x41, 0xBE, 0xB6, 0x3B, 0x3B, 0xAC, 0x73, 0x7A, 0x02, 0x3F, + 0xBF, 0x5E, 0x7F, 0xFF, 0x76, 0xD2, 0x81, 0x0F, 0xA7, 0xDC, 0x3C, 0x77, 0xC2, 0x1D, 0xE2, 0x25, + 0x5F, 0x35, 0xCB, 0xB4, 0xB8, 0xB3, 0x6A, 0x1E, 0x91, 0x29, 0xFD, 0xF8, 0x38, 0x9C, 0x9D, 0xC3, + 0x88, 0x54, 0xE8, 0xE8, 0x49, 0xF0, 0x86, 0xD1, 0xE9, 0xBC, 0x16, 0x9F, 0xC0, 0xD9, 0x04, 0xA6, + 0x45, 0x41, 0x5C, 0xDC, 0xF6, 0x69, 0x32, 0xF2, 0x02, 0xE3, 0x57, 0xF2, 0x80, 0x40, 0x47, 0x3E, + 0x22, 0x98, 0x8C, 0xBA, 0xCE, 0x6C, 0xA4, 0x03, 0x79, 0xD8, 0x0A, 0x46, 0xC3, 0x6D, 0xA4, 0xE1, + 0xBB, 0xCC, 0xEC, 0x2A, 0xC7, 0x17, 0xF4, 0x9C, 0xE1, 0x17, 0x2C, 0xF9, 0x8D, 0xA2, 0xF6, 0x43, + 0xB0, 0xFC, 0xD1, 0xA1, 0xE9, 0x79, 0x64, 0x03, 0xA3, 0x47, 0xF7, 0xCE, 0x73, 0xEC, 0x7B, 0x21, + 0x58, 0xE7, 0x84, 0x29, 0x0D, 0xED, 0xBB, 0x59, 0x58, 0x12, 0x67, 0x45, 0x2B, 0xEF, 0xD2, 0xA5, + 0x86, 0x1F, 0xC8, 0x26, 0x10, 0x44, 0x7A, 0x62, 0x3A, 0x09, 0xB2, 0x16, 0x50, 0x34, 0xD6, 0xC1, + 0x98, 0xAB, 0x40, 0xE0, 0xAE, 0x63, 0xF1, 0x6B, 0x6E, 0xF7, 0x82, 0xFE, 0x74, 0xB3, 0xE1, 0xFC, + 0x24, 0x9C, 0x3D, 0x0E, 0x11, 0xC6, 0xED, 0x78, 0x74, 0x45, 0x05, 0xAC, 0x9A, 0xC8, 0x89, 0xDD, + 0x32, 0xD1, 0x2F, 0xDB, 0x1E, 0x7C, 0x78, 0x7D, 0x65, 0x31, 0x4D, 0xC8, 0x12, 0x13, 0x22, 0x8D, + 0xC5, 0x14, 0xFC, 0x6A, 0xD4, 0x0E, 0x07, 0x6F, 0xD6, 0xCC, 0x33, 0x9F, 0xD4, 0x59, 0x4C, 0xFA, + 0xCC, 0x20, 0x9A, 0xEA, 0x18, 0xEE, 0x98, 0xC6, 0x73, 0x69, 0x43, 0x95, 0x55, 0xC8, 0xCB, 0xD3, + 0x9A, 0xAA, 0x1D, 0x3E, 0x39, 0x0E, 0x9D, 0x6F, 0x81, 0x67, 0xBA, 0xC0, 0xD2, 0x31, 0xB6, 0x3C, + 0x3A, 0x6F, 0xBE, 0xDD, 0xDD, 0x5E, 0xB5, 0x99, 0x78, 0xA8, 0x20, 0xE0, 0xCE, 0x7F, 0xCC, 0xA4, + 0x26, 0xB1, 0x34, 0x51, 0x9A, 0xCE, 0x0D, 0xD4, 0x9C, 0x8A, 0xF5, 0xEA, 0x34, 0x3E, 0xCA, 0x98, + 0xA8, 0xFC, 0xC2, 0xA8, 0x69, 0xC0, 0x71, 0x10, 0xA7, 0x45, 0xD2, 0x17, 0x1C, 0x4A, 0xC8, 0x95, + 0x1A, 0x88, 0x8F, 0x3E, 0xC9, 0x9A, 0x3E, 0xF7, 0x30, 0x46, 0xA7, 0xC6, 0x7E, 0x75, 0x42, 0x2F, + 0x0A, 0xD8, 0x19, 0x84, 0x7E, 0x80, 0xD7, 0xD4, 0x27, 0x13, 0x0D, 0xD6, 0x22, 0x20, 0xD9, 0x43, + 0xF7, 0x32, 0xA6, 0x05, 0x0C, 0x6D, 0x7A, 0x81, 0x39, 0xE0, 0x49, 0xA9, 0xF3, 0xDC, 0xF4, 0xD5, + 0xCE, 0xA7, 0xD5, 0x0B, 0xB4, 0xC1, 0x1D, 0xB4, 0x87, 0x7B, 0x17, 0x39, 0xC0, 0x8C, 0x0D, 0x11, + 0x5B, 0x8C, 0x94, 0x99, 0x38, 0x9E, 0x92, 0x13, 0x81, 0x0D, 0xE2, 0xDE, 0x4F, 0x8E, 0xAF, 0xC2, + 0xF9, 0x67, 0x7A, 0x61, 0xEE, 0x8F, 0x1C, 0x57, 0xA2, 0xFF, 0xD9, 0x5D, 0xE3, 0x0C, 0x8E, 0x14, + 0x85, 0xB5, 0x49, 0xCE, 0x98, 0x07, 0xB9, 0xCD, 0x4E, 0x33, 0x1C, 0x32, 0xC7, 0xC3, 0x49, 0xDD, + 0xE4, 0x34, 0xB6, 0xFD, 0x52, 0xAC, 0x4E, 0x4B, 0xC7, 0xA0, 0x76, 0x3A, 0x67, 0xD7, 0x2B, 0x60, + 0x10, 0xCE, 0x60, 0xF9, 0x18, 0x34, 0xF3, 0x84, 0x1E, 0x0F, 0xA9, 0x39, 0x70, 0x08, 0xDB, 0xBF, + 0x4D, 0x1C, 0x82, 0x53, 0xC6, 0x7B, 0x5D, 0x1C, 0xC2, 0x19, 0xAC, 0x3E, 0x17, 0x22, 0x38, 0xCD, + 0x81, 0x41, 0xD8, 0xFE, 0xED, 0x62, 0x50, 0xFB, 0xE7, 0xF9, 0x70, 0x68, 0xD2, 0xC5, 0x2B, 0x0F, + 0x0E, 0xB1, 0xF6, 0xCF, 0xC5, 0xD1, 0xE8, 0xA3, 0x40, 0xE2, 0xA5, 0xA0, 0x11, 0x00, 0x6B, 0x4E, + 0x44, 0x6A, 0xFF, 0xFC, 0xD6, 0x50, 0xE9, 0xC6, 0x09, 0x6D, 0xB8, 0x17, 0x99, 0x76, 0x50, 0x29, + 0xC2, 0x6B, 0xA8, 0xB9, 0xCA, 0x71, 0x05, 0x03, 0xAC, 0x32, 0xAF, 0x49, 0x80, 0xA1, 0x10, 0x8A, + 0x0C, 0xDB, 0xBF, 0x5D, 0x04, 0x59, 0x14, 0xAF, 0xC9, 0x83, 0x43, 0x0A, 0xAF, 0xAD, 0x34, 0x33, + 0x4A, 0x41, 0x73, 0x4E, 0x4C, 0x5B, 0x3D, 0x66, 0x14, 0x6B, 0x21, 0x1A, 0xA9, 0x38, 0x21, 0x45, + 0xCC, 0x9B, 0xAE, 0x96, 0x48, 0x80, 0xE0, 0x0E, 0x93, 0x79, 0x0E, 0xCC, 0xE0, 0xEB, 0xD7, 0x93, + 0xCA, 0x71, 0xF4, 0x07, 0x83, 0xBF, 0xF0, 0x92, 0x2E, 0x98, 0xF5, 0x12, 0x34, 0xE1, 0x13, 0x26, + 0x34, 0x7B, 0x4F, 0x43, 0x9B, 0x7A, 0xE4, 0xC6, 0xF2, 0x55, 0xE2, 0x64, 0xB2, 0xD3, 0x09, 0x42, + 0x98, 0x3A, 0xEF, 0xF7, 0xD0, 0x44, 0x47, 0x2E, 0xF8, 0xD4, 0x0B, 0x2D, 0xCD, 0x1B, 0x1A, 0xC2, + 0x64, 0x9E, 0x37, 0xD2, 0x6B, 0x90, 0xA5, 0x0D, 0x9D, 0x49, 0xD9, 0x36, 0x82, 0x78, 0x20, 0xA2, + 0xE1, 0x3E, 0x30, 0x5F, 0xE6, 0x29, 0xC1, 0xEF, 0x45, 0x97, 0xF0, 0xCB, 0x66, 0x5A, 0x18, 0x38, + 0x03, 0x4C, 0x3A, 0xAB, 0x59, 0xD6, 0x8B, 0x8C, 0xA6, 0x92, 0x06, 0x41, 0xCD, 0xE3, 0x7E, 0xC0, + 0xB4, 0x47, 0xCD, 0xA4, 0xF4, 0xC4, 0x59, 0x35, 0xCA, 0x18, 0xDD, 0xC7, 0x9A, 0xC6, 0x59, 0x29, + 0xAA, 0x48, 0x24, 0x28, 0xD1, 0x41, 0xF3, 0x54, 0x44, 0x1C, 0x4D, 0x1B, 0x4F, 0x46, 0x32, 0xC5, + 0x86, 0x96, 0x1E, 0x0F, 0x64, 0x64, 0xE2, 0xB5, 0xE9, 0x07, 0xDB, 0x1F, 0x46, 0x42, 0xF6, 0x06, + 0x06, 0xFD, 0x92, 0xF9, 0x5D, 0x27, 0xC6, 0x3C, 0xCD, 0xD0, 0x89, 0x29, 0x04, 0x44, 0xCD, 0x8C, + 0x7D, 0xC2, 0x00, 0xB3, 0xE9, 0xC3, 0x14, 0x8C, 0x8D, 0xC2, 0x8E, 0x67, 0x6C, 0xA4, 0x84, 0x11, + 0x05, 0xF9, 0xF8, 0xC9, 0x08, 0x29, 0x68, 0x5B, 0x42, 0x90, 0xD4, 0x70, 0xCB, 0x67, 0x86, 0x2D, + 0x96, 0xAC, 0xA6, 0xFC, 0x76, 0x73, 0x71, 0x42, 0xE6, 0xE7, 0xDB, 0x93, 0x9F, 0x7F, 0xA1, 0x24, + 0x3F, 0x48, 0x65, 0xC1, 0x93, 0xC3, 0x06, 0x8E, 0x4F, 0x46, 0x89, 0x81, 0x63, 0x93, 0xC5, 0x1F, + 0x53, 0x8C, 0xA3, 0x31, 0x1E, 0xB6, 0xD2, 0x17, 0xFE, 0x9D, 0x02, 0x24, 0xF7, 0x61, 0x90, 0xB6, + 0xA3, 0xFB, 0xA1, 0x8B, 0xEF, 0xFA, 0xC2, 0xC1, 0x13, 0xA8, 0xDB, 0x66, 0x1F, 0xEB, 0x89, 0x74, + 0x41, 0xB2, 0xA1, 0x5F, 0x63, 0x17, 0x9A, 0xDE, 0x8F, 0xFB, 0x11, 0x1E, 0xE7, 0x82, 0x95, 0xCA, + 0xCD, 0x62, 0x4F, 0x7D, 0x73, 0xF8, 0x86, 0xC8, 0x41, 0x64, 0x48, 0xA2, 0x66, 0xDB, 0xF5, 0x0F, + 0x34, 0xF1, 0xBE, 0xF3, 0x04, 0xD3, 0x09, 0xD0, 0x41, 0x9D, 0x7C, 0xD8, 0x45, 0x6F, 0x94, 0xD4, + 0x53, 0x4E, 0x79, 0xBB, 0xC1, 0xBE, 0x00, 0xC6, 0x0F, 0xBF, 0x8C, 0xBF, 0xC1, 0x20, 0xA0, 0x06, + 0x7A, 0xFA, 0xEC, 0xB0, 0x7D, 0xF9, 0x8E, 0xF8, 0x4E, 0x7A, 0xD2, 0xEF, 0x33, 0x8A, 0x17, 0xFA, + 0x90, 0x60, 0x2A, 0x04, 0x30, 0x60, 0x61, 0x3B, 0xEC, 0x6B, 0x87, 0x7E, 0xDC, 0xE1, 0x8F, 0xBF, + 0x0A, 0x1B, 0xFE, 0xED, 0xCD, 0x99, 0x0C, 0xD6, 0xF1, 0x8F, 0x58, 0x1D, 0x0F, 0x92, 0x66, 0x7D, + 0x7D, 0x53, 0x1C, 0xCD, 0x8A, 0xC1, 0x9B, 0x41, 0x37, 0x53, 0x12, 0x71, 0x8D, 0xC9, 0xFD, 0xB6, + 0x3F, 0x36, 0xF5, 0xDB, 0xD8, 0x3E, 0x0B, 0x07, 0x2E, 0x27, 0x39, 0xE0, 0x68, 0xF0, 0xB2, 0x3D, + 0xE0, 0x9A, 0xDC, 0x66, 0x7F, 0x52, 0xE4, 0xB2, 0xA2, 0xAD, 0x2F, 0x66, 0xAF, 0x14, 0x20, 0x7B, + 0xE7, 0x74, 0x28, 0xEE, 0xC2, 0xB4, 0x7B, 0x51, 0xFF, 0xC3, 0x80, 0x65, 0xC0, 0x91, 0xF8, 0xDB, + 0x08, 0xCB, 0x7C, 0xD5, 0xF0, 0x65, 0xD5, 0x08, 0x84, 0x05, 0x41, 0x4C, 0x86, 0xBF, 0x2D, 0x08, + 0x68, 0xD7, 0xE9, 0xDE, 0x53, 0x20, 0x93, 0xDF, 0x15, 0x05, 0x98, 0x12, 0x9A, 0x25, 0x0E, 0x57, + 0x3C, 0x1B, 0x2B, 0x4B, 0xB0, 0xD3, 0xA9, 0x3C, 0x9F, 0xB4, 0x86, 0x4C, 0x18, 0x34, 0x85, 0xE7, + 0xBC, 0x6E, 0x18, 0xB4, 0x48, 0x30, 0xED, 0x2F, 0x2C, 0x49, 0xE2, 0x69, 0xA2, 0xEF, 0x5C, 0x47, + 0x7F, 0xA2, 0xE1, 0xA4, 0x0D, 0x41, 0x60, 0x8E, 0x49, 0x90, 0x5C, 0x39, 0x1E, 0x05, 0x61, 0xF4, + 0x2F, 0x01, 0xF1, 0x4C, 0x28, 0x35, 0x01, 0x61, 0xC5, 0x42, 0xA9, 0xA7, 0xC3, 0xA0, 0x70, 0x12, + 0x45, 0x1C, 0x42, 0x44, 0x99, 0x5D, 0xD9, 0x22, 0xEB, 0xCA, 0x6C, 0xE3, 0x6E, 0x2A, 0x6F, 0x4B, + 0x04, 0xAF, 0x3B, 0x78, 0xD8, 0x91, 0x1D, 0x45, 0xD9, 0x5C, 0xA2, 0xE7, 0xE9, 0x5B, 0xB2, 0x6C, + 0x38, 0xFB, 0x3A, 0x94, 0xD4, 0x4D, 0x8C, 0x0C, 0x71, 0x2C, 0x3E, 0x55, 0xAF, 0xEC, 0xA5, 0x7B, + 0x5D, 0x5E, 0x89, 0xA8, 0x3F, 0x17, 0x24, 0x28, 0x13, 0x50, 0x28, 0x0E, 0x57, 0x06, 0x21, 0x4B, + 0x63, 0x38, 0x51, 0xE6, 0xCB, 0xB0, 0x1A, 0xCA, 0x8E, 0x1D, 0xB0, 0x07, 0x9B, 0x4A, 0x7B, 0x04, + 0x14, 0xA5, 0x7C, 0xCF, 0x99, 0x73, 0x4F, 0x29, 0xA6, 0x41, 0x52, 0x7F, 0xC1, 0x18, 0x67, 0x3F, + 0x3A, 0x4F, 0x30, 0xCE, 0x19, 0x7B, 0x8E, 0x7A, 0xAC, 0x51, 0x98, 0x1F, 0xF5, 0x08, 0x3D, 0xA1, + 0x68, 0x43, 0xBE, 0xCE, 0x28, 0xF6, 0xD0, 0xCC, 0x45, 0x98, 0x8E, 0xF6, 0x80, 0xA2, 0x96, 0xEB, + 0x7A, 0xCE, 0x33, 0x10, 0x76, 0x80, 0x61, 0x32, 0x07, 0xF5, 0x38, 0xA0, 0xF0, 0x09, 0xA4, 0xA3, + 0xBE, 0x88, 0x91, 0xD1, 0x8C, 0x28, 0xD5, 0xA4, 0x98, 0x00, 0xCE, 0x16, 0xEF, 0x66, 0x5D, 0x98, + 0x59, 0xBC, 0x08, 0x1C, 0xCD, 0x60, 0x8E, 0x9D, 0x0D, 0x6C, 0x8C, 0xE2, 0x20, 0x07, 0x3C, 0xE8, + 0x3B, 0x06, 0x03, 0x49, 0xD0, 0xE4, 0x18, 0x57, 0xF4, 0xEF, 0xAD, 0xBA, 0x3E, 0x18, 0x13, 0x16, + 0x84, 0x62, 0x26, 0xDE, 0x0C, 0x1F, 0x81, 0xD5, 0xD4, 0xD8, 0x95, 0xAD, 0xC3, 0xF8, 0x7E, 0x14, + 0x1F, 0x14, 0xB9, 0x76, 0x7F, 0xBF, 0x47, 0xAB, 0xB9, 0x18, 0xF8, 0xCE, 0x1C, 0xF0, 0x28, 0x4E, + 0xFB, 0x56, 0x5C, 0x52, 0x0D, 0x0C, 0xD8, 0xB7, 0x19, 0xA6, 0x6F, 0x4E, 0xB8, 0x82, 0x9A, 0xA2, + 0x2F, 0x1E, 0xC7, 0xF4, 0xD0, 0x58, 0x24, 0xF5, 0x62, 0xB8, 0x11, 0x4C, 0xC1, 0xC4, 0x30, 0xA8, + 0x53, 0x8E, 0xA9, 0xF2, 0x87, 0x2F, 0x99, 0x7E, 0x34, 0x69, 0x83, 0xCC, 0xF1, 0x14, 0x61, 0x59, + 0x85, 0x57, 0x06, 0x71, 0x58, 0xB8, 0x8C, 0x18, 0xA2, 0x0C, 0x99, 0x98, 0x09, 0x83, 0x12, 0xCC, + 0x0F, 0x5D, 0xCA, 0xEB, 0x22, 0x2E, 0x6A, 0xBF, 0x56, 0x1F, 0x0C, 0xA5, 0xC6, 0x03, 0x12, 0x1B, + 0x3F, 0xD5, 0xEB, 0xFE, 0x0E, 0x6B, 0xD4, 0xE8, 0x0F, 0x7A, 0x61, 0x3D, 0xED, 0xF7, 0x11, 0x2B, + 0x78, 0x5D, 0xE3, 0xBD, 0x33, 0x44, 0x0B, 0x19, 0x45, 0x3C, 0x55, 0x4D, 0xDD, 0x68, 0x8E, 0x8B, + 0x5A, 0x40, 0x04, 0x53, 0xC8, 0x50, 0x93, 0xC0, 0x40, 0xF4, 0xC5, 0x60, 0xDB, 0xFE, 0x87, 0xE2, + 0xAA, 0xC4, 0x54, 0xAC, 0xA8, 0x4A, 0xC0, 0x54, 0x7E, 0x63, 0xEB, 0x18, 0xD8, 0xA8, 0x6B, 0x14, + 0x47, 0x1B, 0xBF, 0x09, 0xC5, 0x75, 0x62, 0x59, 0x6D, 0xC9, 0x7F, 0x4E, 0xA2, 0x78, 0xBF, 0xB9, + 0x94, 0xD7, 0x63, 0x30, 0x2B, 0x62, 0x4D, 0xB3, 0xFB, 0x25, 0xDE, 0xD5, 0x3A, 0x67, 0x9D, 0x00, + 0xB8, 0x06, 0x9E, 0xC9, 0x31, 0x1F, 0x9B, 0xDD, 0x16, 0xDD, 0x1E, 0xE7, 0xC0, 0x42, 0xC2, 0x3F, + 0x89, 0x8A, 0xF7, 0x8A, 0xAE, 0xC9, 0x45, 0xB1, 0x70, 0x04, 0xE2, 0x85, 0xD0, 0x31, 0xDB, 0xCB, + 0x2A, 0x07, 0x2E, 0x8B, 0x8A, 0x1A, 0x70, 0x18, 0xCF, 0x2D, 0x30, 0x5D, 0x62, 0x2F, 0xA3, 0xD2, + 0x52, 0x9C, 0xBB, 0x76, 0x8C, 0xDC, 0x94, 0x53, 0x5E, 0x12, 0x23, 0x1C, 0xD3, 0xAF, 0xD4, 0x91, + 0x23, 0x2A, 0xC4, 0x1C, 0xB3, 0xED, 0xB3, 0xBE, 0x83, 0xD1, 0x13, 0x98, 0x48, 0x9F, 0x39, 0x0A, + 0xC6, 0xDF, 0xAF, 0xB2, 0x1A, 0xC0, 0x87, 0x28, 0xD9, 0xFC, 0x2B, 0x89, 0x5F, 0x49, 0xB1, 0x2B, + 0x48, 0x88, 0x49, 0xB1, 0xB0, 0x85, 0xD2, 0x07, 0x08, 0x5B, 0x54, 0x2E, 0x43, 0x08, 0x4E, 0x1C, + 0x8E, 0x7D, 0x10, 0x09, 0xE4, 0x52, 0xE3, 0x95, 0xB0, 0x44, 0xB5, 0x01, 0x14, 0x55, 0x84, 0x1F, + 0x20, 0x06, 0x28, 0xA7, 0x15, 0x65, 0x42, 0xFA, 0x18, 0x0C, 0xB8, 0x61, 0x0A, 0x31, 0xEB, 0x9E, + 0xF7, 0xCC, 0x28, 0x00, 0x9A, 0x7C, 0x00, 0x6F, 0xEF, 0xCE, 0x6E, 0x46, 0x15, 0xDC, 0x27, 0x52, + 0x74, 0x8B, 0x65, 0x23, 0xD3, 0x17, 0x82, 0x57, 0x2C, 0x07, 0x92, 0x3C, 0xD2, 0x6E, 0xB7, 0xD9, + 0xB6, 0x2B, 0xCA, 0xD9, 0xF8, 0x1C, 0xA4, 0xC4, 0xD0, 0x63, 0x41, 0x18, 0x38, 0x70, 0x27, 0xB2, + 0x3E, 0x50, 0x82, 0x6E, 0x7C, 0x2B, 0x23, 0x9F, 0x30, 0xAD, 0x07, 0x5D, 0xA0, 0x82, 0x1D, 0xE6, + 0x49, 0x0A, 0x3B, 0x3D, 0x16, 0x3F, 0x13, 0xB2, 0x4B, 0x54, 0x16, 0x65, 0xCB, 0x1F, 0xC2, 0x0D, + 0x73, 0x42, 0x38, 0xA1, 0x65, 0x70, 0x6F, 0x07, 0xAE, 0x41, 0x96, 0x03, 0xF8, 0xE5, 0xAC, 0xA9, + 0xD8, 0x42, 0xF0, 0x2D, 0x43, 0x66, 0x51, 0x09, 0xE4, 0x98, 0x44, 0xD4, 0x34, 0x09, 0x71, 0x4D, + 0x8B, 0xD0, 0x09, 0x29, 0x50, 0xD4, 0xAF, 0x90, 0xE9, 0x2D, 0x25, 0x06, 0xA4, 0xC8, 0xBC, 0xAE, + 0x7E, 0x46, 0x0D, 0xF9, 0x40, 0x11, 0x53, 0x1B, 0x31, 0x86, 0x69, 0xB3, 0xA4, 0x6A, 0x1A, 0x6C, + 0xF8, 0x85, 0x1F, 0xD1, 0xF6, 0xF8, 0x72, 0x1D, 0x39, 0x8F, 0xF9, 0xA8, 0xC6, 0xC5, 0xAC, 0x7D, + 0x5A, 0x68, 0x04, 0x43, 0xA2, 0x75, 0xAA, 0x40, 0x5A, 0xCA, 0xE7, 0xE0, 0x70, 0xE4, 0xD4, 0x57, + 0x74, 0x3A, 0x9F, 0xA8, 0x79, 0x0B, 0x7D, 0x82, 0x70, 0x02, 0xB4, 0x4A, 0xB9, 0x16, 0x73, 0x84, + 0x2A, 0xC4, 0xDA, 0xB8, 0xD1, 0xA1, 0x50, 0x13, 0x77, 0x8D, 0x1E, 0xCC, 0xB4, 0xBD, 0x97, 0x68, + 0xDE, 0xFB, 0xED, 0xE2, 0x5C, 0x51, 0x05, 0xB7, 0x08, 0xBB, 0x64, 0x86, 0xA1, 0xB7, 0x43, 0x99, + 0xFB, 0x42, 0x06, 0x2C, 0x8A, 0x79, 0x26, 0x98, 0x32, 0x66, 0xAB, 0x70, 0xE8, 0x0D, 0xC1, 0x48, + 0x7F, 0xD9, 0xFD, 0x75, 0xF7, 0x37, 0x04, 0x14, 0xF7, 0xD7, 0x33, 0xA5, 0x96, 0x7A, 0x14, 0xC1, + 0xB2, 0x88, 0x21, 0x95, 0x10, 0xAA, 0xA5, 0x8C, 0xF0, 0x59, 0xC6, 0x72, 0x21, 0x2A, 0xED, 0x4C, + 0xA2, 0xB0, 0x24, 0x49, 0xFD, 0x72, 0x94, 0x23, 0xE6, 0x44, 0x01, 0x62, 0x53, 0xAF, 0x64, 0x87, + 0x8B, 0x89, 0x4D, 0x49, 0xAC, 0x39, 0x5F, 0x5C, 0xCA, 0xB0, 0xE1, 0x52, 0x63, 0x52, 0xD6, 0x10, + 0x9B, 0x7E, 0x55, 0xC3, 0xA6, 0x5F, 0xDF, 0x12, 0x36, 0xFD, 0x5A, 0x14, 0x9B, 0x7E, 0xDD, 0x60, + 0xD3, 0x74, 0x6C, 0xFA, 0x4D, 0x0D, 0x9B, 0x7E, 0x7B, 0x4B, 0xD8, 0xF4, 0x5B, 0x51, 0x6C, 0xFA, + 0x6D, 0x83, 0x4D, 0xE3, 0xFD, 0x24, 0x41, 0xCE, 0x42, 0x79, 0x5E, 0x48, 0xF6, 0x2A, 0xF8, 0xA4, + 0x98, 0x83, 0xFD, 0x95, 0x51, 0x6A, 0x96, 0x43, 0x63, 0x72, 0xD9, 0xF9, 0x50, 0x2A, 0xD9, 0xF4, + 0xED, 0x20, 0x95, 0xD8, 0xCE, 0xB3, 0xC8, 0xE5, 0xE6, 0x07, 0x1A, 0x4E, 0x12, 0x62, 0xF7, 0x0A, + 0xE4, 0xB8, 0xA4, 0xC4, 0x69, 0xA8, 0x68, 0xE8, 0xA6, 0xC4, 0x69, 0xA9, 0x19, 0xA1, 0x6C, 0x18, + 0x20, 0x58, 0xFF, 0x1E, 0xC2, 0xF6, 0xC0, 0x02, 0x74, 0xC7, 0x7D, 0xD9, 0x75, 0xD1, 0xA9, 0x4F, + 0x2A, 0x51, 0x46, 0x44, 0xF0, 0xB5, 0x17, 0xBC, 0xF3, 0xE4, 0x89, 0x5C, 0x34, 0x43, 0xCA, 0x75, + 0xF1, 0xCA, 0x52, 0xD1, 0x1D, 0xD1, 0xEA, 0xA4, 0x5A, 0x91, 0xDF, 0xE4, 0x9B, 0x47, 0x62, 0xC7, + 0xA6, 0x97, 0x39, 0x1D, 0x3F, 0x68, 0x32, 0x5F, 0x5C, 0x47, 0xE8, 0x93, 0xCE, 0xB2, 0x45, 0x39, + 0x71, 0x52, 0x93, 0xBE, 0xC3, 0x2A, 0xEB, 0x58, 0x4A, 0x46, 0x1D, 0x49, 0x62, 0xA7, 0x97, 0xA8, + 0xBC, 0x6E, 0x6B, 0xBF, 0xAE, 0xE8, 0xF2, 0x12, 0x4F, 0xDB, 0xA1, 0xAC, 0x32, 0x89, 0xE2, 0x5F, + 0xD7, 0x52, 0xDB, 0x75, 0xC2, 0x92, 0x55, 0x3E, 0x59, 0xB2, 0x3E, 0x27, 0x4B, 0x55, 0xD6, 0x14, + 0x3D, 0x14, 0x1F, 0xB3, 0x39, 0x1C, 0xF3, 0x74, 0x59, 0x63, 0xB6, 0x68, 0xCC, 0xB3, 0x65, 0x0D, + 0xB7, 0x57, 0x39, 0x3E, 0xC1, 0x13, 0xED, 0xAE, 0xAF, 0x05, 0x57, 0xFE, 0x9D, 0xE3, 0x5C, 0x3B, + 0x76, 0xEF, 0xCE, 0x39, 0xE5, 0xE7, 0x02, 0x0F, 0x81, 0xAB, 0x4C, 0x9C, 0x49, 0xBE, 0xCC, 0xB2, + 0xC5, 0xA7, 0xAD, 0x90, 0x89, 0x70, 0x95, 0x85, 0x94, 0x11, 0x63, 0x54, 0x99, 0xCA, 0x28, 0xCD, + 0x30, 0xD2, 0xA2, 0x4B, 0xC9, 0x1A, 0x28, 0xD9, 0x3F, 0xAA, 0x9D, 0x4E, 0x0C, 0x23, 0xAF, 0x9E, + 0x69, 0x8A, 0xF7, 0x9A, 0xB6, 0xD8, 0x79, 0x47, 0x03, 0x44, 0xFA, 0xB2, 0xD2, 0x66, 0x6E, 0x70, + 0xAC, 0x9B, 0xBE, 0xD0, 0xB9, 0x0F, 0x87, 0xC0, 0xD9, 0x9F, 0xD3, 0x5F, 0xAB, 0xA3, 0xE1, 0x03, + 0x34, 0x00, 0x41, 0x63, 0x47, 0x24, 0xF7, 0xD7, 0x0C, 0x0A, 0x31, 0xD8, 0x21, 0x85, 0x5E, 0x5C, + 0x78, 0xC5, 0xE3, 0x3A, 0x9C, 0x20, 0x09, 0x31, 0x83, 0xDE, 0x16, 0xCB, 0x62, 0x66, 0xF0, 0xD6, + 0xF5, 0x7C, 0xE5, 0x98, 0xD0, 0x17, 0x60, 0xBE, 0xF8, 0xCA, 0x9D, 0xA9, 0xD6, 0x8B, 0xC6, 0x2A, + 0x58, 0x2F, 0x70, 0x92, 0xC7, 0x91, 0x39, 0xAF, 0x74, 0xA3, 0x45, 0x54, 0xFF, 0xBC, 0xA8, 0x81, + 0x69, 0xAD, 0xCD, 0x16, 0x5F, 0xE3, 0xC5, 0x0F, 0x4D, 0x17, 0xEA, 0x94, 0xA8, 0xC2, 0xED, 0x52, + 0xA6, 0x8B, 0x31, 0xC3, 0xC5, 0xE6, 0x8B, 0xEB, 0xEB, 0xBE, 0xFA, 0xC8, 0x6B, 0x60, 0xE6, 0x80, + 0xF5, 0x64, 0x2D, 0x1B, 0xF8, 0x68, 0x63, 0xD7, 0x28, 0x31, 0x4D, 0x19, 0x81, 0xF5, 0x5A, 0x0B, + 0xE8, 0xBE, 0x94, 0x2B, 0x49, 0xD9, 0x38, 0x3A, 0x9B, 0x54, 0x88, 0x0F, 0x06, 0x30, 0x83, 0xD0, + 0xC8, 0xA5, 0xE3, 0x29, 0x37, 0x8D, 0xD6, 0x0C, 0xDD, 0x4D, 0x0A, 0x0C, 0x05, 0xD4, 0x81, 0xB2, + 0xE9, 0x1B, 0xD3, 0xDD, 0x24, 0x51, 0x04, 0xAF, 0x30, 0x8B, 0xC5, 0x11, 0x18, 0x61, 0x1D, 0x90, + 0x24, 0x02, 0x44, 0x11, 0x2C, 0x91, 0x6D, 0xDF, 0x96, 0xDE, 0x58, 0x48, 0xF0, 0x01, 0x89, 0xA9, + 0x97, 0x58, 0x5C, 0x20, 0x18, 0xAB, 0xF4, 0xCD, 0xA9, 0x49, 0x9E, 0x14, 0xF7, 0x0C, 0xB2, 0xBB, + 0x18, 0x8A, 0x89, 0xB1, 0x72, 0x60, 0x4B, 0x5A, 0x5B, 0x94, 0x9E, 0xF2, 0x74, 0x7D, 0xD1, 0x5A, + 0x9B, 0xAE, 0xF3, 0xB7, 0x1E, 0xCB, 0x01, 0x4E, 0x2C, 0xC1, 0xC3, 0x2B, 0xB3, 0x89, 0x7B, 0x34, + 0x9B, 0xC1, 0x4F, 0x27, 0x17, 0xEA, 0xC7, 0xF5, 0x8D, 0xE6, 0x3D, 0xEC, 0xC2, 0x70, 0xEA, 0xB9, + 0x2D, 0x17, 0x25, 0x99, 0x24, 0xA4, 0x93, 0x9F, 0x38, 0xB6, 0x65, 0x27, 0x54, 0x51, 0xED, 0xC2, + 0xB2, 0x4C, 0xD7, 0x77, 0x4C, 0x23, 0xAE, 0x70, 0x04, 0x53, 0x8E, 0x0A, 0x21, 0x49, 0x21, 0x26, + 0x16, 0xD0, 0xF0, 0x9E, 0xA6, 0x49, 0xE0, 0x25, 0xDF, 0xC7, 0xE7, 0x03, 0xC7, 0x0E, 0xA9, 0x84, + 0x87, 0x0C, 0x28, 0xC0, 0x6D, 0xB2, 0x8D, 0x5C, 0xC2, 0xCD, 0xE2, 0x05, 0x9C, 0x5C, 0x42, 0x8E, + 0xBA, 0x1E, 0x79, 0x26, 0x13, 0xDF, 0xCB, 0x25, 0xE3, 0xE5, 0x37, 0xFE, 0xC5, 0x18, 0xAD, 0xBC, + 0x2C, 0x45, 0xB3, 0x93, 0xEA, 0x7B, 0xEE, 0xE8, 0x5C, 0x96, 0x51, 0x36, 0x6D, 0x3E, 0xCE, 0xA2, + 0x5A, 0xE9, 0x7A, 0x2F, 0x8F, 0x72, 0x7A, 0x72, 0xC5, 0x6B, 0xA4, 0x94, 0x74, 0xB9, 0xEB, 0x46, + 0x25, 0xA9, 0x4A, 0xC3, 0xCA, 0x40, 0xC0, 0x5D, 0x66, 0xE7, 0x52, 0xCE, 0x30, 0x36, 0x8A, 0x1D, + 0xD3, 0x2C, 0x1D, 0xDA, 0x22, 0xBF, 0xC1, 0xE4, 0x4E, 0x22, 0xCD, 0x39, 0x67, 0xF0, 0x88, 0x78, + 0x50, 0x91, 0x93, 0x65, 0x21, 0x37, 0xA3, 0xAB, 0x2E, 0x13, 0xA9, 0x3F, 0x8D, 0x9D, 0x78, 0x72, + 0x22, 0x9D, 0xBD, 0x9C, 0x32, 0x45, 0x4A, 0xFD, 0xB3, 0x1F, 0xDE, 0x07, 0x9E, 0x46, 0xA9, 0xE2, + 0xFF, 0x59, 0xD4, 0x42, 0x92, 0xAE, 0xBD, 0x27, 0xF0, 0xDB, 0xB6, 0x35, 0x26, 0x79, 0x18, 0x06, + 0xE9, 0x9C, 0xDC, 0xB6, 0x87, 0x89, 0x2C, 0x62, 0xEE, 0x14, 0x07, 0x92, 0x43, 0x77, 0xF8, 0x05, + 0x15, 0x4F, 0x89, 0xFC, 0x7B, 0x87, 0xFC, 0xAD, 0x0F, 0x3D, 0xBC, 0x88, 0xC2, 0x69, 0x22, 0x02, + 0x4A, 0x56, 0x6E, 0xC3, 0x69, 0x91, 0x13, 0xAE, 0x26, 0x0D, 0x64, 0x98, 0x7E, 0x99, 0xF5, 0x53, + 0xA3, 0xEE, 0x50, 0x34, 0x52, 0x68, 0x8B, 0x17, 0xA8, 0x49, 0x5C, 0xBD, 0x25, 0x59, 0xBC, 0x2D, + 0x5E, 0x27, 0xED, 0x3A, 0x45, 0x27, 0x59, 0x4F, 0xDA, 0x8B, 0x2F, 0x15, 0x61, 0x32, 0x8D, 0x7E, + 0x1F, 0x23, 0x14, 0x27, 0xD8, 0x17, 0x19, 0x55, 0x54, 0x5A, 0xCF, 0x8B, 0xA2, 0x52, 0x2E, 0x8E, + 0x7C, 0xE5, 0xDA, 0xD6, 0x91, 0xD4, 0x9B, 0x13, 0x48, 0x9D, 0xA9, 0xE5, 0x8A, 0x19, 0x4F, 0xF2, + 0x16, 0xF4, 0x71, 0xD2, 0x3E, 0xCB, 0x52, 0x3C, 0x3C, 0x5A, 0x59, 0x82, 0x87, 0xB9, 0x8D, 0xA1, + 0x77, 0xCD, 0x30, 0x54, 0x49, 0x5D, 0xD2, 0x8A, 0x2A, 0xA1, 0x6F, 0xC8, 0x30, 0x37, 0x19, 0x2E, + 0xEF, 0x3E, 0xAE, 0x89, 0x2D, 0x16, 0x3B, 0xAC, 0x20, 0x8D, 0x8F, 0xE6, 0xA7, 0x93, 0x48, 0xA2, + 0x58, 0x0C, 0x99, 0xC6, 0xD9, 0x1E, 0xAC, 0x42, 0xA2, 0xF9, 0x73, 0xD3, 0x0F, 0xA8, 0x76, 0x5D, + 0x7C, 0x74, 0x51, 0x54, 0x8B, 0x14, 0xAA, 0x25, 0x60, 0x22, 0x8C, 0x14, 0x32, 0x76, 0x4A, 0xAE, + 0x8E, 0x4F, 0xB0, 0xD0, 0x0F, 0x29, 0x13, 0x13, 0x25, 0x87, 0x71, 0x02, 0x2A, 0x9A, 0x44, 0xE9, + 0xEB, 0x9D, 0x28, 0x76, 0xD9, 0xF4, 0x07, 0xE2, 0xF8, 0x42, 0x12, 0xD2, 0xEC, 0x17, 0x06, 0x58, + 0xC7, 0x6D, 0x5F, 0x14, 0x41, 0x39, 0x19, 0x60, 0xBE, 0x31, 0xA2, 0x06, 0x43, 0xD2, 0x00, 0x12, + 0xCA, 0x3D, 0xEF, 0x62, 0x8A, 0x18, 0x98, 0xA3, 0x47, 0xE1, 0x2E, 0x42, 0x67, 0x89, 0x53, 0x5C, + 0x6F, 0x6F, 0x90, 0x39, 0x14, 0x31, 0xFB, 0x8B, 0x71, 0xDE, 0x4B, 0xD3, 0x40, 0x3E, 0x55, 0x4C, + 0xAA, 0xED, 0x9B, 0xD4, 0xD8, 0xC9, 0x15, 0xDE, 0x46, 0x01, 0x4F, 0x93, 0x32, 0x59, 0x4A, 0x4E, + 0x31, 0x27, 0x83, 0x88, 0x87, 0x11, 0xC9, 0x08, 0x57, 0x83, 0x53, 0xE0, 0xA1, 0x27, 0x6F, 0xE2, + 0x46, 0x1E, 0xA6, 0x11, 0xFD, 0xE9, 0xF6, 0xF1, 0x1D, 0x9D, 0x8E, 0xD5, 0x51, 0xB6, 0x01, 0xE4, + 0x67, 0x07, 0xC3, 0x34, 0x00, 0xBE, 0x69, 0x8C, 0xF4, 0x27, 0x4B, 0x1C, 0x27, 0x8E, 0x6C, 0x59, + 0x57, 0x29, 0x7A, 0x01, 0xBE, 0x31, 0xEF, 0x3D, 0x29, 0xF7, 0xE6, 0x67, 0x28, 0xF2, 0xC0, 0xC5, + 0xD3, 0xDD, 0x3F, 0x62, 0x97, 0x00, 0xAF, 0x80, 0x5D, 0x57, 0x4F, 0x71, 0xD8, 0xED, 0x83, 0x4F, + 0xB0, 0x07, 0xEC, 0xCE, 0xF1, 0xF4, 0xFE, 0x76, 0xA3, 0xDE, 0x84, 0x3F, 0xDE, 0x67, 0xC5, 0x8D, + 0xC5, 0x32, 0x9F, 0x0C, 0x79, 0x15, 0x62, 0x42, 0xE9, 0x3E, 0xDE, 0xAE, 0xF9, 0x40, 0x8A, 0xDC, + 0x45, 0x84, 0x15, 0x29, 0xFF, 0xAE, 0x44, 0xA1, 0x9B, 0xE9, 0x4A, 0xC0, 0x48, 0xF6, 0x6E, 0x13, + 0xEF, 0x38, 0xCB, 0xF0, 0x0E, 0x62, 0x14, 0xE1, 0x20, 0xCB, 0x27, 0xC4, 0xED, 0x78, 0x27, 0xC5, + 0x70, 0x44, 0xF2, 0x35, 0x92, 0x5F, 0xC4, 0xD7, 0x24, 0x91, 0xA3, 0x3F, 0xAA, 0xC7, 0xB8, 0x21, + 0x2A, 0x05, 0xEF, 0x30, 0xBF, 0x8F, 0x37, 0x68, 0xAC, 0xB7, 0x83, 0xF4, 0x89, 0x4A, 0x6C, 0x8A, + 0xF6, 0x05, 0x19, 0xBC, 0xB6, 0x21, 0xF7, 0xB2, 0x75, 0x85, 0x11, 0x02, 0x47, 0xE9, 0xFA, 0x0A, + 0x58, 0x7F, 0x44, 0x17, 0x4B, 0xA4, 0x71, 0xE1, 0xE0, 0xB1, 0x2C, 0x3A, 0x8F, 0xBC, 0x6F, 0x23, + 0x0F, 0x85, 0x4A, 0x11, 0x23, 0x20, 0x05, 0x02, 0xBC, 0x3A, 0x99, 0x7F, 0x85, 0x5B, 0xB0, 0x08, + 0x72, 0xA7, 0x5C, 0x39, 0x4C, 0x63, 0xD1, 0xE2, 0xA2, 0x13, 0x59, 0x5C, 0xBD, 0x31, 0x8A, 0x5E, + 0xCA, 0x0D, 0x71, 0x62, 0x49, 0x72, 0x1A, 0x4F, 0x3A, 0x86, 0xA3, 0x83, 0x79, 0x6D, 0x53, 0xF1, + 0xAA, 0x34, 0x2B, 0xEC, 0x08, 0x9E, 0x15, 0x0B, 0xB5, 0x88, 0x9A, 0x6F, 0xC2, 0x2D, 0x96, 0x45, + 0x55, 0xE5, 0x87, 0x5B, 0x5C, 0x6B, 0xC1, 0x2E, 0xDA, 0xD4, 0xD1, 0x58, 0xB8, 0x89, 0xBA, 0x28, + 0xC7, 0x6A, 0x5C, 0x38, 0xEA, 0x22, 0x22, 0x28, 0xC5, 0xC8, 0x0B, 0xF5, 0x6D, 0x4A, 0xEE, 0x72, + 0xF9, 0x91, 0x1A, 0xC3, 0xE3, 0x6A, 0x7C, 0xB4, 0xC6, 0xF0, 0xFB, 0x95, 0x8B, 0xD8, 0xD8, 0xAB, + 0xD7, 0xEA, 0x9F, 0xEA, 0xCD, 0x4F, 0x7B, 0x1F, 0x3F, 0xB1, 0x6A, 0xA3, 0xBE, 0x5F, 0x6B, 0x1C, + 0xEE, 0xD7, 0xF7, 0x3F, 0x1E, 0x34, 0x58, 0x63, 0xFF, 0x00, 0xBE, 0x3B, 0xFC, 0x54, 0x72, 0xB8, + 0xC6, 0x32, 0x06, 0x8C, 0x62, 0x35, 0x96, 0x31, 0x96, 0x42, 0xA0, 0xC6, 0xC4, 0x69, 0xE4, 0x33, + 0xD0, 0x17, 0x9C, 0xF3, 0x26, 0x4A, 0x63, 0x6A, 0x94, 0xC6, 0xA8, 0xA8, 0x59, 0x7E, 0xA4, 0x46, + 0x34, 0xC6, 0x22, 0xA2, 0x35, 0x16, 0x3E, 0xFF, 0xE4, 0x20, 0x0B, 0x8A, 0xDA, 0x58, 0xF8, 0x1A, + 0xD2, 0xC3, 0xBC, 0x81, 0xE8, 0x8D, 0xE4, 0x79, 0xF6, 0xBE, 0x82, 0x38, 0xD6, 0xB8, 0xE8, 0x6B, + 0x87, 0x7B, 0x8F, 0x58, 0x72, 0x2D, 0x55, 0xF4, 0x55, 0x3C, 0x5C, 0x5E, 0xD1, 0xD7, 0x68, 0x12, + 0xAF, 0x55, 0xF4, 0xD5, 0xA7, 0xF1, 0x51, 0x46, 0x0F, 0x5D, 0xC2, 0xF4, 0x48, 0x99, 0xBE, 0xE5, + 0x8F, 0x54, 0x7F, 0xA5, 0x54, 0xB3, 0x23, 0xB5, 0x5F, 0xBF, 0x53, 0x82, 0x39, 0x51, 0xFC, 0x55, + 0x08, 0xFE, 0x01, 0x7A, 0x91, 0x68, 0x3A, 0xA6, 0x6B, 0x93, 0x17, 0xE9, 0x74, 0x3F, 0xA1, 0xC8, + 0xE2, 0x66, 0xA7, 0xEA, 0xCE, 0xBE, 0xB1, 0x82, 0xB0, 0x62, 0x5F, 0x8B, 0xE7, 0xFD, 0x52, 0x90, + 0xDB, 0x27, 0xE4, 0x3A, 0x2F, 0xA5, 0x1A, 0x0A, 0x21, 0x4C, 0xFE, 0x8A, 0x28, 0x23, 0x4B, 0x57, + 0x39, 0x1E, 0x94, 0xF2, 0xA2, 0x8F, 0xE9, 0x59, 0x81, 0x93, 0x25, 0x69, 0x9A, 0x35, 0x30, 0xD7, + 0x79, 0x19, 0x25, 0x50, 0x04, 0x2E, 0xCC, 0x2E, 0x83, 0x92, 0x60, 0x80, 0x8A, 0x25, 0x28, 0x52, + 0x69, 0xD0, 0xF3, 0x2F, 0xB9, 0x58, 0x39, 0x8B, 0xE9, 0xF3, 0x2B, 0x47, 0x84, 0x1C, 0xD1, 0x2C, + 0x26, 0xD6, 0x16, 0xD7, 0xD0, 0xFD, 0x5B, 0xBD, 0x40, 0x98, 0xD5, 0x02, 0xEA, 0x85, 0xC6, 0x6E, + 0x12, 0xEA, 0xD5, 0x8B, 0xA7, 0xE8, 0xCD, 0x0E, 0xF3, 0xE9, 0xCD, 0x72, 0xEB, 0xCE, 0x26, 0x40, + 0x32, 0xCF, 0x70, 0xEE, 0xB4, 0x9E, 0xE6, 0xD6, 0xA6, 0xA9, 0x8A, 0x14, 0xEA, 0xD7, 0x99, 0x25, + 0xE0, 0x23, 0xD6, 0xE3, 0x5D, 0x35, 0x7C, 0xCC, 0x51, 0x0B, 0x79, 0x81, 0xF8, 0xA8, 0x56, 0x1B, + 0x79, 0x0C, 0x2C, 0x4B, 0xC0, 0x48, 0xD1, 0xD3, 0xFB, 0xC4, 0x48, 0x2C, 0xCB, 0xBA, 0x6A, 0x18, + 0x99, 0xA3, 0xB2, 0xF2, 0x0A, 0x71, 0x48, 0x09, 0xC9, 0x12, 0xF0, 0x51, 0xF4, 0xF4, 0x7E, 0xF1, + 0xB1, 0xFD, 0x73, 0x59, 0x18, 0x39, 0x6F, 0x7D, 0xE6, 0x24, 0x46, 0xAA, 0x97, 0x46, 0x9D, 0x82, + 0x94, 0x1F, 0xF3, 0xD9, 0x9F, 0x4B, 0x41, 0x4A, 0x02, 0x67, 0x49, 0x68, 0x89, 0x7D, 0xBD, 0x37, + 0xC4, 0x1C, 0x96, 0x8C, 0x5D, 0x34, 0xA3, 0x54, 0x2C, 0xE5, 0x3B, 0x3C, 0xB9, 0xD5, 0xCB, 0x42, + 0xAF, 0x04, 0xA3, 0x4C, 0x41, 0x72, 0x2E, 0x8C, 0x4C, 0xF6, 0xF4, 0x7E, 0xF1, 0x71, 0xF1, 0x8C, + 0xB2, 0x08, 0x46, 0xAE, 0x19, 0xA3, 0xCC, 0x80, 0xB3, 0x24, 0xB4, 0x7C, 0x35, 0x46, 0x39, 0xCF, + 0x3B, 0x6A, 0xA9, 0x5C, 0xDE, 0x80, 0x02, 0xA9, 0xB1, 0x30, 0x05, 0x52, 0x23, 0xB7, 0x02, 0xA9, + 0xB9, 0xEE, 0x0A, 0xA4, 0xC6, 0x5B, 0x57, 0x20, 0x35, 0x36, 0x0A, 0xA4, 0x92, 0x14, 0x48, 0x8D, + 0xD2, 0x14, 0x48, 0x8D, 0x77, 0xAC, 0x40, 0x6A, 0x6C, 0x14, 0x48, 0xA5, 0x29, 0x90, 0x1A, 0xA5, + 0x29, 0x90, 0x1A, 0xEF, 0x58, 0x81, 0xD4, 0xD8, 0x28, 0x90, 0x4A, 0x52, 0x20, 0x35, 0x4A, 0x53, + 0x20, 0x35, 0xDE, 0xB5, 0x02, 0xA9, 0xB1, 0x51, 0x20, 0x95, 0xA9, 0x40, 0x6A, 0x94, 0xA8, 0x40, + 0x6A, 0xBC, 0x63, 0x05, 0x52, 0x63, 0xA3, 0x40, 0x2A, 0x49, 0x81, 0xD4, 0x28, 0x4D, 0x81, 0xD4, + 0x78, 0xD7, 0x0A, 0xA4, 0xC6, 0x46, 0x81, 0x54, 0xA6, 0x02, 0xA9, 0x51, 0xA2, 0x02, 0xA9, 0xB1, + 0x51, 0x20, 0xAD, 0xAA, 0x02, 0xA9, 0xB9, 0x30, 0x05, 0x52, 0x33, 0xB7, 0x02, 0xA9, 0xB5, 0xEE, + 0x0A, 0xA4, 0xE6, 0x5B, 0x57, 0x20, 0x35, 0x37, 0x0A, 0xA4, 0x92, 0x14, 0x48, 0xCD, 0xD2, 0x14, + 0x48, 0xCD, 0x77, 0xAC, 0x40, 0x6A, 0x6E, 0x14, 0x48, 0xA5, 0x29, 0x90, 0x9A, 0xA5, 0x29, 0x90, + 0x9A, 0xEF, 0x58, 0x81, 0xD4, 0xDC, 0x28, 0x90, 0x4A, 0x52, 0x20, 0x35, 0x4B, 0x53, 0x20, 0x35, + 0xDF, 0xB5, 0x02, 0xA9, 0xB9, 0x51, 0x20, 0x95, 0xA9, 0x40, 0x6A, 0x96, 0xA8, 0x40, 0x6A, 0xBE, + 0x63, 0x05, 0x52, 0x73, 0xA3, 0x40, 0x2A, 0x49, 0x81, 0xD4, 0x2C, 0x4D, 0x81, 0xD4, 0x7C, 0xD7, + 0x0A, 0xA4, 0xE6, 0x46, 0x81, 0x54, 0xA6, 0x02, 0xA9, 0x59, 0xA2, 0x02, 0xA9, 0xB9, 0x51, 0x20, + 0xAD, 0xAA, 0x02, 0xA9, 0xB5, 0x30, 0x05, 0x52, 0x2B, 0xB7, 0x02, 0x69, 0x6F, 0xDD, 0x15, 0x48, + 0xAD, 0xB7, 0xAE, 0x40, 0x6A, 0x6D, 0x14, 0x48, 0x25, 0x29, 0x90, 0x5A, 0xA5, 0x29, 0x90, 0x5A, + 0xEF, 0x58, 0x81, 0xD4, 0xDA, 0x28, 0x90, 0x4A, 0x53, 0x20, 0xB5, 0x4A, 0x53, 0x20, 0xB5, 0xDE, + 0xB1, 0x02, 0xA9, 0xB5, 0x51, 0x20, 0x95, 0xA4, 0x40, 0x6A, 0x95, 0xA6, 0x40, 0x6A, 0xBD, 0x6B, + 0x05, 0x52, 0x6B, 0xA3, 0x40, 0x2A, 0x53, 0x81, 0xD4, 0x2A, 0x51, 0x81, 0xD4, 0x7A, 0xC7, 0x0A, + 0xA4, 0xD6, 0x46, 0x81, 0x54, 0x92, 0x02, 0xA9, 0x55, 0x9A, 0x02, 0xA9, 0xF5, 0xAE, 0x15, 0x48, + 0xAD, 0x8D, 0x02, 0xA9, 0x4C, 0x05, 0x52, 0xAB, 0x44, 0x05, 0x52, 0xEB, 0x8D, 0x29, 0x90, 0x66, + 0xE7, 0x5A, 0x9A, 0xD6, 0xB5, 0x54, 0x2B, 0xC5, 0x09, 0xE7, 0x7A, 0x3C, 0xB8, 0xE1, 0xBE, 0xAF, + 0xF5, 0xF8, 0xB5, 0xE9, 0x07, 0x58, 0x4C, 0x9D, 0x2A, 0x4E, 0x2D, 0x40, 0xEB, 0x54, 0x40, 0xE3, + 0x14, 0x3D, 0xC7, 0x82, 0x4D, 0x42, 0x4B, 0x72, 0xE3, 0xF7, 0x70, 0x8E, 0x33, 0x86, 0x52, 0x52, + 0x3A, 0x4D, 0xEE, 0x7C, 0xC6, 0xF6, 0xDD, 0xDE, 0x9D, 0xDD, 0xB0, 0x5B, 0x4A, 0xCC, 0xFB, 0xD9, + 0x24, 0xD4, 0xC3, 0xAC, 0x60, 0xD0, 0xF8, 0x0C, 0x95, 0x4C, 0x95, 0x52, 0xB4, 0x50, 0x2A, 0x1A, + 0xA8, 0x72, 0xB3, 0x9F, 0xD1, 0xAA, 0x30, 0x73, 0xBF, 0xA7, 0xD9, 0xFE, 0xC0, 0x0C, 0x12, 0xF5, + 0xB2, 0xA8, 0x82, 0x88, 0x86, 0x99, 0xC1, 0x0D, 0x91, 0x88, 0x0C, 0x73, 0x1A, 0x37, 0x7E, 0xFA, + 0x83, 0xD2, 0xF1, 0x0F, 0x04, 0xF6, 0xF8, 0xAC, 0x51, 0xAF, 0xEF, 0xEF, 0xC0, 0xCF, 0x8F, 0x7B, + 0xF8, 0xF3, 0x90, 0x7E, 0x7E, 0xC2, 0x9F, 0x8D, 0xE6, 0x9E, 0xC8, 0xF1, 0x5F, 0xAF, 0x45, 0x8D, + 0x1A, 0xCD, 0x56, 0x5D, 0x16, 0x0B, 0x90, 0xF9, 0x90, 0x2D, 0xE7, 0x89, 0x4A, 0x7A, 0xE1, 0xB7, + 0x54, 0x27, 0xCD, 0x17, 0xC5, 0xF5, 0xE0, 0x39, 0x8C, 0x6F, 0x1B, 0x94, 0x52, 0x16, 0xF3, 0x07, + 0x06, 0x9A, 0x69, 0x39, 0x9E, 0x2C, 0xC5, 0x25, 0xE7, 0x8A, 0x25, 0x8B, 0x76, 0x35, 0xCB, 0x12, + 0x5B, 0x13, 0xCD, 0xA8, 0xC6, 0xAE, 0x4D, 0xF8, 0xD2, 0x3F, 0x62, 0x75, 0x7C, 0xB9, 0x59, 0x4F, + 0x96, 0xFA, 0x12, 0xA5, 0xFC, 0x08, 0x4C, 0x30, 0x5E, 0x40, 0xC5, 0xBE, 0x1C, 0x60, 0x1D, 0x9E, + 0x69, 0x18, 0xDC, 0xC6, 0xF7, 0x71, 0xAE, 0x54, 0xF5, 0xCF, 0xB4, 0x19, 0xA2, 0x05, 0x1B, 0x38, + 0x06, 0x5F, 0xC3, 0xC4, 0x6B, 0x63, 0xD5, 0x8F, 0x85, 0x90, 0xBF, 0x98, 0x06, 0x52, 0x41, 0xAB, + 0x99, 0x6E, 0x7C, 0xEF, 0x00, 0xE6, 0x0F, 0x52, 0x1A, 0x4C, 0x15, 0x4D, 0x79, 0x9A, 0xBF, 0x8C, + 0xCF, 0xCF, 0x99, 0xA8, 0xB0, 0xE7, 0x71, 0x9F, 0x07, 0x77, 0x0E, 0x62, 0x8C, 0x4C, 0xAF, 0xE7, + 0x63, 0xBA, 0xCD, 0x5B, 0x7C, 0x8C, 0xDB, 0x1F, 0x3D, 0x54, 0xCC, 0xBC, 0xA9, 0x5C, 0xA0, 0xF0, + 0x95, 0xD7, 0x7A, 0xED, 0x3C, 0x9D, 0x46, 0xE4, 0x94, 0x5A, 0x2F, 0x7C, 0xC1, 0xE2, 0x6F, 0x80, + 0x72, 0xEC, 0x87, 0x9C, 0x2B, 0x57, 0x58, 0x3B, 0x62, 0xDE, 0x20, 0x7D, 0xDA, 0x54, 0x96, 0x92, + 0x4D, 0x53, 0xE5, 0xF9, 0xF8, 0x91, 0x3E, 0xFF, 0xA9, 0x5A, 0x65, 0xD5, 0xE8, 0x5F, 0x24, 0x59, + 0x71, 0xAF, 0x8B, 0x69, 0xB6, 0x05, 0xE5, 0x24, 0xBE, 0xAE, 0x56, 0xB3, 0x9D, 0x26, 0x48, 0xC6, + 0x00, 0xD1, 0xD3, 0x34, 0x58, 0x4F, 0x73, 0xAB, 0x63, 0x0D, 0x64, 0x13, 0x4C, 0x3E, 0x93, 0x4E, + 0x5B, 0x82, 0xA6, 0xEB, 0x46, 0x89, 0x14, 0x55, 0x8E, 0xD7, 0xF1, 0x40, 0x1A, 0x7F, 0xE6, 0xB6, + 0xDB, 0x51, 0xCF, 0xB9, 0x4E, 0xD3, 0xB8, 0xD9, 0xF8, 0xB1, 0x32, 0x99, 0xD2, 0x6D, 0xC7, 0x9E, + 0x88, 0x01, 0x42, 0x7E, 0x4B, 0x41, 0x3A, 0x14, 0x15, 0xA4, 0xA2, 0x63, 0xD7, 0x4D, 0xBC, 0x51, + 0xC2, 0xD9, 0x3B, 0x01, 0xDF, 0xC7, 0xE2, 0xCA, 0x4C, 0xC6, 0x1A, 0xC3, 0x61, 0xDC, 0x40, 0x93, + 0xF9, 0x68, 0x51, 0xB9, 0xEE, 0x9C, 0x92, 0x8C, 0xB2, 0xAB, 0xF3, 0xA3, 0x48, 0x1C, 0xEE, 0x43, + 0x9F, 0x4F, 0xB0, 0xE6, 0xAB, 0xF3, 0x29, 0xF9, 0xE9, 0x77, 0x4F, 0x50, 0x02, 0x9E, 0x9E, 0x5F, + 0xFE, 0x1C, 0x0B, 0x60, 0x82, 0x3C, 0x6D, 0x5A, 0xEC, 0x81, 0xC3, 0x47, 0xC0, 0x04, 0xD3, 0xE3, + 0xF1, 0x38, 0x06, 0x7C, 0x7D, 0xCB, 0x07, 0x9A, 0x69, 0x9B, 0x76, 0x6F, 0xCA, 0x50, 0x0E, 0xFB, + 0x0B, 0xB4, 0x9E, 0x2C, 0x70, 0xBF, 0x76, 0xE2, 0xDB, 0x24, 0xBA, 0x9D, 0xC5, 0x69, 0x59, 0xFD, + 0x38, 0x09, 0x6E, 0x06, 0x1D, 0xE3, 0x17, 0xD8, 0x52, 0x32, 0xE2, 0x4E, 0x9C, 0xDD, 0x52, 0xB3, + 0xE3, 0xCA, 0x92, 0x6B, 0xBB, 0xEC, 0xAA, 0x9D, 0x86, 0x87, 0x9E, 0x80, 0x07, 0xC9, 0x4C, 0xDA, + 0x23, 0x88, 0x69, 0x54, 0x0A, 0x75, 0x34, 0x79, 0xED, 0x7A, 0xE6, 0xAE, 0xED, 0x71, 0xA7, 0xE7, + 0x69, 0x6E, 0xDF, 0xD4, 0x6F, 0x79, 0x0F, 0x16, 0x7A, 0xEE, 0x39, 0xAE, 0xE0, 0x26, 0x33, 0xD1, + 0x8F, 0xB0, 0x2C, 0xDB, 0xBE, 0x72, 0xFC, 0x35, 0x7E, 0xC2, 0xC4, 0x23, 0x85, 0xEB, 0x7A, 0xBA, + 0xC0, 0xC3, 0x48, 0x9F, 0x63, 0x67, 0x9A, 0xBE, 0x7F, 0x1B, 0x72, 0xDE, 0x71, 0xA6, 0xDD, 0xA9, + 0x5B, 0x91, 0x2E, 0x21, 0x50, 0xAF, 0x1C, 0xFF, 0xE8, 0x28, 0x66, 0xF5, 0x1F, 0xAD, 0xE5, 0x70, + 0xF1, 0xA3, 0x58, 0x53, 0x98, 0xE5, 0x49, 0xC1, 0xA6, 0xC0, 0x1C, 0xFE, 0x72, 0x5B, 0xAC, 0xE9, + 0x5E, 0xE5, 0xF8, 0xBF, 0x6B, 0x80, 0x35, 0x0A, 0xAD, 0x15, 0x0A, 0x17, 0x94, 0x4C, 0x8C, 0x1D, + 0x81, 0x05, 0x2F, 0x4E, 0xE8, 0xB1, 0xE1, 0x76, 0x33, 0x8F, 0xF6, 0x5B, 0x5E, 0xAC, 0xE0, 0xAE, + 0x06, 0xAC, 0x57, 0xE4, 0x99, 0x96, 0x84, 0xDB, 0xF5, 0xF8, 0xEF, 0x21, 0xB7, 0xF5, 0x17, 0xBA, + 0x8E, 0x09, 0xEC, 0xD0, 0xAC, 0x04, 0x37, 0x03, 0xF9, 0xC2, 0x35, 0xF5, 0x04, 0xCD, 0xFE, 0xE8, + 0xAC, 0x18, 0xB5, 0x0A, 0x41, 0xC9, 0x9B, 0x8F, 0x96, 0x5D, 0xB7, 0xC3, 0x03, 0xCC, 0xD5, 0xED, + 0x4F, 0x3E, 0xA4, 0xE7, 0x3C, 0x79, 0x94, 0x4F, 0x1F, 0x2D, 0x0C, 0x1C, 0x38, 0x19, 0x6F, 0xB9, + 0xCD, 0x9F, 0x34, 0xAC, 0x46, 0x0A, 0x7F, 0xE3, 0x51, 0xC9, 0xE4, 0x13, 0xD5, 0x8A, 0x39, 0xF3, + 0x9C, 0x31, 0xD9, 0x39, 0xE4, 0xD8, 0xF1, 0x39, 0x8B, 0x0B, 0x48, 0x7C, 0xFE, 0x19, 0xCF, 0x0C, + 0x92, 0x2E, 0x90, 0x3D, 0x31, 0x58, 0x2E, 0xDC, 0x46, 0x9A, 0x87, 0x0C, 0x85, 0x0B, 0xBC, 0x9C, + 0x90, 0xCC, 0xF1, 0xB2, 0xC3, 0x70, 0xA2, 0x58, 0xFA, 0x4F, 0xA7, 0xC2, 0xA4, 0x5A, 0x10, 0xF0, + 0x81, 0x4B, 0xB7, 0x17, 0xC0, 0x3B, 0x1B, 0x29, 0x02, 0x3E, 0x6E, 0xFD, 0xE4, 0x0C, 0xF8, 0x16, + 0xFB, 0xD9, 0xBC, 0x34, 0x77, 0xE0, 0x0A, 0x04, 0x52, 0x91, 0x86, 0xFD, 0xEC, 0xE0, 0x77, 0x1E, + 0xAE, 0x90, 0x06, 0x4A, 0xE0, 0xB8, 0x38, 0xE0, 0x0D, 0xF5, 0x22, 0xF1, 0x65, 0x97, 0x21, 0x50, + 0xA0, 0x08, 0x15, 0x8F, 0xB2, 0x62, 0x5A, 0xEE, 0xE4, 0x19, 0x95, 0x14, 0xA8, 0x85, 0x44, 0xD9, + 0xF6, 0x9C, 0xAE, 0x69, 0xF1, 0x3B, 0xE7, 0x81, 0xAB, 0x78, 0x95, 0xCD, 0x34, 0xB6, 0x8C, 0x16, + 0xC1, 0x93, 0x92, 0xAB, 0x1C, 0x88, 0xD1, 0x48, 0x47, 0x39, 0x77, 0xA2, 0x84, 0x0A, 0x17, 0xC3, + 0x5A, 0xF4, 0xC4, 0x54, 0x1D, 0xAF, 0xA7, 0xD9, 0xE6, 0x1F, 0xE2, 0xBA, 0xD1, 0xD7, 0x7C, 0x4C, + 0xEF, 0xEF, 0x78, 0xAE, 0x43, 0xAA, 0x22, 0x60, 0xAF, 0x76, 0xAF, 0x13, 0x78, 0x5C, 0x1B, 0x10, + 0x23, 0x4D, 0x89, 0x42, 0x9A, 0xAE, 0xA3, 0xF6, 0x79, 0x47, 0x94, 0x12, 0x30, 0x49, 0x1E, 0xF2, + 0x38, 0xF6, 0xCA, 0x90, 0x40, 0xA9, 0x77, 0x3D, 0xF4, 0x01, 0x8F, 0x65, 0x65, 0x00, 0xE6, 0xCA, + 0xA5, 0x07, 0xB8, 0xF4, 0x24, 0x5E, 0x02, 0x6E, 0xBF, 0xB0, 0x2A, 0x13, 0x75, 0x09, 0x38, 0xEB, + 0xB8, 0x9A, 0xF7, 0x70, 0x19, 0xDA, 0x02, 0x46, 0x95, 0x22, 0xA5, 0x40, 0x4A, 0xAD, 0x9C, 0xA1, + 0x88, 0xDB, 0x4A, 0xDC, 0x6B, 0x92, 0x39, 0xEC, 0xA3, 0x12, 0x55, 0xE6, 0xB0, 0x38, 0xCC, 0x40, + 0x71, 0x95, 0xD1, 0x5C, 0x85, 0x8E, 0xE6, 0xB2, 0x39, 0xA8, 0xDA, 0x07, 0x96, 0xA4, 0xF1, 0xF0, + 0x02, 0x7F, 0x15, 0x34, 0x1D, 0x38, 0x8F, 0x85, 0x29, 0x3B, 0x92, 0x9D, 0xE7, 0xD3, 0x77, 0x24, + 0x5A, 0x4E, 0x54, 0x64, 0x0C, 0x21, 0x38, 0xA2, 0xC1, 0xC0, 0xD6, 0xAB, 0xA6, 0xBA, 0x98, 0xBE, + 0xA4, 0xA2, 0xDA, 0x0B, 0x1A, 0x83, 0x54, 0xFB, 0x38, 0xC0, 0x59, 0x5F, 0x83, 0x13, 0xDB, 0x8A, + 0x6F, 0x51, 0x51, 0x8F, 0xB3, 0x6E, 0x25, 0xC9, 0xE3, 0x2A, 0xEE, 0xEC, 0x54, 0x0B, 0xE1, 0xF8, + 0xBE, 0xC5, 0x3F, 0x09, 0xDA, 0x0C, 0x1F, 0x90, 0x89, 0xE6, 0x88, 0xE5, 0xBD, 0x53, 0xA5, 0x3B, + 0x4D, 0x4F, 0x5A, 0x3C, 0x1A, 0x77, 0x9B, 0xCA, 0x79, 0x91, 0xDA, 0x3B, 0xAC, 0xC3, 0x5D, 0x0A, + 0x7F, 0x16, 0xBB, 0x9C, 0x7C, 0x3A, 0xC0, 0xF6, 0xF8, 0xB3, 0xE0, 0x6D, 0xEC, 0x53, 0x13, 0x3B, + 0xA0, 0x5F, 0x05, 0x6F, 0x56, 0x87, 0x7B, 0xD8, 0x03, 0xFD, 0x2A, 0xD6, 0xC3, 0xFE, 0x47, 0x5A, + 0x04, 0xFD, 0x2A, 0xB8, 0x8A, 0xC6, 0xBE, 0x58, 0x06, 0xFD, 0x2E, 0x78, 0xB9, 0x6C, 0xD5, 0x69, + 0x21, 0xE2, 0x77, 0xC1, 0xAB, 0xE2, 0x41, 0x5D, 0xEC, 0x27, 0xFD, 0x2E, 0xB8, 0xA3, 0xCD, 0x86, + 0xD8, 0x53, 0xFA, 0xBD, 0x92, 0x97, 0xCE, 0x3B, 0x32, 0x05, 0x02, 0x61, 0x91, 0x10, 0x84, 0x86, + 0x3A, 0x94, 0x4A, 0x6E, 0x4F, 0xCE, 0xAF, 0xBE, 0x33, 0x64, 0x64, 0x91, 0x29, 0x4F, 0x07, 0xD2, + 0xEE, 0x09, 0x03, 0x1D, 0xC8, 0xEA, 0x7A, 0x9F, 0x69, 0x54, 0xCC, 0x1B, 0xCB, 0x26, 0xF5, 0x1D, + 0x14, 0x78, 0x9C, 0xAE, 0x30, 0xF1, 0x25, 0x64, 0x1D, 0xC2, 0x82, 0x7B, 0xD7, 0x7F, 0x8B, 0xB7, + 0x4D, 0x84, 0x7A, 0x59, 0x2C, 0x2F, 0xD3, 0x57, 0xE5, 0xF8, 0x26, 0x7C, 0x66, 0xF2, 0x8F, 0xFC, + 0xBC, 0x2E, 0xDB, 0xDB, 0xB8, 0xE9, 0x96, 0xC2, 0xEF, 0x00, 0xB1, 0xBF, 0xDD, 0x5C, 0x9C, 0x14, + 0x56, 0x1D, 0xB5, 0xDB, 0x9D, 0xDD, 0x8B, 0x47, 0xB4, 0xD5, 0xDE, 0x01, 0xC2, 0xF6, 0xB0, 0x0C, + 0x59, 0x31, 0x4D, 0x92, 0x30, 0x41, 0x85, 0xCF, 0x72, 0x71, 0x00, 0xF7, 0xAB, 0xE6, 0x59, 0x61, + 0xDD, 0xD2, 0xC9, 0xF9, 0xD9, 0xEE, 0xF9, 0xC9, 0xD9, 0xCA, 0x52, 0xEB, 0xF9, 0xC9, 0xDD, 0x49, + 0x9A, 0x34, 0xA5, 0x10, 0x22, 0x0D, 0xED, 0x86, 0xD9, 0xED, 0xC2, 0xE5, 0x04, 0x8B, 0x7E, 0xBB, + 0xAE, 0x65, 0x8A, 0xCA, 0xA7, 0x70, 0x35, 0xC6, 0xBD, 0xC2, 0xAB, 0x0B, 0x15, 0x29, 0xC6, 0x17, + 0x81, 0x7C, 0x4D, 0xCD, 0x62, 0x77, 0xBF, 0xEC, 0xDE, 0xFE, 0x82, 0xE4, 0x6B, 0xC9, 0x2A, 0xA9, + 0x0C, 0xA9, 0xCF, 0x1B, 0xD0, 0xE7, 0x1A, 0xC3, 0x5D, 0x92, 0xFB, 0x93, 0x6A, 0xED, 0x86, 0x20, + 0x41, 0x31, 0x97, 0x63, 0x3F, 0x30, 0x03, 0x83, 0x39, 0x61, 0x80, 0x02, 0x3B, 0xDE, 0x9D, 0xF6, + 0x6D, 0x1F, 0xAF, 0x4C, 0x21, 0xF1, 0x94, 0x20, 0x6A, 0x8C, 0xF2, 0x3C, 0xCC, 0x03, 0xF6, 0x26, + 0xEE, 0x08, 0xEF, 0x60, 0x36, 0x95, 0x22, 0x0F, 0x84, 0xD6, 0xAA, 0x73, 0x7E, 0xB2, 0xDB, 0x39, + 0xBB, 0x16, 0x85, 0xD3, 0x74, 0xB1, 0x9F, 0x35, 0xF6, 0x73, 0x9F, 0x73, 0x6B, 0xF7, 0xDC, 0xF4, + 0xD8, 0x9D, 0xA9, 0x3F, 0xA4, 0xA6, 0x41, 0xCA, 0x03, 0x27, 0xC0, 0x72, 0xE7, 0x20, 0xBA, 0x83, + 0xE4, 0xAE, 0xE9, 0x70, 0x8F, 0xAB, 0x31, 0xB9, 0x8B, 0xA9, 0x77, 0xE5, 0x0D, 0xAD, 0x6B, 0x7A, + 0x03, 0x34, 0xA2, 0x64, 0xE0, 0x13, 0xB3, 0x2D, 0x04, 0xD4, 0x7A, 0xAA, 0xB3, 0x23, 0x2A, 0x47, + 0x91, 0xA6, 0x14, 0x8E, 0x24, 0x64, 0xB0, 0x73, 0xDC, 0x8C, 0x79, 0x45, 0xB0, 0x54, 0x97, 0x23, + 0xB3, 0xDD, 0x08, 0x60, 0x1B, 0x01, 0xEC, 0x7D, 0x0A, 0x60, 0x57, 0xB6, 0xE0, 0xCC, 0xE8, 0x88, + 0xB4, 0x23, 0x3D, 0xB3, 0xB2, 0xE2, 0xD8, 0x28, 0xCB, 0x9F, 0x28, 0x8D, 0x25, 0x78, 0x5A, 0x82, + 0xA5, 0x09, 0x18, 0xAE, 0x9E, 0x28, 0xA6, 0xC8, 0xD7, 0x60, 0x58, 0xEE, 0xC1, 0xF1, 0xD0, 0xC6, + 0x33, 0x67, 0x56, 0x91, 0xC9, 0xD7, 0xD2, 0xF9, 0x0B, 0x9B, 0xEE, 0x45, 0x72, 0xAA, 0xB1, 0x9D, + 0x39, 0x7A, 0xCA, 0xE8, 0xF1, 0x12, 0x94, 0xFF, 0x63, 0x27, 0xB3, 0x74, 0x0B, 0xC0, 0x57, 0x6E, + 0x73, 0x42, 0x64, 0x4D, 0x2C, 0x1C, 0x7D, 0x6C, 0x58, 0x47, 0x8A, 0x0B, 0x70, 0x76, 0xC3, 0x7B, + 0x03, 0xE9, 0x89, 0x38, 0x08, 0x01, 0x8B, 0xBB, 0x14, 0x0B, 0xB1, 0x23, 0x9C, 0x04, 0x61, 0xD3, + 0xD1, 0x95, 0x4F, 0x0A, 0x12, 0xFA, 0x4B, 0x8D, 0xDD, 0xF2, 0xDF, 0x43, 0xD3, 0xE3, 0x3E, 0x43, + 0x07, 0x37, 0x2C, 0x48, 0xCC, 0xDD, 0x0C, 0x9E, 0x4B, 0xAD, 0xBF, 0xE8, 0xA0, 0x51, 0xAF, 0xEF, + 0xD4, 0xEB, 0xF5, 0xD0, 0x97, 0xB2, 0x8A, 0xC5, 0xED, 0x1E, 0x3C, 0x46, 0x01, 0xE5, 0x53, 0xFC, + 0x95, 0x98, 0x01, 0x0F, 0x9E, 0x38, 0xB7, 0xC5, 0x7B, 0x7E, 0x6D, 0xFD, 0x8D, 0x06, 0x13, 0x88, + 0xE6, 0x9C, 0xA3, 0xA3, 0xA5, 0x9F, 0x9F, 0x76, 0xE6, 0xF7, 0xB9, 0x4F, 0x4A, 0x17, 0xA9, 0x99, + 0xDD, 0xC1, 0x06, 0x9C, 0x0A, 0xF8, 0x0B, 0x34, 0x55, 0xD3, 0x80, 0x17, 0x30, 0x4A, 0xDC, 0x8D, + 0x6E, 0x35, 0xDB, 0xFE, 0x7F, 0xFF, 0xD7, 0xFF, 0xA0, 0x62, 0x99, 0x50, 0xF6, 0xB9, 0x9F, 0x4F, + 0xEB, 0x3D, 0xA2, 0xF9, 0x9E, 0x19, 0xBB, 0x39, 0x1D, 0x98, 0xAA, 0x43, 0xBA, 0xB3, 0xFB, 0x9A, + 0xDB, 0xE3, 0xBE, 0x9C, 0x3A, 0xDB, 0x0B, 0x44, 0xC5, 0x6B, 0x62, 0x10, 0x8B, 0x43, 0xC0, 0x76, + 0x92, 0x0D, 0x09, 0xCC, 0x5B, 0x13, 0xBC, 0x92, 0x90, 0x99, 0x03, 0x9B, 0x44, 0x0F, 0xAB, 0x86, + 0x43, 0xA4, 0xAE, 0x27, 0xE4, 0x36, 0x7A, 0x3C, 0xF7, 0x8D, 0x69, 0x26, 0x42, 0xB5, 0x1D, 0x4B, + 0xF3, 0xCC, 0xE0, 0x65, 0xD1, 0x28, 0x15, 0x8D, 0x73, 0x94, 0x87, 0x4F, 0xA5, 0x6E, 0x67, 0xE3, + 0xA7, 0x3D, 0xBA, 0x8D, 0xC3, 0xAF, 0x8A, 0xDC, 0xD7, 0x26, 0x2B, 0x92, 0x6E, 0x4D, 0x2A, 0x92, + 0x8E, 0xDB, 0xA0, 0x28, 0xE9, 0x4F, 0xD6, 0x2B, 0x5D, 0x6A, 0x96, 0x55, 0xA0, 0x33, 0x05, 0xD1, + 0x7F, 0xC1, 0x76, 0x6A, 0xD4, 0xEE, 0x08, 0x51, 0xC5, 0x37, 0x7B, 0x28, 0x2D, 0x3E, 0x99, 0x96, + 0x85, 0xE2, 0x7E, 0x1F, 0xFA, 0x92, 0x2E, 0x78, 0x3A, 0xA9, 0x3A, 0xB6, 0x3D, 0x01, 0x2F, 0x0E, + 0x4B, 0xFC, 0x80, 0xA2, 0x14, 0xBA, 0x56, 0xA4, 0x5E, 0xE8, 0x4A, 0x20, 0xD0, 0x1B, 0x09, 0x09, + 0x29, 0x01, 0xE8, 0xB5, 0x31, 0x36, 0x97, 0x91, 0x99, 0x67, 0x79, 0x92, 0xFF, 0x4F, 0xD2, 0x47, + 0x97, 0x54, 0x9B, 0xD7, 0x4E, 0xAF, 0x87, 0x2E, 0xB4, 0xD9, 0x8B, 0xC0, 0x6C, 0xD8, 0x08, 0xCD, + 0xA8, 0x6C, 0xBF, 0xD8, 0x1B, 0xC3, 0xEC, 0xC9, 0x8C, 0x5E, 0x29, 0xC6, 0xAF, 0x72, 0xE9, 0x37, + 0x0C, 0x18, 0x99, 0x45, 0x0C, 0x2A, 0x96, 0xE9, 0x38, 0xCE, 0xC9, 0xFF, 0x20, 0x6E, 0x01, 0xAD, + 0x7A, 0xAC, 0x8C, 0xD4, 0x5F, 0xD8, 0xED, 0x4D, 0xA7, 0x86, 0xBE, 0x17, 0xDD, 0xD0, 0x92, 0xB7, + 0x6B, 0x74, 0x18, 0x63, 0x96, 0xF9, 0x00, 0x17, 0x8D, 0x10, 0x4D, 0x8D, 0x81, 0x67, 0xC2, 0xDD, + 0x3A, 0xB4, 0xE4, 0x15, 0xBA, 0xC3, 0x85, 0x9F, 0x06, 0x4A, 0x43, 0x80, 0xE2, 0x0F, 0xA8, 0xED, + 0x24, 0x7E, 0xE3, 0x74, 0xE9, 0xF9, 0x6F, 0x17, 0xE7, 0xD5, 0xCB, 0x4F, 0x6D, 0x76, 0x65, 0x07, + 0xBC, 0x27, 0xED, 0xC0, 0x37, 0x9A, 0x1D, 0x6A, 0xA2, 0xFF, 0x81, 0xE3, 0xF1, 0xB4, 0x3E, 0x75, + 0xF6, 0x25, 0x46, 0xD5, 0xA5, 0x76, 0x05, 0xAE, 0x21, 0xAB, 0xE8, 0xF3, 0xFD, 0xE3, 0xE4, 0xF6, + 0xAE, 0xF9, 0xE3, 0xF4, 0x97, 0x2B, 0x3B, 0xA6, 0x3A, 0xF8, 0x0B, 0x36, 0x08, 0x69, 0xE3, 0xBB, + 0x3D, 0x7D, 0xE5, 0xB4, 0x29, 0xD4, 0xC3, 0x52, 0x3C, 0xC0, 0x93, 0x73, 0x5D, 0x9A, 0xC6, 0x29, + 0x01, 0x14, 0xB1, 0x02, 0x40, 0xD9, 0xE1, 0xBA, 0x59, 0x95, 0xF1, 0x5A, 0xAF, 0x96, 0xF0, 0xFE, + 0x16, 0xCA, 0xF8, 0xAE, 0xE7, 0xA0, 0x63, 0xD4, 0x90, 0xDA, 0xBE, 0x5D, 0x7C, 0xAF, 0x9E, 0x7F, + 0x3A, 0x4B, 0x20, 0xEE, 0xA5, 0x96, 0x57, 0xCD, 0xB0, 0x3C, 0x0D, 0x53, 0x69, 0xAE, 0x33, 0xE8, + 0x82, 0xF8, 0xCA, 0x9E, 0x33, 0x65, 0x3B, 0xCA, 0xE0, 0x92, 0x0A, 0xF9, 0xC9, 0x24, 0x1A, 0x4E, + 0x00, 0x7F, 0x02, 0x5A, 0x19, 0x2F, 0x99, 0x27, 0xB3, 0x6B, 0xAE, 0x9A, 0x93, 0xCC, 0xF4, 0xF5, + 0x14, 0xF6, 0x91, 0x19, 0xBD, 0xA9, 0xC2, 0x96, 0x4E, 0xBD, 0x59, 0x7C, 0x83, 0x7B, 0xB7, 0xE3, + 0x3D, 0xF8, 0x47, 0x4B, 0x64, 0x0A, 0x40, 0xD6, 0x4C, 0xF7, 0xB8, 0x01, 0x2D, 0x4D, 0xD8, 0x75, + 0x3A, 0xBE, 0x60, 0xAA, 0x81, 0xC3, 0xF6, 0xC4, 0x36, 0xDA, 0x72, 0x52, 0x35, 0x76, 0x02, 0x62, + 0x69, 0xF4, 0x57, 0x2C, 0xA4, 0xC2, 0xC1, 0x89, 0x16, 0x3D, 0xDB, 0x10, 0x4A, 0x6C, 0xEE, 0x07, + 0xD1, 0x3B, 0xC3, 0xC0, 0x91, 0xF8, 0x65, 0xB4, 0xC9, 0xAD, 0x6F, 0xD8, 0xAD, 0xBA, 0xCE, 0x21, + 0x79, 0x35, 0x44, 0x8C, 0x97, 0x1B, 0xFB, 0xB7, 0x7A, 0xA7, 0x83, 0x31, 0x5C, 0x89, 0xFB, 0x7C, + 0x6B, 0xE4, 0x6E, 0x87, 0xAF, 0xB0, 0x86, 0x4A, 0xFC, 0x48, 0x61, 0xD5, 0x40, 0x1E, 0x27, 0xCB, + 0x31, 0xD3, 0x97, 0x27, 0x5A, 0x00, 0x7B, 0x3D, 0x73, 0x24, 0x77, 0x7C, 0x27, 0x85, 0x35, 0x02, + 0x25, 0x8A, 0x20, 0xF3, 0xED, 0x64, 0x1B, 0x3A, 0x82, 0x4F, 0xC6, 0x8C, 0xDD, 0x6C, 0xFF, 0x3C, + 0x1D, 0x40, 0x2B, 0xBA, 0xD1, 0xF1, 0xEA, 0x0A, 0xEC, 0x6F, 0xD4, 0x76, 0xED, 0xF7, 0xB8, 0xA1, + 0x4A, 0xAD, 0xCD, 0x95, 0xDC, 0x44, 0x31, 0xFD, 0xFC, 0x1B, 0xD8, 0x78, 0x13, 0x04, 0xDA, 0x28, + 0x89, 0x40, 0x57, 0x74, 0x6F, 0xE7, 0x20, 0xD0, 0xC6, 0x9B, 0x21, 0xD0, 0xA6, 0x2A, 0x81, 0xB6, + 0x56, 0x72, 0x13, 0x9B, 0x05, 0x09, 0xB4, 0xF9, 0x26, 0x08, 0xB4, 0x59, 0x12, 0x81, 0xAE, 0xE8, + 0xDE, 0xCE, 0x41, 0xA0, 0xCD, 0x37, 0x43, 0xA0, 0x2D, 0x55, 0x02, 0xDD, 0x5B, 0xC9, 0x4D, 0x6C, + 0x15, 0x24, 0xD0, 0xD6, 0x9B, 0x20, 0xD0, 0x56, 0x49, 0x04, 0xBA, 0xA2, 0x7B, 0x3B, 0x07, 0x81, + 0xB6, 0x5E, 0x9B, 0x40, 0x63, 0x4D, 0x0A, 0x69, 0x2D, 0xEE, 0x60, 0xED, 0xA3, 0x56, 0x4C, 0x35, + 0xD5, 0x6A, 0xBC, 0xEB, 0xA2, 0xAB, 0xEF, 0x8F, 0xDC, 0x3B, 0x69, 0x57, 0x8E, 0x23, 0xDD, 0x0D, + 0x67, 0x37, 0x8E, 0x51, 0xC0, 0xED, 0x33, 0x3D, 0xB9, 0x4A, 0x66, 0xC2, 0x72, 0x94, 0x32, 0x9C, + 0x3F, 0x1B, 0x95, 0xE3, 0x93, 0x76, 0x31, 0x2F, 0xC1, 0x7A, 0xE5, 0x18, 0x15, 0x1C, 0xAB, 0xEA, + 0x1E, 0x78, 0xD2, 0x4E, 0x38, 0x07, 0xCA, 0xF0, 0x52, 0xA1, 0x47, 0xF1, 0x1C, 0xCD, 0xD0, 0x35, + 0x3F, 0x88, 0xFC, 0xA8, 0x75, 0x9D, 0xFB, 0x3E, 0xA3, 0x20, 0x46, 0x86, 0xD1, 0xD4, 0xDC, 0x60, + 0xB7, 0x77, 0x7F, 0xA9, 0x0A, 0x58, 0xD7, 0x18, 0xF4, 0x45, 0x8A, 0x9C, 0xF1, 0xBD, 0x25, 0xA2, + 0xAD, 0xD1, 0x13, 0xDC, 0x12, 0xEF, 0xA2, 0x3E, 0x27, 0xE1, 0x63, 0x4E, 0x4A, 0x1C, 0x4C, 0x29, + 0x80, 0x8D, 0x45, 0x3A, 0x18, 0x18, 0xE4, 0xAA, 0x8D, 0x3E, 0xDC, 0x1E, 0x0C, 0xBE, 0x3E, 0x3A, + 0x9D, 0xC2, 0x0A, 0xE0, 0xBB, 0xB3, 0x36, 0xDB, 0x65, 0x3F, 0xCE, 0xDB, 0x6F, 0x4C, 0x0B, 0x0C, + 0xEB, 0x82, 0x45, 0x15, 0xD2, 0x03, 0xA7, 0x9A, 0x4E, 0xD8, 0x89, 0x2C, 0xD8, 0x32, 0xEA, 0xE0, + 0x40, 0x77, 0x7F, 0x18, 0xEE, 0xAA, 0x29, 0x84, 0x67, 0x2D, 0xAC, 0x14, 0x95, 0x70, 0xE9, 0x16, + 0xB0, 0x3B, 0xDD, 0x3D, 0xB3, 0x4C, 0xE0, 0x34, 0x95, 0x63, 0x84, 0xBA, 0xF8, 0xBC, 0x14, 0x7B, + 0xD6, 0x70, 0xE4, 0xE9, 0x5C, 0x20, 0x4E, 0x62, 0x17, 0x44, 0x0D, 0x4E, 0x9D, 0x67, 0x4E, 0xB9, + 0xFA, 0x96, 0xC7, 0x59, 0xBB, 0x4C, 0x4C, 0xDA, 0xD8, 0x99, 0xC4, 0x07, 0x63, 0x0E, 0xE8, 0x86, + 0x7E, 0x5F, 0xB8, 0x69, 0x63, 0x82, 0x4A, 0xE0, 0x7D, 0x3D, 0xF3, 0x91, 0xDB, 0x84, 0xD3, 0xBE, + 0x28, 0x55, 0x83, 0x69, 0x26, 0x13, 0xDF, 0xA0, 0xB3, 0x76, 0x6D, 0x4D, 0x4C, 0x61, 0x29, 0x61, + 0x22, 0xDE, 0x90, 0x02, 0x49, 0x54, 0x0A, 0xA5, 0xA7, 0x88, 0x07, 0xC4, 0x50, 0x90, 0x4A, 0x21, + 0x1F, 0x28, 0x2C, 0xB2, 0x51, 0xA6, 0xD3, 0x4E, 0xEC, 0x8F, 0x03, 0xDB, 0x4B, 0x5E, 0xF7, 0xB0, + 0xE9, 0xA1, 0x9F, 0xCC, 0x7A, 0xD5, 0xFC, 0xB4, 0x77, 0xB8, 0xC9, 0xD5, 0x50, 0x48, 0xF4, 0x4E, + 0xEF, 0xB7, 0x7A, 0x6A, 0x86, 0x54, 0xBB, 0x57, 0xCB, 0xC4, 0xB0, 0x00, 0xBC, 0xC7, 0x9A, 0x3D, + 0x85, 0xF0, 0x1E, 0x1B, 0x62, 0x5F, 0xB3, 0x41, 0x38, 0x3C, 0x05, 0x8E, 0x5E, 0xD5, 0xB9, 0x0D, + 0xAF, 0x04, 0xE4, 0xF8, 0x2F, 0x84, 0xC5, 0xC8, 0x87, 0xA6, 0x8F, 0x0B, 0x79, 0xEA, 0x9B, 0x7A, + 0x5F, 0xB8, 0xDA, 0xC0, 0x6C, 0x75, 0x9A, 0xAD, 0xF0, 0x3C, 0x88, 0x6C, 0x86, 0xC8, 0x84, 0x29, + 0xE6, 0xA5, 0xB6, 0x21, 0xBD, 0xF9, 0x48, 0x4F, 0xA0, 0x5C, 0x0E, 0xEB, 0xDD, 0x38, 0x3A, 0xC4, + 0x4E, 0x56, 0x2E, 0x23, 0xCA, 0x1C, 0xCA, 0x0F, 0x77, 0x9C, 0x1C, 0x53, 0x68, 0x81, 0xAF, 0xED, + 0x01, 0x05, 0xB3, 0x17, 0x29, 0xF3, 0x85, 0xFC, 0x27, 0x3E, 0x2F, 0x4B, 0xFE, 0x93, 0x23, 0xAB, + 0xCB, 0x7F, 0xA2, 0xC1, 0xEA, 0xC8, 0x7F, 0x70, 0x6F, 0x76, 0x9E, 0x98, 0x69, 0xDF, 0x3B, 0x21, + 0x48, 0x7E, 0xC4, 0x8C, 0x84, 0x44, 0x48, 0x89, 0x30, 0xD3, 0xD2, 0xE0, 0x18, 0xA9, 0x4F, 0xBA, + 0xE1, 0x46, 0x1C, 0x0C, 0x93, 0xA1, 0x8B, 0xE6, 0xAB, 0xEB, 0xF0, 0x30, 0x4B, 0x20, 0x4C, 0x56, + 0x34, 0x5C, 0x8A, 0x40, 0x28, 0x06, 0xDC, 0x08, 0x84, 0xEF, 0xE5, 0x54, 0x4A, 0xEC, 0x77, 0xAE, + 0x83, 0x68, 0xD8, 0xEE, 0x0D, 0x1F, 0x44, 0x62, 0x91, 0x6B, 0x79, 0x10, 0xFD, 0x30, 0xE2, 0x83, + 0x08, 0x15, 0x3F, 0x4B, 0x3C, 0x88, 0x86, 0x23, 0x2B, 0x1E, 0x44, 0xA1, 0xE1, 0xAE, 0xCE, 0x11, + 0x34, 0x54, 0xEC, 0xD2, 0x29, 0xE3, 0x43, 0xBF, 0xDC, 0xD6, 0xB9, 0x28, 0x66, 0x81, 0x3A, 0xB4, + 0x75, 0x3C, 0x48, 0x42, 0x63, 0x9E, 0x04, 0xAD, 0x85, 0x8E, 0x92, 0xD0, 0x58, 0xD9, 0xA3, 0x04, + 0xE9, 0x61, 0xFC, 0x51, 0xD2, 0xA8, 0x37, 0x1A, 0xF5, 0xCD, 0x59, 0x52, 0xE8, 0x2C, 0x49, 0x6F, + 0xB8, 0xFA, 0x59, 0x92, 0x6A, 0xF7, 0x56, 0xCF, 0x92, 0x98, 0x27, 0x96, 0x7C, 0x96, 0x14, 0xB6, + 0xA4, 0x88, 0xDC, 0x7E, 0x6F, 0xCB, 0x8A, 0x42, 0x6B, 0x2A, 0x64, 0x44, 0x49, 0xB6, 0x9C, 0xB0, + 0x07, 0x49, 0x80, 0x65, 0xEC, 0x27, 0x94, 0x7B, 0x6D, 0xD5, 0xCC, 0x27, 0x33, 0x96, 0xB4, 0x9A, + 0xD6, 0x93, 0x0B, 0xDF, 0xFD, 0x86, 0x54, 0x75, 0xD1, 0x69, 0x57, 0xE1, 0xC3, 0x72, 0x4A, 0x41, + 0x44, 0x83, 0x2E, 0x35, 0x93, 0x18, 0x25, 0xCC, 0xC2, 0x50, 0x1E, 0x58, 0x6A, 0xAB, 0x19, 0xE5, + 0x96, 0x89, 0x13, 0x73, 0x09, 0x43, 0x32, 0x90, 0x43, 0x95, 0x3E, 0xEC, 0xA0, 0xE6, 0x2E, 0x7E, + 0x34, 0x80, 0xB3, 0xCA, 0x14, 0x96, 0x66, 0x42, 0x3D, 0x0A, 0x17, 0xA0, 0x4A, 0x5D, 0xB2, 0x7E, + 0x97, 0xEF, 0x53, 0x54, 0xDB, 0x4F, 0xCE, 0x13, 0x7F, 0xC4, 0x9C, 0x1E, 0xA7, 0xB0, 0xE6, 0xC0, + 0x71, 0x82, 0x3E, 0xEB, 0xB4, 0xDB, 0x38, 0x96, 0xED, 0x04, 0xC3, 0xE1, 0x02, 0xBA, 0x45, 0xFB, + 0xA8, 0x1F, 0xC4, 0x8C, 0x1C, 0x7F, 0xC6, 0xC7, 0x89, 0x26, 0xA7, 0xD7, 0x17, 0x89, 0x13, 0xF2, + 0x7B, 0xB7, 0xBB, 0x9E, 0x79, 0x6C, 0x08, 0x52, 0x85, 0x93, 0x70, 0x8C, 0x47, 0xFD, 0x99, 0x85, + 0xED, 0x68, 0x77, 0x6E, 0x4E, 0xCE, 0xE2, 0xE2, 0x2E, 0x34, 0x0B, 0x78, 0x30, 0xB9, 0xAE, 0xCB, + 0xC9, 0xC9, 0xD1, 0xE9, 0xE9, 0xD1, 0xD9, 0xD9, 0xD1, 0xF9, 0xF9, 0xD1, 0xC5, 0xC5, 0xD1, 0xE5, + 0x65, 0x71, 0x1F, 0x96, 0xE2, 0x13, 0x6F, 0x6B, 0x26, 0xA6, 0xB4, 0xA3, 0xF9, 0xFB, 0x47, 0x39, + 0x13, 0x42, 0x28, 0x8D, 0x90, 0x38, 0x21, 0x5D, 0xCE, 0x3D, 0x00, 0x89, 0x3F, 0xAD, 0xD6, 0x8D, + 0xCD, 0xCB, 0x3B, 0xFE, 0x17, 0x22, 0xF9, 0x2E, 0xA8, 0x12, 0x19, 0x15, 0x43, 0x0C, 0x6C, 0xDC, + 0x0F, 0xB1, 0x19, 0x93, 0x8A, 0x93, 0xB1, 0xB1, 0x92, 0xB5, 0xA2, 0x99, 0x20, 0xBE, 0x89, 0xB9, + 0xF1, 0x38, 0x58, 0xB4, 0xD2, 0x90, 0xC1, 0xB0, 0xC0, 0xF3, 0xBC, 0x90, 0x83, 0x40, 0x0E, 0xDF, + 0x4A, 0x9C, 0x50, 0x2C, 0x65, 0xB6, 0x48, 0x9B, 0x46, 0xA2, 0x46, 0xC1, 0x93, 0x23, 0xAF, 0x70, + 0xFE, 0x0E, 0xE3, 0xCF, 0x66, 0x80, 0x6E, 0x3B, 0x52, 0xB4, 0x11, 0xFE, 0x36, 0xA4, 0x39, 0x24, + 0xB3, 0x87, 0xCF, 0x03, 0xD8, 0x51, 0x09, 0x6B, 0x51, 0x84, 0x69, 0x0B, 0xD7, 0xB5, 0x85, 0xDA, + 0x42, 0x9F, 0x63, 0xBE, 0xF8, 0x1F, 0xB6, 0x19, 0xC8, 0xD0, 0x2A, 0xFF, 0x49, 0x73, 0x91, 0x7E, + 0x23, 0xAB, 0x09, 0xF7, 0xA5, 0x53, 0x0E, 0x80, 0x19, 0x86, 0x1F, 0x0C, 0x42, 0x9B, 0x12, 0x7E, + 0xD9, 0x3D, 0x64, 0xA3, 0x36, 0xB0, 0x36, 0xE0, 0xD2, 0x4F, 0x68, 0x92, 0xB6, 0x6B, 0xEF, 0x3C, + 0xC4, 0x3F, 0x77, 0x4A, 0x23, 0xF5, 0xC4, 0x00, 0x39, 0x85, 0x8A, 0x4B, 0x07, 0xE5, 0x44, 0x49, + 0x3E, 0x51, 0x58, 0xB2, 0x78, 0x88, 0xD1, 0x74, 0x6A, 0xBB, 0x14, 0xA1, 0xBD, 0x72, 0x8A, 0x8F, + 0xF9, 0xE5, 0x92, 0xD4, 0xBC, 0xD5, 0x66, 0x19, 0xDA, 0xD4, 0x23, 0x37, 0x5E, 0x95, 0x2E, 0x81, + 0xD2, 0x28, 0x81, 0x82, 0xA6, 0xEB, 0x26, 0x86, 0x34, 0x82, 0x94, 0x63, 0x70, 0x8B, 0x47, 0xA1, + 0xFB, 0xAE, 0x38, 0x5C, 0x64, 0x51, 0x52, 0x94, 0x3D, 0x22, 0x30, 0xB0, 0x41, 0x88, 0x66, 0x55, + 0xD3, 0xF3, 0x03, 0x91, 0x69, 0x8F, 0xD6, 0x02, 0x1F, 0xBB, 0x18, 0xCA, 0x4F, 0xA1, 0x8D, 0x82, + 0x70, 0x81, 0x56, 0x89, 0x9C, 0x15, 0xF4, 0xFA, 0x6B, 0x42, 0x66, 0x73, 0x9E, 0xA4, 0xD3, 0x0E, + 0x8F, 0x14, 0x1E, 0x4D, 0xAA, 0x6D, 0x99, 0xF3, 0xA0, 0xE8, 0x52, 0x9F, 0x42, 0x4C, 0x18, 0x3D, + 0x30, 0x8E, 0x87, 0xD4, 0x55, 0xE0, 0xBC, 0x70, 0xC7, 0x4D, 0xFC, 0xC6, 0xEF, 0x65, 0x6E, 0xCD, + 0x9D, 0x90, 0x5C, 0x2E, 0xCB, 0x54, 0x0C, 0xAC, 0x25, 0x8F, 0xF3, 0x5D, 0xDB, 0x79, 0x3A, 0x8D, + 0xB4, 0x96, 0x95, 0xE3, 0xF8, 0x23, 0xFB, 0x2E, 0xCA, 0xEF, 0xF2, 0x65, 0x71, 0xAD, 0xCC, 0x4C, + 0x56, 0x81, 0x1B, 0x51, 0x1D, 0x24, 0x94, 0x5E, 0x76, 0xA2, 0x62, 0xC4, 0x70, 0x84, 0xA3, 0xC0, + 0x29, 0x0E, 0x72, 0x9F, 0xDB, 0x86, 0x8F, 0x56, 0x47, 0xE1, 0xED, 0xF0, 0x68, 0x6A, 0x09, 0xFD, + 0x6F, 0xE0, 0xD0, 0x37, 0x74, 0x41, 0xF3, 0xB1, 0x68, 0xB1, 0x87, 0x89, 0x3F, 0x81, 0x0D, 0xC1, + 0x51, 0xDF, 0xD7, 0x1E, 0x39, 0x8B, 0x6E, 0xA9, 0x52, 0x8F, 0x5C, 0x30, 0x8D, 0xC8, 0xDA, 0xCB, + 0x00, 0xA5, 0xA7, 0x79, 0x48, 0x16, 0x83, 0x6C, 0x7B, 0xA6, 0x83, 0x49, 0xAF, 0xDE, 0x98, 0xAA, + 0x2A, 0xB1, 0xC4, 0x68, 0x85, 0x85, 0x14, 0x57, 0x93, 0xFB, 0x99, 0xB0, 0x9D, 0x49, 0xD8, 0x8E, + 0x55, 0x66, 0x25, 0x2A, 0x4F, 0x2E, 0x5E, 0xA5, 0x95, 0x57, 0xA9, 0x95, 0x6B, 0xB9, 0x25, 0xE6, + 0x8C, 0xC8, 0x11, 0xBC, 0x93, 0x80, 0x5F, 0xC7, 0x09, 0x3D, 0x38, 0xA2, 0xAE, 0xCD, 0x2E, 0x47, + 0xC5, 0xCA, 0x18, 0x23, 0xC8, 0x5E, 0x7C, 0x55, 0x3B, 0xA0, 0x0F, 0x07, 0x23, 0x46, 0x90, 0xE4, + 0x7E, 0x89, 0xFE, 0x58, 0xD4, 0xDF, 0xD1, 0xD2, 0x33, 0x3E, 0x9D, 0x24, 0x33, 0xD3, 0xF8, 0x62, + 0x36, 0xA2, 0x7A, 0x2D, 0xF0, 0xC7, 0x2E, 0xB3, 0x1D, 0xC1, 0x46, 0x41, 0x3A, 0xC3, 0xDC, 0x4A, + 0xE6, 0xA3, 0xCC, 0xFD, 0x4E, 0x85, 0xBB, 0x06, 0x9A, 0xFD, 0x22, 0xD3, 0xD5, 0xFB, 0xB5, 0x21, + 0x59, 0x47, 0x0E, 0x66, 0xC2, 0x89, 0x43, 0x7A, 0xF8, 0xD2, 0x45, 0x0A, 0x13, 0xAF, 0x61, 0x22, + 0x0B, 0x31, 0x8E, 0xAC, 0x3D, 0x7F, 0xC4, 0xF6, 0xA9, 0x94, 0x3C, 0xDC, 0x71, 0xA3, 0xBE, 0x56, + 0x3A, 0x55, 0x53, 0x8E, 0x90, 0xAB, 0x2D, 0x89, 0x09, 0xC2, 0x10, 0xB6, 0xB7, 0x95, 0x23, 0xE4, + 0x6A, 0x4B, 0x64, 0x94, 0xDC, 0x8A, 0x7A, 0x4A, 0x1A, 0x67, 0xB6, 0x32, 0x44, 0x9D, 0x45, 0xCA, + 0x79, 0x74, 0x4B, 0x2E, 0x9B, 0xDE, 0xF9, 0x32, 0x0C, 0xE7, 0x6A, 0x49, 0x5D, 0x46, 0xC9, 0x68, + 0x78, 0xB4, 0x2C, 0x2F, 0xD1, 0xCB, 0x89, 0x8F, 0xC9, 0x05, 0x09, 0xC5, 0xDD, 0x88, 0x00, 0xE0, + 0x42, 0xC4, 0x35, 0xBD, 0x9F, 0xAA, 0xF8, 0x1B, 0xA1, 0x3C, 0x09, 0xDB, 0x18, 0xF2, 0xA3, 0x45, + 0xD4, 0x06, 0xB8, 0x6F, 0xDA, 0xBA, 0xC7, 0x31, 0x6D, 0x33, 0x6A, 0x29, 0xA2, 0x6E, 0xA2, 0x77, + 0xC9, 0xA5, 0x53, 0x12, 0x0E, 0x25, 0x28, 0x7F, 0xC0, 0xF7, 0xE8, 0xB1, 0xE5, 0x3C, 0xC1, 0xD3, + 0x1A, 0x15, 0x37, 0xE9, 0xA1, 0x22, 0xC3, 0x43, 0xA5, 0x2F, 0xD2, 0x28, 0x79, 0x4D, 0x6D, 0x75, + 0x50, 0xA4, 0x49, 0x1D, 0x09, 0x5B, 0x79, 0xEE, 0x59, 0x2B, 0x9B, 0x30, 0x26, 0x29, 0x0A, 0x48, + 0x26, 0x3B, 0x78, 0xAE, 0x62, 0xED, 0x0A, 0x81, 0x35, 0x59, 0x1C, 0x8E, 0xD0, 0xE2, 0xDA, 0x9C, + 0xEE, 0x9B, 0x39, 0xFE, 0xCE, 0x35, 0xE1, 0x7A, 0x15, 0x0F, 0x82, 0xBD, 0x9F, 0xD2, 0xBB, 0xF5, + 0xCA, 0x71, 0x5D, 0xE1, 0x5A, 0x34, 0xEF, 0x30, 0x8D, 0xCA, 0x71, 0x63, 0x09, 0xC3, 0xC0, 0x86, + 0x36, 0x97, 0x30, 0x0C, 0xDC, 0x9B, 0x5A, 0x4B, 0x18, 0x66, 0xAF, 0x72, 0xBC, 0xB7, 0x84, 0x61, + 0xF6, 0x2B, 0xC7, 0xFB, 0x4B, 0x18, 0xE6, 0xA0, 0x72, 0x7C, 0xA0, 0x34, 0x8C, 0x97, 0x7B, 0x12, + 0x13, 0x68, 0x47, 0x5E, 0x84, 0x8A, 0xAA, 0x1B, 0x62, 0x35, 0x03, 0xF0, 0x1E, 0x1E, 0xDC, 0x39, + 0x67, 0x93, 0x47, 0x40, 0x9F, 0xA1, 0x5B, 0x7C, 0x0B, 0xD9, 0x5D, 0xF4, 0x70, 0xC6, 0x62, 0x4B, + 0xBF, 0xB0, 0x74, 0x5E, 0xFC, 0x80, 0x0F, 0xDE, 0xD8, 0x15, 0x45, 0x2C, 0xAA, 0xD0, 0xAD, 0x24, + 0xD5, 0x74, 0xC2, 0x26, 0xA4, 0x60, 0x96, 0xB9, 0x83, 0xF8, 0xA2, 0xFD, 0xCA, 0x5D, 0x3F, 0x66, + 0xAD, 0x6B, 0xAE, 0x4A, 0x8E, 0xA1, 0x6B, 0x39, 0x9A, 0xF1, 0x8D, 0x3F, 0x5D, 0xCA, 0x1A, 0x49, + 0xE7, 0xE6, 0x63, 0xDE, 0x02, 0x42, 0xD3, 0x55, 0x45, 0x23, 0x23, 0x54, 0x8E, 0xE5, 0x2E, 0x44, + 0x0F, 0x54, 0x92, 0x04, 0xD0, 0x39, 0x4F, 0xB6, 0xCC, 0xE0, 0x21, 0x6A, 0xF7, 0x57, 0xEE, 0xA1, + 0xC9, 0xF9, 0x87, 0xDB, 0xF3, 0x34, 0x83, 0x4F, 0x36, 0xE4, 0x3D, 0xD6, 0x6B, 0xF5, 0x39, 0x8F, + 0xF5, 0x59, 0xC2, 0xB4, 0x66, 0x81, 0x88, 0x05, 0xE0, 0x47, 0xBF, 0x3D, 0x6F, 0xA6, 0xD0, 0x32, + 0x4D, 0x6F, 0x7A, 0x86, 0x00, 0x4C, 0x42, 0x4B, 0xC5, 0xF4, 0xA6, 0x70, 0x99, 0x8A, 0xB9, 0x9B, + 0x9E, 0x19, 0x00, 0x79, 0x19, 0x0D, 0x4A, 0xB7, 0x26, 0xF8, 0x22, 0xDE, 0x97, 0x04, 0x1E, 0x2F, + 0xFD, 0xD2, 0x27, 0x66, 0x14, 0xD7, 0x4A, 0x06, 0x36, 0xEB, 0x73, 0x4E, 0xD7, 0x3D, 0x98, 0x60, + 0x5C, 0xCF, 0x0B, 0x24, 0xC5, 0x61, 0xA6, 0xC1, 0xF8, 0xD2, 0x27, 0xAC, 0x72, 0xAB, 0x7C, 0x45, + 0x4B, 0xDC, 0x63, 0xA2, 0xB5, 0x44, 0xFB, 0x8E, 0x2A, 0x67, 0x79, 0x4F, 0x99, 0xAD, 0xE6, 0x2D, + 0xD7, 0x64, 0x75, 0x7B, 0x36, 0x24, 0xD1, 0x13, 0x8A, 0x89, 0x38, 0xE5, 0x70, 0xB1, 0x1E, 0xA2, + 0xC3, 0x12, 0xCD, 0x50, 0xC9, 0xB9, 0xBC, 0x9A, 0x1E, 0x97, 0x96, 0x1F, 0x23, 0x1B, 0x9E, 0x38, + 0x9A, 0x69, 0xFB, 0x52, 0x59, 0x80, 0xF7, 0x1A, 0xD6, 0xE5, 0x5A, 0x10, 0xA2, 0x22, 0x02, 0x28, + 0x05, 0xEE, 0x3D, 0x2F, 0x4C, 0xFA, 0xB8, 0xF8, 0x01, 0x2E, 0xA2, 0xC6, 0xBE, 0xC1, 0x9F, 0x20, + 0x44, 0x38, 0x03, 0x98, 0x83, 0x21, 0x15, 0x13, 0x5D, 0x93, 0x5B, 0x70, 0xFD, 0x71, 0xBC, 0x87, + 0xB7, 0x66, 0xAD, 0x9D, 0x2E, 0xE3, 0xE5, 0x62, 0xA1, 0xA2, 0x5E, 0x9C, 0xF9, 0xF8, 0x95, 0x07, + 0x29, 0x66, 0x98, 0xE1, 0xF1, 0xB6, 0x63, 0xF3, 0xB9, 0xD8, 0x6D, 0xB6, 0xFF, 0x92, 0x99, 0x6D, + 0x2F, 0xD5, 0x3D, 0xB2, 0xDA, 0x1F, 0xAE, 0x41, 0x35, 0x12, 0x1D, 0xF6, 0xD8, 0xAA, 0x35, 0xF6, + 0x6A, 0x8D, 0x7D, 0x75, 0x36, 0x2B, 0x60, 0x73, 0xFC, 0xD9, 0xF5, 0x9C, 0x1E, 0xF9, 0x15, 0x24, + 0x19, 0x88, 0xE8, 0xB8, 0x2D, 0xBF, 0x3A, 0xD5, 0xBC, 0x98, 0xAE, 0x1A, 0x70, 0xDD, 0x1C, 0x68, + 0xCF, 0xF0, 0xA1, 0x5E, 0x57, 0x24, 0x00, 0x09, 0xE6, 0x27, 0xD3, 0x08, 0xFA, 0x47, 0xAD, 0x7A, + 0x9D, 0xDC, 0x49, 0x80, 0x2B, 0xC9, 0xDE, 0xD5, 0x0D, 0x6A, 0xE3, 0x67, 0x37, 0xC5, 0xAE, 0xD6, + 0xFA, 0xF8, 0x8F, 0x2A, 0xA6, 0x35, 0x09, 0x8A, 0x85, 0xA5, 0xD9, 0x51, 0x3E, 0xD0, 0xD3, 0xFC, + 0x35, 0x7B, 0xE3, 0xC8, 0x93, 0xC1, 0x08, 0xAB, 0xCE, 0x57, 0x64, 0x12, 0x9D, 0x7B, 0xA0, 0x6F, + 0xFA, 0x93, 0x04, 0xD3, 0xF0, 0x7E, 0x60, 0x06, 0x11, 0x12, 0x5D, 0xD2, 0x73, 0xC7, 0x16, 0x15, + 0xE1, 0x92, 0x10, 0x46, 0x39, 0xEB, 0x67, 0xCD, 0x0C, 0xD0, 0x28, 0xBA, 0x3B, 0x63, 0x64, 0xF1, + 0x36, 0x3B, 0xBD, 0xFA, 0x36, 0x97, 0x22, 0xB1, 0x5C, 0x4D, 0x55, 0x44, 0x1B, 0xC0, 0x5F, 0x43, + 0xDB, 0x0C, 0xB6, 0xFC, 0x21, 0xF3, 0xBD, 0x7F, 0x61, 0x42, 0x90, 0x24, 0xAF, 0x17, 0x10, 0xC6, + 0x6D, 0x24, 0x4B, 0x84, 0x91, 0xC8, 0x53, 0x4E, 0x06, 0xFD, 0x28, 0xEC, 0x8E, 0xB9, 0x7D, 0xE0, + 0x0B, 0xE8, 0xBD, 0xD8, 0x3E, 0x7B, 0x3D, 0x15, 0xD2, 0x8C, 0x9B, 0x6D, 0x96, 0x3E, 0x70, 0x71, + 0x85, 0xEC, 0xCD, 0x53, 0x31, 0x7D, 0x0A, 0xE7, 0x8D, 0xEF, 0x00, 0x30, 0x5E, 0xD0, 0x09, 0x00, + 0xF2, 0x73, 0x55, 0x10, 0x8D, 0x7B, 0x89, 0xE5, 0xFB, 0x2B, 0xD8, 0x43, 0xAC, 0x37, 0x4B, 0x4F, + 0xF3, 0x27, 0x92, 0x1A, 0x76, 0x98, 0x9E, 0x65, 0x59, 0xA5, 0x8C, 0x6F, 0x9D, 0xC7, 0xA2, 0x15, + 0x88, 0x1B, 0x95, 0xE3, 0x53, 0xCD, 0xE7, 0x45, 0xCB, 0x17, 0x1F, 0x7F, 0xBB, 0x6B, 0xAF, 0x64, + 0xEE, 0xA9, 0x76, 0x28, 0xDD, 0x72, 0xC5, 0x06, 0x9A, 0x36, 0x1C, 0x53, 0x9E, 0x43, 0xDE, 0xBC, + 0x54, 0xB3, 0x0F, 0x2F, 0x08, 0x77, 0x22, 0x39, 0x55, 0xEC, 0x7A, 0xD6, 0x26, 0xD7, 0xB3, 0xEF, + 0x36, 0x7E, 0x49, 0x3A, 0x91, 0xDA, 0x7A, 0xBA, 0xEA, 0x5A, 0x4E, 0xEF, 0xCE, 0xE9, 0x9C, 0xC3, + 0xFD, 0xDF, 0x78, 0xFD, 0xA2, 0x92, 0x71, 0x7D, 0x15, 0x2C, 0x77, 0x02, 0x9B, 0xD0, 0x39, 0x67, + 0x38, 0xB1, 0xA5, 0xD5, 0x91, 0x7C, 0xBD, 0xFA, 0x2E, 0x57, 0x5D, 0x60, 0xEF, 0x03, 0x53, 0xF7, + 0x60, 0x2F, 0x48, 0x93, 0xC1, 0xE8, 0x46, 0x17, 0x10, 0x63, 0xDF, 0x21, 0xDF, 0x88, 0x01, 0x30, + 0x44, 0x0D, 0x8D, 0x09, 0x91, 0x19, 0x0F, 0xB6, 0xAE, 0x97, 0xF2, 0x84, 0x90, 0x55, 0x21, 0xDF, + 0x48, 0x59, 0xC7, 0xE4, 0x8E, 0xCC, 0xF4, 0x25, 0x5F, 0x56, 0x1D, 0x3D, 0x10, 0x28, 0x61, 0x4A, + 0x77, 0xB3, 0x2C, 0xCC, 0x22, 0xCC, 0xEE, 0xE3, 0x88, 0x85, 0xF9, 0x46, 0x7B, 0x8E, 0x4A, 0x1D, + 0xA9, 0x49, 0xA4, 0x54, 0xCB, 0x71, 0x7B, 0x60, 0xDA, 0x2A, 0xC5, 0x1B, 0x17, 0x71, 0x27, 0x4C, + 0xE0, 0xE8, 0x77, 0x5B, 0x17, 0x52, 0x0A, 0x00, 0x01, 0x91, 0x4F, 0xD4, 0x14, 0x45, 0x65, 0x84, + 0xDE, 0x37, 0xF9, 0x23, 0xE2, 0xA9, 0x25, 0xD6, 0x26, 0x13, 0x4C, 0xA1, 0xE5, 0xAC, 0xC6, 0xEE, + 0x50, 0x39, 0x21, 0xCA, 0x93, 0x47, 0xD5, 0x88, 0x2C, 0x34, 0x2F, 0xE3, 0x7B, 0x96, 0x03, 0x3F, + 0x40, 0xD4, 0x1C, 0x08, 0x97, 0x21, 0x1B, 0x27, 0xB6, 0x83, 0xD7, 0xC8, 0xC0, 0xD4, 0x99, 0x1F, + 0x7A, 0x8F, 0xFC, 0xC5, 0x27, 0xDF, 0x20, 0xE8, 0xCC, 0xC3, 0x6B, 0x68, 0x54, 0x55, 0x10, 0x33, + 0xAA, 0xC0, 0xE8, 0xC9, 0x70, 0xC2, 0x3D, 0x00, 0x3F, 0x00, 0x2A, 0x0C, 0xB8, 0x1F, 0x1B, 0xB0, + 0x1B, 0xD8, 0xB8, 0x79, 0x78, 0x38, 0xFC, 0x46, 0xF5, 0xEE, 0xB9, 0xD8, 0xFB, 0xA7, 0xF2, 0x1D, + 0x54, 0x4D, 0x20, 0x1D, 0x2B, 0x58, 0x4F, 0xA9, 0x7C, 0x48, 0x17, 0x3B, 0x7F, 0x00, 0x5C, 0x45, + 0x70, 0xBF, 0x04, 0x56, 0xAB, 0xDF, 0x71, 0x86, 0x8D, 0x4A, 0x09, 0x24, 0x5C, 0x2E, 0x05, 0xCB, + 0x42, 0x8F, 0x73, 0xD0, 0xB0, 0xDA, 0x26, 0xE3, 0xB5, 0x85, 0x5D, 0xCB, 0x4A, 0x98, 0x44, 0xC6, + 0x8B, 0x27, 0x50, 0xA0, 0xB5, 0x34, 0x95, 0xA4, 0x69, 0x54, 0x23, 0x65, 0x22, 0xD2, 0x6F, 0x74, + 0x90, 0xA0, 0x8D, 0x1B, 0xD3, 0x76, 0x8C, 0x23, 0x55, 0xFA, 0x0E, 0x49, 0x55, 0x04, 0x42, 0x59, + 0x74, 0xEC, 0xC8, 0x00, 0x6D, 0x4D, 0xD0, 0xAF, 0xA0, 0xD3, 0x77, 0x46, 0x8A, 0x8B, 0x26, 0x46, + 0xF5, 0x4A, 0xA4, 0x29, 0x72, 0x2C, 0xA1, 0xFC, 0x68, 0xCE, 0xB2, 0xA2, 0x80, 0x0E, 0xE2, 0x6E, + 0x2E, 0x47, 0x53, 0x25, 0xC9, 0x04, 0x41, 0xAB, 0xD6, 0x1F, 0x1D, 0xB9, 0x7B, 0x65, 0x86, 0x4E, + 0x30, 0x86, 0x94, 0xE6, 0x8A, 0xC4, 0x49, 0xBA, 0x34, 0xE3, 0x15, 0xEB, 0x48, 0x20, 0x93, 0x3A, + 0xEE, 0xE1, 0xBF, 0xC4, 0x4A, 0xBF, 0x69, 0x83, 0x29, 0x56, 0x97, 0xCE, 0xE5, 0xC5, 0xDF, 0x60, + 0xB8, 0x5A, 0x78, 0xFF, 0x9C, 0x13, 0x05, 0x95, 0x99, 0xFC, 0xAA, 0x94, 0x17, 0x9E, 0x3B, 0x0C, + 0x6B, 0xBA, 0x9A, 0x12, 0xA4, 0x00, 0x0F, 0xD5, 0x88, 0x00, 0xCD, 0xB2, 0x14, 0x94, 0x23, 0x8A, + 0xCA, 0xC4, 0x18, 0xA8, 0xA5, 0xEC, 0xE0, 0x9F, 0x64, 0x0C, 0x82, 0x07, 0x39, 0xDC, 0xE8, 0x17, + 0x2C, 0x78, 0x9D, 0x59, 0x0E, 0x46, 0x43, 0x91, 0xB2, 0x27, 0xF4, 0x3C, 0x0C, 0xF7, 0x40, 0xF6, + 0x4D, 0x4E, 0xD5, 0x38, 0x63, 0x5F, 0xF2, 0x74, 0xC7, 0xE6, 0xEB, 0xC9, 0x54, 0x17, 0x86, 0xD0, + 0xF1, 0x2D, 0xB5, 0x91, 0xE1, 0x08, 0xA5, 0x5A, 0x90, 0x4E, 0x6E, 0xDB, 0xD9, 0xFA, 0xA7, 0xF0, + 0x28, 0x5F, 0x4D, 0xD3, 0x92, 0x6E, 0xB0, 0x89, 0xA9, 0xAC, 0x42, 0x48, 0x40, 0x32, 0xF1, 0x0B, + 0xA2, 0xEF, 0x09, 0x26, 0x78, 0xB1, 0x35, 0x76, 0xCB, 0xBB, 0xDC, 0xC3, 0x54, 0x2F, 0xAC, 0xED, + 0xF8, 0x26, 0xA9, 0x89, 0x48, 0x9F, 0x49, 0x81, 0xD5, 0x8D, 0x7A, 0x7D, 0x7F, 0x17, 0x7E, 0x1C, + 0xC4, 0x02, 0x8A, 0x66, 0x18, 0x94, 0x10, 0x51, 0xFA, 0xD6, 0xF5, 0xD6, 0xCD, 0x82, 0xA4, 0x78, + 0x94, 0x66, 0xB7, 0xB0, 0x70, 0x04, 0x75, 0x39, 0x0C, 0x3E, 0x7B, 0xDC, 0x0E, 0x27, 0x86, 0x45, + 0x60, 0x3D, 0xC0, 0xBE, 0x42, 0xF2, 0x33, 0x74, 0xA3, 0xCE, 0xA2, 0xE4, 0x80, 0x2C, 0x1A, 0x91, + 0x6D, 0xFB, 0xAA, 0x37, 0xE1, 0x45, 0x31, 0xE5, 0x34, 0x7A, 0x23, 0xA1, 0x47, 0xB7, 0x5E, 0x90, + 0x9C, 0x55, 0xB1, 0x3D, 0xAD, 0xC3, 0x41, 0xAD, 0xA2, 0x29, 0x57, 0x28, 0xB3, 0x85, 0x66, 0xBD, + 0xB8, 0xF3, 0xF0, 0xF5, 0xC5, 0xF3, 0xF6, 0x5C, 0xFC, 0x3D, 0x9F, 0x78, 0x33, 0x8F, 0xE8, 0x3C, + 0x06, 0x43, 0x55, 0x47, 0x74, 0x27, 0x74, 0x30, 0x97, 0x28, 0x9D, 0xF7, 0x74, 0x5B, 0x90, 0x55, + 0x8F, 0x8C, 0xBE, 0x51, 0x8E, 0x09, 0x0A, 0xF1, 0x1B, 0x5F, 0x40, 0x03, 0xB8, 0x0A, 0xCB, 0x53, + 0x45, 0x63, 0xB4, 0xCF, 0xCA, 0xF1, 0x30, 0x97, 0x45, 0xDB, 0x73, 0x02, 0x07, 0x88, 0x3F, 0xBF, + 0x09, 0x64, 0x4C, 0xBF, 0x13, 0xD6, 0x50, 0x96, 0x51, 0xA4, 0xD3, 0x6E, 0x17, 0x37, 0x89, 0x5C, + 0x5F, 0x14, 0xB6, 0x88, 0x60, 0x8A, 0x90, 0x7F, 0x62, 0x85, 0x7B, 0x80, 0x9D, 0xFA, 0xDE, 0xED, + 0xAE, 0xA4, 0x4D, 0xE5, 0x2C, 0x0E, 0xD8, 0xC7, 0xD4, 0x27, 0xC8, 0x1D, 0xCF, 0xB0, 0x6B, 0x53, + 0x4F, 0x26, 0x48, 0xE1, 0x1E, 0x1A, 0xCA, 0x30, 0x17, 0x15, 0x62, 0x0B, 0xDD, 0xD0, 0xB6, 0x01, + 0x24, 0x1F, 0x92, 0x59, 0x54, 0xAE, 0x9D, 0xA7, 0xEA, 0x85, 0xCD, 0xBD, 0xDE, 0x0B, 0xDB, 0x06, + 0x40, 0x7D, 0xA0, 0xF4, 0x2C, 0x41, 0xE8, 0xD9, 0x89, 0x77, 0x9C, 0x6E, 0x37, 0xA1, 0x7E, 0x88, + 0x81, 0xBA, 0xE6, 0x85, 0x57, 0x4B, 0xCF, 0xF8, 0x73, 0xA9, 0xE9, 0x81, 0xE3, 0x0D, 0x1D, 0x86, + 0xE3, 0xF8, 0x7C, 0xF1, 0x3C, 0xE1, 0xD2, 0xBB, 0x84, 0x4C, 0x40, 0xD9, 0xC9, 0x28, 0x89, 0xAB, + 0x25, 0x23, 0x69, 0x76, 0xE1, 0xE2, 0x58, 0xE6, 0x1E, 0x1A, 0xFD, 0xF0, 0xF0, 0x0D, 0x7D, 0xEE, + 0x61, 0x16, 0x0B, 0x4A, 0xE6, 0x47, 0xF7, 0x2D, 0x4F, 0xB8, 0x3F, 0x27, 0x93, 0x0A, 0xC9, 0xF0, + 0x2B, 0x8F, 0xBC, 0xF5, 0x80, 0xE3, 0x3D, 0xC4, 0x2D, 0x6A, 0x20, 0x01, 0xBC, 0x48, 0x7D, 0x99, + 0x8D, 0xC6, 0x2C, 0x34, 0xE9, 0x0F, 0x34, 0x93, 0x1C, 0xAA, 0x48, 0xDF, 0x36, 0x36, 0x7E, 0x7F, + 0x38, 0xC6, 0x22, 0x63, 0xF5, 0x57, 0x2D, 0x75, 0x62, 0xAE, 0x80, 0xEF, 0xC9, 0x5A, 0x83, 0x6E, + 0x16, 0xAD, 0x4A, 0x71, 0x8A, 0xCF, 0x20, 0x6B, 0x2A, 0xFE, 0x3E, 0xF6, 0x88, 0x1F, 0x25, 0xA3, + 0xD9, 0x61, 0x00, 0xEE, 0xB8, 0x49, 0xCF, 0xE5, 0x0F, 0x31, 0xE1, 0xDB, 0x14, 0x97, 0x10, 0xB1, + 0x38, 0xC4, 0x19, 0x0C, 0x7E, 0x1F, 0xF6, 0x7E, 0x23, 0x7F, 0xB2, 0x73, 0xFC, 0xC8, 0xF0, 0xF3, + 0x0C, 0xD7, 0xE4, 0x32, 0xAE, 0xD9, 0x79, 0x1C, 0x34, 0x11, 0xC0, 0xE7, 0x42, 0xD1, 0x06, 0xB3, + 0x14, 0x1F, 0x84, 0xD1, 0x9D, 0x9D, 0x39, 0x21, 0xD2, 0xE1, 0x52, 0x38, 0x56, 0x6A, 0x1E, 0xAF, + 0xC1, 0xAE, 0x4E, 0x18, 0xC9, 0xBA, 0x4C, 0x48, 0xC4, 0xE3, 0x6F, 0xC7, 0x52, 0x21, 0x09, 0xEC, + 0xC9, 0x88, 0xB2, 0xE5, 0x90, 0xE3, 0xA6, 0x68, 0xE2, 0x60, 0xE0, 0x28, 0x10, 0x01, 0x3A, 0x2F, + 0x54, 0xE1, 0x83, 0x60, 0x35, 0xFA, 0x0B, 0x90, 0x3C, 0x70, 0xAB, 0x1F, 0xBE, 0xF4, 0xD5, 0x24, + 0xA4, 0x40, 0x29, 0xB8, 0x40, 0x98, 0xFD, 0x8A, 0xF0, 0x95, 0xC2, 0xF1, 0x25, 0x17, 0x00, 0x2E, + 0xCF, 0x26, 0xD4, 0x7A, 0xCD, 0x08, 0x13, 0x42, 0x3B, 0x39, 0x95, 0x28, 0x2E, 0xA4, 0xEC, 0xA8, + 0x93, 0x8B, 0x4C, 0xFF, 0xB9, 0xE2, 0x4E, 0x32, 0x8D, 0xC7, 0x8F, 0x9B, 0xC3, 0x6F, 0x35, 0x03, + 0xF7, 0x4C, 0x94, 0x4A, 0x0C, 0x8A, 0x15, 0xCB, 0xFC, 0x98, 0x81, 0xC2, 0x3A, 0x24, 0x7F, 0x94, + 0x33, 0x3E, 0xFF, 0xE9, 0xAC, 0x0D, 0x12, 0x60, 0x04, 0xF5, 0x10, 0x35, 0xCC, 0xF8, 0x6C, 0xD1, + 0xAC, 0x34, 0x39, 0xBC, 0xE2, 0x21, 0x6C, 0xF4, 0x75, 0x37, 0x9A, 0x28, 0x1E, 0xBD, 0x4B, 0x67, + 0xBC, 0x49, 0x35, 0x66, 0x0C, 0x31, 0x62, 0xBF, 0x98, 0xBE, 0x11, 0x97, 0x52, 0x8B, 0xF8, 0xA3, + 0xCC, 0x73, 0xCC, 0xD0, 0x83, 0xFE, 0x59, 0x94, 0x0C, 0x3C, 0x11, 0xF9, 0xCC, 0x76, 0xD8, 0xF9, + 0xB7, 0xCE, 0x0E, 0xFB, 0x0A, 0x37, 0xA2, 0x27, 0x60, 0xD0, 0x28, 0x4D, 0x76, 0xC2, 0x7B, 0xEC, + 0xE9, 0x46, 0xF3, 0x1F, 0xF2, 0xBB, 0xF1, 0xAC, 0xD6, 0xE5, 0x45, 0xC5, 0xE3, 0x92, 0x20, 0x72, + 0xD5, 0x4E, 0x67, 0xC7, 0x8E, 0xE0, 0xB9, 0xF8, 0x2C, 0xD9, 0x11, 0xEA, 0x5D, 0xB5, 0x53, 0xF5, + 0x5D, 0xF7, 0x47, 0x34, 0x94, 0x97, 0x99, 0x9D, 0x3B, 0x7A, 0x4D, 0xFD, 0x39, 0x62, 0x17, 0x39, + 0x83, 0xC9, 0xF3, 0x77, 0x1C, 0x06, 0x92, 0xBA, 0x30, 0x8B, 0x6F, 0x6F, 0x3D, 0xB5, 0xF6, 0x7E, + 0xD9, 0x49, 0xB5, 0x13, 0xF8, 0xA1, 0x6E, 0x76, 0x1F, 0x36, 0x7A, 0x03, 0xB5, 0xBA, 0x62, 0xE6, + 0xFC, 0xAD, 0x33, 0x83, 0x44, 0xE0, 0x8D, 0xF5, 0xA0, 0x0A, 0x5C, 0xCA, 0x86, 0x10, 0x8A, 0x11, + 0x82, 0x22, 0xEC, 0x32, 0x94, 0x00, 0xAD, 0xDE, 0x10, 0x29, 0xC8, 0xE3, 0x7A, 0x06, 0x39, 0xC8, + 0xB7, 0xD6, 0x83, 0x24, 0xA2, 0x25, 0x6D, 0xC8, 0xA2, 0x18, 0x59, 0xE4, 0x80, 0x5F, 0x86, 0x34, + 0x64, 0xCB, 0x37, 0x44, 0x1E, 0x42, 0x82, 0x9D, 0x41, 0x1D, 0x09, 0x31, 0x77, 0x3D, 0x28, 0xC4, + 0x17, 0x13, 0x1E, 0xC0, 0x84, 0x37, 0x54, 0x52, 0x90, 0x4A, 0x24, 0x66, 0xE4, 0x27, 0x12, 0xD1, + 0xF0, 0xD5, 0x8B, 0x93, 0x14, 0xBC, 0xE7, 0xCC, 0x95, 0xCF, 0x2E, 0x02, 0xC1, 0xB7, 0xC0, 0x4D, + 0x55, 0xF2, 0x19, 0x4F, 0x56, 0x31, 0xF2, 0x62, 0x70, 0x92, 0x42, 0x01, 0x9F, 0xFC, 0xC5, 0x7B, + 0x46, 0x46, 0x88, 0x6F, 0xA9, 0x48, 0x46, 0x8D, 0x66, 0xEB, 0xAD, 0xE4, 0x83, 0x53, 0xA6, 0x06, + 0x55, 0xCF, 0x84, 0x34, 0x2D, 0x44, 0xFB, 0xA9, 0x96, 0x1B, 0x21, 0xD3, 0xAA, 0x30, 0x25, 0x14, + 0xC3, 0xF2, 0xC2, 0x8A, 0x53, 0xC4, 0x91, 0xD7, 0xD7, 0x99, 0xDA, 0x81, 0xBB, 0x28, 0x75, 0x29, + 0x2C, 0xB0, 0x90, 0xA6, 0x74, 0xD8, 0x6E, 0x6E, 0x25, 0xE9, 0x10, 0xC6, 0x19, 0xFD, 0x28, 0x2E, + 0x7B, 0xC5, 0x54, 0xA3, 0xC3, 0x65, 0xAF, 0x4C, 0xBE, 0x50, 0x1B, 0x29, 0xCA, 0xB2, 0x2E, 0x9E, + 0x5D, 0x80, 0xB1, 0x3D, 0x8B, 0xBF, 0xE2, 0xAB, 0x2C, 0x7A, 0x77, 0xF9, 0x09, 0x40, 0x45, 0x30, + 0x86, 0x30, 0xE3, 0x48, 0xEF, 0xDF, 0x81, 0xF6, 0x6C, 0x0E, 0xC2, 0x41, 0xEC, 0x2B, 0xC6, 0xEE, + 0x79, 0xF0, 0xC4, 0xB9, 0x0D, 0x02, 0x0B, 0xD9, 0x07, 0xCD, 0x47, 0x1E, 0x87, 0x09, 0xD6, 0xD8, + 0x45, 0xAD, 0x57, 0x13, 0x36, 0x21, 0xC9, 0xB3, 0x49, 0x11, 0x8B, 0x36, 0xA0, 0x03, 0x34, 0x51, + 0xFB, 0x43, 0x33, 0x36, 0x76, 0x85, 0xD1, 0x19, 0xFF, 0xEB, 0x80, 0x7D, 0x61, 0x07, 0x7B, 0xFE, + 0x86, 0xAD, 0x4F, 0x65, 0xEB, 0x59, 0x34, 0x52, 0x63, 0xEB, 0x99, 0x56, 0x0B, 0x65, 0xEB, 0x8B, + 0x23, 0x1F, 0x8F, 0xEB, 0x26, 0xA6, 0x9F, 0x9A, 0x45, 0x3B, 0xD1, 0x7B, 0x2B, 0x41, 0x37, 0x6E, + 0x34, 0x9B, 0xA8, 0x12, 0xBB, 0x8C, 0xF4, 0xD6, 0x2D, 0x47, 0x7F, 0x98, 0x46, 0x28, 0x55, 0xCA, + 0x7D, 0x1B, 0x64, 0x7B, 0x21, 0x5A, 0xC1, 0xEF, 0xBE, 0xB0, 0x7F, 0x6F, 0x84, 0x1B, 0x72, 0x99, + 0x4D, 0x2E, 0x31, 0xDA, 0xA8, 0xD3, 0x4A, 0xD4, 0x64, 0x3D, 0x09, 0xE5, 0xD6, 0x71, 0x82, 0x73, + 0x6E, 0xCD, 0xD4, 0x1C, 0xE1, 0x7B, 0x8C, 0x5E, 0x5C, 0x09, 0x4A, 0x09, 0x1C, 0xF2, 0x40, 0xC2, + 0x92, 0xE0, 0xD5, 0xC0, 0x33, 0x5D, 0x2C, 0x26, 0xA2, 0xBD, 0x44, 0xCE, 0x05, 0x5E, 0xEC, 0xC8, + 0x4C, 0x94, 0x83, 0x79, 0xFA, 0x43, 0x3F, 0x61, 0xB9, 0xAA, 0x6F, 0x28, 0x61, 0x16, 0x25, 0x0C, + 0xF1, 0x42, 0x99, 0x12, 0xE2, 0x26, 0x6B, 0x4C, 0x09, 0x20, 0xDB, 0x8A, 0xB4, 0x85, 0x4A, 0xE4, + 0x10, 0xBF, 0xBD, 0x52, 0x52, 0x17, 0x47, 0x50, 0x03, 0x0D, 0x58, 0x20, 0x79, 0x3F, 0x72, 0x55, + 0x9A, 0x68, 0xD4, 0xEB, 0x1B, 0xB2, 0x50, 0x23, 0x8B, 0x21, 0x92, 0xE4, 0xA3, 0x8D, 0xB8, 0xDD, + 0x9A, 0x12, 0x48, 0x84, 0x41, 0x57, 0xC6, 0x2C, 0xEA, 0x88, 0x71, 0xED, 0xEA, 0xFC, 0x95, 0x48, + 0x43, 0xC7, 0x24, 0x38, 0xE4, 0xA9, 0x6A, 0x76, 0x4D, 0x49, 0x20, 0x19, 0x12, 0x48, 0x20, 0xFF, + 0xD7, 0x76, 0x67, 0x18, 0x00, 0x8E, 0xD9, 0xF6, 0xFB, 0x9A, 0xA7, 0xE9, 0x70, 0xE3, 0x78, 0xE7, + 0x32, 0xD3, 0x0C, 0x1D, 0x6A, 0x06, 0x29, 0xD4, 0xA9, 0x61, 0xD8, 0x68, 0x5D, 0xB4, 0x46, 0x94, + 0x20, 0xE1, 0x46, 0xB3, 0xE1, 0xCA, 0xEA, 0x95, 0xAD, 0x37, 0x72, 0x6C, 0x3D, 0xCE, 0x47, 0x88, + 0xE3, 0x60, 0x96, 0x79, 0xF4, 0x1F, 0x12, 0xBE, 0x28, 0x16, 0x97, 0xC3, 0x56, 0x8A, 0xA5, 0x7D, + 0x9E, 0xA6, 0x3A, 0xCA, 0xAA, 0x99, 0x26, 0x68, 0x94, 0x2E, 0x93, 0x93, 0x18, 0xAB, 0x53, 0x1A, + 0x3F, 0xC8, 0x04, 0x45, 0x53, 0xAA, 0xBB, 0x1C, 0x5A, 0xA5, 0xD4, 0x1E, 0x48, 0x85, 0x52, 0x02, + 0x3E, 0xAB, 0xA6, 0x58, 0x4A, 0x2E, 0xB3, 0x4C, 0xD5, 0x92, 0x72, 0xF2, 0xC3, 0xCE, 0x39, 0xEB, + 0x98, 0x7F, 0xF0, 0xB8, 0xD0, 0xAC, 0x6F, 0xE0, 0x9F, 0x93, 0x73, 0x02, 0xD4, 0xD9, 0xCD, 0x29, + 0x12, 0x1D, 0xDB, 0x65, 0x97, 0x1E, 0x4F, 0xB6, 0xC3, 0x3F, 0x3B, 0x2E, 0x30, 0xE4, 0x19, 0x5C, + 0x78, 0x56, 0xCF, 0x85, 0x4C, 0x19, 0x94, 0xAC, 0x35, 0xBB, 0xD9, 0x77, 0xF8, 0x70, 0xEA, 0xE1, + 0x15, 0x78, 0x12, 0x52, 0x5B, 0x16, 0xEF, 0x06, 0x33, 0x4B, 0xA7, 0x04, 0xFD, 0x63, 0xCC, 0x98, + 0xF0, 0x79, 0x17, 0x3E, 0xCC, 0x7E, 0x15, 0x01, 0xA9, 0xF4, 0xAA, 0x71, 0x9C, 0x62, 0xA8, 0x43, + 0x6F, 0xC3, 0x68, 0x3D, 0x1D, 0x0A, 0x78, 0x3A, 0xB1, 0xAC, 0xCA, 0x44, 0x4F, 0xC5, 0xBC, 0x75, + 0xF8, 0x12, 0x50, 0x22, 0x02, 0xC7, 0x94, 0x01, 0x30, 0xD9, 0xA9, 0x8E, 0x88, 0xBB, 0x81, 0x57, + 0x26, 0x30, 0x0D, 0x4A, 0x30, 0x71, 0xF1, 0x4C, 0x51, 0x1E, 0x7F, 0x8B, 0x3C, 0xE9, 0xFE, 0x56, + 0xAF, 0x05, 0xCF, 0xC1, 0x8C, 0xA9, 0x44, 0x1D, 0xEC, 0x13, 0xCE, 0x28, 0xBD, 0x3A, 0x01, 0xC4, + 0x22, 0x4A, 0x0F, 0xC1, 0x71, 0x75, 0x2E, 0x00, 0x3E, 0x79, 0x52, 0x8A, 0x40, 0x9E, 0xB0, 0x45, + 0x2C, 0xC9, 0x86, 0x94, 0xAA, 0x00, 0xBE, 0xE6, 0x76, 0x34, 0x9B, 0x8D, 0x7A, 0xAB, 0xF1, 0xB7, + 0x7A, 0xB3, 0xDE, 0xA8, 0x1F, 0x88, 0x0C, 0x20, 0x4A, 0x60, 0x86, 0x76, 0xEC, 0x2F, 0x0B, 0xDD, + 0x93, 0x91, 0x99, 0xBD, 0xCF, 0x6D, 0x69, 0xD6, 0x3F, 0xE5, 0xD8, 0x96, 0xBD, 0xFA, 0xE1, 0xD2, + 0xB6, 0x45, 0xCE, 0x6C, 0x6D, 0xB6, 0x05, 0xBE, 0xC2, 0x83, 0xE2, 0x78, 0xDA, 0xD1, 0xA2, 0xB6, + 0xA3, 0xE2, 0xB8, 0x55, 0xD9, 0xD3, 0xE9, 0xE6, 0xC0, 0xCA, 0x50, 0xDC, 0x4B, 0x80, 0xE1, 0x1C, + 0x6B, 0xE1, 0x12, 0xA3, 0x16, 0x9F, 0x14, 0x93, 0xBA, 0xA8, 0x6E, 0x7A, 0xB9, 0xAF, 0x15, 0x59, + 0x1F, 0x08, 0x5D, 0x98, 0x42, 0x97, 0x56, 0x28, 0x3F, 0x97, 0xB3, 0x46, 0xA5, 0xCD, 0x9F, 0xE6, + 0x24, 0x31, 0xE5, 0xE6, 0x9B, 0x3F, 0x6D, 0xF4, 0xC4, 0x94, 0xD1, 0xF8, 0xB9, 0x31, 0x3C, 0xF5, + 0x1B, 0xC9, 0x1C, 0xD1, 0x22, 0x75, 0x32, 0x8A, 0x8B, 0xB3, 0x72, 0x43, 0x8B, 0x3C, 0xC4, 0x93, + 0x56, 0x3B, 0x35, 0x16, 0x6E, 0x6C, 0x76, 0x72, 0x77, 0x4C, 0x3E, 0xF2, 0x7A, 0x22, 0x1D, 0xF9, + 0xCC, 0x4C, 0xE3, 0x33, 0x52, 0x7D, 0x4B, 0x01, 0x52, 0x2C, 0x10, 0xD3, 0x03, 0x87, 0xFE, 0xE4, + 0xF2, 0x09, 0xC5, 0x43, 0xA1, 0x6C, 0x23, 0x7B, 0x25, 0xCB, 0xBC, 0xDF, 0xF7, 0xA6, 0x48, 0xEF, + 0x13, 0xB4, 0x20, 0xE3, 0xD2, 0xDE, 0x67, 0xEE, 0xD2, 0x18, 0xD0, 0xED, 0xC3, 0x95, 0x02, 0x3E, + 0x37, 0x48, 0x09, 0xD2, 0x68, 0x46, 0x8F, 0xEA, 0x53, 0x93, 0x9F, 0x4C, 0xC9, 0x26, 0xA5, 0x3D, + 0xF2, 0xD3, 0x60, 0xB4, 0x94, 0x93, 0xC8, 0xAF, 0x91, 0xA6, 0x2F, 0x7C, 0x57, 0x98, 0xAE, 0x29, + 0x29, 0x14, 0xFC, 0x35, 0xAD, 0xD8, 0x5D, 0xCA, 0x1A, 0x3F, 0xA2, 0xB1, 0xC0, 0xBE, 0x50, 0x3B, + 0xD1, 0x88, 0xB5, 0x13, 0xB3, 0x0A, 0x26, 0xB9, 0xC9, 0xF9, 0x16, 0xAB, 0xEA, 0x97, 0xEA, 0x22, + 0x8A, 0x1D, 0xCD, 0x15, 0x51, 0x3A, 0x31, 0xAC, 0x4E, 0x61, 0xF3, 0xC4, 0x86, 0xE5, 0xDF, 0x22, + 0xFE, 0x6C, 0x06, 0xE3, 0xB6, 0xC8, 0x09, 0x03, 0x9C, 0xF1, 0xD8, 0xAD, 0xC2, 0x36, 0xC3, 0xAD, + 0xBA, 0x80, 0xBF, 0x30, 0xB0, 0x66, 0xF2, 0x76, 0x51, 0x0C, 0xE7, 0xE8, 0x2E, 0x79, 0x7C, 0xE0, + 0x3C, 0x4A, 0x95, 0x52, 0x3C, 0x4C, 0x91, 0x6D, 0x93, 0x6B, 0x18, 0xB7, 0x6D, 0x2A, 0x31, 0xBC, + 0xEE, 0xF1, 0x3F, 0xD9, 0xF7, 0xBE, 0xFB, 0x67, 0xF5, 0x4D, 0xC9, 0x3E, 0x1B, 0xF9, 0xDB, 0xD7, + 0x3D, 0xD3, 0x0D, 0x98, 0xEF, 0xE9, 0x80, 0x11, 0x9E, 0xBE, 0x8B, 0xF1, 0xE7, 0xB5, 0xBF, 0xD3, + 0x34, 0xC4, 0x57, 0xF2, 0xE5, 0x64, 0xC3, 0xCF, 0xA9, 0x6F, 0x48, 0xE2, 0x70, 0x6C, 0xAA, 0x72, + 0xE8, 0x60, 0x12, 0x48, 0x9F, 0x7D, 0x61, 0x86, 0xA3, 0x87, 0xA8, 0x45, 0xAC, 0xFD, 0x1E, 0x72, + 0xEF, 0x45, 0x5C, 0xB6, 0x1C, 0x0F, 0xAE, 0x5B, 0xDB, 0x5B, 0xB5, 0x20, 0xD8, 0xFA, 0x30, 0x6C, + 0x1A, 0x35, 0xAA, 0x81, 0xB8, 0x72, 0xA1, 0xE9, 0xFD, 0xED, 0x80, 0x7D, 0x39, 0x66, 0xFF, 0x9A, + 0x5E, 0x06, 0xA6, 0x2F, 0xBB, 0x77, 0x9C, 0xC0, 0x0F, 0x3C, 0xCD, 0xAD, 0xDD, 0x89, 0x26, 0xDB, + 0x41, 0xA2, 0x9B, 0x7F, 0xFB, 0x10, 0xCD, 0x33, 0x9E, 0x1C, 0x6C, 0x09, 0xDC, 0xEA, 0x89, 0x2B, + 0x7D, 0xDE, 0xED, 0x07, 0x03, 0xEB, 0xF8, 0xFF, 0x03, 0x3D, 0xB9, 0x4C, 0x96, 0x59, 0xFF, 0x00 }; ///index_html //Content of bootstrap.bundle.min.jss with gzip compression From 91ca899c7e60617ddd52915f2f0a18ec5e3abfac Mon Sep 17 00:00:00 2001 From: PaulZC Date: Thu, 16 May 2024 12:10:30 +0100 Subject: [PATCH 016/358] Fix for #287 --- Firmware/RTK_Everywhere/Bluetooth.ino | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/Bluetooth.ino b/Firmware/RTK_Everywhere/Bluetooth.ino index 63e359ad1..29972e8c4 100644 --- a/Firmware/RTK_Everywhere/Bluetooth.ino +++ b/Firmware/RTK_Everywhere/Bluetooth.ino @@ -355,8 +355,11 @@ void bluetoothStart() systemPrintln(deviceName); - bluetoothLedTask.detach(); // Reset BT LED blinker task rate to 2Hz - bluetoothLedTask.attach(bluetoothLedTaskPace2Hz, tickerBluetoothLedUpdate); // Rate in seconds, callback + if (pin_bluetoothStatusLED != PIN_UNDEFINED) + { + bluetoothLedTask.detach(); // Reset BT LED blinker task rate to 2Hz + bluetoothLedTask.attach(bluetoothLedTaskPace2Hz, tickerBluetoothLedUpdate); // Rate in seconds, callback + } bluetoothState = BT_NOTCONNECTED; reportHeapNow(false); From 20a22971150d5a3a7482247f9ce8c5defb87e5dd Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 16 May 2024 08:19:05 -0600 Subject: [PATCH 017/358] Update prints --- Firmware/RTK_Everywhere/menuPP.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuPP.ino b/Firmware/RTK_Everywhere/menuPP.ino index eac8d6ea8..a91481659 100644 --- a/Firmware/RTK_Everywhere/menuPP.ino +++ b/Firmware/RTK_Everywhere/menuPP.ino @@ -1617,7 +1617,7 @@ void updateLBand() lbandLastReport = millis(); if (settings.debugCorrections == true) - systemPrintf("ZED restarts: %d Time remaining before L-Band forced restart: %ds\r\n", floatLockRestarts, + systemPrintf("ZED restarts: %d Time remaining before Float lock forced restart: %ds\r\n", floatLockRestarts, settings.lbandFixTimeout_seconds - ((millis() - lbandTimeFloatStarted) / 1000)); } @@ -1634,7 +1634,7 @@ void updateLBand() theGNSS->softwareResetGNSSOnly(); if (settings.debugCorrections == true) - systemPrintf("Restarting ZED. Number of L-Band restarts: %d\r\n", floatLockRestarts); + systemPrintf("Restarting ZED. Number of Float lock restarts: %d\r\n", floatLockRestarts); } } } From 8ca5b74b18087722af2522f2264aa0a6b5a3eba7 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 16 May 2024 08:36:40 -0600 Subject: [PATCH 018/358] Move variable to local static --- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 1 - Firmware/RTK_Everywhere/menuPP.ino | 9 ++++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index c7eb6a77a..def70b1f6 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -760,7 +760,6 @@ bool configureViaEthernet; unsigned long lbandTimeFloatStarted; // Monitors the ZED during L-Band reception if a fix takes too long int floatLockRestarts; unsigned long rtkTimeToFixMs; -unsigned long lbandLastReport; volatile PeriodicDisplay_t periodicDisplay; diff --git a/Firmware/RTK_Everywhere/menuPP.ino b/Firmware/RTK_Everywhere/menuPP.ino index a91481659..17473f8a3 100644 --- a/Firmware/RTK_Everywhere/menuPP.ino +++ b/Firmware/RTK_Everywhere/menuPP.ino @@ -1591,11 +1591,13 @@ bool pointPerfectIsEnabled() // Process any new L-Band from I2C void updateLBand() { + static unsigned long lbandLastReport; + // Skip if in configure-via-ethernet mode if (configureViaEthernet) { - //if (settings.debugCorrections == true) - // systemPrintln("configureViaEthernet: skipping updateLBand"); + // if (settings.debugCorrections == true) + // systemPrintln("configureViaEthernet: skipping updateLBand"); return; } @@ -1617,7 +1619,8 @@ void updateLBand() lbandLastReport = millis(); if (settings.debugCorrections == true) - systemPrintf("ZED restarts: %d Time remaining before Float lock forced restart: %ds\r\n", floatLockRestarts, + systemPrintf("ZED restarts: %d Time remaining before Float lock forced restart: %ds\r\n", + floatLockRestarts, settings.lbandFixTimeout_seconds - ((millis() - lbandTimeFloatStarted) / 1000)); } From 3c6f20f2fceaf6fce60d32aa8394f572eb07577d Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 16 May 2024 08:42:43 -0600 Subject: [PATCH 019/358] Add pplFixTimeoutS setting --- Firmware/RTK_Everywhere/menuSystem.ino | 12 ++++++++++++ Firmware/RTK_Everywhere/settings.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/Firmware/RTK_Everywhere/menuSystem.ino b/Firmware/RTK_Everywhere/menuSystem.ino index cbdbb4662..bb7d65cd6 100644 --- a/Firmware/RTK_Everywhere/menuSystem.ino +++ b/Firmware/RTK_Everywhere/menuSystem.ino @@ -946,6 +946,13 @@ void menuOperation() if(present.gnss_zedf9p) systemPrintln("10) Mirror ZED-F9x's UART1 settings to USB"); + // PPL Float Lock timeout + systemPrint("11) Set PPL RTK Fix Timeout (seconds): "); + if (settings.pplFixTimeoutS > 0) + systemPrintln(settings.pplFixTimeoutS); + else + systemPrintln("Disabled - no resets"); + systemPrintln("---- Interrupts ----"); systemPrint("30) Bluetooth Interrupts Core: "); systemPrintln(settings.bluetoothInterruptsCore); @@ -1046,6 +1053,11 @@ void menuOperation() else systemPrintln(F("USB messages successfully enabled")); } + else if (incoming == 11) + { + getNewSetting("Enter number of seconds in RTK float using PPL, before reset", 0, 3600, + &settings.pplFixTimeoutS); // Arbitrary 60 minute limit + } else if (incoming == 30) { diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 6b154ede3..00c690337 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1318,6 +1318,7 @@ struct Settings bool enableGalileoHas = true; // Allow E6 corrections if possible bool enableGnssToUsbSerial = false; + uint16_t pplFixTimeoutS = 180; // Number of seconds of no RTK fix when using PPL before resetting GNSS // Add new settings above <------------------------------------------------------------> // Then also add to rtkSettingsEntries below @@ -1620,6 +1621,7 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { { & settings.enableGalileoHas, "enableGalileoHas", _bool, 0, false, true, true }, { & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", _bool, 0, false, true, true }, + { & settings.pplFixTimeoutS, "pplFixTimeoutS", _uint16_t, 0, false, true, true }, // Add new settings above <------------------------------------------------------------> /* From 29866d228aa7d62a5354a745ca0d380f4e37a01f Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 16 May 2024 08:44:14 -0600 Subject: [PATCH 020/358] Move variable to local static --- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 1 - Firmware/RTK_Everywhere/menuPP.ino | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index def70b1f6..d48d0c517 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -757,7 +757,6 @@ correctionsSource pplCorrectionsSource = CORR_NUM; // Record which source is fee // This is to allow SparkFun_WebServer_ESP32_W5500 to have _exclusive_ access to WiFi, SPI and Interrupts. bool configureViaEthernet; -unsigned long lbandTimeFloatStarted; // Monitors the ZED during L-Band reception if a fix takes too long int floatLockRestarts; unsigned long rtkTimeToFixMs; diff --git a/Firmware/RTK_Everywhere/menuPP.ino b/Firmware/RTK_Everywhere/menuPP.ino index 17473f8a3..7007d0f81 100644 --- a/Firmware/RTK_Everywhere/menuPP.ino +++ b/Firmware/RTK_Everywhere/menuPP.ino @@ -1592,6 +1592,7 @@ bool pointPerfectIsEnabled() void updateLBand() { static unsigned long lbandLastReport; + static unsigned long lbandTimeFloatStarted; // Monitors the ZED during L-Band reception if a fix takes too long // Skip if in configure-via-ethernet mode if (configureViaEthernet) From 344b203c0ca9df24aba3955d7fe8199197af11a9 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 16 May 2024 09:43:35 -0600 Subject: [PATCH 021/358] Add method to gracefully stop tasks --- Firmware/RTK_Everywhere/Begin.ino | 18 +++--- .../RTK_Everywhere/PointPerfectLibrary.ino | 13 ++-- Firmware/RTK_Everywhere/Tasks.ino | 63 ++++++++++--------- Firmware/RTK_Everywhere/settings.h | 23 +++++-- 4 files changed, 70 insertions(+), 47 deletions(-) diff --git a/Firmware/RTK_Everywhere/Begin.ino b/Firmware/RTK_Everywhere/Begin.ino index 3adb9cffc..2e469b1d3 100644 --- a/Firmware/RTK_Everywhere/Begin.ino +++ b/Firmware/RTK_Everywhere/Begin.ino @@ -755,7 +755,7 @@ void beginGnssUart() { ringBuffer = (uint8_t *)&rbOffsetArray[rbOffsetEntries]; rbOffsetArray[0] = 0; - if (!online.gnssUartPinned) + if (task.gnssUartPinnedTaskRunning == false) xTaskCreatePinnedToCore( pinGnssUartTask, "GnssUartStart", // Just for humans @@ -765,7 +765,7 @@ void beginGnssUart() &taskHandle, // Task handle settings.gnssUartInterruptsCore); // Core where task should run, 0=core, 1=Arduino - while (!online.gnssUartPinned) // Wait for task to run once + while (task.gnssUartPinnedTaskRunning == true) // Wait for task to run once delay(1); } } @@ -774,6 +774,8 @@ void beginGnssUart() // https://github.com/espressif/arduino-esp32/issues/3386 void pinGnssUartTask(void *pvParameters) { + task.gnssUartPinnedTaskRunning = true; + // Start notification if (settings.printTaskStartStop) systemPrintln("Task pinGnssUartTask started"); @@ -806,7 +808,7 @@ void pinGnssUartTask(void *pvParameters) // Stop notification if (settings.printTaskStartStop) systemPrintln("Task pinGnssUartTask stopped"); - online.gnssUartPinned = true; + task.gnssUartPinnedTaskRunning = false; vTaskDelete(nullptr); // Delete task once it has run once } @@ -1100,7 +1102,7 @@ void beginButtons() userBtn->begin(); // Starts task for monitoring button presses - if (!online.buttonCheckTaskRunning) + if (!task.buttonCheckTaskRunning) xTaskCreate(buttonCheckTask, "BtnCheck", // Just for humans buttonTaskStackSize, // Stack Size @@ -1236,7 +1238,7 @@ void beginI2C() while (millis() < i2cPowerUpDelay) ; - if (!online.i2cPinned) + if (task.i2cPinnedTaskRunning == false) xTaskCreatePinnedToCore( pinI2CTask, "I2CStart", // Just for humans @@ -1247,13 +1249,15 @@ void beginI2C() settings.i2cInterruptsCore); // Core where task should run, 0=core, 1=Arduino // Wait for task to run once - while (!online.i2cPinned) + while (task.i2cPinnedTaskRunning == true) delay(1); } // Assign I2C interrupts to the core that started the task. See: https://github.com/espressif/arduino-esp32/issues/3386 void pinI2CTask(void *pvParameters) { + task.i2cPinnedTaskRunning = true; + // Start notification if (settings.printTaskStartStop) systemPrintln("Task pinI2CTask started"); @@ -1285,7 +1289,7 @@ void pinI2CTask(void *pvParameters) // Stop notification if (settings.printTaskStartStop) systemPrintln("Task pinI2CTask stopped"); - online.i2cPinned = true; + task.i2cPinnedTaskRunning = false; vTaskDelete(nullptr); // Delete task once it has run once } diff --git a/Firmware/RTK_Everywhere/PointPerfectLibrary.ino b/Firmware/RTK_Everywhere/PointPerfectLibrary.ino index 9e0853734..0af17b456 100644 --- a/Firmware/RTK_Everywhere/PointPerfectLibrary.ino +++ b/Firmware/RTK_Everywhere/PointPerfectLibrary.ino @@ -4,12 +4,13 @@ void updatePplTask(void *e) { // Start notification - online.updatePplTaskRunning = true; + task.updatePplTaskRunning = true; if (settings.printTaskStartStop) systemPrintln("updatePplTask started"); - // Verify that the task is still running - while (online.updatePplTaskRunning) + // Run task until a request is raised + task.updatePplTaskStopRequest = false; + while (task.updatePplTaskStopRequest == false) { // Display an alive message if (PERIODIC_DISPLAY(PD_TASK_UPDATE_PPL)) @@ -93,7 +94,7 @@ void updatePplTask(void *e) } } - online.updatePplTaskRunning = false; // Stop task either because new key failed or we need to apply new key + break; // Stop task either because new key failed or we need to apply new key } feedWdt(); @@ -103,7 +104,7 @@ void updatePplTask(void *e) // Stop notification if (settings.printTaskStartStop) systemPrintln("Task updatePplTask stopped"); - online.updatePplTaskRunning = false; + task.updatePplTaskRunning = false; vTaskDelete(NULL); } @@ -174,7 +175,7 @@ void beginPPL() TaskHandle_t taskHandle; // Starts task for feeding NMEA+RTCM to PPL - if (online.updatePplTaskRunning == false) + if (task.updatePplTaskRunning == false) xTaskCreate(updatePplTask, "UpdatePpl", // Just for humans updatePplTaskStackSize, // Stack Size diff --git a/Firmware/RTK_Everywhere/Tasks.ino b/Firmware/RTK_Everywhere/Tasks.ino index 6c83b640d..6546690f0 100644 --- a/Firmware/RTK_Everywhere/Tasks.ino +++ b/Firmware/RTK_Everywhere/Tasks.ino @@ -125,12 +125,13 @@ void btReadTask(void *e) uint8_t btAppCommandCharsReceived = 0; // Used to enter app command mode // Start notification - online.btReadTaskRunning = true; + task.btReadTaskRunning = true; if (settings.printTaskStartStop) systemPrintln("Task btReadTask started"); - // Verify that the task is still running - while (online.btReadTaskRunning) + // Run task until a request is raised + task.btReadTaskStopRequest = false; + while (task.btReadTaskStopRequest == false) { // Display an alive message if (PERIODIC_DISPLAY(PD_TASK_BLUETOOTH_READ)) @@ -244,7 +245,7 @@ void btReadTask(void *e) // Stop notification if (settings.printTaskStartStop) systemPrintln("Task btReadTask stopped"); - online.btReadTaskRunning = false; + task.btReadTaskRunning = false; vTaskDelete(NULL); } @@ -345,7 +346,7 @@ void gnssReadTask(void *e) static SEMP_PARSE_STATE *parse; // Start notification - online.gnssReadTaskRunning = true; + task.gnssReadTaskRunning = true; if (settings.printTaskStartStop) systemPrintln("Task gnssReadTask started"); @@ -361,8 +362,9 @@ void gnssReadTask(void *e) if (settings.debugGnss) sempEnableDebugOutput(parse); - // Verify that the task is still running - while (online.gnssReadTaskRunning) + // Run task until a request is raised + task.gnssReadTaskStopRequest = false; + while (task.gnssReadTaskStopRequest == false) { // Display an alive message if (PERIODIC_DISPLAY(PD_TASK_GNSS_READ)) @@ -405,7 +407,7 @@ void gnssReadTask(void *e) // Stop notification if (settings.printTaskStartStop) systemPrintln("Task gnssReadTask stopped"); - online.gnssReadTaskRunning = false; + task.gnssReadTaskRunning = false; vTaskDelete(NULL); } @@ -808,7 +810,7 @@ void handleGnssDataTask(void *e) int32_t usedSpace; // Start notification - online.handleGnssDataTaskRunning = true; + task.handleGnssDataTaskRunning = true; if (settings.printTaskStartStop) systemPrintln("Task handleGnssDataTask started"); @@ -819,8 +821,9 @@ void handleGnssDataTask(void *e) udpServerZeroTail(); sdRingBufferTail = 0; - // Verify that the task is still running - while (online.handleGnssDataTaskRunning) + // Run task until a request is raised + task.handleGnssDataTaskStopRequest = false; + while (task.handleGnssDataTaskStopRequest == false) { // Display an alive message if (PERIODIC_DISPLAY(PD_TASK_HANDLE_GNSS_DATA)) @@ -1161,7 +1164,7 @@ void handleGnssDataTask(void *e) // Stop notification if (settings.printTaskStartStop) systemPrintln("Task handleGnssDataTask stopped"); - online.handleGnssDataTaskRunning = false; + task.handleGnssDataTaskRunning = false; vTaskDelete(NULL); } @@ -1338,12 +1341,13 @@ void buttonCheckTask(void *e) bool doubleTap = false; // Start notification - online.buttonCheckTaskRunning = true; + task.buttonCheckTaskRunning = true; if (settings.printTaskStartStop) systemPrintln("Task buttonCheckTask started"); - // Verify that the task is still running - while (online.buttonCheckTaskRunning) + // Run task until a request is raised + task.buttonCheckTaskStopRequest = false; + while (task.buttonCheckTaskStopRequest == false) { // Display an alive message if (PERIODIC_DISPLAY(PD_TASK_BUTTON_CHECK)) @@ -1601,12 +1605,12 @@ void buttonCheckTask(void *e) feedWdt(); taskYIELD(); - } // End while (online.buttonCheckTaskRunning) + } // End while (task.buttonCheckTaskStopRequest == false) // Stop notification if (settings.printTaskStartStop) systemPrintln("Task buttonCheckTask stopped"); - online.buttonCheckTaskRunning = false; + task.buttonCheckTaskRunning = false; vTaskDelete(NULL); } @@ -1619,7 +1623,7 @@ void idleTask(void *e) uint32_t lastStackPrintTime = 0; // Start notification - idleTaskRunning = cpu ? &online.idleTask1Running : &online.idleTask0Running; + idleTaskRunning = cpu ? &task.idleTask1Running : &task.idleTask0Running; *idleTaskRunning = true; if (settings.printTaskStartStop) systemPrintf("Task idleTask%d started\r\n", cpu); @@ -1693,7 +1697,7 @@ bool tasksStartGnssUart() availableHandlerSpace = settings.gnssHandlerBufferSize; // Reads data from ZED and stores data into circular buffer - if (!online.gnssReadTaskRunning) + if (!task.gnssReadTaskRunning) xTaskCreatePinnedToCore(gnssReadTask, // Function to call "gnssRead", // Just for humans gnssReadTaskStackSize, // Stack Size @@ -1703,7 +1707,7 @@ bool tasksStartGnssUart() settings.gnssReadTaskCore); // Core where task should run, 0=core, 1=Arduino // Reads data from circular buffer and sends data to SD, SPP, or network clients - if (!online.handleGnssDataTaskRunning) + if (!task.handleGnssDataTaskRunning) xTaskCreatePinnedToCore(handleGnssDataTask, // Function to call "handleGNSSData", // Just for humans handleGnssDataTaskStackSize, // Stack Size @@ -1713,7 +1717,7 @@ bool tasksStartGnssUart() settings.handleGnssDataTaskCore); // Core where task should run, 0=core, 1=Arduino // Reads data from BT and sends to GNSS - if (!online.btReadTaskRunning) + if (!task.btReadTaskRunning) xTaskCreatePinnedToCore(btReadTask, // Function to call "btRead", // Just for humans btReadTaskStackSize, // Stack Size @@ -1728,15 +1732,15 @@ bool tasksStartGnssUart() void tasksStopGnssUart() { // Stop tasks if running - online.gnssReadTaskRunning = false; - online.handleGnssDataTaskRunning = false; - online.btReadTaskRunning = false; + task.gnssReadTaskStopRequest = true; + task.handleGnssDataTaskStopRequest = true; + task.btReadTaskStopRequest = true; // Give the other CPU time to finish // Eliminates CPU bus hang condition do delay(10); - while (online.gnssReadTaskRunning || online.handleGnssDataTaskRunning || online.btReadTaskRunning); + while (task.gnssReadTaskRunning || task.handleGnssDataTaskRunning || task.btReadTaskRunning); } // Checking the number of available clusters on the SD card can take multiple seconds @@ -1745,12 +1749,13 @@ void tasksStopGnssUart() void sdSizeCheckTask(void *e) { // Start notification - online.sdSizeCheckTaskRunning = true; + task.sdSizeCheckTaskRunning = true; if (settings.printTaskStartStop) systemPrintln("Task sdSizeCheckTask started"); - // Verify that the task is still running - while (online.sdSizeCheckTaskRunning) + // Run task until a request is raised + task.sdSizeCheckTaskStopRequest = false; + while (task.sdSizeCheckTaskStopRequest == false) { // Display an alive message if (PERIODIC_DISPLAY(PD_TASK_SD_SIZE_CHECK)) @@ -1806,7 +1811,7 @@ void sdSizeCheckTask(void *e) // Stop notification if (settings.printTaskStartStop) systemPrintln("Task sdSizeCheckTask stopped"); - online.sdSizeCheckTaskRunning = false; + task.sdSizeCheckTaskRunning = false; vTaskDelete(NULL); } diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 00c690337..f8ec15c87 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1713,8 +1713,15 @@ struct struct_online bool bluetooth = false; bool mqttClient = false; bool psram = false; - volatile bool gnssUartPinned = false; - volatile bool i2cPinned = false; + bool ppl = false; + bool batteryCharger = false; +} online; + +// Monitor which tasks are running. +struct struct_tasks +{ + volatile bool gnssUartPinnedTaskRunning = false; + volatile bool i2cPinnedTaskRunning = false; volatile bool btReadTaskRunning = false; volatile bool buttonCheckTaskRunning = false; volatile bool gnssReadTaskRunning = false; @@ -1723,9 +1730,15 @@ struct struct_online volatile bool idleTask1Running = false; volatile bool sdSizeCheckTaskRunning = false; volatile bool updatePplTaskRunning = false; - bool ppl = false; - bool batteryCharger = false; -} online; + + bool i2cPinnedTaskStopRequest = false; + bool btReadTaskStopRequest = false; + bool buttonCheckTaskStopRequest = false; + bool gnssReadTaskStopRequest = false; + bool handleGnssDataTaskStopRequest = false; + bool sdSizeCheckTaskStopRequest = false; + bool updatePplTaskStopRequest = false; +} task; #ifdef COMPILE_WIFI // AWS certificate for PointPerfect API From f9199cbfd9f0e7d3e6c2aaa64e410ff6e8856c92 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 16 May 2024 10:03:31 -0600 Subject: [PATCH 022/358] Remove lbandTimeFloatStarted from States --- Firmware/RTK_Everywhere/States.ino | 8 -------- Firmware/RTK_Everywhere/menuPP.ino | 12 +++++++++++- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Firmware/RTK_Everywhere/States.ino b/Firmware/RTK_Everywhere/States.ino index 5ac70b873..5ff04297c 100644 --- a/Firmware/RTK_Everywhere/States.ino +++ b/Firmware/RTK_Everywhere/States.ino @@ -138,11 +138,7 @@ void stateUpdate() case (STATE_ROVER_FIX): { if (gnssIsRTKFloat()) - { - // Restart timer for L-Band. Don't immediately reset ZED to achieve fix. - lbandTimeFloatStarted = millis(); changeState(STATE_ROVER_RTK_FLOAT); - } else if (gnssIsRTKFix()) changeState(STATE_ROVER_RTK_FIX); } @@ -160,11 +156,7 @@ void stateUpdate() if (gnssIsRTKFix() == false && gnssIsRTKFloat() == false) // No RTK changeState(STATE_ROVER_FIX); if (gnssIsRTKFloat()) - { - // Restart timer for L-Band. Don't immediately reset ZED to achieve fix. - lbandTimeFloatStarted = millis(); changeState(STATE_ROVER_RTK_FLOAT); - } } break; diff --git a/Firmware/RTK_Everywhere/menuPP.ino b/Firmware/RTK_Everywhere/menuPP.ino index 7007d0f81..f2066f283 100644 --- a/Firmware/RTK_Everywhere/menuPP.ino +++ b/Firmware/RTK_Everywhere/menuPP.ino @@ -1613,8 +1613,11 @@ void updateLBand() lbandCorrectionsReceived = false; // If we don't get an L-Band fix within Timeout, hot-start ZED-F9x - if (systemState == STATE_ROVER_RTK_FLOAT) + if (gnssIsRTKFloat()) { + if (lbandTimeFloatStarted == 0) + lbandTimeFloatStarted = millis(); + if (millis() - lbandLastReport > 1000) { lbandLastReport = millis(); @@ -1644,10 +1647,17 @@ void updateLBand() } else if (gnssIsRTKFix() && rtkTimeToFixMs == 0) { + lbandTimeFloatStarted = 0; //Restart timer in case we drop from RTK Fix + rtkTimeToFixMs = millis(); if (settings.debugCorrections == true) systemPrintf("Time to first RTK Fix: %ds\r\n", rtkTimeToFixMs / 1000); } + else + { + // We are not in float or fix, so restart timer + lbandTimeFloatStarted = 0; + } } #endif // COMPILE_L_BAND From b5cb6477284f79f4f48749b918cf8f09e5be1e00 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 16 May 2024 10:04:15 -0600 Subject: [PATCH 023/358] Stop/start PPL if float lock is detected --- .../RTK_Everywhere/PointPerfectLibrary.ino | 87 +++++++++++++++++-- 1 file changed, 81 insertions(+), 6 deletions(-) diff --git a/Firmware/RTK_Everywhere/PointPerfectLibrary.ino b/Firmware/RTK_Everywhere/PointPerfectLibrary.ino index 0af17b456..3a8eb41ff 100644 --- a/Firmware/RTK_Everywhere/PointPerfectLibrary.ino +++ b/Firmware/RTK_Everywhere/PointPerfectLibrary.ino @@ -132,10 +132,13 @@ void beginPPL() reportHeapNow(false); // PPL_MAX_RTCM_BUFFER is 3345 bytes so we create it on the heap - if (online.psram == true) - pplRtcmBuffer = (uint8_t *)ps_malloc(PPL_MAX_RTCM_BUFFER); - else - pplRtcmBuffer = (uint8_t *)malloc(PPL_MAX_RTCM_BUFFER); + if (pplRtcmBuffer == nullptr) + { + if (online.psram == true) + pplRtcmBuffer = (uint8_t *)ps_malloc(PPL_MAX_RTCM_BUFFER); + else + pplRtcmBuffer = (uint8_t *)malloc(PPL_MAX_RTCM_BUFFER); + } if (!pplRtcmBuffer) { @@ -189,11 +192,41 @@ void beginPPL() reportHeapNow(false); } +// Stop PPL task and release resources +void stopPPL() +{ + // Stop task if running + if (task.gnssReadTaskRunning) + task.gnssReadTaskStopRequest = true; + + if (pplRtcmBuffer != nullptr) + { + free(pplRtcmBuffer); + pplRtcmBuffer = nullptr; + } + + // Wait for task to stop running + do + delay(10); + while (task.gnssReadTaskRunning); + + online.ppl = false; +} + // Start the PPL if needed // Because the key for the PPL expires every ~28 days, we use updatePPL to first apply keys, and // restart the PPL when new keys need to be applied void updatePPL() { + static unsigned long pplTimeFloatStarted; // Monitors when the PPL got first RTK Float. + + // During float lock, the PPL has been seen to drop to 3D fix for a few seconds before changing back to + // RTK float. pplTime3dFixStarted is used as a sort of hysteresis detection. + // If (millis() - pplTime3dFixStarted > 5000) then we are truly out of RTK Float and pplTimeFloatStarted should + // be reset. If we are in RTK Float, reset pplTime3dFixStarted to zero. + + static unsigned long pplTime3dFixStarted; + if (online.ppl == false && (settings.enablePointPerfectCorrections)) { // Start PPL only after GNSS is outputting appropriate NMEA+RTCM, we have a key, and the MQTT broker is @@ -211,13 +244,17 @@ void updatePPL() } else if (online.ppl == true) { + if (settings.debugCorrections == true) { static unsigned long pplReport = 0; if (millis() - pplReport > 5000) { pplReport = millis(); - + + systemPrintf("ZED restarts: %d Time remaining before Float lock forced restart: %ds\r\n", + floatLockRestarts, settings.pplFixTimeoutS - ((millis() - pplTimeFloatStarted) / 1000)); + // Report which data source may be fouling the RTCM generation from the PPL if ((millis() - lastMqttToPpl) > 5000) systemPrintln("PPL MQTT Data is stale"); @@ -226,12 +263,50 @@ void updatePPL() } } - if (gnssIsRTKFix() && rtkTimeToFixMs == 0) + if (systemState == STATE_ROVER_RTK_FLOAT) { + if (pplTime3dFixStarted != 0) + pplTime3dFixStarted = 0; // Reset pplTimeFixStarted + + if (settings.pplFixTimeoutS > 0) + { + // If we don't get an RTK fix within Timeout, restart the PPL + if ((millis() - pplTimeFloatStarted) > (settings.pplFixTimeoutS * 1000L)) + { + floatLockRestarts++; + + pplTimeFloatStarted = millis(); // Restart timer for PPL monitoring. + + stopPPL(); //Stop PPL and mark it offline. It will auto-restart at the next update(). + pplAttemptedStart = false; //Reset to allow restart + + if (settings.debugCorrections == true) + systemPrintf("Restarting PPL. Number of Float lock restarts: %d\r\n", floatLockRestarts); + } + } + } + else if (gnssIsRTKFix() && rtkTimeToFixMs == 0) + { + if (pplTime3dFixStarted != 0) + pplTime3dFixStarted = 0; // Reset pplTimeFixStarted + rtkTimeToFixMs = millis(); if (settings.debugCorrections == true) systemPrintf("Time to first PPL RTK Fix: %ds\r\n", rtkTimeToFixMs / 1000); } + else + { + // We are not in RTK Float or RTK Fix + if (pplTime3dFixStarted == 0) + pplTime3dFixStarted = millis(); + + // If (millis() - pplTime3dFixStarted > 5000) then we are truly out of RTK Float and pplTimeFloatStarted + // should be reset. If we are in RTK Float, reset pplTime3dFixStarted to zero. + if (millis() - pplTime3dFixStarted > 5000) + { + pplTimeFloatStarted = 0; + } + } } // The PPL is fed during updatePplTask() From 3a148439ea347771feed1429429c2c1a6beb0ded Mon Sep 17 00:00:00 2001 From: PaulZC Date: Thu, 16 May 2024 17:42:25 +0100 Subject: [PATCH 024/358] Resolve #290 --- Firmware/RTK_Everywhere/NVM.ino | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/Firmware/RTK_Everywhere/NVM.ino b/Firmware/RTK_Everywhere/NVM.ino index 9c424620e..da59bdf4e 100644 --- a/Firmware/RTK_Everywhere/NVM.ino +++ b/Firmware/RTK_Everywhere/NVM.ino @@ -68,10 +68,21 @@ void loadSettings() loadSystemSettingsFromFileSD(settingsFileName); - settings.resetCount = resetCount; + settings.resetCount = resetCount; // resetCount from LFS should override SD - // stateFromLFS should override SD - because SD is not accessible during configure-via-Ethernet - settings.lastState = stateFromLFS; + // SD is not accessible during configure-via-Ethernet + // If stateFromLFS indicates that the firmware is not in configure-via-Ethernet mode + if (!((stateFromLFS >= STATE_CONFIG_VIA_ETH_NOT_STARTED) && (stateFromLFS <= STATE_CONFIG_VIA_ETH_RESTART_BASE))) + { + // and lastState from SD indicates the firmware was previously in configure-via-Ethernet mode + if ((settings.lastState >= STATE_CONFIG_VIA_ETH_NOT_STARTED) && (settings.lastState <= STATE_CONFIG_VIA_ETH_RESTART_BASE)) + { + // then reload the settings from LFS since they will include any changes made during configure-via-Ethernet mode + systemPrintln("Restart after config-via-ethernet. Overwriting SD settings with those from LittleFS"); + loadSystemSettingsFromFileLFS(settingsFileName); + recordSystemSettings(); // Overwrite SD settings with those from LFS + } + } // Change empty profile name to 'Profile1' etc if (strlen(settings.profileName) == 0) From 9dc1e72e791f121be8b66dbac31fd8dd66fc8147 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 16 May 2024 10:49:26 -0600 Subject: [PATCH 025/358] Wait for pinned tasks to start/complete run. --- Firmware/RTK_Everywhere/Begin.ino | 52 +++++++++++++++++++----------- Firmware/RTK_Everywhere/settings.h | 1 - 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/Firmware/RTK_Everywhere/Begin.ino b/Firmware/RTK_Everywhere/Begin.ino index 2e469b1d3..45053e952 100644 --- a/Firmware/RTK_Everywhere/Begin.ino +++ b/Firmware/RTK_Everywhere/Begin.ino @@ -160,7 +160,7 @@ void beginBoard() pin_GNSS_TimePulse = 39; // PPS on UM980 - pin_muxA = 18; //Controls U12 switch between ESP UART1 to UM980 or LoRa + pin_muxA = 18; // Controls U12 switch between ESP UART1 to UM980 or LoRa pin_usbSelect = 21; pin_powerAdapterDetect = 36; // Goes low when USB cable is plugged in @@ -227,7 +227,7 @@ void beginBoard() else if (productVariant == RTK_EVK) { -#ifdef EVKv1point1 +#ifdef EVKv1point1 // Pin defs etc. for EVK v1.1 present.psram_4mb = true; present.gnss_zedf9p = true; @@ -237,9 +237,10 @@ void beginBoard() present.microSd = true; present.microSdCardDetectLow = true; present.button_mode = true; - // Peripheral power controls the OLED, SD, ZED, NEO, USB Hub, LARA - if the SPWR & TPWR jumpers have been changed + // Peripheral power controls the OLED, SD, ZED, NEO, USB Hub, LARA - if the SPWR & TPWR jumpers have been + // changed present.peripheralPowerControl = true; - present.laraPowerControl = true; // Tertiary power controls the LARA + present.laraPowerControl = true; // Tertiary power controls the LARA present.antennaShortOpen = true; present.timePulseInterrupt = true; present.gnss_to_uart = true; @@ -305,9 +306,10 @@ void beginBoard() present.microSd = true; present.microSdCardDetectLow = true; present.button_mode = true; - // Peripheral power controls the OLED, SD, ZED, NEO, USB Hub, LARA - if the SPWR & TPWR jumpers have been changed + // Peripheral power controls the OLED, SD, ZED, NEO, USB Hub, LARA - if the SPWR & TPWR jumpers have been + // changed present.peripheralPowerControl = true; - present.laraPowerControl = true; // Tertiary power controls the LARA + present.laraPowerControl = true; // Tertiary power controls the LARA present.antennaShortOpen = true; present.timePulseInterrupt = true; present.i2c0BusSpeed_400 = true; // Run bus at higher speed @@ -394,7 +396,8 @@ void beginBoard() // Turn on power to the peripherals DMW_if systemPrintf("pin_peripheralPowerControl: %d\r\n", pin_peripheralPowerControl); pinMode(pin_peripheralPowerControl, OUTPUT); - peripheralsOn(); // Turn on power to OLED, SD, ZED, NEO, USB Hub, LARA - if SPWR & TPWR jumpers have been changed + peripheralsOn(); // Turn on power to OLED, SD, ZED, NEO, USB Hub, LARA - if SPWR & TPWR jumpers have been + // changed } else if (productVariant == RTK_FACET_V2) @@ -741,10 +744,13 @@ void beginGnssUart() length = settings.gnssHandlerBufferSize + (rbOffsetEntries * sizeof(RING_BUFFER_OFFSET)); ringBuffer = nullptr; - if (online.psram == true) - rbOffsetArray = (RING_BUFFER_OFFSET *)ps_malloc(length); - else - rbOffsetArray = (RING_BUFFER_OFFSET *)malloc(length); + if (rbOffsetArray == nullptr) + { + if (online.psram == true) + rbOffsetArray = (RING_BUFFER_OFFSET *)ps_malloc(length); + else + rbOffsetArray = (RING_BUFFER_OFFSET *)malloc(length); + } if (!rbOffsetArray) { @@ -755,7 +761,11 @@ void beginGnssUart() { ringBuffer = (uint8_t *)&rbOffsetArray[rbOffsetEntries]; rbOffsetArray[0] = 0; + if (task.gnssUartPinnedTaskRunning == false) + { + task.gnssUartPinnedTaskRunning = true; // The xTaskCreate runs and completes nearly immediately. Mark start here and check for completion. + xTaskCreatePinnedToCore( pinGnssUartTask, "GnssUartStart", // Just for humans @@ -764,8 +774,9 @@ void beginGnssUart() 0, // Priority, with 3 (configMAX_PRIORITIES - 1) being the highest, and 0 being the lowest &taskHandle, // Task handle settings.gnssUartInterruptsCore); // Core where task should run, 0=core, 1=Arduino + } - while (task.gnssUartPinnedTaskRunning == true) // Wait for task to run once + while (task.gnssUartPinnedTaskRunning == true) // Wait for task to complete run delay(1); } } @@ -774,8 +785,6 @@ void beginGnssUart() // https://github.com/espressif/arduino-esp32/issues/3386 void pinGnssUartTask(void *pvParameters) { - task.gnssUartPinnedTaskRunning = true; - // Start notification if (settings.printTaskStartStop) systemPrintln("Task pinGnssUartTask started"); @@ -789,8 +798,7 @@ void pinGnssUartTask(void *pvParameters) if (serialGNSS == nullptr) serialGNSS = new HardwareSerial(2); // Use UART2 on the ESP32 for communication with the GNSS module - serialGNSS->setRxBufferSize( - settings.uartReceiveBufferSize); + serialGNSS->setRxBufferSize(settings.uartReceiveBufferSize); serialGNSS->setTimeout(settings.serialTimeoutGNSS); // Requires serial traffic on the UART pins for detection if (pin_GnssUart_RX == -1 || pin_GnssUart_TX == -1) @@ -907,8 +915,8 @@ void tickerBegin() { ledcSetup(ledBtChannel, pwmFreq, pwmResolution); ledcAttachPin(pin_bluetoothStatusLED, ledBtChannel); - ledcWrite(ledBtChannel, 255); // Turn on BT LED at startup - //Attach happens in bluetoothStart() + ledcWrite(ledBtChannel, 255); // Turn on BT LED at startup + // Attach happens in bluetoothStart() } if (pin_gnssStatusLED != PIN_UNDEFINED) @@ -1239,6 +1247,7 @@ void beginI2C() ; if (task.i2cPinnedTaskRunning == false) + { xTaskCreatePinnedToCore( pinI2CTask, "I2CStart", // Just for humans @@ -1248,7 +1257,12 @@ void beginI2C() &taskHandle, // Task handle settings.i2cInterruptsCore); // Core where task should run, 0=core, 1=Arduino - // Wait for task to run once + // Wait for task to start running + while (task.i2cPinnedTaskRunning == false) + delay(1); + } + + // Wait for task to complete run while (task.i2cPinnedTaskRunning == true) delay(1); } diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index f8ec15c87..dd40a1c6d 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1731,7 +1731,6 @@ struct struct_tasks volatile bool sdSizeCheckTaskRunning = false; volatile bool updatePplTaskRunning = false; - bool i2cPinnedTaskStopRequest = false; bool btReadTaskStopRequest = false; bool buttonCheckTaskStopRequest = false; bool gnssReadTaskStopRequest = false; From 48325463186ded9d421fab06d1273f44c5801101 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 16 May 2024 11:42:56 -0600 Subject: [PATCH 026/358] Don't start PPL until 3D Fix --- .../RTK_Everywhere/PointPerfectLibrary.ino | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/Firmware/RTK_Everywhere/PointPerfectLibrary.ino b/Firmware/RTK_Everywhere/PointPerfectLibrary.ino index 3a8eb41ff..1e82bed1c 100644 --- a/Firmware/RTK_Everywhere/PointPerfectLibrary.ino +++ b/Firmware/RTK_Everywhere/PointPerfectLibrary.ino @@ -218,6 +218,8 @@ void stopPPL() // restart the PPL when new keys need to be applied void updatePPL() { + static unsigned long pplReport = 0; + static unsigned long pplTimeFloatStarted; // Monitors when the PPL got first RTK Float. // During float lock, the PPL has been seen to drop to 3D fix for a few seconds before changing back to @@ -227,7 +229,7 @@ void updatePPL() static unsigned long pplTime3dFixStarted; - if (online.ppl == false && (settings.enablePointPerfectCorrections)) + if (online.ppl == false && settings.enablePointPerfectCorrections && gnssIsFixed()) { // Start PPL only after GNSS is outputting appropriate NMEA+RTCM, we have a key, and the MQTT broker is // connected. Don't restart the PPL if we've already tried @@ -244,16 +246,18 @@ void updatePPL() } else if (online.ppl == true) { - if (settings.debugCorrections == true) { - static unsigned long pplReport = 0; if (millis() - pplReport > 5000) { pplReport = millis(); - systemPrintf("ZED restarts: %d Time remaining before Float lock forced restart: %ds\r\n", - floatLockRestarts, settings.pplFixTimeoutS - ((millis() - pplTimeFloatStarted) / 1000)); + if (systemState == STATE_ROVER_RTK_FLOAT && pplTimeFloatStarted > 0) + { + systemPrintf("GNSS restarts: %d Time remaining before Float lock forced restart: %ds\r\n", + floatLockRestarts, + settings.pplFixTimeoutS - ((millis() - pplTimeFloatStarted) / 1000)); + } // Report which data source may be fouling the RTCM generation from the PPL if ((millis() - lastMqttToPpl) > 5000) @@ -268,6 +272,9 @@ void updatePPL() if (pplTime3dFixStarted != 0) pplTime3dFixStarted = 0; // Reset pplTimeFixStarted + if(pplTimeFloatStarted == 0) + pplTimeFloatStarted = millis(); + if (settings.pplFixTimeoutS > 0) { // If we don't get an RTK fix within Timeout, restart the PPL @@ -277,8 +284,8 @@ void updatePPL() pplTimeFloatStarted = millis(); // Restart timer for PPL monitoring. - stopPPL(); //Stop PPL and mark it offline. It will auto-restart at the next update(). - pplAttemptedStart = false; //Reset to allow restart + stopPPL(); // Stop PPL and mark it offline. It will auto-restart at the next update(). + pplAttemptedStart = false; // Reset to allow restart if (settings.debugCorrections == true) systemPrintf("Restarting PPL. Number of Float lock restarts: %d\r\n", floatLockRestarts); @@ -290,6 +297,9 @@ void updatePPL() if (pplTime3dFixStarted != 0) pplTime3dFixStarted = 0; // Reset pplTimeFixStarted + if(pplTimeFloatStarted != 0) + pplTimeFloatStarted = 0; //Reset pplTimeFloatStarted + rtkTimeToFixMs = millis(); if (settings.debugCorrections == true) systemPrintf("Time to first PPL RTK Fix: %ds\r\n", rtkTimeToFixMs / 1000); From 98027f857e937ebe3a26711ba860a4cfe367d37c Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 16 May 2024 13:32:18 -0600 Subject: [PATCH 027/358] Reset wifiMaxConnections as Key update exits --- Firmware/RTK_Everywhere/States.ino | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/States.ino b/Firmware/RTK_Everywhere/States.ino index 5ff04297c..314daf145 100644 --- a/Firmware/RTK_Everywhere/States.ino +++ b/Firmware/RTK_Everywhere/States.ino @@ -626,14 +626,15 @@ void stateUpdate() break; case (STATE_KEYS_WIFI_STARTED): { + wifiMaxConnectionAttempts = + wifiOriginalMaxConnectionAttempts; // Revert setting + if (wifiIsConnected()) changeState(STATE_KEYS_WIFI_CONNECTED); else { wifiShutdown(); // Turn off WiFi - wifiMaxConnectionAttempts = - wifiOriginalMaxConnectionAttempts; // Override setting to 2 attemps during keys changeState(STATE_KEYS_WIFI_TIMEOUT); } } From 0863a782dc2c400db0446f50ac5e52faadd552d0 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Fri, 17 May 2024 11:37:28 +0100 Subject: [PATCH 028/358] Update EVK comments (L-Band + IP) --- Firmware/RTK_Everywhere/menuPP.ino | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuPP.ino b/Firmware/RTK_Everywhere/menuPP.ino index 1e679af25..6c0fbc7b6 100644 --- a/Firmware/RTK_Everywhere/menuPP.ino +++ b/Firmware/RTK_Everywhere/menuPP.ino @@ -1431,13 +1431,12 @@ void menuPointPerfect() // We also receive the full list of regional correction topics: /pp/ip/us , /pp/ip/eu , etc. // We need to subscribe to our regional correction topic and push the data to the PPL // RTCM from the PPL is pushed to the UM980 - // For L-Band-only - e.g. EVK or Facet mosaic or Facet v2 L-Band + // For L-Band-only - e.g. Facet mosaic or Facet v2 L-Band // During ZTP Provisioning, we receive the UBX-format key distribution topic /pp/ubx/0236/Lb // There are no regional correction topics for L-Band-only - // EVK pushes the keys to the ZED and pushes PMP from the NEO to the ZED + // Facet v2 L-Band pushes the keys to the ZED and pushes PMP from the NEO to the ZED // Facet mosaic pushes the current key and raw L-Band to the PPL, then pushes RTCM to the X5 - // Facet v2 L-Band does the same as EVK - // For a future L-Band+IP product: + // For L-Band+IP - e.g. EVK: // During ZTP Provisioning, we receive the UBX-format key distribution topic /pp/ubx/0236/Lb // We also receive the full list of regional correction topics: /pp/Lb/us , /pp/Lb/eu , etc. // We can subscribe to the topic and push IP data to the ZED - using UBLOX_CFG_SPARTN_USE_SOURCE 0 From d75892530b0d22a67873793c01a9d44cd801f330 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Fri, 17 May 2024 09:45:31 -0600 Subject: [PATCH 029/358] Disconnect from MQTT client when MQTT shutdown is requested --- Firmware/RTK_Everywhere/MQTT_Client.ino | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Firmware/RTK_Everywhere/MQTT_Client.ino b/Firmware/RTK_Everywhere/MQTT_Client.ino index 05899e824..aa9c90d9f 100644 --- a/Firmware/RTK_Everywhere/MQTT_Client.ino +++ b/Firmware/RTK_Everywhere/MQTT_Client.ino @@ -315,7 +315,8 @@ void mqttClientReceiveMessage(int messageSize) updateCorrectionsLastSeen(CORR_IP); if (isHighestRegisteredCorrectionsSource(CORR_IP)) { - if (((settings.debugMqttClientData == true) || (settings.debugCorrections == true)) && !inMainMenu) + if (((settings.debugMqttClientData == true) || (settings.debugCorrections == true)) && + !inMainMenu) systemPrintf("Pushing %d bytes from %s topic to GNSS\r\n", mqttCount, topic); updateZEDCorrectionsSource(0); // Set SOURCE to 0 (IP) if needed @@ -325,8 +326,10 @@ void mqttClientReceiveMessage(int messageSize) } else { - if (((settings.debugMqttClientData == true) || (settings.debugCorrections == true)) && !inMainMenu) - systemPrintf("NOT pushing %d bytes from %s topic to GNSS due to priority\r\n", mqttCount, topic); + if (((settings.debugMqttClientData == true) || (settings.debugCorrections == true)) && + !inMainMenu) + systemPrintf("NOT pushing %d bytes from %s topic to GNSS due to priority\r\n", mqttCount, + topic); } } // Always push KEYS and MGA to the ZED @@ -423,6 +426,10 @@ void mqttClientStop(bool shutdown) // Free the mqttClient resources if (mqttClient) { + // Disconnect from broker + if (mqttClient->connected() == true) + mqttClient->stop(); // Disconnects and stops client + if (settings.debugMqttClientState) systemPrintln("Freeing mqttClient"); From 725160b619f6cc6e26d8b6c9b11d165b86d45c15 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 20 May 2024 10:00:14 +0100 Subject: [PATCH 030/358] LEDC updates - remove channels --- Firmware/RTK_Everywhere/Begin.ino | 15 ++++++--------- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 7 +------ Firmware/RTK_Everywhere/Tasks.ino | 18 +++++++++--------- 3 files changed, 16 insertions(+), 24 deletions(-) diff --git a/Firmware/RTK_Everywhere/Begin.ino b/Firmware/RTK_Everywhere/Begin.ino index 3adb9cffc..d0a87e38e 100644 --- a/Firmware/RTK_Everywhere/Begin.ino +++ b/Firmware/RTK_Everywhere/Begin.ino @@ -903,26 +903,23 @@ void tickerBegin() { if (pin_bluetoothStatusLED != PIN_UNDEFINED) { - ledcSetup(ledBtChannel, pwmFreq, pwmResolution); - ledcAttachPin(pin_bluetoothStatusLED, ledBtChannel); - ledcWrite(ledBtChannel, 255); // Turn on BT LED at startup + ledcAttach(pin_bluetoothStatusLED, pwmFreq, pwmResolution); + ledcWrite(pin_bluetoothStatusLED, 255); // Turn on BT LED at startup //Attach happens in bluetoothStart() } if (pin_gnssStatusLED != PIN_UNDEFINED) { - ledcSetup(ledGnssChannel, pwmFreq, pwmResolution); - ledcAttachPin(pin_gnssStatusLED, ledGnssChannel); - ledcWrite(ledGnssChannel, 0); // Turn off GNSS LED at startup + ledcAttach(pin_gnssStatusLED, pwmFreq, pwmResolution); + ledcWrite(pin_gnssStatusLED, 0); // Turn off GNSS LED at startup gnssLedTask.detach(); // Turn off any previous task gnssLedTask.attach(1.0 / gnssTaskUpdatesHz, tickerGnssLedUpdate); // Rate in seconds, callback } if (pin_batteryStatusLED != PIN_UNDEFINED) { - ledcSetup(ledBatteryChannel, pwmFreq, pwmResolution); - ledcAttachPin(pin_batteryStatusLED, ledBatteryChannel); - ledcWrite(ledBatteryChannel, 0); // Turn off battery LED at startup + ledcAttach(pin_batteryStatusLED, pwmFreq, pwmResolution); + ledcWrite(pin_batteryStatusLED, 0); // Turn off battery LED at startup batteryLedTask.detach(); // Turn off any previous task batteryLedTask.attach(1.0 / batteryTaskUpdatesHz, tickerBatteryLedUpdate); // Rate in seconds, callback } diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index dbd85ea80..1f2a37bce 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -421,13 +421,8 @@ SFE_MAX1704X lipo(MAX1704X_MAX17048); BQ40Z50 *bq40z50Battery; #endif // COMPILE_BQ40Z50 -// RTK LED PWM properties +// RTK LED PWM (LEDC) properties const int pwmFreq = 5000; -const int ledRedChannel = 0; -const int ledGreenChannel = 1; -const int ledBtChannel = 2; -const int ledGnssChannel = 3; -const int ledBatteryChannel = 4; const int pwmResolution = 8; int pwmFadeAmount = 10; diff --git a/Firmware/RTK_Everywhere/Tasks.ino b/Firmware/RTK_Everywhere/Tasks.ino index 6c83b640d..e69908710 100644 --- a/Firmware/RTK_Everywhere/Tasks.ino +++ b/Firmware/RTK_Everywhere/Tasks.ino @@ -1182,7 +1182,7 @@ void tickerBluetoothLedUpdate() if (btFadeLevel < 0) btFadeLevel = 0; - ledcWrite(ledBtChannel, btFadeLevel); + ledcWrite(pin_bluetoothStatusLED, btFadeLevel); } // Blink on/off while we wait for BT connection else if (bluetoothGetState() == BT_NOTCONNECTED) @@ -1191,13 +1191,13 @@ void tickerBluetoothLedUpdate() btFadeLevel = 255; else btFadeLevel = 0; - ledcWrite(ledBtChannel, btFadeLevel); + ledcWrite(pin_bluetoothStatusLED, btFadeLevel); } // Solid LED if BT Connected else if (bluetoothGetState() == BT_CONNECTED) - ledcWrite(ledBtChannel, 255); + ledcWrite(pin_bluetoothStatusLED, 255); else - ledcWrite(ledBtChannel, 0); + ledcWrite(pin_bluetoothStatusLED, 0); } // Control GNSS LED on variants @@ -1215,11 +1215,11 @@ void tickerGnssLedUpdate() // Solid once RTK Fix is achieved, or PPP converges if (gnssIsRTKFix() == true || gnssIsPppConverged()) { - ledcWrite(ledGnssChannel, 255); + ledcWrite(pin_gnssStatusLED, 255); } else { - ledcWrite(ledGnssChannel, 0); + ledcWrite(pin_gnssStatusLED, 0); } } } @@ -1239,15 +1239,15 @@ void tickerBatteryLedUpdate() // Solid LED when fuel level is above 50% if (batteryLevelPercent > 50) { - ledcWrite(ledBatteryChannel, 255); + ledcWrite(pin_batteryStatusLED, 255); } // Blink a short blink to indicate battery is depleting else { if (batteryCallCounter == (batteryTaskUpdatesHz / 10)) // On for 1/10th of a second - ledcWrite(ledBatteryChannel, 255); + ledcWrite(pin_batteryStatusLED, 255); else - ledcWrite(ledBatteryChannel, 0); + ledcWrite(pin_batteryStatusLED, 0); } } } From 7905f5b0a70065932b39f7fa33ea9349c2e21594 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 20 May 2024 10:04:56 +0100 Subject: [PATCH 031/358] Fix warning: compound assignment with 'volatile'-qualified left operand is deprecated --- Firmware/RTK_Everywhere/settings.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index fc13389a4..aaef967c9 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -579,9 +579,9 @@ enum PeriodDisplayValues #define PERIODIC_MASK(x) (1ull << x) #define PERIODIC_DISPLAY(x) (periodicDisplay & PERIODIC_MASK(x)) -#define PERIODIC_CLEAR(x) periodicDisplay &= ~PERIODIC_MASK(x) +#define PERIODIC_CLEAR(x) periodicDisplay = periodicDisplay & ~PERIODIC_MASK(x) #define PERIODIC_SETTING(x) (settings.periodicDisplay & PERIODIC_MASK(x)) -#define PERIODIC_TOGGLE(x) settings.periodicDisplay ^= PERIODIC_MASK(x) +#define PERIODIC_TOGGLE(x) settings.periodicDisplay = settings.periodicDisplay ^ PERIODIC_MASK(x) #define INCHES_IN_A_METER 39.37009424 From 6c39dabef0b2de36f555148a7a103f7a63f66677 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 20 May 2024 10:18:49 +0100 Subject: [PATCH 032/358] Fix warning: ISO C++ forbids converting a string constant to 'char*' --- Firmware/RTK_Everywhere/menuCommands.ino | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index b6bcf4db0..7932155f3 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -132,7 +132,7 @@ void menuCommands() // Given a command, send structured OK response // Ex: SPCMD = "$SPCMD,OK*61" -void commandSendOkResponse(char *command) +void commandSendOkResponse(const char *command) { // Create string between $ and * for checksum calculation char innerBuffer[200]; @@ -142,7 +142,7 @@ void commandSendOkResponse(char *command) // Given a command, send response sentence with OK and checksum and // Ex: SPEXE,EXIT = -void commandSendExecuteOkResponse(char *command, char *settingName) +void commandSendExecuteOkResponse(const char *command, const char *settingName) { // Create string between $ and * for checksum calculation char innerBuffer[200]; @@ -152,7 +152,7 @@ void commandSendExecuteOkResponse(char *command, char *settingName) // Given a command, send response sentence with OK and checksum and // Ex: observationPositionAccuracy,float,0.5 = -void commandSendExecuteListResponse(const char *settingName, char *settingType, char *settingValue) +void commandSendExecuteListResponse(const char *settingName, const char *settingType, const char *settingValue) { // Create string between $ and * for checksum calculation char innerBuffer[200]; @@ -162,7 +162,7 @@ void commandSendExecuteListResponse(const char *settingName, char *settingType, // Given a command, and a value, send response sentence with checksum and // Ex: SPGET,elvMask,0.25 = "$SPGET,elvMask,0.25*07" -void commandSendValueResponse(char *command, char *settingName, char *valueBuffer) +void commandSendValueResponse(const char *command, const char *settingName, const char *valueBuffer) { // Create string between $ and * for checksum calculation char innerBuffer[200]; @@ -172,7 +172,7 @@ void commandSendValueResponse(char *command, char *settingName, char *valueBuffe // Given a command, and a value, send response sentence with OK and checksum and // Ex: SPSET,elvMask,0.77 = "$SPSET,elvMask,0.77,OK*3C" -void commandSendValueOkResponse(char *command, char *settingName, char *valueBuffer) +void commandSendValueOkResponse(const char *command, const char *settingName, const char *valueBuffer) { // Create string between $ and * for checksum calculation char innerBuffer[200]; @@ -183,7 +183,7 @@ void commandSendValueOkResponse(char *command, char *settingName, char *valueBuf // Given a command, send structured ERROR response // Response format: $SPxET,[setting name],,ERROR,[Verbose error description]*FF // Ex: SPGET,maxHeight,'Unknown setting' = "$SPGET,maxHeight,,ERROR,Unknown setting*58" -void commandSendErrorResponse(char *command, char *settingName, char *errorVerbose) +void commandSendErrorResponse(const char *command, const char *settingName, const char *errorVerbose) { // Create string between $ and * for checksum calculation char innerBuffer[200]; @@ -193,7 +193,7 @@ void commandSendErrorResponse(char *command, char *settingName, char *errorVerbo // Given a command, send structured ERROR response // Response format: $SPxET,,,ERROR,[Verbose error description]*FF // Ex: SPGET, 'Incorrect number of arguments' = "$SPGET,ERROR,Incorrect number of arguments*1E" -void commandSendErrorResponse(char *command, char *errorVerbose) +void commandSendErrorResponse(const char *command, const char *errorVerbose) { // Create string between $ and * for checksum calculation char innerBuffer[200]; @@ -203,7 +203,7 @@ void commandSendErrorResponse(char *command, char *errorVerbose) // Given an inner buffer, send response sentence with checksum and // Ex: SPGET,elvMask,0.25 = $SPGET,elvMask,0.25*07 -void commandSendResponse(char *innerBuffer) +void commandSendResponse(const char *innerBuffer) { char responseBuffer[200]; From e2020262c91cb32fcc67a2a719f8a916f1f5d882 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 20 May 2024 10:34:22 +0100 Subject: [PATCH 033/358] Fix warning: compound assignment with 'volatile'-qualified left operand is deprecated --- Firmware/RTK_Everywhere/Tasks.ino | 12 ++++++------ Firmware/RTK_Everywhere/TcpClient.ino | 4 ++-- Firmware/RTK_Everywhere/TcpServer.ino | 14 +++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Firmware/RTK_Everywhere/Tasks.ino b/Firmware/RTK_Everywhere/Tasks.ino index e69908710..68e16bbad 100644 --- a/Firmware/RTK_Everywhere/Tasks.ino +++ b/Firmware/RTK_Everywhere/Tasks.ino @@ -704,12 +704,12 @@ void processUart1Message(SEMP_PARSE_STATE *parse, uint16_t type) else systemPrintf("Ring buffer full: discarding %d bytes\r\n", discardedBytes); updateRingBufferTails(previousTail, rbOffsetArray[rbOffsetTail]); - availableHandlerSpace += discardedBytes; + availableHandlerSpace = availableHandlerSpace + discardedBytes; } // Add another message to the ring buffer // Account for this message - availableHandlerSpace -= bytesToCopy; + availableHandlerSpace = availableHandlerSpace - bytesToCopy; // Fill the buffer to the end and then start at the beginning if ((dataHead + bytesToCopy) > settings.gnssHandlerBufferSize) @@ -721,9 +721,9 @@ void processUart1Message(SEMP_PARSE_STATE *parse, uint16_t type) // Copy the data into the ring buffer memcpy(&ringBuffer[dataHead], parse->buffer, bytesToCopy); - dataHead += bytesToCopy; + dataHead = dataHead + bytesToCopy; if (dataHead >= settings.gnssHandlerBufferSize) - dataHead -= settings.gnssHandlerBufferSize; + dataHead = dataHead - settings.gnssHandlerBufferSize; // Determine the remaining bytes remainingBytes = parse->length - bytesToCopy; @@ -731,9 +731,9 @@ void processUart1Message(SEMP_PARSE_STATE *parse, uint16_t type) { // Copy the remaining bytes into the beginning of the ring buffer memcpy(ringBuffer, &parse->buffer[bytesToCopy], remainingBytes); - dataHead += remainingBytes; + dataHead = dataHead + remainingBytes; if (dataHead >= settings.gnssHandlerBufferSize) - dataHead -= settings.gnssHandlerBufferSize; + dataHead = dataHead - settings.gnssHandlerBufferSize; } // Add the head offset to the offset array diff --git a/Firmware/RTK_Everywhere/TcpClient.ino b/Firmware/RTK_Everywhere/TcpClient.ino index aaef48249..3183b9252 100644 --- a/Firmware/RTK_Everywhere/TcpClient.ino +++ b/Firmware/RTK_Everywhere/TcpClient.ino @@ -194,9 +194,9 @@ int32_t tcpClientSendData(uint16_t dataHead) } // Assume all data was sent, wrap the buffer pointer - tcpClientTail += bytesSent; + tcpClientTail = tcpClientTail + bytesSent; if (tcpClientTail >= settings.gnssHandlerBufferSize) - tcpClientTail -= settings.gnssHandlerBufferSize; + tcpClientTail = tcpClientTail - settings.gnssHandlerBufferSize; // Update space available for use in UART task bytesToSend = dataHead - tcpClientTail; diff --git a/Firmware/RTK_Everywhere/TcpServer.ino b/Firmware/RTK_Everywhere/TcpServer.ino index fcb042f90..dfaf5d772 100644 --- a/Firmware/RTK_Everywhere/TcpServer.ino +++ b/Firmware/RTK_Everywhere/TcpServer.ino @@ -89,7 +89,7 @@ int32_t tcpServerClientSendData(int index, uint8_t *data, uint16_t length) { // Update the data sent flag when data successfully sent if (length > 0) - tcpServerClientDataSent |= 1 << index; + tcpServerClientDataSent = tcpServerClientDataSent | (1 << index); if ((settings.debugTcpServer || PERIODIC_DISPLAY(PD_TCP_SERVER_CLIENT_DATA)) && (!inMainMenu)) { PERIODIC_CLEAR(PD_TCP_SERVER_CLIENT_DATA); @@ -112,8 +112,8 @@ int32_t tcpServerClientSendData(int index, uint8_t *data, uint16_t length) } tcpServerClient[index]->stop(); - tcpServerClientConnected &= ~(1 << index); - tcpServerClientWriteError |= 1 << index; + tcpServerClientConnected = tcpServerClientConnected & (~(1 << index)); + tcpServerClientWriteError = tcpServerClientWriteError | (1 << index); length = 0; } return length; @@ -315,8 +315,8 @@ void tcpServerStopClient(int index) // Shutdown the TCP server client link tcpServerClient[index]->stop(); - tcpServerClientConnected &= ~(1 << index); - tcpServerClientWriteError &= ~(1 << index); + tcpServerClientConnected = tcpServerClientConnected & (~(1 << index)); + tcpServerClientWriteError = tcpServerClientWriteError & (~(1 << index)); } // Update the TCP server state @@ -462,8 +462,8 @@ void tcpServerUpdate() // Start processing the new TCP server client connection tcpServerClient[index] = new NetworkWiFiClient(client); tcpServerClientIpAddress[index] = tcpServerClient[index]->remoteIP(); - tcpServerClientConnected |= 1 << index; - tcpServerClientDataSent |= 1 << index; + tcpServerClientConnected = tcpServerClientConnected | (1 << index); + tcpServerClientDataSent = tcpServerClientDataSent | (1 << index); if ((settings.debugTcpServer || PERIODIC_DISPLAY(PD_TCP_SERVER_DATA)) && (!inMainMenu)) { PERIODIC_CLEAR(PD_TCP_SERVER_DATA); From e9eeaaac691e1de08351e8a0e30d45d60ceb56d2 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 20 May 2024 10:45:24 +0100 Subject: [PATCH 034/358] Fix ledcDetach --- Firmware/RTK_Everywhere/Begin.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Firmware/RTK_Everywhere/Begin.ino b/Firmware/RTK_Everywhere/Begin.ino index d0a87e38e..5cde0b1bb 100644 --- a/Firmware/RTK_Everywhere/Begin.ino +++ b/Firmware/RTK_Everywhere/Begin.ino @@ -938,9 +938,9 @@ void tickerStop() gnssLedTask.detach(); batteryLedTask.detach(); - ledcDetachPin(pin_bluetoothStatusLED); - ledcDetachPin(pin_gnssStatusLED); - ledcDetachPin(pin_batteryStatusLED); + ledcDetach(pin_bluetoothStatusLED); + ledcDetach(pin_gnssStatusLED); + ledcDetach(pin_batteryStatusLED); } // Configure the battery fuel gauge From bd41e24a0b135dd077d7a0fd48697c9396b954aa Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 20 May 2024 11:04:26 +0100 Subject: [PATCH 035/358] Update mbedtls_pk_parse_key --- Firmware/RTK_Everywhere/menuPP.ino | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/menuPP.ino b/Firmware/RTK_Everywhere/menuPP.ino index 6c0fbc7b6..398ff654c 100644 --- a/Firmware/RTK_Everywhere/menuPP.ino +++ b/Firmware/RTK_Everywhere/menuPP.ino @@ -759,8 +759,13 @@ bool checkPrivateKeyValidity(char *privateKey, int privateKeySize) mbedtls_pk_context pk; mbedtls_pk_init(&pk); - int result_code = mbedtls_pk_parse_key(&pk, (unsigned char *)privateKey, privateKeySize + 1, nullptr, 0); + mbedtls_ctr_drbg_context ctr_drbg; + mbedtls_ctr_drbg_init(&ctr_drbg); + + int result_code = mbedtls_pk_parse_key(&pk, (unsigned char *)privateKey, privateKeySize + 1, nullptr, 0, mbedtls_ctr_drbg_random, &ctr_drbg); mbedtls_pk_free(&pk); + mbedtls_ctr_drbg_free(&ctr_drbg); + if (result_code < 0) { if (settings.debugPpCertificate) From 95f382f9b6dca1d55409f893ed2992a0924126bb Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 20 May 2024 11:04:49 +0100 Subject: [PATCH 036/358] Update espnowOnDataReceived --- Firmware/RTK_Everywhere/ESPNOW.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/ESPNOW.ino b/Firmware/RTK_Everywhere/ESPNOW.ino index ac3348732..93a932e12 100644 --- a/Firmware/RTK_Everywhere/ESPNOW.ino +++ b/Firmware/RTK_Everywhere/ESPNOW.ino @@ -35,7 +35,7 @@ void espnowOnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) #endif // COMPILE_ESPNOW // Callback when data is received -void espnowOnDataReceived(const uint8_t *mac, const uint8_t *incomingData, int len) +void espnowOnDataReceived(const esp_now_recv_info *mac, const uint8_t *incomingData, int len) { #ifdef COMPILE_ESPNOW if (espnowState == ESPNOW_PAIRING) From cd884a896ac5d446ae20f9fac21ed65a20c4684e Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 20 May 2024 11:11:20 +0100 Subject: [PATCH 037/358] Fix NetworkSecureWiFiClient setTimeout return type --- Firmware/RTK_Everywhere/RTKNetworkClient.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/RTKNetworkClient.h b/Firmware/RTK_Everywhere/RTKNetworkClient.h index 60fde9fb3..c126a551b 100644 --- a/Firmware/RTK_Everywhere/RTKNetworkClient.h +++ b/Firmware/RTK_Everywhere/RTKNetworkClient.h @@ -384,9 +384,9 @@ class NetworkSecureWiFiClient : public RTKNetworkClient } */ - int setTimeout(uint32_t seconds) + void setTimeout(uint32_t seconds) { - return _client.setTimeout(seconds); + _client.setTimeout(seconds); } int fd() const From f3193e39e6e3cc26bdf8c77c41ce82586e337ee5 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 20 May 2024 11:34:24 +0100 Subject: [PATCH 038/358] Include esp_mac.h --- Firmware/RTK_Everywhere/Begin.ino | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Firmware/RTK_Everywhere/Begin.ino b/Firmware/RTK_Everywhere/Begin.ino index 5cde0b1bb..1a3fbf4e4 100644 --- a/Firmware/RTK_Everywhere/Begin.ino +++ b/Firmware/RTK_Everywhere/Begin.ino @@ -5,6 +5,8 @@ Begin.ino radio, etc. ------------------------------------------------------------------------------*/ +#include "esp_mac.h" // required - exposes esp_mac_type_t values + //---------------------------------------- // Constants //---------------------------------------- From ab5224b1a2340dba659e875e7c9800190266db1a Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 20 May 2024 11:34:44 +0100 Subject: [PATCH 039/358] Temporary fix to let SparkFun_WebServer_ESP32_W5500 compile --- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index 1f2a37bce..f7d14d8c9 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -19,6 +19,8 @@ Settings are loaded from microSD if available, otherwise settings are pulled from ESP32's file system LittleFS. */ +#define IPv6Address IPAddress // Temporary fix to let SparkFun_WebServer_ESP32_W5500 compile on arduino-esp32 v3.0.0 - TODO delete this + // To reduce compile times, various parts of the firmware can be disabled/removed if they are not // needed during development #define COMPILE_BT // Comment out to remove Bluetooth functionality From 8b964f9f83a6ec201c1cbfc457dab57dc237d2a4 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 20 May 2024 12:56:21 +0100 Subject: [PATCH 040/358] Include esp_mac.h --- Firmware/RTK_Everywhere/Begin.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/Begin.ino b/Firmware/RTK_Everywhere/Begin.ino index 1a3fbf4e4..ce7b31597 100644 --- a/Firmware/RTK_Everywhere/Begin.ino +++ b/Firmware/RTK_Everywhere/Begin.ino @@ -5,7 +5,7 @@ Begin.ino radio, etc. ------------------------------------------------------------------------------*/ -#include "esp_mac.h" // required - exposes esp_mac_type_t values +#include // required - exposes esp_mac_type_t values //---------------------------------------- // Constants From 0ae7142315faa21b43860050f0e295ad282c7a46 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 20 May 2024 12:56:54 +0100 Subject: [PATCH 041/358] Missing libraries? --- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index f7d14d8c9..14d6a9895 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -71,6 +71,11 @@ #define NTRIP_SERVER_MAX 4 +#include +#include +//#include +#include + #ifdef COMPILE_ETHERNET #include "SparkFun_WebServer_ESP32_W5500.h" //http://librarymanager/All#SparkFun_WebServer_ESP32_W5500 v1.5.5 #include // http://librarymanager/All#Arduino_Ethernet by Arduino v2.0.2 From 2532772d5c7c1119f20544f0d180618e9ad02210 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 20 May 2024 13:52:50 +0100 Subject: [PATCH 042/358] Remove SparkFun_WebServer_ESP32_W5500.h --- Firmware/RTK_Everywhere/Ethernet.ino | 11 ++++++----- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Firmware/RTK_Everywhere/Ethernet.ino b/Firmware/RTK_Everywhere/Ethernet.ino index dd8f1a52d..b6de454a2 100644 --- a/Firmware/RTK_Everywhere/Ethernet.ino +++ b/Firmware/RTK_Everywhere/Ethernet.ino @@ -354,20 +354,21 @@ void ethernetVerifyTables() void ethernetWebServerStartESP32W5500() { // Configure the W5500 - // To be called before ETH.begin() - ESP32_W5500_onEvent(); + // TODO // start the ethernet connection and the server: // Use DHCP dynamic IP // bool begin(int POCI_GPIO, int PICO_GPIO, int SCLK_GPIO, int CS_GPIO, int INT_GPIO, int SPI_CLOCK_MHZ, // int SPI_HOST, uint8_t *W5500_Mac = W5500_Default_Mac, bool installIsrService = true); - ETH.begin(pin_POCI, pin_PICO, pin_SCK, pin_Ethernet_CS, pin_Ethernet_Interrupt, 25, SPI3_HOST, ethernetMACAddress); + // Old version: ETH.begin(pin_POCI, pin_PICO, pin_SCK, pin_Ethernet_CS, pin_Ethernet_Interrupt, 25, SPI3_HOST, ethernetMACAddress); + ETH.begin(ETH_PHY_W5500, 0, pin_Ethernet_CS, pin_Ethernet_Interrupt, -1, SPI); if (!settings.ethernetDHCP) ETH.config(settings.ethernetIP, settings.ethernetGateway, settings.ethernetSubnet, settings.ethernetDNS); - if (ETH.linkUp()) - ESP32_W5500_waitForConnect(); + // TODO + //if (ETH.linkUp()) + // ESP32_W5500_waitForConnect(); } // Stop the Ethernet web server diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index 14d6a9895..4cedae49b 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -77,7 +77,7 @@ #include #ifdef COMPILE_ETHERNET -#include "SparkFun_WebServer_ESP32_W5500.h" //http://librarymanager/All#SparkFun_WebServer_ESP32_W5500 v1.5.5 +#include #include // http://librarymanager/All#Arduino_Ethernet by Arduino v2.0.2 #endif // COMPILE_ETHERNET From fd03b335857b07792c86c0201431619b4de0bd63 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 20 May 2024 14:03:02 +0100 Subject: [PATCH 043/358] Change std::string to String - may need to revert this later... --- .../src/BluetoothSerial/BTAdvertisedDevice.h | 12 ++++++------ .../src/BluetoothSerial/BTAdvertisedDeviceSet.cpp | 8 ++++---- Firmware/RTK_Everywhere/src/BluetoothSerial/BTScan.h | 2 +- .../src/BluetoothSerial/BTScanResultsSet.cpp | 4 ++-- .../src/BluetoothSerial/BluetoothSerial.cpp | 4 ++-- .../src/BluetoothSerial/BluetoothSerial.h | 2 +- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Firmware/RTK_Everywhere/src/BluetoothSerial/BTAdvertisedDevice.h b/Firmware/RTK_Everywhere/src/BluetoothSerial/BTAdvertisedDevice.h index 918946f19..46276bcf0 100644 --- a/Firmware/RTK_Everywhere/src/BluetoothSerial/BTAdvertisedDevice.h +++ b/Firmware/RTK_Everywhere/src/BluetoothSerial/BTAdvertisedDevice.h @@ -17,7 +17,7 @@ class BTAdvertisedDevice { virtual BTAddress getAddress(); virtual uint32_t getCOD() const; - virtual std::string getName() const; + virtual String getName() const; virtual int8_t getRSSI() const; @@ -25,7 +25,7 @@ class BTAdvertisedDevice { virtual bool haveName() const; virtual bool haveRSSI() const; - virtual std::string toString(); + virtual String toString(); }; class BTAdvertisedDeviceSet : public virtual BTAdvertisedDevice { @@ -36,7 +36,7 @@ class BTAdvertisedDeviceSet : public virtual BTAdvertisedDevice { BTAddress getAddress(); uint32_t getCOD() const; - std::string getName() const; + String getName() const; int8_t getRSSI() const; @@ -44,11 +44,11 @@ class BTAdvertisedDeviceSet : public virtual BTAdvertisedDevice { bool haveName() const; bool haveRSSI() const; - std::string toString(); + String toString(); void setAddress(BTAddress address); void setCOD(uint32_t cod); - void setName(std::string name); + void setName(String name); void setRSSI(int8_t rssi); bool m_haveCOD; @@ -58,7 +58,7 @@ class BTAdvertisedDeviceSet : public virtual BTAdvertisedDevice { BTAddress m_address = BTAddress((uint8_t*)"\0\0\0\0\0\0"); uint32_t m_cod; - std::string m_name; + String m_name; int8_t m_rssi; }; diff --git a/Firmware/RTK_Everywhere/src/BluetoothSerial/BTAdvertisedDeviceSet.cpp b/Firmware/RTK_Everywhere/src/BluetoothSerial/BTAdvertisedDeviceSet.cpp index 14bf01fe8..573c508df 100644 --- a/Firmware/RTK_Everywhere/src/BluetoothSerial/BTAdvertisedDeviceSet.cpp +++ b/Firmware/RTK_Everywhere/src/BluetoothSerial/BTAdvertisedDeviceSet.cpp @@ -26,7 +26,7 @@ BTAdvertisedDeviceSet::BTAdvertisedDeviceSet() { BTAddress BTAdvertisedDeviceSet::getAddress() { return m_address; } uint32_t BTAdvertisedDeviceSet::getCOD() const { return m_cod; } -std::string BTAdvertisedDeviceSet::getName() const { return m_name; } +String BTAdvertisedDeviceSet::getName() const { return m_name; } int8_t BTAdvertisedDeviceSet::getRSSI() const { return m_rssi; } @@ -38,8 +38,8 @@ bool BTAdvertisedDeviceSet::haveRSSI() const { return m_haveRSSI; } * @brief Create a string representation of this device. * @return A string representation of this device. */ -std::string BTAdvertisedDeviceSet::toString() { - std::string res = "Name: " + getName() + ", Address: " + std::string(getAddress().toString().c_str(), getAddress().toString().length()); +String BTAdvertisedDeviceSet::toString() { + String res = "Name: " + getName() + ", Address: " + String(getAddress().toString().c_str(), getAddress().toString().length()); if (haveCOD()) { char val[6]; snprintf(val, sizeof(val), "%d", getCOD()); @@ -65,7 +65,7 @@ void BTAdvertisedDeviceSet::setCOD(uint32_t cod) { m_haveCOD = true; } -void BTAdvertisedDeviceSet::setName(std::string name) { +void BTAdvertisedDeviceSet::setName(String name) { m_name = name; m_haveName = true; } diff --git a/Firmware/RTK_Everywhere/src/BluetoothSerial/BTScan.h b/Firmware/RTK_Everywhere/src/BluetoothSerial/BTScan.h index 2851fdd36..9c9487b20 100644 --- a/Firmware/RTK_Everywhere/src/BluetoothSerial/BTScan.h +++ b/Firmware/RTK_Everywhere/src/BluetoothSerial/BTScan.h @@ -36,7 +36,7 @@ class BTScanResultsSet : public BTScanResults { bool add(BTAdvertisedDeviceSet advertisedDevice, bool unique = true); void clear(); - std::map m_vectorAdvertisedDevices; + std::map m_vectorAdvertisedDevices; }; #endif diff --git a/Firmware/RTK_Everywhere/src/BluetoothSerial/BTScanResultsSet.cpp b/Firmware/RTK_Everywhere/src/BluetoothSerial/BTScanResultsSet.cpp index e7745e431..bf9167139 100644 --- a/Firmware/RTK_Everywhere/src/BluetoothSerial/BTScanResultsSet.cpp +++ b/Firmware/RTK_Everywhere/src/BluetoothSerial/BTScanResultsSet.cpp @@ -84,9 +84,9 @@ void BTScanResultsSet::clear() { } bool BTScanResultsSet::add(BTAdvertisedDeviceSet advertisedDevice, bool unique) { - std::string key = std::string(advertisedDevice.getAddress().toString().c_str(), advertisedDevice.getAddress().toString().length()); + String key = String(advertisedDevice.getAddress().toString().c_str(), advertisedDevice.getAddress().toString().length()); if (!unique || m_vectorAdvertisedDevices.count(key) == 0) { - m_vectorAdvertisedDevices.insert(std::pair(key, advertisedDevice)); + m_vectorAdvertisedDevices.insert(std::pair(key, advertisedDevice)); return true; } else return false; diff --git a/Firmware/RTK_Everywhere/src/BluetoothSerial/BluetoothSerial.cpp b/Firmware/RTK_Everywhere/src/BluetoothSerial/BluetoothSerial.cpp index b8f38d10b..954901729 100644 --- a/Firmware/RTK_Everywhere/src/BluetoothSerial/BluetoothSerial.cpp +++ b/Firmware/RTK_Everywhere/src/BluetoothSerial/BluetoothSerial.cpp @@ -78,7 +78,7 @@ static esp_spp_sec_t _sec_mask; static esp_spp_role_t _role; // start connect on ESP_SPP_DISCOVERY_COMP_EVT or save entry for getChannels static bool _doConnect; -static std::map sdpRecords; +static std::map sdpRecords; static BTScanResultsSet scanResults; static BTAdvertisedDeviceCb advertisedDeviceCb = nullptr; @@ -1162,7 +1162,7 @@ BluetoothSerial::operator bool() const * SDP scan address * esp_spp_start_discovery doesn't tell us the btAddress in the callback, so we have to wait until it's finished */ -std::map BluetoothSerial::getChannels(const BTAddress &remoteAddress) { +std::map BluetoothSerial::getChannels(const BTAddress &remoteAddress) { if(xEventGroupGetBits(_bt_event_group) & BT_SDP_RUNNING) { log_e("getChannels failed - already running"); } diff --git a/Firmware/RTK_Everywhere/src/BluetoothSerial/BluetoothSerial.h b/Firmware/RTK_Everywhere/src/BluetoothSerial/BluetoothSerial.h index 12fe9455a..131430743 100644 --- a/Firmware/RTK_Everywhere/src/BluetoothSerial/BluetoothSerial.h +++ b/Firmware/RTK_Everywhere/src/BluetoothSerial/BluetoothSerial.h @@ -78,7 +78,7 @@ class BluetoothSerial: public Stream void discoverClear(); BTScanResults* getScanResults(); - std::map getChannels(const BTAddress &remoteAddress); + std::map getChannels(const BTAddress &remoteAddress); const int INQ_TIME = 1280; // Inquire Time unit 1280 ms const int MIN_INQ_TIME = (ESP_BT_GAP_MIN_INQ_LEN * INQ_TIME); From 6bfcc99991fdc67f520b51b13c5a86cccdd23391 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Mon, 20 May 2024 09:03:18 -0600 Subject: [PATCH 044/358] Fix task name --- Firmware/RTK_Everywhere/PointPerfectLibrary.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Firmware/RTK_Everywhere/PointPerfectLibrary.ino b/Firmware/RTK_Everywhere/PointPerfectLibrary.ino index 1e82bed1c..aa6c60011 100644 --- a/Firmware/RTK_Everywhere/PointPerfectLibrary.ino +++ b/Firmware/RTK_Everywhere/PointPerfectLibrary.ino @@ -196,8 +196,8 @@ void beginPPL() void stopPPL() { // Stop task if running - if (task.gnssReadTaskRunning) - task.gnssReadTaskStopRequest = true; + if (task.updatePplTaskRunning) + task.updatePplTaskStopRequest = true; if (pplRtcmBuffer != nullptr) { @@ -208,7 +208,7 @@ void stopPPL() // Wait for task to stop running do delay(10); - while (task.gnssReadTaskRunning); + while (task.updatePplTaskRunning); online.ppl = false; } From 0b3194c446be953e16369f1de29bbe299df1dfce Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Mon, 20 May 2024 09:03:40 -0600 Subject: [PATCH 045/358] Restart lock timer only if 3D fix is lost. --- .../RTK_Everywhere/PointPerfectLibrary.ino | 45 ++++++++----------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/Firmware/RTK_Everywhere/PointPerfectLibrary.ino b/Firmware/RTK_Everywhere/PointPerfectLibrary.ino index aa6c60011..576706970 100644 --- a/Firmware/RTK_Everywhere/PointPerfectLibrary.ino +++ b/Firmware/RTK_Everywhere/PointPerfectLibrary.ino @@ -222,10 +222,8 @@ void updatePPL() static unsigned long pplTimeFloatStarted; // Monitors when the PPL got first RTK Float. - // During float lock, the PPL has been seen to drop to 3D fix for a few seconds before changing back to - // RTK float. pplTime3dFixStarted is used as a sort of hysteresis detection. - // If (millis() - pplTime3dFixStarted > 5000) then we are truly out of RTK Float and pplTimeFloatStarted should - // be reset. If we are in RTK Float, reset pplTime3dFixStarted to zero. + // During float lock, the PPL has been seen to drop to 3D fix so once pplTimeFloatStarted + // is started, we do not reset it unless a 3D fix is lost. static unsigned long pplTime3dFixStarted; @@ -252,7 +250,7 @@ void updatePPL() { pplReport = millis(); - if (systemState == STATE_ROVER_RTK_FLOAT && pplTimeFloatStarted > 0) + if (gnssIsRTKFloat() && pplTimeFloatStarted > 0) { systemPrintf("GNSS restarts: %d Time remaining before Float lock forced restart: %ds\r\n", floatLockRestarts, @@ -267,12 +265,9 @@ void updatePPL() } } - if (systemState == STATE_ROVER_RTK_FLOAT) + if (gnssIsRTKFloat()) { - if (pplTime3dFixStarted != 0) - pplTime3dFixStarted = 0; // Reset pplTimeFixStarted - - if(pplTimeFloatStarted == 0) + if (pplTimeFloatStarted == 0) pplTimeFloatStarted = millis(); if (settings.pplFixTimeoutS > 0) @@ -292,30 +287,28 @@ void updatePPL() } } } - else if (gnssIsRTKFix() && rtkTimeToFixMs == 0) + else if (gnssIsRTKFix()) { - if (pplTime3dFixStarted != 0) - pplTime3dFixStarted = 0; // Reset pplTimeFixStarted + if (pplTimeFloatStarted != 0) + pplTimeFloatStarted = 0; // Reset pplTimeFloatStarted - if(pplTimeFloatStarted != 0) - pplTimeFloatStarted = 0; //Reset pplTimeFloatStarted + if (rtkTimeToFixMs == 0) + rtkTimeToFixMs = millis(); - rtkTimeToFixMs = millis(); - if (settings.debugCorrections == true) - systemPrintf("Time to first PPL RTK Fix: %ds\r\n", rtkTimeToFixMs / 1000); + if (millis() - pplReport > 5000) + { + pplReport = millis(); + + if (settings.debugCorrections == true) + systemPrintf("Time to first PPL RTK Fix: %ds\r\n", rtkTimeToFixMs / 1000); + } } else { // We are not in RTK Float or RTK Fix - if (pplTime3dFixStarted == 0) - pplTime3dFixStarted = millis(); - // If (millis() - pplTime3dFixStarted > 5000) then we are truly out of RTK Float and pplTimeFloatStarted - // should be reset. If we are in RTK Float, reset pplTime3dFixStarted to zero. - if (millis() - pplTime3dFixStarted > 5000) - { - pplTimeFloatStarted = 0; - } + if (gnssIsFixed() == false) + pplTimeFloatStarted = 0; // Reset pplTimeFloatStarted if we loose a 3D fix entirely } } From 282dab69c14cdc0f5bde07e16074c0ccdae69517 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 20 May 2024 15:08:11 +0000 Subject: [PATCH 046/358] Update form.h via Python --- Firmware/RTK_Everywhere/form.h | 3518 ++++++++++++++++---------------- 1 file changed, 1757 insertions(+), 1761 deletions(-) diff --git a/Firmware/RTK_Everywhere/form.h b/Firmware/RTK_Everywhere/form.h index 2a5490ead..0632f9453 100644 --- a/Firmware/RTK_Everywhere/form.h +++ b/Firmware/RTK_Everywhere/form.h @@ -26,862 +26,859 @@ // python main_js_zipper.py static const uint8_t main_js[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0xCF, 0xE4, 0x45, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, - 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x3A, 0x92, 0xE0, 0xFF, - 0xFE, 0xBE, 0x7E, 0x07, 0xB4, 0xB6, 0xB7, 0x25, 0xB5, 0x65, 0x99, 0x92, 0x2F, 0xB1, 0xE3, 0xD8, - 0xB3, 0xBE, 0x26, 0xDE, 0xE3, 0x8B, 0xD6, 0xB2, 0x93, 0x93, 0x9C, 0xCE, 0x78, 0x68, 0x11, 0x96, - 0x39, 0x91, 0x48, 0x0D, 0x49, 0xF9, 0xD2, 0x3D, 0x79, 0xA7, 0x79, 0x86, 0x79, 0xB2, 0x45, 0x01, - 0x20, 0x09, 0x80, 0xE0, 0x55, 0x92, 0xE3, 0x3E, 0x13, 0x7F, 0xDD, 0x39, 0x36, 0x01, 0x54, 0x15, - 0x0A, 0x85, 0x02, 0x50, 0xA8, 0x2A, 0x3C, 0x98, 0x1E, 0x1A, 0x9A, 0x01, 0x7E, 0x34, 0x9F, 0xD1, - 0x0E, 0xFA, 0xB7, 0x47, 0xFF, 0xED, 0xCA, 0xCA, 0x9F, 0xFF, 0xF1, 0x68, 0x3B, 0x96, 0xFB, 0xD8, - 0x1E, 0xB9, 0x03, 0x33, 0xB0, 0x5D, 0xA7, 0x7D, 0xEF, 0xFA, 0x81, 0x63, 0x8E, 0xF1, 0xF7, 0x95, - 0x47, 0xFF, 0xDF, 0xB6, 0xFF, 0xF8, 0x87, 0x07, 0xD2, 0xEA, 0x11, 0xDF, 0xFA, 0xEE, 0xE0, 0x1B, - 0x0E, 0xC8, 0xDF, 0x7F, 0xFC, 0x03, 0x6F, 0x61, 0x5A, 0xD6, 0xD1, 0x03, 0x76, 0x82, 0x53, 0xDB, - 0x0F, 0xB0, 0x83, 0xBD, 0x46, 0x7D, 0xE4, 0x9A, 0x56, 0xBD, 0x85, 0x5C, 0xE7, 0x94, 0xFC, 0xD2, - 0xA4, 0x75, 0xEF, 0xA6, 0xCE, 0x00, 0xC0, 0xF2, 0x8F, 0x0D, 0x0C, 0x2D, 0x9A, 0xE8, 0x1F, 0x7F, - 0xFC, 0x03, 0x22, 0x3F, 0xB6, 0x63, 0x07, 0x9F, 0xF0, 0x6D, 0x9F, 0xC2, 0x6E, 0x40, 0x8B, 0xEF, - 0x52, 0x23, 0xA5, 0x3C, 0x6C, 0x16, 0x91, 0x43, 0xBA, 0xE1, 0xE0, 0x47, 0x14, 0x57, 0xE1, 0xDD, - 0x03, 0x48, 0x52, 0xC5, 0xB6, 0xEB, 0x8C, 0xB1, 0xEF, 0x9B, 0x43, 0x4C, 0x9A, 0x44, 0xE0, 0x1B, - 0x63, 0x7F, 0x18, 0x01, 0x85, 0x9F, 0x89, 0xE9, 0xF9, 0xF8, 0xC4, 0x19, 0xB8, 0x63, 0xDB, 0x19, - 0x42, 0x69, 0xDB, 0x32, 0x03, 0x33, 0x84, 0xF6, 0x3D, 0x41, 0xDF, 0x10, 0x37, 0x70, 0x04, 0xC0, - 0xC3, 0xC1, 0xD4, 0x73, 0x90, 0xE5, 0x0E, 0xA6, 0x63, 0xD2, 0xC9, 0xF6, 0x10, 0x07, 0x47, 0x23, - 0x0C, 0xBF, 0xEE, 0x3F, 0x9F, 0x90, 0x9E, 0x47, 0xDD, 0x03, 0x8E, 0xDE, 0xD9, 0x4F, 0xD8, 0x3A, - 0x35, 0xA1, 0x07, 0xC6, 0xB6, 0xF8, 0xC9, 0x75, 0x86, 0xC2, 0xB7, 0xC9, 0xC8, 0x0C, 0xEE, 0x5C, - 0x6F, 0xDC, 0xF3, 0x30, 0x29, 0x26, 0x05, 0xB5, 0x1A, 0x2F, 0x19, 0x62, 0xD7, 0xC2, 0x81, 0x3D, - 0x60, 0x30, 0xD6, 0x8C, 0xB6, 0xD1, 0x51, 0x4B, 0x08, 0x81, 0x3B, 0x68, 0xB9, 0x63, 0xAC, 0xB7, - 0x3B, 0x5B, 0x4A, 0xD9, 0xDE, 0x08, 0x5A, 0x75, 0xD6, 0x0D, 0xA3, 0x1D, 0x36, 0xC3, 0x03, 0x7C, - 0xF7, 0x2B, 0x6D, 0xD0, 0xDD, 0x34, 0xBA, 0xC6, 0x46, 0x7B, 0x7D, 0x63, 0x53, 0x28, 0xFA, 0x0C, - 0x45, 0x6B, 0x6F, 0x3A, 0x1B, 0x9B, 0xC6, 0x5A, 0x7B, 0xCD, 0x58, 0x15, 0x8A, 0xBE, 0x50, 0x02, - 0x36, 0x37, 0x36, 0x36, 0xD6, 0xDB, 0x6B, 0x9B, 0x6B, 0xBC, 0x64, 0x64, 0xFA, 0xC1, 0xB1, 0x3D, - 0xC2, 0xE7, 0x44, 0x96, 0x44, 0xC2, 0xEF, 0xE0, 0xDB, 0x74, 0x7C, 0x8B, 0x3D, 0xA1, 0x9F, 0x0E, - 0xFD, 0x70, 0x71, 0x07, 0x0D, 0xFC, 0x3E, 0x1E, 0xE1, 0x41, 0x80, 0x2D, 0xA1, 0xDC, 0xE7, 0x9F, - 0x68, 0xB9, 0x08, 0xCD, 0xBF, 0x77, 0x89, 0x38, 0x0E, 0xE1, 0x3B, 0xC8, 0x21, 0x8C, 0xAE, 0x39, - 0xF2, 0x31, 0x2F, 0x75, 0x6F, 0x03, 0xD3, 0x76, 0xB0, 0x75, 0xC6, 0xC6, 0xBE, 0x58, 0x8D, 0x7D, - 0xD3, 0xC7, 0x4A, 0x2D, 0x8E, 0x85, 0x57, 0xBA, 0xBC, 0x3A, 0x38, 0xD3, 0x80, 0x82, 0x8E, 0x5D, - 0x99, 0xB7, 0xE4, 0x1F, 0xFC, 0x14, 0x88, 0x34, 0x0E, 0x5C, 0xCF, 0xC3, 0x54, 0x60, 0xD4, 0x12, - 0x2E, 0x93, 0xEA, 0x67, 0x60, 0x1D, 0xC7, 0x75, 0xF5, 0x3C, 0xC1, 0x19, 0x45, 0x9C, 0x56, 0x5A, - 0xCC, 0x2A, 0x10, 0x4C, 0xAE, 0x67, 0xF9, 0x47, 0x07, 0x47, 0xC7, 0xA4, 0xE0, 0xB7, 0xAF, 0xDB, - 0xD2, 0xE7, 0xF7, 0x7C, 0xFC, 0xC5, 0xA2, 0xBB, 0xE9, 0x68, 0xD4, 0x23, 0xF0, 0xAE, 0x27, 0x44, - 0xD8, 0xC5, 0x9E, 0x87, 0x2D, 0x7D, 0x1C, 0x5C, 0xD9, 0x63, 0xEC, 0x4E, 0x83, 0x68, 0x34, 0x1C, - 0xEB, 0x90, 0x4C, 0x0C, 0xF9, 0xEB, 0xE0, 0x1E, 0x0F, 0xBE, 0x9D, 0xE3, 0xC7, 0x63, 0xDB, 0x1B, - 0x3F, 0x9A, 0x1E, 0x96, 0x4B, 0xC9, 0x6C, 0xD0, 0x96, 0xFD, 0xF1, 0x0F, 0x03, 0xD7, 0x21, 0xBC, - 0x24, 0x12, 0x70, 0x10, 0xF1, 0xC9, 0xEF, 0xBB, 0x53, 0x6F, 0x40, 0x47, 0xFA, 0x4D, 0x82, 0x89, - 0xBC, 0x10, 0xE4, 0xCA, 0x17, 0xFB, 0x91, 0xA8, 0xD1, 0xF3, 0x6C, 0xD7, 0xB3, 0x03, 0x3B, 0xAE, - 0x16, 0x22, 0x3B, 0x70, 0x09, 0x33, 0x6C, 0x87, 0x74, 0x17, 0x98, 0x08, 0xC5, 0x7C, 0x0E, 0x1F, - 0x5C, 0x5C, 0x5C, 0x1E, 0x9E, 0x9C, 0xEF, 0x5D, 0x1D, 0xDD, 0x9C, 0x9C, 0xF7, 0xAE, 0xAF, 0x6E, - 0xAE, 0x3E, 0xF7, 0x8E, 0x6E, 0x0E, 0x0F, 0xDF, 0x22, 0xA3, 0x85, 0x56, 0x56, 0x0E, 0xF1, 0x9D, - 0x39, 0x25, 0x53, 0xE7, 0xF0, 0xB0, 0x6D, 0x85, 0x3F, 0xD9, 0x0D, 0xCF, 0xCE, 0xDE, 0xA2, 0x0E, - 0x6D, 0x4A, 0x7E, 0x6D, 0x8F, 0xE1, 0x27, 0xBB, 0xC1, 0x0D, 0xB4, 0xE8, 0xB2, 0x16, 0xA8, 0x70, - 0x93, 0x9B, 0xC3, 0xBD, 0xFE, 0x87, 0xB7, 0x68, 0x95, 0xB5, 0x5B, 0x2E, 0xDE, 0xAE, 0xFF, 0xF9, - 0x6C, 0xFF, 0xE2, 0xF4, 0x2D, 0x5A, 0x63, 0x2D, 0xFF, 0xFB, 0xBF, 0xC2, 0xA6, 0xE3, 0x71, 0x3D, - 0xAF, 0x67, 0xFD, 0xFE, 0x5B, 0xB4, 0x1E, 0x51, 0x8A, 0xFA, 0xFD, 0xB6, 0x4F, 0x7F, 0x0A, 0x60, - 0x25, 0x2D, 0x37, 0x2A, 0xB6, 0xE4, 0x5D, 0x7D, 0x13, 0x75, 0x75, 0xB9, 0x5C, 0xF3, 0xB0, 0xC7, - 0x9B, 0x71, 0x8F, 0xEB, 0x11, 0x84, 0x5A, 0x7E, 0x9F, 0x6F, 0xCE, 0x2F, 0x6E, 0x0E, 0x8F, 0x0E, - 0x4E, 0xCE, 0xF6, 0x08, 0x90, 0xAD, 0x70, 0x68, 0xFB, 0x7D, 0xB4, 0x8C, 0xCE, 0x5D, 0x64, 0xE1, - 0x81, 0x3D, 0x36, 0x47, 0x85, 0x28, 0x11, 0x01, 0x75, 0x0C, 0x91, 0x1D, 0xE5, 0x61, 0x01, 0x53, - 0x64, 0x80, 0x1D, 0x91, 0x41, 0x85, 0x01, 0x9E, 0x9C, 0x7F, 0xDC, 0x3B, 0x3D, 0x39, 0xBC, 0xB9, - 0x3E, 0xFF, 0xE5, 0xFC, 0xE2, 0xD3, 0x39, 0x81, 0xD3, 0x6D, 0x09, 0xCB, 0x16, 0x99, 0x3E, 0x0F, - 0xD8, 0x23, 0x8A, 0x38, 0x9E, 0x41, 0xA0, 0xA5, 0xDB, 0x46, 0x34, 0x07, 0xC3, 0xCF, 0x27, 0xCE, - 0x64, 0x1A, 0x70, 0xED, 0xA5, 0x4C, 0xB7, 0x76, 0x5A, 0x5F, 0xE4, 0x1D, 0x43, 0x62, 0x31, 0x8E, - 0x56, 0xDA, 0x95, 0x15, 0x98, 0xC6, 0xEE, 0x08, 0x93, 0x5D, 0xCB, 0xB0, 0x51, 0x0B, 0xEB, 0x84, - 0xEA, 0xF4, 0x2D, 0xAA, 0xA1, 0x25, 0x04, 0x0D, 0x28, 0x40, 0x68, 0x01, 0xB4, 0xC1, 0x52, 0x4E, - 0x88, 0x81, 0x55, 0xDD, 0x9F, 0x8C, 0xEC, 0xA0, 0x51, 0x6F, 0xD5, 0xC3, 0xA5, 0x9D, 0xAC, 0xB1, - 0xA8, 0x31, 0x22, 0x1B, 0x8A, 0x27, 0xBA, 0xE8, 0x90, 0xFF, 0xBC, 0xA3, 0xF5, 0xDB, 0x23, 0xEC, - 0x0C, 0x83, 0x7B, 0xC2, 0xBE, 0x0E, 0x7C, 0x5C, 0xDA, 0x41, 0x5D, 0x69, 0xC3, 0x00, 0x70, 0x6D, - 0x58, 0xA8, 0xA0, 0xF2, 0x6F, 0x4F, 0x5F, 0xB7, 0xE5, 0xA2, 0x07, 0x73, 0x14, 0x95, 0x11, 0x92, - 0x3A, 0x62, 0xB9, 0xD2, 0x09, 0xDB, 0x62, 0x64, 0x13, 0x68, 0x4B, 0xA8, 0xD6, 0x82, 0xA6, 0xEC, - 0x03, 0xF9, 0x25, 0xEE, 0x07, 0x6B, 0xD8, 0x9F, 0x90, 0x81, 0x24, 0xA0, 0x49, 0xB7, 0xC7, 0xA6, - 0x63, 0xF9, 0x71, 0x99, 0x7D, 0x87, 0x1A, 0xB6, 0xD5, 0xB6, 0x9D, 0xC1, 0x68, 0x6A, 0x61, 0xBF, - 0x51, 0xF3, 0xAD, 0x33, 0x77, 0xEA, 0x90, 0x01, 0xAB, 0x35, 0x25, 0xC2, 0x19, 0xA0, 0x2B, 0xD8, - 0xB0, 0xB8, 0xCE, 0x8A, 0x7B, 0x77, 0x87, 0xFA, 0x87, 0x88, 0x28, 0x66, 0x53, 0xAE, 0x02, 0xF0, - 0x68, 0x27, 0xC8, 0x1A, 0x43, 0x97, 0x85, 0x5A, 0x02, 0x0A, 0xFC, 0xDC, 0xDB, 0x16, 0x6E, 0xD4, - 0x60, 0x01, 0x3C, 0x33, 0x1D, 0x32, 0x02, 0x5E, 0xAD, 0xB9, 0x2D, 0xD7, 0xFA, 0x2E, 0xFF, 0x89, - 0x09, 0x28, 0x09, 0x78, 0xE0, 0x4D, 0x53, 0x60, 0xC3, 0xDA, 0x5B, 0x18, 0xB6, 0xF0, 0x6B, 0x84, - 0x02, 0xC6, 0x87, 0x60, 0x90, 0xB7, 0x52, 0x49, 0x5C, 0x89, 0xAD, 0x16, 0x21, 0x4D, 0x41, 0x14, - 0x6D, 0xED, 0x02, 0x3B, 0x18, 0xD1, 0x75, 0xF7, 0xF2, 0xEA, 0x17, 0x3A, 0x48, 0x4A, 0x63, 0x32, - 0x82, 0xA8, 0x4F, 0xB6, 0x83, 0x93, 0x9A, 0x02, 0x21, 0xB1, 0xD6, 0x42, 0xBF, 0x95, 0x3A, 0xFA, - 0xED, 0x42, 0x72, 0x5C, 0x54, 0x82, 0x49, 0xC5, 0xA3, 0x8F, 0xBF, 0x64, 0x31, 0xF1, 0x96, 0xEC, - 0x16, 0x0E, 0x5C, 0xE7, 0xCE, 0x1E, 0x26, 0x78, 0x18, 0x57, 0x9A, 0x4C, 0x72, 0xAB, 0xE0, 0xE0, - 0x1E, 0x7B, 0x0E, 0x0E, 0x72, 0x2B, 0x3A, 0x41, 0x16, 0x30, 0x26, 0x35, 0x81, 0x3D, 0x22, 0x80, - 0xC6, 0x13, 0xEC, 0xF8, 0xF4, 0x00, 0x42, 0xF8, 0x16, 0x90, 0xC9, 0xEC, 0x67, 0x34, 0x99, 0xB8, - 0x5E, 0xE0, 0xE7, 0x22, 0x27, 0xD3, 0xEA, 0xCA, 0xED, 0x1F, 0x1E, 0x98, 0x9E, 0x55, 0x58, 0x1C, - 0x35, 0x3C, 0x3D, 0x36, 0x07, 0x44, 0x2F, 0x3C, 0x74, 0x17, 0xCB, 0x58, 0xD6, 0xB1, 0x02, 0x8C, - 0x65, 0x15, 0xE7, 0xCE, 0x58, 0x4E, 0xE2, 0xCB, 0x33, 0x76, 0xEC, 0xFA, 0xA6, 0x3D, 0xF8, 0xC9, - 0xDC, 0x39, 0x33, 0xF7, 0xCA, 0xF5, 0x06, 0xF7, 0xFF, 0x44, 0x5C, 0x65, 0xF8, 0x16, 0xA0, 0x0B, - 0x58, 0x2D, 0x95, 0xAB, 0x1A, 0x02, 0xE8, 0x09, 0x93, 0x68, 0x5B, 0x72, 0xA6, 0xAF, 0x59, 0xCF, - 0x8E, 0x39, 0xB6, 0x07, 0x67, 0xE4, 0xB0, 0x34, 0xD2, 0x42, 0x85, 0xAD, 0x82, 0x83, 0x1F, 0x2F, - 0x26, 0x74, 0xA7, 0xC2, 0xAC, 0x10, 0xEC, 0x8F, 0x46, 0xBD, 0x3F, 0xF5, 0x1E, 0xF0, 0x73, 0xBD, - 0x85, 0xEA, 0x46, 0x5D, 0xDB, 0x55, 0x8A, 0x09, 0xCC, 0x27, 0x8D, 0x08, 0x44, 0x0B, 0x4D, 0x1D, - 0x8B, 0x0C, 0x1E, 0x39, 0x89, 0xEA, 0x9A, 0xA4, 0xA1, 0xBA, 0xDE, 0xFB, 0x08, 0x78, 0x3A, 0x8B, - 0xC6, 0xB3, 0x37, 0x0D, 0xDC, 0xB1, 0x1B, 0xD8, 0x0F, 0x18, 0xD0, 0x75, 0xAB, 0xA2, 0x4B, 0x36, - 0xE2, 0x7B, 0x4A, 0x3F, 0xC0, 0xA3, 0x11, 0x1D, 0xF1, 0x03, 0x38, 0x44, 0xD2, 0x13, 0xFE, 0x3B, - 0xCB, 0x7E, 0x40, 0x03, 0x72, 0xDE, 0xF5, 0x77, 0xEA, 0x20, 0xDC, 0xCB, 0xF4, 0x7C, 0x89, 0xC6, - 0xC1, 0x72, 0xA7, 0xBE, 0x5B, 0xD3, 0x10, 0xA0, 0x83, 0xB3, 0x04, 0x80, 0x46, 0xE6, 0x2D, 0x1E, - 0x25, 0x41, 0x2D, 0xD3, 0xEF, 0x75, 0xD8, 0xFB, 0xED, 0xD4, 0xA7, 0xE3, 0xAD, 0x4D, 0xE3, 0x40, - 0x84, 0xE0, 0xDF, 0xBC, 0xEF, 0xF5, 0xEB, 0xBB, 0xE4, 0x1F, 0xF4, 0x6E, 0x85, 0x56, 0x2D, 0x87, - 0xD5, 0x86, 0x0D, 0xB0, 0x06, 0x2B, 0xFD, 0x5E, 0x47, 0x01, 0xD9, 0x09, 0xEF, 0xD4, 0xE9, 0xA7, - 0x5B, 0xF7, 0xA9, 0x0E, 0xBB, 0x8D, 0x29, 0xF9, 0x50, 0x27, 0x1B, 0xC0, 0x0C, 0x6A, 0x4A, 0x51, - 0xB0, 0x42, 0x38, 0x58, 0xAE, 0xC5, 0x8F, 0x67, 0xF9, 0xE9, 0xC5, 0xF9, 0x5E, 0x1F, 0xD8, 0xCE, - 0x7E, 0x79, 0x25, 0xAC, 0x0F, 0xA9, 0xFA, 0xDD, 0xB3, 0xDF, 0x1C, 0x91, 0x7D, 0xB6, 0x4B, 0xD8, - 0xCF, 0x7E, 0x79, 0x25, 0xEC, 0x0F, 0xA9, 0xFA, 0xBD, 0xB3, 0x7F, 0x1F, 0xDB, 0x87, 0xEE, 0xB4, - 0xBE, 0xCB, 0xFE, 0xFB, 0x3A, 0x98, 0x1F, 0xD2, 0xF4, 0x7B, 0xE7, 0xFD, 0xFF, 0xFB, 0x02, 0x13, - 0x1C, 0xFE, 0x7D, 0x1D, 0x7C, 0x67, 0xF4, 0xCC, 0x87, 0xEB, 0xB0, 0xA5, 0x19, 0x3A, 0xBE, 0x2F, - 0xA3, 0xA8, 0x35, 0xDB, 0xB6, 0xE3, 0x60, 0xEF, 0xC3, 0xD5, 0xD9, 0x29, 0x59, 0x70, 0x35, 0x60, - 0x93, 0xDB, 0xCF, 0xE4, 0x29, 0x34, 0xFD, 0x18, 0xFA, 0x9F, 0xFF, 0x99, 0x73, 0x9E, 0xD2, 0xEE, - 0x4E, 0x5F, 0xCF, 0x8E, 0xE0, 0xF6, 0x49, 0xE2, 0x57, 0xB4, 0x1D, 0x58, 0xF9, 0x41, 0x42, 0xA2, - 0xA5, 0xE7, 0x77, 0x35, 0x2D, 0xD5, 0x1E, 0xF6, 0xF7, 0xF7, 0x48, 0x17, 0xE1, 0xDF, 0x57, 0xC0, - 0x6E, 0x46, 0xCC, 0xEF, 0x9A, 0xDF, 0xAF, 0x60, 0xF9, 0x4F, 0x25, 0xE9, 0x77, 0xCD, 0xF8, 0x1F, - 0xBE, 0xF0, 0xA7, 0x11, 0xF4, 0xFB, 0x16, 0xF7, 0x1F, 0x7F, 0xD8, 0x48, 0x25, 0xE9, 0xF5, 0x2E, - 0xFC, 0x7A, 0x13, 0xBB, 0x70, 0xE5, 0x00, 0x08, 0xC3, 0x7B, 0xDE, 0x8F, 0xD8, 0xF3, 0x09, 0xD4, - 0x13, 0x27, 0xD0, 0xDE, 0x3F, 0x9C, 0xB9, 0x96, 0x7D, 0xF7, 0x8C, 0x7C, 0x6E, 0xE6, 0x41, 0xD6, - 0x14, 0xA3, 0xC0, 0x45, 0x77, 0xBC, 0x35, 0x1A, 0xD9, 0x63, 0x3B, 0x60, 0x44, 0x2F, 0x7E, 0xE7, - 0x31, 0x3F, 0x0B, 0x50, 0xCF, 0xF5, 0x02, 0x70, 0x04, 0x78, 0x11, 0x1B, 0x50, 0x9F, 0x31, 0xC8, - 0xF4, 0x9E, 0x67, 0xB2, 0xCD, 0x14, 0x45, 0xD7, 0xC3, 0x64, 0x90, 0x03, 0xCF, 0x36, 0x1D, 0x40, - 0xB7, 0xFA, 0xB2, 0x96, 0xA7, 0xB5, 0x85, 0x33, 0x13, 0x9B, 0x80, 0x67, 0x7D, 0xE1, 0xDD, 0xB2, - 0xBD, 0x5B, 0xD7, 0x73, 0x30, 0xEA, 0x0C, 0x01, 0xDF, 0xC6, 0x8B, 0xE1, 0xEB, 0x52, 0x7C, 0x6F, - 0x5E, 0x0C, 0xDF, 0x1A, 0xC5, 0xB7, 0xB9, 0x68, 0x7C, 0x9F, 0x3C, 0xDB, 0x0F, 0x00, 0xD3, 0xD6, - 0xA2, 0x31, 0xED, 0xDB, 0xDF, 0xA8, 0x28, 0x76, 0xE6, 0x36, 0xB1, 0xC3, 0x6B, 0xD0, 0xDD, 0x1D, - 0xD4, 0xE9, 0x76, 0xB4, 0xAA, 0xA9, 0xBC, 0x7A, 0xCA, 0x53, 0x51, 0x67, 0xEE, 0x23, 0xF6, 0x68, - 0x3F, 0xF4, 0xC6, 0xE3, 0x8A, 0x7D, 0xC9, 0xE2, 0xDC, 0xD1, 0x72, 0x7F, 0xE0, 0xBA, 0x01, 0x47, - 0xDB, 0x9D, 0x27, 0xDA, 0xEF, 0x45, 0x2E, 0x84, 0x57, 0x56, 0xFA, 0x44, 0x6F, 0xC1, 0x32, 0x33, - 0x04, 0x77, 0x45, 0x13, 0x3C, 0xCC, 0x6E, 0x9F, 0x11, 0x5C, 0xE1, 0x4E, 0x1D, 0x3B, 0xC8, 0x5B, - 0xD6, 0x7C, 0xEB, 0xD8, 0xC3, 0xB8, 0x3F, 0x21, 0x8B, 0x48, 0xAD, 0x29, 0xE3, 0x23, 0xEB, 0x8D, - 0x52, 0xB5, 0x6F, 0xFF, 0x3D, 0xB7, 0xD6, 0xBD, 0xE9, 0x59, 0xB0, 0xCA, 0x9D, 0x1C, 0xE6, 0xD5, - 0xD4, 0xAC, 0xA8, 0x79, 0x4D, 0x2C, 0xF3, 0xD9, 0xBF, 0xC4, 0x63, 0xD3, 0x76, 0x48, 0x8F, 0xF3, - 0x2A, 0x4F, 0x3C, 0x17, 0xEE, 0xD7, 0x0D, 0x70, 0xA9, 0x2A, 0x58, 0xB7, 0x53, 0xA2, 0x6E, 0xB7, - 0x44, 0xDD, 0xD5, 0x12, 0x75, 0xD7, 0x4A, 0xD4, 0x5D, 0x2F, 0x51, 0x77, 0xA3, 0x44, 0xDD, 0x37, - 0x45, 0xEA, 0x7A, 0xA6, 0x65, 0xBB, 0x67, 0x7B, 0x07, 0xB9, 0x83, 0x86, 0x1F, 0xEC, 0x01, 0xDE, - 0xBF, 0xCA, 0x97, 0x88, 0x91, 0x3B, 0x0C, 0x7D, 0x2B, 0xF3, 0xAA, 0xDE, 0x9A, 0x01, 0x99, 0x73, - 0xCF, 0x3D, 0xEC, 0x0D, 0x30, 0x6C, 0xC3, 0xE2, 0xDA, 0x09, 0x55, 0x43, 0x34, 0x8B, 0x6D, 0xC9, - 0x9B, 0x43, 0xD9, 0x09, 0x22, 0x77, 0xEF, 0xE7, 0x05, 0xDF, 0x12, 0x82, 0xAA, 0x43, 0xA3, 0xAD, - 0x98, 0x81, 0x38, 0xBD, 0xD9, 0xF5, 0x64, 0x48, 0xD8, 0x8B, 0x6B, 0x33, 0x91, 0x3D, 0x80, 0xFB, - 0x43, 0x6F, 0x7C, 0x09, 0xAE, 0x8E, 0x1A, 0x82, 0xA9, 0x0B, 0x24, 0xDC, 0x4B, 0x12, 0x8D, 0x8A, - 0x1B, 0xCD, 0x0A, 0x90, 0xC1, 0x5B, 0xF2, 0x12, 0x0F, 0xB0, 0x3D, 0xD1, 0xC1, 0x4F, 0x56, 0x52, - 0x91, 0xE4, 0xA1, 0xE1, 0xD2, 0xC8, 0xFC, 0x6A, 0x75, 0x18, 0xA6, 0x9E, 0x47, 0x46, 0xBF, 0x27, - 0x56, 0xD3, 0x32, 0xF9, 0xCF, 0x8D, 0x1A, 0x3D, 0xB8, 0xFC, 0x06, 0x2E, 0xE0, 0x3B, 0x1C, 0xEC, - 0x25, 0xC8, 0xEF, 0xD7, 0xDF, 0xD8, 0xD1, 0x05, 0xDC, 0x5D, 0xB4, 0xE0, 0x96, 0x50, 0xED, 0x2B, - 0x19, 0x06, 0xD2, 0x66, 0xD2, 0x60, 0x07, 0x1E, 0x0C, 0xDE, 0xE0, 0xE0, 0xE1, 0x52, 0x8A, 0x65, - 0xE1, 0xEE, 0xFF, 0x7A, 0x02, 0xFE, 0xE4, 0x21, 0xDB, 0x35, 0x9D, 0xD2, 0x57, 0x6C, 0xCC, 0x80, - 0x0C, 0xF6, 0xD2, 0x53, 0x3F, 0x17, 0x15, 0xAB, 0xD6, 0xE0, 0x9E, 0x59, 0xC5, 0x0F, 0x46, 0xB1, - 0xCB, 0xB6, 0x76, 0x56, 0x88, 0x0E, 0xDD, 0x5A, 0xF1, 0x9F, 0x71, 0x72, 0x0A, 0x8E, 0xE1, 0x59, - 0xF8, 0xE9, 0xC2, 0xBD, 0x48, 0xFC, 0x7B, 0xA3, 0xAC, 0xFE, 0x33, 0xD7, 0xF4, 0x45, 0xE0, 0xA7, - 0x1E, 0xEE, 0x1A, 0xCC, 0xA1, 0xE7, 0xFB, 0xA2, 0x70, 0x7E, 0x4E, 0xC1, 0xF9, 0x79, 0x81, 0x38, - 0xBF, 0xA4, 0xE0, 0xFC, 0xB2, 0x28, 0x9C, 0xFE, 0xC4, 0x71, 0x1F, 0x7B, 0x18, 0x7B, 0x07, 0xE0, - 0x6F, 0xA8, 0xC1, 0x1E, 0x6D, 0x73, 0x91, 0xD1, 0xD4, 0x5B, 0x2A, 0x26, 0xA4, 0x35, 0x59, 0x25, - 0x55, 0xFB, 0x44, 0xAD, 0x56, 0x86, 0x10, 0x0E, 0x24, 0x65, 0xD9, 0xD1, 0xA2, 0x58, 0xA2, 0xBD, - 0x05, 0xFD, 0xF5, 0xEE, 0xD6, 0xDB, 0x2D, 0x85, 0xCD, 0x67, 0x87, 0x6F, 0xF0, 0xB6, 0xD7, 0xAE, - 0x1B, 0x91, 0x2F, 0x7E, 0x7B, 0x32, 0xF5, 0xEF, 0x4B, 0x6B, 0x0C, 0x0E, 0x3E, 0xF4, 0xDA, 0x4F, - 0x47, 0x11, 0xD6, 0xA8, 0x86, 0xE6, 0x6E, 0xCC, 0x36, 0x12, 0x09, 0xE8, 0x4A, 0x0C, 0x47, 0x49, - 0x99, 0xB8, 0x1B, 0xB3, 0x6D, 0xB0, 0x46, 0x9B, 0x8A, 0x91, 0x12, 0xD4, 0x84, 0x15, 0x78, 0xC8, - 0x1C, 0xD9, 0x43, 0x67, 0xA7, 0x3E, 0xC2, 0x77, 0x41, 0xD2, 0xFE, 0xA5, 0x6B, 0x62, 0xED, 0xC2, - 0x5A, 0x24, 0xD1, 0x08, 0x63, 0xB8, 0x02, 0x05, 0x85, 0x9B, 0x87, 0x23, 0x5F, 0xBC, 0x15, 0xB7, - 0xF8, 0xA9, 0x86, 0x3D, 0xB0, 0xE7, 0xE9, 0xE8, 0xA9, 0x23, 0xBA, 0x94, 0xD6, 0x01, 0xD8, 0xC9, - 0x61, 0x3D, 0xCD, 0x52, 0x88, 0x04, 0x0F, 0x57, 0x6A, 0x84, 0xAB, 0xEF, 0x16, 0xA5, 0x69, 0x25, - 0x28, 0x29, 0xB5, 0x64, 0xBC, 0x49, 0x63, 0xCD, 0xC0, 0x40, 0x60, 0x07, 0xD0, 0x5E, 0x6E, 0x0D, - 0x9D, 0xDE, 0x3E, 0x85, 0x91, 0x31, 0x26, 0x5F, 0xA8, 0xC9, 0x61, 0x0B, 0xC9, 0x9F, 0x6F, 0xAE, - 0xF7, 0x7F, 0xBD, 0x39, 0x3F, 0x3B, 0xDA, 0xBB, 0x39, 0xBC, 0x3A, 0x53, 0xCA, 0x20, 0x8A, 0x85, - 0x96, 0x43, 0x64, 0xCD, 0x4D, 0xC7, 0x30, 0xD6, 0x65, 0xB2, 0x84, 0x50, 0x19, 0x2E, 0x89, 0xB6, - 0xB5, 0x9D, 0x5A, 0xE5, 0x92, 0x79, 0xD6, 0x26, 0xB5, 0x9C, 0x02, 0xE6, 0x94, 0xDA, 0x8C, 0xB5, - 0xEE, 0xB5, 0x42, 0xCD, 0x43, 0xEE, 0x35, 0x1E, 0xB7, 0x0B, 0xBD, 0xC7, 0x6F, 0x12, 0x27, 0x58, - 0xE0, 0x8C, 0xD0, 0x2C, 0x74, 0x1E, 0x27, 0x07, 0xFB, 0xB5, 0xD4, 0xBB, 0xCE, 0xB1, 0x14, 0xE7, - 0x23, 0xB4, 0xFE, 0xAD, 0xFB, 0x75, 0x3B, 0x8F, 0x8D, 0x3B, 0x08, 0x7E, 0xD5, 0x9B, 0x14, 0xD4, - 0x20, 0xA2, 0x3F, 0xED, 0x88, 0xB8, 0x52, 0xCD, 0x0C, 0xC9, 0xD8, 0x23, 0xA1, 0x55, 0xCA, 0x89, - 0x5D, 0x0C, 0x63, 0xA2, 0x12, 0x79, 0xEF, 0x69, 0xCD, 0xD1, 0xDF, 0x75, 0x2E, 0x60, 0x9A, 0x11, - 0x91, 0xB9, 0x00, 0x93, 0xE8, 0x86, 0x7A, 0xF4, 0x0B, 0x9F, 0x57, 0x53, 0x99, 0x43, 0x65, 0x68, - 0xCD, 0x78, 0xD3, 0xBD, 0x31, 0x08, 0xA8, 0xE8, 0x2F, 0x3D, 0x93, 0x34, 0xA3, 0xB5, 0xB3, 0x83, - 0xD6, 0x53, 0xB9, 0x53, 0x95, 0x58, 0xED, 0xE7, 0xB5, 0xB2, 0x7D, 0xB8, 0x31, 0x8A, 0x98, 0x3E, - 0xE4, 0x0F, 0x89, 0xB1, 0x51, 0xEF, 0x5C, 0x86, 0x9E, 0x3B, 0x9D, 0x20, 0xCF, 0x7D, 0x64, 0x2A, - 0x6C, 0xEC, 0x0F, 0x05, 0x3A, 0x23, 0x25, 0x96, 0x18, 0xCF, 0x04, 0x5C, 0x76, 0x05, 0x43, 0x6F, - 0x5A, 0x74, 0x00, 0x42, 0x9C, 0x03, 0x77, 0xB4, 0xEC, 0x8F, 0x97, 0xD7, 0x10, 0xFC, 0xB2, 0x41, - 0xFF, 0xA5, 0x64, 0xB0, 0x9B, 0x9A, 0x5D, 0xA5, 0x29, 0x63, 0x32, 0x69, 0xFF, 0x36, 0xED, 0x6E, - 0x26, 0xAB, 0x7F, 0x12, 0xAE, 0xB5, 0xBA, 0xAC, 0xB9, 0x59, 0xC8, 0xA1, 0xA2, 0x8F, 0x5D, 0x27, - 0xF0, 0xDC, 0x51, 0x3D, 0x0F, 0x49, 0xA4, 0xEC, 0x13, 0xBD, 0xE4, 0xD7, 0x3B, 0x42, 0x19, 0x55, - 0x47, 0xC5, 0x58, 0x38, 0x49, 0x83, 0x7B, 0xE4, 0x79, 0x6E, 0x4C, 0xAA, 0xED, 0x8C, 0x6C, 0x07, - 0xB3, 0x6F, 0x64, 0x91, 0x98, 0xE4, 0x03, 0xA6, 0x17, 0x44, 0xC9, 0x6B, 0xA2, 0x7C, 0xCD, 0x0E, - 0x8E, 0x29, 0x82, 0x70, 0xFA, 0xDA, 0x5B, 0x1C, 0x94, 0xA8, 0x46, 0x15, 0xD4, 0xFB, 0x1E, 0x51, - 0x51, 0xF9, 0x75, 0x41, 0xBA, 0x2F, 0xDD, 0x07, 0xEC, 0x51, 0xA9, 0x27, 0xCA, 0xBF, 0x53, 0xAC, - 0x0D, 0x5D, 0x34, 0xF4, 0x4D, 0x2A, 0xAD, 0x17, 0x34, 0xDC, 0xE8, 0x98, 0x1C, 0xEF, 0x02, 0x75, - 0xFF, 0xF4, 0x22, 0x6B, 0x47, 0x8E, 0x66, 0xE9, 0x7C, 0xDD, 0xFE, 0x39, 0xB3, 0x7F, 0xCE, 0xEC, - 0xB9, 0xCD, 0x6C, 0x21, 0x58, 0x96, 0x87, 0xC9, 0x3E, 0x6B, 0xE6, 0xB6, 0x1C, 0x56, 0x9B, 0x35, - 0x97, 0xE2, 0x5A, 0x21, 0xB8, 0x70, 0x4A, 0x9D, 0x38, 0xA9, 0x13, 0x2A, 0x6E, 0xC4, 0x67, 0x8A, - 0x8C, 0x2B, 0x7D, 0xB2, 0x24, 0xE9, 0x0A, 0xE7, 0x8C, 0x0C, 0x52, 0x37, 0x6D, 0x80, 0x15, 0xFA, - 0x60, 0xE2, 0x70, 0x07, 0xF0, 0x4E, 0x1F, 0x8C, 0xAC, 0xDD, 0x14, 0xA4, 0x40, 0xA2, 0xC7, 0x30, - 0x0D, 0x85, 0xCD, 0xED, 0x02, 0x20, 0xE2, 0xB8, 0x65, 0x15, 0x4E, 0xC8, 0xDB, 0x02, 0x81, 0x21, - 0x7A, 0xF7, 0x81, 0x28, 0xDC, 0xF0, 0xCA, 0x75, 0xD1, 0xD8, 0x74, 0x9E, 0x45, 0xEC, 0xC8, 0x67, - 0x1D, 0xAD, 0x95, 0xB3, 0x70, 0xC2, 0x61, 0xC5, 0x76, 0x86, 0x42, 0x74, 0xB7, 0xCE, 0x00, 0x99, - 0xAC, 0x55, 0xEE, 0x90, 0xE1, 0xC4, 0x0D, 0xD3, 0x2D, 0xCB, 0xC9, 0x4A, 0x15, 0x8C, 0x74, 0xD4, - 0x17, 0x21, 0xBB, 0x37, 0xC9, 0x4A, 0xE5, 0x3A, 0xE3, 0x06, 0x66, 0xD8, 0x30, 0xD5, 0xE4, 0x98, - 0xA8, 0x53, 0xBA, 0x2B, 0xDC, 0xF2, 0x7F, 0x42, 0x06, 0x3E, 0xBE, 0x2C, 0xD0, 0x9A, 0x45, 0xB4, - 0x35, 0xDB, 0xBE, 0x37, 0xA8, 0x62, 0x4A, 0x4F, 0x44, 0x00, 0x6B, 0x2D, 0xDE, 0xBA, 0x38, 0xE1, - 0xB2, 0xF6, 0x05, 0x9E, 0x43, 0x43, 0x6B, 0x61, 0x88, 0xD2, 0x6B, 0x54, 0x02, 0xEA, 0xC2, 0xA5, - 0x59, 0x0A, 0x54, 0x96, 0xA1, 0x23, 0x01, 0x56, 0xBC, 0x68, 0xA4, 0x07, 0x78, 0x74, 0xEB, 0x3E, - 0x61, 0x1F, 0xAD, 0x20, 0x7A, 0xFD, 0x83, 0x6E, 0xA7, 0x41, 0x20, 0xF9, 0xB1, 0x14, 0x8C, 0x81, - 0x0D, 0xBC, 0x67, 0x9D, 0xE2, 0xE1, 0x26, 0x3B, 0x6E, 0x67, 0xD7, 0x47, 0x92, 0x7E, 0x47, 0x03, - 0x33, 0x18, 0xDC, 0xA3, 0x06, 0x86, 0x15, 0x25, 0x45, 0x7F, 0x89, 0x81, 0xD4, 0xBE, 0x3F, 0xC5, - 0xE8, 0xD1, 0x26, 0x3A, 0xF0, 0xE4, 0x30, 0x0C, 0x47, 0x2E, 0x19, 0x6D, 0x9B, 0x13, 0x2D, 0x5C, - 0xB4, 0x37, 0x61, 0x0E, 0x8A, 0x17, 0xEE, 0x8E, 0x38, 0x88, 0x7B, 0xA3, 0x11, 0xF2, 0xF0, 0x70, - 0x3A, 0x82, 0x18, 0x6F, 0xBA, 0xBD, 0x60, 0x03, 0x6A, 0x3A, 0x16, 0xDB, 0x0C, 0xA8, 0x63, 0x59, - 0xAA, 0xAB, 0x14, 0x82, 0xD6, 0x4C, 0xF1, 0x42, 0xA3, 0xF6, 0x5D, 0x1B, 0x4B, 0x1F, 0x46, 0xDC, - 0x21, 0xB8, 0xE7, 0xC0, 0x62, 0xB0, 0x1C, 0x35, 0x9F, 0xB2, 0x0B, 0x9F, 0x83, 0x7B, 0xD3, 0x19, - 0x62, 0xBE, 0x21, 0x57, 0xAC, 0xB5, 0xF5, 0xFA, 0x76, 0x5C, 0x9F, 0x5E, 0x9C, 0xF1, 0x5B, 0xA2, - 0x33, 0xB2, 0xFD, 0xD4, 0x54, 0x0D, 0xA9, 0x38, 0x74, 0x9D, 0x7A, 0x80, 0xA6, 0x2C, 0x2E, 0x9A, - 0x08, 0x92, 0x49, 0xB8, 0xFF, 0x88, 0xC1, 0xBE, 0x89, 0xED, 0x07, 0x22, 0x12, 0x8F, 0xA6, 0x2F, - 0x68, 0x0D, 0x32, 0x20, 0x77, 0x2E, 0xCF, 0x21, 0x44, 0x84, 0x4E, 0x0D, 0xAB, 0x66, 0xB3, 0x41, - 0x62, 0x5D, 0x46, 0x96, 0x93, 0x78, 0xC8, 0x8F, 0x5D, 0xB2, 0xFE, 0x91, 0xC1, 0xA4, 0x59, 0x7B, - 0x38, 0x31, 0xC2, 0x28, 0x43, 0x97, 0xC6, 0xD8, 0xF4, 0xA7, 0x1E, 0xAD, 0x00, 0xFB, 0xBF, 0x0F, - 0x7F, 0x27, 0x9D, 0xB2, 0x6C, 0x7F, 0x02, 0x43, 0x46, 0xD3, 0x21, 0x81, 0xD3, 0x02, 0x3A, 0x98, - 0xFA, 0x81, 0x3B, 0x66, 0x7F, 0xD7, 0x07, 0x94, 0x5D, 0xF5, 0xA6, 0x38, 0x26, 0x1A, 0x50, 0x7D, - 0x3C, 0xA8, 0x0E, 0x0B, 0xC2, 0x39, 0x41, 0x8B, 0xB2, 0xE0, 0xC3, 0x13, 0x67, 0x76, 0x48, 0xC7, - 0xA0, 0xEC, 0xAA, 0x83, 0xA1, 0xBA, 0x72, 0x9F, 0x06, 0x99, 0x8A, 0xC9, 0x1F, 0x98, 0xA5, 0x7C, - 0xCE, 0x40, 0xDF, 0x63, 0xB7, 0x3A, 0x4C, 0xEC, 0x80, 0x35, 0xF5, 0x3C, 0xF0, 0xEC, 0x49, 0x1F, - 0x13, 0xE6, 0x79, 0x73, 0x01, 0x75, 0x30, 0xB2, 0xE9, 0x6D, 0x7B, 0x55, 0x50, 0x90, 0x33, 0x02, - 0xDC, 0x08, 0x61, 0xAA, 0x39, 0xE0, 0xE3, 0x33, 0x1B, 0x4D, 0x3D, 0xD7, 0x76, 0x82, 0x1E, 0xF6, - 0xEE, 0xC8, 0x56, 0x4F, 0xD8, 0xD9, 0xCE, 0x0A, 0xF6, 0xE8, 0x89, 0x6C, 0x1B, 0x1C, 0x73, 0xD4, - 0x9B, 0x52, 0x65, 0x3F, 0x23, 0x30, 0x7F, 0x72, 0xEE, 0x3E, 0x56, 0x87, 0x62, 0x3A, 0x01, 0x76, - 0x1C, 0xF3, 0x12, 0xDF, 0x61, 0x0F, 0x3B, 0x03, 0xD6, 0xE7, 0x59, 0x89, 0x3A, 0x75, 0x87, 0x43, - 0xEA, 0x41, 0x33, 0x1B, 0x98, 0xBD, 0xCB, 0x5E, 0x25, 0x48, 0x31, 0x2C, 0xA6, 0x8C, 0x60, 0xFA, - 0x40, 0xEA, 0x29, 0x69, 0xBB, 0xC9, 0x8A, 0xC2, 0x2B, 0xA0, 0x44, 0x71, 0x30, 0xE0, 0xD2, 0xB8, - 0x0F, 0xCB, 0x97, 0x5A, 0xC4, 0x64, 0x3E, 0x59, 0x34, 0xB5, 0x26, 0xC9, 0x8F, 0xD6, 0xFD, 0x60, - 0x72, 0xC4, 0x03, 0xBE, 0x35, 0x24, 0x90, 0x0D, 0x17, 0xEC, 0x8E, 0x34, 0x25, 0x07, 0x89, 0xE3, - 0xA6, 0xAD, 0x92, 0xA2, 0x84, 0x7E, 0x87, 0xC8, 0x49, 0x51, 0xB4, 0x5E, 0xC9, 0xC9, 0xD7, 0x68, - 0x64, 0x37, 0x59, 0xE9, 0x42, 0x2D, 0xCF, 0x17, 0x56, 0x3F, 0x78, 0x26, 0x8B, 0x19, 0xF0, 0x78, - 0x44, 0xF3, 0xDC, 0xD5, 0x1C, 0xD7, 0xC1, 0xB5, 0x44, 0xEA, 0x36, 0x1A, 0x70, 0x5E, 0xA0, 0xF5, - 0xED, 0xC8, 0x1D, 0x7C, 0x8B, 0x9A, 0x93, 0xAD, 0x9D, 0x87, 0x61, 0xFD, 0x38, 0xE8, 0x7F, 0x44, - 0x2E, 0x5B, 0xA5, 0xB8, 0xF7, 0x32, 0x4D, 0xF3, 0x22, 0x22, 0xE0, 0x49, 0xB2, 0xE2, 0xB4, 0x75, - 0x2C, 0x75, 0x16, 0xAD, 0x0C, 0xCD, 0x25, 0xEB, 0xD1, 0xCA, 0xCA, 0x49, 0xBC, 0xC5, 0x88, 0xAB, - 0x0F, 0x46, 0x3E, 0xCF, 0x21, 0x07, 0x11, 0x50, 0x51, 0xFE, 0x91, 0xFF, 0x98, 0x92, 0xDD, 0x3A, - 0x4B, 0x93, 0xE6, 0x7A, 0x64, 0x9F, 0xD2, 0xA8, 0xB5, 0x45, 0x2B, 0x47, 0x0B, 0xB1, 0x3F, 0x2D, - 0xCF, 0x9D, 0x58, 0xEE, 0xA3, 0x53, 0xCB, 0x4A, 0x73, 0x23, 0xA0, 0xE0, 0x07, 0x60, 0xF2, 0x7D, - 0x69, 0x49, 0x5A, 0x3C, 0x05, 0xAA, 0x97, 0x76, 0xC4, 0x16, 0xBF, 0x3D, 0x7D, 0x6D, 0xF3, 0x8C, - 0x35, 0xD4, 0x2F, 0x44, 0x2E, 0x61, 0x7B, 0x1C, 0x5A, 0xB8, 0x1D, 0x0D, 0x62, 0xD8, 0x5F, 0x61, - 0x8F, 0xDC, 0xD2, 0x6D, 0x91, 0x57, 0x56, 0x2E, 0xF1, 0xD8, 0x7D, 0xC0, 0xF4, 0xC6, 0x0B, 0xCE, - 0xAA, 0x70, 0x33, 0x46, 0xFF, 0xE0, 0x15, 0xCA, 0xF2, 0x26, 0xBE, 0x6B, 0x7B, 0xEB, 0xB8, 0x41, - 0xA3, 0xAD, 0x5E, 0xB8, 0x35, 0x43, 0xB6, 0x51, 0x62, 0x7E, 0x14, 0xCF, 0xC2, 0x2D, 0xB0, 0x96, - 0x6B, 0x3A, 0x5A, 0xC4, 0x4B, 0xE6, 0x62, 0xB4, 0x48, 0xB7, 0xD6, 0x04, 0x11, 0xE4, 0xAB, 0xA9, - 0xB7, 0xEA, 0xE4, 0x5F, 0x01, 0x16, 0xA1, 0xA5, 0x34, 0x0D, 0xD1, 0x2D, 0x74, 0x39, 0x3A, 0xA2, - 0xEB, 0x6D, 0x1D, 0x2D, 0x61, 0x61, 0x29, 0x7A, 0x32, 0xED, 0x3B, 0xB9, 0x64, 0x69, 0x6C, 0x63, - 0xF4, 0xEE, 0x46, 0x0F, 0x95, 0x11, 0xC6, 0x68, 0xCE, 0x30, 0xE5, 0xA4, 0xD2, 0xAF, 0x6C, 0xBF, - 0x1D, 0xB2, 0xAD, 0x19, 0xB2, 0x5D, 0x7C, 0x4C, 0x56, 0x32, 0x9F, 0x25, 0x68, 0x97, 0x86, 0x5C, - 0x81, 0x55, 0x51, 0x72, 0xF3, 0x11, 0x9E, 0xC4, 0xE9, 0xFB, 0x1A, 0x61, 0x61, 0x0B, 0x75, 0x0D, - 0xC3, 0x68, 0x6A, 0x95, 0x22, 0xB5, 0x3E, 0x12, 0x5D, 0xD8, 0x42, 0xF4, 0xFC, 0x01, 0xA6, 0x46, - 0x59, 0x49, 0x42, 0x6F, 0x99, 0x89, 0x52, 0xD9, 0xCE, 0x83, 0xF7, 0x04, 0x2D, 0x78, 0x8B, 0x80, - 0x19, 0x51, 0x73, 0x86, 0x26, 0x42, 0x32, 0x18, 0x61, 0xD3, 0x0B, 0xB1, 0x14, 0x04, 0x5D, 0xD7, - 0x92, 0xDA, 0x9F, 0x0E, 0x06, 0xE4, 0x10, 0x42, 0x89, 0x15, 0xF3, 0x83, 0x45, 0xB0, 0x78, 0x05, - 0x1D, 0xA1, 0x75, 0x96, 0x22, 0x4C, 0x47, 0x5B, 0x0C, 0xB6, 0x30, 0x44, 0x3D, 0x7D, 0xE4, 0xC8, - 0x13, 0xD2, 0xC6, 0xB9, 0x19, 0x9E, 0x3B, 0xE2, 0x0C, 0xA8, 0x77, 0xFC, 0x9C, 0xA7, 0x3D, 0xB4, - 0x68, 0x8E, 0x90, 0xE1, 0x49, 0x19, 0x0C, 0xC6, 0xB0, 0xD4, 0xB7, 0x3D, 0xAA, 0x25, 0x1B, 0xDC, - 0x76, 0x1C, 0xD1, 0xB7, 0x9D, 0xD3, 0x0C, 0xDC, 0xAB, 0x25, 0x7B, 0x73, 0x8A, 0x69, 0x89, 0x9D, - 0x45, 0xFF, 0xA1, 0x9C, 0x1A, 0xD5, 0xF3, 0x6E, 0x79, 0x42, 0x93, 0x48, 0xF3, 0xC8, 0xD4, 0x75, - 0x2D, 0x97, 0x50, 0x8D, 0x67, 0x53, 0xC6, 0xF0, 0xF3, 0x41, 0x8B, 0xA7, 0x80, 0x28, 0x55, 0xE2, - 0x88, 0xD6, 0xB8, 0x9C, 0xF3, 0x44, 0x73, 0xB1, 0x97, 0x63, 0x42, 0x98, 0x04, 0x19, 0x50, 0xF7, - 0x1A, 0x7A, 0x09, 0xA2, 0x59, 0x55, 0x01, 0x3A, 0x75, 0xA4, 0xE2, 0x39, 0x50, 0x45, 0xA8, 0xB0, - 0x40, 0xF0, 0xB3, 0xF7, 0x47, 0x58, 0x60, 0x45, 0x39, 0xA5, 0x85, 0x7C, 0x39, 0x09, 0x0B, 0x5B, - 0x90, 0xBB, 0xB2, 0xBB, 0xBE, 0x4E, 0xA8, 0x3E, 0x23, 0xFB, 0x4C, 0x74, 0x8B, 0xC9, 0xFF, 0x82, - 0x47, 0x8C, 0x1D, 0x64, 0x50, 0x63, 0x06, 0x29, 0xAB, 0xB5, 0x40, 0xED, 0x8D, 0x46, 0xE6, 0xC4, - 0xC7, 0xEF, 0xCF, 0xFB, 0x7D, 0x96, 0x50, 0x87, 0x1E, 0xD9, 0x13, 0x92, 0x9D, 0x20, 0x00, 0x0E, - 0x64, 0x0B, 0x25, 0x02, 0x10, 0x14, 0x21, 0xE4, 0xFA, 0x6C, 0x6B, 0xD3, 0x28, 0x44, 0xC9, 0x46, - 0x3A, 0x21, 0x1B, 0xB3, 0x31, 0x83, 0xD2, 0x50, 0x98, 0x23, 0xD5, 0xE8, 0x48, 0xE3, 0x07, 0xAF, - 0xDB, 0x67, 0x4B, 0x10, 0xD1, 0xF6, 0x03, 0x16, 0x3B, 0x31, 0x30, 0x3D, 0x2C, 0x29, 0x71, 0x5E, - 0xA2, 0x9B, 0x9D, 0x20, 0xE5, 0xD1, 0x14, 0x23, 0x55, 0x59, 0x5B, 0xDD, 0x34, 0x26, 0x0B, 0xD7, - 0x32, 0x2D, 0x5D, 0x86, 0x3D, 0x66, 0xD9, 0x36, 0xD3, 0x49, 0x66, 0x0B, 0x36, 0xEF, 0x35, 0x28, - 0xE4, 0x2E, 0x93, 0x1D, 0xA6, 0x0D, 0xE7, 0x8B, 0x63, 0x1B, 0x8F, 0x2C, 0xBF, 0x21, 0x64, 0x88, - 0x3C, 0xE0, 0xCC, 0xE0, 0x5B, 0xF4, 0x81, 0x10, 0x44, 0xA8, 0xF2, 0x29, 0x62, 0x32, 0xB7, 0x54, - 0xF1, 0x6C, 0x52, 0x84, 0xFB, 0xA1, 0xBD, 0x0B, 0x48, 0x88, 0x36, 0x84, 0xA9, 0xCD, 0xE3, 0x31, - 0x82, 0xB6, 0x34, 0xEE, 0xB2, 0x6C, 0x43, 0x10, 0x32, 0xDE, 0x96, 0xFC, 0x5A, 0xB0, 0xF9, 0x7E, - 0x9C, 0xCA, 0x8B, 0xB4, 0xA5, 0x89, 0xBD, 0x2A, 0xE0, 0xA5, 0x42, 0xC5, 0xDB, 0x17, 0xC7, 0xDD, - 0xEB, 0x09, 0xDC, 0x12, 0x8D, 0x0C, 0x05, 0x9B, 0x0B, 0xD9, 0xBB, 0x28, 0x04, 0xF8, 0xB3, 0x58, - 0xD3, 0x4F, 0xF6, 0xB1, 0x1D, 0xB7, 0x7C, 0xB4, 0xEF, 0xEC, 0x82, 0x0D, 0xAF, 0x0E, 0x7A, 0xD7, - 0x87, 0x02, 0xD9, 0xE4, 0x10, 0x7C, 0x6D, 0x4D, 0x0A, 0x36, 0xA6, 0xAE, 0xF0, 0x71, 0x5B, 0x7A, - 0x54, 0x28, 0xD8, 0x34, 0x79, 0x06, 0x7E, 0x8E, 0x01, 0x09, 0x3B, 0xC7, 0x82, 0xE0, 0xFA, 0xCF, - 0x7E, 0x80, 0xC7, 0x31, 0x04, 0x9F, 0xFD, 0x5D, 0xAC, 0xF1, 0x91, 0x9C, 0xB5, 0x8D, 0x34, 0x8F, - 0xF2, 0xB8, 0x15, 0x03, 0x70, 0x7E, 0x25, 0x70, 0x10, 0x52, 0xBB, 0x15, 0x6B, 0x76, 0x2C, 0xA4, - 0xF1, 0x24, 0x0D, 0xC5, 0x23, 0x58, 0x04, 0x80, 0xEF, 0x30, 0x92, 0x4B, 0x20, 0x9B, 0xD8, 0x7C, - 0x92, 0x22, 0x86, 0x3E, 0xA9, 0x5F, 0x59, 0x90, 0x57, 0x1C, 0x12, 0x01, 0x77, 0x59, 0x2D, 0xC8, - 0xC1, 0xBC, 0xB6, 0x25, 0xE8, 0xDA, 0x0E, 0xC4, 0x19, 0xAF, 0x6D, 0x91, 0x96, 0xA6, 0x67, 0x0E, - 0x02, 0xEC, 0xF9, 0xA2, 0xB6, 0x95, 0x15, 0x41, 0x53, 0xC0, 0x0E, 0x53, 0x26, 0x15, 0x35, 0x53, - 0xED, 0x1A, 0x13, 0x71, 0x0B, 0x52, 0xE4, 0x1A, 0x46, 0xA7, 0xDB, 0xA2, 0x89, 0x7E, 0x93, 0x1A, - 0x9F, 0x95, 0x52, 0xBD, 0xDF, 0x31, 0x68, 0x03, 0x9D, 0x56, 0x89, 0xD8, 0x0B, 0x38, 0xE5, 0x98, - 0xEE, 0x46, 0x4C, 0xA4, 0x8E, 0x22, 0xDB, 0x21, 0x1F, 0x1E, 0x6A, 0x74, 0xCD, 0xD9, 0x32, 0x52, - 0xD7, 0x9C, 0x2D, 0xA3, 0x08, 0xE6, 0x04, 0xEC, 0x83, 0xF3, 0x8B, 0xD9, 0x40, 0xC7, 0x7B, 0xE1, - 0x34, 0x33, 0x6A, 0x74, 0x33, 0xA4, 0xD9, 0x25, 0xEB, 0x46, 0xDF, 0x89, 0x5B, 0x1F, 0x98, 0x84, - 0x4F, 0xDE, 0x07, 0xD7, 0x0F, 0xB8, 0x1C, 0xAC, 0x27, 0xE4, 0x60, 0x3D, 0x45, 0x0E, 0x34, 0x1C, - 0x48, 0xE1, 0x42, 0x02, 0x1F, 0x68, 0x36, 0x86, 0x6F, 0x0B, 0x7E, 0x54, 0x94, 0xF4, 0x63, 0x49, - 0x54, 0x9A, 0xBE, 0xD1, 0xE4, 0xBE, 0xCC, 0xD0, 0x49, 0x71, 0xAD, 0x1A, 0x2A, 0xA2, 0x55, 0xA3, - 0x7A, 0xDF, 0x58, 0x4F, 0xAE, 0x7D, 0xEC, 0x69, 0x3A, 0x08, 0x9F, 0xA9, 0x0A, 0x0C, 0xBE, 0x75, - 0x87, 0x6E, 0x7B, 0xE0, 0x8E, 0xE1, 0x2F, 0xF8, 0x8A, 0xC6, 0x40, 0xC0, 0x94, 0xAC, 0xBD, 0x44, - 0xA7, 0xD8, 0x64, 0x37, 0x3B, 0x36, 0xED, 0x11, 0x22, 0x2B, 0xBA, 0x47, 0xF6, 0x49, 0x8B, 0x20, - 0xE1, 0xF1, 0xF1, 0xB1, 0x3D, 0x5F, 0x32, 0x52, 0x8E, 0x39, 0xEC, 0xE8, 0xCA, 0x28, 0x4B, 0x97, - 0x31, 0x91, 0x25, 0x52, 0xBF, 0xB2, 0x5B, 0x73, 0x89, 0xE9, 0x76, 0x8C, 0x4E, 0xA1, 0x56, 0xD2, - 0xD8, 0xD7, 0x6E, 0x47, 0x96, 0x77, 0xD3, 0x9F, 0x98, 0xDE, 0xB7, 0xE3, 0xA9, 0xD3, 0xA9, 0x95, - 0x84, 0xD0, 0xFB, 0x54, 0x86, 0xD2, 0x90, 0xEF, 0x01, 0xF6, 0x83, 0xFF, 0x03, 0xFF, 0x94, 0xED, - 0x2A, 0x00, 0x20, 0x28, 0x09, 0x88, 0x9A, 0x6A, 0x2F, 0x17, 0xEA, 0x5E, 0x79, 0xA6, 0xE3, 0x8F, - 0xED, 0xE0, 0xFD, 0xFB, 0xBD, 0x5A, 0xCA, 0x4D, 0x77, 0xC2, 0x9E, 0x08, 0xBB, 0xBD, 0xEB, 0xFD, - 0x5F, 0x43, 0x47, 0x29, 0xD1, 0x9E, 0xBA, 0xB2, 0x32, 0xA6, 0x47, 0x44, 0xA8, 0x62, 0x5B, 0x3E, - 0xF2, 0x03, 0xD3, 0xA3, 0x86, 0x5B, 0x7A, 0x75, 0xAA, 0x78, 0xE1, 0xC6, 0x26, 0xD8, 0xB8, 0x20, - 0xDB, 0xCC, 0x58, 0x67, 0x71, 0x73, 0xB6, 0xF5, 0xAF, 0x3B, 0x0A, 0xAC, 0xAF, 0x99, 0x69, 0xC6, - 0x05, 0xF8, 0xA9, 0x06, 0xAA, 0xA4, 0x43, 0xA3, 0xD0, 0x8A, 0xD9, 0x13, 0xD5, 0xF9, 0x23, 0x9D, - 0x10, 0x85, 0xB6, 0x8A, 0x84, 0x97, 0x61, 0x0A, 0xF5, 0xB8, 0x9C, 0x23, 0x63, 0x28, 0xBC, 0x1F, - 0xCE, 0x1C, 0x7A, 0x56, 0xD3, 0x33, 0x48, 0x23, 0x5A, 0x70, 0xBA, 0xD3, 0x09, 0x57, 0x55, 0x86, - 0x68, 0x3D, 0x67, 0x7F, 0x38, 0x4F, 0xD8, 0x41, 0x3A, 0x5D, 0x6A, 0xE6, 0xD5, 0xDB, 0xD8, 0xF7, - 0xF7, 0x7F, 0x54, 0x97, 0x5F, 0x87, 0xE0, 0xC7, 0x96, 0x8A, 0x6C, 0xE9, 0xA7, 0x6F, 0xCC, 0x88, - 0x5B, 0xDE, 0x70, 0x9F, 0xA6, 0xF1, 0x39, 0x28, 0xBA, 0x4D, 0xE3, 0xBB, 0x26, 0xF7, 0x96, 0x2C, - 0x04, 0x0F, 0x3C, 0xD5, 0x33, 0x39, 0xEC, 0x5B, 0xB0, 0x2E, 0x6F, 0x80, 0x5D, 0xC4, 0xD0, 0xED, - 0x24, 0x37, 0x0C, 0xD8, 0xD1, 0x90, 0x32, 0x71, 0xF5, 0xDE, 0xD7, 0x27, 0xB2, 0xCE, 0xC6, 0xD6, - 0x73, 0x7D, 0x1B, 0xFE, 0xBB, 0x37, 0x18, 0x4C, 0xC9, 0xDE, 0xE8, 0x99, 0xED, 0x9E, 0xD6, 0xDB, - 0x1D, 0x0D, 0xD6, 0x4E, 0x9B, 0xA2, 0x5D, 0x6F, 0x67, 0xA1, 0x4D, 0x5B, 0xFA, 0xA8, 0xC7, 0xC2, - 0x11, 0x0D, 0x3C, 0x6D, 0x49, 0x4F, 0x2B, 0xA5, 0xAF, 0x96, 0x51, 0x93, 0xCF, 0xD0, 0x44, 0x78, - 0x72, 0xA9, 0x40, 0x93, 0x2F, 0xA4, 0x89, 0xF0, 0x14, 0x53, 0x4E, 0x8B, 0x53, 0x33, 0x00, 0xFB, - 0x3C, 0x6D, 0xD3, 0x36, 0xB6, 0x8C, 0xEE, 0xD6, 0xDA, 0x9B, 0xAD, 0xBC, 0x36, 0xAE, 0x33, 0xE4, - 0x8D, 0xD8, 0xD3, 0x52, 0x9B, 0xEB, 0xC6, 0xFA, 0x9B, 0x8D, 0x4E, 0x4E, 0xB3, 0xBD, 0x51, 0x60, - 0x07, 0x53, 0x8B, 0x1E, 0xC5, 0xD6, 0x37, 0x08, 0xB6, 0xCD, 0x0C, 0x44, 0xFC, 0x26, 0xFF, 0x03, - 0xB6, 0x87, 0xF7, 0x80, 0xC8, 0xC8, 0xAD, 0xAA, 0x5C, 0xFA, 0x0B, 0x4D, 0x0A, 0xED, 0xE4, 0x52, - 0xE4, 0x30, 0x1D, 0x6D, 0xB6, 0x28, 0x11, 0x51, 0x91, 0x65, 0x22, 0x9C, 0x31, 0xD9, 0x4E, 0x31, - 0x59, 0x93, 0xA7, 0xEA, 0x08, 0xCE, 0x30, 0x8A, 0xD5, 0x46, 0xB2, 0xE4, 0x68, 0x96, 0x1C, 0x51, - 0x8D, 0x53, 0xB1, 0x3C, 0xC7, 0xE5, 0xF9, 0xF6, 0xC6, 0xA0, 0x3F, 0x2D, 0x14, 0xFD, 0x12, 0xCD, - 0xEE, 0xB0, 0x0C, 0xA6, 0x36, 0xFF, 0xB5, 0x80, 0x56, 0xC9, 0xC3, 0xFA, 0xF9, 0x87, 0x60, 0xFD, - 0xB2, 0x10, 0xAC, 0xDF, 0xB3, 0xDD, 0x1B, 0x2B, 0xE8, 0xB9, 0x8A, 0xBA, 0xAE, 0x9C, 0xBE, 0xD3, - 0xB0, 0x2D, 0xF6, 0x4B, 0x21, 0xCB, 0xD9, 0x47, 0xEC, 0x41, 0xCE, 0x39, 0xF2, 0x6D, 0x85, 0xBA, - 0xF2, 0xC6, 0x91, 0x23, 0xC5, 0x18, 0x2E, 0xC8, 0xFF, 0x72, 0xA7, 0x63, 0xAC, 0xAE, 0xB5, 0xD0, - 0xE6, 0xA6, 0x64, 0x5B, 0x62, 0x9F, 0x81, 0xD9, 0x50, 0x50, 0x68, 0xD1, 0x48, 0x41, 0xA8, 0x4E, - 0x9D, 0x65, 0x78, 0xB1, 0xCF, 0x68, 0x21, 0xFE, 0x1F, 0x01, 0xE3, 0x3A, 0x1F, 0x5E, 0xFA, 0x4B, - 0x75, 0x91, 0x4A, 0x9B, 0x7C, 0xCB, 0x5D, 0x83, 0xCC, 0x74, 0x7A, 0x6D, 0xDC, 0x96, 0x10, 0xD3, - 0x0F, 0x80, 0x98, 0xFE, 0x52, 0x5C, 0xAA, 0xBE, 0x67, 0x18, 0x7D, 0x22, 0x37, 0xBC, 0x4A, 0x46, - 0x1F, 0xD6, 0x3A, 0x3E, 0x90, 0xDF, 0x18, 0xA5, 0xCD, 0x7F, 0x31, 0xE9, 0xE7, 0x57, 0x97, 0x27, - 0xBD, 0x42, 0xB6, 0x1F, 0x11, 0x2D, 0x9C, 0xE4, 0x43, 0xB4, 0xC5, 0xAC, 0x3F, 0x45, 0x31, 0x6A, - 0x7A, 0x1A, 0x1F, 0xE2, 0x17, 0xD8, 0xD3, 0x4C, 0xBC, 0xBD, 0x4F, 0x73, 0xC4, 0x5C, 0xDC, 0xF2, - 0xA2, 0x1D, 0xE8, 0x12, 0xB6, 0x17, 0xED, 0x88, 0x15, 0xB0, 0xBE, 0x88, 0xED, 0xC0, 0x90, 0xC1, - 0xF0, 0x96, 0xB2, 0x85, 0xA8, 0x20, 0x38, 0x07, 0x6B, 0xC5, 0xDA, 0x29, 0x23, 0xCE, 0x4C, 0x3F, - 0xD6, 0xA3, 0x13, 0x3C, 0x3A, 0xDD, 0xB2, 0x10, 0x42, 0xCC, 0x9F, 0x2E, 0xD7, 0x1F, 0x2F, 0xDD, - 0xB5, 0x0F, 0x65, 0x28, 0xA7, 0x4C, 0xEF, 0x14, 0xA7, 0x5B, 0x60, 0x75, 0x27, 0x7B, 0x57, 0xA7, - 0xE7, 0x73, 0x69, 0x54, 0x9C, 0xB5, 0x9D, 0x4A, 0xAC, 0xAD, 0xD4, 0xAA, 0x1C, 0x36, 0x81, 0x8D, - 0xDD, 0x4A, 0x6C, 0xEC, 0x56, 0x61, 0x63, 0xB7, 0x22, 0x1B, 0xBB, 0x95, 0xD8, 0xD8, 0xAD, 0xC8, - 0xC6, 0x6E, 0x25, 0x36, 0xAE, 0x56, 0x62, 0xE3, 0x6A, 0x15, 0x36, 0xAE, 0x56, 0x64, 0xE3, 0x6A, - 0x25, 0x36, 0xAE, 0x56, 0x64, 0xA3, 0xDC, 0x4E, 0x38, 0xD5, 0x8B, 0x1E, 0xE1, 0xDA, 0xD3, 0x7D, - 0x9E, 0xE3, 0x78, 0xD6, 0xE2, 0x1C, 0x06, 0xB7, 0xD0, 0x98, 0x11, 0x01, 0xC2, 0x21, 0x4D, 0x70, - 0xC7, 0x6F, 0xD7, 0xAE, 0xDC, 0x6F, 0x18, 0x6C, 0x06, 0xB4, 0xF2, 0xB6, 0x7C, 0x58, 0xA2, 0xDF, - 0xA2, 0xFC, 0x19, 0x89, 0x8C, 0x41, 0xDA, 0xFB, 0xBE, 0x6C, 0x3C, 0x2D, 0xB4, 0xBA, 0xC1, 0xFE, - 0x1F, 0x2D, 0x50, 0xAB, 0x1B, 0x69, 0xD7, 0x7F, 0xBD, 0x2A, 0xD7, 0x01, 0xB9, 0x04, 0x24, 0x8D, - 0xDD, 0xE6, 0x34, 0x70, 0x7F, 0xC1, 0xCF, 0x97, 0xD8, 0xC1, 0x8F, 0xE6, 0xA8, 0x80, 0x91, 0x1B, - 0x2E, 0xBD, 0x73, 0x6F, 0x3E, 0xE1, 0x2E, 0xFC, 0x1C, 0x07, 0x8F, 0xAE, 0xF7, 0xED, 0xC6, 0xE8, - 0xF7, 0x4F, 0x0E, 0xD9, 0xE5, 0x9C, 0xB4, 0x38, 0x1B, 0x99, 0x8B, 0xB3, 0x70, 0xB7, 0xAE, 0xBB, - 0xF9, 0xD3, 0x22, 0xEA, 0x99, 0xBE, 0x4F, 0x7E, 0xB3, 0x5E, 0x02, 0x59, 0xE7, 0xA5, 0x7A, 0xD5, - 0x79, 0xC9, 0x5E, 0x75, 0x5F, 0xAA, 0x57, 0xDD, 0x97, 0xEC, 0xD5, 0xEA, 0x4B, 0xF5, 0x6A, 0x75, - 0x9E, 0xBD, 0x92, 0xB5, 0xE0, 0xD5, 0x20, 0x79, 0x13, 0x5D, 0xF8, 0x54, 0x12, 0xC5, 0x5F, 0xC4, - 0x57, 0xC2, 0x1B, 0xEB, 0xEB, 0xAB, 0x89, 0x5B, 0x68, 0xFA, 0x31, 0x87, 0xAC, 0xEF, 0x29, 0xD4, - 0x55, 0x3E, 0x32, 0x45, 0x11, 0x20, 0x8B, 0x22, 0xEE, 0xDA, 0xAA, 0x4E, 0xDC, 0xD4, 0x9A, 0x3B, - 0x71, 0x2B, 0x2B, 0x17, 0x0E, 0x0A, 0xBD, 0x5F, 0x5A, 0xE8, 0xEA, 0xA0, 0x87, 0xD8, 0xE0, 0x50, - 0x27, 0x05, 0x86, 0x0D, 0x0D, 0x4C, 0x07, 0x39, 0x2E, 0x85, 0xCF, 0x3A, 0x61, 0x21, 0x33, 0x80, - 0x5B, 0x64, 0xE4, 0x83, 0x9D, 0x3D, 0xB0, 0xC7, 0x38, 0x32, 0x8E, 0x4F, 0x09, 0x14, 0xD7, 0x41, - 0x80, 0xB1, 0x05, 0x55, 0x9E, 0x69, 0xEB, 0x5B, 0xDC, 0x6E, 0xB7, 0xA3, 0x00, 0x4B, 0xEA, 0xAE, - 0xC1, 0x13, 0x85, 0x9D, 0x4D, 0x03, 0xFC, 0x94, 0x94, 0x2B, 0xF0, 0xC0, 0x51, 0x06, 0x93, 0x7C, - 0xAA, 0x4C, 0x5E, 0x06, 0x33, 0x42, 0xAA, 0x98, 0xFF, 0x50, 0xC6, 0xD2, 0x1F, 0x07, 0x2C, 0x95, - 0xB4, 0xEA, 0x8F, 0xCD, 0x27, 0xD2, 0xF6, 0xCA, 0x0E, 0x1D, 0x6F, 0x3A, 0xC6, 0x7A, 0xA7, 0x6B, - 0x24, 0x3C, 0x13, 0x3A, 0x2D, 0xF2, 0xBD, 0xD5, 0x95, 0xCD, 0x15, 0x92, 0x57, 0x53, 0xCE, 0xB9, - 0x9B, 0xE1, 0x39, 0xA5, 0x9B, 0x84, 0x39, 0x61, 0x2A, 0xB4, 0xD0, 0x4B, 0xFD, 0xDB, 0x30, 0xD0, - 0x5F, 0x51, 0x37, 0xC3, 0xD2, 0xAE, 0x50, 0xA9, 0xD4, 0x4F, 0xB1, 0x83, 0x48, 0xF1, 0x62, 0x25, - 0xD9, 0x1F, 0xB7, 0x3D, 0x71, 0x02, 0xB0, 0x52, 0x8F, 0xF8, 0xD4, 0x49, 0x32, 0x66, 0x63, 0x5E, - 0x2C, 0xD1, 0xE3, 0x34, 0x34, 0xFB, 0xCE, 0x70, 0xEE, 0xC5, 0xBD, 0x2E, 0xF2, 0x8E, 0xB1, 0xD8, - 0xCD, 0x93, 0xDE, 0x1E, 0xF3, 0xE1, 0x88, 0x1F, 0x1F, 0x3D, 0xE9, 0xD5, 0x84, 0xAE, 0x39, 0x8E, - 0xD3, 0x16, 0xFE, 0x2F, 0xF6, 0xF0, 0x28, 0xFD, 0xB5, 0xD2, 0x1C, 0x14, 0x87, 0xE7, 0xFD, 0x85, - 0xE3, 0x78, 0x6F, 0x06, 0x64, 0x1F, 0xF8, 0xBC, 0x70, 0x3C, 0xFD, 0xE9, 0x2D, 0xF9, 0x77, 0xBE, - 0x68, 0xB8, 0xF0, 0x85, 0x28, 0xCE, 0x83, 0x09, 0x57, 0xDA, 0x46, 0x52, 0x69, 0x1B, 0x5A, 0xA5, - 0x9D, 0x82, 0x48, 0x90, 0x9D, 0xF3, 0xAB, 0x5E, 0x75, 0xB1, 0x89, 0x8C, 0x75, 0x84, 0xB0, 0xD1, - 0xE8, 0xE8, 0x69, 0xE2, 0x3A, 0x4C, 0xF1, 0xAE, 0x12, 0x49, 0x7D, 0x23, 0x1E, 0x0B, 0xA8, 0xCA, - 0x78, 0x23, 0x92, 0x16, 0x7B, 0x3B, 0xE6, 0x9A, 0x02, 0x27, 0x84, 0x9E, 0x81, 0x4D, 0xF3, 0x93, - 0xB4, 0xD0, 0x32, 0xF8, 0x63, 0x49, 0xF6, 0xD2, 0x55, 0xDA, 0x77, 0xA3, 0x2A, 0xF0, 0x4B, 0xD7, - 0x25, 0x67, 0x8B, 0x11, 0x95, 0x11, 0xB0, 0x03, 0x1B, 0x09, 0x5B, 0x3F, 0xB3, 0x02, 0x1B, 0x2D, - 0xF8, 0xAA, 0x98, 0x82, 0x4B, 0x23, 0xB2, 0xFD, 0x09, 0x4F, 0xB5, 0xB2, 0x10, 0x6C, 0xB1, 0x51, - 0x71, 0x12, 0x19, 0x9C, 0x4F, 0x2C, 0x6E, 0x49, 0x4C, 0x18, 0x12, 0xE9, 0xDE, 0xCD, 0xCF, 0xC6, - 0x20, 0x9D, 0x6F, 0xBD, 0xAC, 0x73, 0xAD, 0x1A, 0xB9, 0x5C, 0x52, 0xC7, 0x62, 0xB1, 0x39, 0xAC, - 0x04, 0xFB, 0xEC, 0xB2, 0x98, 0x81, 0x0B, 0xD5, 0xAD, 0xCA, 0x2D, 0xAE, 0x73, 0x75, 0xDC, 0xEA, - 0xA5, 0x3C, 0x63, 0x9C, 0x87, 0x5B, 0x5C, 0xFD, 0x66, 0xC7, 0x28, 0xFA, 0xBC, 0x08, 0x79, 0x81, - 0xE2, 0x28, 0xB6, 0x54, 0x2F, 0xD0, 0x44, 0xE4, 0x9B, 0x7F, 0x6A, 0xDF, 0x61, 0xBE, 0x15, 0x21, - 0x73, 0x9F, 0x2C, 0xCB, 0x02, 0x59, 0xEB, 0x54, 0x6C, 0xBA, 0x12, 0x3D, 0xE9, 0xEE, 0xD1, 0x4D, - 0x31, 0x34, 0x26, 0x25, 0x93, 0x79, 0x22, 0x48, 0x06, 0x62, 0xA8, 0x79, 0x25, 0x31, 0x02, 0x57, - 0x0E, 0x17, 0x90, 0x5C, 0x4F, 0x45, 0x8F, 0xE3, 0x1D, 0x24, 0x3F, 0xC4, 0x11, 0x07, 0xC6, 0xD5, - 0x7D, 0xF3, 0x01, 0xEF, 0x07, 0xF0, 0xFA, 0x4D, 0xAD, 0x47, 0xD6, 0x40, 0xB2, 0x2A, 0xD2, 0xA5, - 0x90, 0x86, 0x02, 0x09, 0x20, 0x96, 0xC8, 0x07, 0xFA, 0x67, 0xD2, 0x68, 0x13, 0xC6, 0x97, 0x45, - 0xA0, 0xC4, 0x1A, 0x8B, 0x4D, 0xC0, 0x2E, 0x2E, 0xE6, 0x4A, 0x9F, 0x77, 0xE7, 0xD7, 0x65, 0xFF, - 0xD5, 0xF6, 0xF9, 0x1F, 0xB2, 0xFD, 0xA5, 0x48, 0x3E, 0x93, 0x53, 0xD7, 0x84, 0x90, 0xCC, 0x36, - 0xE2, 0x5D, 0x7F, 0x34, 0xED, 0x80, 0x6C, 0xEE, 0xEB, 0xB2, 0xD3, 0x87, 0x5E, 0x2A, 0xF5, 0x2E, - 0x42, 0xA1, 0x7F, 0x50, 0xB2, 0xB7, 0x6F, 0xC3, 0x1E, 0xC4, 0x56, 0x31, 0x31, 0x4A, 0x35, 0x0C, - 0x28, 0x4F, 0xEC, 0x35, 0xE5, 0x61, 0x12, 0xCB, 0xC5, 0x30, 0x49, 0x71, 0x1C, 0xFB, 0xE6, 0x03, - 0x74, 0xAA, 0xDD, 0x56, 0x2E, 0x22, 0x95, 0x08, 0xD3, 0x5A, 0x9C, 0xBF, 0xA5, 0x95, 0x35, 0x06, - 0x2D, 0x05, 0xCC, 0x10, 0xA7, 0x45, 0xD5, 0x24, 0x82, 0x7C, 0xA4, 0x80, 0xA3, 0x99, 0xE2, 0x6B, - 0xE6, 0x10, 0x63, 0x33, 0x53, 0x9C, 0xCD, 0x9C, 0x62, 0x6D, 0xE6, 0x10, 0x6F, 0x33, 0x63, 0xCC, - 0xCD, 0x4C, 0x71, 0x37, 0x33, 0xC7, 0xDE, 0x2C, 0x20, 0x88, 0x66, 0xE6, 0x40, 0x9A, 0xB9, 0x04, - 0xD3, 0xCC, 0x10, 0x50, 0x33, 0x73, 0x50, 0x8D, 0x36, 0x83, 0x06, 0xE8, 0x03, 0x86, 0xF4, 0x9F, - 0x66, 0x89, 0x7C, 0x7D, 0x0B, 0x58, 0xCA, 0xF2, 0xB2, 0x40, 0x6D, 0x1D, 0xED, 0xD4, 0x34, 0xA1, - 0xA8, 0x6A, 0x54, 0x90, 0x18, 0x67, 0x3E, 0xAF, 0x07, 0x13, 0x29, 0x2C, 0xD0, 0xF0, 0xBA, 0x27, - 0x89, 0xE5, 0xBD, 0x34, 0x0B, 0x76, 0x8F, 0x9B, 0xFE, 0xE5, 0x2F, 0x28, 0xA5, 0x25, 0x7B, 0xE7, - 0xB5, 0x62, 0x6B, 0xF6, 0x5C, 0x69, 0x55, 0xD4, 0xEC, 0xCD, 0x4D, 0x5D, 0x6B, 0x6D, 0xB2, 0x44, - 0x5D, 0xD8, 0x48, 0xEE, 0xA2, 0xA6, 0x08, 0x64, 0xF2, 0x51, 0x4E, 0x51, 0x36, 0xEF, 0x5D, 0x97, - 0xFC, 0x87, 0x9C, 0x4F, 0xE5, 0xB7, 0x39, 0x13, 0x0E, 0x3C, 0xB1, 0xE8, 0x2E, 0x2D, 0xA5, 0x3B, - 0x6E, 0xE9, 0x1C, 0xA9, 0x28, 0x15, 0xDA, 0xA7, 0x41, 0x93, 0xB6, 0x5C, 0x8D, 0x60, 0x5C, 0xB9, - 0xDE, 0xE0, 0xBE, 0x96, 0x22, 0x14, 0x9A, 0xC7, 0xCC, 0x8B, 0xCB, 0x85, 0xAE, 0x71, 0x29, 0xD1, - 0x48, 0x7D, 0xC2, 0x7E, 0x06, 0x02, 0x7E, 0x0A, 0x88, 0x56, 0x40, 0x34, 0xEA, 0x67, 0xDF, 0x0E, - 0xCE, 0xCC, 0x49, 0x1C, 0xE2, 0x3E, 0xB6, 0x1D, 0xF2, 0x8F, 0xF9, 0xD4, 0x42, 0xB7, 0xB4, 0x44, - 0x48, 0x2A, 0xD2, 0x8A, 0x16, 0xB4, 0x93, 0x43, 0x71, 0xF5, 0x09, 0x2F, 0x8E, 0xA3, 0x24, 0x89, - 0x1C, 0xE1, 0xD8, 0xF4, 0xBF, 0xB1, 0x12, 0x06, 0x4A, 0x2E, 0xA5, 0xE2, 0xC7, 0x5A, 0xBF, 0x03, - 0xAC, 0x4C, 0xA7, 0xB1, 0x0F, 0xBB, 0x40, 0x01, 0xFB, 0xD0, 0xA0, 0x50, 0xC8, 0x58, 0x77, 0xD0, - 0xBB, 0x77, 0x0C, 0x1B, 0x19, 0x43, 0x32, 0x9C, 0x86, 0x3C, 0x94, 0xD9, 0xD9, 0x48, 0x52, 0x92, - 0x9C, 0x08, 0x8D, 0x85, 0xAE, 0xE5, 0x8E, 0xBC, 0x66, 0x90, 0x32, 0x6D, 0xAE, 0x61, 0xE6, 0x14, - 0x65, 0x20, 0xC2, 0x30, 0x15, 0xC2, 0x09, 0x8D, 0x6F, 0xA3, 0x8F, 0xE0, 0x3D, 0x5D, 0x0B, 0x0F, - 0xEC, 0x09, 0xD9, 0x9A, 0x80, 0x05, 0x44, 0x1D, 0xBA, 0xC8, 0x49, 0x52, 0x4C, 0x57, 0x65, 0xC3, - 0x55, 0xB4, 0xEC, 0x6A, 0xBC, 0x2D, 0x64, 0xA7, 0x8A, 0x7A, 0x89, 0x76, 0xB4, 0x8E, 0x7F, 0x42, - 0x2A, 0x48, 0x0B, 0x07, 0x64, 0xDF, 0x82, 0xAD, 0x63, 0xA2, 0x49, 0x38, 0xA4, 0x38, 0x09, 0xA6, - 0x90, 0x08, 0xEB, 0x21, 0xCC, 0xB6, 0x09, 0x8E, 0xD1, 0x2C, 0x83, 0xAB, 0x6D, 0x91, 0x23, 0x87, - 0x7D, 0xF7, 0x1C, 0xA5, 0x8A, 0x6D, 0x88, 0xE2, 0xD1, 0x8C, 0x05, 0x40, 0x6E, 0xB7, 0x83, 0x64, - 0x2F, 0x6B, 0xBF, 0x7D, 0x70, 0x71, 0x71, 0x79, 0x78, 0x72, 0xBE, 0x77, 0x75, 0x74, 0x73, 0x72, - 0xDE, 0xBB, 0xBE, 0xBA, 0xB9, 0xFA, 0xDC, 0x83, 0x5F, 0x3F, 0xEE, 0x9D, 0x9E, 0x1C, 0xDE, 0x5C, - 0x9F, 0xFF, 0x72, 0x7E, 0xF1, 0xE9, 0x3C, 0x11, 0x62, 0x11, 0x0D, 0x31, 0x10, 0x1A, 0x83, 0x84, - 0xB0, 0x0D, 0xD2, 0x13, 0x34, 0x75, 0xBE, 0x39, 0x90, 0x63, 0x6B, 0xFB, 0x55, 0x4A, 0x0F, 0x9D, - 0x17, 0x44, 0x49, 0x3C, 0x60, 0x8F, 0x30, 0x5F, 0xA0, 0xFE, 0x1D, 0x5A, 0xEE, 0x6C, 0x1A, 0x6C, - 0x56, 0xE8, 0xCA, 0xC9, 0x6E, 0x6A, 0x53, 0x99, 0x14, 0x09, 0x66, 0xC4, 0xEE, 0xA7, 0x9B, 0xCC, - 0x10, 0xB8, 0x69, 0xBC, 0x4E, 0x36, 0x64, 0x4C, 0x21, 0x2E, 0x3D, 0x82, 0x9C, 0x87, 0xAE, 0xF1, - 0xDB, 0x3A, 0x81, 0x64, 0xC9, 0x7F, 0x2B, 0x48, 0x24, 0x6D, 0xF8, 0x53, 0x24, 0x7F, 0x8A, 0x64, - 0x61, 0x91, 0x4C, 0x88, 0xCF, 0x9F, 0x76, 0x24, 0xCD, 0x98, 0xCD, 0x08, 0xA6, 0x67, 0x7D, 0x16, - 0x04, 0x4D, 0x63, 0x3C, 0x5F, 0x11, 0x1F, 0x32, 0x17, 0x05, 0x91, 0x94, 0x89, 0x67, 0x3B, 0xF4, - 0x29, 0xF5, 0x78, 0xA6, 0x55, 0x9B, 0x41, 0x59, 0x03, 0x50, 0x95, 0x12, 0x69, 0x30, 0xE2, 0x0C, - 0x91, 0xB0, 0xFE, 0x59, 0xE0, 0x13, 0x00, 0x37, 0xF2, 0x9A, 0x44, 0xE7, 0xAD, 0x70, 0x9A, 0x42, - 0x39, 0xD9, 0x56, 0xAD, 0x8C, 0x60, 0x70, 0x03, 0x18, 0x37, 0x1E, 0x50, 0x1A, 0x2D, 0xCC, 0x4A, - 0x5A, 0x4D, 0x21, 0x83, 0x8F, 0xBC, 0x26, 0xC7, 0x2B, 0x29, 0x9F, 0x37, 0x14, 0x59, 0x23, 0xAC, - 0xD3, 0xD2, 0x91, 0x21, 0x64, 0xDF, 0x51, 0x14, 0x5F, 0x26, 0x34, 0x52, 0x29, 0x13, 0x5C, 0x32, - 0xE0, 0x82, 0x65, 0x5C, 0xF6, 0x69, 0x77, 0x43, 0x36, 0x73, 0x16, 0x68, 0xF7, 0x90, 0x89, 0x3C, - 0x49, 0xF1, 0x26, 0xB2, 0xF2, 0xE6, 0xB1, 0xE0, 0xF6, 0x90, 0x43, 0x80, 0x0D, 0xC9, 0x8F, 0xDB, - 0x0F, 0xB2, 0x07, 0x2A, 0xE2, 0x9D, 0xD5, 0x4E, 0x6A, 0x36, 0xAA, 0xB9, 0x1D, 0x3E, 0xBE, 0x97, - 0xC7, 0xCE, 0x72, 0x50, 0x65, 0x51, 0x20, 0x06, 0x80, 0x94, 0xA1, 0xA0, 0xB2, 0xDE, 0x4C, 0x97, - 0x25, 0x7E, 0xD3, 0x38, 0x77, 0x61, 0x8A, 0x5F, 0x0C, 0x91, 0x65, 0x2A, 0xF6, 0x5C, 0x05, 0xD1, - 0x9A, 0x9F, 0x24, 0x65, 0x0C, 0x4E, 0x22, 0x9E, 0x62, 0x6E, 0x43, 0x23, 0x65, 0x66, 0xE0, 0x0E, - 0xCD, 0x33, 0xB7, 0x35, 0x4A, 0xCA, 0x44, 0xE2, 0x98, 0xFA, 0x52, 0x8B, 0x71, 0xBA, 0x50, 0xC5, - 0x8E, 0x15, 0x52, 0xB2, 0xCC, 0xB2, 0xD2, 0x04, 0x2B, 0xB7, 0xC5, 0x9E, 0xBF, 0x61, 0xB2, 0xC3, - 0x5F, 0xBD, 0x69, 0xD7, 0x45, 0x5F, 0xC4, 0x86, 0x25, 0x3C, 0x51, 0xF7, 0x27, 0x78, 0x50, 0x30, - 0xA6, 0x99, 0x1E, 0x6C, 0xA1, 0xFC, 0x37, 0xE3, 0x2B, 0x57, 0x5E, 0xF4, 0x9B, 0xED, 0x9F, 0x9B, - 0xE7, 0x0D, 0x76, 0x49, 0x13, 0x96, 0x37, 0x9B, 0xAC, 0x2C, 0xAC, 0xFE, 0x0E, 0x19, 0xF2, 0x87, - 0x5D, 0xC8, 0xC4, 0xD7, 0xD4, 0x42, 0xEF, 0xE4, 0x40, 0xEF, 0xC8, 0xD0, 0x3B, 0x2A, 0xF4, 0x4E, - 0x26, 0xF4, 0x6E, 0x0E, 0xF4, 0xAE, 0x0C, 0xBD, 0xAB, 0x42, 0xEF, 0x66, 0x42, 0x5F, 0xCD, 0x81, - 0xBE, 0x2A, 0x43, 0x5F, 0x55, 0xA1, 0xAF, 0x46, 0xD0, 0x5F, 0xA9, 0x9D, 0xA0, 0x92, 0x08, 0x0B, - 0xD9, 0x75, 0x40, 0x86, 0x6F, 0x4D, 0x0B, 0x7E, 0x87, 0x3C, 0x00, 0x79, 0x02, 0x1D, 0x7A, 0x53, - 0xE8, 0x73, 0xE0, 0x70, 0x09, 0x6F, 0x07, 0xEE, 0xA9, 0xFB, 0x48, 0xE3, 0x1F, 0xE0, 0x12, 0x1E, - 0x06, 0x40, 0x0C, 0xCF, 0xCA, 0x71, 0xFF, 0x04, 0x8A, 0x78, 0x4C, 0x99, 0x9E, 0x96, 0x59, 0x99, - 0x20, 0xBB, 0x64, 0xDA, 0x16, 0x41, 0x66, 0x5B, 0xDD, 0x22, 0x3D, 0x67, 0xC7, 0xBD, 0x8E, 0xC6, - 0x6D, 0x84, 0xDB, 0x11, 0x09, 0x9C, 0x64, 0x61, 0x52, 0x72, 0x3A, 0x33, 0x88, 0x0E, 0x41, 0xF1, - 0xBA, 0x0D, 0x54, 0x9D, 0x94, 0x9B, 0x0F, 0xE0, 0x4D, 0xAA, 0x11, 0x51, 0xF4, 0x2A, 0x04, 0x01, - 0x60, 0x07, 0x6A, 0x25, 0x71, 0xAA, 0xF0, 0x76, 0x4A, 0xA4, 0x46, 0x73, 0x06, 0x9C, 0xBE, 0x44, - 0x72, 0xE5, 0x1E, 0x9B, 0x70, 0x01, 0xFF, 0x7C, 0x88, 0xEF, 0xCC, 0xE9, 0x28, 0xF0, 0x95, 0x2D, - 0xB5, 0x5C, 0x98, 0x7C, 0xB0, 0xA4, 0x16, 0x16, 0xA1, 0xBD, 0x09, 0x51, 0xD2, 0xD8, 0x92, 0x9C, - 0x02, 0x68, 0x1E, 0x0F, 0x8B, 0x06, 0x7E, 0x30, 0x74, 0x70, 0x5F, 0xA3, 0x4F, 0xDC, 0xAC, 0xA0, - 0xBA, 0x84, 0xDA, 0xAD, 0x4E, 0xAB, 0x96, 0x4A, 0xB7, 0xE6, 0xDA, 0x33, 0xD9, 0x87, 0x42, 0x99, - 0xB0, 0x85, 0xC7, 0xC5, 0xD2, 0xF2, 0x8A, 0xE4, 0x64, 0xB1, 0xDE, 0x41, 0x4F, 0xAA, 0xBB, 0x50, - 0x5E, 0x92, 0x7F, 0xB9, 0x4F, 0x7F, 0xC7, 0x9E, 0x1B, 0xA6, 0x29, 0x11, 0x53, 0x76, 0x96, 0x48, - 0xCF, 0x84, 0x1A, 0xE0, 0x00, 0xAD, 0x49, 0x27, 0xD4, 0xFC, 0x67, 0x4E, 0xDC, 0x34, 0x94, 0x53, - 0xB1, 0x44, 0x72, 0x6E, 0xE8, 0x73, 0x36, 0xE9, 0x93, 0x07, 0xF1, 0x11, 0xF9, 0x67, 0xCD, 0x45, - 0x94, 0xCA, 0x83, 0xB6, 0x51, 0x94, 0x0D, 0x71, 0x56, 0xA1, 0xF9, 0xF1, 0xE2, 0xC7, 0x65, 0x2A, - 0x2A, 0xC6, 0x90, 0xE4, 0x0C, 0x83, 0xE9, 0x30, 0xDB, 0x2C, 0xA3, 0x13, 0x4A, 0x37, 0xD3, 0xE6, - 0x3A, 0xCB, 0x7E, 0x48, 0x32, 0xA4, 0x59, 0x67, 0x5A, 0x94, 0xC5, 0xE9, 0x77, 0x92, 0x1C, 0xAA, - 0x8A, 0x90, 0xF1, 0xA5, 0x89, 0x65, 0x7F, 0x22, 0x22, 0x94, 0x5C, 0x90, 0x64, 0x45, 0xBF, 0x3D, - 0x7F, 0x4F, 0x04, 0x7E, 0x9F, 0xAF, 0x7D, 0x1F, 0x9D, 0x65, 0x0D, 0x0C, 0x3B, 0xD2, 0xD9, 0x2E, - 0xD8, 0xAA, 0x5F, 0xAD, 0xD5, 0x55, 0xA5, 0x56, 0x1F, 0x85, 0x56, 0x6B, 0x05, 0x5B, 0x5D, 0x9E, - 0x1D, 0x68, 0x70, 0xA9, 0x06, 0xF6, 0x62, 0x97, 0xF6, 0xD1, 0x8D, 0xB7, 0xE6, 0xF1, 0x66, 0x99, - 0x7F, 0x46, 0x7B, 0x7D, 0xBB, 0x60, 0xBB, 0x7E, 0xD5, 0x76, 0x57, 0x15, 0xDB, 0x89, 0x5C, 0xEC, - 0xB4, 0x8D, 0x82, 0xED, 0x64, 0x3E, 0xC6, 0xF8, 0xBE, 0xCB, 0x49, 0xFC, 0xB9, 0x94, 0xF3, 0xE8, - 0x96, 0x9F, 0x32, 0xFE, 0x83, 0x64, 0x3C, 0xB7, 0xDD, 0xE5, 0xAF, 0x67, 0x37, 0x97, 0x7B, 0x9F, - 0x7E, 0x2D, 0x47, 0x23, 0xB4, 0xEA, 0x1F, 0x5F, 0xEE, 0xFF, 0xFA, 0x73, 0x4A, 0x2D, 0x68, 0x4A, - 0xE5, 0xB4, 0x54, 0x5F, 0x7F, 0xEF, 0x6C, 0x95, 0xC3, 0xAC, 0xB6, 0xEF, 0x1A, 0xB3, 0xB5, 0x5F, - 0xEB, 0xCE, 0xD8, 0x7E, 0x43, 0xDB, 0x3E, 0x6D, 0xF1, 0x84, 0x46, 0x7A, 0x9D, 0x22, 0x6F, 0xDF, - 0x5E, 0x44, 0xAF, 0xD0, 0x9D, 0x07, 0x9D, 0x15, 0x84, 0xAA, 0x9B, 0x8E, 0x61, 0xAC, 0x17, 0x9E, - 0x4C, 0x6A, 0xD3, 0x37, 0x6B, 0xD5, 0x9B, 0xBE, 0xA9, 0x25, 0xF7, 0x63, 0xC5, 0x9A, 0x6E, 0x56, - 0xC7, 0xBA, 0xA9, 0x62, 0x2D, 0xD3, 0x78, 0xAB, 0x3A, 0xDE, 0xAD, 0xCA, 0xBD, 0xED, 0x74, 0x2B, - 0x63, 0xED, 0x74, 0x2B, 0x63, 0xED, 0xAE, 0x4A, 0x13, 0xAC, 0x1C, 0xA7, 0xD6, 0x8C, 0x37, 0xDD, - 0x1B, 0xA3, 0x22, 0x6A, 0xDA, 0xB8, 0x53, 0x4B, 0xDD, 0xAB, 0xCF, 0x43, 0x4F, 0x47, 0xFB, 0x6F, - 0x36, 0x99, 0xE5, 0x09, 0x50, 0x4C, 0x19, 0x08, 0xCD, 0x57, 0x57, 0x25, 0x56, 0x95, 0x6E, 0x2F, - 0x4F, 0xA2, 0xD2, 0xCD, 0x37, 0x67, 0x6B, 0xBE, 0x35, 0x53, 0x73, 0x45, 0x3A, 0x0B, 0x29, 0xC2, - 0x53, 0xF7, 0x71, 0xDF, 0x74, 0xAC, 0x47, 0xDB, 0x0A, 0xEE, 0x5F, 0xB9, 0x32, 0x34, 0xAA, 0x6B, - 0xC3, 0xEE, 0x0F, 0xD1, 0x86, 0xDD, 0x1F, 0xA4, 0x0D, 0xBB, 0x3F, 0x44, 0x1B, 0x76, 0x7F, 0x6A, - 0xC3, 0x05, 0x6B, 0xC3, 0xEE, 0x8F, 0xD5, 0x86, 0xDD, 0xD9, 0xB4, 0x61, 0x77, 0x36, 0x6D, 0xD8, - 0x9D, 0x4D, 0x1B, 0x76, 0xD3, 0xB5, 0xE1, 0xD4, 0xA7, 0xC9, 0x80, 0x63, 0x1F, 0x27, 0x5F, 0xE3, - 0xF5, 0xC3, 0xD2, 0xAC, 0xC6, 0xF0, 0x30, 0xFC, 0xBD, 0xAD, 0xA9, 0xF4, 0x59, 0xA9, 0xF4, 0x59, - 0x57, 0xE9, 0x8B, 0x52, 0xE9, 0x8B, 0xF2, 0x8A, 0x1D, 0x21, 0x29, 0x7C, 0x83, 0x33, 0x9B, 0xAC, - 0xA4, 0x33, 0xD2, 0x30, 0x7C, 0x92, 0xD8, 0x0C, 0x0A, 0x38, 0x1B, 0x45, 0xB5, 0x5D, 0x47, 0xAD, - 0xFD, 0x61, 0xEF, 0x68, 0xAF, 0x77, 0xA0, 0xA9, 0xBB, 0x37, 0x0A, 0xA2, 0x39, 0x27, 0x47, 0x91, - 0x8E, 0x4D, 0xEF, 0x9B, 0x14, 0x42, 0xDA, 0xC9, 0x8B, 0x13, 0xCD, 0x69, 0xDF, 0xD5, 0xB5, 0x67, - 0x51, 0x00, 0x11, 0x09, 0xA6, 0xF5, 0xEF, 0x53, 0x3F, 0x20, 0xD4, 0x6A, 0x6E, 0x3D, 0xA8, 0xA5, - 0xF5, 0x1C, 0x3F, 0x9E, 0xBA, 0x82, 0x27, 0x57, 0x22, 0xDC, 0x32, 0xAE, 0xA4, 0xBF, 0x0F, 0xC2, - 0x4F, 0x76, 0xA0, 0x86, 0x6C, 0xD1, 0x87, 0x90, 0x6B, 0x63, 0xD3, 0x76, 0x7A, 0x34, 0x7E, 0x75, - 0x3B, 0x7E, 0xAF, 0xB0, 0x51, 0xA3, 0xEB, 0xEB, 0x89, 0xD3, 0xF3, 0x5C, 0x88, 0x2A, 0x12, 0xC2, - 0x34, 0x55, 0xD4, 0x00, 0x79, 0xCF, 0xB1, 0xA4, 0xBB, 0x28, 0xA8, 0xC7, 0x16, 0x68, 0xDD, 0x6B, - 0xA2, 0x31, 0x2D, 0x69, 0xEF, 0x89, 0xD2, 0xB6, 0xF0, 0xAA, 0xF3, 0x08, 0x07, 0x42, 0x18, 0x36, - 0xBD, 0xAB, 0x0B, 0xA1, 0x88, 0xF0, 0x43, 0x9C, 0x29, 0x3D, 0x62, 0x9F, 0x35, 0x3D, 0x52, 0xBA, - 0x1B, 0x62, 0xAC, 0x09, 0x5E, 0x79, 0x07, 0xE6, 0x08, 0x12, 0xE5, 0x3C, 0xDE, 0x63, 0xE6, 0x98, - 0x77, 0xD4, 0xEF, 0xAD, 0x76, 0xD1, 0xBD, 0xE9, 0x83, 0x93, 0xDB, 0x9D, 0xED, 0x8D, 0x49, 0xA1, - 0x47, 0xE4, 0xDF, 0x9E, 0x04, 0xF0, 0xB0, 0x33, 0xF5, 0xC8, 0x80, 0x73, 0x5D, 0xCC, 0x27, 0x74, - 0xE7, 0xB9, 0x63, 0xB4, 0xD7, 0x63, 0x0D, 0x86, 0x68, 0x42, 0x48, 0x93, 0x5E, 0xDF, 0xA3, 0x60, - 0x20, 0xE6, 0xEB, 0x92, 0xC1, 0x11, 0xAD, 0xEE, 0x87, 0x84, 0x1C, 0x6F, 0x6C, 0x3B, 0x98, 0x50, - 0x60, 0x0F, 0xEE, 0x91, 0xF8, 0x4C, 0x34, 0xF3, 0x04, 0x74, 0x3D, 0x7B, 0x48, 0xE6, 0xD6, 0x88, - 0xBF, 0x23, 0x1D, 0xEE, 0x70, 0xD4, 0xF7, 0x5C, 0xFF, 0xB4, 0x83, 0x9C, 0xE9, 0x68, 0xD4, 0x4C, - 0x5C, 0xBB, 0xAA, 0x6F, 0xBC, 0x2A, 0x2C, 0xCD, 0x0C, 0x2F, 0x63, 0xDF, 0xDE, 0xA2, 0xBD, 0xD1, - 0x08, 0xF5, 0xC9, 0x77, 0x2B, 0x37, 0xFB, 0x8B, 0xF8, 0x68, 0xED, 0x35, 0x73, 0x37, 0x46, 0xE4, - 0xFF, 0x84, 0x5F, 0x84, 0x79, 0x49, 0x56, 0xA4, 0x87, 0x8D, 0x40, 0xC5, 0x47, 0xD3, 0xC3, 0xD7, - 0x93, 0x91, 0x6B, 0x5A, 0x9F, 0x4C, 0x3B, 0x90, 0x23, 0x10, 0xE8, 0x5B, 0x5F, 0x2C, 0x93, 0xA0, - 0x3F, 0xBD, 0x1D, 0xDB, 0xC1, 0x31, 0x6F, 0x00, 0x51, 0x8F, 0x64, 0x46, 0xD2, 0x07, 0xA1, 0x7F, - 0x33, 0xBE, 0x0A, 0xDE, 0x34, 0xB0, 0xDC, 0x71, 0x8F, 0x1A, 0x78, 0x5C, 0x1D, 0x5C, 0x3A, 0xA5, - 0x48, 0xBC, 0xB0, 0xBC, 0x6D, 0x4E, 0x26, 0x6C, 0xD6, 0x25, 0x01, 0xB7, 0x28, 0xE2, 0xA6, 0x00, - 0xD5, 0xFC, 0x77, 0xF3, 0x89, 0x43, 0xFC, 0xF5, 0xEC, 0xF4, 0x43, 0x00, 0x49, 0x2B, 0xFE, 0x63, - 0x8A, 0x85, 0xC7, 0xD6, 0xA1, 0x46, 0xDB, 0x25, 0x20, 0x1B, 0xB5, 0xDE, 0x45, 0xFF, 0x0A, 0x62, - 0x31, 0x57, 0xA6, 0xB4, 0x5B, 0x35, 0xA9, 0x0A, 0x9D, 0x6F, 0x21, 0x11, 0xF1, 0x84, 0x64, 0xDA, - 0x4E, 0xE4, 0x86, 0xE6, 0x06, 0x1A, 0xDE, 0x2E, 0x65, 0x85, 0x36, 0x38, 0x62, 0x4E, 0xA4, 0x98, - 0xF4, 0xE4, 0x2B, 0xE7, 0x32, 0xBC, 0x7E, 0x60, 0x06, 0x53, 0x1F, 0x5C, 0xD4, 0x14, 0xED, 0x9D, - 0x8D, 0x94, 0xD4, 0xCF, 0x01, 0x9C, 0x9C, 0xE2, 0x6C, 0x36, 0xEA, 0x6B, 0xD5, 0x32, 0xA6, 0xB9, - 0x82, 0xC5, 0xF5, 0x86, 0x38, 0xE8, 0x99, 0xB6, 0x87, 0x2D, 0xAA, 0x8C, 0x95, 0x75, 0xE7, 0x36, - 0x70, 0x8E, 0x69, 0x15, 0x56, 0xA8, 0xE1, 0x17, 0x48, 0x34, 0x7D, 0xA4, 0xCF, 0xA7, 0xC0, 0xDC, - 0x20, 0xC0, 0x4E, 0x5B, 0x8C, 0x4B, 0x99, 0x60, 0xEC, 0x9D, 0xED, 0x1D, 0xF8, 0x6A, 0xC3, 0x73, - 0xFE, 0x6A, 0xBC, 0xF6, 0xF6, 0x9E, 0xE2, 0x3C, 0xF2, 0x27, 0xE7, 0xEE, 0x63, 0x8F, 0xB4, 0xF7, - 0xF5, 0xBA, 0x9A, 0x50, 0x47, 0xB5, 0x69, 0x22, 0x0D, 0xC5, 0x30, 0xD4, 0x62, 0xBC, 0x44, 0x43, - 0x37, 0x6D, 0x48, 0x2F, 0xE6, 0x78, 0x82, 0x80, 0x54, 0x57, 0x02, 0x11, 0x90, 0x44, 0x47, 0x74, - 0x05, 0x65, 0x5A, 0xD6, 0xD1, 0x03, 0xF9, 0x05, 0x5C, 0x3C, 0xB0, 0x03, 0x2F, 0x69, 0x1D, 0x5E, - 0x9C, 0x11, 0xC5, 0x1D, 0xC0, 0x37, 0x32, 0x2E, 0x18, 0x72, 0xAE, 0x34, 0x30, 0x54, 0x69, 0xA2, - 0x9D, 0x5D, 0xA0, 0x32, 0x16, 0x7B, 0xCE, 0xBC, 0x02, 0x37, 0x5A, 0xC9, 0x74, 0x06, 0xF2, 0x25, - 0x16, 0x0D, 0xA4, 0x80, 0x9D, 0x2A, 0xF5, 0xBF, 0x24, 0xBF, 0x30, 0xD0, 0xD1, 0x0D, 0x96, 0x0D, - 0x6E, 0x94, 0xE6, 0x13, 0xF9, 0x45, 0xB9, 0xCA, 0x62, 0xF5, 0x7E, 0xB3, 0xBF, 0xB6, 0x5D, 0x67, - 0x30, 0xB2, 0x07, 0x10, 0x06, 0x16, 0x31, 0xB9, 0x91, 0x7C, 0x26, 0x41, 0xCE, 0xFD, 0x91, 0x91, - 0x7B, 0x7C, 0xA8, 0x7D, 0xAC, 0xAF, 0xA9, 0x61, 0x18, 0x83, 0x09, 0x5A, 0x41, 0x8F, 0x57, 0x03, - 0xA9, 0x8F, 0x07, 0xF2, 0x09, 0x18, 0xAD, 0xA4, 0x22, 0x14, 0x1D, 0x59, 0xBE, 0xCB, 0x1A, 0x41, - 0x0B, 0x75, 0x2E, 0x04, 0xC6, 0x98, 0xB3, 0xE8, 0x13, 0xBA, 0xA1, 0x27, 0x50, 0xF3, 0x0A, 0x4C, - 0x79, 0xF2, 0x2A, 0x3E, 0x29, 0x13, 0x6B, 0x1A, 0x9F, 0x37, 0x48, 0x49, 0x75, 0xCF, 0x34, 0x0D, - 0xDD, 0x4B, 0x66, 0xE4, 0xA4, 0xD7, 0x77, 0xEC, 0x18, 0x5A, 0xCD, 0xA5, 0x57, 0x21, 0xA4, 0x62, - 0x5D, 0x4A, 0xA3, 0x36, 0xEE, 0x4F, 0x46, 0xA7, 0xF5, 0x5D, 0xCA, 0x7E, 0x7F, 0xA4, 0x7A, 0x07, - 0x67, 0x7B, 0xD7, 0x84, 0x75, 0x17, 0xCE, 0x1E, 0x99, 0xBD, 0x1D, 0x46, 0xA7, 0x90, 0xD9, 0x7A, - 0xFB, 0x9E, 0xC6, 0x12, 0xCF, 0xBD, 0xB3, 0xEF, 0xD5, 0x10, 0x65, 0x6D, 0x5F, 0x59, 0x57, 0x32, - 0xFA, 0xCA, 0x98, 0xA1, 0xE9, 0xAB, 0x5C, 0x2D, 0xCD, 0xF8, 0xC5, 0xEC, 0x5B, 0x63, 0xD7, 0x37, - 0xED, 0x41, 0x69, 0x2B, 0x98, 0x94, 0x9A, 0x58, 0xFB, 0x12, 0x44, 0xAC, 0x30, 0x36, 0x3A, 0xED, - 0x35, 0x85, 0xF4, 0xEF, 0x4A, 0xF0, 0x71, 0x39, 0x13, 0x44, 0x19, 0xE4, 0x1D, 0x43, 0x3E, 0x82, - 0xA7, 0x61, 0xAF, 0x08, 0xDE, 0xC8, 0x02, 0xAE, 0x97, 0x35, 0xDD, 0xF3, 0x15, 0xD5, 0x45, 0xAC, - 0xEC, 0x63, 0x18, 0xB1, 0xE0, 0x68, 0x9C, 0xF4, 0x8B, 0x3F, 0xE9, 0xC2, 0x84, 0xB3, 0x10, 0x88, - 0xF4, 0xEE, 0x47, 0x89, 0x72, 0xE7, 0xD2, 0xFD, 0x42, 0x0F, 0xC0, 0x2A, 0xDD, 0xE7, 0xEE, 0xC8, - 0xB3, 0x74, 0x3F, 0x0F, 0x84, 0xB6, 0xFB, 0x8A, 0x73, 0xE9, 0x1C, 0x58, 0x90, 0x84, 0x98, 0xC7, - 0x06, 0x8D, 0x1F, 0x2B, 0x69, 0x65, 0xD9, 0x3E, 0xCB, 0x13, 0xCB, 0xF3, 0x16, 0x14, 0xE7, 0x49, - 0x2E, 0x3C, 0x21, 0x4F, 0x79, 0x3A, 0x7F, 0xE0, 0xA0, 0x03, 0x69, 0x87, 0x20, 0xD1, 0x96, 0x83, - 0x47, 0x33, 0x71, 0x26, 0x09, 0x2B, 0x8A, 0xDA, 0x32, 0x52, 0xA4, 0x22, 0x6C, 0xB2, 0x6F, 0x4E, - 0xAD, 0x43, 0xCF, 0x9D, 0xC0, 0x63, 0xF2, 0x29, 0x8B, 0x8C, 0x94, 0x5C, 0xAF, 0x80, 0x08, 0x15, - 0xA0, 0xAA, 0x93, 0xB2, 0x08, 0x14, 0xA2, 0x8A, 0xAF, 0x8D, 0x25, 0xA9, 0xAA, 0x8E, 0xAF, 0x14, - 0x17, 0xB4, 0xB3, 0x20, 0xFD, 0xC5, 0x80, 0x59, 0x67, 0x43, 0xEE, 0x5B, 0x04, 0x29, 0xC3, 0x3F, - 0x21, 0xDA, 0x8C, 0x9E, 0xA5, 0xFC, 0xAA, 0xAC, 0x2B, 0x02, 0x41, 0xCB, 0x0C, 0x35, 0xCD, 0xE4, - 0xAC, 0x2C, 0x28, 0x93, 0xB6, 0x32, 0x53, 0x7C, 0x0E, 0x71, 0x60, 0xDA, 0x23, 0xBF, 0x3C, 0x2B, - 0xCA, 0xC1, 0xD2, 0x33, 0x85, 0x1E, 0x9C, 0xE7, 0xC1, 0x8D, 0x10, 0x50, 0x31, 0x36, 0xD0, 0x73, - 0x64, 0xE5, 0x8E, 0xE7, 0xB5, 0xD6, 0x2F, 0x09, 0x82, 0x75, 0x62, 0x1E, 0xEB, 0x81, 0x0C, 0x2E, - 0x4D, 0xEC, 0x35, 0xA6, 0x91, 0x99, 0x17, 0x81, 0x4C, 0x78, 0x85, 0x16, 0x01, 0x35, 0xAB, 0xF8, - 0xAC, 0xCC, 0x48, 0x24, 0xC8, 0x4E, 0x93, 0x7E, 0xB1, 0x76, 0x75, 0xB9, 0x2F, 0x08, 0x45, 0xDB, - 0x69, 0x29, 0x9D, 0xF7, 0xAC, 0xFD, 0x2E, 0x9C, 0x1B, 0x5C, 0x65, 0x41, 0xDC, 0x70, 0x46, 0x2E, - 0x14, 0x02, 0xA4, 0x3B, 0x8C, 0x45, 0x6F, 0xE7, 0x55, 0xE1, 0x82, 0x7C, 0xB9, 0xA2, 0x41, 0x21, - 0xBF, 0x96, 0xB7, 0x48, 0x14, 0x89, 0x93, 0xC3, 0x02, 0x50, 0xC9, 0x17, 0x5F, 0x73, 0x46, 0x10, - 0x79, 0x95, 0x3F, 0x33, 0xAF, 0xF2, 0x67, 0xF4, 0x0E, 0x39, 0xD3, 0xF1, 0x41, 0x22, 0x8B, 0x2F, - 0x29, 0xD2, 0x38, 0x96, 0xDF, 0x4E, 0x83, 0xC0, 0x75, 0xB8, 0x5F, 0x39, 0x4D, 0xBB, 0x08, 0x01, - 0x3F, 0xFB, 0xF4, 0x2B, 0xE4, 0xD4, 0x7B, 0x96, 0xAF, 0x47, 0xE3, 0xEA, 0xDA, 0x8E, 0x80, 0x49, - 0x2F, 0xBD, 0x1F, 0x61, 0x44, 0x52, 0x8C, 0xE1, 0x00, 0x1A, 0x34, 0x9E, 0x25, 0x99, 0x93, 0xF3, - 0xE2, 0x35, 0xE5, 0x4B, 0xD5, 0xAC, 0xE8, 0xA4, 0xAC, 0xE0, 0xA9, 0x14, 0x8E, 0xA8, 0xAE, 0xF6, - 0x33, 0x30, 0x33, 0x0E, 0xEA, 0x4E, 0x0F, 0xB9, 0x7A, 0xA6, 0xA1, 0xAB, 0x4F, 0xDA, 0xC3, 0x72, - 0x91, 0xC1, 0x78, 0xDA, 0xD6, 0x9E, 0x82, 0xC5, 0x41, 0x81, 0xE4, 0x13, 0xDC, 0x20, 0x4C, 0xB3, - 0x3E, 0x28, 0xC4, 0x40, 0x25, 0xA0, 0x23, 0xFF, 0x50, 0x9C, 0x88, 0xE7, 0xD3, 0x0C, 0x1C, 0x7C, - 0x63, 0x7F, 0x0B, 0xF7, 0x63, 0xE8, 0xC4, 0x19, 0x78, 0xF4, 0x2E, 0x63, 0xC2, 0xE3, 0xDB, 0xD0, - 0x32, 0xF2, 0x1F, 0xCD, 0x09, 0x7B, 0xD7, 0x82, 0x5A, 0x9B, 0x89, 0x9A, 0x8B, 0x49, 0x43, 0x3E, - 0x25, 0x8D, 0xC5, 0xAD, 0x40, 0x1D, 0x07, 0x12, 0x68, 0xDC, 0x93, 0xA9, 0x8F, 0x7D, 0xE1, 0x71, - 0x81, 0x18, 0x19, 0x7D, 0x46, 0x2A, 0x11, 0x21, 0x61, 0x7E, 0xC3, 0x67, 0xF8, 0x03, 0xB4, 0xF2, - 0xB6, 0x75, 0x45, 0x34, 0x7E, 0x75, 0x5B, 0x33, 0xD6, 0xE5, 0xC5, 0xA4, 0xC8, 0x58, 0x3F, 0xD1, - 0xB1, 0xD6, 0x70, 0x48, 0xFC, 0x11, 0x89, 0x16, 0xA2, 0xF1, 0x52, 0x0C, 0x21, 0xC5, 0x50, 0x8A, - 0x8C, 0x5A, 0x26, 0x47, 0x96, 0x0C, 0xC4, 0x94, 0x25, 0xD9, 0x78, 0xBF, 0xCF, 0x95, 0x61, 0xD4, - 0x64, 0x24, 0x76, 0x5A, 0x4B, 0x5C, 0x4E, 0x1F, 0x97, 0xC1, 0x47, 0x52, 0x14, 0xB4, 0x5C, 0xA6, - 0x09, 0x68, 0x69, 0x97, 0xB5, 0x58, 0x09, 0xC0, 0x73, 0x37, 0xC0, 0x6F, 0x51, 0x2D, 0x07, 0xFF, - 0x12, 0xC1, 0x5F, 0x43, 0xAE, 0x33, 0x7A, 0x46, 0xF0, 0x5A, 0x91, 0x1F, 0xD2, 0x4B, 0xFE, 0xB6, - 0xEF, 0xB4, 0x70, 0x33, 0x00, 0xD2, 0x64, 0x6E, 0x64, 0xE5, 0x69, 0xD1, 0x77, 0x60, 0x7C, 0x1A, - 0x2F, 0xDD, 0x46, 0xD7, 0x30, 0x7B, 0x4C, 0xCF, 0xC7, 0x27, 0x64, 0x1A, 0x93, 0xD9, 0x83, 0x31, - 0x32, 0x6F, 0xDD, 0x07, 0x5C, 0x9A, 0x57, 0x4B, 0x21, 0xAF, 0x0E, 0x71, 0x0E, 0xAF, 0xBE, 0x2B, - 0xE1, 0x52, 0xE8, 0xE4, 0x0E, 0x99, 0x23, 0xD2, 0xC6, 0x7A, 0xA6, 0x93, 0x92, 0xCF, 0xC7, 0x68, - 0x52, 0xB7, 0x28, 0x43, 0x91, 0x1D, 0xA0, 0x11, 0x61, 0x69, 0x38, 0x51, 0xD5, 0xFD, 0x06, 0xBD, - 0x29, 0xDA, 0x1B, 0x7F, 0x60, 0x8D, 0x5F, 0x7A, 0xF6, 0x81, 0x96, 0x80, 0xAE, 0x18, 0xC8, 0xF6, - 0xD1, 0x07, 0x51, 0xA1, 0x48, 0xB0, 0x22, 0xFA, 0x34, 0x53, 0x01, 0x7E, 0x6E, 0x09, 0x17, 0xBE, - 0xBD, 0xDC, 0x14, 0x81, 0xE4, 0x50, 0x11, 0x49, 0x8B, 0x9F, 0x20, 0x69, 0xE6, 0xD5, 0xDC, 0xD8, - 0x61, 0x6D, 0xC7, 0x40, 0xE5, 0x50, 0xDC, 0xA7, 0x82, 0x54, 0x64, 0x8A, 0x5B, 0x95, 0xB8, 0x63, - 0xD8, 0x7A, 0x1C, 0x1C, 0x1D, 0xC7, 0x6B, 0xBE, 0x98, 0xCE, 0x58, 0x70, 0x73, 0x74, 0xC8, 0x2A, - 0x05, 0x97, 0x99, 0x50, 0x39, 0xB2, 0x09, 0x7B, 0x78, 0x4C, 0xA6, 0xD2, 0xBE, 0x69, 0x1D, 0xC0, - 0x33, 0x14, 0x8D, 0x64, 0x9D, 0x78, 0x73, 0xA5, 0x7D, 0xE3, 0x42, 0xA8, 0x3F, 0xC3, 0x5B, 0xB9, - 0xDA, 0xC7, 0xD0, 0x16, 0xFF, 0xF4, 0xF9, 0xCB, 0x3E, 0x79, 0xFE, 0x72, 0x4F, 0x9D, 0xA7, 0x65, - 0xB6, 0x96, 0x37, 0x0A, 0x61, 0x66, 0x4D, 0x18, 0x3F, 0x64, 0x0E, 0x4D, 0xDB, 0xF1, 0x79, 0xF2, - 0x2E, 0x5B, 0x94, 0x55, 0x96, 0x28, 0xD0, 0xC2, 0x4F, 0x8A, 0x2B, 0x27, 0x9D, 0xDE, 0xDB, 0xBC, - 0xE8, 0x1D, 0x38, 0x19, 0xB9, 0x9E, 0xE5, 0x53, 0xC1, 0x09, 0xAF, 0xBE, 0x97, 0x96, 0x68, 0x69, - 0x62, 0xDA, 0x02, 0x48, 0xA2, 0xD1, 0x03, 0x9F, 0x0A, 0x60, 0xD4, 0xEE, 0x37, 0x5A, 0xFB, 0x6B, - 0x98, 0x29, 0x06, 0x25, 0x52, 0xEE, 0x44, 0xD9, 0x39, 0x44, 0xA9, 0x13, 0x4C, 0x92, 0x14, 0x26, - 0x64, 0x83, 0xD1, 0x4D, 0xE1, 0x24, 0x22, 0x98, 0xB6, 0xC9, 0x39, 0xB1, 0x84, 0xEA, 0x34, 0xC3, - 0x44, 0x2C, 0x77, 0x69, 0x05, 0x9F, 0xD3, 0x0A, 0xBE, 0x24, 0x1E, 0xFF, 0x2C, 0xAF, 0x3D, 0x59, - 0x9E, 0x3C, 0xCA, 0xF6, 0x1D, 0x0D, 0x73, 0x95, 0x97, 0x43, 0xC5, 0x0A, 0x93, 0xA9, 0x7F, 0xDF, - 0x58, 0x68, 0xC7, 0x9A, 0xFA, 0x44, 0x09, 0x80, 0x0B, 0xCE, 0x3F, 0x1A, 0x1D, 0x65, 0x61, 0xF0, - 0x90, 0x89, 0xD5, 0x54, 0xEC, 0x88, 0x41, 0x00, 0x72, 0x3F, 0x28, 0x70, 0xE3, 0x21, 0x75, 0x05, - 0x6F, 0x4C, 0x71, 0x7C, 0x05, 0xEF, 0x78, 0x68, 0xB2, 0x4B, 0x93, 0xDE, 0x28, 0x8B, 0xAB, 0x4E, - 0xA6, 0x48, 0xE5, 0x14, 0x89, 0x82, 0x16, 0xC0, 0x26, 0x7E, 0xC4, 0x08, 0x85, 0x47, 0xBA, 0x93, - 0x64, 0x4B, 0x2B, 0x75, 0xFB, 0x6A, 0xD4, 0x0E, 0x69, 0x27, 0xC8, 0x12, 0x3F, 0xA0, 0x84, 0xD2, - 0x34, 0xEB, 0x11, 0x80, 0x25, 0x54, 0xFB, 0x97, 0x5A, 0x33, 0xD5, 0x60, 0x21, 0x0E, 0x10, 0x50, - 0x33, 0xC0, 0xD0, 0x0D, 0xA2, 0x31, 0xF5, 0x8E, 0x1C, 0x85, 0x98, 0x0A, 0xCE, 0x47, 0xB2, 0xE6, - 0xFF, 0xB1, 0x0C, 0x4D, 0xF5, 0xE4, 0x65, 0xAC, 0xED, 0x7C, 0x4D, 0xAB, 0xFB, 0x39, 0x51, 0xB7, - 0x9B, 0x5A, 0xF7, 0x4B, 0xA2, 0xEE, 0xAA, 0x5A, 0x57, 0xAF, 0x1E, 0xC4, 0x01, 0xD6, 0x25, 0x85, - 0x16, 0x29, 0xCF, 0xAB, 0xF2, 0x39, 0xBF, 0xCA, 0x97, 0xD4, 0x2A, 0x32, 0x79, 0x89, 0x74, 0xC7, - 0x51, 0x9E, 0x45, 0x81, 0xE9, 0x64, 0x63, 0xEC, 0x99, 0x64, 0x97, 0xC9, 0x44, 0x82, 0x3E, 0x9A, - 0x38, 0x76, 0x1D, 0xD7, 0x9F, 0x98, 0xE4, 0xA8, 0x48, 0x7D, 0xAB, 0x98, 0xCE, 0x56, 0x6C, 0x03, - 0xB1, 0xEC, 0x88, 0x2E, 0x5A, 0xA9, 0x62, 0xC1, 0xD3, 0x70, 0x89, 0x7B, 0x06, 0x90, 0x8E, 0xA4, - 0xF2, 0x49, 0xAE, 0x25, 0xCC, 0x8C, 0x96, 0x06, 0x59, 0x60, 0x84, 0xD8, 0x79, 0x70, 0x94, 0x56, - 0xBD, 0xD3, 0x84, 0x1C, 0x8C, 0x90, 0xC5, 0xC1, 0xF5, 0xB0, 0x55, 0xCB, 0x79, 0x91, 0x80, 0x9A, - 0x02, 0x67, 0x47, 0xCD, 0x4B, 0xDF, 0xA2, 0x5F, 0x57, 0x3E, 0xAF, 0x7C, 0xA9, 0x29, 0xE9, 0xE9, - 0x34, 0x4C, 0x78, 0x87, 0xD6, 0x9B, 0x49, 0x83, 0x72, 0x2A, 0x77, 0x7D, 0xFB, 0xEF, 0x18, 0xE9, - 0x54, 0xB9, 0xAA, 0x4C, 0xA3, 0x7D, 0x73, 0xBC, 0xEA, 0x96, 0x5E, 0x65, 0x61, 0xF2, 0xBA, 0x13, - 0x2A, 0x0A, 0x82, 0x8B, 0x1B, 0x6C, 0x80, 0x89, 0x54, 0xF0, 0x3C, 0x44, 0x75, 0x56, 0x41, 0x9A, - 0xC2, 0xEC, 0x13, 0x35, 0x9C, 0x68, 0xD7, 0xE6, 0x64, 0xD5, 0x70, 0x76, 0xD1, 0x72, 0x65, 0x22, - 0xA6, 0xF2, 0x02, 0x12, 0x32, 0xB1, 0xF6, 0x89, 0xA5, 0xE4, 0xCF, 0x8D, 0xDA, 0xFF, 0xD2, 0xB7, - 0xE3, 0x18, 0x49, 0x73, 0x6C, 0x0E, 0xEE, 0x1B, 0x29, 0x76, 0x35, 0x51, 0x6D, 0xFD, 0xB9, 0x11, - 0xDC, 0xDB, 0x3E, 0xB3, 0x03, 0x35, 0x9A, 0xD9, 0xAB, 0x80, 0x23, 0xAF, 0x02, 0x6D, 0x7F, 0x7A, - 0xCB, 0x0E, 0xA0, 0x0D, 0x78, 0x22, 0x6E, 0x5D, 0x7E, 0xD7, 0x49, 0x00, 0x1B, 0xB5, 0x25, 0x8B, - 0x25, 0x4B, 0x4D, 0x15, 0x6A, 0xBB, 0x68, 0xF9, 0x0C, 0x55, 0x9A, 0xF2, 0x61, 0xF5, 0x2B, 0x03, - 0x21, 0x9A, 0x31, 0x13, 0x3B, 0xFB, 0x30, 0x46, 0xA1, 0xF0, 0xEE, 0x3E, 0x6C, 0x90, 0xB7, 0xC3, - 0x97, 0xEB, 0x15, 0xDB, 0xE5, 0x87, 0x6D, 0xE6, 0xB6, 0xD3, 0x8F, 0x13, 0xAA, 0x66, 0x6F, 0x91, - 0x23, 0x03, 0x3B, 0xD9, 0x25, 0x77, 0x3A, 0xC6, 0xEA, 0x5A, 0x0B, 0x6D, 0x6E, 0x4A, 0xF8, 0xD9, - 0x67, 0x20, 0x02, 0x0A, 0xCA, 0xEF, 0xC4, 0x65, 0x23, 0x3B, 0xA0, 0x59, 0xA7, 0x3B, 0x70, 0xFE, - 0x1F, 0x01, 0xCF, 0x3A, 0xDF, 0x86, 0xD3, 0x5F, 0x2A, 0x23, 0x52, 0x4C, 0xED, 0x04, 0x61, 0xD7, - 0x30, 0xDA, 0x06, 0x8D, 0x38, 0x68, 0x4B, 0x08, 0xE9, 0x07, 0x40, 0x48, 0x7F, 0x79, 0x9D, 0xBB, - 0xFE, 0x48, 0x98, 0x2A, 0xEC, 0xFC, 0xC3, 0xB6, 0xA5, 0x77, 0xFF, 0x91, 0x34, 0x96, 0x3C, 0x01, - 0x28, 0x08, 0x85, 0x53, 0x80, 0x32, 0x77, 0xA4, 0xED, 0x2F, 0x0F, 0x03, 0xD2, 0x16, 0xF1, 0xA0, - 0x1F, 0x5D, 0x59, 0x28, 0xB9, 0x4A, 0x99, 0x24, 0x6E, 0xFA, 0x32, 0x59, 0x42, 0x16, 0x74, 0xA2, - 0x50, 0x06, 0x4E, 0x7F, 0xAA, 0x88, 0x2A, 0x49, 0x27, 0x8B, 0x57, 0xCF, 0xAC, 0x94, 0x53, 0x4A, - 0x48, 0x77, 0xE6, 0x49, 0x25, 0xA9, 0x76, 0xF3, 0xB6, 0xD6, 0xAA, 0x34, 0x56, 0xD8, 0x5E, 0x47, - 0x82, 0xF9, 0xBA, 0xCE, 0x2C, 0xD1, 0x40, 0x97, 0x3A, 0xB7, 0xE4, 0xB0, 0x59, 0xB8, 0xC6, 0x93, - 0xCF, 0x83, 0xF7, 0x26, 0x3E, 0xC3, 0xC1, 0xBD, 0x6B, 0x15, 0x7B, 0x67, 0x30, 0x8E, 0x67, 0xD3, - 0x3C, 0x32, 0x28, 0xC0, 0x14, 0x86, 0x43, 0xC0, 0xA0, 0x7A, 0x31, 0x25, 0x2F, 0x28, 0x33, 0xBC, - 0x0B, 0x74, 0xD7, 0xBF, 0xE9, 0xCE, 0x03, 0x04, 0x2B, 0xF9, 0xC8, 0x73, 0xB3, 0xA6, 0x44, 0x00, - 0x36, 0xD1, 0x32, 0x6A, 0x08, 0x55, 0xD4, 0x9B, 0x5F, 0x5E, 0x69, 0x85, 0x3E, 0x59, 0x4B, 0x46, - 0x2F, 0x59, 0x55, 0xEF, 0xFB, 0x19, 0x36, 0x69, 0xE6, 0x50, 0x1F, 0x6E, 0x19, 0x08, 0xAD, 0xED, - 0xC0, 0xA5, 0x6E, 0xDD, 0x8D, 0xD5, 0x02, 0xEF, 0x4D, 0xA6, 0xB2, 0x4C, 0xE1, 0x41, 0x0E, 0xC7, - 0x54, 0x06, 0xEB, 0x59, 0xA6, 0xD2, 0xDB, 0x24, 0x8C, 0x78, 0x71, 0xA6, 0x25, 0x22, 0x37, 0xD3, - 0x58, 0x96, 0x3C, 0xB1, 0xBF, 0x56, 0xD5, 0x92, 0xBD, 0xB4, 0xEA, 0x4E, 0xCF, 0x19, 0x21, 0xB2, - 0x59, 0x27, 0x7E, 0x4D, 0x8C, 0x6C, 0xCA, 0xA1, 0x5F, 0x3B, 0x94, 0x51, 0xF5, 0xB5, 0x94, 0xEA, - 0xA9, 0xFE, 0xCF, 0xAC, 0xD9, 0xFA, 0xD7, 0x44, 0x38, 0x7B, 0xDA, 0x3C, 0x10, 0xEC, 0x0B, 0x69, - 0xAF, 0xBA, 0x16, 0x8B, 0xC7, 0x8D, 0xE2, 0x69, 0x0B, 0x02, 0xE9, 0x66, 0x05, 0xF5, 0xA6, 0xF9, - 0x42, 0x64, 0x5B, 0x1B, 0xE2, 0x21, 0xCD, 0xB2, 0x5C, 0x44, 0x23, 0x99, 0x59, 0x29, 0x1A, 0xC0, - 0xAC, 0x5A, 0x31, 0x3F, 0x53, 0x6A, 0x29, 0xA3, 0x9B, 0x5D, 0x4B, 0x1D, 0xD4, 0x5C, 0xB3, 0x49, - 0xD8, 0xDF, 0x8A, 0xA6, 0x13, 0x79, 0xF9, 0xCA, 0x36, 0x9F, 0x08, 0xB3, 0x25, 0xDB, 0x84, 0xA2, - 0xEC, 0xB6, 0x8A, 0x9B, 0x51, 0xB4, 0x83, 0xA7, 0x8E, 0xEC, 0x62, 0xCD, 0x29, 0x55, 0x49, 0x88, - 0xCC, 0x2A, 0xE1, 0xEB, 0x5D, 0x2B, 0x44, 0x30, 0x52, 0xAC, 0x2B, 0x2A, 0x7F, 0x8A, 0x5A, 0x58, - 0x84, 0x01, 0x90, 0xAD, 0x2C, 0xEA, 0xB9, 0xA4, 0xBC, 0xA5, 0xA5, 0xD0, 0xC9, 0x66, 0xAE, 0xD6, - 0x16, 0xE5, 0x78, 0x32, 0xAB, 0xC5, 0x45, 0xE0, 0x4D, 0x69, 0xAB, 0x4B, 0x34, 0x87, 0x7E, 0xB4, - 0xE5, 0x45, 0x96, 0x16, 0x5A, 0x33, 0x7A, 0x8B, 0x62, 0x07, 0xBD, 0x49, 0xEC, 0x5C, 0xE7, 0x66, - 0xA1, 0x49, 0x9E, 0xB7, 0xE4, 0x1A, 0x6B, 0x6A, 0x93, 0x75, 0xF5, 0xC3, 0x46, 0x2E, 0x8C, 0x37, - 0xB2, 0x1D, 0xA8, 0x80, 0xD3, 0xE2, 0x62, 0x0C, 0x50, 0x92, 0x40, 0x7C, 0xD7, 0x65, 0x3D, 0x90, - 0x0C, 0x49, 0x62, 0xB8, 0x35, 0xDB, 0xBD, 0x90, 0x7F, 0x85, 0x91, 0x6E, 0xFF, 0x3B, 0xD1, 0xD4, - 0x8D, 0x7A, 0x3D, 0x0E, 0x36, 0x57, 0xEA, 0xB4, 0x0A, 0xD4, 0xF9, 0xDB, 0xDF, 0x92, 0x95, 0x3C, - 0x1C, 0x4C, 0x3D, 0x87, 0xEE, 0x7D, 0x92, 0x44, 0x0E, 0x71, 0x00, 0x81, 0xEE, 0xB2, 0xDA, 0xA6, - 0x09, 0x07, 0x88, 0x5E, 0x23, 0x32, 0x15, 0x16, 0xC6, 0x6F, 0x5D, 0xAA, 0xCA, 0x4F, 0xAA, 0x14, - 0xEE, 0x60, 0x45, 0xFB, 0xC9, 0xC9, 0x1D, 0xB5, 0x97, 0x04, 0xE6, 0x2D, 0x7A, 0x34, 0x7D, 0x04, - 0x4B, 0x30, 0x82, 0xF0, 0x78, 0x6C, 0xB5, 0x10, 0x9B, 0xF3, 0x88, 0xBE, 0xA8, 0xC4, 0x12, 0x2B, - 0xF8, 0x03, 0x0F, 0x72, 0xED, 0xAA, 0x1B, 0x8E, 0xE8, 0x2D, 0xE3, 0x2B, 0xA8, 0x9A, 0x08, 0x87, - 0xA7, 0x00, 0x76, 0xDF, 0x05, 0x1E, 0x32, 0x47, 0xF6, 0xD0, 0xD9, 0xA9, 0x8F, 0xF0, 0x5D, 0x50, - 0x27, 0x1F, 0xEE, 0x77, 0xE1, 0xE4, 0xF6, 0x6E, 0x85, 0xFC, 0x02, 0x7F, 0xF4, 0x89, 0xBA, 0xE3, - 0x7F, 0x58, 0xBB, 0xEF, 0xE2, 0x77, 0x11, 0x77, 0xD8, 0xBE, 0xE1, 0xD6, 0x7D, 0xAA, 0x23, 0xDB, - 0xDA, 0xA9, 0x03, 0x42, 0x76, 0x7E, 0xDA, 0x1B, 0x8D, 0xEA, 0x88, 0xA6, 0xC6, 0x27, 0x5F, 0x5D, - 0x6F, 0xBC, 0x4C, 0x2B, 0x2E, 0xB3, 0xA6, 0xE2, 0x1B, 0xCB, 0xF0, 0xB9, 0x8E, 0xB8, 0x77, 0x1B, - 0x83, 0x10, 0x92, 0xEC, 0x0E, 0x87, 0x10, 0x82, 0x4C, 0xE8, 0x59, 0x01, 0xB4, 0x2B, 0x81, 0x17, - 0xFD, 0x43, 0xE9, 0x16, 0xD5, 0x3B, 0xB4, 0xA3, 0x7D, 0x0C, 0x5F, 0xF0, 0xAA, 0x49, 0xEC, 0x7C, - 0x1A, 0x8F, 0xEE, 0x83, 0x60, 0x92, 0x9D, 0x81, 0x40, 0xA8, 0xC8, 0x13, 0x11, 0xBC, 0x3F, 0x62, - 0x79, 0x08, 0x60, 0xED, 0xA6, 0xA9, 0x12, 0x6A, 0x9A, 0x4D, 0x56, 0xD8, 0x84, 0x06, 0x94, 0xCB, - 0x6A, 0x84, 0xFB, 0x13, 0x0D, 0xDC, 0x31, 0xE8, 0x99, 0xB0, 0xA2, 0x87, 0xFD, 0x89, 0xEB, 0xF8, - 0x94, 0x54, 0xFA, 0xC6, 0x13, 0x4F, 0xC6, 0x81, 0x0E, 0xFA, 0x1F, 0x59, 0xEA, 0x0C, 0xB2, 0xF7, - 0x70, 0xE9, 0xAE, 0x21, 0xB9, 0x85, 0xCC, 0x18, 0xD1, 0xA5, 0x1D, 0x99, 0x0D, 0xF9, 0x2B, 0xB0, - 0x2C, 0x84, 0xE2, 0xC1, 0xE8, 0xBB, 0x46, 0xE2, 0x79, 0x86, 0x9E, 0xA4, 0xD0, 0xBB, 0xB7, 0x81, - 0x69, 0x13, 0xC1, 0x14, 0x2A, 0xE8, 0x05, 0x5F, 0x5B, 0x31, 0x29, 0xFC, 0x2C, 0x90, 0x3A, 0xAA, - 0xA2, 0x8A, 0xAD, 0x38, 0xEE, 0xBC, 0xDA, 0xC2, 0x46, 0x3D, 0xCC, 0x9B, 0xF6, 0xA3, 0x07, 0x3E, - 0x8D, 0x1D, 0x64, 0xCC, 0x05, 0x16, 0x14, 0x1B, 0xBC, 0x7D, 0xF6, 0xA0, 0x48, 0xF6, 0x00, 0x42, - 0xA5, 0xC2, 0x83, 0xC8, 0x2A, 0xE7, 0x0E, 0x24, 0x7B, 0xF5, 0xEA, 0xC7, 0x0F, 0x26, 0xA5, 0xE3, - 0xF5, 0x0C, 0x68, 0x82, 0x2D, 0xC5, 0x06, 0x55, 0xD0, 0x05, 0x87, 0xEE, 0xA3, 0x03, 0x87, 0x7E, - 0x21, 0x83, 0x08, 0xF7, 0xF9, 0x85, 0xE9, 0x5D, 0x3C, 0xFF, 0x04, 0x80, 0x3C, 0x39, 0x14, 0x6C, - 0x5C, 0x1C, 0xB7, 0x43, 0x8D, 0x19, 0x17, 0x77, 0x14, 0x5A, 0x3F, 0x74, 0x27, 0xAE, 0x0C, 0x55, - 0xDE, 0x27, 0x43, 0x31, 0xB3, 0x96, 0x08, 0x97, 0x00, 0x30, 0x04, 0xC7, 0x2C, 0x03, 0x05, 0x61, - 0x6B, 0x1F, 0x12, 0x3B, 0x41, 0xD6, 0x14, 0xA2, 0x2F, 0xA0, 0x24, 0x91, 0x1D, 0x2A, 0xAA, 0x2D, - 0x4A, 0xB5, 0x08, 0x78, 0x47, 0xDF, 0x87, 0x26, 0x5F, 0xE6, 0x05, 0x2B, 0xDE, 0xD4, 0x1B, 0x05, - 0xEE, 0x00, 0x32, 0xFC, 0x13, 0x11, 0x5C, 0x01, 0x18, 0xFF, 0x42, 0x7B, 0x01, 0x26, 0x4D, 0x89, - 0xAB, 0xBF, 0xC5, 0xF0, 0x21, 0x1F, 0x3C, 0x98, 0x39, 0xFF, 0x62, 0x52, 0x7A, 0x76, 0x2C, 0x3E, - 0x1E, 0xA1, 0x70, 0x8B, 0x09, 0x7F, 0x22, 0xF8, 0x21, 0x73, 0x89, 0x16, 0x26, 0xF5, 0xDB, 0xA1, - 0xED, 0xB4, 0x7D, 0xEF, 0xE1, 0x3B, 0x48, 0x38, 0x1F, 0xD6, 0x8B, 0xC3, 0x0E, 0x22, 0x7C, 0xF4, - 0x25, 0x99, 0x54, 0x69, 0x08, 0x17, 0x4E, 0xD1, 0xF0, 0x13, 0xAE, 0xD3, 0xE5, 0x85, 0x21, 0x35, - 0x0D, 0x09, 0x9C, 0x42, 0x62, 0xB0, 0x52, 0x22, 0x12, 0x27, 0x99, 0x86, 0x24, 0xAE, 0x09, 0xA9, - 0x48, 0xA2, 0xC0, 0x9B, 0x68, 0x55, 0x8B, 0xB6, 0x0D, 0x71, 0x58, 0x4E, 0x11, 0xC1, 0xC7, 0x4A, - 0xE2, 0x9C, 0xB9, 0x89, 0xBD, 0xE8, 0x04, 0x2F, 0x1B, 0xB9, 0x13, 0x82, 0x10, 0x9E, 0x11, 0x88, - 0x00, 0x50, 0xDA, 0x7C, 0x6E, 0xED, 0x4E, 0xAA, 0x4E, 0x49, 0xD8, 0x92, 0xE7, 0x43, 0xC1, 0x83, - 0x55, 0x87, 0x40, 0xFF, 0x4C, 0x41, 0x71, 0x79, 0x7D, 0x4A, 0x88, 0x29, 0xED, 0x50, 0x6D, 0xBB, - 0x84, 0x92, 0xCD, 0x56, 0xB3, 0x11, 0x2D, 0x45, 0x94, 0xAB, 0xC4, 0x83, 0x95, 0x95, 0x4B, 0x7C, - 0x47, 0xD4, 0xE9, 0x3D, 0x4B, 0x59, 0x15, 0xDF, 0x12, 0x66, 0x6F, 0x53, 0xA4, 0x7D, 0x78, 0x62, - 0x4E, 0xB0, 0xF4, 0x51, 0xB2, 0x62, 0x50, 0xB2, 0x62, 0xC1, 0xAF, 0x9D, 0x39, 0x25, 0xC2, 0x62, - 0xB0, 0x2A, 0xE7, 0xBE, 0x62, 0xD4, 0x6A, 0x42, 0x7C, 0x26, 0x9E, 0x3B, 0x84, 0x97, 0xF2, 0x08, - 0xE8, 0xF0, 0xD7, 0x0F, 0xA6, 0x63, 0x8D, 0xB0, 0xA7, 0xB0, 0x99, 0x82, 0x49, 0xB6, 0xA7, 0x9A, - 0x08, 0x5E, 0xE3, 0x62, 0x09, 0xA4, 0x4A, 0xB5, 0xA5, 0x77, 0xBC, 0x35, 0xFE, 0xAA, 0x57, 0xA9, - 0x96, 0xE6, 0xAD, 0xEB, 0xC1, 0x8D, 0x33, 0xFD, 0x6F, 0x46, 0x4B, 0x25, 0xE5, 0x57, 0x4E, 0xB2, - 0x2F, 0x31, 0xB7, 0xA2, 0xC2, 0x8C, 0x30, 0x07, 0x93, 0x30, 0xD0, 0x13, 0xEC, 0x0D, 0x58, 0x54, - 0x0E, 0x2B, 0x6C, 0x8F, 0x68, 0xC2, 0x26, 0xB4, 0x82, 0xD8, 0x9F, 0x81, 0x1B, 0xC0, 0xF1, 0xF2, - 0xAF, 0x60, 0x81, 0x17, 0xB3, 0x5A, 0x71, 0xC0, 0xFB, 0xA6, 0x27, 0x98, 0x69, 0xCF, 0xCC, 0xE0, - 0xBE, 0xED, 0xB9, 0x53, 0x42, 0x11, 0x87, 0x2B, 0x3E, 0x02, 0x3B, 0x15, 0x72, 0x84, 0x29, 0x7B, - 0x1C, 0x4D, 0x43, 0x98, 0x85, 0xFF, 0x9B, 0xCB, 0x27, 0xB6, 0x84, 0xA7, 0xAE, 0xA8, 0xE1, 0x81, - 0x53, 0xBD, 0x0B, 0xA9, 0x3A, 0x8C, 0x64, 0xA6, 0xD1, 0x74, 0x4C, 0x35, 0xE1, 0x41, 0xAD, 0x16, - 0x7A, 0x04, 0x5F, 0x6E, 0x67, 0xC8, 0xC4, 0x9D, 0x6C, 0x43, 0xA8, 0x8C, 0x3F, 0x93, 0xF1, 0x19, - 0xD7, 0xF4, 0xAF, 0x35, 0x28, 0x12, 0xA2, 0x30, 0x34, 0x0F, 0x37, 0x4B, 0x53, 0x86, 0xA2, 0x3C, - 0x65, 0xB9, 0x0C, 0x8D, 0x8D, 0x97, 0x73, 0x9A, 0xFD, 0xEC, 0x6B, 0xA4, 0xF3, 0x21, 0xCB, 0x18, - 0x33, 0x8B, 0xED, 0x3F, 0x9F, 0x58, 0xA5, 0x89, 0x17, 0x39, 0x23, 0x8A, 0x7F, 0x35, 0xB6, 0x1C, - 0x9B, 0x84, 0x52, 0x4B, 0x85, 0x2B, 0x4E, 0x8E, 0x6A, 0x70, 0xF7, 0x00, 0x42, 0x04, 0x58, 0x00, - 0x1D, 0x0C, 0x78, 0x1E, 0x8E, 0x7D, 0x58, 0x74, 0x1B, 0x89, 0xB7, 0x07, 0x59, 0x30, 0xEA, 0xD5, - 0xA0, 0x58, 0x92, 0x10, 0x66, 0xAF, 0x8D, 0x60, 0x2A, 0x0E, 0x28, 0x29, 0x47, 0x4C, 0x66, 0x67, - 0x4E, 0x6B, 0x14, 0x76, 0x32, 0x2A, 0x87, 0xF4, 0x0A, 0x62, 0xA2, 0xD7, 0xAD, 0xB5, 0xCD, 0xB4, - 0x2D, 0x00, 0x69, 0xC3, 0x72, 0xAC, 0xE4, 0x75, 0xAE, 0x50, 0x02, 0x98, 0xA8, 0x73, 0xDA, 0xBC, - 0x2D, 0x79, 0x9D, 0x4B, 0x4D, 0xF6, 0x32, 0x14, 0xCB, 0x4B, 0x74, 0x6E, 0x6A, 0x4D, 0x32, 0xBB, - 0x75, 0x6D, 0x95, 0xE9, 0xD6, 0xD4, 0x4A, 0x4B, 0xBF, 0x90, 0xD9, 0xB1, 0xF4, 0x66, 0x91, 0x70, - 0x5A, 0xFA, 0xAE, 0x75, 0x8C, 0x4E, 0x27, 0x35, 0x45, 0x6F, 0x60, 0x8F, 0x68, 0x82, 0x51, 0xEC, - 0xF8, 0x74, 0xB7, 0x9B, 0x3D, 0x7E, 0x4A, 0xE5, 0x42, 0xFD, 0x9D, 0x90, 0x8D, 0xF6, 0x29, 0xDD, - 0x2F, 0x95, 0xE9, 0x6E, 0x56, 0x2B, 0xC5, 0x73, 0xE3, 0x7E, 0x30, 0x39, 0x0A, 0xEE, 0xB1, 0xE7, - 0xE0, 0x40, 0x43, 0x38, 0x2F, 0x39, 0xFC, 0x70, 0xD0, 0xCB, 0x21, 0x57, 0xC8, 0xAA, 0x76, 0xD2, - 0x93, 0x79, 0x1D, 0xC2, 0xCF, 0xA3, 0x5D, 0x48, 0x75, 0x56, 0x04, 0x84, 0xDC, 0x11, 0x52, 0x08, - 0xB1, 0x74, 0xD4, 0x81, 0x4B, 0x39, 0x2C, 0x24, 0xDC, 0xFE, 0xE0, 0xEB, 0xA3, 0x7D, 0x67, 0x9F, - 0xB3, 0x36, 0x85, 0xDF, 0xE8, 0x12, 0xDA, 0x7C, 0xAD, 0xC3, 0xF3, 0x9E, 0x51, 0xD9, 0x9F, 0x77, - 0xFA, 0xFD, 0xC4, 0xE9, 0x42, 0xD9, 0x04, 0x8B, 0x18, 0x53, 0xF7, 0xC0, 0xC0, 0x79, 0xB1, 0x22, - 0x6C, 0x73, 0x95, 0x67, 0xA4, 0x8D, 0xA6, 0x1A, 0x10, 0xAD, 0xBC, 0xC6, 0x29, 0x5B, 0x7C, 0x69, - 0x71, 0xCA, 0xAB, 0xA7, 0xE7, 0xF8, 0x31, 0xCC, 0x74, 0x2A, 0x0F, 0xBE, 0xC2, 0xCD, 0xC4, 0x9D, - 0x1B, 0x0C, 0xD5, 0x99, 0x3F, 0x64, 0xD7, 0x8D, 0xF5, 0x30, 0xB5, 0xE7, 0x01, 0x87, 0x49, 0x4A, - 0x20, 0x95, 0xEC, 0x27, 0xFB, 0xD8, 0xA6, 0xAB, 0x1F, 0x04, 0xCF, 0xE1, 0xF1, 0x24, 0x78, 0x96, - 0x66, 0x9D, 0xFE, 0xF8, 0xC0, 0xF3, 0x4B, 0x1C, 0x28, 0xE4, 0xA5, 0xBA, 0x48, 0x70, 0x4A, 0x52, - 0x89, 0x20, 0xF2, 0xE3, 0x40, 0x40, 0x18, 0xD9, 0x39, 0x90, 0x4D, 0x03, 0x90, 0x54, 0x4B, 0xA4, - 0x6A, 0x06, 0x79, 0xE0, 0x29, 0x36, 0xC1, 0xD4, 0x21, 0x19, 0x6B, 0xC8, 0x71, 0x9D, 0xEC, 0xDA, - 0xD0, 0x60, 0xEA, 0x79, 0xB0, 0x8B, 0xA1, 0x7D, 0x82, 0xB1, 0xA6, 0x97, 0xA2, 0xBD, 0x4F, 0xBE, - 0x20, 0x67, 0x23, 0x9F, 0x2F, 0xD0, 0xD5, 0x04, 0x2A, 0x4B, 0x76, 0x04, 0xD8, 0xA9, 0xA2, 0x23, - 0xF4, 0x60, 0x69, 0x47, 0x6C, 0x11, 0x1F, 0x95, 0x5A, 0x70, 0x8C, 0x52, 0x4A, 0x42, 0xD7, 0x30, - 0x52, 0xA8, 0x8E, 0x85, 0xAC, 0xBF, 0x2E, 0x0F, 0x84, 0xC1, 0x50, 0x55, 0x41, 0x1A, 0x19, 0x89, - 0xB6, 0x2D, 0xA8, 0x1E, 0xA1, 0x92, 0x1F, 0xEA, 0xCD, 0x6B, 0x4A, 0x87, 0xAD, 0x15, 0x8F, 0x8D, - 0x52, 0x5F, 0x15, 0x69, 0xC8, 0x80, 0x1A, 0xBB, 0xE8, 0x8A, 0x59, 0x8A, 0xC3, 0x1A, 0xD4, 0xD4, - 0x42, 0x20, 0xBC, 0xE5, 0xC7, 0xE0, 0x10, 0x5C, 0x53, 0x9F, 0x5F, 0x55, 0xAE, 0x20, 0x78, 0xAB, - 0x0A, 0x48, 0xB5, 0xD9, 0xB1, 0x13, 0x94, 0xA5, 0xE4, 0xC8, 0xA6, 0xF5, 0x08, 0x06, 0xED, 0xBC, - 0x94, 0x32, 0x3B, 0xA7, 0xA0, 0x6D, 0x6A, 0x4C, 0x34, 0xB5, 0x03, 0x68, 0x48, 0x27, 0x00, 0xA7, - 0x0D, 0x24, 0x2C, 0x05, 0x80, 0xE0, 0x14, 0x9B, 0x3B, 0xB3, 0x38, 0xB1, 0x51, 0xFE, 0x5F, 0x44, - 0x56, 0x4F, 0x9F, 0x2E, 0x6C, 0xDB, 0x49, 0xED, 0x1C, 0x21, 0xFA, 0xC8, 0x2A, 0x35, 0xEE, 0xE4, - 0xBF, 0xE5, 0x6E, 0xA6, 0xE2, 0x15, 0x1F, 0xFC, 0x50, 0x20, 0xB0, 0x07, 0x3F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x6B, 0x15, 0x75, 0x15, 0x61, 0x0B, 0xDB, 0x03, 0xD0, 0x50, 0x6A, 0xF3, 0x81, 0x6C, 0x72, - 0xD9, 0xB5, 0xC4, 0xB6, 0xBA, 0xCE, 0x59, 0xF6, 0xC3, 0x7B, 0x1C, 0x48, 0xFA, 0x49, 0xD9, 0x4F, - 0xE4, 0xEA, 0x30, 0xD5, 0x71, 0x4B, 0x55, 0x87, 0x52, 0x5A, 0x31, 0x5D, 0x57, 0x0F, 0xAE, 0x2F, - 0x2F, 0x8F, 0xCE, 0xAF, 0xB4, 0x9D, 0x4D, 0xED, 0x67, 0x24, 0xF9, 0x44, 0x25, 0x4F, 0x27, 0xA0, - 0x12, 0xC1, 0x71, 0xE3, 0xC7, 0xF4, 0x50, 0x52, 0xF8, 0x2A, 0x32, 0xF5, 0x78, 0x40, 0x1D, 0x51, - 0x08, 0xB9, 0x0F, 0x35, 0xEA, 0xF8, 0x2A, 0xB1, 0x63, 0x3B, 0x1B, 0x52, 0x0A, 0x49, 0x72, 0xBA, - 0x6B, 0x80, 0xDF, 0x4B, 0x3D, 0xD8, 0xE9, 0x05, 0x53, 0x6E, 0x25, 0x8A, 0x27, 0xCF, 0x35, 0xA7, - 0xE5, 0x61, 0xE2, 0x32, 0x23, 0x31, 0xDB, 0x5F, 0x76, 0x1D, 0x7E, 0x25, 0xE3, 0xAD, 0x5F, 0xDE, - 0x8B, 0x69, 0x83, 0x84, 0xD4, 0x27, 0x47, 0x86, 0xF0, 0xE1, 0x3D, 0xCF, 0xA2, 0x0D, 0xA6, 0xAB, - 0x3B, 0xB1, 0x97, 0x3F, 0x77, 0x01, 0xFA, 0x5D, 0x80, 0x66, 0x8D, 0x95, 0xC5, 0xF5, 0x45, 0x56, - 0x58, 0x19, 0xA5, 0x76, 0x7D, 0x55, 0xA8, 0x4A, 0x59, 0x5D, 0x87, 0x0C, 0xB8, 0x38, 0xDD, 0x44, - 0x7F, 0x8C, 0xD0, 0x35, 0x14, 0x74, 0x6B, 0xA7, 0x96, 0xFE, 0xA8, 0x82, 0x96, 0x9E, 0x66, 0x8A, - 0xE2, 0x0E, 0x01, 0x6A, 0xD6, 0xA5, 0x85, 0xCD, 0xBB, 0xBC, 0x35, 0x80, 0x6A, 0x8B, 0x90, 0x1B, - 0xF2, 0x6C, 0x90, 0x5F, 0x41, 0x49, 0x1C, 0xB2, 0xDC, 0xC0, 0x0C, 0x49, 0xE0, 0xEF, 0x07, 0x70, - 0xEB, 0x5E, 0x68, 0x69, 0xD2, 0x6F, 0x56, 0x52, 0x39, 0x56, 0x62, 0xF6, 0x2A, 0x88, 0x98, 0xC9, - 0x31, 0xF1, 0x8A, 0x40, 0x51, 0x9D, 0xAE, 0x40, 0x93, 0x6E, 0x48, 0x54, 0x4C, 0x3B, 0x49, 0xC3, - 0xA5, 0xF2, 0x96, 0x49, 0xC2, 0xAF, 0xF2, 0xBD, 0xFD, 0x80, 0x1D, 0x64, 0xC2, 0x7B, 0x39, 0x5E, - 0xDD, 0xE7, 0x49, 0x59, 0x80, 0xB7, 0xCF, 0xB0, 0x84, 0x91, 0x71, 0x77, 0x02, 0xFB, 0x8E, 0x65, - 0x45, 0x01, 0xC7, 0x13, 0xAA, 0x45, 0xF8, 0x79, 0x0D, 0xBE, 0xC5, 0xFE, 0x87, 0xC8, 0x76, 0xD0, - 0xE1, 0x61, 0xDB, 0x0A, 0x7F, 0xA8, 0x99, 0xDE, 0x14, 0x3D, 0x2F, 0x43, 0x60, 0x27, 0xA0, 0x4E, - 0x20, 0xF7, 0x74, 0x03, 0x90, 0x1E, 0x39, 0x04, 0x97, 0x72, 0x0A, 0x0E, 0x61, 0x46, 0x35, 0x09, - 0x1F, 0xE4, 0xB4, 0xD5, 0x7E, 0xFB, 0xE0, 0xE2, 0xE2, 0xF2, 0xF0, 0xE4, 0x7C, 0xEF, 0xEA, 0xE8, - 0xE6, 0xE4, 0xBC, 0x77, 0x7D, 0x75, 0x73, 0xF5, 0xB9, 0x07, 0xBF, 0x7E, 0xDC, 0x3B, 0x3D, 0x39, - 0xBC, 0xB9, 0x3E, 0xFF, 0xE5, 0xFC, 0xE2, 0xD3, 0xB9, 0x70, 0x19, 0x60, 0x99, 0xFE, 0xBD, 0x18, - 0x56, 0x17, 0xE9, 0x51, 0xF0, 0x14, 0xD5, 0x15, 0x58, 0x78, 0x60, 0x8F, 0xCD, 0x91, 0xAE, 0x88, - 0x69, 0xB4, 0x8B, 0xBB, 0x53, 0x4C, 0x1F, 0xB4, 0x48, 0x5C, 0xA2, 0x12, 0xFD, 0x42, 0xB6, 0x66, - 0x01, 0xE4, 0x41, 0x8F, 0xD8, 0xC3, 0xF2, 0x33, 0x43, 0x7C, 0x16, 0xC8, 0x1B, 0x7A, 0xBC, 0x37, - 0xE9, 0x22, 0x37, 0xA4, 0xFC, 0x27, 0xAC, 0x9E, 0xFA, 0x82, 0x06, 0x1F, 0x98, 0x0E, 0xC2, 0xC0, - 0x18, 0xAA, 0x5C, 0x6D, 0x87, 0x08, 0x03, 0x51, 0x88, 0x10, 0x7C, 0xE7, 0x87, 0x75, 0xF6, 0x10, - 0xFB, 0xC8, 0xAA, 0xC1, 0x8B, 0x30, 0x34, 0x4B, 0x0F, 0xBB, 0x6D, 0xF5, 0x5B, 0x68, 0xB9, 0x05, - 0xCE, 0x60, 0x2D, 0x3A, 0x60, 0x6D, 0xE5, 0x22, 0x51, 0x7C, 0x94, 0x3B, 0x1C, 0x82, 0x84, 0x9A, - 0x56, 0x22, 0x8B, 0x7C, 0xCB, 0x1E, 0xDA, 0x41, 0x3C, 0x64, 0x44, 0x15, 0xA7, 0x87, 0x96, 0x40, - 0x0B, 0x99, 0x7F, 0x74, 0x3B, 0xA0, 0xE5, 0xDB, 0xD2, 0x52, 0x76, 0x9E, 0x5A, 0x11, 0x23, 0xC0, - 0xA9, 0x2F, 0xD7, 0x9B, 0xF1, 0x68, 0x2E, 0x2D, 0x01, 0x4F, 0xE1, 0xBD, 0x8C, 0xA1, 0xEB, 0x5A, - 0x45, 0x9A, 0x23, 0xD2, 0x3C, 0x1E, 0xF4, 0xF2, 0xED, 0xDB, 0x80, 0x5E, 0xE8, 0x5B, 0x26, 0x84, - 0xD0, 0xB4, 0x51, 0x49, 0x7A, 0xF9, 0x15, 0x3C, 0x3D, 0x10, 0x11, 0x91, 0x02, 0xEF, 0x0F, 0x5F, - 0x12, 0x06, 0x1A, 0x89, 0x99, 0xB8, 0xD0, 0x23, 0x27, 0x03, 0x90, 0xA9, 0x89, 0xEB, 0xFB, 0x36, - 0xF8, 0xA9, 0x31, 0x09, 0x81, 0xD9, 0x1B, 0x09, 0x4F, 0x3C, 0x53, 0x85, 0x2F, 0x67, 0x67, 0xED, - 0x31, 0xFB, 0x11, 0x3E, 0x22, 0xED, 0xD7, 0x65, 0xED, 0xD7, 0xB3, 0xB3, 0x7E, 0xBF, 0xED, 0xD3, - 0x1F, 0x19, 0x02, 0xD2, 0x7D, 0x27, 0x30, 0x96, 0x85, 0xEF, 0xB1, 0x56, 0x93, 0x04, 0x67, 0x17, - 0x42, 0x78, 0x66, 0xE7, 0xE2, 0xFF, 0x05, 0x2F, 0x3E, 0xC7, 0x6D, 0xA3, 0x35, 0x32, 0x0B, 0xB7, - 0x8C, 0xD5, 0xD5, 0xB5, 0x37, 0x34, 0x51, 0x12, 0xE5, 0x65, 0x5B, 0x70, 0x23, 0x8C, 0xB5, 0xC1, - 0x2E, 0xEA, 0xCE, 0x03, 0xF3, 0x05, 0xCC, 0x4A, 0x83, 0x46, 0xD4, 0x92, 0xE9, 0xD7, 0x45, 0xE6, - 0x08, 0x72, 0x48, 0x59, 0x40, 0x09, 0x32, 0xD6, 0x51, 0x77, 0xBD, 0xDD, 0x35, 0xD6, 0xB6, 0x74, - 0xB4, 0xC4, 0x1A, 0x6B, 0x17, 0xAD, 0xCE, 0x99, 0x94, 0x2E, 0xA5, 0x66, 0x35, 0xA6, 0x66, 0xB9, - 0x63, 0xAC, 0x2F, 0x77, 0x3A, 0xCB, 0xC6, 0x7A, 0xBB, 0xB3, 0xD1, 0xD5, 0xD2, 0xA3, 0xD7, 0x7A, - 0xBB, 0xE0, 0x9F, 0x3B, 0x27, 0xDA, 0xDE, 0x00, 0x51, 0x77, 0xF8, 0x11, 0x7B, 0x8C, 0xA0, 0x4E, - 0x07, 0xC8, 0xD9, 0xDC, 0xDC, 0xDA, 0xEA, 0xA2, 0xC6, 0x21, 0x13, 0x30, 0xA8, 0xC2, 0x7E, 0x6B, - 0x46, 0x44, 0x8A, 0xFB, 0x62, 0x07, 0x0F, 0xCD, 0x80, 0x28, 0xD5, 0xBE, 0x3D, 0x74, 0x94, 0x1D, - 0x87, 0x3C, 0x9D, 0x8D, 0x58, 0x9B, 0x08, 0xDA, 0x2B, 0x2A, 0x67, 0xDB, 0x36, 0xF0, 0x85, 0xDD, - 0x13, 0xB4, 0x5E, 0x0B, 0xF8, 0x07, 0xBE, 0xAA, 0xF4, 0xEA, 0x0C, 0x1C, 0x66, 0x89, 0x52, 0xA3, - 0xEC, 0x60, 0x3A, 0x45, 0xF0, 0x9D, 0x97, 0xE9, 0x50, 0x42, 0xA5, 0xA2, 0xB1, 0x5D, 0x5E, 0x06, - 0x50, 0x90, 0x03, 0x2D, 0x1E, 0x6E, 0xA2, 0xCB, 0x61, 0x6D, 0xB5, 0x1D, 0x96, 0xB3, 0x98, 0x96, - 0x60, 0xA6, 0xDF, 0x59, 0xEA, 0x34, 0x1A, 0xCF, 0xCB, 0xD1, 0x86, 0x78, 0x90, 0x4F, 0x10, 0x69, - 0xAC, 0x62, 0xA2, 0x48, 0x33, 0x2D, 0xFC, 0x97, 0xBF, 0x88, 0xB2, 0x15, 0x7F, 0x4B, 0x19, 0xE0, - 0x1D, 0xEA, 0x81, 0x0D, 0x4F, 0x32, 0xA4, 0x96, 0x6F, 0x34, 0x9B, 0x4D, 0x78, 0x2D, 0x2C, 0xA9, - 0x01, 0xA4, 0xC7, 0xB7, 0xAA, 0x2F, 0xEB, 0x0C, 0xB2, 0xE4, 0x06, 0xC1, 0x22, 0x98, 0xE9, 0xDD, - 0x15, 0x73, 0xCC, 0xA7, 0xB7, 0xBD, 0x84, 0xCD, 0xCE, 0x20, 0x0C, 0x17, 0x8B, 0xB7, 0x17, 0x74, - 0xBC, 0xC8, 0xE6, 0x15, 0x71, 0x21, 0x92, 0xC1, 0x70, 0x85, 0x23, 0xC3, 0x10, 0x60, 0xB3, 0x40, - 0x31, 0x43, 0x04, 0x22, 0x2C, 0x8E, 0x71, 0xBD, 0xE5, 0x9D, 0x48, 0x79, 0xB1, 0xAB, 0x6D, 0x39, - 0xBA, 0x8C, 0xA6, 0x67, 0xB4, 0x9D, 0x69, 0x40, 0x3D, 0x64, 0x32, 0x50, 0x45, 0x88, 0xCE, 0xCE, - 0x64, 0xD7, 0xE4, 0x63, 0x9B, 0x2C, 0xE6, 0x64, 0x01, 0x92, 0x97, 0xE6, 0x78, 0x09, 0xA7, 0x21, - 0x03, 0x17, 0x77, 0x0D, 0xBA, 0x46, 0x91, 0x71, 0x59, 0xEE, 0x24, 0x0C, 0xF0, 0xB3, 0x8E, 0xC1, - 0xCD, 0xF9, 0xC5, 0xCD, 0xE1, 0xD1, 0xC1, 0xC9, 0xD9, 0xDE, 0x69, 0x62, 0x38, 0x7C, 0x4C, 0x56, - 0x29, 0x0B, 0x3A, 0x17, 0x91, 0xA4, 0xF0, 0x5D, 0x92, 0x0D, 0x76, 0x66, 0x63, 0x4D, 0xB4, 0xAC, - 0x8B, 0xE7, 0x98, 0xC4, 0x71, 0xB1, 0x4D, 0xC8, 0xCF, 0xBF, 0x46, 0x7C, 0xE3, 0x2D, 0x80, 0x75, - 0xC2, 0xB3, 0x6F, 0x9A, 0xED, 0x58, 0x88, 0x6E, 0x29, 0x86, 0xB2, 0x82, 0x36, 0xC8, 0xF2, 0x40, - 0x23, 0x0E, 0x43, 0x24, 0x2B, 0x68, 0x75, 0x03, 0x02, 0xF3, 0x9B, 0x4A, 0x48, 0x8B, 0x3C, 0xBD, - 0x53, 0xB6, 0x41, 0x3A, 0xC4, 0x7F, 0x85, 0x61, 0x49, 0x0D, 0xAE, 0x8D, 0xB6, 0x1D, 0xCA, 0xAC, - 0x85, 0x09, 0x2A, 0xCF, 0x59, 0x3A, 0x65, 0x53, 0x67, 0xE4, 0x3A, 0x4C, 0xD8, 0xD4, 0xD2, 0xB5, - 0x68, 0xBA, 0xCA, 0xAB, 0xF8, 0x1C, 0x67, 0x6B, 0xE1, 0xB9, 0x1A, 0x4F, 0x52, 0x49, 0x56, 0xD2, - 0x66, 0xA8, 0x3A, 0x57, 0x4A, 0xCF, 0xC9, 0xF4, 0x19, 0xA9, 0x17, 0x5A, 0x99, 0x43, 0xD4, 0x5B, - 0x96, 0xB7, 0xD0, 0x80, 0x4E, 0x91, 0xD8, 0xB2, 0x02, 0xB8, 0x78, 0x59, 0x53, 0xA4, 0x4D, 0x12, - 0xAD, 0x0E, 0x13, 0x8E, 0xE5, 0x85, 0x49, 0xC7, 0xCD, 0xD9, 0xD9, 0xCD, 0xE1, 0x5E, 0xFF, 0x43, - 0x42, 0x46, 0xB8, 0xD7, 0x57, 0xAC, 0xD0, 0x78, 0x98, 0xC8, 0x72, 0x22, 0xB0, 0x28, 0x16, 0x08, - 0xAE, 0xEB, 0xA1, 0x29, 0x24, 0x86, 0x88, 0xC7, 0x2E, 0x6D, 0x98, 0xC5, 0x06, 0x9D, 0xAF, 0x82, - 0xAE, 0x4D, 0x8E, 0xF4, 0xEB, 0x1B, 0xB7, 0xF4, 0x51, 0xEB, 0x46, 0xA3, 0x16, 0xEE, 0xAA, 0x17, - 0x30, 0x6A, 0x44, 0xFF, 0xBF, 0xC2, 0x81, 0x7B, 0x55, 0x8B, 0xA4, 0xC0, 0xA6, 0x62, 0x6B, 0xA5, - 0xD8, 0xAD, 0x6E, 0xDC, 0x2D, 0xCD, 0x62, 0xF9, 0x3B, 0x58, 0xC7, 0x98, 0x90, 0xC6, 0x56, 0xA2, - 0x39, 0xCB, 0xE8, 0x76, 0x1E, 0xB3, 0x62, 0x1D, 0xFF, 0x23, 0xD9, 0xC0, 0x35, 0x2C, 0x5A, 0xA4, - 0x86, 0x2D, 0x3C, 0x47, 0xD1, 0x4F, 0xE5, 0x9A, 0x3F, 0x62, 0xDD, 0x68, 0xC4, 0xD0, 0xA2, 0x4E, - 0x38, 0x4C, 0x71, 0xBC, 0xB2, 0x61, 0x7B, 0x8D, 0xAA, 0xF5, 0x7F, 0xA6, 0x56, 0x0D, 0x2D, 0x67, - 0xD2, 0xDD, 0x95, 0x06, 0x04, 0xBB, 0xBE, 0xD2, 0x14, 0x44, 0xF9, 0x4B, 0xB6, 0x9A, 0x6A, 0xA8, - 0xAD, 0x66, 0x58, 0x84, 0x37, 0xC8, 0xC3, 0x2B, 0x02, 0xC1, 0xD6, 0x0F, 0x46, 0xE5, 0x38, 0x1A, - 0xB5, 0x85, 0xDC, 0x69, 0x00, 0x7F, 0x98, 0xFC, 0xFE, 0x00, 0x5A, 0xF5, 0x5D, 0xF9, 0x3A, 0x00, - 0x4C, 0xDA, 0xB7, 0x84, 0x6D, 0x63, 0x8C, 0xEA, 0xCA, 0x44, 0xAA, 0xB7, 0x10, 0x0E, 0x06, 0xF2, - 0xA3, 0xE4, 0x40, 0x3D, 0x25, 0x46, 0x20, 0xAE, 0xA5, 0x93, 0x9F, 0x94, 0xAB, 0x03, 0x6E, 0x36, - 0x95, 0xAE, 0x46, 0x59, 0x50, 0x89, 0x46, 0x02, 0x8B, 0x8B, 0x60, 0x53, 0x3F, 0xDF, 0x63, 0x81, - 0x8B, 0xBF, 0x35, 0x05, 0x86, 0x27, 0xAE, 0x9A, 0x45, 0x42, 0xD2, 0x2E, 0xE4, 0x66, 0x24, 0xF5, - 0x46, 0x3C, 0x44, 0x91, 0xD3, 0xE0, 0x8C, 0xE0, 0xE6, 0x0B, 0x2D, 0x3C, 0x02, 0xCC, 0x1B, 0x66, - 0xFF, 0xF3, 0xD9, 0xFE, 0xC5, 0x29, 0x83, 0x9A, 0x88, 0xD8, 0x19, 0xB9, 0xCE, 0x90, 0xE6, 0x2C, - 0x39, 0xC4, 0x43, 0x0F, 0xAB, 0x56, 0x98, 0xE4, 0x80, 0x28, 0x63, 0x4C, 0xCE, 0x7B, 0x2A, 0x04, - 0x7D, 0x45, 0x32, 0x89, 0x37, 0x8C, 0x6D, 0x35, 0x63, 0x57, 0x54, 0xFC, 0x0E, 0xA5, 0xAB, 0xC5, - 0x48, 0x01, 0xA4, 0x48, 0xD9, 0x20, 0x39, 0x9D, 0xDF, 0x34, 0x35, 0xE9, 0xC1, 0x66, 0x1C, 0xEA, - 0x54, 0xFA, 0xA2, 0x69, 0x95, 0xE0, 0xE5, 0x12, 0x99, 0x69, 0x54, 0xF1, 0x84, 0x55, 0xB7, 0x35, - 0x97, 0x29, 0x73, 0x92, 0x9A, 0x6A, 0xE4, 0x2D, 0xBF, 0x08, 0x7D, 0x4C, 0x02, 0xAB, 0x51, 0xF8, - 0xDF, 0xFF, 0x25, 0x93, 0x08, 0xDF, 0xEA, 0x35, 0x85, 0xD0, 0x4A, 0x90, 0x91, 0xB6, 0xEF, 0xAA, - 0xC6, 0x99, 0x4B, 0xFF, 0xFB, 0x4D, 0x69, 0x52, 0xCF, 0x2E, 0x8C, 0xF3, 0x86, 0x28, 0x9C, 0xD0, - 0x16, 0x02, 0x38, 0x21, 0x01, 0x73, 0xE2, 0x82, 0xB0, 0xF1, 0x59, 0x08, 0xDD, 0x0B, 0x06, 0xAF, - 0x9C, 0x88, 0x9B, 0xBF, 0x13, 0xF5, 0x2C, 0x51, 0x7E, 0xA6, 0x33, 0xEF, 0x97, 0xA2, 0x9C, 0x43, - 0xC8, 0xA6, 0xBC, 0xF8, 0xE2, 0xB0, 0xB1, 0x80, 0xC5, 0x41, 0x9A, 0x8F, 0x25, 0x97, 0x87, 0x04, - 0xA7, 0x5E, 0x6A, 0xD9, 0x48, 0x4E, 0xF8, 0xB2, 0x2B, 0x87, 0x8E, 0xF4, 0xE5, 0x97, 0xA2, 0x7D, - 0xF6, 0x55, 0x45, 0x47, 0x7E, 0x3D, 0xB9, 0xDC, 0xFC, 0xAD, 0x56, 0x5B, 0x58, 0x2F, 0x9A, 0xD5, - 0x97, 0x2E, 0x1D, 0xF5, 0x68, 0xE1, 0xCC, 0x4F, 0xD7, 0xBA, 0x73, 0x12, 0x7B, 0x21, 0x42, 0x55, - 0xAF, 0x25, 0xE6, 0x2C, 0x46, 0xB3, 0xF6, 0x25, 0x7B, 0x2C, 0x5E, 0xBA, 0x37, 0xEA, 0x8A, 0xB2, - 0x80, 0xB9, 0x9D, 0xD9, 0x25, 0x4D, 0x00, 0x93, 0x8C, 0x32, 0xE9, 0xD8, 0x19, 0xBA, 0x51, 0x0D, - 0xE0, 0xB5, 0x2E, 0xDE, 0x6C, 0xE5, 0x6F, 0xD6, 0x4A, 0x3B, 0x80, 0xB0, 0xF4, 0x41, 0x73, 0x1B, - 0xA9, 0x09, 0x36, 0x42, 0x17, 0x04, 0x72, 0xB2, 0x6E, 0xB1, 0x9C, 0x70, 0xE4, 0x18, 0x7C, 0xEF, - 0x49, 0xBE, 0xA0, 0x2C, 0xA9, 0xDD, 0x2E, 0x9C, 0xBE, 0xC3, 0xE0, 0xAB, 0x65, 0xC1, 0x6F, 0x86, - 0x7C, 0x96, 0x0F, 0xFC, 0x50, 0x4F, 0x4A, 0xC3, 0xC6, 0x73, 0xDE, 0x2D, 0x01, 0x64, 0x70, 0x7E, - 0x95, 0xCA, 0x19, 0xF4, 0x25, 0x96, 0x13, 0x58, 0xB6, 0x09, 0x38, 0x92, 0x15, 0x80, 0x43, 0x37, - 0xE1, 0xDD, 0x34, 0x87, 0xE5, 0xC8, 0x0A, 0xED, 0x01, 0x42, 0xEC, 0x38, 0x2F, 0x8A, 0xBD, 0x00, - 0xB3, 0x0E, 0xF5, 0xFE, 0xA3, 0x1D, 0x0C, 0xEE, 0x51, 0x66, 0x1D, 0xEA, 0x4F, 0xC1, 0x5E, 0x79, - 0x7F, 0xAB, 0x66, 0x38, 0x66, 0xE3, 0x52, 0xBB, 0x76, 0xBE, 0x39, 0xBA, 0x77, 0xC3, 0xD5, 0xEC, - 0xDA, 0x03, 0x08, 0xE2, 0x6E, 0x14, 0x36, 0x06, 0xA4, 0xA1, 0x13, 0x0D, 0x1F, 0x73, 0xC6, 0x49, - 0xCE, 0x66, 0xE9, 0x58, 0x63, 0x33, 0xEB, 0x9C, 0xB1, 0xDE, 0x64, 0xA2, 0x45, 0x8B, 0xC4, 0xCB, - 0x96, 0xED, 0x74, 0xE4, 0xCB, 0x0B, 0x43, 0x4E, 0x77, 0x3A, 0x59, 0xCC, 0x8E, 0x0C, 0x58, 0x0B, - 0xE8, 0x75, 0x26, 0x6A, 0xC9, 0x7A, 0xB6, 0x80, 0x5E, 0x8B, 0x4A, 0x35, 0x9B, 0x01, 0x0B, 0xE9, - 0x79, 0x31, 0xF4, 0x8C, 0x09, 0x8B, 0x21, 0x40, 0x5D, 0x59, 0x32, 0xC5, 0x6F, 0x39, 0x87, 0x8A, - 0xEF, 0xF2, 0x22, 0x21, 0x29, 0xA3, 0xEF, 0xFF, 0x1F, 0x87, 0x37, 0x3A, 0x5E, 0xDE, 0x5A, 0x00 + 0x1F, 0x8B, 0x08, 0x08, 0x5A, 0x67, 0x4B, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, + 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x38, 0x92, 0xE8, 0xFF, + 0x3C, 0x05, 0x46, 0x3B, 0x67, 0x24, 0x8D, 0x65, 0x99, 0x92, 0x2F, 0xB1, 0xE3, 0x38, 0x7B, 0x7C, + 0x4D, 0x7C, 0xDA, 0x17, 0x1D, 0xCB, 0x4E, 0x3A, 0xC9, 0x64, 0xBD, 0xB4, 0x08, 0xCB, 0x9C, 0x48, + 0xA4, 0x96, 0xA4, 0x7C, 0x99, 0xD9, 0xBC, 0xD3, 0x3E, 0xC3, 0x3E, 0xD9, 0xA2, 0x00, 0x90, 0x04, + 0x40, 0xF0, 0x2A, 0xC9, 0x71, 0xF7, 0xB6, 0xBF, 0x99, 0xB4, 0x4D, 0x00, 0x55, 0x85, 0x42, 0xA1, + 0x00, 0x14, 0xAA, 0x0A, 0xF7, 0xA6, 0x87, 0x86, 0x66, 0x80, 0x1F, 0xCC, 0x27, 0xB4, 0x83, 0xFE, + 0xFD, 0xC1, 0x7F, 0xB3, 0xB2, 0xF2, 0xE7, 0x7F, 0x3E, 0xD8, 0x8E, 0xE5, 0x3E, 0xB4, 0x47, 0xEE, + 0xC0, 0x0C, 0x6C, 0xD7, 0x69, 0xDF, 0xB9, 0x7E, 0xE0, 0x98, 0x63, 0xFC, 0x63, 0xE5, 0xC1, 0xFF, + 0xF7, 0xED, 0x57, 0xF7, 0xA4, 0xD1, 0x03, 0xBE, 0xF1, 0xDD, 0xC1, 0x77, 0x1C, 0x6C, 0xBF, 0x7A, + 0xC5, 0xAB, 0x9B, 0x96, 0x75, 0x78, 0x8F, 0x9D, 0xE0, 0xC4, 0xF6, 0x03, 0xEC, 0x60, 0xAF, 0x51, + 0x1F, 0xB9, 0xA6, 0x55, 0x6F, 0x21, 0xD7, 0x39, 0x21, 0xBF, 0x34, 0x49, 0xCD, 0xDB, 0xA9, 0x33, + 0x00, 0x88, 0xFC, 0x53, 0x03, 0x43, 0xFD, 0x26, 0xFA, 0xE7, 0x2B, 0x44, 0x7E, 0x6C, 0xC7, 0x0E, + 0x3E, 0xE1, 0x9B, 0x3E, 0x05, 0xDB, 0x20, 0xD5, 0x7F, 0x08, 0x0D, 0x94, 0x42, 0xDE, 0x24, 0xA2, + 0x82, 0x10, 0xEF, 0xE0, 0x07, 0x14, 0xD7, 0xE0, 0x9D, 0x22, 0x50, 0xA4, 0x7A, 0x6D, 0xD7, 0x19, + 0x63, 0xDF, 0x37, 0x87, 0x98, 0xB4, 0x88, 0x80, 0x37, 0xC6, 0xFE, 0x30, 0x04, 0x09, 0x3F, 0x13, + 0xD3, 0xF3, 0xF1, 0xB1, 0x33, 0x70, 0xC7, 0xB6, 0x33, 0x84, 0xC2, 0xB6, 0x65, 0x06, 0x26, 0x87, + 0xF5, 0x43, 0x26, 0x6C, 0x88, 0x1B, 0x38, 0x6C, 0xEB, 0xE1, 0x60, 0xEA, 0x39, 0xC8, 0x72, 0x07, + 0xD3, 0x31, 0xE9, 0x58, 0x7B, 0x88, 0x83, 0xC3, 0x11, 0x86, 0x5F, 0xF7, 0x9E, 0x8E, 0x49, 0x6F, + 0x59, 0x9F, 0x80, 0x7D, 0xB7, 0xF6, 0x23, 0xB6, 0x4E, 0x4C, 0xA0, 0xDB, 0xD8, 0x16, 0xBE, 0xB8, + 0xCE, 0x30, 0xFE, 0x34, 0x19, 0x99, 0xC1, 0xAD, 0xEB, 0x8D, 0x7B, 0x1E, 0x26, 0xA5, 0xE4, 0x7B, + 0xAD, 0xC6, 0x0A, 0x86, 0xD8, 0xB5, 0x70, 0x60, 0x0F, 0x18, 0x80, 0x35, 0xA3, 0x6D, 0x74, 0x94, + 0x02, 0x42, 0xD8, 0x0E, 0x5A, 0xEE, 0x18, 0xEB, 0xED, 0xCE, 0x96, 0x5C, 0xB4, 0x3B, 0x82, 0x36, + 0x9D, 0x75, 0xC3, 0x68, 0xF3, 0x46, 0x78, 0x80, 0x6F, 0x7F, 0xA5, 0xD5, 0xBB, 0x9B, 0x46, 0xD7, + 0xD8, 0x68, 0xAF, 0x6F, 0x6C, 0xC6, 0x25, 0x9F, 0xA1, 0x64, 0xED, 0x75, 0x67, 0x63, 0xD3, 0x58, + 0x6B, 0xAF, 0x19, 0xAB, 0x71, 0xC9, 0x17, 0x8A, 0x7B, 0x73, 0x63, 0x63, 0x63, 0xBD, 0xBD, 0xB6, + 0xB9, 0xC6, 0x0A, 0x46, 0xA6, 0x1F, 0x1C, 0xD9, 0x23, 0x7C, 0x46, 0xC4, 0x45, 0xA0, 0xF8, 0x16, + 0x3E, 0x4D, 0xC7, 0x37, 0xD8, 0x8B, 0xBB, 0xE7, 0xD0, 0xBF, 0xCF, 0x6F, 0xA1, 0xBA, 0xDF, 0xC7, + 0x23, 0x3C, 0x08, 0xB0, 0x15, 0x17, 0xFB, 0xFC, 0x0B, 0x2D, 0x16, 0x40, 0xF9, 0x77, 0x2E, 0x11, + 0xB8, 0x21, 0x7C, 0x06, 0x49, 0x83, 0x71, 0x34, 0x47, 0x3E, 0x66, 0x85, 0xEE, 0x4D, 0x60, 0xDA, + 0x0E, 0xB6, 0x4E, 0xD9, 0x20, 0x17, 0xAA, 0xB0, 0x67, 0xFA, 0x58, 0xAE, 0xC4, 0x51, 0xF0, 0x3A, + 0x17, 0x97, 0xFB, 0xA7, 0x49, 0x40, 0xD0, 0xA3, 0x4B, 0xF3, 0x86, 0xFC, 0x83, 0x1F, 0x03, 0x81, + 0xBC, 0x81, 0xEB, 0x79, 0x98, 0x8A, 0x86, 0x52, 0xC0, 0xE5, 0x4E, 0xF9, 0x0A, 0xFC, 0xE2, 0x78, + 0x2E, 0x9F, 0x26, 0x38, 0xBD, 0x84, 0x53, 0x09, 0xA5, 0xB4, 0x98, 0x20, 0x71, 0x3D, 0xCB, 0x3F, + 0xDC, 0x3F, 0x3C, 0x22, 0x9F, 0xBF, 0x7E, 0xDB, 0x16, 0xBF, 0xBE, 0xE7, 0x83, 0x2D, 0x94, 0xDC, + 0x4E, 0x47, 0xA3, 0x1E, 0x81, 0x75, 0x35, 0x21, 0xB2, 0x2C, 0xF4, 0x97, 0x37, 0xF3, 0x71, 0x70, + 0x69, 0x8F, 0xB1, 0x3B, 0x0D, 0x42, 0xEE, 0x3B, 0xD6, 0x01, 0x11, 0x7A, 0xE9, 0xE3, 0xE0, 0x0E, + 0x0F, 0xBE, 0x9F, 0xE1, 0x87, 0x23, 0xDB, 0x1B, 0x3F, 0x98, 0x1E, 0x96, 0x0A, 0x89, 0xB0, 0xEB, + 0x8A, 0x5E, 0x0D, 0x5C, 0x87, 0xF0, 0x8E, 0x0C, 0xF6, 0x7E, 0xC4, 0x19, 0xBF, 0xEF, 0x4E, 0xBD, + 0x01, 0x1D, 0xD5, 0xD7, 0x2A, 0xD7, 0x78, 0x19, 0xC8, 0x8F, 0x2F, 0x90, 0x9F, 0xA8, 0xD0, 0xF3, + 0x6C, 0xD7, 0xB3, 0x03, 0x3B, 0xAA, 0xC5, 0x11, 0xED, 0xBB, 0x84, 0x01, 0xB6, 0x43, 0xFA, 0x08, + 0x5C, 0x83, 0x42, 0x36, 0x37, 0xF7, 0xCF, 0xCF, 0x2F, 0x0E, 0x8E, 0xCF, 0x76, 0x2F, 0x0F, 0xAF, + 0x8F, 0xCF, 0x7A, 0x57, 0x97, 0xD7, 0x97, 0x9F, 0x7B, 0x87, 0xD7, 0x07, 0x07, 0x6F, 0x90, 0xD1, + 0x42, 0x2B, 0x2B, 0x07, 0xF8, 0xD6, 0x9C, 0x92, 0xA9, 0x71, 0x70, 0xD0, 0xB6, 0xC2, 0x9F, 0xCC, + 0x76, 0xA7, 0xA7, 0x6F, 0x50, 0x87, 0xB6, 0x24, 0xBF, 0xB6, 0xC7, 0xF0, 0x93, 0x59, 0xFF, 0x1A, + 0x1A, 0x74, 0x59, 0x03, 0x54, 0xB4, 0xC5, 0xF5, 0xC1, 0x6E, 0xFF, 0xC3, 0x1B, 0xB4, 0xCA, 0x9A, + 0x2D, 0x17, 0x6E, 0xD6, 0xFF, 0x7C, 0xBA, 0x77, 0x7E, 0xF2, 0x06, 0xAD, 0xB1, 0x86, 0xFF, 0xFD, + 0x5F, 0x61, 0xCB, 0xF1, 0xB8, 0x9E, 0xD3, 0xAB, 0x7E, 0xFF, 0x0D, 0x5A, 0x8F, 0xC8, 0x44, 0xFD, + 0x7E, 0xDB, 0xA7, 0x3F, 0xF9, 0x38, 0x49, 0xC3, 0x8D, 0x6A, 0x0D, 0x79, 0x37, 0x5F, 0x47, 0xDD, + 0x5C, 0x2E, 0xD5, 0x3A, 0xEC, 0xED, 0x66, 0xDC, 0xDB, 0x7A, 0x04, 0xA0, 0x96, 0xDB, 0xDF, 0xEB, + 0xB3, 0xF3, 0xEB, 0x83, 0xC3, 0xFD, 0xE3, 0xD3, 0x5D, 0x02, 0x63, 0x2B, 0x1C, 0xD2, 0x7E, 0x1F, + 0x2D, 0xA3, 0x33, 0x17, 0x59, 0x78, 0x60, 0x8F, 0xCD, 0x51, 0x11, 0x3A, 0x44, 0x38, 0x1D, 0x43, + 0x64, 0x45, 0x69, 0x50, 0xC0, 0x10, 0x19, 0x5E, 0x47, 0x64, 0x4E, 0x51, 0x78, 0xC7, 0x67, 0x1F, + 0x77, 0x4F, 0x8E, 0x0F, 0xAE, 0xAF, 0xCE, 0x7E, 0x39, 0x3B, 0xFF, 0x74, 0x46, 0xC0, 0x74, 0x5B, + 0xE1, 0x12, 0x44, 0xA6, 0xCB, 0x3D, 0xF6, 0x88, 0x82, 0x8D, 0x67, 0x0C, 0x28, 0xDF, 0xB6, 0x11, + 0x4E, 0xB8, 0xF0, 0xEB, 0xB1, 0x33, 0x99, 0x06, 0x5C, 0x39, 0x29, 0xB3, 0xAB, 0x9D, 0xD6, 0x0D, + 0x71, 0xAD, 0x4F, 0xAC, 0xA6, 0xE1, 0x72, 0xB9, 0xB2, 0x02, 0x53, 0xD6, 0x1D, 0x61, 0xB2, 0xD3, + 0x18, 0x36, 0x6A, 0x61, 0x95, 0x50, 0x53, 0xBE, 0x41, 0x35, 0xB4, 0x84, 0xA0, 0x3E, 0x81, 0x06, + 0xF5, 0x81, 0x2C, 0x58, 0x88, 0x09, 0x1D, 0xB0, 0x26, 0xFB, 0x93, 0x91, 0x1D, 0x34, 0xEA, 0xAD, + 0x3A, 0x5F, 0x98, 0xC9, 0x52, 0x89, 0x1A, 0x23, 0xB2, 0x17, 0x78, 0xA4, 0x8B, 0x08, 0xF9, 0xCF, + 0x5B, 0x5A, 0xBD, 0x3D, 0xC2, 0xCE, 0x30, 0xB8, 0x23, 0x3C, 0xEB, 0xC0, 0xC7, 0xA5, 0x1D, 0xD4, + 0x15, 0x17, 0x7B, 0x80, 0x6A, 0xC3, 0xBA, 0x03, 0x75, 0xBF, 0x3E, 0x7E, 0xDB, 0x96, 0x4A, 0xEE, + 0xCD, 0x51, 0x54, 0x44, 0xA8, 0xE9, 0x08, 0xC5, 0x0A, 0xF9, 0xB6, 0xC5, 0x08, 0x26, 0xB0, 0x96, + 0x50, 0xAD, 0x05, 0x2D, 0xD9, 0x07, 0xF2, 0x4B, 0xD8, 0x03, 0xD6, 0xAC, 0x3F, 0x21, 0x03, 0x47, + 0xE0, 0x92, 0xEE, 0x8E, 0x4D, 0xC7, 0xF2, 0xA3, 0x22, 0xFB, 0x16, 0x35, 0x6C, 0xAB, 0x6D, 0x3B, + 0x83, 0xD1, 0xD4, 0xC2, 0x7E, 0xA3, 0xE6, 0x5B, 0xA7, 0xEE, 0xD4, 0x21, 0x63, 0x54, 0x6B, 0x8A, + 0x24, 0x33, 0x30, 0x97, 0xB0, 0xD7, 0x70, 0x9D, 0x15, 0xF7, 0xF6, 0x16, 0xF5, 0x0F, 0x10, 0x51, + 0xBA, 0xA6, 0x54, 0x03, 0xA0, 0x51, 0xF2, 0xC9, 0xAA, 0x41, 0x95, 0x7D, 0x4D, 0x85, 0x01, 0x3F, + 0x77, 0xB6, 0x85, 0x1B, 0x35, 0x58, 0xCD, 0x4E, 0x4D, 0x87, 0x70, 0xDD, 0xAB, 0x35, 0xB7, 0xA5, + 0x4A, 0x3F, 0xA4, 0xBF, 0x30, 0x81, 0x23, 0x41, 0x0E, 0xBC, 0xA9, 0x1E, 0x30, 0x2C, 0xA2, 0x05, + 0x01, 0xC7, 0xBF, 0x45, 0xE0, 0x61, 0x44, 0x08, 0x74, 0x79, 0x0B, 0x94, 0xC0, 0x93, 0xD8, 0x21, + 0x11, 0xAA, 0x64, 0x24, 0xD1, 0x5E, 0x2C, 0xB0, 0x83, 0x11, 0x5D, 0x40, 0x2F, 0x2E, 0x7F, 0xA1, + 0xC3, 0xA2, 0xB4, 0x25, 0x63, 0x86, 0xFA, 0x64, 0xFF, 0x36, 0xA9, 0xC9, 0x00, 0x12, 0xEB, 0x26, + 0x74, 0x58, 0xAE, 0xA2, 0x5D, 0xF2, 0x13, 0x43, 0xA1, 0xD2, 0x4A, 0xAA, 0x1D, 0x7E, 0xFC, 0x25, + 0x83, 0x75, 0x37, 0x64, 0xC5, 0xDF, 0x77, 0x9D, 0x5B, 0x7B, 0xA8, 0x72, 0x2E, 0xAE, 0x33, 0x99, + 0xE4, 0xD5, 0xC0, 0xC1, 0x1D, 0xF6, 0x1C, 0x1C, 0xE4, 0xD5, 0x73, 0x82, 0x0C, 0x50, 0x4C, 0x48, + 0x02, 0x7B, 0x44, 0xC0, 0x8C, 0x27, 0xD8, 0xF1, 0xE9, 0xB9, 0x80, 0xB0, 0x2B, 0x20, 0xF3, 0xD5, + 0x4F, 0x6F, 0x31, 0x71, 0xBD, 0xC0, 0xCF, 0xC3, 0x4C, 0x66, 0xCF, 0xA5, 0xDB, 0x3F, 0xD8, 0x37, + 0x3D, 0xAB, 0xA0, 0xEC, 0x69, 0x58, 0x79, 0x64, 0x0E, 0xC8, 0xCC, 0xBF, 0xEF, 0x2E, 0x90, 0x9F, + 0xAC, 0x4B, 0xF9, 0xFC, 0x64, 0xF5, 0xE6, 0xCC, 0x4F, 0x4E, 0xDE, 0x33, 0xF3, 0x73, 0xEC, 0xFA, + 0xA6, 0x3D, 0xF8, 0x83, 0xA7, 0xF3, 0xE1, 0xE9, 0xA5, 0xEB, 0x0D, 0xEE, 0x7E, 0x1B, 0xCC, 0x64, + 0xC8, 0xE6, 0x3E, 0xE1, 0x59, 0x25, 0x85, 0x99, 0x49, 0xE4, 0xF4, 0xE4, 0x47, 0xF4, 0x28, 0x39, + 0x5B, 0xD7, 0xAC, 0x27, 0xC7, 0x1C, 0xDB, 0x83, 0x53, 0x72, 0xA0, 0x19, 0xE9, 0x40, 0xC2, 0x82, + 0x4F, 0x8E, 0xFE, 0xE7, 0x13, 0xBA, 0xD7, 0x60, 0x66, 0x00, 0xF6, 0x47, 0xA3, 0xDE, 0x9F, 0x7A, + 0xF7, 0xF8, 0xA9, 0xDE, 0x42, 0x75, 0xA3, 0xAE, 0xEB, 0x24, 0xC5, 0x03, 0x76, 0x8B, 0x46, 0x04, + 0xA1, 0x85, 0xA6, 0x8E, 0x45, 0x46, 0x8C, 0x1C, 0x11, 0x35, 0x2D, 0xD2, 0x10, 0x5D, 0xED, 0x7E, + 0x04, 0x2C, 0x9D, 0xC5, 0x62, 0xD9, 0x9D, 0x06, 0xEE, 0xD8, 0x0D, 0xEC, 0x7B, 0x0C, 0xC8, 0xBA, + 0xD5, 0x90, 0x25, 0x9A, 0xF0, 0xBD, 0xA0, 0x1F, 0xE0, 0xD1, 0x88, 0x8E, 0xF2, 0x3E, 0x9C, 0xF2, + 0xE8, 0x89, 0xFB, 0xAD, 0x65, 0xDF, 0xA3, 0x01, 0x39, 0x88, 0xFA, 0x3B, 0x75, 0x90, 0xE5, 0x65, + 0x7A, 0x00, 0x44, 0xE3, 0x60, 0xB9, 0x53, 0x7F, 0x57, 0x4B, 0x62, 0xD7, 0x81, 0x59, 0x02, 0x38, + 0x23, 0xF3, 0x06, 0x8F, 0x92, 0x90, 0x96, 0xE9, 0xF7, 0x3A, 0xEC, 0xDC, 0x76, 0xEA, 0xD3, 0xF1, + 0xD6, 0xA6, 0xB1, 0x2F, 0x42, 0xF0, 0xAF, 0xDF, 0xF7, 0xFA, 0xF5, 0x77, 0xE4, 0x1F, 0xF4, 0x76, + 0x85, 0x56, 0x2D, 0x85, 0xD4, 0x86, 0x7D, 0xAB, 0x06, 0x29, 0xFD, 0x5E, 0x47, 0x01, 0xD9, 0xC0, + 0xEE, 0xD4, 0xE9, 0xA7, 0x1B, 0xF7, 0xB1, 0x0E, 0x5B, 0x87, 0x29, 0xF9, 0x50, 0x27, 0x1B, 0xB8, + 0x0C, 0x62, 0xCA, 0x10, 0xB0, 0x42, 0xD8, 0x57, 0xAA, 0xC1, 0x4F, 0x67, 0xF7, 0xC9, 0xF9, 0xD9, + 0x6E, 0x1F, 0x58, 0xCE, 0x7E, 0x79, 0x19, 0x6C, 0x0F, 0x89, 0xFA, 0x7D, 0xB3, 0xDE, 0x1C, 0x91, + 0x9D, 0xB2, 0x4B, 0x58, 0xCF, 0x7E, 0x79, 0x19, 0xAC, 0x0F, 0x89, 0xFA, 0x5D, 0xB3, 0x7E, 0x0F, + 0xDB, 0x07, 0xEE, 0xB4, 0xFE, 0x8E, 0xFD, 0xF7, 0x45, 0x30, 0x3E, 0x24, 0xE9, 0x77, 0xCD, 0xF7, + 0xFF, 0xFF, 0x05, 0x66, 0x35, 0xFC, 0xFB, 0x22, 0x78, 0xCE, 0xC8, 0x99, 0x07, 0xC7, 0x61, 0xDB, + 0x32, 0x74, 0x7C, 0x5F, 0x46, 0x50, 0x6B, 0x92, 0x83, 0xBD, 0x83, 0xBD, 0x0F, 0x97, 0xA7, 0x27, + 0x64, 0x71, 0xD5, 0x40, 0x55, 0xF7, 0x95, 0x89, 0x23, 0x64, 0xFA, 0x19, 0xF2, 0x3F, 0xFF, 0x33, + 0xE7, 0x54, 0xA4, 0xDB, 0x75, 0xBE, 0x98, 0x95, 0xFF, 0xE6, 0x51, 0x62, 0x55, 0xB4, 0xEC, 0xAF, + 0xFC, 0x1C, 0xE1, 0xD0, 0x92, 0xF3, 0xFB, 0x99, 0x8A, 0x6A, 0xF7, 0xFA, 0x7B, 0xBB, 0xA4, 0x7F, + 0xF0, 0xEF, 0xCF, 0x67, 0x35, 0xA3, 0xE5, 0xF7, 0xCB, 0xEB, 0x9F, 0xBF, 0xCC, 0xA7, 0x52, 0xF4, + 0xFB, 0x65, 0xFA, 0xCF, 0x5E, 0xE0, 0xD3, 0xE8, 0xF9, 0x1D, 0x8B, 0xF9, 0x4F, 0x3F, 0x48, 0xA4, + 0x52, 0xF4, 0x22, 0x17, 0x78, 0xAD, 0x01, 0x5C, 0xB8, 0x07, 0x00, 0x64, 0xE1, 0xCD, 0xEA, 0x47, + 0xEC, 0xF9, 0x04, 0xE2, 0xB1, 0x13, 0xE8, 0x2E, 0x05, 0x4E, 0x5D, 0xCB, 0xBE, 0x7D, 0x42, 0x3E, + 0xB7, 0xD4, 0x20, 0x6B, 0x8A, 0x51, 0xE0, 0xA2, 0x5B, 0xDE, 0x18, 0x8D, 0xEC, 0xB1, 0x1D, 0x30, + 0x7A, 0x17, 0xBD, 0xBD, 0x98, 0x9B, 0x19, 0xA7, 0xE7, 0x7A, 0x01, 0xDC, 0xB4, 0x3F, 0x83, 0x21, + 0xA7, 0xCF, 0x78, 0x63, 0x7A, 0x4F, 0x33, 0x98, 0x58, 0x8A, 0x22, 0xEB, 0x61, 0x32, 0xB8, 0x81, + 0x67, 0x9B, 0x0E, 0x20, 0x5B, 0x7D, 0x4E, 0xE3, 0xD1, 0xDA, 0x82, 0xD9, 0x88, 0x4D, 0xC0, 0xB2, + 0xBE, 0xE0, 0x2E, 0xD9, 0xDE, 0x8D, 0xEB, 0x39, 0x18, 0x75, 0x86, 0x80, 0x6D, 0xE3, 0x99, 0xB0, + 0x75, 0x29, 0xB6, 0xD7, 0xCF, 0x84, 0x6D, 0x8D, 0x62, 0xDB, 0x5C, 0x2C, 0xB6, 0x4F, 0x9E, 0xED, + 0x07, 0x80, 0x67, 0x6B, 0xB1, 0x78, 0xF6, 0xEC, 0xEF, 0x54, 0xFC, 0x3A, 0x73, 0x9A, 0xC6, 0xE1, + 0x45, 0xE4, 0xBB, 0x1D, 0xD4, 0xE9, 0x76, 0x74, 0x4A, 0xA8, 0xB4, 0x22, 0xCA, 0x53, 0x46, 0xA7, + 0xEE, 0x03, 0xF6, 0x68, 0x1F, 0xB4, 0xD6, 0xDE, 0x6A, 0xFD, 0xC8, 0xE2, 0xD9, 0xE1, 0x72, 0x7F, + 0xE0, 0xBA, 0x01, 0x47, 0xDA, 0x9D, 0x1F, 0xD2, 0x1F, 0xB9, 0xB7, 0xB1, 0x2B, 0x2B, 0x7D, 0xA2, + 0x9E, 0x60, 0x19, 0x19, 0x82, 0x43, 0x9F, 0x09, 0xFE, 0x59, 0x37, 0x4F, 0x08, 0x6E, 0x50, 0xA7, + 0x8E, 0x1D, 0xE4, 0x2C, 0x5A, 0xBE, 0x75, 0xE4, 0x61, 0xDC, 0x9F, 0x90, 0x45, 0xA2, 0xD6, 0x94, + 0x70, 0x91, 0xE5, 0x44, 0xA9, 0xD9, 0xB7, 0xFF, 0x91, 0x57, 0xE9, 0xCE, 0xF4, 0x2C, 0x58, 0xC2, + 0x8E, 0x0F, 0x72, 0x2A, 0x6A, 0x16, 0xCB, 0x9C, 0x16, 0x96, 0xF9, 0xE4, 0x5F, 0xE0, 0xB1, 0x69, + 0x3B, 0xA4, 0xB3, 0x39, 0x75, 0x27, 0x9E, 0x0B, 0x77, 0xDA, 0x06, 0x38, 0x28, 0x15, 0xAB, 0xDA, + 0x29, 0x5E, 0xB5, 0x5B, 0xBC, 0xEA, 0x6A, 0xF1, 0xAA, 0x6B, 0xC5, 0xAB, 0xAE, 0x17, 0xAF, 0xBA, + 0x51, 0xBC, 0xEA, 0xEB, 0x02, 0x55, 0x3D, 0xD3, 0xB2, 0xDD, 0xD3, 0xDD, 0xFD, 0xBC, 0xA1, 0xC2, + 0xF7, 0xF6, 0x00, 0xEF, 0x5D, 0xE6, 0x4A, 0xC1, 0xC8, 0x1D, 0x86, 0x7E, 0x88, 0x39, 0x35, 0x6F, + 0xCC, 0x80, 0xCC, 0xAE, 0xA7, 0x1E, 0xF6, 0x06, 0x18, 0x36, 0x55, 0x51, 0x65, 0x55, 0x9F, 0x10, + 0xF5, 0x61, 0x5B, 0xF2, 0x26, 0x4F, 0xF2, 0x37, 0xC8, 0xDB, 0xC5, 0x79, 0xC1, 0xF7, 0x84, 0x5C, + 0x6A, 0x70, 0x68, 0xEB, 0xA5, 0x63, 0x4D, 0x6F, 0x75, 0x35, 0x19, 0x12, 0xAE, 0xE2, 0xDA, 0x0C, + 0x24, 0x0F, 0xE0, 0x2A, 0xCF, 0x1B, 0x5F, 0x80, 0x7F, 0x60, 0x92, 0x58, 0xEA, 0x36, 0x08, 0x17, + 0x84, 0x44, 0x61, 0xE2, 0x46, 0xB3, 0x34, 0x58, 0x70, 0x30, 0xBC, 0xC0, 0x03, 0x6C, 0x4F, 0x34, + 0xC0, 0x93, 0x75, 0x64, 0x0C, 0x39, 0x28, 0xB8, 0xE8, 0x31, 0xA7, 0x53, 0x0D, 0xF4, 0xA9, 0xE7, + 0x91, 0xD1, 0xEE, 0x89, 0xB5, 0x74, 0x9C, 0xFD, 0x73, 0xA3, 0x46, 0xCF, 0x1B, 0x5F, 0xC1, 0xFF, + 0x79, 0x87, 0x03, 0xBD, 0x00, 0x59, 0xFD, 0xF6, 0x95, 0x9D, 0x38, 0xC0, 0x97, 0x44, 0x0B, 0x6D, + 0x09, 0xD5, 0xBE, 0x11, 0xDE, 0x93, 0x36, 0x93, 0x06, 0x3B, 0xA7, 0x60, 0xF0, 0x86, 0x06, 0xFF, + 0x91, 0x12, 0xAC, 0x0A, 0x77, 0xEE, 0x57, 0x13, 0xF0, 0xA6, 0x0E, 0x99, 0x9D, 0xEC, 0x90, 0xBE, + 0x5E, 0xA3, 0x32, 0x26, 0xD8, 0x09, 0x4F, 0xFD, 0x3C, 0x3C, 0xAC, 0x56, 0x83, 0xB9, 0x38, 0x15, + 0x3E, 0xCD, 0xC4, 0xEE, 0xCB, 0xBA, 0x09, 0x20, 0xFA, 0x36, 0xEB, 0x24, 0x7D, 0xA6, 0x39, 0x28, + 0x78, 0x48, 0x67, 0xE0, 0xA6, 0x8B, 0xF0, 0xC2, 0x70, 0xEF, 0x8E, 0x32, 0xFA, 0xCD, 0xFC, 0xB3, + 0xE7, 0x8E, 0x9B, 0x3A, 0x79, 0x27, 0xB1, 0x86, 0xBE, 0xDF, 0x0B, 0xC1, 0xF7, 0x59, 0x8F, 0xEF, + 0xF3, 0xA2, 0xF0, 0x7D, 0xD1, 0xE3, 0xFB, 0xB2, 0x10, 0x7C, 0xFE, 0xC4, 0x71, 0x1F, 0x7A, 0x18, + 0x7B, 0xFB, 0xE0, 0xA1, 0x97, 0xC4, 0x1C, 0x6D, 0x4D, 0x91, 0xD1, 0xD4, 0x1A, 0x10, 0x26, 0xA4, + 0x2D, 0x59, 0xEF, 0x54, 0xB3, 0x41, 0xAD, 0x56, 0x9C, 0x08, 0x0E, 0x42, 0xBF, 0x8A, 0x68, 0xE1, + 0x2F, 0xD1, 0x6E, 0x82, 0x6A, 0x7A, 0x7B, 0xE3, 0xBD, 0x2B, 0x81, 0xCA, 0x67, 0x07, 0x63, 0x70, + 0x37, 0xD7, 0xAD, 0x03, 0x91, 0x2F, 0x7A, 0x7B, 0x32, 0xF5, 0xEF, 0x4A, 0xEA, 0x03, 0x0E, 0x3B, + 0x74, 0x5A, 0x4F, 0x85, 0x1F, 0x56, 0xA8, 0x82, 0xE3, 0x76, 0xCC, 0x76, 0x02, 0x2A, 0x68, 0x25, + 0x5E, 0xA1, 0x94, 0x0C, 0xDC, 0x8E, 0xD9, 0xB6, 0x35, 0xA9, 0x22, 0xC5, 0xD0, 0x00, 0x6A, 0x49, + 0x0A, 0x3C, 0x64, 0x8E, 0xEC, 0xA1, 0xB3, 0x53, 0x1F, 0xE1, 0xDB, 0x20, 0x61, 0x85, 0xD2, 0xB5, + 0xB0, 0xDE, 0xC1, 0xCA, 0x22, 0xD1, 0x07, 0xC3, 0xB6, 0x02, 0x05, 0x45, 0x5B, 0x87, 0x63, 0x5D, + 0xB8, 0x11, 0x37, 0xBA, 0xA9, 0xB6, 0x35, 0x30, 0xA9, 0xE9, 0xA8, 0xA9, 0x23, 0xBA, 0x2C, 0xD6, + 0x01, 0xD8, 0xF1, 0x41, 0x3D, 0xCD, 0x58, 0x87, 0x04, 0x2F, 0x50, 0x6A, 0x09, 0xAB, 0xBF, 0x2B, + 0x48, 0xD2, 0x4A, 0x50, 0x4A, 0x4A, 0xC9, 0x28, 0x93, 0xA6, 0xC9, 0x11, 0x81, 0x68, 0x06, 0xA0, + 0xBB, 0xCC, 0x72, 0x38, 0xBD, 0x79, 0x0C, 0x03, 0x40, 0x4C, 0xBE, 0xE0, 0x92, 0x03, 0x11, 0x92, + 0x3F, 0x5F, 0x5F, 0xED, 0xFD, 0x7A, 0x7D, 0x76, 0x7A, 0xB8, 0x7B, 0x7D, 0x70, 0x79, 0xAA, 0x94, + 0x41, 0xC4, 0x06, 0x2D, 0x87, 0x00, 0x92, 0xEB, 0x8E, 0x61, 0xAC, 0xBF, 0x52, 0x6F, 0xDF, 0xB8, + 0xA7, 0x33, 0x17, 0x3E, 0xDB, 0xDA, 0x4E, 0xAB, 0x71, 0xC1, 0x7C, 0x4F, 0x13, 0x6A, 0x4C, 0x01, + 0x72, 0x42, 0x8D, 0xB5, 0x1A, 0x07, 0x54, 0xA1, 0xDE, 0x01, 0xF7, 0xA0, 0x8E, 0x5B, 0x85, 0x9E, + 0xD4, 0xD7, 0xEA, 0xD9, 0x12, 0x78, 0x22, 0xB4, 0x0A, 0x1D, 0xA9, 0xC9, 0x69, 0x7B, 0x2D, 0xED, + 0x3E, 0x71, 0x2C, 0xC5, 0xB2, 0x08, 0x8D, 0xBF, 0x76, 0xBF, 0x6D, 0xE7, 0xF1, 0x6F, 0x07, 0xC1, + 0xAF, 0xDA, 0x53, 0xBE, 0x1A, 0x27, 0xF3, 0xA7, 0x1D, 0x11, 0x55, 0xDA, 0xC9, 0x3F, 0x19, 0x5D, + 0x23, 0x34, 0xD2, 0x9F, 0xA3, 0xC5, 0x30, 0x1D, 0x2A, 0x82, 0x77, 0x9E, 0xCE, 0x04, 0xFC, 0x23, + 0xE9, 0x48, 0xA5, 0x19, 0x07, 0xB9, 0xFF, 0x30, 0x63, 0xAE, 0xA9, 0x4F, 0xBB, 0xF0, 0x79, 0x35, + 0x95, 0x2D, 0x54, 0x6C, 0xD6, 0x8C, 0xD7, 0xDD, 0x6B, 0x83, 0x80, 0x8A, 0xFE, 0xD2, 0xB2, 0x47, + 0x33, 0x4A, 0x3B, 0x3B, 0x68, 0x3D, 0x8D, 0x2F, 0x55, 0x49, 0xD5, 0x7E, 0x5E, 0x2B, 0xDB, 0x83, + 0x6B, 0x23, 0xD7, 0x16, 0xF1, 0x2A, 0x73, 0x48, 0xD4, 0xBB, 0x8D, 0xA1, 0xE7, 0x4E, 0x27, 0xC8, + 0x73, 0x1F, 0x98, 0xA6, 0x1A, 0xFB, 0x43, 0x81, 0xC6, 0x48, 0x57, 0xA9, 0xC3, 0x98, 0x00, 0xCB, + 0xAE, 0x3A, 0xE8, 0x8D, 0x86, 0xAE, 0x7D, 0x88, 0x72, 0xE0, 0x8E, 0x96, 0xFD, 0xF1, 0xF2, 0x1A, + 0x82, 0x5F, 0x36, 0xE8, 0xBF, 0x94, 0x0A, 0x76, 0x23, 0xF2, 0x4E, 0x69, 0xCA, 0xF8, 0x4B, 0xDA, + 0xBF, 0x49, 0xB9, 0x03, 0xC9, 0xEA, 0x9D, 0x84, 0x6A, 0xAD, 0x2E, 0xAB, 0x67, 0x16, 0x3F, 0xA7, + 0x28, 0x5D, 0xD7, 0x09, 0x3C, 0x77, 0x54, 0xCF, 0xC1, 0x11, 0x29, 0xF4, 0x44, 0x1F, 0xF9, 0x2D, + 0x8A, 0x50, 0x46, 0x55, 0x4F, 0x21, 0xFE, 0x4D, 0xD2, 0xC0, 0x1E, 0x7A, 0x9E, 0x1B, 0x13, 0x6A, + 0x3B, 0x23, 0xDB, 0xC1, 0xEC, 0x1B, 0x59, 0x07, 0x26, 0xB9, 0x70, 0xE9, 0x35, 0x4C, 0xE2, 0x32, + 0x26, 0x57, 0x7F, 0x83, 0x8F, 0x87, 0x20, 0x91, 0xBE, 0xEE, 0xBA, 0x04, 0x25, 0x6A, 0x51, 0x65, + 0xF4, 0xBE, 0x47, 0xD4, 0x51, 0x6E, 0x55, 0x10, 0xE8, 0x0B, 0xF7, 0x1E, 0x7B, 0x54, 0xD0, 0x89, + 0x82, 0xEF, 0x14, 0x6A, 0x42, 0xD7, 0x05, 0x6D, 0x8B, 0x2A, 0x4B, 0x02, 0x8D, 0xAE, 0x39, 0x22, + 0x67, 0xB1, 0x40, 0xD9, 0x11, 0x2D, 0x7E, 0x79, 0xC8, 0xD1, 0x22, 0x10, 0x2B, 0xF3, 0xC7, 0x3C, + 0xFE, 0x63, 0x1E, 0xCF, 0x38, 0x8F, 0x85, 0xC8, 0x4F, 0x1E, 0xF3, 0xF9, 0x94, 0x9C, 0xC9, 0x72, + 0x88, 0x68, 0xC6, 0xE4, 0x89, 0x2B, 0x85, 0xC0, 0xC2, 0x39, 0x74, 0xEC, 0xA4, 0xCD, 0xA0, 0xB8, + 0x0D, 0x9F, 0x1C, 0x32, 0xA6, 0xD4, 0xF9, 0x91, 0x24, 0x2A, 0x9C, 0x26, 0x32, 0xC4, 0xE4, 0x4C, + 0x01, 0x26, 0xE8, 0x43, 0x62, 0xC3, 0xD5, 0xFD, 0xAD, 0x3E, 0xA2, 0x56, 0xB7, 0xE0, 0xA7, 0x00, + 0xA2, 0x87, 0x28, 0x0D, 0x79, 0xCD, 0xED, 0x7C, 0x08, 0x71, 0xF0, 0xAD, 0x0A, 0x26, 0xE4, 0x6A, + 0x6E, 0x90, 0x84, 0xF6, 0x16, 0x3E, 0x0A, 0xA6, 0xBB, 0x74, 0x5D, 0x34, 0x36, 0x9D, 0x27, 0x11, + 0x35, 0xF2, 0x59, 0x1F, 0x6B, 0x65, 0x0C, 0x8D, 0x70, 0xDA, 0xB0, 0x9D, 0xA1, 0x10, 0x99, 0xAC, + 0xB1, 0x05, 0x26, 0x2B, 0x95, 0x39, 0x28, 0x38, 0x71, 0xB3, 0x54, 0xB3, 0x6E, 0xB2, 0x4E, 0x69, + 0x9B, 0x19, 0xBD, 0xD0, 0xCF, 0xEC, 0x47, 0xB2, 0x4E, 0x99, 0x6E, 0xB8, 0x81, 0x19, 0x36, 0x4B, + 0xB3, 0xFD, 0x25, 0xAA, 0x94, 0xEC, 0x04, 0xB7, 0xB4, 0x1F, 0x93, 0xA1, 0x8E, 0x6D, 0xF3, 0x3A, + 0xDB, 0x85, 0xB6, 0x62, 0xDB, 0xF7, 0x06, 0xE5, 0xED, 0xD7, 0x89, 0x28, 0x56, 0x9D, 0xA5, 0x59, + 0x17, 0xEA, 0x5A, 0xCE, 0x14, 0xC0, 0xF3, 0x39, 0xE8, 0x8C, 0x01, 0x51, 0xA6, 0x87, 0x0A, 0x10, + 0x5D, 0xB8, 0x8F, 0xD2, 0x83, 0x64, 0xA9, 0x22, 0x14, 0x98, 0xC2, 0xD5, 0x1D, 0x3D, 0x68, 0x23, + 0x72, 0x7C, 0xC7, 0x3E, 0x5A, 0x41, 0xF4, 0x7A, 0x05, 0xDD, 0x4C, 0x83, 0x40, 0xF4, 0xFC, 0x28, + 0x16, 0xCD, 0x19, 0x78, 0x4F, 0x1A, 0xB5, 0xC2, 0x2D, 0x68, 0xDC, 0xB0, 0xAD, 0x0D, 0x8C, 0xFC, + 0x81, 0x06, 0x66, 0x30, 0xB8, 0x43, 0x0D, 0x0C, 0x8B, 0x84, 0x5E, 0x37, 0x89, 0x01, 0xC0, 0xBE, + 0x3F, 0xC5, 0xE8, 0xC1, 0x26, 0xEA, 0xED, 0xF8, 0x20, 0x0C, 0xA6, 0x2D, 0x13, 0x34, 0x9A, 0x1D, + 0xED, 0x5A, 0xB0, 0x1B, 0x3C, 0x2F, 0xC2, 0x33, 0xF6, 0x43, 0x18, 0xB4, 0xDD, 0xD1, 0x08, 0x79, + 0x78, 0x38, 0x1D, 0x41, 0x50, 0x32, 0xDD, 0x23, 0xB0, 0x01, 0x34, 0x1D, 0x8B, 0x2D, 0xE9, 0xCA, + 0xD8, 0x95, 0xE8, 0x21, 0x6D, 0xAE, 0xB3, 0x21, 0x3C, 0xC3, 0x28, 0xFD, 0xD0, 0xC5, 0x7B, 0x87, + 0xD1, 0x64, 0x08, 0x2E, 0x12, 0x70, 0x1C, 0x0A, 0x46, 0x8D, 0x97, 0xEC, 0x26, 0x65, 0xFF, 0xCE, + 0x74, 0x86, 0x98, 0x6F, 0xA0, 0x15, 0x43, 0x69, 0xBD, 0xBE, 0x1D, 0x55, 0xA7, 0x17, 0x51, 0xFC, + 0xF6, 0xE5, 0x94, 0xEC, 0x1A, 0x93, 0x35, 0x39, 0x01, 0x07, 0xAE, 0x53, 0x0F, 0xD0, 0x94, 0xC5, + 0xF2, 0x12, 0x91, 0x31, 0x09, 0xBF, 0x1F, 0x30, 0x18, 0x18, 0xB1, 0x7D, 0x4F, 0x86, 0xFF, 0xC1, + 0xF4, 0x05, 0x75, 0x40, 0x86, 0xE0, 0xD6, 0x7D, 0x15, 0x2E, 0xC8, 0x6A, 0x24, 0x30, 0x93, 0x78, + 0x91, 0x5F, 0xA9, 0x39, 0x36, 0xE2, 0x01, 0x3E, 0x72, 0xC9, 0x12, 0x46, 0xC6, 0x8E, 0x66, 0x85, + 0xE1, 0x84, 0xC4, 0x63, 0x0A, 0x7D, 0x19, 0x63, 0xD3, 0x9F, 0x7A, 0xB4, 0x1C, 0xB6, 0x6C, 0x1F, + 0xFE, 0x41, 0x7A, 0x63, 0xD9, 0xFE, 0x04, 0xC6, 0x88, 0xE6, 0xD7, 0x81, 0xFB, 0x7D, 0xB4, 0x3F, + 0xF5, 0x03, 0x77, 0xCC, 0xFE, 0xAE, 0x0F, 0x28, 0x9B, 0xEA, 0x4D, 0x61, 0x14, 0x34, 0x90, 0xFA, + 0x78, 0x50, 0x19, 0x14, 0x84, 0x26, 0x82, 0x5E, 0x64, 0x11, 0x75, 0xC7, 0xCE, 0xCC, 0x80, 0x8E, + 0x40, 0x87, 0x55, 0x86, 0x42, 0x35, 0xE0, 0x1E, 0x0D, 0x97, 0x14, 0xF3, 0x11, 0x30, 0xEB, 0xF4, + 0x7C, 0x61, 0xBE, 0xC7, 0x6E, 0x65, 0x90, 0xD8, 0x01, 0x6B, 0xE6, 0x59, 0xE0, 0xD9, 0x93, 0x3E, + 0x26, 0x8C, 0xF3, 0xE6, 0x01, 0x69, 0x7F, 0x64, 0xD3, 0x6B, 0xEA, 0x8A, 0x90, 0x20, 0x95, 0x01, + 0x38, 0xD4, 0xC1, 0xD4, 0x72, 0xC0, 0x05, 0x66, 0x26, 0x8A, 0x7A, 0xAE, 0xED, 0x04, 0x3D, 0xEC, + 0xDD, 0x92, 0x3D, 0x9A, 0xB0, 0x1B, 0x9D, 0x11, 0xEA, 0xE1, 0x23, 0x59, 0xFD, 0x1D, 0x73, 0xD4, + 0x9B, 0x52, 0x3D, 0x3E, 0x1B, 0x2C, 0x7F, 0x72, 0xE6, 0x3E, 0x54, 0x06, 0x62, 0x3A, 0x01, 0x76, + 0x1C, 0xF3, 0x02, 0xDF, 0x62, 0x0F, 0x3B, 0x03, 0xD6, 0xE1, 0x19, 0x49, 0x3A, 0x71, 0x87, 0x43, + 0xEA, 0x68, 0x32, 0x13, 0x94, 0xDD, 0x8B, 0x5E, 0x15, 0x40, 0x11, 0x24, 0xA6, 0x7B, 0x60, 0xCA, + 0x40, 0x72, 0x23, 0x71, 0xA7, 0xC8, 0x4A, 0xC2, 0xDB, 0x16, 0xB5, 0x34, 0x18, 0x70, 0x11, 0xDC, + 0x83, 0x95, 0x49, 0x29, 0x61, 0x62, 0x9E, 0x28, 0x99, 0x5A, 0x93, 0xC4, 0x37, 0xEB, 0x6E, 0x30, + 0x39, 0xE4, 0xB1, 0xCA, 0x49, 0xEC, 0x64, 0xC7, 0x04, 0x3B, 0x9C, 0x64, 0xC1, 0x7E, 0xE2, 0x38, + 0x68, 0x2B, 0x54, 0x28, 0x41, 0xCB, 0x21, 0x62, 0x52, 0xC4, 0xD7, 0x22, 0x31, 0x7D, 0x17, 0x8D, + 0x48, 0x26, 0xEB, 0x17, 0xD7, 0xE2, 0x7C, 0xAD, 0xF4, 0x83, 0x27, 0xB2, 0x4A, 0x01, 0x53, 0x47, + 0x34, 0x31, 0x5A, 0xCD, 0x71, 0x1D, 0x5C, 0x93, 0x13, 0x7F, 0xD1, 0x10, 0xE9, 0xFC, 0x96, 0x37, + 0x23, 0x77, 0xF0, 0x9D, 0x35, 0x25, 0x7B, 0x32, 0x0F, 0xC3, 0xC2, 0xB0, 0xDF, 0xFF, 0x88, 0x5C, + 0xB6, 0xF8, 0x70, 0x47, 0x5D, 0x9A, 0x61, 0x44, 0x80, 0xCD, 0xB3, 0x2F, 0x45, 0x89, 0xCE, 0x58, + 0x4A, 0x26, 0x5A, 0x15, 0x1A, 0x0B, 0x26, 0x9C, 0x95, 0x95, 0xE3, 0x78, 0x9F, 0x10, 0xD5, 0x1D, + 0x8C, 0x7C, 0x9E, 0x79, 0x0C, 0xC2, 0x79, 0xA2, 0x24, 0x18, 0xFF, 0x31, 0x25, 0xBB, 0x6A, 0x96, + 0x6A, 0xCB, 0xF5, 0xC8, 0x5E, 0xA3, 0x51, 0x6B, 0x8B, 0xE6, 0x86, 0x16, 0x62, 0x7F, 0x5A, 0x9E, + 0x3B, 0xB1, 0xDC, 0x07, 0xA7, 0x96, 0x91, 0x59, 0x45, 0xC0, 0xC0, 0xCF, 0xA4, 0xE4, 0xFB, 0xD2, + 0x92, 0xB8, 0x1C, 0x0A, 0x04, 0x93, 0xF3, 0xBF, 0xD0, 0xE0, 0xEB, 0xE3, 0xB7, 0x36, 0x4F, 0x93, + 0x42, 0xBD, 0x27, 0xE4, 0x12, 0xB6, 0x51, 0xA1, 0x85, 0x3C, 0xE3, 0x5A, 0xD8, 0x53, 0x61, 0x4B, + 0xDB, 0xD2, 0xEC, 0x68, 0x57, 0x56, 0x2E, 0xF0, 0xD8, 0xBD, 0xC7, 0xF4, 0x22, 0x09, 0x8E, 0x8F, + 0x70, 0xDF, 0x44, 0xFF, 0x60, 0xE5, 0x65, 0x99, 0x12, 0x5F, 0x60, 0xBD, 0x71, 0xDC, 0xA0, 0xD1, + 0x56, 0x6F, 0xB1, 0x9A, 0x21, 0xBF, 0x28, 0x29, 0x3F, 0x87, 0x59, 0xE1, 0xBE, 0x35, 0xC9, 0x2E, + 0x1D, 0x1D, 0xE2, 0x45, 0x6D, 0x21, 0x3A, 0xA4, 0x7B, 0x5F, 0x82, 0x04, 0xF2, 0xA4, 0xD4, 0x5B, + 0x75, 0xF2, 0xAF, 0x00, 0x8A, 0xD0, 0x51, 0x0E, 0x7F, 0x74, 0x91, 0x5B, 0x8A, 0x86, 0xE8, 0x7E, + 0x58, 0x47, 0x47, 0x58, 0x58, 0x9C, 0x96, 0x4C, 0xFB, 0x4A, 0x1E, 0x49, 0x1A, 0xA3, 0x14, 0xBD, + 0x17, 0xD1, 0x03, 0x65, 0x44, 0x31, 0x7A, 0x33, 0x6C, 0x29, 0x7A, 0xDA, 0x95, 0x3D, 0xB3, 0x43, + 0xB6, 0x26, 0x43, 0xB6, 0xED, 0x8E, 0x69, 0x4A, 0xA4, 0x39, 0x04, 0x05, 0xD2, 0x90, 0xCA, 0x5F, + 0x85, 0xF7, 0xA0, 0x42, 0x56, 0x37, 0xC2, 0x8C, 0x38, 0xEF, 0x5B, 0x23, 0x2C, 0x6C, 0xA1, 0xAE, + 0x61, 0x18, 0xCD, 0xA4, 0xB6, 0xA3, 0xA6, 0x3E, 0xA2, 0xE5, 0x5A, 0x88, 0x9E, 0x14, 0xC0, 0xB0, + 0x27, 0x69, 0x3F, 0xE8, 0x23, 0x33, 0x07, 0x2A, 0xFB, 0x6F, 0xF0, 0x35, 0xA0, 0x05, 0x6F, 0x10, + 0xB0, 0x20, 0x6A, 0x0D, 0x28, 0x22, 0x0C, 0x83, 0x11, 0x36, 0xBD, 0x10, 0x45, 0x31, 0xB8, 0xF5, + 0x24, 0x8D, 0xFD, 0xE9, 0x60, 0x40, 0x8E, 0x0B, 0x94, 0x4A, 0x21, 0xD5, 0x54, 0x04, 0x87, 0x97, + 0xEB, 0x28, 0xAC, 0xB3, 0x6C, 0x53, 0x49, 0xA2, 0x62, 0x98, 0x45, 0xC1, 0x69, 0x08, 0x23, 0xC7, + 0x92, 0x90, 0x28, 0xCE, 0xBF, 0xF0, 0x7C, 0x10, 0xE5, 0xBF, 0xBC, 0xE5, 0x47, 0x30, 0xDD, 0xD1, + 0x22, 0x79, 0xB4, 0x0B, 0x0F, 0xAE, 0x60, 0x8C, 0x85, 0x35, 0xBA, 0xED, 0x51, 0xE5, 0xD7, 0xE0, + 0x76, 0xD9, 0x88, 0xB2, 0xED, 0xEC, 0x56, 0xE0, 0x30, 0x2C, 0x99, 0x72, 0xB5, 0xF6, 0x1C, 0x76, + 0x42, 0xFC, 0xA7, 0x74, 0x9C, 0x53, 0x0E, 0xA0, 0xA5, 0x29, 0x4C, 0xA0, 0xCB, 0xA3, 0x4F, 0xD3, + 0xA5, 0x6C, 0x0A, 0x35, 0x4E, 0x3E, 0xA9, 0x23, 0xCD, 0xC7, 0x28, 0x96, 0x71, 0x41, 0x7A, 0xC4, + 0xF1, 0xAB, 0x71, 0x41, 0xE6, 0xB9, 0xC9, 0x22, 0x7F, 0x3E, 0x55, 0x68, 0x84, 0xF1, 0x56, 0xB6, + 0x08, 0x1A, 0x49, 0xA1, 0x29, 0x35, 0x01, 0x2E, 0x75, 0x26, 0x62, 0x39, 0x30, 0x05, 0x78, 0xA0, + 0xE3, 0xF9, 0x21, 0xF8, 0x23, 0x2C, 0x8E, 0x82, 0x24, 0xD2, 0x32, 0xBE, 0x20, 0x84, 0x65, 0x2D, + 0x48, 0x69, 0xD8, 0x5D, 0x5F, 0x27, 0xC4, 0x9E, 0x92, 0x5D, 0x20, 0xBA, 0xC1, 0xE4, 0x7F, 0xC1, + 0x03, 0xC6, 0x0E, 0x32, 0xA8, 0x25, 0x81, 0x94, 0xD5, 0x5A, 0xA0, 0xC4, 0x46, 0x23, 0x73, 0xE2, + 0xE3, 0xF7, 0x67, 0xFD, 0x3E, 0xCB, 0xD9, 0x42, 0xCF, 0xCE, 0xB2, 0xEC, 0x26, 0x90, 0xC3, 0x11, + 0x69, 0x91, 0x04, 0x00, 0xFC, 0x5C, 0x22, 0xAE, 0x4E, 0xB7, 0x36, 0x8D, 0x22, 0x54, 0x6C, 0xA4, + 0x13, 0xB1, 0x31, 0x03, 0x13, 0x28, 0xFE, 0xA2, 0x9C, 0xA8, 0x46, 0x83, 0x96, 0x0F, 0xBC, 0x62, + 0x9F, 0xAD, 0x20, 0x44, 0x65, 0x0F, 0x98, 0x9F, 0xFF, 0xC0, 0xF4, 0xB0, 0xA8, 0x8C, 0x79, 0x81, + 0x6E, 0xF2, 0x81, 0x30, 0x87, 0x53, 0x88, 0xD4, 0x64, 0x2D, 0x75, 0x93, 0x94, 0x2C, 0x3C, 0xCB, + 0xB4, 0x74, 0x19, 0xF6, 0x82, 0x25, 0x9B, 0x4C, 0x27, 0x59, 0x0D, 0xD8, 0xA4, 0x4E, 0x22, 0x10, + 0xFB, 0x4A, 0xB6, 0x81, 0x36, 0x6C, 0xF8, 0x8F, 0x6C, 0x3C, 0xB2, 0xFC, 0x46, 0x9C, 0x34, 0x70, + 0x9F, 0x33, 0x81, 0xEF, 0x9F, 0x07, 0x71, 0x30, 0x9B, 0xCA, 0x9E, 0x88, 0xB1, 0xDC, 0x34, 0xC4, + 0x13, 0x13, 0x11, 0x8E, 0x87, 0xF6, 0x25, 0xC0, 0x1E, 0x6E, 0xDC, 0x52, 0x5B, 0xC7, 0xC3, 0x02, + 0x4D, 0x69, 0xE0, 0x5F, 0xC9, 0x76, 0x20, 0x52, 0xBC, 0x29, 0xF9, 0xB5, 0x58, 0xEB, 0xBD, 0x38, + 0x1B, 0x14, 0x69, 0x4A, 0x73, 0x43, 0x95, 0xC7, 0x4A, 0x85, 0x88, 0x37, 0x2F, 0x8C, 0xB9, 0xD7, + 0x13, 0x18, 0x25, 0x1E, 0xF0, 0x8B, 0xB5, 0x16, 0x52, 0x40, 0x51, 0x00, 0xF0, 0x67, 0xA1, 0x96, + 0x9F, 0xEC, 0x23, 0x3B, 0x6E, 0xF8, 0x60, 0xDF, 0xDA, 0xC5, 0xDA, 0x5D, 0xEE, 0xF7, 0xAE, 0x0E, + 0x04, 0x9A, 0xC9, 0x39, 0xF4, 0xCA, 0x9A, 0x14, 0x6B, 0x4B, 0x5D, 0xB9, 0xE3, 0xA6, 0x74, 0x27, + 0x5F, 0xAC, 0x65, 0xF2, 0x20, 0xFA, 0x14, 0xC3, 0x11, 0x76, 0x79, 0xC5, 0xA0, 0xF5, 0x9F, 0xFC, + 0x00, 0x8F, 0x63, 0x00, 0x3E, 0xFB, 0xBB, 0x50, 0xDB, 0x43, 0x39, 0xE3, 0x17, 0x69, 0x1D, 0xE5, + 0x00, 0x2B, 0xD4, 0xFE, 0xEC, 0x52, 0x60, 0x1E, 0xA4, 0x05, 0x2B, 0xD4, 0xEA, 0x48, 0xC8, 0xEC, + 0x48, 0xDA, 0x89, 0x87, 0xA3, 0xB0, 0x3D, 0xDB, 0x26, 0xA8, 0xEB, 0x1A, 0x9B, 0xC5, 0x7C, 0x4A, + 0x22, 0x86, 0x39, 0xA1, 0x40, 0x59, 0xE0, 0x51, 0xEC, 0xC6, 0x0F, 0x37, 0x40, 0x2D, 0x48, 0xB8, + 0xBB, 0xB6, 0x25, 0x28, 0xD3, 0x0E, 0xC4, 0xB6, 0xAE, 0x6D, 0x91, 0x96, 0xA6, 0x67, 0x0E, 0x02, + 0xEC, 0xF9, 0xA2, 0x3A, 0x95, 0x67, 0x7D, 0x33, 0x42, 0x0D, 0x33, 0x24, 0x0D, 0x2F, 0x53, 0xDC, + 0x1A, 0x23, 0x6C, 0x0B, 0x52, 0xA3, 0x1A, 0x46, 0xA7, 0xDB, 0xA2, 0xB9, 0x5D, 0x93, 0xFA, 0x9C, + 0x95, 0x52, 0xAD, 0xDE, 0x31, 0x68, 0x03, 0x9D, 0x02, 0x09, 0xB9, 0x0A, 0x28, 0xE5, 0xF0, 0xE1, + 0x46, 0x48, 0xA0, 0x8E, 0x1C, 0xDB, 0x21, 0x1F, 0xEE, 0x6B, 0x74, 0x39, 0xD9, 0x32, 0x52, 0x97, + 0x93, 0x2D, 0xA3, 0x00, 0xDA, 0x04, 0xE8, 0xFD, 0xB3, 0xF3, 0x99, 0x20, 0x47, 0xBB, 0xD7, 0x34, + 0x4B, 0x65, 0x74, 0xB9, 0x92, 0xDC, 0xD7, 0xEA, 0xC6, 0xDC, 0x89, 0x1B, 0xEF, 0x9B, 0x84, 0x43, + 0xDE, 0x07, 0xD7, 0x0F, 0xF8, 0xE8, 0xAF, 0x27, 0x46, 0x7F, 0x3D, 0x65, 0xF4, 0x93, 0xBD, 0x4F, + 0xE1, 0x40, 0x02, 0x1D, 0x68, 0x30, 0x86, 0x6E, 0x0B, 0x7E, 0x54, 0x8C, 0xF4, 0x63, 0x39, 0x4C, + 0x9A, 0x9E, 0xD1, 0xC4, 0xAE, 0xCC, 0x9A, 0x48, 0x51, 0xAD, 0x1A, 0x2A, 0x9E, 0x55, 0xA3, 0x72, + 0xCF, 0x58, 0x3F, 0xAE, 0x7C, 0xEC, 0x69, 0xBA, 0x07, 0x9F, 0xA9, 0xAE, 0x0B, 0xBE, 0x77, 0x87, + 0x6E, 0x7B, 0xE0, 0x8E, 0xE1, 0x2F, 0xF8, 0x8A, 0xC6, 0x80, 0x7F, 0x4A, 0x96, 0x56, 0xA2, 0x3F, + 0x6C, 0xB2, 0x25, 0x1D, 0x9B, 0xF6, 0x08, 0x91, 0xC5, 0xDA, 0x23, 0x5B, 0x9F, 0x05, 0x50, 0xF0, + 0xF0, 0xF0, 0xD0, 0x9E, 0x2B, 0x15, 0xDA, 0x83, 0x09, 0x3B, 0x58, 0x32, 0xB2, 0xD2, 0x85, 0x4B, + 0x64, 0x87, 0xD8, 0xA7, 0xEC, 0xC6, 0x5C, 0x54, 0xBA, 0x1D, 0xA3, 0x53, 0xA4, 0x91, 0x34, 0xE8, + 0xB5, 0x9B, 0x91, 0xE5, 0x5D, 0xF7, 0x27, 0xA6, 0xF7, 0xFD, 0x68, 0xEA, 0x74, 0x6A, 0xE5, 0x00, + 0xF4, 0x3E, 0x95, 0x20, 0x33, 0x64, 0x78, 0x80, 0xFD, 0xE0, 0xFF, 0xC2, 0x3F, 0x25, 0xBB, 0x09, + 0xED, 0x09, 0x42, 0x02, 0xA1, 0xA6, 0xD8, 0xA2, 0x85, 0xAA, 0x97, 0x9E, 0xE9, 0xF8, 0x63, 0x3B, + 0x78, 0xFF, 0x7E, 0xB7, 0xA6, 0xBF, 0x17, 0x56, 0x0C, 0x79, 0xB0, 0x7F, 0xBB, 0xDA, 0xFB, 0x35, + 0x74, 0x14, 0x12, 0x4C, 0x98, 0x2B, 0x2B, 0x63, 0x7A, 0x9C, 0x83, 0x1A, 0xB6, 0xE5, 0x23, 0x3F, + 0x30, 0x3D, 0x6A, 0x26, 0xA5, 0xD7, 0x8E, 0x8A, 0xA7, 0x69, 0x64, 0xF4, 0x8C, 0xBF, 0x67, 0xDB, + 0xF7, 0xEA, 0x2C, 0xA2, 0xCB, 0xB6, 0xFE, 0x6D, 0x47, 0x01, 0xF5, 0x2D, 0x2B, 0x97, 0xB4, 0x00, + 0x3E, 0xCD, 0x4A, 0x94, 0x74, 0xE0, 0x13, 0x1A, 0x31, 0x43, 0x9E, 0x32, 0x5D, 0xA4, 0x63, 0x9D, + 0xD0, 0x54, 0x12, 0xE8, 0x32, 0xEC, 0xA0, 0xDE, 0x85, 0xF3, 0x63, 0x09, 0x05, 0xF7, 0x73, 0xD9, + 0x42, 0x8F, 0x59, 0x3A, 0xD6, 0x24, 0x85, 0x09, 0x4E, 0x65, 0x1A, 0x71, 0xAA, 0xCA, 0x09, 0xAD, + 0x6F, 0xE8, 0xCF, 0x65, 0x06, 0x3B, 0xF8, 0xA6, 0x09, 0xCA, 0xBC, 0x3A, 0x1A, 0x7B, 0xB6, 0xFE, + 0x6F, 0xE9, 0xED, 0x0B, 0x90, 0xF3, 0xD8, 0xA6, 0x90, 0x21, 0xEC, 0xF4, 0x19, 0x10, 0x61, 0xEF, + 0x1A, 0x6E, 0xBB, 0x34, 0x17, 0xF4, 0x05, 0x77, 0x5D, 0x7C, 0x17, 0xE4, 0xDE, 0x10, 0x1D, 0x7F, + 0xCF, 0xD3, 0xFC, 0x92, 0x93, 0xB9, 0x05, 0x4B, 0xED, 0x06, 0x58, 0x2F, 0x0C, 0xDD, 0xAE, 0x70, + 0xC3, 0x80, 0x2D, 0x0A, 0x29, 0x13, 0x17, 0xE4, 0x3D, 0x6D, 0x02, 0xE3, 0x6C, 0x64, 0x3D, 0xD7, + 0xB7, 0xE1, 0xBF, 0xBB, 0x83, 0xC1, 0x94, 0xEC, 0x75, 0x9E, 0xD8, 0x6E, 0x68, 0xBD, 0xDD, 0xD1, + 0x20, 0xED, 0xB4, 0x29, 0xD6, 0xF5, 0x76, 0x06, 0xD6, 0x94, 0x25, 0x8D, 0xDE, 0xEE, 0x1F, 0xD2, + 0x20, 0xC8, 0x96, 0xF4, 0xD2, 0x4D, 0xEA, 0x22, 0x18, 0xB5, 0xF8, 0x0C, 0x2D, 0x84, 0x17, 0x70, + 0xF2, 0x5B, 0x7C, 0x21, 0x2D, 0x84, 0x97, 0x71, 0xB2, 0x1B, 0x9C, 0x98, 0x01, 0xD8, 0xC2, 0x69, + 0x93, 0xB6, 0xB1, 0x65, 0x74, 0xB7, 0xD6, 0x5E, 0x6F, 0xE5, 0x34, 0x71, 0x9D, 0x21, 0x6F, 0xC3, + 0xDE, 0xF8, 0xD9, 0x5C, 0x37, 0xD6, 0x5F, 0x6F, 0x74, 0xB2, 0x5B, 0xED, 0x8E, 0x02, 0x3B, 0x98, + 0x5A, 0xF4, 0x1C, 0xB5, 0xBE, 0x41, 0x70, 0x6D, 0xA6, 0xA3, 0xE1, 0xD7, 0xDE, 0x1F, 0xB0, 0x3D, + 0xBC, 0x03, 0x34, 0x46, 0x5E, 0x4D, 0xE5, 0x82, 0x3C, 0x6E, 0x51, 0x60, 0x4B, 0x96, 0x22, 0x7A, + 0xA9, 0x28, 0xB3, 0xA5, 0x87, 0x48, 0x87, 0x28, 0x06, 0xE1, 0x04, 0xC9, 0x76, 0x19, 0xC9, 0x98, + 0x2B, 0x15, 0x87, 0xAD, 0xFA, 0xD0, 0x55, 0x1A, 0xBE, 0x72, 0x43, 0x58, 0x6E, 0x18, 0x93, 0xCE, + 0xB2, 0xF2, 0x6C, 0x96, 0xE7, 0xD6, 0x6B, 0x83, 0xFE, 0xB4, 0x50, 0xF4, 0x4B, 0x34, 0x8F, 0xC3, + 0x32, 0x98, 0xC4, 0xFC, 0xD7, 0x7C, 0xF5, 0x91, 0x87, 0xF4, 0xF3, 0xCF, 0x40, 0xFA, 0x65, 0x11, + 0x48, 0x7F, 0x64, 0xF9, 0xF6, 0x95, 0x57, 0x67, 0xD5, 0x54, 0x5A, 0x29, 0xB5, 0x96, 0xE4, 0x57, + 0xEC, 0xB7, 0x41, 0x16, 0xAB, 0x8F, 0xD8, 0x83, 0x64, 0x64, 0xE4, 0xDB, 0x0A, 0x75, 0x57, 0x8D, + 0xA3, 0x1E, 0x0A, 0x31, 0x5A, 0x90, 0xF8, 0xE5, 0x4E, 0xC7, 0x58, 0x5D, 0x6B, 0xA1, 0xCD, 0x4D, + 0xC9, 0xFE, 0xC3, 0x3E, 0x03, 0x93, 0xA1, 0xA0, 0xC0, 0xA2, 0x90, 0x82, 0x4E, 0x9D, 0x2B, 0xCB, + 0xF0, 0x3E, 0x9A, 0xD1, 0x42, 0xFC, 0x3F, 0x02, 0xBE, 0x75, 0x3E, 0xA8, 0xF4, 0x97, 0xCA, 0x72, + 0x94, 0x36, 0xDB, 0x96, 0xBB, 0x06, 0x99, 0xD8, 0xF4, 0x02, 0xB6, 0x2D, 0xE1, 0xA5, 0x1F, 0x00, + 0x2F, 0xFD, 0xA5, 0xA8, 0x28, 0xFD, 0x48, 0x35, 0xCD, 0x44, 0xEE, 0x68, 0x55, 0x4C, 0x33, 0xAC, + 0x71, 0x7C, 0x7A, 0xBE, 0x36, 0x4A, 0x9B, 0xE6, 0x62, 0xAA, 0xCF, 0x2E, 0x2F, 0x8E, 0x7B, 0x45, + 0x2C, 0x34, 0x22, 0x56, 0x38, 0x76, 0x87, 0x58, 0x8B, 0xD9, 0x68, 0x0A, 0x22, 0xD4, 0xF4, 0x33, + 0x3E, 0x72, 0x2F, 0xAE, 0x9F, 0x99, 0x68, 0x7B, 0x9F, 0xE6, 0x87, 0xB8, 0xA8, 0x81, 0x44, 0x3B, + 0xC4, 0xC5, 0x4D, 0x24, 0xDA, 0xB1, 0xCA, 0x37, 0x92, 0x88, 0xCD, 0xC0, 0xE4, 0xC0, 0xB0, 0x96, + 0x31, 0x5A, 0xA8, 0x10, 0x38, 0xEF, 0x6A, 0x85, 0x9A, 0x29, 0x23, 0xCD, 0xEC, 0x33, 0xD6, 0x83, + 0x13, 0x3C, 0x38, 0xDD, 0x92, 0x00, 0x42, 0xBC, 0x9F, 0x2E, 0xD6, 0x1F, 0x2E, 0xDC, 0xB5, 0x0F, + 0x25, 0xC8, 0xA6, 0xEC, 0xEE, 0x14, 0x26, 0x5A, 0x60, 0x72, 0x27, 0x73, 0xA3, 0xA6, 0xE7, 0x70, + 0x59, 0x44, 0x9C, 0xA9, 0x9D, 0x2A, 0x4C, 0xAD, 0xD2, 0xA8, 0x14, 0x2E, 0x81, 0x81, 0xDD, 0x2A, + 0x0C, 0xEC, 0x56, 0x60, 0x60, 0xB7, 0x1A, 0x03, 0xBB, 0x55, 0x18, 0xD8, 0xAD, 0xC6, 0xC0, 0x6E, + 0x15, 0x06, 0xAE, 0x56, 0x61, 0xE0, 0x6A, 0x05, 0x06, 0xAE, 0x56, 0x63, 0xE0, 0x6A, 0x15, 0x06, + 0xAE, 0x56, 0x63, 0xA0, 0xD4, 0x2C, 0x3A, 0x8A, 0x8B, 0xBE, 0xCF, 0xBA, 0x23, 0x79, 0x9E, 0x87, + 0x74, 0xC6, 0xD2, 0x1B, 0xC6, 0x6A, 0xD0, 0x50, 0x08, 0x01, 0xC0, 0x01, 0xCD, 0x7E, 0xC6, 0xEF, + 0xB5, 0x2E, 0xDD, 0xEF, 0x18, 0xCE, 0xF9, 0xB4, 0xF2, 0xF6, 0x2B, 0x25, 0xF1, 0xCC, 0x14, 0x47, + 0xE9, 0x1A, 0xD4, 0x0C, 0x34, 0xDA, 0x7B, 0xB6, 0x6C, 0x2C, 0x2D, 0xB4, 0xBA, 0xC1, 0xFE, 0x1F, + 0xAD, 0x3F, 0xAB, 0x1B, 0x69, 0xD7, 0x6E, 0xBD, 0xD2, 0x46, 0xF9, 0x5C, 0xEC, 0x09, 0xBB, 0xB3, + 0x39, 0x0D, 0xDC, 0x5F, 0xF0, 0xD3, 0x05, 0x76, 0xF0, 0x83, 0x39, 0xCA, 0xB3, 0x37, 0xC3, 0xCD, + 0x72, 0xDE, 0x4D, 0x23, 0xDC, 0x37, 0x9F, 0xE1, 0xE0, 0xC1, 0xF5, 0xBE, 0x5F, 0x1B, 0xFD, 0xFE, + 0xF1, 0x01, 0xBB, 0x13, 0x93, 0xD6, 0x5C, 0x23, 0x73, 0xCD, 0x15, 0xEE, 0xAF, 0x35, 0xF7, 0x6D, + 0x5A, 0x3C, 0x3D, 0xD3, 0xF7, 0xC9, 0x6F, 0xD6, 0x33, 0xE0, 0xEA, 0x3C, 0x53, 0x9F, 0x3A, 0xCF, + 0xD8, 0xA7, 0xEE, 0x33, 0xF5, 0xA9, 0xFB, 0x8C, 0x7D, 0x5A, 0x7D, 0xA6, 0x3E, 0xAD, 0xCE, 0xB1, + 0x4F, 0xB2, 0xCA, 0xBB, 0x1C, 0x24, 0xAF, 0x7E, 0x8B, 0x1E, 0x30, 0xA2, 0xE8, 0x82, 0xF8, 0x12, + 0x76, 0x63, 0x7D, 0x7D, 0x35, 0x71, 0xED, 0x4B, 0x3F, 0x66, 0x13, 0xF5, 0x43, 0x4F, 0x5A, 0xD5, + 0xA3, 0x4F, 0x14, 0xDD, 0xB0, 0x18, 0xCA, 0xAE, 0xAC, 0xCA, 0x94, 0x4D, 0xAD, 0x39, 0x53, 0xB6, + 0xB2, 0x72, 0xEE, 0xA0, 0xD0, 0xAB, 0xA4, 0x85, 0x2E, 0xF7, 0x7B, 0x88, 0x0D, 0x0A, 0x75, 0x05, + 0x60, 0xB8, 0xD0, 0xC0, 0x74, 0x90, 0xE3, 0x52, 0xE8, 0xAC, 0x07, 0x16, 0x32, 0x03, 0xB8, 0xB2, + 0x45, 0x3E, 0xD8, 0xBE, 0x03, 0x7B, 0x8C, 0x43, 0x9B, 0xF5, 0x34, 0x80, 0x47, 0xE0, 0x11, 0xA0, + 0x6B, 0x41, 0x8D, 0x27, 0xDA, 0xF8, 0x06, 0xB7, 0xDB, 0xED, 0x30, 0x30, 0x90, 0xFA, 0x43, 0xF0, + 0x7C, 0x53, 0xA7, 0xD3, 0x00, 0x3F, 0x26, 0x85, 0x09, 0xFC, 0x5A, 0x94, 0x41, 0x24, 0x9F, 0x2A, + 0x13, 0x97, 0xCE, 0x08, 0x4E, 0x13, 0x73, 0xC9, 0x49, 0x5F, 0xD9, 0xE3, 0xE8, 0x9B, 0x72, 0x96, + 0xF6, 0xB1, 0xF9, 0x48, 0x9A, 0x5E, 0xDA, 0xA1, 0x47, 0x4B, 0xC7, 0x58, 0xEF, 0x74, 0x8D, 0xC4, + 0xF5, 0x7F, 0xA7, 0x45, 0xBE, 0xB7, 0xBA, 0xB2, 0x95, 0x41, 0x72, 0x13, 0xCA, 0x3E, 0x34, 0x33, + 0x34, 0x27, 0x74, 0x0F, 0x30, 0x1F, 0x44, 0x05, 0x16, 0x72, 0xA9, 0x6F, 0x1B, 0x06, 0xFA, 0x2B, + 0xEA, 0xA6, 0x9B, 0xBF, 0x15, 0x0A, 0xE5, 0xEA, 0x5A, 0xDB, 0x85, 0x14, 0xF3, 0x54, 0x8E, 0xEB, + 0x71, 0xD3, 0x63, 0x27, 0x00, 0xF3, 0xF1, 0x88, 0xCF, 0x94, 0x24, 0x43, 0x36, 0xE6, 0xC2, 0x0A, + 0x3D, 0x42, 0x43, 0xDD, 0x45, 0x86, 0xD3, 0x2C, 0xEA, 0x6D, 0x81, 0x77, 0x62, 0xC5, 0xEE, 0x1D, + 0xF7, 0x76, 0x99, 0x67, 0x44, 0xFC, 0xF2, 0x23, 0x39, 0xEE, 0x0B, 0x5D, 0x72, 0x1C, 0xA7, 0x2D, + 0xFC, 0x5F, 0xEC, 0xD9, 0x61, 0xEA, 0x53, 0x91, 0x39, 0x18, 0x0E, 0xCE, 0xFA, 0x8B, 0x46, 0xF1, + 0xDE, 0x0C, 0xC8, 0xCE, 0xEE, 0x69, 0xD1, 0x68, 0xFA, 0xD3, 0x1B, 0xF2, 0xEF, 0x5C, 0xB1, 0x70, + 0x81, 0x0B, 0x31, 0x9C, 0x05, 0x13, 0xAE, 0x97, 0x8D, 0xA4, 0x5E, 0x36, 0xB4, 0x7A, 0x59, 0x8F, + 0x27, 0x12, 0x99, 0xB3, 0xCB, 0x5E, 0x55, 0x69, 0x89, 0x0C, 0x6A, 0x84, 0xA6, 0xD1, 0xE8, 0xF0, + 0x71, 0xE2, 0x3A, 0x4C, 0xB5, 0xAE, 0x12, 0xD9, 0x7C, 0x2D, 0xEE, 0xEE, 0xA9, 0x66, 0x78, 0x2D, + 0x52, 0x15, 0xBB, 0x09, 0xE6, 0x59, 0xEB, 0x26, 0x84, 0x9A, 0x81, 0x4D, 0x33, 0x61, 0xB4, 0xD0, + 0x32, 0x78, 0x36, 0x49, 0xC6, 0xCC, 0x55, 0xDA, 0x6B, 0xA3, 0x22, 0xEC, 0x0B, 0xD7, 0x25, 0x67, + 0x84, 0x11, 0x15, 0x0D, 0x30, 0xD1, 0x1A, 0x09, 0xE3, 0x3B, 0x33, 0xD0, 0x1A, 0x2D, 0xF8, 0xAA, + 0x58, 0x69, 0xCB, 0xE2, 0xB1, 0xFD, 0x09, 0x4F, 0xE9, 0xB1, 0x08, 0x64, 0xB1, 0xD9, 0x6F, 0x12, + 0x99, 0x82, 0x8F, 0x2D, 0x6E, 0xEB, 0x4B, 0x98, 0xFA, 0xE8, 0x6E, 0xCC, 0xCF, 0x44, 0x20, 0x9C, + 0x4D, 0xBD, 0x8C, 0x33, 0xA9, 0x1A, 0x5F, 0x5B, 0x4E, 0x93, 0x62, 0xB1, 0x35, 0xA8, 0xFA, 0x3D, + 0x76, 0x3D, 0xCB, 0xA0, 0x85, 0x4A, 0x55, 0xE5, 0x13, 0xD7, 0xAC, 0x3A, 0x3E, 0xF5, 0xF4, 0x8F, + 0xC6, 0xE6, 0xA1, 0x16, 0x97, 0xB6, 0x99, 0x11, 0xC6, 0xDE, 0x24, 0x42, 0xC2, 0x99, 0x38, 0x34, + 0x2B, 0xCD, 0x7B, 0x32, 0x11, 0xCD, 0xE5, 0x9F, 0xD8, 0xB7, 0x98, 0x6F, 0x2F, 0xC8, 0x44, 0x27, + 0xEB, 0xAD, 0x40, 0xD2, 0x3A, 0x95, 0x95, 0xAE, 0x44, 0x4B, 0xBA, 0x1B, 0x71, 0x33, 0x0A, 0x0D, + 0x49, 0x49, 0x56, 0xAD, 0x04, 0x89, 0x40, 0x88, 0x2F, 0xAF, 0x22, 0xC4, 0x8D, 0xCA, 0x4E, 0xF4, + 0x82, 0xB3, 0xA6, 0xE8, 0x97, 0xBB, 0x83, 0xA4, 0xC7, 0x13, 0xE2, 0x60, 0xAF, 0xBA, 0x6F, 0xDE, + 0xE3, 0xBD, 0x00, 0x1E, 0x28, 0xA9, 0xF5, 0xC8, 0xF2, 0x46, 0xD6, 0x3B, 0xBA, 0xCA, 0xD1, 0xF0, + 0x17, 0x01, 0x02, 0xBC, 0x9E, 0x4E, 0xFF, 0x4C, 0x18, 0x57, 0xC2, 0xE0, 0xA9, 0x08, 0x92, 0x50, + 0x61, 0xA1, 0xC9, 0xB5, 0x85, 0x25, 0x5A, 0xE9, 0xEE, 0xBB, 0xB9, 0xF5, 0xD6, 0x7F, 0x91, 0xDD, + 0xFD, 0xA7, 0x64, 0x29, 0x29, 0x92, 0x4A, 0xE3, 0xC4, 0x35, 0x21, 0xAC, 0xB0, 0x8D, 0x78, 0xAF, + 0x1F, 0x4C, 0x3B, 0x20, 0x9B, 0xF3, 0xBA, 0xE8, 0x4E, 0xA1, 0x97, 0x41, 0xBD, 0xC7, 0x4D, 0xE8, + 0x6E, 0x93, 0xEC, 0xE8, 0x9B, 0x90, 0xF8, 0xC8, 0x6E, 0xF5, 0x4A, 0x4C, 0xD2, 0xCA, 0x82, 0x9E, + 0xD5, 0x0D, 0xA3, 0x3C, 0x38, 0x42, 0xB1, 0x18, 0xF1, 0x27, 0x0E, 0x5E, 0xDF, 0xBC, 0x87, 0xEE, + 0xB4, 0xDB, 0xD2, 0xE5, 0x9F, 0x12, 0x1E, 0x59, 0x8B, 0x73, 0x86, 0xB4, 0xB2, 0x18, 0xDF, 0x92, + 0x80, 0x0C, 0x71, 0x5A, 0x58, 0x49, 0x22, 0xC0, 0x45, 0x8C, 0xB4, 0x99, 0x25, 0xC0, 0x64, 0xF6, + 0x20, 0x93, 0x59, 0x02, 0x4D, 0xE6, 0x13, 0x6C, 0x32, 0x7B, 0xC0, 0xC9, 0x6C, 0x41, 0x27, 0xB3, + 0x04, 0x9E, 0xCC, 0x1A, 0x7C, 0x32, 0xFF, 0x30, 0x92, 0x59, 0x43, 0x49, 0xE6, 0x11, 0x4E, 0x52, + 0x3D, 0xA4, 0x64, 0xD6, 0xB0, 0x92, 0x64, 0x16, 0x07, 0x98, 0xFA, 0x0C, 0xDF, 0x6F, 0x60, 0xE5, + 0x7B, 0x59, 0x0B, 0x93, 0x76, 0xDD, 0x58, 0x94, 0x2A, 0xE6, 0x3B, 0xAD, 0x44, 0x68, 0xA5, 0x1A, + 0x09, 0x23, 0x44, 0x44, 0xCF, 0xE9, 0x51, 0x3A, 0x0A, 0x0A, 0x74, 0xB7, 0xEE, 0x75, 0x57, 0x79, + 0x0B, 0xCC, 0x82, 0xB2, 0xA3, 0x96, 0x7F, 0xF9, 0x0B, 0x4A, 0x69, 0xC8, 0x5E, 0xCE, 0xAC, 0xD6, + 0x98, 0xBD, 0x01, 0x59, 0x11, 0x31, 0x7B, 0xCB, 0x50, 0xD7, 0x58, 0x97, 0x4C, 0x4F, 0x17, 0x2E, + 0x91, 0xB7, 0x54, 0x29, 0xE2, 0x97, 0x7C, 0xEC, 0x50, 0x94, 0xC4, 0x3B, 0xD7, 0x25, 0xFF, 0x21, + 0x27, 0x49, 0xF9, 0xCD, 0x43, 0xD5, 0x0F, 0x26, 0x96, 0xD3, 0xA5, 0xA5, 0x34, 0xA7, 0x27, 0x8D, + 0x1B, 0x12, 0xA5, 0x40, 0xFB, 0xDC, 0xA2, 0x6A, 0x4C, 0xD5, 0x08, 0xC3, 0xA5, 0xEB, 0x0D, 0xEE, + 0x6A, 0x7A, 0x41, 0xD0, 0x3D, 0x78, 0x5E, 0x54, 0x16, 0xD2, 0x1F, 0x4B, 0xAF, 0xDC, 0xBE, 0x8C, + 0x44, 0xE8, 0xD0, 0xFF, 0x21, 0x14, 0x92, 0x50, 0x24, 0x74, 0xCC, 0x9E, 0x1D, 0x9C, 0x9A, 0x93, + 0x38, 0x30, 0x7B, 0x6C, 0x3B, 0xE4, 0x1F, 0xF3, 0xB1, 0x85, 0x6E, 0x68, 0x89, 0x90, 0xD5, 0xA2, + 0x15, 0x2D, 0x4F, 0xC7, 0x07, 0xC2, 0x7A, 0x12, 0x5E, 0xC9, 0x46, 0xD9, 0xF4, 0x18, 0xAE, 0xB1, + 0xE9, 0x7F, 0x67, 0x05, 0x0C, 0x90, 0x54, 0x48, 0xC5, 0x8D, 0xB5, 0x7D, 0x0B, 0x28, 0x99, 0xDA, + 0x62, 0x1F, 0xDE, 0x01, 0x7A, 0xF6, 0xA1, 0x41, 0x81, 0x90, 0xE1, 0xED, 0xA0, 0xB7, 0x6F, 0x19, + 0x2E, 0x32, 0x6C, 0x64, 0x04, 0x0D, 0x69, 0xF4, 0xB2, 0xD3, 0x61, 0xE8, 0x53, 0x6C, 0x08, 0x6D, + 0x85, 0x5E, 0xE5, 0x8D, 0x75, 0x72, 0x5C, 0x32, 0x4C, 0x9E, 0x61, 0xD2, 0x0E, 0x81, 0xF7, 0x61, + 0x58, 0x06, 0xE9, 0xBF, 0xC6, 0xFD, 0xCF, 0x47, 0xF0, 0x16, 0xA9, 0x85, 0x07, 0xF6, 0x84, 0xEC, + 0x2C, 0xC0, 0x24, 0xA1, 0x0C, 0x56, 0xE4, 0x46, 0x28, 0xE4, 0x3F, 0xB2, 0xE1, 0x72, 0x57, 0x76, + 0xBE, 0xDD, 0x8E, 0x13, 0x1E, 0x45, 0x5D, 0x43, 0x3B, 0x5A, 0xE7, 0xB8, 0x38, 0x59, 0xA0, 0x85, + 0x03, 0xB2, 0xE9, 0xC0, 0xD6, 0x11, 0x51, 0x15, 0x1C, 0x4E, 0x9C, 0x1D, 0x31, 0xCA, 0xAB, 0x74, + 0x1F, 0x66, 0x60, 0x04, 0x2F, 0x61, 0x96, 0xBF, 0xD3, 0xB6, 0xC8, 0xF1, 0xC0, 0xBE, 0x7D, 0x8A, + 0xB2, 0x84, 0x36, 0x44, 0x61, 0x68, 0x46, 0xE3, 0x2D, 0x37, 0xDB, 0x41, 0xB2, 0xC7, 0xB1, 0xDF, + 0xDE, 0x3F, 0x3F, 0xBF, 0x38, 0x38, 0x3E, 0xDB, 0xBD, 0x3C, 0xBC, 0x3E, 0x3E, 0xEB, 0x5D, 0x5D, + 0x5E, 0x5F, 0x7E, 0xEE, 0xC1, 0xAF, 0x1F, 0x77, 0x4F, 0x8E, 0x0F, 0xAE, 0xAF, 0xCE, 0x7E, 0x39, + 0x3B, 0xFF, 0x74, 0xA6, 0xC6, 0x15, 0x44, 0x23, 0x0A, 0x44, 0xC6, 0x10, 0x21, 0x54, 0x81, 0xF4, + 0x02, 0x4D, 0x9D, 0xEF, 0x0E, 0x64, 0x6C, 0xDA, 0x7E, 0x69, 0xB2, 0x42, 0x27, 0x00, 0x51, 0x01, + 0xF7, 0xD8, 0x23, 0x3C, 0x17, 0x08, 0x7F, 0x8B, 0x96, 0x3B, 0x9B, 0x06, 0x13, 0x7F, 0x5D, 0x39, + 0xD9, 0x0C, 0x6D, 0xCA, 0xD2, 0x9F, 0x60, 0x43, 0xEC, 0x96, 0xB9, 0xC9, 0xCC, 0x70, 0x9B, 0xC6, + 0x8B, 0x63, 0x40, 0xEA, 0x54, 0x61, 0xE2, 0x22, 0xC8, 0x74, 0xE8, 0x19, 0xBE, 0xAD, 0x91, 0x3F, + 0x96, 0xEC, 0xB5, 0xBC, 0x00, 0xD2, 0x76, 0x7F, 0x48, 0xE0, 0x1F, 0x12, 0x98, 0x2E, 0x81, 0x09, + 0x79, 0xF9, 0xD3, 0x8E, 0xA4, 0xF8, 0x32, 0xFB, 0xCF, 0x74, 0xA8, 0xCF, 0x42, 0x76, 0x69, 0x90, + 0xE2, 0x0B, 0xE9, 0x7E, 0xA6, 0xB2, 0x17, 0xE9, 0x98, 0x78, 0xB6, 0x43, 0x5F, 0x97, 0x8E, 0x27, + 0x55, 0xB5, 0xD9, 0x92, 0xCA, 0xF6, 0xAA, 0x64, 0x48, 0x83, 0xC0, 0x13, 0x08, 0xC2, 0x82, 0x66, + 0xC1, 0x5D, 0x3A, 0x5C, 0x65, 0x6B, 0xF2, 0x56, 0xB7, 0xC2, 0xD9, 0x08, 0xE5, 0x64, 0x4F, 0xB4, + 0x32, 0x82, 0x11, 0x0D, 0x60, 0xB4, 0x58, 0x38, 0x64, 0xB4, 0xCC, 0x2A, 0x69, 0x16, 0xE3, 0xD4, + 0x31, 0xF2, 0x0A, 0x1B, 0xAF, 0x8C, 0x7C, 0x86, 0x50, 0x54, 0x8D, 0xB0, 0x4E, 0x4B, 0x47, 0x44, + 0x9C, 0xF8, 0x45, 0xD1, 0x6C, 0x99, 0xC0, 0x48, 0xA5, 0x2C, 0x68, 0xC9, 0xE8, 0x02, 0x96, 0x65, + 0xD7, 0xA7, 0x5D, 0x0D, 0xF9, 0xCB, 0xBB, 0x9F, 0xDC, 0xFD, 0x25, 0xF2, 0xF2, 0xC4, 0xDB, 0xBF, + 0x8A, 0xDB, 0xBE, 0x82, 0x3B, 0x3B, 0x0E, 0x00, 0x76, 0x16, 0x3F, 0x69, 0x2B, 0xC7, 0x1E, 0x13, + 0x88, 0xB7, 0x47, 0x3B, 0xA9, 0x49, 0x8F, 0xE6, 0x74, 0x4E, 0xF8, 0x51, 0x1A, 0x35, 0xCB, 0x75, + 0x94, 0x81, 0x5E, 0x8C, 0x72, 0x28, 0x8E, 0xBE, 0x92, 0x56, 0x4C, 0x13, 0x1D, 0x7E, 0x59, 0x37, + 0x67, 0xD9, 0x89, 0xDF, 0x73, 0x90, 0x45, 0x28, 0x76, 0xDE, 0x04, 0x49, 0x9A, 0x97, 0xE0, 0x64, + 0x8C, 0x47, 0x22, 0x60, 0x60, 0x4E, 0xA3, 0x21, 0x25, 0x0A, 0xE0, 0x7E, 0xBC, 0xB3, 0x36, 0x35, + 0x4A, 0x09, 0x81, 0x7A, 0x82, 0x7C, 0x86, 0x95, 0x35, 0x4D, 0x86, 0x62, 0x07, 0x04, 0x29, 0x8B, + 0x62, 0x39, 0xE1, 0x81, 0x45, 0xD8, 0x62, 0x0F, 0x91, 0x30, 0x51, 0xE1, 0xEF, 0x8F, 0xB4, 0xEB, + 0x82, 0x37, 0x5E, 0xC3, 0x12, 0x9E, 0x02, 0xFB, 0x13, 0x3C, 0xD8, 0xF6, 0x4A, 0x78, 0xFF, 0x98, + 0x15, 0x7F, 0x35, 0xBE, 0x71, 0xC5, 0x44, 0xBF, 0xD9, 0xFE, 0x99, 0x79, 0xD6, 0x60, 0xF7, 0x1E, + 0x61, 0x79, 0xB3, 0xC9, 0xCA, 0xC2, 0xEA, 0x6F, 0x91, 0x21, 0x7F, 0x78, 0x07, 0xB9, 0xDC, 0x9A, + 0x3A, 0xE0, 0x9D, 0x1C, 0xE0, 0x1D, 0x19, 0x78, 0x47, 0x05, 0xDE, 0xC9, 0x02, 0xDE, 0xCD, 0x01, + 0xDE, 0x95, 0x81, 0x77, 0x55, 0xE0, 0xDD, 0x2C, 0xE0, 0xAB, 0x39, 0xC0, 0x57, 0x65, 0xE0, 0xAB, + 0x2A, 0xF0, 0xD5, 0x08, 0xF8, 0xCB, 0x3B, 0xBB, 0x97, 0x16, 0x59, 0x21, 0x91, 0x0B, 0xC8, 0xEC, + 0x8D, 0x69, 0xC1, 0xEF, 0x10, 0x9A, 0x9E, 0x23, 0xC0, 0xA1, 0xCB, 0x81, 0x3E, 0xE1, 0x0A, 0x97, + 0xE8, 0x76, 0xE0, 0x9E, 0xB8, 0x0F, 0xD4, 0xB5, 0x1F, 0x2E, 0xAD, 0x81, 0xED, 0x62, 0x90, 0x51, + 0xB6, 0xE3, 0x23, 0xD0, 0xC3, 0xA3, 0xA2, 0xF4, 0x94, 0x54, 0xEF, 0xBC, 0xEC, 0x8A, 0x68, 0x5B, + 0x04, 0x8D, 0x6D, 0x75, 0x0B, 0xF4, 0x98, 0x9D, 0xC8, 0x3A, 0x1A, 0x9F, 0x0A, 0x6E, 0xBC, 0x23, + 0x60, 0x92, 0x85, 0x09, 0x39, 0xE9, 0x54, 0x17, 0x14, 0x82, 0xE0, 0xC5, 0x5A, 0x88, 0x3A, 0xFA, + 0xFB, 0x04, 0xE0, 0x89, 0xD6, 0x6E, 0x27, 0x3A, 0xD4, 0xC1, 0x68, 0xB3, 0x73, 0xAE, 0x9C, 0x4E, + 0x53, 0x78, 0xD7, 0x22, 0xD4, 0x90, 0x59, 0xC3, 0x4B, 0x9F, 0x8A, 0xB8, 0x74, 0x8F, 0x4C, 0xB8, + 0xA7, 0x7E, 0x3A, 0xC0, 0xB7, 0xE6, 0x74, 0x14, 0xF8, 0xF2, 0x06, 0x58, 0x2E, 0x4B, 0x3E, 0x28, + 0x51, 0x0B, 0x8B, 0xD0, 0xEE, 0x84, 0xE8, 0x5E, 0x6C, 0x49, 0x17, 0xE7, 0x34, 0x7B, 0x04, 0x7B, + 0xA7, 0x9E, 0x61, 0x83, 0xCB, 0x0F, 0x6D, 0x82, 0x5E, 0x05, 0x13, 0x7D, 0x65, 0xBD, 0xD5, 0x69, + 0xD5, 0xF4, 0x24, 0x6B, 0x6E, 0x0A, 0x13, 0xE4, 0x17, 0x4A, 0x74, 0x2C, 0xBC, 0xDE, 0x94, 0x92, + 0xC8, 0x22, 0x27, 0x49, 0xF1, 0x0E, 0x7A, 0x94, 0xBC, 0x66, 0x72, 0x32, 0xB3, 0x8B, 0x7D, 0xF9, + 0x07, 0xF6, 0xDC, 0x30, 0x23, 0x86, 0x90, 0xD3, 0xB1, 0x44, 0xBA, 0x1F, 0xD4, 0x00, 0xC7, 0x5E, + 0x4D, 0x96, 0x9A, 0xE6, 0x6F, 0x35, 0x11, 0xD0, 0x50, 0xCE, 0xF8, 0x11, 0x49, 0xB4, 0xA1, 0xCB, + 0x01, 0xA4, 0x4F, 0x4A, 0xC3, 0x86, 0xE1, 0x37, 0x99, 0xE2, 0x26, 0xB5, 0xF7, 0x6D, 0xA3, 0x18, + 0x03, 0xE2, 0x64, 0x35, 0x73, 0xE3, 0xC2, 0x4F, 0xCA, 0x7F, 0x53, 0x84, 0x15, 0xEA, 0x64, 0x02, + 0xD1, 0x9F, 0x69, 0x42, 0xD1, 0xB9, 0xA3, 0x9B, 0x54, 0xF3, 0x9C, 0x50, 0xCF, 0x9F, 0x5E, 0x67, + 0xB6, 0x49, 0x15, 0xA5, 0x04, 0xFA, 0x1D, 0x24, 0x1A, 0x2A, 0x2B, 0x55, 0x7C, 0xB9, 0x61, 0x99, + 0x84, 0x88, 0xD0, 0x24, 0x16, 0x19, 0x59, 0x87, 0x6F, 0xCF, 0xFB, 0xAA, 0x9E, 0xDF, 0x79, 0x6B, + 0x5F, 0x89, 0x66, 0xB9, 0xE5, 0xC2, 0x1E, 0x74, 0xB6, 0x8B, 0x35, 0xEA, 0x57, 0x6A, 0x74, 0x59, + 0xA5, 0xD1, 0x47, 0xA1, 0xD1, 0x5A, 0xB1, 0x46, 0x17, 0xA7, 0xFB, 0x49, 0x4C, 0x8A, 0xFD, 0xBA, + 0xD0, 0xD5, 0x76, 0x74, 0x35, 0xAC, 0x79, 0xCF, 0x56, 0x66, 0x9C, 0xD1, 0x5E, 0xDF, 0x2E, 0xD6, + 0xAC, 0x5F, 0xB1, 0xD9, 0x65, 0xB5, 0x66, 0x22, 0xFB, 0x3A, 0x6D, 0xA3, 0x58, 0x33, 0x99, 0x81, + 0x11, 0xB6, 0x1F, 0x62, 0x4E, 0x76, 0x2E, 0xD4, 0x3C, 0x22, 0xE3, 0x0F, 0x91, 0x7E, 0x66, 0x91, + 0xCE, 0x6B, 0x75, 0xF1, 0xEB, 0xE9, 0xF5, 0xC5, 0xEE, 0xA7, 0x5F, 0x4B, 0xD1, 0x07, 0x8D, 0xFA, + 0x47, 0x17, 0x7B, 0xBF, 0xFE, 0x31, 0x7D, 0xE6, 0x3C, 0x7D, 0xB2, 0xDB, 0xA9, 0xEF, 0x5E, 0x77, + 0xB6, 0x4A, 0xA1, 0x55, 0x9B, 0x77, 0x8D, 0x99, 0x9A, 0xAF, 0x75, 0x67, 0x6B, 0xBE, 0xA1, 0x6B, + 0xAE, 0x5D, 0x11, 0xA1, 0x81, 0x56, 0x73, 0xC8, 0x7B, 0xB0, 0x67, 0xD0, 0x1E, 0x74, 0x13, 0x41, + 0xA7, 0x00, 0x21, 0xE9, 0xBA, 0x63, 0x18, 0xEB, 0x45, 0x27, 0x8E, 0xDA, 0xF2, 0xF5, 0x5A, 0xE5, + 0x96, 0xAF, 0x6B, 0x89, 0x5D, 0x55, 0xB1, 0x96, 0x9B, 0x95, 0x71, 0x6E, 0x2A, 0x38, 0x4B, 0x34, + 0xDD, 0xAA, 0x8C, 0x74, 0xAB, 0x6A, 0x47, 0x3B, 0xDD, 0xAA, 0x38, 0x3B, 0xDD, 0xAA, 0x38, 0xBB, + 0xAB, 0xD2, 0x6C, 0x2A, 0xC3, 0xA3, 0x35, 0xE3, 0x75, 0xF7, 0xDA, 0xA8, 0x86, 0x97, 0xB6, 0xED, + 0xD4, 0x52, 0xB6, 0xD9, 0x73, 0xD0, 0xC3, 0xD1, 0xD6, 0x99, 0xCD, 0x5A, 0x59, 0xE0, 0x0B, 0x4D, + 0x7A, 0xA1, 0xF5, 0xEA, 0xAA, 0xC4, 0xA3, 0xB2, 0xCD, 0xE5, 0x39, 0x53, 0xB6, 0xF5, 0xE6, 0x4C, + 0xAD, 0xB7, 0x66, 0x69, 0xAD, 0x08, 0x64, 0xAE, 0xB2, 0x3B, 0x71, 0x1F, 0xF6, 0x4C, 0xC7, 0x7A, + 0xB0, 0xAD, 0xE0, 0xEE, 0x25, 0x2B, 0x3C, 0xA3, 0xB2, 0xC6, 0xEB, 0xFE, 0x04, 0x8D, 0xD7, 0xFD, + 0x19, 0x1A, 0xAF, 0xFB, 0x13, 0x34, 0x5E, 0xF7, 0x0F, 0x8D, 0xB7, 0x20, 0x8D, 0xD7, 0xFD, 0x99, + 0x1A, 0xAF, 0x3B, 0x93, 0xC6, 0xEB, 0xCE, 0xA4, 0xF1, 0xBA, 0x33, 0x69, 0xBC, 0xAE, 0x5E, 0xE3, + 0x4D, 0x7D, 0x9A, 0x06, 0x36, 0x76, 0xFB, 0xF1, 0x93, 0xFE, 0x30, 0x2C, 0xD7, 0x66, 0x0C, 0x0A, + 0xC3, 0xDF, 0xDB, 0xC9, 0x3A, 0x9F, 0x95, 0x3A, 0x9F, 0x35, 0x75, 0xBE, 0x28, 0x75, 0xBE, 0x48, + 0xAF, 0x87, 0x11, 0x6A, 0xC2, 0xC7, 0x0C, 0x33, 0x29, 0x4A, 0x7A, 0xE8, 0x0C, 0xC3, 0x17, 0x5B, + 0xCD, 0x20, 0xDF, 0x03, 0x27, 0xAA, 0xEC, 0x3A, 0x4A, 0xE5, 0x0F, 0xBB, 0x87, 0xBB, 0xBD, 0x7D, + 0x4D, 0xD5, 0xDD, 0x51, 0xC0, 0x27, 0x97, 0x1C, 0xC9, 0x38, 0x36, 0xBD, 0xEF, 0x52, 0x18, 0x63, + 0x27, 0x27, 0x56, 0x31, 0xA7, 0x79, 0x57, 0xD7, 0x9C, 0xB9, 0xB2, 0x73, 0xFC, 0xA6, 0xF5, 0xF7, + 0xA9, 0x1F, 0x10, 0x42, 0xD5, 0xEB, 0x05, 0x6A, 0xE8, 0x3C, 0xC3, 0x0F, 0xE4, 0x9C, 0x1F, 0x71, + 0x2C, 0x11, 0xF6, 0x17, 0xD7, 0xD1, 0x5C, 0xB6, 0xE0, 0x47, 0x3B, 0x50, 0x42, 0x89, 0xE8, 0x1B, + 0xB1, 0xB5, 0xB1, 0x69, 0x3B, 0x3D, 0x1A, 0x3B, 0xB9, 0x1D, 0x3D, 0x0A, 0xC7, 0x5F, 0x1E, 0x3F, + 0x76, 0x7A, 0x9E, 0x0B, 0x91, 0x2F, 0x51, 0xA4, 0xA0, 0x8A, 0x13, 0xA0, 0xEE, 0x3A, 0x96, 0x78, + 0xC3, 0x03, 0xD5, 0xD8, 0x5A, 0xAB, 0x7B, 0x8C, 0x31, 0x26, 0x43, 0xFB, 0x1C, 0x23, 0x6D, 0x08, + 0xAF, 0xDC, 0x8E, 0x70, 0x10, 0x47, 0xFB, 0xD2, 0x7B, 0xAF, 0x10, 0x82, 0x08, 0x9B, 0xA3, 0xD3, + 0x77, 0x84, 0x7D, 0x4D, 0x76, 0x44, 0xE9, 0x64, 0x88, 0xAD, 0x16, 0xFA, 0xA2, 0xED, 0x9B, 0x23, + 0xC8, 0xAB, 0xF2, 0x70, 0x87, 0x99, 0x3B, 0xDA, 0x61, 0xBF, 0xB7, 0xDA, 0x45, 0x77, 0xF4, 0x05, + 0x75, 0x42, 0xB8, 0x37, 0x26, 0x85, 0xF4, 0x61, 0xF5, 0x49, 0x00, 0xAF, 0xDD, 0x52, 0x97, 0x05, + 0x38, 0x78, 0xC5, 0xCC, 0x41, 0xB7, 0x9E, 0x3B, 0x46, 0xBB, 0x3D, 0xD6, 0x60, 0x88, 0x26, 0x84, + 0x2A, 0xF1, 0xB1, 0x33, 0x0A, 0x05, 0xE2, 0x90, 0x2E, 0x18, 0x18, 0xC1, 0xBE, 0x7D, 0x40, 0x28, + 0xF1, 0xC6, 0xB6, 0x83, 0x09, 0x7E, 0x7B, 0x70, 0x87, 0xC4, 0xA7, 0x73, 0x99, 0xF7, 0x9B, 0xEB, + 0xD9, 0x43, 0x32, 0x77, 0x46, 0xEC, 0x69, 0xDD, 0x70, 0x87, 0xA2, 0xBE, 0x80, 0xF9, 0xA7, 0x1D, + 0xE4, 0x4C, 0x47, 0xA3, 0xA6, 0x7A, 0x63, 0xA9, 0x3E, 0x8A, 0x29, 0x33, 0x32, 0x33, 0xE0, 0x89, + 0x7D, 0x7B, 0x83, 0x76, 0x47, 0x23, 0xD4, 0x27, 0xDF, 0xAD, 0xEC, 0xA4, 0x21, 0xE2, 0xF3, 0x9E, + 0x57, 0xCC, 0x87, 0x16, 0x91, 0xFF, 0x13, 0x3E, 0x11, 0xA6, 0x25, 0x79, 0xA0, 0x8F, 0x70, 0x80, + 0x4A, 0x0F, 0xA6, 0x87, 0xAF, 0x26, 0x23, 0xD7, 0xB4, 0x3E, 0x99, 0x76, 0x20, 0xB9, 0xCE, 0xD3, + 0x97, 0x96, 0x58, 0x3A, 0x39, 0x7F, 0x7A, 0x33, 0xB6, 0x83, 0x23, 0x5E, 0x1F, 0xA2, 0xED, 0xC8, + 0x64, 0xA3, 0x6F, 0xE4, 0x7E, 0x35, 0xBE, 0xC5, 0x0E, 0x26, 0xB0, 0x66, 0x71, 0x27, 0x13, 0x78, + 0x4D, 0x1A, 0xFC, 0x16, 0xC5, 0x80, 0xB0, 0xB0, 0xB8, 0x6D, 0x4E, 0x26, 0x6C, 0x52, 0x25, 0xC1, + 0xB6, 0x28, 0xDA, 0x66, 0x0C, 0xD3, 0xFC, 0xBB, 0xF9, 0xC8, 0xE1, 0xFD, 0x7A, 0x7A, 0xF2, 0x21, + 0x80, 0xAC, 0x07, 0xFF, 0x31, 0xC5, 0xF1, 0xF3, 0xD2, 0x50, 0xA1, 0xED, 0x12, 0x80, 0x8D, 0x5A, + 0xEF, 0xBC, 0x7F, 0x09, 0xF1, 0x7F, 0x2B, 0x53, 0xDA, 0xA3, 0x9A, 0x58, 0x83, 0x4E, 0xA9, 0x90, + 0x82, 0x70, 0xC6, 0x31, 0xF5, 0x25, 0x72, 0x41, 0x73, 0x6F, 0x0B, 0x8F, 0x3F, 0xB2, 0x42, 0x1B, + 0xBC, 0x0D, 0x27, 0x52, 0xB4, 0xB3, 0xF2, 0xBE, 0xB3, 0x0C, 0xAC, 0x1F, 0x98, 0xC1, 0xD4, 0x07, + 0xDF, 0x2C, 0x59, 0x11, 0x67, 0x23, 0x24, 0xD5, 0xB3, 0x80, 0x26, 0x26, 0x30, 0x9B, 0x6E, 0xFA, + 0x4A, 0xB5, 0xD4, 0x49, 0x2C, 0x21, 0x70, 0xBD, 0x21, 0x0E, 0x7A, 0xA6, 0xED, 0x61, 0x8B, 0x2A, + 0x55, 0x79, 0xE5, 0xB8, 0x09, 0x9C, 0x23, 0x5A, 0x83, 0x95, 0x69, 0x58, 0x04, 0x52, 0x4B, 0x5F, + 0x41, 0xF3, 0x29, 0x2C, 0x37, 0x08, 0xB0, 0xD3, 0x16, 0xA2, 0x27, 0x26, 0x18, 0x7B, 0xA7, 0xBB, + 0xFB, 0xBE, 0xDA, 0xEE, 0x8C, 0xBD, 0x90, 0xAD, 0xBD, 0xE5, 0xA6, 0x18, 0xD9, 0x43, 0xEC, 0x3D, + 0xD2, 0xDC, 0xD7, 0xA8, 0x5D, 0x42, 0x18, 0x55, 0x8E, 0x6A, 0x02, 0x83, 0x61, 0xA8, 0x9A, 0x78, + 0x81, 0x86, 0x62, 0xDA, 0x8E, 0xDE, 0x6E, 0xF1, 0x48, 0xF3, 0xB4, 0xDB, 0x76, 0x11, 0x4E, 0x4C, + 0x42, 0x74, 0x95, 0x63, 0x5A, 0x16, 0x7D, 0x2E, 0x1D, 0x5C, 0x1E, 0xB0, 0x03, 0x0F, 0x17, 0x1D, + 0x9C, 0x9F, 0x12, 0x1D, 0x1C, 0xC0, 0x37, 0x32, 0x10, 0x18, 0x32, 0x73, 0x34, 0x30, 0x54, 0x69, + 0xA2, 0x9D, 0x77, 0x84, 0xC0, 0x48, 0xB2, 0x39, 0xC3, 0x0A, 0xDC, 0x0B, 0x25, 0x23, 0xE2, 0xA5, + 0xAB, 0x20, 0xEA, 0xF5, 0x0F, 0x9B, 0x49, 0xEA, 0x5F, 0x48, 0x7E, 0x61, 0x90, 0xA3, 0x7B, 0x20, + 0x1B, 0x1C, 0x05, 0xCD, 0x47, 0xF2, 0x8B, 0x7C, 0x21, 0xC4, 0xAA, 0x7D, 0xB5, 0xBF, 0xB5, 0x5D, + 0x67, 0x30, 0xB2, 0x07, 0x10, 0x90, 0x14, 0xF1, 0xB6, 0x91, 0x48, 0x67, 0x2F, 0xE7, 0x8A, 0x48, + 0x49, 0x1B, 0x3D, 0xD4, 0xBE, 0x83, 0xD6, 0xD4, 0xF0, 0x89, 0xC1, 0x83, 0x09, 0xAF, 0x45, 0xA9, + 0x01, 0xD4, 0xC7, 0x03, 0xF9, 0x24, 0x8A, 0x56, 0x52, 0xF1, 0x09, 0x8E, 0x1D, 0x3F, 0xC4, 0xD9, + 0xAE, 0x05, 0x39, 0x0F, 0xE2, 0x62, 0xAC, 0x59, 0xB4, 0x09, 0x5D, 0xD0, 0x10, 0xA7, 0x79, 0x8F, + 0xA3, 0x34, 0x69, 0xD5, 0xDE, 0xF6, 0x88, 0xF5, 0x88, 0xCF, 0xEB, 0xEB, 0xD3, 0x92, 0x33, 0x3D, + 0x42, 0x77, 0x7C, 0xA9, 0xF9, 0xC3, 0x75, 0x3D, 0x3A, 0x82, 0x16, 0xF3, 0xE8, 0x4E, 0x08, 0xA8, + 0x50, 0x5F, 0x52, 0xE8, 0x8C, 0x3B, 0x92, 0xDE, 0x59, 0x4D, 0x5F, 0xB2, 0x1F, 0x83, 0xA8, 0xDC, + 0xB3, 0x99, 0xDE, 0x98, 0x60, 0xFD, 0x84, 0xF3, 0x40, 0x56, 0x37, 0x87, 0xD1, 0xD1, 0xA0, 0x7A, + 0x37, 0xDF, 0xD3, 0x28, 0xD5, 0x79, 0xF7, 0xF2, 0xBD, 0x1A, 0xFB, 0xAA, 0xEB, 0x24, 0xEB, 0x44, + 0x7A, 0x27, 0x19, 0x13, 0x92, 0x9D, 0x94, 0x2A, 0xA5, 0x59, 0x9A, 0x98, 0x31, 0x69, 0xEC, 0xFA, + 0xA6, 0x3D, 0x28, 0x6B, 0x72, 0x92, 0x72, 0xCB, 0x6A, 0xB3, 0xF3, 0xC7, 0x2A, 0x61, 0xA3, 0xD3, + 0x5E, 0x93, 0xC9, 0xFE, 0x21, 0xC7, 0xB4, 0x96, 0x3A, 0xFC, 0x97, 0xC1, 0xDC, 0x31, 0xA4, 0x03, + 0x70, 0x0A, 0xEA, 0x6A, 0xB0, 0x8D, 0x74, 0xC8, 0x1A, 0xD1, 0xD2, 0xBD, 0x25, 0x50, 0x59, 0xA2, + 0x4A, 0x3E, 0x4C, 0x10, 0x0B, 0x8A, 0xC6, 0xA9, 0xBC, 0xE0, 0x73, 0x1A, 0x4C, 0x10, 0x0B, 0xB4, + 0x4F, 0xEB, 0x75, 0x94, 0xE1, 0x74, 0x1E, 0xBD, 0x2E, 0xF2, 0x52, 0xA6, 0xD2, 0x6B, 0xEE, 0x51, + 0x5B, 0xB9, 0xD7, 0xD9, 0xED, 0x35, 0xBD, 0x56, 0x3C, 0x26, 0x67, 0xEF, 0x79, 0x12, 0x60, 0x4E, + 0xEF, 0x35, 0xBE, 0x99, 0xA4, 0x91, 0x65, 0xFB, 0x2C, 0xC1, 0x27, 0x0F, 0x77, 0x2F, 0xC8, 0x8A, + 0x5C, 0x60, 0x71, 0x1A, 0xE9, 0x14, 0xB6, 0xC0, 0xE9, 0x03, 0xF2, 0xCE, 0x40, 0x66, 0x25, 0x07, + 0x8F, 0x66, 0x61, 0x48, 0x12, 0x54, 0x14, 0x36, 0x64, 0xE8, 0x65, 0x20, 0x6C, 0xB1, 0x67, 0x4E, + 0xAD, 0x03, 0xCF, 0x9D, 0xC0, 0x0B, 0xDA, 0xFA, 0x15, 0x43, 0xCA, 0x99, 0x96, 0x2B, 0x2F, 0x05, + 0x28, 0xEA, 0xE8, 0x95, 0x7A, 0x11, 0x8A, 0xF8, 0x1A, 0x57, 0x8A, 0xA2, 0xAA, 0xB8, 0x4A, 0xF4, + 0x5E, 0x23, 0xED, 0xE9, 0x69, 0xDB, 0x67, 0x94, 0xFA, 0xDC, 0x7C, 0xF0, 0xFA, 0xF1, 0x9E, 0x10, + 0x35, 0x45, 0x0F, 0x39, 0x7E, 0x25, 0x86, 0xE5, 0x37, 0xD7, 0xF0, 0x40, 0x4D, 0x13, 0x38, 0x63, + 0xCF, 0x4B, 0x64, 0x1D, 0xCC, 0x94, 0x95, 0x03, 0x1C, 0x98, 0xF6, 0xC8, 0x2F, 0xC9, 0x81, 0x32, + 0x80, 0x74, 0xBC, 0xA0, 0xA7, 0xD7, 0x39, 0x30, 0x21, 0x84, 0x53, 0xA8, 0xF7, 0xF4, 0x58, 0x57, + 0xAD, 0xBF, 0xD9, 0x4D, 0x75, 0xFA, 0x5D, 0xB0, 0x0B, 0xCC, 0x41, 0xB9, 0xCB, 0xD0, 0x52, 0x64, + 0x5B, 0x63, 0x92, 0x98, 0x4D, 0xA3, 0x67, 0x02, 0xCB, 0xD5, 0xE8, 0x6A, 0x5E, 0xE7, 0x19, 0x79, + 0x90, 0x48, 0x55, 0x9C, 0x22, 0xE2, 0x62, 0xE5, 0x8A, 0xC2, 0x5D, 0x08, 0x84, 0xA6, 0xAF, 0x52, + 0x42, 0xE5, 0x19, 0xBB, 0x5B, 0x34, 0x39, 0xB3, 0xDA, 0xF3, 0xB8, 0xDD, 0x2C, 0x9D, 0x2F, 0x00, + 0x25, 0x79, 0x36, 0x8A, 0x5E, 0x18, 0xAB, 0xD0, 0x79, 0xE9, 0x0E, 0x22, 0x01, 0x5E, 0x7E, 0x51, + 0x6C, 0x51, 0xE0, 0x13, 0x9B, 0xF9, 0x39, 0xA3, 0x91, 0xEF, 0x83, 0xE6, 0x08, 0x3C, 0xF2, 0x7B, + 0x7E, 0x62, 0x7E, 0xCF, 0x4F, 0xE8, 0x2D, 0x72, 0xA6, 0xE3, 0xFD, 0x44, 0x3A, 0x55, 0x52, 0x94, + 0x74, 0x7D, 0xBE, 0x99, 0x06, 0x81, 0xEB, 0x70, 0xCF, 0x67, 0x9A, 0x24, 0x0F, 0x02, 0x4E, 0xF6, + 0xE8, 0x57, 0xC8, 0x88, 0xF6, 0x24, 0xDD, 0x11, 0xC6, 0xB5, 0xB5, 0x5D, 0x00, 0x6B, 0x59, 0x6A, + 0x0F, 0xC2, 0x60, 0x98, 0x18, 0xFE, 0x3E, 0xD4, 0x6F, 0x3C, 0x89, 0xC2, 0x25, 0x24, 0x36, 0x6B, + 0xBE, 0x52, 0x23, 0xEC, 0x53, 0xA2, 0x62, 0x32, 0xE2, 0x75, 0x52, 0xF8, 0xA0, 0xB8, 0x80, 0x57, + 0xE7, 0x60, 0x1C, 0x08, 0x9C, 0x1E, 0xE4, 0xF3, 0x44, 0x43, 0x20, 0x1F, 0x75, 0xE7, 0xD4, 0x22, + 0x03, 0xF0, 0xB8, 0xAD, 0x3B, 0x82, 0x8A, 0x03, 0x01, 0x29, 0x09, 0xB8, 0x6D, 0x95, 0xA6, 0x03, + 0x50, 0x48, 0x81, 0x4A, 0x40, 0x45, 0xCE, 0x89, 0x54, 0x8E, 0x16, 0xD3, 0x8C, 0x13, 0x7C, 0x63, + 0x7F, 0xC7, 0x57, 0x47, 0xE8, 0xD8, 0x19, 0x78, 0xD4, 0xF0, 0x3F, 0xE1, 0x61, 0x54, 0x68, 0x19, + 0xF9, 0x0F, 0xE6, 0x84, 0xBD, 0x0F, 0x40, 0x6D, 0xB6, 0x44, 0x73, 0xC5, 0x34, 0x21, 0x9F, 0xD2, + 0xC4, 0x82, 0x27, 0xA0, 0x8E, 0x03, 0xF9, 0x14, 0xEE, 0xC8, 0xCC, 0xC6, 0x7E, 0x9C, 0xB7, 0x3D, + 0x46, 0x45, 0x5F, 0xDC, 0x51, 0xBD, 0xF5, 0xCD, 0xEF, 0xF8, 0x14, 0x7F, 0x80, 0x36, 0xDE, 0xB6, + 0xA6, 0x84, 0x46, 0x41, 0x6E, 0x27, 0x47, 0xB7, 0xB4, 0x5C, 0x14, 0x19, 0xDD, 0x47, 0x3A, 0xBA, + 0x49, 0xDE, 0x88, 0x3F, 0x22, 0xC1, 0x71, 0xC0, 0x97, 0xDE, 0xEA, 0x50, 0x0C, 0x9F, 0xC8, 0xA1, + 0x65, 0x72, 0x8A, 0x48, 0xC7, 0x4A, 0x99, 0x91, 0x85, 0xF4, 0xC7, 0x1C, 0x19, 0x45, 0xED, 0x32, + 0x62, 0x6F, 0x75, 0x74, 0xE5, 0xF4, 0x6E, 0x19, 0xDC, 0xFB, 0x44, 0xD1, 0xCA, 0x61, 0x96, 0x80, + 0x93, 0xF6, 0x55, 0x87, 0x92, 0x40, 0x3B, 0x73, 0x03, 0xFC, 0x06, 0xD5, 0x72, 0x90, 0x2F, 0x11, + 0xE4, 0x35, 0xE4, 0x3A, 0xA3, 0x27, 0x04, 0x0F, 0xBB, 0xF8, 0x21, 0xB1, 0xE4, 0x6F, 0xFB, 0x56, + 0x07, 0x36, 0x03, 0x1E, 0xCD, 0xCB, 0x45, 0x96, 0x92, 0x16, 0x7D, 0x3D, 0xC3, 0xA7, 0x71, 0xB6, + 0x6D, 0x74, 0x05, 0x73, 0xC5, 0xF4, 0x7C, 0x7C, 0x4C, 0x66, 0x2B, 0x99, 0x2B, 0x18, 0x23, 0xF3, + 0xC6, 0xBD, 0xC7, 0x65, 0xD9, 0xB4, 0x14, 0xB2, 0xE9, 0x00, 0x67, 0xB2, 0xE9, 0x87, 0x14, 0xA2, + 0x83, 0x8E, 0x6F, 0x91, 0x39, 0x22, 0xF5, 0xAD, 0x27, 0x3A, 0xFB, 0xF8, 0xC4, 0x8B, 0x66, 0x6F, + 0x8B, 0x72, 0x12, 0xD9, 0x01, 0x1A, 0x11, 0x5E, 0xF2, 0x19, 0xA9, 0xEC, 0x16, 0xE8, 0xBD, 0xCA, + 0xEE, 0xF8, 0x03, 0x6B, 0xFA, 0xBC, 0xF3, 0x0C, 0x74, 0x01, 0x74, 0xC3, 0x40, 0xB6, 0x8F, 0x3E, + 0x08, 0x5A, 0x43, 0x02, 0x15, 0x11, 0x97, 0x94, 0x7B, 0xF8, 0xB9, 0x21, 0xFD, 0xFF, 0xFE, 0x3C, + 0xD3, 0x01, 0xF2, 0xFF, 0x44, 0xD4, 0x2C, 0x78, 0x32, 0xA4, 0xD8, 0x2B, 0x73, 0xE3, 0x4F, 0xB5, + 0x7D, 0x02, 0xAD, 0x42, 0x11, 0x9F, 0xC4, 0x72, 0x90, 0x2E, 0x5C, 0x65, 0x23, 0x57, 0x61, 0xEB, + 0xB0, 0x7F, 0x78, 0x14, 0x2D, 0xDD, 0x62, 0x16, 0xD9, 0xC8, 0x33, 0xCF, 0x21, 0x8B, 0x0E, 0x5C, + 0xF1, 0x41, 0xCD, 0xC8, 0xB2, 0xEA, 0xE1, 0x31, 0x99, 0x2C, 0x7B, 0xA6, 0xB5, 0x0F, 0x09, 0xFC, + 0x1B, 0xC9, 0x3A, 0xE1, 0xAE, 0x48, 0xFB, 0x36, 0x80, 0x50, 0x7B, 0x86, 0x57, 0x40, 0x75, 0xAF, + 0x42, 0x2D, 0xFC, 0xF9, 0xE6, 0x67, 0x7D, 0xB6, 0xF9, 0xD9, 0x9E, 0x6B, 0x4E, 0xC9, 0x23, 0x2C, + 0x2D, 0xF9, 0x61, 0xFA, 0x43, 0x18, 0x39, 0x64, 0x0E, 0x4D, 0xDB, 0xF1, 0x79, 0x4E, 0x26, 0x5B, + 0x10, 0x4C, 0x96, 0xE3, 0xCD, 0xC2, 0x8F, 0xB2, 0xEB, 0x21, 0x9D, 0xC4, 0xDB, 0xBC, 0xE4, 0x2D, + 0xF8, 0xD0, 0xB8, 0x9E, 0xE5, 0x53, 0x71, 0x09, 0xEF, 0x81, 0x97, 0x96, 0x68, 0xA9, 0x3A, 0x3B, + 0x01, 0x20, 0x51, 0xD4, 0x81, 0x4F, 0xA5, 0x2E, 0x6A, 0xF6, 0x95, 0x56, 0xFE, 0x16, 0x26, 0x0A, + 0x41, 0x6A, 0x92, 0x95, 0x28, 0x55, 0x83, 0x28, 0x6B, 0x82, 0xC5, 0x8F, 0x82, 0x84, 0x6C, 0x20, + 0x9A, 0xA9, 0x9A, 0x44, 0x03, 0xD3, 0x33, 0x39, 0x0D, 0x96, 0x50, 0x9D, 0xE6, 0x1D, 0x88, 0xA5, + 0x2D, 0xAD, 0xE0, 0x73, 0x5A, 0xC1, 0x17, 0xF5, 0xA9, 0xC3, 0x92, 0xCA, 0x91, 0xA5, 0x3A, 0xA3, + 0xEC, 0xDE, 0xD1, 0x70, 0x55, 0x7E, 0x24, 0x51, 0x2C, 0x9F, 0x4C, 0xFD, 0xBB, 0xC6, 0x42, 0xFB, + 0xD4, 0xD4, 0xC4, 0xD3, 0x03, 0x22, 0x38, 0xA7, 0xA8, 0x8A, 0xC8, 0xC2, 0xE0, 0x0E, 0x12, 0xE9, + 0xA2, 0xC8, 0x09, 0x81, 0x00, 0xE2, 0x3E, 0x3E, 0xE0, 0xAC, 0x42, 0x6A, 0x0A, 0xEE, 0x83, 0xE2, + 0x88, 0xC6, 0xEE, 0xDA, 0xD0, 0xE2, 0x1D, 0x4D, 0x74, 0x22, 0xAF, 0x94, 0x3A, 0x11, 0x22, 0x75, + 0xF5, 0x02, 0x04, 0x0D, 0x80, 0x37, 0xFC, 0x34, 0x10, 0xCA, 0x8A, 0x70, 0x67, 0xC7, 0x96, 0x49, + 0xEA, 0xC8, 0xD4, 0xA8, 0x1D, 0x50, 0xEA, 0xC9, 0x52, 0x3D, 0xA0, 0x34, 0xD2, 0x0C, 0xD6, 0x51, + 0xF3, 0x25, 0x54, 0xFB, 0xD7, 0x5A, 0x33, 0xCD, 0x68, 0x20, 0x0E, 0x09, 0x50, 0x32, 0xC0, 0xD0, + 0x03, 0xA2, 0x13, 0x35, 0x1E, 0x0C, 0xF9, 0x6C, 0x04, 0xDF, 0x1A, 0x49, 0xA1, 0xFF, 0x44, 0x1E, + 0xA6, 0xBA, 0x99, 0x32, 0x6E, 0x76, 0xBE, 0xA5, 0x54, 0xFD, 0x9C, 0xA8, 0xDA, 0x4D, 0xAB, 0xFA, + 0x25, 0x51, 0x75, 0x55, 0xA9, 0xAA, 0x9F, 0xFD, 0xC2, 0x80, 0xEA, 0x52, 0xF0, 0x8A, 0x54, 0xE7, + 0xD4, 0xF8, 0x9C, 0x5B, 0xE3, 0x4B, 0x5A, 0x0D, 0x99, 0x34, 0x29, 0xCD, 0x6C, 0x94, 0x11, 0x4F, + 0x60, 0x34, 0xD9, 0xC5, 0x7A, 0x26, 0xD9, 0x17, 0x32, 0x01, 0xA0, 0xEF, 0xC2, 0x8D, 0x5D, 0xC7, + 0xF5, 0x27, 0x26, 0x39, 0xC5, 0x51, 0xB7, 0x21, 0xAA, 0x86, 0x95, 0x93, 0x7A, 0x2C, 0x28, 0x82, + 0xEF, 0x51, 0xAA, 0x18, 0xF0, 0xD4, 0x4A, 0xF1, 0xD2, 0x0F, 0xC2, 0x90, 0x54, 0x2A, 0x89, 0x95, + 0x81, 0xD9, 0xAC, 0xD2, 0xC0, 0xC6, 0xDD, 0x17, 0xBB, 0x0C, 0xAE, 0xBB, 0xAA, 0xB7, 0x95, 0x90, + 0x2A, 0x0F, 0xE2, 0xFB, 0x5D, 0x0F, 0x5B, 0xB5, 0xAC, 0x8C, 0xEE, 0xD4, 0xE0, 0x36, 0x33, 0x5A, + 0x5E, 0xFA, 0x06, 0xFD, 0xBA, 0xF2, 0x79, 0xE5, 0x4B, 0x4D, 0xCE, 0x2C, 0xA6, 0xE9, 0xFD, 0x5B, + 0xB4, 0xDE, 0x4C, 0x18, 0x69, 0x53, 0x79, 0xEA, 0xDB, 0xFF, 0xC0, 0x48, 0xA7, 0x9A, 0x25, 0xED, + 0x18, 0xED, 0x71, 0xE3, 0xA5, 0xB3, 0xEC, 0x5A, 0x09, 0x13, 0xD4, 0x9D, 0xD0, 0xB1, 0x17, 0x7C, + 0xB6, 0x60, 0xB7, 0x4A, 0xC4, 0x80, 0xE7, 0x9B, 0xA9, 0xB3, 0x0A, 0xE2, 0x34, 0x65, 0x5F, 0xA8, + 0xED, 0x42, 0xBB, 0xC0, 0x26, 0x6A, 0x86, 0x73, 0x88, 0x16, 0xCB, 0xB3, 0x2D, 0x95, 0x09, 0x90, + 0x6C, 0x87, 0x35, 0x97, 0x17, 0x85, 0x3F, 0x37, 0x6A, 0xFF, 0xA2, 0x6F, 0xC4, 0xB1, 0x91, 0xB6, + 0xD8, 0x1C, 0xDC, 0x35, 0xF4, 0x96, 0x2C, 0x51, 0x27, 0xFD, 0xB9, 0x11, 0xDC, 0xD9, 0x3E, 0x33, + 0xC2, 0x34, 0x9A, 0x99, 0x5A, 0xDD, 0x91, 0xB5, 0x7A, 0xDB, 0x9F, 0xDE, 0xB0, 0x53, 0x61, 0x03, + 0x9E, 0xC3, 0x5A, 0x97, 0x5E, 0xB7, 0x11, 0x80, 0x46, 0x4D, 0xC9, 0x82, 0xC7, 0xF2, 0x0D, 0x85, + 0x9A, 0x2C, 0x5A, 0x02, 0x43, 0x7D, 0xA5, 0x7C, 0x58, 0xFD, 0xC6, 0x40, 0xC4, 0x06, 0x43, 0x65, + 0x13, 0x1E, 0x3A, 0xC7, 0x17, 0xDB, 0x88, 0x87, 0xB5, 0xF3, 0x36, 0xE3, 0x72, 0xBD, 0x22, 0x1B, + 0xF2, 0xB0, 0xC5, 0xBC, 0x36, 0xE5, 0x71, 0x6E, 0xCB, 0xCC, 0xED, 0x6C, 0x64, 0xB2, 0x26, 0x3B, + 0xDA, 0x4E, 0xC7, 0x58, 0x5D, 0x6B, 0xA1, 0xCD, 0x4D, 0x09, 0x3B, 0xFB, 0x0C, 0x24, 0x40, 0x41, + 0xE9, 0x4D, 0xB3, 0x6C, 0xB9, 0x06, 0x2C, 0xEB, 0x74, 0xB3, 0xCC, 0xFF, 0x23, 0xA0, 0x59, 0xE7, + 0x3B, 0x66, 0xFA, 0x4B, 0x55, 0x3C, 0x8A, 0x09, 0x9B, 0xE0, 0xEB, 0x1A, 0x46, 0xDB, 0xA0, 0x5E, + 0xEF, 0x6D, 0x09, 0x1F, 0xFD, 0x00, 0xF8, 0xE8, 0x2F, 0x2F, 0x6E, 0x7F, 0x1E, 0x49, 0x50, 0xF9, + 0x3D, 0x7A, 0xD8, 0xB4, 0xEC, 0x3E, 0x3D, 0x12, 0xC1, 0x72, 0x7B, 0x75, 0x05, 0x9D, 0xB0, 0x5F, + 0x57, 0x66, 0x8B, 0xB4, 0x5B, 0xE5, 0xF1, 0x26, 0xDA, 0x22, 0x1E, 0x5E, 0xA2, 0x2B, 0x0B, 0xE5, + 0x55, 0x29, 0x93, 0xA4, 0x4C, 0x5F, 0x26, 0x4B, 0xC6, 0x02, 0xF6, 0xFE, 0xCA, 0x88, 0x69, 0xF7, + 0xFF, 0x51, 0x1D, 0xE9, 0x0C, 0xF0, 0xE2, 0xF9, 0xA4, 0x3B, 0x4F, 0x84, 0x44, 0xA7, 0x9F, 0x29, + 0x12, 0xAA, 0x35, 0x6F, 0x4B, 0xAC, 0x0A, 0x60, 0xE9, 0x6D, 0x71, 0x24, 0x8A, 0x2F, 0xE7, 0x78, + 0x11, 0x8D, 0x6D, 0xF1, 0x23, 0x46, 0x16, 0x67, 0x85, 0x3B, 0x30, 0xF1, 0xB0, 0x76, 0x67, 0xE2, + 0x53, 0x1C, 0xDC, 0xB9, 0x56, 0xB1, 0x37, 0xD4, 0xE2, 0x18, 0xA9, 0xE4, 0x03, 0x6A, 0x02, 0xC8, + 0x98, 0xFF, 0x02, 0x7C, 0xC5, 0x63, 0x27, 0x79, 0xAF, 0x97, 0x7E, 0xDF, 0xAE, 0xBB, 0x28, 0x4D, + 0xBD, 0x50, 0x27, 0x28, 0xC9, 0x37, 0x9E, 0x28, 0x33, 0x25, 0x9A, 0xAC, 0x89, 0x96, 0x51, 0x43, + 0xA8, 0xA2, 0x5E, 0x93, 0xF2, 0x4A, 0x2B, 0xF4, 0xA5, 0x4D, 0x32, 0x5E, 0xC9, 0xAA, 0x7A, 0xFF, + 0xC5, 0xB0, 0x49, 0x33, 0x9B, 0xF6, 0x70, 0x13, 0x40, 0x48, 0x6D, 0x07, 0x2E, 0x75, 0x40, 0x6E, + 0xAC, 0xE6, 0x3D, 0xA0, 0x97, 0xCA, 0x2C, 0xB9, 0xFB, 0x39, 0xBC, 0x52, 0x38, 0xAB, 0x67, 0x96, + 0x4A, 0x6A, 0x93, 0xB0, 0xE0, 0xB9, 0xD9, 0x95, 0x08, 0xFF, 0xD3, 0x33, 0x4B, 0x3D, 0x4A, 0xBF, + 0x44, 0xDD, 0x91, 0xBD, 0x56, 0x6A, 0x4E, 0xB6, 0x19, 0xC1, 0x95, 0x19, 0x27, 0x71, 0x4D, 0x74, + 0xA5, 0xFE, 0x30, 0xAE, 0x1D, 0xBE, 0xA8, 0xF6, 0x9A, 0xBE, 0x76, 0xAA, 0xC3, 0x2E, 0x6B, 0xB5, + 0xFE, 0x4D, 0x09, 0x78, 0x4E, 0x93, 0xF9, 0xF8, 0xD0, 0x9F, 0xF2, 0x20, 0x65, 0xB1, 0x30, 0xCE, + 0x30, 0x0E, 0xB3, 0x20, 0x8C, 0x6E, 0x46, 0x28, 0xA8, 0xDE, 0x4F, 0x20, 0xD3, 0x00, 0x10, 0x8F, + 0x62, 0x86, 0x29, 0x21, 0x1A, 0xBC, 0xAC, 0x3A, 0xD1, 0x98, 0x65, 0x54, 0x8A, 0xB9, 0xA8, 0xAF, + 0xA4, 0x8C, 0x67, 0x66, 0x25, 0x75, 0x18, 0x33, 0x8D, 0x18, 0x61, 0x37, 0xAB, 0x19, 0x32, 0xE4, + 0xE5, 0x28, 0xD3, 0x98, 0x21, 0xCC, 0x8A, 0x2C, 0x83, 0x86, 0xB2, 0x53, 0x2A, 0x6C, 0xD4, 0xD0, + 0x0D, 0x97, 0x3A, 0x94, 0x0B, 0x34, 0x6E, 0x54, 0x44, 0x1F, 0x19, 0x39, 0xC2, 0x97, 0x8B, 0x56, + 0x88, 0x20, 0xE8, 0x6D, 0x1D, 0x2A, 0x63, 0x0A, 0xDA, 0x3B, 0x04, 0xB6, 0xCB, 0x36, 0x0F, 0xF5, + 0x10, 0x51, 0xD2, 0xEE, 0x51, 0xE4, 0x0C, 0x32, 0x4F, 0xDB, 0x87, 0x72, 0x92, 0x98, 0xCD, 0xFE, + 0x21, 0x30, 0xA5, 0x9C, 0x0D, 0x24, 0x9A, 0x2D, 0x3F, 0xD5, 0x0E, 0x22, 0x89, 0x07, 0xAD, 0x17, + 0xE5, 0xF0, 0xDF, 0x41, 0xAF, 0xD5, 0xCD, 0xE6, 0xDC, 0xAC, 0x25, 0x89, 0x03, 0x91, 0x5C, 0x61, + 0x4D, 0x6D, 0xB1, 0xAE, 0x7E, 0xD8, 0xC8, 0x03, 0xF1, 0x5A, 0xB2, 0xC8, 0xE4, 0x3A, 0xE5, 0x2D, + 0xC4, 0x0E, 0x24, 0xC8, 0xC0, 0x8F, 0x44, 0x28, 0xBC, 0x64, 0xD0, 0x11, 0x22, 0x74, 0xD9, 0xEE, + 0x83, 0xFC, 0x2B, 0x8C, 0x6C, 0xFB, 0xEF, 0x44, 0xFD, 0x36, 0xEA, 0xF5, 0x28, 0x2C, 0x59, 0xA9, + 0xD2, 0xCA, 0xAF, 0xF2, 0xB7, 0xBF, 0x25, 0xEA, 0x78, 0x38, 0x98, 0x7A, 0x0E, 0xDD, 0xB9, 0x28, + 0xD4, 0x0D, 0x71, 0x00, 0xC1, 0xD0, 0x92, 0x2A, 0xA6, 0x71, 0xE8, 0x44, 0x65, 0x11, 0xE9, 0x09, + 0xCB, 0xE2, 0xC7, 0xFA, 0x14, 0xB5, 0x26, 0xD5, 0xE1, 0x3B, 0x4E, 0xC1, 0x8A, 0x71, 0x7C, 0x4B, + 0xAD, 0x16, 0x81, 0x79, 0x83, 0x1E, 0x4C, 0x1F, 0xC1, 0x32, 0x8A, 0x20, 0x80, 0x1A, 0x5B, 0x2D, + 0xC4, 0xA6, 0x34, 0xA2, 0xAF, 0xCA, 0xB0, 0x48, 0x7B, 0x7F, 0xE0, 0x41, 0xBA, 0x53, 0x65, 0xBB, + 0x10, 0x3D, 0xB0, 0x7A, 0x09, 0x35, 0x13, 0x21, 0xD3, 0xB4, 0xFD, 0xBB, 0xB7, 0x81, 0x87, 0xCC, + 0x91, 0x3D, 0x74, 0x76, 0xEA, 0x23, 0x7C, 0x1B, 0xD4, 0xC9, 0x87, 0xBB, 0x77, 0x70, 0xA8, 0x7A, + 0xBB, 0x42, 0x7E, 0x81, 0x3F, 0xFA, 0x44, 0x91, 0xF1, 0x3F, 0xAC, 0x77, 0x6F, 0xE3, 0xB7, 0xDE, + 0x76, 0xD8, 0xC2, 0x7F, 0xE3, 0x3E, 0xD6, 0x91, 0x6D, 0xED, 0xD4, 0x01, 0x21, 0x3B, 0xE3, 0xEC, + 0x8E, 0x46, 0x75, 0x44, 0xB3, 0x8C, 0x93, 0xAF, 0xAE, 0x37, 0x5E, 0xA6, 0x15, 0x97, 0x59, 0x53, + 0xF1, 0xE1, 0x57, 0xF8, 0x5C, 0x47, 0xDC, 0xA7, 0x8B, 0x41, 0x08, 0x49, 0x76, 0x87, 0x43, 0x08, + 0x61, 0x25, 0xF4, 0xAC, 0x00, 0xDA, 0x95, 0xC0, 0x8B, 0xFE, 0xA1, 0x74, 0x0B, 0x6A, 0x1B, 0x9A, + 0xD1, 0x2E, 0x86, 0x8F, 0x17, 0xD5, 0x04, 0x56, 0x3E, 0x8E, 0x47, 0x77, 0x41, 0x30, 0xC9, 0x0C, + 0x4F, 0x17, 0xEA, 0xF1, 0x28, 0xF5, 0xF7, 0x87, 0x2C, 0x48, 0x1D, 0x56, 0x61, 0x1A, 0x43, 0x5F, + 0x4B, 0x6E, 0x90, 0xC2, 0x16, 0x34, 0x06, 0x59, 0xD4, 0x13, 0xDC, 0xA3, 0x66, 0xE0, 0x8E, 0x41, + 0x8D, 0x84, 0xD5, 0x3C, 0xEC, 0x4F, 0x5C, 0xC7, 0xA7, 0x44, 0xD2, 0x67, 0x6E, 0x78, 0x46, 0x06, + 0xB4, 0xDF, 0xFF, 0xC8, 0x72, 0x28, 0x90, 0xED, 0x83, 0x4B, 0x17, 0xFF, 0x57, 0xC5, 0x07, 0x72, + 0x69, 0x47, 0xEE, 0x7E, 0xCE, 0x62, 0x2A, 0x4B, 0x9D, 0x70, 0x74, 0xF9, 0xA1, 0x0A, 0x37, 0x4F, + 0xBD, 0x92, 0x90, 0x6F, 0xF7, 0x26, 0x30, 0x6D, 0x22, 0x86, 0x42, 0xB9, 0x56, 0xC6, 0xB5, 0xF5, + 0x54, 0x39, 0x67, 0xD1, 0xB7, 0x51, 0x05, 0x55, 0x44, 0x85, 0x31, 0xE6, 0xB5, 0x16, 0x33, 0xC2, + 0x61, 0xC6, 0xAB, 0x9F, 0x38, 0xC8, 0x69, 0x5C, 0x20, 0xE3, 0x2B, 0x74, 0x3D, 0x7F, 0xAC, 0xF6, + 0xD8, 0x7B, 0x0B, 0x99, 0xE3, 0x05, 0x75, 0x8A, 0x8E, 0x19, 0xAB, 0x9B, 0x33, 0x6E, 0xEC, 0x95, + 0x9F, 0x9F, 0x3B, 0x76, 0xFC, 0x8D, 0xF2, 0x17, 0x30, 0x7E, 0x09, 0x6E, 0xE4, 0x8F, 0xA1, 0x30, + 0xC5, 0x0F, 0xDC, 0x07, 0x07, 0x8E, 0xDD, 0x71, 0xEA, 0x08, 0xEE, 0xB7, 0x0A, 0xF3, 0xB6, 0x78, + 0x26, 0x02, 0x80, 0x78, 0x7C, 0x20, 0x18, 0x95, 0x18, 0x5A, 0x87, 0xDA, 0x11, 0xCE, 0x6F, 0x29, + 0xB0, 0x7E, 0xE8, 0x11, 0x5B, 0x19, 0xA8, 0xB4, 0x9B, 0x85, 0x52, 0x66, 0xA7, 0x88, 0xAD, 0xEA, + 0xC0, 0xF6, 0x23, 0x96, 0x8B, 0x80, 0x30, 0xB3, 0x0F, 0x09, 0x7A, 0x20, 0x55, 0x06, 0xD1, 0x05, + 0x50, 0x22, 0x67, 0xF8, 0x89, 0xAA, 0x0A, 0xD2, 0x2B, 0xC2, 0xDC, 0xD1, 0x53, 0xDF, 0xE4, 0x8B, + 0x74, 0x6C, 0x2F, 0x9B, 0x7A, 0xA3, 0xC0, 0x1D, 0x40, 0x8A, 0x74, 0x22, 0x6D, 0x2B, 0x00, 0xE2, + 0x5F, 0x29, 0xF9, 0x60, 0x32, 0x94, 0xB8, 0xF9, 0x35, 0x06, 0x0F, 0x99, 0xB5, 0xC1, 0x8C, 0xF8, + 0x17, 0x93, 0x52, 0xB3, 0x63, 0xF1, 0x61, 0xE0, 0x62, 0x2C, 0x26, 0x73, 0x89, 0xC0, 0x73, 0x9E, + 0x12, 0xA5, 0x4A, 0x6A, 0xB7, 0x43, 0xCB, 0x64, 0xFB, 0xCE, 0xC3, 0xB7, 0x90, 0xB8, 0x3B, 0xAC, + 0x16, 0x7A, 0xC6, 0x47, 0xB8, 0xE0, 0x59, 0x8D, 0x94, 0xD1, 0x0F, 0x97, 0x3D, 0xC1, 0xD4, 0x12, + 0x2E, 0xB2, 0xE5, 0x07, 0x3F, 0x2D, 0x01, 0x05, 0x9C, 0x0F, 0x62, 0xA8, 0x52, 0x0A, 0x0A, 0x27, + 0x91, 0x80, 0x22, 0xAE, 0x08, 0x49, 0x28, 0xA2, 0xE8, 0x8F, 0x68, 0x65, 0x8A, 0x56, 0xFC, 0x38, + 0x36, 0x24, 0x4F, 0xC2, 0xB1, 0x9C, 0x1A, 0x65, 0x5E, 0xF2, 0xFD, 0x2A, 0xCD, 0x66, 0x9C, 0x18, + 0xF7, 0x70, 0xFF, 0x0E, 0xAF, 0xAA, 0xD3, 0xD5, 0x9D, 0x1B, 0x8F, 0x13, 0x0A, 0x51, 0x94, 0x2C, + 0xF5, 0xB0, 0x26, 0x38, 0x62, 0xEA, 0x80, 0x6B, 0x53, 0xBB, 0x17, 0x97, 0xCC, 0xC7, 0x84, 0x40, + 0xD2, 0xBE, 0xD4, 0xB6, 0x0B, 0xAB, 0xCE, 0x4C, 0xDD, 0x19, 0x11, 0x92, 0xAF, 0x31, 0x85, 0xBE, + 0xAF, 0xAC, 0x5C, 0xE0, 0x5B, 0xA2, 0x22, 0xEF, 0x58, 0xDE, 0xA1, 0xE8, 0x4A, 0x2D, 0x73, 0x67, + 0x21, 0x6D, 0x94, 0x65, 0xC1, 0x67, 0x29, 0x80, 0xA4, 0x49, 0xAF, 0x24, 0x35, 0x82, 0x5F, 0x3B, + 0x73, 0xC9, 0x63, 0xC4, 0x20, 0x55, 0x4C, 0x5D, 0xC4, 0x08, 0xD5, 0x04, 0x99, 0x4C, 0x3C, 0x77, + 0x08, 0xCF, 0x7E, 0x11, 0xC0, 0xE1, 0xAF, 0x1F, 0x4C, 0xC7, 0x1A, 0x61, 0x4F, 0x66, 0x2C, 0x85, + 0x92, 0x6C, 0x4E, 0x35, 0x0C, 0xBC, 0x38, 0xC4, 0x32, 0x01, 0x95, 0x69, 0x4A, 0xEF, 0x40, 0x6B, + 0xFC, 0xE1, 0xA2, 0x32, 0x0D, 0xCD, 0x1B, 0xD7, 0x83, 0xEB, 0x58, 0xFA, 0xDF, 0xF4, 0x86, 0x4A, + 0xB6, 0xA6, 0xCC, 0x3C, 0x4D, 0x42, 0x92, 0x3B, 0x85, 0x0B, 0x61, 0x56, 0x9D, 0x78, 0x70, 0x27, + 0xD8, 0x1B, 0xB0, 0xD8, 0x10, 0x56, 0xD6, 0x1E, 0xD1, 0x0C, 0x3C, 0x68, 0x05, 0xB1, 0x3F, 0x03, + 0x37, 0x80, 0x83, 0xDE, 0x5F, 0xC1, 0x8C, 0x2D, 0x24, 0x27, 0xE2, 0x60, 0xF7, 0x4C, 0x4F, 0xB0, + 0x7C, 0x9E, 0x9A, 0xC1, 0x5D, 0xDB, 0x73, 0xA7, 0x84, 0x1A, 0x0E, 0x56, 0x78, 0xA1, 0x72, 0x2A, + 0xA4, 0x77, 0x52, 0x36, 0x27, 0x9A, 0x76, 0x30, 0xD5, 0xFE, 0x0F, 0x17, 0x48, 0x6C, 0xC5, 0x0F, + 0xFB, 0xD0, 0x33, 0x3F, 0x27, 0xF9, 0x1D, 0xE4, 0x69, 0x30, 0x12, 0xF9, 0x1D, 0xD3, 0xF1, 0xD4, + 0x84, 0xC7, 0x83, 0x5A, 0xE8, 0x01, 0xDC, 0x8F, 0x9D, 0x21, 0x13, 0x6F, 0xB2, 0x89, 0xA0, 0x32, + 0xFD, 0x44, 0x86, 0x65, 0x5C, 0xD3, 0xE4, 0xB5, 0x57, 0x64, 0x42, 0x66, 0x64, 0x1E, 0x5E, 0x96, + 0x60, 0x0A, 0x45, 0x19, 0xA6, 0xF2, 0x18, 0x19, 0x5A, 0x06, 0xE7, 0x31, 0xC1, 0xE9, 0xB7, 0x48, + 0x89, 0x43, 0x7E, 0x28, 0x66, 0x7B, 0xDA, 0x7B, 0x3A, 0xB6, 0xCA, 0x52, 0x2D, 0xF0, 0x43, 0x94, + 0xF3, 0x4A, 0xCC, 0x38, 0x32, 0x09, 0x91, 0x96, 0x0C, 0x54, 0x9C, 0x03, 0x95, 0x80, 0xEE, 0x02, + 0x00, 0x0E, 0x35, 0x06, 0x1B, 0x0C, 0x78, 0x16, 0x86, 0x3D, 0x58, 0x37, 0x1B, 0xEA, 0xC3, 0x69, + 0x2C, 0xAE, 0xF1, 0x72, 0x50, 0x28, 0x3B, 0x04, 0x33, 0x81, 0x46, 0x10, 0x65, 0xEF, 0x0B, 0xED, + 0x39, 0x8F, 0xD9, 0x6C, 0x53, 0x5A, 0x84, 0x7D, 0x8B, 0x8A, 0x21, 0xDA, 0x5E, 0xCC, 0xA4, 0xB9, + 0xB5, 0xB6, 0xA9, 0x5B, 0xBF, 0x49, 0x7D, 0x96, 0x4E, 0x23, 0xA7, 0x4B, 0x45, 0xD2, 0x7C, 0x44, + 0x5D, 0xD2, 0x25, 0xE8, 0xC8, 0xEE, 0x52, 0x5A, 0x4A, 0x8F, 0xA1, 0x58, 0x5C, 0xB0, 0x4B, 0x53, + 0x6B, 0x92, 0xD5, 0x99, 0x2B, 0xAB, 0x44, 0x67, 0xA6, 0x56, 0x4A, 0x1C, 0x7E, 0x46, 0x77, 0x52, + 0xDB, 0x44, 0xF2, 0x67, 0xE9, 0x3B, 0xD4, 0x31, 0x3A, 0x1D, 0x6D, 0xBE, 0xD3, 0xC0, 0x1E, 0xD1, + 0x6C, 0x8E, 0xD8, 0xF1, 0xE9, 0x56, 0x34, 0x73, 0xAC, 0x94, 0xBA, 0x45, 0x7A, 0x39, 0x21, 0x5B, + 0xE0, 0x13, 0xBA, 0xBB, 0x29, 0xDC, 0xC9, 0xF4, 0x26, 0x92, 0x97, 0xC2, 0xDD, 0x60, 0x72, 0x18, + 0xDC, 0x61, 0xCF, 0xC1, 0x41, 0x92, 0x5E, 0x5E, 0x70, 0xF0, 0x61, 0xBF, 0x97, 0x4D, 0xA5, 0x90, + 0xF9, 0xEA, 0xB8, 0x27, 0xF3, 0x36, 0x84, 0x9E, 0x49, 0xB2, 0x90, 0x91, 0x2A, 0xBF, 0xBD, 0x48, + 0x3F, 0x29, 0x80, 0x08, 0x2D, 0xEA, 0x92, 0x24, 0x6F, 0xDE, 0x15, 0xEF, 0x35, 0xF8, 0xF6, 0x60, + 0xDF, 0xDA, 0x67, 0xAC, 0x41, 0xE1, 0x17, 0x87, 0x84, 0x36, 0xDF, 0xEA, 0xF0, 0xE2, 0x60, 0x54, + 0xF6, 0xE7, 0x9D, 0x7E, 0x5F, 0xDD, 0xEB, 0x2B, 0xDB, 0x53, 0x11, 0x61, 0xDA, 0xEE, 0x14, 0x98, + 0x2D, 0xD6, 0x83, 0x0D, 0xA8, 0xF2, 0x5E, 0xAD, 0xD1, 0x54, 0xA2, 0x67, 0xA5, 0x17, 0x02, 0x25, + 0x73, 0x29, 0x2D, 0xD3, 0x3D, 0xBF, 0x78, 0x86, 0x1F, 0xC2, 0x54, 0x92, 0xD2, 0x38, 0x2B, 0x0C, + 0x54, 0xAF, 0xA1, 0x60, 0x60, 0x4E, 0xFD, 0x21, 0xBB, 0x78, 0xAB, 0x87, 0x69, 0x14, 0xF7, 0x39, + 0x44, 0x52, 0x02, 0xF9, 0x39, 0x3F, 0xD9, 0x47, 0x36, 0x5D, 0xB2, 0x20, 0x1C, 0x0B, 0x8F, 0x27, + 0xC1, 0x93, 0x38, 0xA1, 0x34, 0x5B, 0x79, 0x9E, 0x57, 0x60, 0x5F, 0x21, 0x2C, 0xCD, 0x17, 0x80, + 0x13, 0x91, 0x8A, 0x9F, 0x08, 0x8A, 0x03, 0xC1, 0x46, 0xF0, 0x2E, 0xB7, 0x8B, 0x80, 0x9A, 0x9A, + 0x92, 0xDD, 0x16, 0x46, 0x9F, 0xA7, 0x34, 0x04, 0x7B, 0x82, 0x60, 0x0B, 0x21, 0x67, 0x63, 0xB2, + 0xA7, 0x42, 0x83, 0xA9, 0xE7, 0xC1, 0x4E, 0x83, 0x76, 0x05, 0xC6, 0x95, 0xDE, 0x0C, 0xF6, 0x3E, + 0xF9, 0xB1, 0x40, 0x8D, 0x7C, 0xBE, 0x9E, 0x56, 0x93, 0x9D, 0x0C, 0x31, 0x11, 0x40, 0xA7, 0x49, + 0x89, 0x40, 0xFC, 0xD2, 0x8E, 0xD8, 0x20, 0x3E, 0xAF, 0xB4, 0xE0, 0x2C, 0xA3, 0x94, 0x84, 0xDE, + 0x4D, 0xA4, 0x50, 0x1A, 0x00, 0x59, 0x23, 0x5D, 0xEC, 0x0B, 0x23, 0xA0, 0xCE, 0xF2, 0x14, 0x12, + 0x12, 0x4D, 0x5B, 0x50, 0x3B, 0x44, 0x23, 0x3D, 0x0D, 0x9A, 0xD7, 0x90, 0x8E, 0x54, 0x2B, 0x1C, + 0x10, 0xA5, 0xB6, 0x2A, 0xBC, 0x90, 0x65, 0x32, 0x74, 0x25, 0x15, 0xF3, 0xBC, 0x86, 0xE5, 0xD4, + 0x9A, 0x41, 0xDA, 0xBF, 0xE1, 0x87, 0xCF, 0x10, 0x58, 0x53, 0x9B, 0xC0, 0x52, 0x2A, 0x8F, 0xDD, + 0x2A, 0x05, 0x7C, 0xDA, 0x54, 0xC2, 0x09, 0xA2, 0x74, 0x09, 0x85, 0x69, 0x25, 0x02, 0x5C, 0x37, + 0xF3, 0xA4, 0x84, 0xB8, 0x29, 0x28, 0x9B, 0x49, 0x03, 0x48, 0x6D, 0x1F, 0xDA, 0x51, 0x39, 0xE7, + 0x64, 0x81, 0x38, 0xA5, 0xB4, 0x8F, 0x1C, 0x37, 0x73, 0xA7, 0x0F, 0x27, 0x34, 0x4A, 0xA5, 0x8A, + 0xC8, 0xCA, 0xE7, 0xD3, 0x95, 0x69, 0x5B, 0x51, 0xB6, 0x11, 0x8E, 0x8F, 0xAC, 0x46, 0xE3, 0x56, + 0xFE, 0x5B, 0xEA, 0x5F, 0x2A, 0x4E, 0xE1, 0x79, 0x03, 0xA5, 0x3D, 0x7B, 0xDE, 0xE0, 0xE2, 0xE2, + 0xFC, 0xA2, 0x56, 0x4D, 0x0B, 0x11, 0x76, 0xB0, 0x95, 0x9B, 0x46, 0xDB, 0x9A, 0xF7, 0x64, 0xEB, + 0xC9, 0x2C, 0xF7, 0xDB, 0xCA, 0x5A, 0x65, 0xD9, 0xF7, 0xEF, 0x71, 0x20, 0x29, 0x1F, 0x79, 0x0F, + 0x90, 0xAB, 0x9F, 0x14, 0xF7, 0x23, 0x59, 0xCD, 0x49, 0xD9, 0x9F, 0x74, 0x9D, 0xDC, 0xBF, 0xBA, + 0xB8, 0x38, 0x3C, 0xBB, 0xD4, 0x75, 0x33, 0xB5, 0x87, 0x91, 0x8C, 0x13, 0x35, 0x3B, 0x9D, 0x80, + 0xAE, 0x03, 0xDF, 0x84, 0x67, 0xEF, 0x9B, 0xA8, 0xC2, 0x55, 0x3C, 0xEA, 0x5E, 0x9D, 0x3A, 0x59, + 0x10, 0x42, 0xEF, 0x6B, 0xD4, 0x2B, 0x53, 0xE2, 0xC3, 0x76, 0x26, 0x20, 0x3D, 0x35, 0x72, 0x8A, + 0x60, 0x80, 0xDE, 0x4B, 0x3B, 0x57, 0xE9, 0xE5, 0x50, 0x6E, 0x24, 0x48, 0x23, 0x4F, 0x02, 0xA6, + 0x63, 0x9D, 0x62, 0xF4, 0x57, 0x27, 0xF4, 0x33, 0xAE, 0xA5, 0x3F, 0x7F, 0x7C, 0xB5, 0x0B, 0x74, + 0xA1, 0xE9, 0x9E, 0x90, 0xEE, 0xE4, 0x50, 0x90, 0xFE, 0xBF, 0xE7, 0x89, 0x87, 0xC1, 0x2E, 0x74, + 0x2B, 0x74, 0xEF, 0x8F, 0x65, 0x5C, 0x5E, 0xC6, 0x35, 0x4B, 0xA5, 0x2C, 0x9A, 0x8B, 0x5E, 0x28, + 0x65, 0x6C, 0xDA, 0x65, 0x52, 0x21, 0x48, 0xB7, 0x48, 0x0E, 0x19, 0x5C, 0x71, 0x4A, 0x09, 0xEE, + 0x06, 0xA1, 0xEB, 0x22, 0x28, 0xCC, 0x4E, 0x2D, 0x35, 0xA3, 0xBC, 0x96, 0x94, 0xA6, 0x56, 0x15, + 0x87, 0xD0, 0x92, 0x6B, 0xCC, 0x82, 0xA6, 0x56, 0x9E, 0x4E, 0xA7, 0xDA, 0x20, 0x64, 0x83, 0x2C, + 0xF5, 0xD2, 0x03, 0x0F, 0xF2, 0xB1, 0xC7, 0x0D, 0xCC, 0x10, 0x3B, 0x4F, 0xA3, 0xCE, 0x4D, 0x65, + 0xA1, 0x09, 0x47, 0xBB, 0xD1, 0x48, 0xE3, 0x53, 0xF1, 0xE9, 0xA9, 0x60, 0x61, 0xB6, 0x3B, 0x35, + 0x9D, 0x7A, 0x51, 0x1D, 0xAD, 0x00, 0x13, 0xEE, 0x11, 0x54, 0x34, 0x3B, 0x09, 0xFB, 0x9F, 0xF2, + 0x5A, 0x83, 0xE4, 0xFA, 0xF7, 0xDE, 0xBE, 0xC7, 0x0E, 0x32, 0xE1, 0xD9, 0x0F, 0xAF, 0xEE, 0xF3, + 0x94, 0x1B, 0xC0, 0xCC, 0x27, 0x58, 0x89, 0xC8, 0x30, 0x3B, 0x81, 0x7D, 0xCB, 0x12, 0x5F, 0x80, + 0x37, 0x05, 0x55, 0x11, 0xFC, 0xFC, 0x04, 0xDF, 0x62, 0x47, 0x39, 0x64, 0x3B, 0xE8, 0xE0, 0xA0, + 0x6D, 0x85, 0x3F, 0xD4, 0xB6, 0x6D, 0x0A, 0xCE, 0x81, 0x21, 0xAC, 0x63, 0xD0, 0x15, 0x90, 0xB1, + 0xB7, 0x01, 0x38, 0x0F, 0x1D, 0x82, 0x4A, 0x3E, 0x8B, 0x86, 0x10, 0xA3, 0x8A, 0xA4, 0xFB, 0x72, + 0xAE, 0x5F, 0xBF, 0xBD, 0x7F, 0x7E, 0x7E, 0x71, 0x70, 0x7C, 0xB6, 0x7B, 0x79, 0x78, 0x7D, 0x7C, + 0xD6, 0xBB, 0xBA, 0xBC, 0xBE, 0xFC, 0xDC, 0x83, 0x5F, 0x3F, 0xEE, 0x9E, 0x1C, 0x1F, 0x5C, 0x5F, + 0x9D, 0xFD, 0x72, 0x76, 0xFE, 0xE9, 0x2C, 0xB6, 0x9F, 0x5B, 0xA6, 0x7F, 0x27, 0x84, 0x68, 0x45, + 0xEA, 0x11, 0x1C, 0x19, 0x35, 0xDF, 0x2D, 0x3C, 0xB0, 0xC7, 0xE6, 0x48, 0x53, 0xC2, 0x54, 0xD5, + 0xF9, 0xED, 0x09, 0xA6, 0x39, 0xFC, 0xD5, 0x8B, 0x44, 0xA2, 0x3C, 0xC8, 0x76, 0x2A, 0x80, 0x54, + 0xD1, 0x11, 0x5F, 0x58, 0x6A, 0x5B, 0x08, 0xF9, 0x01, 0xF1, 0x42, 0x0F, 0x77, 0x26, 0x5D, 0xAE, + 0x86, 0x94, 0xF1, 0x84, 0xC7, 0x53, 0x3F, 0xD2, 0xCA, 0x03, 0xD3, 0x41, 0x18, 0x18, 0x42, 0x55, + 0xA6, 0xED, 0x90, 0xC1, 0x27, 0x7A, 0x0E, 0xC2, 0xB8, 0x7C, 0x5E, 0x65, 0x17, 0xB1, 0x6F, 0xAC, + 0x16, 0x3C, 0x76, 0x41, 0x13, 0xAF, 0xB0, 0x2B, 0x47, 0xBF, 0x85, 0x96, 0x5B, 0xE0, 0xC5, 0xD4, + 0xA2, 0xC3, 0xD4, 0x96, 0xAF, 0xD5, 0xC4, 0x27, 0x7E, 0x43, 0xC6, 0xAB, 0xAA, 0x57, 0x8E, 0x57, + 0xF1, 0x2D, 0x7B, 0x68, 0x07, 0xF1, 0x30, 0x11, 0xED, 0x9A, 0x1A, 0xBD, 0x00, 0x0D, 0x64, 0xB6, + 0xD1, 0x05, 0x5D, 0xCB, 0xAF, 0xA5, 0xA5, 0xAC, 0xF4, 0x9F, 0x22, 0x3A, 0x80, 0x52, 0x5F, 0xAE, + 0x37, 0xE3, 0x01, 0x24, 0x47, 0x79, 0x60, 0xC3, 0x68, 0x84, 0x86, 0xAE, 0x6B, 0x15, 0x68, 0x8D, + 0x48, 0xEB, 0x78, 0x9C, 0x4B, 0x37, 0x6F, 0x03, 0x72, 0xA1, 0x5F, 0x59, 0x00, 0x42, 0xBB, 0x42, + 0x25, 0x61, 0xE5, 0x57, 0xCF, 0xF4, 0xC0, 0x42, 0xC4, 0x08, 0x5C, 0x1C, 0x7C, 0x49, 0x04, 0x68, + 0x24, 0x9F, 0x7C, 0xCF, 0x45, 0xB6, 0xEF, 0x20, 0x44, 0x13, 0xD7, 0xF7, 0x6D, 0xF0, 0xB2, 0x62, + 0x52, 0x01, 0xF3, 0x34, 0x94, 0x97, 0x78, 0x4A, 0xC6, 0x1F, 0x4E, 0x4F, 0xDB, 0x63, 0xF6, 0x13, + 0x7F, 0x43, 0xBA, 0x8F, 0xCB, 0xBA, 0x8F, 0xA7, 0xA7, 0xFD, 0x7E, 0xDB, 0xA7, 0x3F, 0x52, 0x73, + 0xA4, 0xF9, 0x4C, 0x00, 0x2C, 0xC7, 0x9F, 0x5F, 0x69, 0xE5, 0xE4, 0x1D, 0x84, 0x87, 0xCC, 0xCE, + 0xB9, 0xFF, 0x07, 0xAE, 0x67, 0x8E, 0xDB, 0x46, 0x6B, 0x64, 0xB6, 0x6D, 0x19, 0xAB, 0xAB, 0x6B, + 0xAF, 0x69, 0xC2, 0x1B, 0xCA, 0xBF, 0x76, 0xEC, 0xF7, 0x16, 0xCF, 0xF8, 0x77, 0xA8, 0x3B, 0x0F, + 0xC4, 0xE7, 0x30, 0xFF, 0x0C, 0x1A, 0x84, 0x49, 0x66, 0x5A, 0x17, 0xDE, 0x3C, 0x77, 0x1F, 0xB0, + 0x05, 0x84, 0x20, 0x63, 0x1D, 0x75, 0xD7, 0xDB, 0x5D, 0x63, 0x6D, 0x4B, 0x43, 0x4A, 0xAC, 0x93, + 0xDE, 0xA1, 0xD5, 0x39, 0x53, 0xD2, 0xA5, 0xC4, 0xAC, 0xC6, 0xC4, 0x2C, 0x77, 0x8C, 0xF5, 0xE5, + 0x4E, 0x67, 0xD9, 0x58, 0x6F, 0x77, 0x36, 0xBA, 0x3A, 0x72, 0xF4, 0x9A, 0xED, 0x1D, 0xB8, 0x8E, + 0xCE, 0x89, 0xB4, 0xD7, 0x40, 0xD3, 0x2D, 0x7E, 0xC0, 0x1E, 0xA3, 0xA7, 0xD3, 0x01, 0x6A, 0x36, + 0x37, 0xB7, 0xB6, 0xBA, 0xA8, 0x71, 0xC0, 0x24, 0x0B, 0xAA, 0xB0, 0xDF, 0x9A, 0x11, 0x8D, 0xF1, + 0x76, 0xD6, 0xC1, 0x43, 0x33, 0x20, 0x7A, 0xB3, 0x6F, 0x0F, 0x1D, 0x79, 0xF7, 0x20, 0xCF, 0x5D, + 0x23, 0x56, 0x1C, 0xB1, 0x96, 0x8A, 0x8A, 0xD9, 0xBE, 0x0B, 0xDC, 0x35, 0x77, 0x05, 0xE5, 0xD6, + 0x02, 0xD6, 0x81, 0x47, 0x25, 0xBD, 0x5E, 0x02, 0x9F, 0x4E, 0xA2, 0xBC, 0x28, 0x2B, 0x98, 0xFA, + 0x88, 0x3D, 0xB8, 0x65, 0x22, 0xE4, 0x28, 0x9C, 0x68, 0x50, 0x97, 0x97, 0x01, 0x10, 0x64, 0xAE, + 0x8A, 0xC7, 0x99, 0x68, 0x6B, 0x58, 0x33, 0x6D, 0x87, 0xA5, 0x82, 0xA5, 0x25, 0x98, 0x69, 0x70, + 0x96, 0xF0, 0x8A, 0x46, 0x80, 0x72, 0xA4, 0x21, 0x1A, 0xE4, 0x13, 0x3C, 0xAA, 0x39, 0x4A, 0x94, + 0x63, 0xA6, 0x68, 0xFF, 0xF2, 0x17, 0x51, 0xA2, 0xE2, 0x6F, 0x29, 0xE3, 0xBA, 0x43, 0x7D, 0x82, + 0x21, 0x45, 0x7D, 0x6A, 0xF9, 0x46, 0xB3, 0xD9, 0x84, 0x97, 0x8E, 0x12, 0x33, 0x5E, 0x7C, 0x3C, + 0xA8, 0xFA, 0x5A, 0xCD, 0xE0, 0x0A, 0x0E, 0x00, 0x2C, 0xDA, 0x95, 0xDE, 0xF4, 0x30, 0xE7, 0x70, + 0x7A, 0xFF, 0x49, 0xD8, 0xEB, 0x0C, 0xC2, 0x18, 0xA4, 0x78, 0xC3, 0x40, 0x87, 0x89, 0x6C, 0x3E, + 0x11, 0x97, 0x1B, 0x09, 0x0A, 0xD7, 0x2F, 0x32, 0x08, 0x01, 0x34, 0x0B, 0x3E, 0x32, 0x44, 0x18, + 0xF1, 0xC2, 0x17, 0x57, 0x5B, 0xDE, 0x89, 0x54, 0x15, 0xBB, 0xE8, 0x95, 0x02, 0x96, 0x68, 0xEE, + 0x3C, 0xDB, 0x99, 0x06, 0xD4, 0x1D, 0x24, 0x03, 0x51, 0x84, 0xE6, 0xF4, 0x54, 0x74, 0x9D, 0x3D, + 0xB2, 0xC9, 0x12, 0x4D, 0x96, 0x17, 0x69, 0xC9, 0x8D, 0x17, 0x66, 0xEA, 0xB2, 0x7E, 0x7E, 0xDB, + 0xA0, 0x0B, 0x10, 0x19, 0x8D, 0xE5, 0x8E, 0x6A, 0xD7, 0x9E, 0x95, 0xF5, 0xD7, 0x67, 0xE7, 0xD7, + 0x07, 0x87, 0xFB, 0xC7, 0xA7, 0xBB, 0x27, 0xCA, 0x28, 0xF8, 0x98, 0x2C, 0x40, 0x16, 0x74, 0x2B, + 0xA2, 0x47, 0x61, 0xB7, 0x28, 0x0E, 0xEC, 0x70, 0xC5, 0x5A, 0x68, 0x59, 0x16, 0x4F, 0x28, 0x91, + 0xD1, 0x62, 0x93, 0x90, 0x8F, 0x7F, 0x8D, 0xF8, 0xC5, 0x1B, 0x10, 0x96, 0x09, 0x0F, 0x55, 0x69, + 0xB6, 0x56, 0x21, 0xB2, 0xA5, 0x18, 0xC8, 0x0A, 0xDA, 0x20, 0x4B, 0x00, 0x0D, 0x5D, 0x0B, 0x71, + 0xAC, 0xA0, 0xD5, 0x0D, 0x08, 0xDA, 0x6E, 0xCA, 0x41, 0x14, 0xF2, 0x4C, 0xD6, 0xEF, 0x6B, 0x74, + 0x68, 0xFF, 0x0A, 0xC3, 0xA1, 0x0F, 0xC8, 0x8C, 0x36, 0x12, 0xCA, 0x04, 0x85, 0xB9, 0x28, 0x4F, + 0x4F, 0x3A, 0x3B, 0x53, 0x27, 0xDF, 0x3A, 0xCC, 0xCD, 0xD4, 0xD2, 0xB5, 0x68, 0x66, 0x4A, 0xEB, + 0xF3, 0xFC, 0x26, 0x66, 0xC1, 0x69, 0x19, 0xCF, 0x47, 0x49, 0x3E, 0x52, 0x26, 0xA3, 0x3A, 0x31, + 0xCA, 0x4E, 0xBF, 0xD4, 0xC9, 0xA7, 0x97, 0x52, 0x89, 0x35, 0xD4, 0xC1, 0x93, 0x37, 0xD0, 0x00, + 0xD6, 0x8B, 0x68, 0x59, 0x91, 0x5B, 0xA8, 0x74, 0xC9, 0xE2, 0x25, 0xC9, 0x52, 0x87, 0x49, 0xC3, + 0xF2, 0x82, 0xC4, 0xE1, 0xFA, 0xF4, 0xF4, 0xFA, 0x60, 0xB7, 0xFF, 0x41, 0x11, 0x0A, 0xEE, 0xD6, + 0x14, 0xAB, 0x2C, 0x1E, 0x9F, 0xB0, 0xAC, 0xC6, 0xAF, 0xC4, 0x12, 0xC0, 0xD5, 0x38, 0xB4, 0x84, + 0x14, 0x01, 0xF1, 0x70, 0xA5, 0x0C, 0xAC, 0x58, 0xBF, 0xF3, 0x4D, 0x50, 0xA4, 0x89, 0xB1, 0x7D, + 0x51, 0x43, 0x95, 0x3E, 0x52, 0xDD, 0x68, 0xA4, 0xC2, 0x7D, 0xF1, 0xDC, 0x47, 0x8A, 0x28, 0xF6, + 0x17, 0x36, 0x58, 0x2F, 0x66, 0xD5, 0x13, 0xD8, 0x53, 0x64, 0xF1, 0x13, 0x3B, 0xD4, 0x8D, 0x3B, + 0x94, 0x5C, 0xFD, 0x7E, 0xDB, 0x4B, 0x13, 0x13, 0xC9, 0xD8, 0x70, 0x33, 0x57, 0x89, 0xDC, 0xCE, + 0x61, 0x52, 0xAC, 0xBA, 0x7F, 0x52, 0xF7, 0xB9, 0xEE, 0x44, 0x8B, 0xD3, 0x9D, 0x05, 0x67, 0x22, + 0xFA, 0x43, 0x6D, 0xA6, 0x8F, 0x52, 0x37, 0x1A, 0x25, 0xB4, 0x98, 0xB3, 0x08, 0x53, 0x0D, 0x2F, + 0x68, 0xA8, 0x5E, 0x9A, 0xD2, 0xFC, 0xDF, 0xA5, 0x2F, 0xB9, 0x09, 0x4B, 0xBA, 0x0B, 0xD2, 0x34, + 0x67, 0xD7, 0x41, 0x9A, 0x82, 0x28, 0x61, 0xC5, 0x56, 0x53, 0x09, 0xD1, 0xD4, 0x0C, 0x46, 0xF8, + 0xA0, 0x71, 0x68, 0x8A, 0x17, 0x6C, 0xEA, 0x60, 0xC6, 0x8D, 0x43, 0x19, 0x5B, 0xC8, 0x9D, 0x06, + 0xF0, 0x87, 0xC9, 0xED, 0xF4, 0xA4, 0x51, 0xDF, 0x95, 0xAD, 0xEE, 0x60, 0x42, 0xBE, 0x21, 0xBC, + 0x1A, 0x63, 0x54, 0x57, 0x26, 0x4C, 0xBD, 0x85, 0x70, 0x30, 0x90, 0x1E, 0x38, 0x06, 0xBA, 0x29, + 0x1D, 0x02, 0x5D, 0x2D, 0x9D, 0xC0, 0xE8, 0x2D, 0xF4, 0xDC, 0x5C, 0x29, 0x5C, 0x2D, 0xB2, 0xC0, + 0x06, 0x8D, 0xBC, 0x15, 0x17, 0xB8, 0xA6, 0x76, 0x52, 0xC7, 0xF2, 0x15, 0x7F, 0x6B, 0x0A, 0x6C, + 0x56, 0xEF, 0x67, 0x45, 0x32, 0xF4, 0xB7, 0x5B, 0x33, 0x92, 0x79, 0x2D, 0x9C, 0x73, 0xC8, 0x59, + 0x6D, 0x46, 0x68, 0x73, 0x05, 0x16, 0x6E, 0xD8, 0xE7, 0x0C, 0xB2, 0xFF, 0xF9, 0x74, 0xEF, 0xFC, + 0x84, 0x02, 0x55, 0x23, 0x46, 0x46, 0xAE, 0x33, 0xA4, 0xA9, 0x2A, 0x0E, 0xF0, 0xD0, 0xC3, 0xAA, + 0x45, 0x24, 0x31, 0x12, 0xCA, 0xD0, 0x92, 0x03, 0x99, 0x0A, 0x40, 0x5B, 0x8F, 0x4C, 0xD6, 0x0D, + 0x63, 0x5B, 0x49, 0xBC, 0x14, 0x95, 0xBE, 0x45, 0xA9, 0x7A, 0x2F, 0x9C, 0xE6, 0x7A, 0xB9, 0x1A, + 0x24, 0xA7, 0xED, 0xEB, 0x66, 0x22, 0xC1, 0xD3, 0x8C, 0xC3, 0x9B, 0x46, 0x5A, 0x34, 0x85, 0x12, + 0x2C, 0x5C, 0x22, 0xB3, 0x8A, 0x6A, 0x97, 0xB0, 0xEA, 0x76, 0xF2, 0xBA, 0x62, 0x4E, 0x82, 0x52, + 0x89, 0xB8, 0xE5, 0xE7, 0xA0, 0x8E, 0xC9, 0x5C, 0x25, 0xFA, 0xFE, 0xFB, 0xBF, 0x64, 0x02, 0xE1, + 0x5B, 0xBD, 0x26, 0x93, 0x59, 0x05, 0x2E, 0xD2, 0xF5, 0x5B, 0xD1, 0x2D, 0x73, 0xE9, 0x7A, 0xBF, + 0x29, 0x4E, 0xE0, 0xD9, 0x45, 0x70, 0xCE, 0x00, 0x85, 0xD3, 0xD4, 0x22, 0xE0, 0xAA, 0x23, 0x3F, + 0x27, 0x16, 0x08, 0x1B, 0x99, 0x45, 0x50, 0xBD, 0x58, 0xE8, 0xCA, 0xC9, 0xB5, 0xF9, 0x5B, 0x57, + 0xC3, 0x12, 0xCD, 0xA7, 0x3A, 0x63, 0x7A, 0x19, 0x9A, 0x39, 0x80, 0x2C, 0x9A, 0x0B, 0x2F, 0x00, + 0x1B, 0x73, 0x5F, 0x00, 0xC4, 0xD9, 0x57, 0x72, 0x09, 0x48, 0xB0, 0xE8, 0x99, 0x96, 0x86, 0xC4, + 0xEC, 0x2E, 0xBB, 0x3A, 0xE8, 0x08, 0x5F, 0x7E, 0x26, 0xCA, 0x67, 0x5E, 0x39, 0x74, 0xC4, 0xD7, + 0x93, 0x4B, 0xCA, 0xDF, 0x6A, 0xB5, 0x45, 0xF5, 0xA1, 0x59, 0x79, 0x79, 0xD2, 0xD1, 0x8E, 0x16, + 0xCD, 0xF8, 0x54, 0xF5, 0x3A, 0x27, 0x71, 0x17, 0xE2, 0x21, 0xB5, 0x6A, 0x61, 0xCE, 0x02, 0x34, + 0x63, 0x4F, 0xB2, 0xC7, 0xE1, 0x99, 0xFB, 0xA2, 0x2E, 0x1C, 0xF3, 0x9F, 0xD1, 0x59, 0x1D, 0x4A, + 0x84, 0xDD, 0xC8, 0xF8, 0x14, 0x2F, 0xC7, 0xD0, 0xED, 0x68, 0x00, 0xEF, 0x16, 0xF1, 0x36, 0x2B, + 0x7F, 0xB3, 0x56, 0xDA, 0x01, 0xC4, 0x3B, 0x0F, 0x9A, 0xDB, 0x48, 0xCE, 0xC7, 0x10, 0xDE, 0xE4, + 0x93, 0x23, 0x71, 0x8B, 0x65, 0xFA, 0x22, 0x27, 0xD8, 0x3B, 0x4F, 0x74, 0x8B, 0x64, 0x69, 0xCA, + 0xDE, 0xC1, 0xA9, 0x39, 0x0C, 0x14, 0x5A, 0x16, 0xDC, 0x4E, 0xC8, 0x67, 0xE9, 0x90, 0x0E, 0xD5, + 0xA4, 0x04, 0x5B, 0x3C, 0x89, 0xD9, 0x12, 0xC0, 0x05, 0xFF, 0x4F, 0xA9, 0x9C, 0x01, 0x5F, 0xA2, + 0x39, 0x5A, 0xC5, 0x73, 0xBC, 0x23, 0x9D, 0xDC, 0x39, 0x68, 0x13, 0x9E, 0x8D, 0x72, 0x58, 0x4E, + 0x24, 0x7E, 0x86, 0x17, 0x82, 0x92, 0x79, 0x49, 0xEC, 0x21, 0x97, 0x71, 0x12, 0xF7, 0x1F, 0xEC, + 0x60, 0x70, 0x87, 0xB2, 0xAA, 0x50, 0x87, 0x04, 0xF6, 0xB8, 0xF4, 0x1B, 0x25, 0xD5, 0x2C, 0x1B, + 0x89, 0xDA, 0x95, 0xF3, 0xDD, 0xD1, 0xBC, 0x5D, 0xAC, 0x24, 0x35, 0x1E, 0x40, 0x74, 0x70, 0xA3, + 0xF0, 0xF9, 0x3D, 0x05, 0x97, 0x68, 0xA6, 0x98, 0x2B, 0x42, 0x72, 0xB8, 0x4A, 0x45, 0x19, 0xDB, + 0x3C, 0xE7, 0x8A, 0xF2, 0x3A, 0x0B, 0x27, 0x5A, 0x1C, 0x52, 0xB6, 0x1E, 0xA7, 0x62, 0x5E, 0x5E, + 0x10, 0x66, 0xBA, 0x7B, 0xC9, 0xE0, 0x71, 0x64, 0x62, 0x9A, 0x7B, 0x7F, 0xB3, 0xF0, 0x4A, 0xC6, + 0xAD, 0xB9, 0xF7, 0x57, 0x54, 0x97, 0x99, 0x5D, 0x5F, 0x40, 0x9F, 0x0B, 0xE1, 0x66, 0xDD, 0x5F, + 0x04, 0x76, 0x75, 0xB5, 0xC8, 0x92, 0xB7, 0xE5, 0x4C, 0x12, 0x7E, 0xBC, 0x4A, 0x53, 0x37, 0x3F, + 0xFE, 0x07, 0x4A, 0x7F, 0xE2, 0xF4, 0xFB, 0x51, 0x00 }; ///main_js //To convert AP-Config\index.html to index_html[], run the Python index_html_zipper.py script in the Tools folder: @@ -889,911 +886,910 @@ static const uint8_t main_js[] PROGMEM = { // python index_html_zipper.py static const uint8_t index_html[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0xCE, 0xE4, 0x45, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, - 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xD9, 0x72, 0xE3, 0x48, - 0x92, 0xE0, 0xFB, 0x9A, 0xED, 0x3F, 0x44, 0x73, 0x76, 0x46, 0xCA, 0x19, 0x91, 0xE2, 0x21, 0x29, - 0x95, 0xEA, 0x4C, 0x99, 0xE9, 0xCC, 0xD2, 0xB6, 0x94, 0x49, 0x13, 0x95, 0x5D, 0xC7, 0xDA, 0x6E, - 0x1B, 0x04, 0x04, 0x49, 0xB4, 0x40, 0x00, 0x85, 0x43, 0x47, 0x8D, 0xCD, 0xD8, 0x7C, 0xC6, 0xEE, - 0x87, 0xEC, 0x0F, 0xEC, 0xA7, 0xCC, 0x97, 0xAC, 0xBB, 0x47, 0x00, 0x04, 0xC0, 0x2B, 0x00, 0x82, - 0x14, 0x29, 0x31, 0xCB, 0x4A, 0xA2, 0x40, 0xC4, 0xE5, 0xE1, 0xEE, 0xE1, 0xE1, 0xE7, 0xE7, 0x3F, - 0x9D, 0x7F, 0x3F, 0xBB, 0xFB, 0xB5, 0x7D, 0xC1, 0xFA, 0xC1, 0xC0, 0x3A, 0xFE, 0xAF, 0xFF, 0xE5, - 0x33, 0xFE, 0x66, 0x96, 0x66, 0xF7, 0xBE, 0x54, 0xB8, 0x5D, 0x81, 0x27, 0xF8, 0x8C, 0x6B, 0x06, - 0x7C, 0x62, 0xF0, 0xEF, 0xF3, 0x80, 0x07, 0x1A, 0xD3, 0xFB, 0x9A, 0xE7, 0xF3, 0xE0, 0x4B, 0x25, - 0x0C, 0xBA, 0xD5, 0xC3, 0x0A, 0xDB, 0x4D, 0x7D, 0xDB, 0x0F, 0x02, 0xB7, 0xCA, 0x7F, 0x0F, 0xCD, - 0xC7, 0x2F, 0x95, 0x5F, 0xAA, 0x3F, 0x4E, 0xAA, 0x67, 0xCE, 0xC0, 0xD5, 0x02, 0xF3, 0xDE, 0xE2, - 0x15, 0xA6, 0x3B, 0x76, 0xC0, 0x6D, 0x68, 0x7A, 0x75, 0xF1, 0x85, 0x1B, 0x3D, 0xBE, 0xA3, 0xF7, - 0x3D, 0x67, 0xC0, 0xBF, 0x34, 0x12, 0xBD, 0x04, 0x66, 0x60, 0xF1, 0xE3, 0x8E, 0xAB, 0x79, 0x0F, - 0x97, 0xA1, 0xCD, 0x6E, 0xEF, 0xFE, 0xC2, 0x3A, 0x3C, 0x08, 0xDD, 0xCF, 0xBB, 0xE2, 0x9B, 0xE4, - 0x60, 0xB6, 0x06, 0x8D, 0x2B, 0x8F, 0x26, 0x7F, 0x72, 0x1D, 0x2F, 0xA8, 0x88, 0xAF, 0xF0, 0x5F, - 0x3C, 0xD0, 0x93, 0x69, 0x04, 0xFD, 0x2F, 0x06, 0x7F, 0x34, 0x75, 0x5E, 0xA5, 0x3F, 0x76, 0x98, - 0x69, 0x9B, 0x81, 0xA9, 0x59, 0x55, 0x5F, 0xD7, 0x2C, 0x18, 0x7B, 0x87, 0x0D, 0xB4, 0x67, 0x73, - 0x10, 0x0E, 0x86, 0x0F, 0x42, 0x9F, 0x7B, 0xF4, 0x97, 0x06, 0xD3, 0xFE, 0x52, 0xDF, 0x61, 0x7E, - 0xDF, 0x33, 0xED, 0x87, 0x6A, 0xE0, 0x54, 0xBB, 0x66, 0xF0, 0xE5, 0x85, 0xFB, 0x89, 0x09, 0x5B, - 0xF0, 0x0D, 0xF3, 0xB8, 0xF5, 0xA5, 0xE2, 0x07, 0x2F, 0x16, 0xF7, 0xFB, 0x9C, 0x07, 0x15, 0xD6, - 0xF7, 0x78, 0x17, 0x9E, 0x78, 0xFA, 0xEE, 0xBD, 0xE3, 0x04, 0x7E, 0xE0, 0x69, 0x6E, 0x6D, 0x60, - 0xDA, 0x35, 0xDD, 0xF7, 0x2B, 0xAA, 0x2D, 0xE9, 0x69, 0xAA, 0x85, 0xAF, 0x7B, 0xA6, 0x1B, 0x30, - 0xF8, 0x52, 0xBC, 0xF1, 0xF7, 0xDF, 0x43, 0xEE, 0xBD, 0x54, 0x5B, 0xB5, 0x83, 0x5A, 0x9D, 0xBA, - 0xFF, 0x3B, 0xBC, 0xFB, 0x79, 0x57, 0xBC, 0x36, 0xA9, 0x51, 0x7A, 0x42, 0xF9, 0x5A, 0xDC, 0x87, - 0xB6, 0x01, 0x73, 0x1A, 0xD3, 0x30, 0xD5, 0xF4, 0x78, 0xB8, 0x15, 0xFF, 0x6D, 0xDB, 0x70, 0xF4, - 0x70, 0x00, 0xBB, 0xF1, 0xA1, 0xE6, 0xD8, 0xDB, 0x5B, 0xBA, 0x65, 0xEA, 0x0F, 0x5B, 0x3B, 0x6C, - 0xAB, 0x16, 0x38, 0xBD, 0x9E, 0xC5, 0xAB, 0xF7, 0x81, 0x0D, 0x7F, 0x76, 0x43, 0x5B, 0x0F, 0x4C, - 0xC7, 0x66, 0xDB, 0xFC, 0x03, 0xFB, 0xD7, 0x61, 0x73, 0xD1, 0x05, 0x40, 0x21, 0xF4, 0x3C, 0xE8, - 0xE3, 0x4E, 0xF3, 0x7A, 0x3C, 0xA8, 0xE9, 0x7D, 0xD3, 0x32, 0xE0, 0xEF, 0xFF, 0x51, 0xFF, 0x9F, - 0x1F, 0x64, 0x3F, 0x67, 0x96, 0xE6, 0xFB, 0xDB, 0x5B, 0x26, 0x6C, 0x7D, 0x55, 0xD7, 0x3C, 0x1E, - 0x54, 0x0D, 0xE7, 0xC9, 0x66, 0x89, 0xBF, 0x43, 0x77, 0xEB, 0xC3, 0x9F, 0x87, 0x3D, 0xFF, 0xDB, - 0x07, 0x39, 0xE5, 0xD1, 0x35, 0x20, 0xDC, 0x13, 0x4B, 0xA8, 0xF9, 0x01, 0x60, 0xB0, 0x5E, 0xED, - 0x79, 0x4E, 0xE8, 0x66, 0x27, 0xD7, 0xE7, 0x66, 0xAF, 0x1F, 0x1C, 0xB1, 0xFA, 0x9F, 0xD3, 0xCF, - 0x9D, 0x47, 0xEE, 0x75, 0x2D, 0xE7, 0xE9, 0x88, 0xF5, 0x4D, 0xC3, 0xE0, 0x76, 0xE6, 0x6B, 0x80, - 0xA6, 0xED, 0x9B, 0xB8, 0xE2, 0x23, 0xD9, 0x05, 0xAB, 0xD7, 0xF6, 0x7C, 0xC6, 0x35, 0x9F, 0x67, - 0x5E, 0xBD, 0x77, 0x3C, 0x03, 0xF0, 0xF1, 0xDE, 0x09, 0x02, 0x67, 0x70, 0xC4, 0x7C, 0xC7, 0x32, - 0x0D, 0xD6, 0x70, 0x9F, 0xD9, 0x3F, 0xE8, 0x75, 0xFC, 0x2F, 0xB9, 0xA6, 0x68, 0x0D, 0x34, 0x6D, - 0xCB, 0xF4, 0x83, 0x35, 0x98, 0x34, 0xFE, 0x73, 0x35, 0xC3, 0x30, 0xED, 0x5E, 0xD5, 0x13, 0xF3, - 0xDA, 0xAF, 0xBB, 0xCF, 0x13, 0x97, 0x25, 0xBA, 0x06, 0x7A, 0xF1, 0x59, 0x60, 0xEC, 0x4C, 0xF8, - 0xA2, 0x9F, 0x5D, 0xB2, 0xF8, 0xF2, 0x88, 0xD9, 0x8E, 0x9D, 0x9D, 0xEB, 0x00, 0x90, 0xCA, 0xB4, - 0xAB, 0x16, 0xEF, 0x22, 0x48, 0x26, 0x8F, 0x7C, 0x1F, 0xC2, 0x62, 0xEC, 0xA3, 0x2E, 0xE0, 0xB3, - 0x9F, 0xED, 0xDE, 0x09, 0x03, 0x20, 0x67, 0x9E, 0x06, 0x69, 0x7A, 0xDE, 0xA6, 0x8D, 0x6F, 0x5C, - 0x78, 0x9E, 0xE3, 0x65, 0x5B, 0x1B, 0xA6, 0xEF, 0x5A, 0xDA, 0xCB, 0x11, 0x13, 0xEF, 0x64, 0xE6, - 0xA7, 0x3B, 0x96, 0x03, 0x33, 0xF7, 0xB8, 0x91, 0xF9, 0xA2, 0x0B, 0x6C, 0xAE, 0xEA, 0x9B, 0x7F, - 0xC0, 0xB0, 0xFE, 0x40, 0xB3, 0x2C, 0xEE, 0xCD, 0x18, 0xBC, 0x13, 0xEA, 0x3A, 0x82, 0xA7, 0xC8, - 0xF0, 0x3D, 0x8F, 0x8F, 0x20, 0xC4, 0xD4, 0x09, 0xC4, 0x2F, 0x3C, 0x49, 0x6C, 0xBB, 0x77, 0x2C, - 0x63, 0xCA, 0xAE, 0x3E, 0x57, 0xA9, 0x8F, 0xEC, 0xE4, 0xA6, 0xEC, 0x0E, 0xFE, 0x23, 0xA6, 0x7E, - 0xC4, 0x5A, 0xF5, 0x7F, 0x9C, 0xDA, 0xB5, 0xE8, 0xA5, 0x59, 0x9F, 0xDA, 0x7B, 0x73, 0x3A, 0xDA, - 0x45, 0xBD, 0xEC, 0x4D, 0xEF, 0x65, 0x6F, 0x6A, 0x2F, 0x5A, 0x10, 0x00, 0xCB, 0xCE, 0x76, 0xE0, - 0x3A, 0x11, 0x5D, 0x69, 0xF7, 0x40, 0x2B, 0x61, 0x90, 0xDD, 0x84, 0x3F, 0xAA, 0xA6, 0x6D, 0xF0, - 0xE7, 0x23, 0xD6, 0xA8, 0xD7, 0xB3, 0xC4, 0x23, 0x89, 0xA6, 0x31, 0x0A, 0x1C, 0x38, 0xD9, 0xAA, - 0x12, 0x40, 0x07, 0xF5, 0x71, 0x5F, 0xD3, 0xB4, 0x03, 0xC7, 0x05, 0x92, 0xCB, 0x4E, 0x5A, 0xF2, - 0x46, 0xC9, 0x0B, 0x3F, 0xEF, 0x4A, 0x41, 0x00, 0x3E, 0xDE, 0x3B, 0xC6, 0x4B, 0x74, 0x54, 0x18, - 0xE6, 0x23, 0xD3, 0x91, 0xF5, 0x7E, 0xA9, 0xE0, 0xA1, 0xAB, 0x01, 0xFA, 0x78, 0x15, 0x66, 0x1A, - 0x5F, 0x2A, 0x72, 0xA5, 0x57, 0xF0, 0xB8, 0x92, 0x60, 0xA6, 0xD4, 0x42, 0xB3, 0xCC, 0x9E, 0xFD, - 0xA5, 0x42, 0x13, 0xAF, 0x44, 0xED, 0x65, 0x83, 0xE4, 0xCB, 0xD4, 0xC0, 0x1C, 0xF4, 0xB2, 0x1D, - 0x5E, 0x9A, 0x16, 0xFF, 0x06, 0x87, 0x7F, 0x65, 0x78, 0x46, 0x9D, 0x8A, 0x6F, 0x9B, 0x7F, 0x3B, - 0xEB, 0xD3, 0xAA, 0x7A, 0x35, 0xD7, 0xEE, 0x55, 0x60, 0x24, 0x90, 0x02, 0xE4, 0x77, 0xCC, 0xE2, - 0x8F, 0xDC, 0xAA, 0x1C, 0x03, 0x87, 0x77, 0x35, 0x3B, 0xD9, 0x67, 0x9B, 0x7B, 0x3A, 0x9C, 0x2E, - 0x95, 0xF4, 0xC8, 0x84, 0xFC, 0x62, 0x6E, 0x84, 0x99, 0x30, 0x1A, 0x42, 0xE3, 0x4B, 0x25, 0xA2, - 0x17, 0x49, 0x2E, 0x95, 0xE3, 0x7F, 0x39, 0xF8, 0x08, 0xA0, 0x82, 0x4E, 0x93, 0x0B, 0xDD, 0x85, - 0x95, 0x46, 0x60, 0x92, 0x9F, 0xA7, 0x02, 0x2D, 0xD3, 0x39, 0x31, 0xAA, 0xE4, 0x16, 0x11, 0x76, - 0x0E, 0x77, 0x54, 0x6C, 0xA8, 0x80, 0xB5, 0xC7, 0x41, 0x22, 0xBB, 0xB2, 0xDB, 0x9E, 0x83, 0xE4, - 0x9D, 0x02, 0xF7, 0xFD, 0xF1, 0x2D, 0x7E, 0x19, 0x00, 0x44, 0x3E, 0xEF, 0xDE, 0x1F, 0x7F, 0xBE, - 0xF7, 0xE8, 0x7F, 0x94, 0xAB, 0x84, 0x58, 0xC4, 0x4C, 0x1F, 0x58, 0x0B, 0x1E, 0xF1, 0x08, 0x34, - 0xD6, 0xB6, 0x90, 0x9B, 0xB3, 0x27, 0xCD, 0x0C, 0x6A, 0xB5, 0xDA, 0x12, 0xA7, 0x8F, 0x82, 0xA2, - 0xC5, 0x03, 0x3E, 0x6E, 0xF6, 0xEC, 0x1C, 0x7A, 0x9B, 0x30, 0xFD, 0xBE, 0xE6, 0x03, 0x53, 0x7F, - 0x62, 0xD4, 0xC9, 0x92, 0x26, 0xDC, 0x35, 0xBD, 0xC1, 0x13, 0x08, 0x15, 0x3F, 0x5C, 0xCB, 0xD1, - 0x8C, 0x09, 0x33, 0xCF, 0xCE, 0xF9, 0x52, 0x36, 0x62, 0xA1, 0x6B, 0x68, 0x01, 0x07, 0xBE, 0x2A, - 0x9A, 0xD5, 0x58, 0x7A, 0x33, 0xC4, 0x62, 0xA2, 0x0D, 0x51, 0x5F, 0xD0, 0x71, 0x92, 0xD1, 0x24, - 0xC9, 0x0C, 0x51, 0x1B, 0x17, 0x1C, 0xB7, 0x00, 0xD9, 0x77, 0x50, 0x6D, 0x34, 0x41, 0x7E, 0x43, - 0xDA, 0x8A, 0x49, 0xC8, 0x0B, 0x1E, 0xAA, 0x3E, 0xCA, 0xDA, 0x09, 0xD2, 0x49, 0x09, 0xE2, 0x3F, - 0x9B, 0x97, 0xA6, 0x90, 0xC6, 0x51, 0xF4, 0x4B, 0xCD, 0x28, 0x07, 0xC0, 0x13, 0x20, 0x6E, 0x4C, - 0x06, 0xF1, 0x00, 0x1A, 0xB5, 0xB5, 0x1E, 0x57, 0x5E, 0x96, 0xE7, 0x3C, 0x8D, 0xEC, 0xE9, 0xBD, - 0xE5, 0xE8, 0x0F, 0x7F, 0x4E, 0x77, 0x31, 0xA3, 0x1B, 0x71, 0x06, 0x21, 0x27, 0xCF, 0x32, 0x22, - 0xFC, 0x87, 0x50, 0xB8, 0x00, 0x21, 0xE9, 0xE5, 0xA9, 0xCF, 0x61, 0x27, 0xA3, 0x2D, 0x3D, 0x4A, - 0xB0, 0x14, 0x80, 0x62, 0xF4, 0xF8, 0xAF, 0xDC, 0xF3, 0x81, 0xA9, 0x4F, 0xE6, 0x1B, 0x8F, 0xF5, - 0x5A, 0x5D, 0x32, 0x0E, 0xC4, 0x90, 0xD1, 0xF1, 0x86, 0xDD, 0xF6, 0x6C, 0xDF, 0x57, 0xEE, 0xF7, - 0xEB, 0xB7, 0x4E, 0x27, 0x31, 0xB9, 0xC4, 0x30, 0x6C, 0xD6, 0x38, 0x02, 0x0F, 0x4F, 0xEF, 0xAE, - 0xCE, 0x27, 0x77, 0x7F, 0x2E, 0x70, 0xF5, 0xD4, 0x0A, 0x79, 0x00, 0x68, 0xDA, 0x67, 0x57, 0xE7, - 0x70, 0x34, 0xC3, 0x3F, 0xD5, 0x41, 0x74, 0x07, 0xA4, 0x31, 0xD3, 0x06, 0x2A, 0xF0, 0xAF, 0xAF, - 0x7F, 0x9A, 0x3C, 0xD0, 0xF5, 0x75, 0xFF, 0x68, 0xB4, 0x9F, 0x0C, 0x60, 0xB8, 0x63, 0x70, 0x10, - 0xCF, 0xAF, 0xB5, 0x60, 0x72, 0x47, 0x7B, 0x00, 0x81, 0x4F, 0xF5, 0xE6, 0xA7, 0xBD, 0x8F, 0x9F, - 0xE4, 0x1C, 0x77, 0x94, 0xFB, 0x9D, 0x06, 0xE8, 0x6A, 0xA3, 0xBE, 0x5F, 0x6B, 0x1C, 0xEE, 0xD7, - 0xF7, 0x3F, 0x1E, 0x34, 0xF2, 0xF6, 0x7C, 0x62, 0x4D, 0x99, 0x71, 0x63, 0xFF, 0x00, 0xE6, 0x7C, - 0x18, 0x4D, 0x97, 0x6D, 0x9F, 0xB4, 0xCF, 0x3E, 0x8C, 0x81, 0xA9, 0x1A, 0xF6, 0x24, 0x00, 0x7E, - 0x71, 0x76, 0x71, 0x39, 0x79, 0x58, 0xFC, 0x76, 0x26, 0xC8, 0xB9, 0xCE, 0xBB, 0xBF, 0x4C, 0x03, - 0x4A, 0xF3, 0xB0, 0xDE, 0xAC, 0x1F, 0xD4, 0xF6, 0x0F, 0x0E, 0x55, 0x61, 0x82, 0x5D, 0xFE, 0x3A, - 0xA5, 0xCB, 0xBD, 0x8F, 0x8D, 0x83, 0xC3, 0xFA, 0x5E, 0x6D, 0xAF, 0xDE, 0xCA, 0xD3, 0xE5, 0x6F, - 0xD3, 0x50, 0xE2, 0xF0, 0xE0, 0xE0, 0x60, 0xBF, 0xB6, 0x77, 0xB8, 0x37, 0x72, 0x76, 0xCF, 0x84, - 0x6E, 0x9A, 0xDF, 0x4D, 0x78, 0xD2, 0xF7, 0x22, 0xA6, 0x32, 0x08, 0xAA, 0xF5, 0x11, 0x21, 0x68, - 0x94, 0x1D, 0xD2, 0x89, 0x33, 0x86, 0x5B, 0xFD, 0xA9, 0x5A, 0x65, 0xD5, 0xE8, 0x1F, 0x83, 0x53, - 0xBE, 0x0B, 0xF2, 0x0F, 0x3B, 0x73, 0xEC, 0xAE, 0xD9, 0x4B, 0x7C, 0x51, 0xAD, 0x1E, 0x8F, 0x61, - 0x73, 0x72, 0x0A, 0x06, 0xDC, 0x04, 0xE1, 0x0A, 0xD6, 0xD3, 0xDC, 0x6A, 0x73, 0x1C, 0x67, 0xFB, - 0x2C, 0x6E, 0x37, 0xB1, 0x30, 0x16, 0xD8, 0x0C, 0xFE, 0xAF, 0xBA, 0x9E, 0x09, 0x13, 0x7C, 0x61, - 0xC3, 0xCB, 0xBA, 0x60, 0xCF, 0xAE, 0x98, 0x84, 0x98, 0x43, 0x85, 0x05, 0x2F, 0x2E, 0x2C, 0x45, - 0x74, 0x51, 0x61, 0x70, 0xBC, 0x69, 0x55, 0xD1, 0x82, 0x8E, 0x1B, 0x4B, 0x73, 0x7D, 0x5E, 0x19, - 0xBF, 0x5F, 0xE2, 0x5D, 0xBA, 0xD6, 0x7F, 0xA9, 0xFC, 0x43, 0xF4, 0x72, 0x3B, 0xDD, 0xBD, 0xE6, - 0x99, 0x5A, 0x95, 0x3F, 0xC3, 0x5E, 0x18, 0x1C, 0x8F, 0x5F, 0xCD, 0x82, 0xFE, 0xC4, 0x53, 0x3C, - 0x5F, 0x3C, 0xC7, 0xF2, 0x87, 0x03, 0xA5, 0xDB, 0x1E, 0x8F, 0x1F, 0x36, 0x0D, 0xC4, 0xD0, 0xD3, - 0x48, 0xF9, 0xF0, 0xD9, 0x4C, 0x2D, 0x0E, 0xD5, 0x06, 0xC3, 0x63, 0x93, 0x94, 0x08, 0xA8, 0x4F, - 0x60, 0xF7, 0x26, 0xCB, 0xE8, 0x19, 0xF0, 0x3C, 0x34, 0xC7, 0x22, 0x90, 0x80, 0xC9, 0x04, 0xF4, - 0x99, 0xB4, 0x59, 0xD1, 0x52, 0xD8, 0xE0, 0x1E, 0x76, 0x4B, 0x52, 0xB0, 0xE2, 0xEA, 0x52, 0xFD, - 0x68, 0x9E, 0xC1, 0xF0, 0x47, 0x15, 0x65, 0xF6, 0x51, 0xCC, 0x1A, 0xD7, 0xA6, 0xEB, 0x78, 0x03, - 0xA9, 0x35, 0x00, 0xB4, 0x6D, 0x4E, 0x02, 0x60, 0x02, 0x88, 0x47, 0x93, 0xDF, 0x10, 0xD4, 0x28, - 0x7B, 0x0E, 0x02, 0x89, 0x1A, 0xF7, 0x7E, 0x15, 0x68, 0x51, 0xE7, 0x03, 0xD2, 0xD1, 0x89, 0x5B, - 0xC0, 0xE4, 0x3E, 0x48, 0xF3, 0x80, 0xBA, 0x3F, 0x90, 0x46, 0xB8, 0xC5, 0xF5, 0x80, 0x69, 0x4C, - 0xEE, 0x10, 0x03, 0x84, 0x80, 0xBB, 0x3E, 0xB7, 0x19, 0x0C, 0x00, 0xA7, 0x39, 0x93, 0x92, 0xAE, - 0x0F, 0xF8, 0x0A, 0xCF, 0xB5, 0x20, 0x7A, 0xB1, 0xC6, 0x4E, 0x02, 0x21, 0x21, 0xEE, 0x24, 0xA5, - 0xAD, 0x27, 0x13, 0xCE, 0xFA, 0x10, 0xE0, 0xEC, 0x53, 0xC7, 0xDC, 0x18, 0xBE, 0x1F, 0x21, 0x88, - 0xDE, 0xD7, 0xEC, 0x1E, 0xF7, 0x19, 0x0A, 0x6E, 0xBE, 0xF6, 0x08, 0xAF, 0x3C, 0xD1, 0x78, 0x70, - 0x69, 0xEE, 0x76, 0x39, 0xEA, 0xA4, 0xE2, 0xC9, 0x80, 0xEC, 0x16, 0xF7, 0x03, 0x77, 0x7C, 0x7A, - 0x6F, 0xAB, 0x03, 0x6D, 0xD2, 0x58, 0xB6, 0x85, 0x2F, 0xBA, 0x30, 0x19, 0x9F, 0x1B, 0xB5, 0x69, - 0xE0, 0x1D, 0x01, 0x20, 0x21, 0x9D, 0x69, 0x77, 0x9D, 0xAA, 0x6E, 0x7A, 0x3A, 0x8C, 0x18, 0xF0, - 0xE7, 0x20, 0x26, 0xD1, 0x81, 0x8F, 0xBB, 0x35, 0x91, 0x97, 0x65, 0x78, 0xDA, 0x04, 0x44, 0x18, - 0xE1, 0x62, 0x0A, 0x68, 0x82, 0x92, 0xD7, 0xF1, 0x2C, 0x1C, 0x18, 0xCF, 0x86, 0x53, 0x37, 0xE7, - 0x98, 0xFD, 0x4D, 0x05, 0x88, 0x69, 0xBB, 0x61, 0x20, 0x19, 0x8E, 0xA7, 0x19, 0xA6, 0x53, 0x91, - 0x7A, 0x60, 0xB9, 0x0D, 0xB7, 0xE2, 0xD9, 0xA3, 0x06, 0xD2, 0xC9, 0x97, 0x4A, 0x7D, 0x66, 0x7F, - 0x96, 0x76, 0xCF, 0xAD, 0x24, 0xD9, 0xD7, 0xE9, 0x66, 0x79, 0x2C, 0x11, 0x00, 0x4E, 0x75, 0x7A, - 0x63, 0x5E, 0x88, 0xBE, 0x11, 0x78, 0x36, 0xF2, 0xC3, 0xB3, 0x21, 0xE0, 0xD9, 0x68, 0xB6, 0xF6, - 0xF6, 0x0F, 0x3E, 0x1E, 0x7E, 0xAA, 0x0F, 0x3F, 0x6D, 0x60, 0x9B, 0x84, 0x6D, 0x33, 0x3F, 0x6C, - 0x9B, 0x02, 0xB6, 0x1B, 0x38, 0x26, 0xE1, 0xD8, 0xCA, 0x0F, 0xC7, 0xD6, 0x06, 0x8E, 0xA3, 0x70, - 0xDC, 0xCB, 0x0F, 0xC7, 0xBD, 0x0D, 0x1C, 0x47, 0xE1, 0xB8, 0x9F, 0x1F, 0x8E, 0xFB, 0x1B, 0x38, - 0x8E, 0xC2, 0xF1, 0x20, 0x3F, 0x1C, 0x0F, 0x36, 0x70, 0x1C, 0x85, 0xE3, 0xC7, 0xFC, 0x70, 0xFC, - 0x58, 0x2A, 0x1C, 0x4B, 0x85, 0xA4, 0x98, 0x2B, 0x34, 0x88, 0x27, 0x2B, 0x2C, 0x03, 0xD1, 0x45, - 0x36, 0x69, 0xFC, 0x91, 0xAA, 0xCF, 0x16, 0x7D, 0xD8, 0xA3, 0x9F, 0x34, 0x12, 0xF5, 0x11, 0x8B, - 0x7C, 0xD3, 0x81, 0x83, 0xBD, 0x1F, 0x29, 0x00, 0x22, 0x7D, 0x9D, 0xC3, 0x61, 0x0F, 0x69, 0xC0, - 0x8F, 0xB9, 0x76, 0x13, 0x25, 0xFC, 0x4A, 0x0A, 0x2A, 0xF2, 0xC2, 0x9B, 0xBA, 0x86, 0x8B, 0xDD, - 0x99, 0xD1, 0xAD, 0x9B, 0x6D, 0x41, 0xA6, 0xC8, 0xB8, 0xF3, 0x84, 0x79, 0x12, 0x37, 0xDA, 0x9D, - 0xBA, 0xC9, 0x93, 0xE9, 0x61, 0x74, 0xA8, 0x33, 0xBA, 0x41, 0xDD, 0xC0, 0x7D, 0x07, 0xD5, 0xB9, - 0xE9, 0xE1, 0xA4, 0x41, 0x72, 0xDA, 0x80, 0x0B, 0x41, 0x9A, 0x51, 0xFD, 0x8B, 0xB4, 0x54, 0xEF, - 0xAB, 0x90, 0x9B, 0x54, 0x95, 0xA4, 0x95, 0x1E, 0x64, 0x4E, 0x0A, 0x6C, 0xB2, 0x57, 0x48, 0x44, - 0xAA, 0x4C, 0xD2, 0xA6, 0x8C, 0x45, 0xCA, 0x19, 0x57, 0x60, 0xB2, 0x32, 0xDB, 0x67, 0xE8, 0x3E, - 0x31, 0x32, 0xD0, 0xF6, 0x87, 0x8A, 0x34, 0x94, 0xC8, 0x07, 0x13, 0xF4, 0x0E, 0x8B, 0xBA, 0x9E, - 0x27, 0xAE, 0xE8, 0x62, 0x1A, 0xD9, 0xFB, 0x34, 0xDE, 0xC7, 0xBB, 0x9A, 0x1E, 0x38, 0xB0, 0x78, - 0x83, 0x77, 0xB5, 0xD0, 0x0A, 0xFC, 0x99, 0x77, 0xDF, 0xC5, 0xDC, 0x7F, 0x67, 0x72, 0xA9, 0x1C, - 0x18, 0xEE, 0x25, 0xF6, 0xE0, 0xC6, 0xEF, 0x95, 0x89, 0xDC, 0x63, 0x55, 0x44, 0x63, 0xDF, 0xCE, - 0xA8, 0x07, 0x49, 0xF7, 0xBF, 0x54, 0xDD, 0xE0, 0x20, 0x00, 0x8E, 0x9A, 0x54, 0x10, 0x96, 0xAD, - 0x0D, 0xC4, 0x25, 0x15, 0x52, 0x05, 0x26, 0x1A, 0x4E, 0xD8, 0x80, 0x04, 0xB4, 0x32, 0x4A, 0x40, - 0x34, 0xB8, 0xBC, 0xBE, 0x06, 0x30, 0xAD, 0xFC, 0x9B, 0xBE, 0x9E, 0xC9, 0x9A, 0x3F, 0xE6, 0x06, - 0xD5, 0xC6, 0x0C, 0xF5, 0x1F, 0x19, 0xDD, 0xB8, 0xE6, 0x87, 0x1E, 0x11, 0xFE, 0xAD, 0x16, 0xF0, - 0x2B, 0x3C, 0x88, 0xA6, 0x51, 0xE9, 0xCD, 0xF0, 0x7D, 0x86, 0x0D, 0x8E, 0xD4, 0xCE, 0xC3, 0x19, - 0xDC, 0x79, 0xC2, 0xF1, 0xD9, 0x24, 0x4E, 0xD9, 0x68, 0x22, 0xA1, 0xB7, 0xD8, 0x90, 0xD9, 0x2B, - 0xB1, 0x91, 0x84, 0x94, 0x90, 0x59, 0xE4, 0x4F, 0x7F, 0xA4, 0x2C, 0xA3, 0x49, 0x79, 0xE0, 0xCA, - 0x9E, 0xDD, 0x33, 0xFE, 0xFB, 0xE9, 0x8F, 0x23, 0xB5, 0x17, 0xCB, 0xE4, 0xB7, 0x19, 0xBE, 0x7B, - 0xD7, 0xE7, 0xCC, 0x0E, 0x07, 0xF7, 0xDC, 0x63, 0x4E, 0x97, 0x91, 0x0F, 0x09, 0x20, 0xB3, 0x8F, - 0x8A, 0x48, 0xCB, 0xD1, 0x05, 0x66, 0xFF, 0xE7, 0x7F, 0xFC, 0xEF, 0xAE, 0xF9, 0xCC, 0xFD, 0xFF, - 0xFC, 0x8F, 0xFF, 0xC3, 0x5C, 0x78, 0xD1, 0xE7, 0x80, 0xC3, 0x46, 0x8D, 0x9D, 0xD8, 0x2F, 0x41, - 0xDF, 0xB4, 0x7B, 0x4C, 0xBB, 0x77, 0x1E, 0x39, 0xDB, 0xFB, 0xE9, 0x0F, 0x90, 0x41, 0x5F, 0x00, - 0x7D, 0x50, 0x35, 0x3A, 0xB4, 0xF2, 0xC1, 0xCB, 0x3D, 0xEE, 0x53, 0x4F, 0x40, 0x7D, 0xBB, 0xD4, - 0x73, 0x0F, 0x5D, 0x2D, 0xD0, 0x81, 0x48, 0xF7, 0x38, 0xAC, 0x4D, 0x37, 0xB9, 0x5F, 0x63, 0xDF, - 0x1C, 0x40, 0x05, 0x86, 0x33, 0x4A, 0xC0, 0x9A, 0x79, 0x68, 0xF4, 0x36, 0x7D, 0x72, 0x32, 0xF3, - 0xC8, 0xBD, 0x0C, 0x4F, 0x85, 0x06, 0x0C, 0x46, 0x9A, 0x52, 0xD3, 0x66, 0xA7, 0xE8, 0x79, 0x30, - 0x70, 0x0C, 0x5E, 0x63, 0xE7, 0xE2, 0x90, 0x38, 0xC2, 0xC9, 0xD4, 0xD8, 0xB5, 0x39, 0x30, 0xD1, - 0xFB, 0xA7, 0x56, 0xAF, 0xD7, 0x1B, 0xCD, 0x26, 0xB5, 0xAB, 0xC3, 0x17, 0x2A, 0x5B, 0xBF, 0xD8, - 0x93, 0x44, 0xF9, 0x44, 0x19, 0xBE, 0x38, 0x4B, 0x72, 0x54, 0x39, 0x7F, 0x26, 0x90, 0x88, 0x10, - 0x69, 0xF7, 0x0B, 0x51, 0x48, 0x52, 0xEA, 0x14, 0x88, 0x34, 0x56, 0xEE, 0x4C, 0x98, 0x24, 0x46, - 0x09, 0x49, 0x65, 0x1C, 0x77, 0x7C, 0xDB, 0xC2, 0xC2, 0xE8, 0x6C, 0x19, 0x31, 0x31, 0x74, 0xCA, - 0xC8, 0x4F, 0x50, 0x42, 0xD3, 0x1C, 0xAE, 0xA9, 0x0E, 0xE3, 0xF0, 0xC1, 0xB1, 0xE3, 0x7D, 0xDE, - 0x85, 0x5F, 0x62, 0xC8, 0x55, 0x61, 0x51, 0x1D, 0xAE, 0x57, 0x8E, 0x3B, 0x44, 0xAC, 0x3E, 0xBB, - 0xE7, 0xC1, 0x13, 0x07, 0x7A, 0x49, 0xBC, 0xE3, 0xAF, 0x1C, 0xFB, 0x99, 0x32, 0xD7, 0x1A, 0x30, - 0x06, 0xE0, 0x02, 0x02, 0xDD, 0x4C, 0x74, 0xD5, 0x04, 0xAE, 0x60, 0x03, 0x4F, 0x00, 0xDA, 0x87, - 0xA6, 0xC1, 0x38, 0xAE, 0x81, 0x66, 0x1E, 0x78, 0x15, 0xD8, 0x51, 0x37, 0xB4, 0x04, 0xBB, 0x08, - 0xB4, 0x07, 0xE2, 0x58, 0xA9, 0x97, 0x39, 0xBA, 0x66, 0xB0, 0x2E, 0x7F, 0x8A, 0x67, 0xA0, 0xE9, - 0x9E, 0xE3, 0xC3, 0x2F, 0x60, 0x55, 0xF0, 0x36, 0xBC, 0xF8, 0xC8, 0x5F, 0xD8, 0x76, 0x73, 0xEF, - 0x5F, 0x58, 0xDF, 0x09, 0x3D, 0xFF, 0x43, 0x19, 0xCC, 0x2A, 0xE6, 0x4E, 0x0D, 0x7C, 0xE7, 0xB0, - 0xF1, 0xE9, 0x20, 0x1A, 0x1E, 0x18, 0x14, 0xC1, 0x5C, 0x1D, 0x9C, 0x09, 0x9F, 0xB3, 0x0D, 0x8F, - 0x2A, 0x9F, 0x47, 0x11, 0x25, 0x15, 0x65, 0x52, 0xD0, 0xB8, 0x14, 0x2E, 0x55, 0xE4, 0xFB, 0xC2, - 0xB7, 0x60, 0xE1, 0xD4, 0xF3, 0x62, 0x6B, 0x03, 0x53, 0xBF, 0x01, 0x6C, 0xB5, 0xCE, 0x3D, 0xC7, - 0x15, 0x02, 0xAB, 0x9A, 0x52, 0x25, 0xD9, 0xB6, 0x32, 0x76, 0x2F, 0x0F, 0x46, 0x14, 0x29, 0xE7, - 0xA2, 0x0D, 0xA3, 0x46, 0x47, 0x4B, 0xBF, 0x83, 0x9E, 0x18, 0x7F, 0x0F, 0xFD, 0x20, 0x62, 0x2D, - 0x01, 0xF7, 0x6C, 0xCD, 0x62, 0x9A, 0xD5, 0x73, 0x3C, 0x33, 0xE8, 0x0F, 0x90, 0x48, 0x07, 0x5A, - 0xA0, 0xF7, 0xE9, 0x7B, 0xB8, 0x4A, 0x88, 0x9B, 0xAA, 0xE6, 0xBA, 0x70, 0xB7, 0x16, 0x82, 0x12, - 0xB7, 0x1F, 0x4D, 0xCF, 0xB1, 0x71, 0x70, 0xC9, 0xAE, 0xA4, 0x61, 0x99, 0x99, 0x03, 0xB8, 0xD1, - 0x3E, 0x72, 0xD1, 0xB7, 0xC7, 0x75, 0x6E, 0x02, 0x83, 0xD8, 0xF2, 0xC5, 0x30, 0x2E, 0x5C, 0x06, - 0x44, 0x07, 0xC0, 0xC8, 0x92, 0x3C, 0x4F, 0xDA, 0xA9, 0x43, 0xB4, 0xFB, 0x3A, 0x8F, 0xA6, 0x81, - 0xF6, 0x64, 0xE0, 0x1D, 0x1E, 0x70, 0x36, 0x5D, 0x0F, 0x89, 0xD7, 0x44, 0x1E, 0xC0, 0xE8, 0x49, - 0x0E, 0x48, 0x5E, 0x43, 0x3F, 0x3B, 0x1A, 0x31, 0x39, 0x10, 0x4E, 0x1D, 0x80, 0x15, 0xDA, 0x7E, - 0x68, 0x06, 0x18, 0x9C, 0xC2, 0x00, 0x48, 0x01, 0x42, 0x9E, 0x38, 0x11, 0xED, 0x18, 0x35, 0xE8, - 0xC1, 0xDB, 0xF6, 0xA4, 0x25, 0x21, 0x5F, 0xB3, 0xCC, 0x07, 0x6E, 0xA1, 0x5B, 0x07, 0x5A, 0xC5, - 0x41, 0xD0, 0x42, 0x8E, 0x86, 0x4C, 0x12, 0x78, 0x25, 0xCC, 0x3D, 0x1E, 0x0F, 0xA4, 0x44, 0xEC, - 0x1D, 0x04, 0x3B, 0xC1, 0x84, 0xE3, 0x59, 0x8A, 0x79, 0xEB, 0x2F, 0x2B, 0x7D, 0x87, 0x2F, 0xA0, - 0xA3, 0x93, 0x18, 0x3D, 0xDB, 0x2C, 0x2F, 0x3C, 0x11, 0x84, 0x96, 0x35, 0x4D, 0x22, 0x59, 0x82, - 0x4B, 0xB3, 0x28, 0x43, 0x92, 0x9F, 0xE0, 0x51, 0xB3, 0xD7, 0x48, 0xE3, 0x2C, 0x9B, 0x69, 0x28, - 0xB2, 0x86, 0x81, 0x69, 0x5F, 0x58, 0xFC, 0x51, 0x95, 0x2B, 0xDC, 0x00, 0x8E, 0x75, 0xFE, 0xCA, - 0xB0, 0x09, 0xE1, 0xE4, 0xF2, 0x19, 0x03, 0xCC, 0x00, 0x23, 0xBD, 0x18, 0x8F, 0xA6, 0x80, 0x68, - 0x6F, 0x70, 0x0C, 0x6D, 0xF0, 0x89, 0x76, 0x34, 0xA1, 0x10, 0xF0, 0x81, 0x22, 0x2D, 0xCB, 0x0C, - 0x48, 0x6F, 0x75, 0xCF, 0x51, 0xF0, 0x30, 0x04, 0x85, 0xC0, 0xFD, 0xA9, 0xF6, 0x5E, 0x71, 0x5E, - 0xF1, 0xF4, 0x95, 0x07, 0xAF, 0xC4, 0x0D, 0x35, 0xAD, 0xB4, 0x7C, 0x7B, 0x21, 0x1A, 0xE9, 0x25, - 0x50, 0xC1, 0xD9, 0xB7, 0xEF, 0x79, 0x88, 0xE0, 0x6C, 0xF7, 0x5B, 0xFD, 0xF5, 0x90, 0x7F, 0x88, - 0xDC, 0xE8, 0x32, 0xA5, 0x59, 0x22, 0x2C, 0x62, 0x2C, 0xA6, 0x0F, 0xAF, 0xE1, 0x07, 0xC6, 0x29, - 0xC8, 0xBE, 0x48, 0x22, 0xBF, 0x5D, 0x9C, 0x57, 0x2F, 0x3F, 0xB5, 0xE9, 0x38, 0x68, 0xD4, 0xE3, - 0xC7, 0x3F, 0x6E, 0x3E, 0x1D, 0xD6, 0x37, 0xA4, 0xA1, 0x48, 0x1A, 0x88, 0x30, 0xCA, 0x94, 0x01, - 0x2F, 0xAF, 0x0E, 0x61, 0xA0, 0xB2, 0x37, 0x52, 0x4A, 0xDA, 0x3E, 0x62, 0x12, 0x31, 0xD2, 0xB3, - 0x3E, 0xD7, 0x1F, 0x4E, 0x9D, 0x67, 0xEE, 0xAB, 0x92, 0x0D, 0xE9, 0x57, 0x93, 0x5D, 0x40, 0xCB, - 0xF4, 0xDF, 0x2A, 0x56, 0xB6, 0x72, 0xFD, 0x0B, 0xEF, 0x92, 0xB2, 0x16, 0x48, 0x49, 0xBA, 0xE6, - 0x92, 0x94, 0x05, 0x22, 0x11, 0xAC, 0x56, 0xC6, 0xA0, 0x82, 0xD8, 0x24, 0xDE, 0x41, 0xE9, 0x4C, - 0x90, 0x10, 0x1C, 0x1E, 0x9E, 0x03, 0x32, 0x18, 0x90, 0x8A, 0xE9, 0x5A, 0x7C, 0x48, 0x62, 0xF1, - 0x05, 0x34, 0xFE, 0x2A, 0x05, 0x35, 0xB8, 0x0C, 0x77, 0x9C, 0x01, 0x4F, 0x0A, 0x6A, 0x3E, 0x33, - 0x4C, 0x3D, 0x40, 0x89, 0x10, 0xE5, 0x38, 0x9B, 0x03, 0x39, 0xA2, 0x2F, 0x63, 0xE8, 0xA1, 0x50, - 0x09, 0xD3, 0xE0, 0x1E, 0x86, 0x53, 0xA4, 0xBB, 0xA1, 0xF9, 0xB8, 0xF8, 0x09, 0x29, 0x56, 0x88, - 0x0C, 0xE2, 0x72, 0x2C, 0xE4, 0xC0, 0xF4, 0xCB, 0xE4, 0xF4, 0x28, 0x74, 0x7B, 0x59, 0xD9, 0x12, - 0x16, 0x83, 0x42, 0x69, 0xD0, 0x77, 0x7C, 0x1E, 0x2F, 0x0D, 0xA4, 0x5A, 0xE8, 0x24, 0x92, 0x45, - 0x07, 0x62, 0xA9, 0xF7, 0x1C, 0xFF, 0x26, 0x6E, 0x61, 0x84, 0x1E, 0x7E, 0x8E, 0x45, 0x43, 0x5D, - 0xB3, 0xF4, 0x30, 0x5E, 0x5F, 0xCC, 0x41, 0xBE, 0xB6, 0x3B, 0x3B, 0xAC, 0x73, 0x7A, 0x02, 0x3F, - 0xBF, 0x5E, 0x7F, 0xFF, 0x76, 0xD2, 0x81, 0x0F, 0xA7, 0xDC, 0x3C, 0x77, 0xC2, 0x1D, 0xE2, 0x25, - 0x5F, 0x35, 0xCB, 0xB4, 0xB8, 0xB3, 0x6A, 0x1E, 0x91, 0x29, 0xFD, 0xF8, 0x38, 0x9C, 0x9D, 0xC3, - 0x88, 0x54, 0xE8, 0xE8, 0x49, 0xF0, 0x86, 0xD1, 0xE9, 0xBC, 0x16, 0x9F, 0xC0, 0xD9, 0x04, 0xA6, - 0x45, 0x41, 0x5C, 0xDC, 0xF6, 0x69, 0x32, 0xF2, 0x02, 0xE3, 0x57, 0xF2, 0x80, 0x40, 0x47, 0x3E, - 0x22, 0x98, 0x8C, 0xBA, 0xCE, 0x6C, 0xA4, 0x03, 0x79, 0xD8, 0x0A, 0x46, 0xC3, 0x6D, 0xA4, 0xE1, - 0xBB, 0xCC, 0xEC, 0x2A, 0xC7, 0x17, 0xF4, 0x9C, 0xE1, 0x17, 0x2C, 0xF9, 0x8D, 0xA2, 0xF6, 0x43, - 0xB0, 0xFC, 0xD1, 0xA1, 0xE9, 0x79, 0x64, 0x03, 0xA3, 0x47, 0xF7, 0xCE, 0x73, 0xEC, 0x7B, 0x21, - 0x58, 0xE7, 0x84, 0x29, 0x0D, 0xED, 0xBB, 0x59, 0x58, 0x12, 0x67, 0x45, 0x2B, 0xEF, 0xD2, 0xA5, - 0x86, 0x1F, 0xC8, 0x26, 0x10, 0x44, 0x7A, 0x62, 0x3A, 0x09, 0xB2, 0x16, 0x50, 0x34, 0xD6, 0xC1, - 0x98, 0xAB, 0x40, 0xE0, 0xAE, 0x63, 0xF1, 0x6B, 0x6E, 0xF7, 0x82, 0xFE, 0x74, 0xB3, 0xE1, 0xFC, - 0x24, 0x9C, 0x3D, 0x0E, 0x11, 0xC6, 0xED, 0x78, 0x74, 0x45, 0x05, 0xAC, 0x9A, 0xC8, 0x89, 0xDD, - 0x32, 0xD1, 0x2F, 0xDB, 0x1E, 0x7C, 0x78, 0x7D, 0x65, 0x31, 0x4D, 0xC8, 0x12, 0x13, 0x22, 0x8D, - 0xC5, 0x14, 0xFC, 0x6A, 0xD4, 0x0E, 0x07, 0x6F, 0xD6, 0xCC, 0x33, 0x9F, 0xD4, 0x59, 0x4C, 0xFA, - 0xCC, 0x20, 0x9A, 0xEA, 0x18, 0xEE, 0x98, 0xC6, 0x73, 0x69, 0x43, 0x95, 0x55, 0xC8, 0xCB, 0xD3, - 0x9A, 0xAA, 0x1D, 0x3E, 0x39, 0x0E, 0x9D, 0x6F, 0x81, 0x67, 0xBA, 0xC0, 0xD2, 0x31, 0xB6, 0x3C, - 0x3A, 0x6F, 0xBE, 0xDD, 0xDD, 0x5E, 0xB5, 0x99, 0x78, 0xA8, 0x20, 0xE0, 0xCE, 0x7F, 0xCC, 0xA4, - 0x26, 0xB1, 0x34, 0x51, 0x9A, 0xCE, 0x0D, 0xD4, 0x9C, 0x8A, 0xF5, 0xEA, 0x34, 0x3E, 0xCA, 0x98, - 0xA8, 0xFC, 0xC2, 0xA8, 0x69, 0xC0, 0x71, 0x10, 0xA7, 0x45, 0xD2, 0x17, 0x1C, 0x4A, 0xC8, 0x95, - 0x1A, 0x88, 0x8F, 0x3E, 0xC9, 0x9A, 0x3E, 0xF7, 0x30, 0x46, 0xA7, 0xC6, 0x7E, 0x75, 0x42, 0x2F, - 0x0A, 0xD8, 0x19, 0x84, 0x7E, 0x80, 0xD7, 0xD4, 0x27, 0x13, 0x0D, 0xD6, 0x22, 0x20, 0xD9, 0x43, - 0xF7, 0x32, 0xA6, 0x05, 0x0C, 0x6D, 0x7A, 0x81, 0x39, 0xE0, 0x49, 0xA9, 0xF3, 0xDC, 0xF4, 0xD5, - 0xCE, 0xA7, 0xD5, 0x0B, 0xB4, 0xC1, 0x1D, 0xB4, 0x87, 0x7B, 0x17, 0x39, 0xC0, 0x8C, 0x0D, 0x11, - 0x5B, 0x8C, 0x94, 0x99, 0x38, 0x9E, 0x92, 0x13, 0x81, 0x0D, 0xE2, 0xDE, 0x4F, 0x8E, 0xAF, 0xC2, - 0xF9, 0x67, 0x7A, 0x61, 0xEE, 0x8F, 0x1C, 0x57, 0xA2, 0xFF, 0xD9, 0x5D, 0xE3, 0x0C, 0x8E, 0x14, - 0x85, 0xB5, 0x49, 0xCE, 0x98, 0x07, 0xB9, 0xCD, 0x4E, 0x33, 0x1C, 0x32, 0xC7, 0xC3, 0x49, 0xDD, - 0xE4, 0x34, 0xB6, 0xFD, 0x52, 0xAC, 0x4E, 0x4B, 0xC7, 0xA0, 0x76, 0x3A, 0x67, 0xD7, 0x2B, 0x60, - 0x10, 0xCE, 0x60, 0xF9, 0x18, 0x34, 0xF3, 0x84, 0x1E, 0x0F, 0xA9, 0x39, 0x70, 0x08, 0xDB, 0xBF, - 0x4D, 0x1C, 0x82, 0x53, 0xC6, 0x7B, 0x5D, 0x1C, 0xC2, 0x19, 0xAC, 0x3E, 0x17, 0x22, 0x38, 0xCD, - 0x81, 0x41, 0xD8, 0xFE, 0xED, 0x62, 0x50, 0xFB, 0xE7, 0xF9, 0x70, 0x68, 0xD2, 0xC5, 0x2B, 0x0F, - 0x0E, 0xB1, 0xF6, 0xCF, 0xC5, 0xD1, 0xE8, 0xA3, 0x40, 0xE2, 0xA5, 0xA0, 0x11, 0x00, 0x6B, 0x4E, - 0x44, 0x6A, 0xFF, 0xFC, 0xD6, 0x50, 0xE9, 0xC6, 0x09, 0x6D, 0xB8, 0x17, 0x99, 0x76, 0x50, 0x29, - 0xC2, 0x6B, 0xA8, 0xB9, 0xCA, 0x71, 0x05, 0x03, 0xAC, 0x32, 0xAF, 0x49, 0x80, 0xA1, 0x10, 0x8A, - 0x0C, 0xDB, 0xBF, 0x5D, 0x04, 0x59, 0x14, 0xAF, 0xC9, 0x83, 0x43, 0x0A, 0xAF, 0xAD, 0x34, 0x33, - 0x4A, 0x41, 0x73, 0x4E, 0x4C, 0x5B, 0x3D, 0x66, 0x14, 0x6B, 0x21, 0x1A, 0xA9, 0x38, 0x21, 0x45, - 0xCC, 0x9B, 0xAE, 0x96, 0x48, 0x80, 0xE0, 0x0E, 0x93, 0x79, 0x0E, 0xCC, 0xE0, 0xEB, 0xD7, 0x93, - 0xCA, 0x71, 0xF4, 0x07, 0x83, 0xBF, 0xF0, 0x92, 0x2E, 0x98, 0xF5, 0x12, 0x34, 0xE1, 0x13, 0x26, - 0x34, 0x7B, 0x4F, 0x43, 0x9B, 0x7A, 0xE4, 0xC6, 0xF2, 0x55, 0xE2, 0x64, 0xB2, 0xD3, 0x09, 0x42, - 0x98, 0x3A, 0xEF, 0xF7, 0xD0, 0x44, 0x47, 0x2E, 0xF8, 0xD4, 0x0B, 0x2D, 0xCD, 0x1B, 0x1A, 0xC2, - 0x64, 0x9E, 0x37, 0xD2, 0x6B, 0x90, 0xA5, 0x0D, 0x9D, 0x49, 0xD9, 0x36, 0x82, 0x78, 0x20, 0xA2, - 0xE1, 0x3E, 0x30, 0x5F, 0xE6, 0x29, 0xC1, 0xEF, 0x45, 0x97, 0xF0, 0xCB, 0x66, 0x5A, 0x18, 0x38, - 0x03, 0x4C, 0x3A, 0xAB, 0x59, 0xD6, 0x8B, 0x8C, 0xA6, 0x92, 0x06, 0x41, 0xCD, 0xE3, 0x7E, 0xC0, - 0xB4, 0x47, 0xCD, 0xA4, 0xF4, 0xC4, 0x59, 0x35, 0xCA, 0x18, 0xDD, 0xC7, 0x9A, 0xC6, 0x59, 0x29, - 0xAA, 0x48, 0x24, 0x28, 0xD1, 0x41, 0xF3, 0x54, 0x44, 0x1C, 0x4D, 0x1B, 0x4F, 0x46, 0x32, 0xC5, - 0x86, 0x96, 0x1E, 0x0F, 0x64, 0x64, 0xE2, 0xB5, 0xE9, 0x07, 0xDB, 0x1F, 0x46, 0x42, 0xF6, 0x06, - 0x06, 0xFD, 0x92, 0xF9, 0x5D, 0x27, 0xC6, 0x3C, 0xCD, 0xD0, 0x89, 0x29, 0x04, 0x44, 0xCD, 0x8C, - 0x7D, 0xC2, 0x00, 0xB3, 0xE9, 0xC3, 0x14, 0x8C, 0x8D, 0xC2, 0x8E, 0x67, 0x6C, 0xA4, 0x84, 0x11, - 0x05, 0xF9, 0xF8, 0xC9, 0x08, 0x29, 0x68, 0x5B, 0x42, 0x90, 0xD4, 0x70, 0xCB, 0x67, 0x86, 0x2D, - 0x96, 0xAC, 0xA6, 0xFC, 0x76, 0x73, 0x71, 0x42, 0xE6, 0xE7, 0xDB, 0x93, 0x9F, 0x7F, 0xA1, 0x24, - 0x3F, 0x48, 0x65, 0xC1, 0x93, 0xC3, 0x06, 0x8E, 0x4F, 0x46, 0x89, 0x81, 0x63, 0x93, 0xC5, 0x1F, - 0x53, 0x8C, 0xA3, 0x31, 0x1E, 0xB6, 0xD2, 0x17, 0xFE, 0x9D, 0x02, 0x24, 0xF7, 0x61, 0x90, 0xB6, - 0xA3, 0xFB, 0xA1, 0x8B, 0xEF, 0xFA, 0xC2, 0xC1, 0x13, 0xA8, 0xDB, 0x66, 0x1F, 0xEB, 0x89, 0x74, - 0x41, 0xB2, 0xA1, 0x5F, 0x63, 0x17, 0x9A, 0xDE, 0x8F, 0xFB, 0x11, 0x1E, 0xE7, 0x82, 0x95, 0xCA, - 0xCD, 0x62, 0x4F, 0x7D, 0x73, 0xF8, 0x86, 0xC8, 0x41, 0x64, 0x48, 0xA2, 0x66, 0xDB, 0xF5, 0x0F, - 0x34, 0xF1, 0xBE, 0xF3, 0x04, 0xD3, 0x09, 0xD0, 0x41, 0x9D, 0x7C, 0xD8, 0x45, 0x6F, 0x94, 0xD4, - 0x53, 0x4E, 0x79, 0xBB, 0xC1, 0xBE, 0x00, 0xC6, 0x0F, 0xBF, 0x8C, 0xBF, 0xC1, 0x20, 0xA0, 0x06, - 0x7A, 0xFA, 0xEC, 0xB0, 0x7D, 0xF9, 0x8E, 0xF8, 0x4E, 0x7A, 0xD2, 0xEF, 0x33, 0x8A, 0x17, 0xFA, - 0x90, 0x60, 0x2A, 0x04, 0x30, 0x60, 0x61, 0x3B, 0xEC, 0x6B, 0x87, 0x7E, 0xDC, 0xE1, 0x8F, 0xBF, - 0x0A, 0x1B, 0xFE, 0xED, 0xCD, 0x99, 0x0C, 0xD6, 0xF1, 0x8F, 0x58, 0x1D, 0x0F, 0x92, 0x66, 0x7D, - 0x7D, 0x53, 0x1C, 0xCD, 0x8A, 0xC1, 0x9B, 0x41, 0x37, 0x53, 0x12, 0x71, 0x8D, 0xC9, 0xFD, 0xB6, - 0x3F, 0x36, 0xF5, 0xDB, 0xD8, 0x3E, 0x0B, 0x07, 0x2E, 0x27, 0x39, 0xE0, 0x68, 0xF0, 0xB2, 0x3D, - 0xE0, 0x9A, 0xDC, 0x66, 0x7F, 0x52, 0xE4, 0xB2, 0xA2, 0xAD, 0x2F, 0x66, 0xAF, 0x14, 0x20, 0x7B, - 0xE7, 0x74, 0x28, 0xEE, 0xC2, 0xB4, 0x7B, 0x51, 0xFF, 0xC3, 0x80, 0x65, 0xC0, 0x91, 0xF8, 0xDB, - 0x08, 0xCB, 0x7C, 0xD5, 0xF0, 0x65, 0xD5, 0x08, 0x84, 0x05, 0x41, 0x4C, 0x86, 0xBF, 0x2D, 0x08, - 0x68, 0xD7, 0xE9, 0xDE, 0x53, 0x20, 0x93, 0xDF, 0x15, 0x05, 0x98, 0x12, 0x9A, 0x25, 0x0E, 0x57, - 0x3C, 0x1B, 0x2B, 0x4B, 0xB0, 0xD3, 0xA9, 0x3C, 0x9F, 0xB4, 0x86, 0x4C, 0x18, 0x34, 0x85, 0xE7, - 0xBC, 0x6E, 0x18, 0xB4, 0x48, 0x30, 0xED, 0x2F, 0x2C, 0x49, 0xE2, 0x69, 0xA2, 0xEF, 0x5C, 0x47, - 0x7F, 0xA2, 0xE1, 0xA4, 0x0D, 0x41, 0x60, 0x8E, 0x49, 0x90, 0x5C, 0x39, 0x1E, 0x05, 0x61, 0xF4, - 0x2F, 0x01, 0xF1, 0x4C, 0x28, 0x35, 0x01, 0x61, 0xC5, 0x42, 0xA9, 0xA7, 0xC3, 0xA0, 0x70, 0x12, - 0x45, 0x1C, 0x42, 0x44, 0x99, 0x5D, 0xD9, 0x22, 0xEB, 0xCA, 0x6C, 0xE3, 0x6E, 0x2A, 0x6F, 0x4B, - 0x04, 0xAF, 0x3B, 0x78, 0xD8, 0x91, 0x1D, 0x45, 0xD9, 0x5C, 0xA2, 0xE7, 0xE9, 0x5B, 0xB2, 0x6C, - 0x38, 0xFB, 0x3A, 0x94, 0xD4, 0x4D, 0x8C, 0x0C, 0x71, 0x2C, 0x3E, 0x55, 0xAF, 0xEC, 0xA5, 0x7B, - 0x5D, 0x5E, 0x89, 0xA8, 0x3F, 0x17, 0x24, 0x28, 0x13, 0x50, 0x28, 0x0E, 0x57, 0x06, 0x21, 0x4B, - 0x63, 0x38, 0x51, 0xE6, 0xCB, 0xB0, 0x1A, 0xCA, 0x8E, 0x1D, 0xB0, 0x07, 0x9B, 0x4A, 0x7B, 0x04, - 0x14, 0xA5, 0x7C, 0xCF, 0x99, 0x73, 0x4F, 0x29, 0xA6, 0x41, 0x52, 0x7F, 0xC1, 0x18, 0x67, 0x3F, - 0x3A, 0x4F, 0x30, 0xCE, 0x19, 0x7B, 0x8E, 0x7A, 0xAC, 0x51, 0x98, 0x1F, 0xF5, 0x08, 0x3D, 0xA1, - 0x68, 0x43, 0xBE, 0xCE, 0x28, 0xF6, 0xD0, 0xCC, 0x45, 0x98, 0x8E, 0xF6, 0x80, 0xA2, 0x96, 0xEB, - 0x7A, 0xCE, 0x33, 0x10, 0x76, 0x80, 0x61, 0x32, 0x07, 0xF5, 0x38, 0xA0, 0xF0, 0x09, 0xA4, 0xA3, - 0xBE, 0x88, 0x91, 0xD1, 0x8C, 0x28, 0xD5, 0xA4, 0x98, 0x00, 0xCE, 0x16, 0xEF, 0x66, 0x5D, 0x98, - 0x59, 0xBC, 0x08, 0x1C, 0xCD, 0x60, 0x8E, 0x9D, 0x0D, 0x6C, 0x8C, 0xE2, 0x20, 0x07, 0x3C, 0xE8, - 0x3B, 0x06, 0x03, 0x49, 0xD0, 0xE4, 0x18, 0x57, 0xF4, 0xEF, 0xAD, 0xBA, 0x3E, 0x18, 0x13, 0x16, - 0x84, 0x62, 0x26, 0xDE, 0x0C, 0x1F, 0x81, 0xD5, 0xD4, 0xD8, 0x95, 0xAD, 0xC3, 0xF8, 0x7E, 0x14, - 0x1F, 0x14, 0xB9, 0x76, 0x7F, 0xBF, 0x47, 0xAB, 0xB9, 0x18, 0xF8, 0xCE, 0x1C, 0xF0, 0x28, 0x4E, - 0xFB, 0x56, 0x5C, 0x52, 0x0D, 0x0C, 0xD8, 0xB7, 0x19, 0xA6, 0x6F, 0x4E, 0xB8, 0x82, 0x9A, 0xA2, - 0x2F, 0x1E, 0xC7, 0xF4, 0xD0, 0x58, 0x24, 0xF5, 0x62, 0xB8, 0x11, 0x4C, 0xC1, 0xC4, 0x30, 0xA8, - 0x53, 0x8E, 0xA9, 0xF2, 0x87, 0x2F, 0x99, 0x7E, 0x34, 0x69, 0x83, 0xCC, 0xF1, 0x14, 0x61, 0x59, - 0x85, 0x57, 0x06, 0x71, 0x58, 0xB8, 0x8C, 0x18, 0xA2, 0x0C, 0x99, 0x98, 0x09, 0x83, 0x12, 0xCC, - 0x0F, 0x5D, 0xCA, 0xEB, 0x22, 0x2E, 0x6A, 0xBF, 0x56, 0x1F, 0x0C, 0xA5, 0xC6, 0x03, 0x12, 0x1B, - 0x3F, 0xD5, 0xEB, 0xFE, 0x0E, 0x6B, 0xD4, 0xE8, 0x0F, 0x7A, 0x61, 0x3D, 0xED, 0xF7, 0x11, 0x2B, - 0x78, 0x5D, 0xE3, 0xBD, 0x33, 0x44, 0x0B, 0x19, 0x45, 0x3C, 0x55, 0x4D, 0xDD, 0x68, 0x8E, 0x8B, - 0x5A, 0x40, 0x04, 0x53, 0xC8, 0x50, 0x93, 0xC0, 0x40, 0xF4, 0xC5, 0x60, 0xDB, 0xFE, 0x87, 0xE2, - 0xAA, 0xC4, 0x54, 0xAC, 0xA8, 0x4A, 0xC0, 0x54, 0x7E, 0x63, 0xEB, 0x18, 0xD8, 0xA8, 0x6B, 0x14, - 0x47, 0x1B, 0xBF, 0x09, 0xC5, 0x75, 0x62, 0x59, 0x6D, 0xC9, 0x7F, 0x4E, 0xA2, 0x78, 0xBF, 0xB9, - 0x94, 0xD7, 0x63, 0x30, 0x2B, 0x62, 0x4D, 0xB3, 0xFB, 0x25, 0xDE, 0xD5, 0x3A, 0x67, 0x9D, 0x00, - 0xB8, 0x06, 0x9E, 0xC9, 0x31, 0x1F, 0x9B, 0xDD, 0x16, 0xDD, 0x1E, 0xE7, 0xC0, 0x42, 0xC2, 0x3F, - 0x89, 0x8A, 0xF7, 0x8A, 0xAE, 0xC9, 0x45, 0xB1, 0x70, 0x04, 0xE2, 0x85, 0xD0, 0x31, 0xDB, 0xCB, - 0x2A, 0x07, 0x2E, 0x8B, 0x8A, 0x1A, 0x70, 0x18, 0xCF, 0x2D, 0x30, 0x5D, 0x62, 0x2F, 0xA3, 0xD2, - 0x52, 0x9C, 0xBB, 0x76, 0x8C, 0xDC, 0x94, 0x53, 0x5E, 0x12, 0x23, 0x1C, 0xD3, 0xAF, 0xD4, 0x91, - 0x23, 0x2A, 0xC4, 0x1C, 0xB3, 0xED, 0xB3, 0xBE, 0x83, 0xD1, 0x13, 0x98, 0x48, 0x9F, 0x39, 0x0A, - 0xC6, 0xDF, 0xAF, 0xB2, 0x1A, 0xC0, 0x87, 0x28, 0xD9, 0xFC, 0x2B, 0x89, 0x5F, 0x49, 0xB1, 0x2B, - 0x48, 0x88, 0x49, 0xB1, 0xB0, 0x85, 0xD2, 0x07, 0x08, 0x5B, 0x54, 0x2E, 0x43, 0x08, 0x4E, 0x1C, - 0x8E, 0x7D, 0x10, 0x09, 0xE4, 0x52, 0xE3, 0x95, 0xB0, 0x44, 0xB5, 0x01, 0x14, 0x55, 0x84, 0x1F, - 0x20, 0x06, 0x28, 0xA7, 0x15, 0x65, 0x42, 0xFA, 0x18, 0x0C, 0xB8, 0x61, 0x0A, 0x31, 0xEB, 0x9E, - 0xF7, 0xCC, 0x28, 0x00, 0x9A, 0x7C, 0x00, 0x6F, 0xEF, 0xCE, 0x6E, 0x46, 0x15, 0xDC, 0x27, 0x52, - 0x74, 0x8B, 0x65, 0x23, 0xD3, 0x17, 0x82, 0x57, 0x2C, 0x07, 0x92, 0x3C, 0xD2, 0x6E, 0xB7, 0xD9, - 0xB6, 0x2B, 0xCA, 0xD9, 0xF8, 0x1C, 0xA4, 0xC4, 0xD0, 0x63, 0x41, 0x18, 0x38, 0x70, 0x27, 0xB2, - 0x3E, 0x50, 0x82, 0x6E, 0x7C, 0x2B, 0x23, 0x9F, 0x30, 0xAD, 0x07, 0x5D, 0xA0, 0x82, 0x1D, 0xE6, - 0x49, 0x0A, 0x3B, 0x3D, 0x16, 0x3F, 0x13, 0xB2, 0x4B, 0x54, 0x16, 0x65, 0xCB, 0x1F, 0xC2, 0x0D, - 0x73, 0x42, 0x38, 0xA1, 0x65, 0x70, 0x6F, 0x07, 0xAE, 0x41, 0x96, 0x03, 0xF8, 0xE5, 0xAC, 0xA9, - 0xD8, 0x42, 0xF0, 0x2D, 0x43, 0x66, 0x51, 0x09, 0xE4, 0x98, 0x44, 0xD4, 0x34, 0x09, 0x71, 0x4D, - 0x8B, 0xD0, 0x09, 0x29, 0x50, 0xD4, 0xAF, 0x90, 0xE9, 0x2D, 0x25, 0x06, 0xA4, 0xC8, 0xBC, 0xAE, - 0x7E, 0x46, 0x0D, 0xF9, 0x40, 0x11, 0x53, 0x1B, 0x31, 0x86, 0x69, 0xB3, 0xA4, 0x6A, 0x1A, 0x6C, - 0xF8, 0x85, 0x1F, 0xD1, 0xF6, 0xF8, 0x72, 0x1D, 0x39, 0x8F, 0xF9, 0xA8, 0xC6, 0xC5, 0xAC, 0x7D, - 0x5A, 0x68, 0x04, 0x43, 0xA2, 0x75, 0xAA, 0x40, 0x5A, 0xCA, 0xE7, 0xE0, 0x70, 0xE4, 0xD4, 0x57, - 0x74, 0x3A, 0x9F, 0xA8, 0x79, 0x0B, 0x7D, 0x82, 0x70, 0x02, 0xB4, 0x4A, 0xB9, 0x16, 0x73, 0x84, - 0x2A, 0xC4, 0xDA, 0xB8, 0xD1, 0xA1, 0x50, 0x13, 0x77, 0x8D, 0x1E, 0xCC, 0xB4, 0xBD, 0x97, 0x68, - 0xDE, 0xFB, 0xED, 0xE2, 0x5C, 0x51, 0x05, 0xB7, 0x08, 0xBB, 0x64, 0x86, 0xA1, 0xB7, 0x43, 0x99, - 0xFB, 0x42, 0x06, 0x2C, 0x8A, 0x79, 0x26, 0x98, 0x32, 0x66, 0xAB, 0x70, 0xE8, 0x0D, 0xC1, 0x48, - 0x7F, 0xD9, 0xFD, 0x75, 0xF7, 0x37, 0x04, 0x14, 0xF7, 0xD7, 0x33, 0xA5, 0x96, 0x7A, 0x14, 0xC1, - 0xB2, 0x88, 0x21, 0x95, 0x10, 0xAA, 0xA5, 0x8C, 0xF0, 0x59, 0xC6, 0x72, 0x21, 0x2A, 0xED, 0x4C, - 0xA2, 0xB0, 0x24, 0x49, 0xFD, 0x72, 0x94, 0x23, 0xE6, 0x44, 0x01, 0x62, 0x53, 0xAF, 0x64, 0x87, - 0x8B, 0x89, 0x4D, 0x49, 0xAC, 0x39, 0x5F, 0x5C, 0xCA, 0xB0, 0xE1, 0x52, 0x63, 0x52, 0xD6, 0x10, - 0x9B, 0x7E, 0x55, 0xC3, 0xA6, 0x5F, 0xDF, 0x12, 0x36, 0xFD, 0x5A, 0x14, 0x9B, 0x7E, 0xDD, 0x60, - 0xD3, 0x74, 0x6C, 0xFA, 0x4D, 0x0D, 0x9B, 0x7E, 0x7B, 0x4B, 0xD8, 0xF4, 0x5B, 0x51, 0x6C, 0xFA, - 0x6D, 0x83, 0x4D, 0xE3, 0xFD, 0x24, 0x41, 0xCE, 0x42, 0x79, 0x5E, 0x48, 0xF6, 0x2A, 0xF8, 0xA4, - 0x98, 0x83, 0xFD, 0x95, 0x51, 0x6A, 0x96, 0x43, 0x63, 0x72, 0xD9, 0xF9, 0x50, 0x2A, 0xD9, 0xF4, - 0xED, 0x20, 0x95, 0xD8, 0xCE, 0xB3, 0xC8, 0xE5, 0xE6, 0x07, 0x1A, 0x4E, 0x12, 0x62, 0xF7, 0x0A, - 0xE4, 0xB8, 0xA4, 0xC4, 0x69, 0xA8, 0x68, 0xE8, 0xA6, 0xC4, 0x69, 0xA9, 0x19, 0xA1, 0x6C, 0x18, - 0x20, 0x58, 0xFF, 0x1E, 0xC2, 0xF6, 0xC0, 0x02, 0x74, 0xC7, 0x7D, 0xD9, 0x75, 0xD1, 0xA9, 0x4F, - 0x2A, 0x51, 0x46, 0x44, 0xF0, 0xB5, 0x17, 0xBC, 0xF3, 0xE4, 0x89, 0x5C, 0x34, 0x43, 0xCA, 0x75, - 0xF1, 0xCA, 0x52, 0xD1, 0x1D, 0xD1, 0xEA, 0xA4, 0x5A, 0x91, 0xDF, 0xE4, 0x9B, 0x47, 0x62, 0xC7, - 0xA6, 0x97, 0x39, 0x1D, 0x3F, 0x68, 0x32, 0x5F, 0x5C, 0x47, 0xE8, 0x93, 0xCE, 0xB2, 0x45, 0x39, - 0x71, 0x52, 0x93, 0xBE, 0xC3, 0x2A, 0xEB, 0x58, 0x4A, 0x46, 0x1D, 0x49, 0x62, 0xA7, 0x97, 0xA8, - 0xBC, 0x6E, 0x6B, 0xBF, 0xAE, 0xE8, 0xF2, 0x12, 0x4F, 0xDB, 0xA1, 0xAC, 0x32, 0x89, 0xE2, 0x5F, - 0xD7, 0x52, 0xDB, 0x75, 0xC2, 0x92, 0x55, 0x3E, 0x59, 0xB2, 0x3E, 0x27, 0x4B, 0x55, 0xD6, 0x14, - 0x3D, 0x14, 0x1F, 0xB3, 0x39, 0x1C, 0xF3, 0x74, 0x59, 0x63, 0xB6, 0x68, 0xCC, 0xB3, 0x65, 0x0D, - 0xB7, 0x57, 0x39, 0x3E, 0xC1, 0x13, 0xED, 0xAE, 0xAF, 0x05, 0x57, 0xFE, 0x9D, 0xE3, 0x5C, 0x3B, - 0x76, 0xEF, 0xCE, 0x39, 0xE5, 0xE7, 0x02, 0x0F, 0x81, 0xAB, 0x4C, 0x9C, 0x49, 0xBE, 0xCC, 0xB2, - 0xC5, 0xA7, 0xAD, 0x90, 0x89, 0x70, 0x95, 0x85, 0x94, 0x11, 0x63, 0x54, 0x99, 0xCA, 0x28, 0xCD, - 0x30, 0xD2, 0xA2, 0x4B, 0xC9, 0x1A, 0x28, 0xD9, 0x3F, 0xAA, 0x9D, 0x4E, 0x0C, 0x23, 0xAF, 0x9E, - 0x69, 0x8A, 0xF7, 0x9A, 0xB6, 0xD8, 0x79, 0x47, 0x03, 0x44, 0xFA, 0xB2, 0xD2, 0x66, 0x6E, 0x70, - 0xAC, 0x9B, 0xBE, 0xD0, 0xB9, 0x0F, 0x87, 0xC0, 0xD9, 0x9F, 0xD3, 0x5F, 0xAB, 0xA3, 0xE1, 0x03, - 0x34, 0x00, 0x41, 0x63, 0x47, 0x24, 0xF7, 0xD7, 0x0C, 0x0A, 0x31, 0xD8, 0x21, 0x85, 0x5E, 0x5C, - 0x78, 0xC5, 0xE3, 0x3A, 0x9C, 0x20, 0x09, 0x31, 0x83, 0xDE, 0x16, 0xCB, 0x62, 0x66, 0xF0, 0xD6, - 0xF5, 0x7C, 0xE5, 0x98, 0xD0, 0x17, 0x60, 0xBE, 0xF8, 0xCA, 0x9D, 0xA9, 0xD6, 0x8B, 0xC6, 0x2A, - 0x58, 0x2F, 0x70, 0x92, 0xC7, 0x91, 0x39, 0xAF, 0x74, 0xA3, 0x45, 0x54, 0xFF, 0xBC, 0xA8, 0x81, - 0x69, 0xAD, 0xCD, 0x16, 0x5F, 0xE3, 0xC5, 0x0F, 0x4D, 0x17, 0xEA, 0x94, 0xA8, 0xC2, 0xED, 0x52, - 0xA6, 0x8B, 0x31, 0xC3, 0xC5, 0xE6, 0x8B, 0xEB, 0xEB, 0xBE, 0xFA, 0xC8, 0x6B, 0x60, 0xE6, 0x80, - 0xF5, 0x64, 0x2D, 0x1B, 0xF8, 0x68, 0x63, 0xD7, 0x28, 0x31, 0x4D, 0x19, 0x81, 0xF5, 0x5A, 0x0B, - 0xE8, 0xBE, 0x94, 0x2B, 0x49, 0xD9, 0x38, 0x3A, 0x9B, 0x54, 0x88, 0x0F, 0x06, 0x30, 0x83, 0xD0, - 0xC8, 0xA5, 0xE3, 0x29, 0x37, 0x8D, 0xD6, 0x0C, 0xDD, 0x4D, 0x0A, 0x0C, 0x05, 0xD4, 0x81, 0xB2, - 0xE9, 0x1B, 0xD3, 0xDD, 0x24, 0x51, 0x04, 0xAF, 0x30, 0x8B, 0xC5, 0x11, 0x18, 0x61, 0x1D, 0x90, - 0x24, 0x02, 0x44, 0x11, 0x2C, 0x91, 0x6D, 0xDF, 0x96, 0xDE, 0x58, 0x48, 0xF0, 0x01, 0x89, 0xA9, - 0x97, 0x58, 0x5C, 0x20, 0x18, 0xAB, 0xF4, 0xCD, 0xA9, 0x49, 0x9E, 0x14, 0xF7, 0x0C, 0xB2, 0xBB, - 0x18, 0x8A, 0x89, 0xB1, 0x72, 0x60, 0x4B, 0x5A, 0x5B, 0x94, 0x9E, 0xF2, 0x74, 0x7D, 0xD1, 0x5A, - 0x9B, 0xAE, 0xF3, 0xB7, 0x1E, 0xCB, 0x01, 0x4E, 0x2C, 0xC1, 0xC3, 0x2B, 0xB3, 0x89, 0x7B, 0x34, - 0x9B, 0xC1, 0x4F, 0x27, 0x17, 0xEA, 0xC7, 0xF5, 0x8D, 0xE6, 0x3D, 0xEC, 0xC2, 0x70, 0xEA, 0xB9, - 0x2D, 0x17, 0x25, 0x99, 0x24, 0xA4, 0x93, 0x9F, 0x38, 0xB6, 0x65, 0x27, 0x54, 0x51, 0xED, 0xC2, - 0xB2, 0x4C, 0xD7, 0x77, 0x4C, 0x23, 0xAE, 0x70, 0x04, 0x53, 0x8E, 0x0A, 0x21, 0x49, 0x21, 0x26, - 0x16, 0xD0, 0xF0, 0x9E, 0xA6, 0x49, 0xE0, 0x25, 0xDF, 0xC7, 0xE7, 0x03, 0xC7, 0x0E, 0xA9, 0x84, - 0x87, 0x0C, 0x28, 0xC0, 0x6D, 0xB2, 0x8D, 0x5C, 0xC2, 0xCD, 0xE2, 0x05, 0x9C, 0x5C, 0x42, 0x8E, - 0xBA, 0x1E, 0x79, 0x26, 0x13, 0xDF, 0xCB, 0x25, 0xE3, 0xE5, 0x37, 0xFE, 0xC5, 0x18, 0xAD, 0xBC, - 0x2C, 0x45, 0xB3, 0x93, 0xEA, 0x7B, 0xEE, 0xE8, 0x5C, 0x96, 0x51, 0x36, 0x6D, 0x3E, 0xCE, 0xA2, - 0x5A, 0xE9, 0x7A, 0x2F, 0x8F, 0x72, 0x7A, 0x72, 0xC5, 0x6B, 0xA4, 0x94, 0x74, 0xB9, 0xEB, 0x46, - 0x25, 0xA9, 0x4A, 0xC3, 0xCA, 0x40, 0xC0, 0x5D, 0x66, 0xE7, 0x52, 0xCE, 0x30, 0x36, 0x8A, 0x1D, - 0xD3, 0x2C, 0x1D, 0xDA, 0x22, 0xBF, 0xC1, 0xE4, 0x4E, 0x22, 0xCD, 0x39, 0x67, 0xF0, 0x88, 0x78, - 0x50, 0x91, 0x93, 0x65, 0x21, 0x37, 0xA3, 0xAB, 0x2E, 0x13, 0xA9, 0x3F, 0x8D, 0x9D, 0x78, 0x72, - 0x22, 0x9D, 0xBD, 0x9C, 0x32, 0x45, 0x4A, 0xFD, 0xB3, 0x1F, 0xDE, 0x07, 0x9E, 0x46, 0xA9, 0xE2, - 0xFF, 0x59, 0xD4, 0x42, 0x92, 0xAE, 0xBD, 0x27, 0xF0, 0xDB, 0xB6, 0x35, 0x26, 0x79, 0x18, 0x06, - 0xE9, 0x9C, 0xDC, 0xB6, 0x87, 0x89, 0x2C, 0x62, 0xEE, 0x14, 0x07, 0x92, 0x43, 0x77, 0xF8, 0x05, - 0x15, 0x4F, 0x89, 0xFC, 0x7B, 0x87, 0xFC, 0xAD, 0x0F, 0x3D, 0xBC, 0x88, 0xC2, 0x69, 0x22, 0x02, - 0x4A, 0x56, 0x6E, 0xC3, 0x69, 0x91, 0x13, 0xAE, 0x26, 0x0D, 0x64, 0x98, 0x7E, 0x99, 0xF5, 0x53, - 0xA3, 0xEE, 0x50, 0x34, 0x52, 0x68, 0x8B, 0x17, 0xA8, 0x49, 0x5C, 0xBD, 0x25, 0x59, 0xBC, 0x2D, - 0x5E, 0x27, 0xED, 0x3A, 0x45, 0x27, 0x59, 0x4F, 0xDA, 0x8B, 0x2F, 0x15, 0x61, 0x32, 0x8D, 0x7E, - 0x1F, 0x23, 0x14, 0x27, 0xD8, 0x17, 0x19, 0x55, 0x54, 0x5A, 0xCF, 0x8B, 0xA2, 0x52, 0x2E, 0x8E, - 0x7C, 0xE5, 0xDA, 0xD6, 0x91, 0xD4, 0x9B, 0x13, 0x48, 0x9D, 0xA9, 0xE5, 0x8A, 0x19, 0x4F, 0xF2, - 0x16, 0xF4, 0x71, 0xD2, 0x3E, 0xCB, 0x52, 0x3C, 0x3C, 0x5A, 0x59, 0x82, 0x87, 0xB9, 0x8D, 0xA1, - 0x77, 0xCD, 0x30, 0x54, 0x49, 0x5D, 0xD2, 0x8A, 0x2A, 0xA1, 0x6F, 0xC8, 0x30, 0x37, 0x19, 0x2E, - 0xEF, 0x3E, 0xAE, 0x89, 0x2D, 0x16, 0x3B, 0xAC, 0x20, 0x8D, 0x8F, 0xE6, 0xA7, 0x93, 0x48, 0xA2, - 0x58, 0x0C, 0x99, 0xC6, 0xD9, 0x1E, 0xAC, 0x42, 0xA2, 0xF9, 0x73, 0xD3, 0x0F, 0xA8, 0x76, 0x5D, - 0x7C, 0x74, 0x51, 0x54, 0x8B, 0x14, 0xAA, 0x25, 0x60, 0x22, 0x8C, 0x14, 0x32, 0x76, 0x4A, 0xAE, - 0x8E, 0x4F, 0xB0, 0xD0, 0x0F, 0x29, 0x13, 0x13, 0x25, 0x87, 0x71, 0x02, 0x2A, 0x9A, 0x44, 0xE9, - 0xEB, 0x9D, 0x28, 0x76, 0xD9, 0xF4, 0x07, 0xE2, 0xF8, 0x42, 0x12, 0xD2, 0xEC, 0x17, 0x06, 0x58, - 0xC7, 0x6D, 0x5F, 0x14, 0x41, 0x39, 0x19, 0x60, 0xBE, 0x31, 0xA2, 0x06, 0x43, 0xD2, 0x00, 0x12, - 0xCA, 0x3D, 0xEF, 0x62, 0x8A, 0x18, 0x98, 0xA3, 0x47, 0xE1, 0x2E, 0x42, 0x67, 0x89, 0x53, 0x5C, - 0x6F, 0x6F, 0x90, 0x39, 0x14, 0x31, 0xFB, 0x8B, 0x71, 0xDE, 0x4B, 0xD3, 0x40, 0x3E, 0x55, 0x4C, - 0xAA, 0xED, 0x9B, 0xD4, 0xD8, 0xC9, 0x15, 0xDE, 0x46, 0x01, 0x4F, 0x93, 0x32, 0x59, 0x4A, 0x4E, - 0x31, 0x27, 0x83, 0x88, 0x87, 0x11, 0xC9, 0x08, 0x57, 0x83, 0x53, 0xE0, 0xA1, 0x27, 0x6F, 0xE2, - 0x46, 0x1E, 0xA6, 0x11, 0xFD, 0xE9, 0xF6, 0xF1, 0x1D, 0x9D, 0x8E, 0xD5, 0x51, 0xB6, 0x01, 0xE4, - 0x67, 0x07, 0xC3, 0x34, 0x00, 0xBE, 0x69, 0x8C, 0xF4, 0x27, 0x4B, 0x1C, 0x27, 0x8E, 0x6C, 0x59, - 0x57, 0x29, 0x7A, 0x01, 0xBE, 0x31, 0xEF, 0x3D, 0x29, 0xF7, 0xE6, 0x67, 0x28, 0xF2, 0xC0, 0xC5, - 0xD3, 0xDD, 0x3F, 0x62, 0x97, 0x00, 0xAF, 0x80, 0x5D, 0x57, 0x4F, 0x71, 0xD8, 0xED, 0x83, 0x4F, - 0xB0, 0x07, 0xEC, 0xCE, 0xF1, 0xF4, 0xFE, 0x76, 0xA3, 0xDE, 0x84, 0x3F, 0xDE, 0x67, 0xC5, 0x8D, - 0xC5, 0x32, 0x9F, 0x0C, 0x79, 0x15, 0x62, 0x42, 0xE9, 0x3E, 0xDE, 0xAE, 0xF9, 0x40, 0x8A, 0xDC, - 0x45, 0x84, 0x15, 0x29, 0xFF, 0xAE, 0x44, 0xA1, 0x9B, 0xE9, 0x4A, 0xC0, 0x48, 0xF6, 0x6E, 0x13, - 0xEF, 0x38, 0xCB, 0xF0, 0x0E, 0x62, 0x14, 0xE1, 0x20, 0xCB, 0x27, 0xC4, 0xED, 0x78, 0x27, 0xC5, - 0x70, 0x44, 0xF2, 0x35, 0x92, 0x5F, 0xC4, 0xD7, 0x24, 0x91, 0xA3, 0x3F, 0xAA, 0xC7, 0xB8, 0x21, - 0x2A, 0x05, 0xEF, 0x30, 0xBF, 0x8F, 0x37, 0x68, 0xAC, 0xB7, 0x83, 0xF4, 0x89, 0x4A, 0x6C, 0x8A, - 0xF6, 0x05, 0x19, 0xBC, 0xB6, 0x21, 0xF7, 0xB2, 0x75, 0x85, 0x11, 0x02, 0x47, 0xE9, 0xFA, 0x0A, - 0x58, 0x7F, 0x44, 0x17, 0x4B, 0xA4, 0x71, 0xE1, 0xE0, 0xB1, 0x2C, 0x3A, 0x8F, 0xBC, 0x6F, 0x23, - 0x0F, 0x85, 0x4A, 0x11, 0x23, 0x20, 0x05, 0x02, 0xBC, 0x3A, 0x99, 0x7F, 0x85, 0x5B, 0xB0, 0x08, - 0x72, 0xA7, 0x5C, 0x39, 0x4C, 0x63, 0xD1, 0xE2, 0xA2, 0x13, 0x59, 0x5C, 0xBD, 0x31, 0x8A, 0x5E, - 0xCA, 0x0D, 0x71, 0x62, 0x49, 0x72, 0x1A, 0x4F, 0x3A, 0x86, 0xA3, 0x83, 0x79, 0x6D, 0x53, 0xF1, - 0xAA, 0x34, 0x2B, 0xEC, 0x08, 0x9E, 0x15, 0x0B, 0xB5, 0x88, 0x9A, 0x6F, 0xC2, 0x2D, 0x96, 0x45, - 0x55, 0xE5, 0x87, 0x5B, 0x5C, 0x6B, 0xC1, 0x2E, 0xDA, 0xD4, 0xD1, 0x58, 0xB8, 0x89, 0xBA, 0x28, - 0xC7, 0x6A, 0x5C, 0x38, 0xEA, 0x22, 0x22, 0x28, 0xC5, 0xC8, 0x0B, 0xF5, 0x6D, 0x4A, 0xEE, 0x72, - 0xF9, 0x91, 0x1A, 0xC3, 0xE3, 0x6A, 0x7C, 0xB4, 0xC6, 0xF0, 0xFB, 0x95, 0x8B, 0xD8, 0xD8, 0xAB, - 0xD7, 0xEA, 0x9F, 0xEA, 0xCD, 0x4F, 0x7B, 0x1F, 0x3F, 0xB1, 0x6A, 0xA3, 0xBE, 0x5F, 0x6B, 0x1C, - 0xEE, 0xD7, 0xF7, 0x3F, 0x1E, 0x34, 0x58, 0x63, 0xFF, 0x00, 0xBE, 0x3B, 0xFC, 0x54, 0x72, 0xB8, - 0xC6, 0x32, 0x06, 0x8C, 0x62, 0x35, 0x96, 0x31, 0x96, 0x42, 0xA0, 0xC6, 0xC4, 0x69, 0xE4, 0x33, - 0xD0, 0x17, 0x9C, 0xF3, 0x26, 0x4A, 0x63, 0x6A, 0x94, 0xC6, 0xA8, 0xA8, 0x59, 0x7E, 0xA4, 0x46, - 0x34, 0xC6, 0x22, 0xA2, 0x35, 0x16, 0x3E, 0xFF, 0xE4, 0x20, 0x0B, 0x8A, 0xDA, 0x58, 0xF8, 0x1A, - 0xD2, 0xC3, 0xBC, 0x81, 0xE8, 0x8D, 0xE4, 0x79, 0xF6, 0xBE, 0x82, 0x38, 0xD6, 0xB8, 0xE8, 0x6B, - 0x87, 0x7B, 0x8F, 0x58, 0x72, 0x2D, 0x55, 0xF4, 0x55, 0x3C, 0x5C, 0x5E, 0xD1, 0xD7, 0x68, 0x12, - 0xAF, 0x55, 0xF4, 0xD5, 0xA7, 0xF1, 0x51, 0x46, 0x0F, 0x5D, 0xC2, 0xF4, 0x48, 0x99, 0xBE, 0xE5, - 0x8F, 0x54, 0x7F, 0xA5, 0x54, 0xB3, 0x23, 0xB5, 0x5F, 0xBF, 0x53, 0x82, 0x39, 0x51, 0xFC, 0x55, - 0x08, 0xFE, 0x01, 0x7A, 0x91, 0x68, 0x3A, 0xA6, 0x6B, 0x93, 0x17, 0xE9, 0x74, 0x3F, 0xA1, 0xC8, - 0xE2, 0x66, 0xA7, 0xEA, 0xCE, 0xBE, 0xB1, 0x82, 0xB0, 0x62, 0x5F, 0x8B, 0xE7, 0xFD, 0x52, 0x90, - 0xDB, 0x27, 0xE4, 0x3A, 0x2F, 0xA5, 0x1A, 0x0A, 0x21, 0x4C, 0xFE, 0x8A, 0x28, 0x23, 0x4B, 0x57, - 0x39, 0x1E, 0x94, 0xF2, 0xA2, 0x8F, 0xE9, 0x59, 0x81, 0x93, 0x25, 0x69, 0x9A, 0x35, 0x30, 0xD7, - 0x79, 0x19, 0x25, 0x50, 0x04, 0x2E, 0xCC, 0x2E, 0x83, 0x92, 0x60, 0x80, 0x8A, 0x25, 0x28, 0x52, - 0x69, 0xD0, 0xF3, 0x2F, 0xB9, 0x58, 0x39, 0x8B, 0xE9, 0xF3, 0x2B, 0x47, 0x84, 0x1C, 0xD1, 0x2C, - 0x26, 0xD6, 0x16, 0xD7, 0xD0, 0xFD, 0x5B, 0xBD, 0x40, 0x98, 0xD5, 0x02, 0xEA, 0x85, 0xC6, 0x6E, - 0x12, 0xEA, 0xD5, 0x8B, 0xA7, 0xE8, 0xCD, 0x0E, 0xF3, 0xE9, 0xCD, 0x72, 0xEB, 0xCE, 0x26, 0x40, - 0x32, 0xCF, 0x70, 0xEE, 0xB4, 0x9E, 0xE6, 0xD6, 0xA6, 0xA9, 0x8A, 0x14, 0xEA, 0xD7, 0x99, 0x25, - 0xE0, 0x23, 0xD6, 0xE3, 0x5D, 0x35, 0x7C, 0xCC, 0x51, 0x0B, 0x79, 0x81, 0xF8, 0xA8, 0x56, 0x1B, - 0x79, 0x0C, 0x2C, 0x4B, 0xC0, 0x48, 0xD1, 0xD3, 0xFB, 0xC4, 0x48, 0x2C, 0xCB, 0xBA, 0x6A, 0x18, - 0x99, 0xA3, 0xB2, 0xF2, 0x0A, 0x71, 0x48, 0x09, 0xC9, 0x12, 0xF0, 0x51, 0xF4, 0xF4, 0x7E, 0xF1, - 0xB1, 0xFD, 0x73, 0x59, 0x18, 0x39, 0x6F, 0x7D, 0xE6, 0x24, 0x46, 0xAA, 0x97, 0x46, 0x9D, 0x82, - 0x94, 0x1F, 0xF3, 0xD9, 0x9F, 0x4B, 0x41, 0x4A, 0x02, 0x67, 0x49, 0x68, 0x89, 0x7D, 0xBD, 0x37, - 0xC4, 0x1C, 0x96, 0x8C, 0x5D, 0x34, 0xA3, 0x54, 0x2C, 0xE5, 0x3B, 0x3C, 0xB9, 0xD5, 0xCB, 0x42, - 0xAF, 0x04, 0xA3, 0x4C, 0x41, 0x72, 0x2E, 0x8C, 0x4C, 0xF6, 0xF4, 0x7E, 0xF1, 0x71, 0xF1, 0x8C, - 0xB2, 0x08, 0x46, 0xAE, 0x19, 0xA3, 0xCC, 0x80, 0xB3, 0x24, 0xB4, 0x7C, 0x35, 0x46, 0x39, 0xCF, - 0x3B, 0x6A, 0xA9, 0x5C, 0xDE, 0x80, 0x02, 0xA9, 0xB1, 0x30, 0x05, 0x52, 0x23, 0xB7, 0x02, 0xA9, - 0xB9, 0xEE, 0x0A, 0xA4, 0xC6, 0x5B, 0x57, 0x20, 0x35, 0x36, 0x0A, 0xA4, 0x92, 0x14, 0x48, 0x8D, - 0xD2, 0x14, 0x48, 0x8D, 0x77, 0xAC, 0x40, 0x6A, 0x6C, 0x14, 0x48, 0xA5, 0x29, 0x90, 0x1A, 0xA5, - 0x29, 0x90, 0x1A, 0xEF, 0x58, 0x81, 0xD4, 0xD8, 0x28, 0x90, 0x4A, 0x52, 0x20, 0x35, 0x4A, 0x53, - 0x20, 0x35, 0xDE, 0xB5, 0x02, 0xA9, 0xB1, 0x51, 0x20, 0x95, 0xA9, 0x40, 0x6A, 0x94, 0xA8, 0x40, - 0x6A, 0xBC, 0x63, 0x05, 0x52, 0x63, 0xA3, 0x40, 0x2A, 0x49, 0x81, 0xD4, 0x28, 0x4D, 0x81, 0xD4, - 0x78, 0xD7, 0x0A, 0xA4, 0xC6, 0x46, 0x81, 0x54, 0xA6, 0x02, 0xA9, 0x51, 0xA2, 0x02, 0xA9, 0xB1, - 0x51, 0x20, 0xAD, 0xAA, 0x02, 0xA9, 0xB9, 0x30, 0x05, 0x52, 0x33, 0xB7, 0x02, 0xA9, 0xB5, 0xEE, - 0x0A, 0xA4, 0xE6, 0x5B, 0x57, 0x20, 0x35, 0x37, 0x0A, 0xA4, 0x92, 0x14, 0x48, 0xCD, 0xD2, 0x14, - 0x48, 0xCD, 0x77, 0xAC, 0x40, 0x6A, 0x6E, 0x14, 0x48, 0xA5, 0x29, 0x90, 0x9A, 0xA5, 0x29, 0x90, - 0x9A, 0xEF, 0x58, 0x81, 0xD4, 0xDC, 0x28, 0x90, 0x4A, 0x52, 0x20, 0x35, 0x4B, 0x53, 0x20, 0x35, - 0xDF, 0xB5, 0x02, 0xA9, 0xB9, 0x51, 0x20, 0x95, 0xA9, 0x40, 0x6A, 0x96, 0xA8, 0x40, 0x6A, 0xBE, - 0x63, 0x05, 0x52, 0x73, 0xA3, 0x40, 0x2A, 0x49, 0x81, 0xD4, 0x2C, 0x4D, 0x81, 0xD4, 0x7C, 0xD7, - 0x0A, 0xA4, 0xE6, 0x46, 0x81, 0x54, 0xA6, 0x02, 0xA9, 0x59, 0xA2, 0x02, 0xA9, 0xB9, 0x51, 0x20, - 0xAD, 0xAA, 0x02, 0xA9, 0xB5, 0x30, 0x05, 0x52, 0x2B, 0xB7, 0x02, 0x69, 0x6F, 0xDD, 0x15, 0x48, - 0xAD, 0xB7, 0xAE, 0x40, 0x6A, 0x6D, 0x14, 0x48, 0x25, 0x29, 0x90, 0x5A, 0xA5, 0x29, 0x90, 0x5A, - 0xEF, 0x58, 0x81, 0xD4, 0xDA, 0x28, 0x90, 0x4A, 0x53, 0x20, 0xB5, 0x4A, 0x53, 0x20, 0xB5, 0xDE, - 0xB1, 0x02, 0xA9, 0xB5, 0x51, 0x20, 0x95, 0xA4, 0x40, 0x6A, 0x95, 0xA6, 0x40, 0x6A, 0xBD, 0x6B, - 0x05, 0x52, 0x6B, 0xA3, 0x40, 0x2A, 0x53, 0x81, 0xD4, 0x2A, 0x51, 0x81, 0xD4, 0x7A, 0xC7, 0x0A, - 0xA4, 0xD6, 0x46, 0x81, 0x54, 0x92, 0x02, 0xA9, 0x55, 0x9A, 0x02, 0xA9, 0xF5, 0xAE, 0x15, 0x48, - 0xAD, 0x8D, 0x02, 0xA9, 0x4C, 0x05, 0x52, 0xAB, 0x44, 0x05, 0x52, 0xEB, 0x8D, 0x29, 0x90, 0x66, - 0xE7, 0x5A, 0x9A, 0xD6, 0xB5, 0x54, 0x2B, 0xC5, 0x09, 0xE7, 0x7A, 0x3C, 0xB8, 0xE1, 0xBE, 0xAF, - 0xF5, 0xF8, 0xB5, 0xE9, 0x07, 0x58, 0x4C, 0x9D, 0x2A, 0x4E, 0x2D, 0x40, 0xEB, 0x54, 0x40, 0xE3, - 0x14, 0x3D, 0xC7, 0x82, 0x4D, 0x42, 0x4B, 0x72, 0xE3, 0xF7, 0x70, 0x8E, 0x33, 0x86, 0x52, 0x52, - 0x3A, 0x4D, 0xEE, 0x7C, 0xC6, 0xF6, 0xDD, 0xDE, 0x9D, 0xDD, 0xB0, 0x5B, 0x4A, 0xCC, 0xFB, 0xD9, - 0x24, 0xD4, 0xC3, 0xAC, 0x60, 0xD0, 0xF8, 0x0C, 0x95, 0x4C, 0x95, 0x52, 0xB4, 0x50, 0x2A, 0x1A, - 0xA8, 0x72, 0xB3, 0x9F, 0xD1, 0xAA, 0x30, 0x73, 0xBF, 0xA7, 0xD9, 0xFE, 0xC0, 0x0C, 0x12, 0xF5, - 0xB2, 0xA8, 0x82, 0x88, 0x86, 0x99, 0xC1, 0x0D, 0x91, 0x88, 0x0C, 0x73, 0x1A, 0x37, 0x7E, 0xFA, - 0x83, 0xD2, 0xF1, 0x0F, 0x04, 0xF6, 0xF8, 0xAC, 0x51, 0xAF, 0xEF, 0xEF, 0xC0, 0xCF, 0x8F, 0x7B, - 0xF8, 0xF3, 0x90, 0x7E, 0x7E, 0xC2, 0x9F, 0x8D, 0xE6, 0x9E, 0xC8, 0xF1, 0x5F, 0xAF, 0x45, 0x8D, - 0x1A, 0xCD, 0x56, 0x5D, 0x16, 0x0B, 0x90, 0xF9, 0x90, 0x2D, 0xE7, 0x89, 0x4A, 0x7A, 0xE1, 0xB7, - 0x54, 0x27, 0xCD, 0x17, 0xC5, 0xF5, 0xE0, 0x39, 0x8C, 0x6F, 0x1B, 0x94, 0x52, 0x16, 0xF3, 0x07, - 0x06, 0x9A, 0x69, 0x39, 0x9E, 0x2C, 0xC5, 0x25, 0xE7, 0x8A, 0x25, 0x8B, 0x76, 0x35, 0xCB, 0x12, - 0x5B, 0x13, 0xCD, 0xA8, 0xC6, 0xAE, 0x4D, 0xF8, 0xD2, 0x3F, 0x62, 0x75, 0x7C, 0xB9, 0x59, 0x4F, - 0x96, 0xFA, 0x12, 0xA5, 0xFC, 0x08, 0x4C, 0x30, 0x5E, 0x40, 0xC5, 0xBE, 0x1C, 0x60, 0x1D, 0x9E, - 0x69, 0x18, 0xDC, 0xC6, 0xF7, 0x71, 0xAE, 0x54, 0xF5, 0xCF, 0xB4, 0x19, 0xA2, 0x05, 0x1B, 0x38, - 0x06, 0x5F, 0xC3, 0xC4, 0x6B, 0x63, 0xD5, 0x8F, 0x85, 0x90, 0xBF, 0x98, 0x06, 0x52, 0x41, 0xAB, - 0x99, 0x6E, 0x7C, 0xEF, 0x00, 0xE6, 0x0F, 0x52, 0x1A, 0x4C, 0x15, 0x4D, 0x79, 0x9A, 0xBF, 0x8C, - 0xCF, 0xCF, 0x99, 0xA8, 0xB0, 0xE7, 0x71, 0x9F, 0x07, 0x77, 0x0E, 0x62, 0x8C, 0x4C, 0xAF, 0xE7, - 0x63, 0xBA, 0xCD, 0x5B, 0x7C, 0x8C, 0xDB, 0x1F, 0x3D, 0x54, 0xCC, 0xBC, 0xA9, 0x5C, 0xA0, 0xF0, - 0x95, 0xD7, 0x7A, 0xED, 0x3C, 0x9D, 0x46, 0xE4, 0x94, 0x5A, 0x2F, 0x7C, 0xC1, 0xE2, 0x6F, 0x80, - 0x72, 0xEC, 0x87, 0x9C, 0x2B, 0x57, 0x58, 0x3B, 0x62, 0xDE, 0x20, 0x7D, 0xDA, 0x54, 0x96, 0x92, - 0x4D, 0x53, 0xE5, 0xF9, 0xF8, 0x91, 0x3E, 0xFF, 0xA9, 0x5A, 0x65, 0xD5, 0xE8, 0x5F, 0x24, 0x59, - 0x71, 0xAF, 0x8B, 0x69, 0xB6, 0x05, 0xE5, 0x24, 0xBE, 0xAE, 0x56, 0xB3, 0x9D, 0x26, 0x48, 0xC6, - 0x00, 0xD1, 0xD3, 0x34, 0x58, 0x4F, 0x73, 0xAB, 0x63, 0x0D, 0x64, 0x13, 0x4C, 0x3E, 0x93, 0x4E, - 0x5B, 0x82, 0xA6, 0xEB, 0x46, 0x89, 0x14, 0x55, 0x8E, 0xD7, 0xF1, 0x40, 0x1A, 0x7F, 0xE6, 0xB6, - 0xDB, 0x51, 0xCF, 0xB9, 0x4E, 0xD3, 0xB8, 0xD9, 0xF8, 0xB1, 0x32, 0x99, 0xD2, 0x6D, 0xC7, 0x9E, - 0x88, 0x01, 0x42, 0x7E, 0x4B, 0x41, 0x3A, 0x14, 0x15, 0xA4, 0xA2, 0x63, 0xD7, 0x4D, 0xBC, 0x51, - 0xC2, 0xD9, 0x3B, 0x01, 0xDF, 0xC7, 0xE2, 0xCA, 0x4C, 0xC6, 0x1A, 0xC3, 0x61, 0xDC, 0x40, 0x93, - 0xF9, 0x68, 0x51, 0xB9, 0xEE, 0x9C, 0x92, 0x8C, 0xB2, 0xAB, 0xF3, 0xA3, 0x48, 0x1C, 0xEE, 0x43, - 0x9F, 0x4F, 0xB0, 0xE6, 0xAB, 0xF3, 0x29, 0xF9, 0xE9, 0x77, 0x4F, 0x50, 0x02, 0x9E, 0x9E, 0x5F, - 0xFE, 0x1C, 0x0B, 0x60, 0x82, 0x3C, 0x6D, 0x5A, 0xEC, 0x81, 0xC3, 0x47, 0xC0, 0x04, 0xD3, 0xE3, - 0xF1, 0x38, 0x06, 0x7C, 0x7D, 0xCB, 0x07, 0x9A, 0x69, 0x9B, 0x76, 0x6F, 0xCA, 0x50, 0x0E, 0xFB, - 0x0B, 0xB4, 0x9E, 0x2C, 0x70, 0xBF, 0x76, 0xE2, 0xDB, 0x24, 0xBA, 0x9D, 0xC5, 0x69, 0x59, 0xFD, - 0x38, 0x09, 0x6E, 0x06, 0x1D, 0xE3, 0x17, 0xD8, 0x52, 0x32, 0xE2, 0x4E, 0x9C, 0xDD, 0x52, 0xB3, - 0xE3, 0xCA, 0x92, 0x6B, 0xBB, 0xEC, 0xAA, 0x9D, 0x86, 0x87, 0x9E, 0x80, 0x07, 0xC9, 0x4C, 0xDA, - 0x23, 0x88, 0x69, 0x54, 0x0A, 0x75, 0x34, 0x79, 0xED, 0x7A, 0xE6, 0xAE, 0xED, 0x71, 0xA7, 0xE7, - 0x69, 0x6E, 0xDF, 0xD4, 0x6F, 0x79, 0x0F, 0x16, 0x7A, 0xEE, 0x39, 0xAE, 0xE0, 0x26, 0x33, 0xD1, - 0x8F, 0xB0, 0x2C, 0xDB, 0xBE, 0x72, 0xFC, 0x35, 0x7E, 0xC2, 0xC4, 0x23, 0x85, 0xEB, 0x7A, 0xBA, - 0xC0, 0xC3, 0x48, 0x9F, 0x63, 0x67, 0x9A, 0xBE, 0x7F, 0x1B, 0x72, 0xDE, 0x71, 0xA6, 0xDD, 0xA9, - 0x5B, 0x91, 0x2E, 0x21, 0x50, 0xAF, 0x1C, 0xFF, 0xE8, 0x28, 0x66, 0xF5, 0x1F, 0xAD, 0xE5, 0x70, - 0xF1, 0xA3, 0x58, 0x53, 0x98, 0xE5, 0x49, 0xC1, 0xA6, 0xC0, 0x1C, 0xFE, 0x72, 0x5B, 0xAC, 0xE9, - 0x5E, 0xE5, 0xF8, 0xBF, 0x6B, 0x80, 0x35, 0x0A, 0xAD, 0x15, 0x0A, 0x17, 0x94, 0x4C, 0x8C, 0x1D, - 0x81, 0x05, 0x2F, 0x4E, 0xE8, 0xB1, 0xE1, 0x76, 0x33, 0x8F, 0xF6, 0x5B, 0x5E, 0xAC, 0xE0, 0xAE, - 0x06, 0xAC, 0x57, 0xE4, 0x99, 0x96, 0x84, 0xDB, 0xF5, 0xF8, 0xEF, 0x21, 0xB7, 0xF5, 0x17, 0xBA, - 0x8E, 0x09, 0xEC, 0xD0, 0xAC, 0x04, 0x37, 0x03, 0xF9, 0xC2, 0x35, 0xF5, 0x04, 0xCD, 0xFE, 0xE8, - 0xAC, 0x18, 0xB5, 0x0A, 0x41, 0xC9, 0x9B, 0x8F, 0x96, 0x5D, 0xB7, 0xC3, 0x03, 0xCC, 0xD5, 0xED, - 0x4F, 0x3E, 0xA4, 0xE7, 0x3C, 0x79, 0x94, 0x4F, 0x1F, 0x2D, 0x0C, 0x1C, 0x38, 0x19, 0x6F, 0xB9, - 0xCD, 0x9F, 0x34, 0xAC, 0x46, 0x0A, 0x7F, 0xE3, 0x51, 0xC9, 0xE4, 0x13, 0xD5, 0x8A, 0x39, 0xF3, - 0x9C, 0x31, 0xD9, 0x39, 0xE4, 0xD8, 0xF1, 0x39, 0x8B, 0x0B, 0x48, 0x7C, 0xFE, 0x19, 0xCF, 0x0C, - 0x92, 0x2E, 0x90, 0x3D, 0x31, 0x58, 0x2E, 0xDC, 0x46, 0x9A, 0x87, 0x0C, 0x85, 0x0B, 0xBC, 0x9C, - 0x90, 0xCC, 0xF1, 0xB2, 0xC3, 0x70, 0xA2, 0x58, 0xFA, 0x4F, 0xA7, 0xC2, 0xA4, 0x5A, 0x10, 0xF0, - 0x81, 0x4B, 0xB7, 0x17, 0xC0, 0x3B, 0x1B, 0x29, 0x02, 0x3E, 0x6E, 0xFD, 0xE4, 0x0C, 0xF8, 0x16, - 0xFB, 0xD9, 0xBC, 0x34, 0x77, 0xE0, 0x0A, 0x04, 0x52, 0x91, 0x86, 0xFD, 0xEC, 0xE0, 0x77, 0x1E, - 0xAE, 0x90, 0x06, 0x4A, 0xE0, 0xB8, 0x38, 0xE0, 0x0D, 0xF5, 0x22, 0xF1, 0x65, 0x97, 0x21, 0x50, - 0xA0, 0x08, 0x15, 0x8F, 0xB2, 0x62, 0x5A, 0xEE, 0xE4, 0x19, 0x95, 0x14, 0xA8, 0x85, 0x44, 0xD9, - 0xF6, 0x9C, 0xAE, 0x69, 0xF1, 0x3B, 0xE7, 0x81, 0xAB, 0x78, 0x95, 0xCD, 0x34, 0xB6, 0x8C, 0x16, - 0xC1, 0x93, 0x92, 0xAB, 0x1C, 0x88, 0xD1, 0x48, 0x47, 0x39, 0x77, 0xA2, 0x84, 0x0A, 0x17, 0xC3, - 0x5A, 0xF4, 0xC4, 0x54, 0x1D, 0xAF, 0xA7, 0xD9, 0xE6, 0x1F, 0xE2, 0xBA, 0xD1, 0xD7, 0x7C, 0x4C, - 0xEF, 0xEF, 0x78, 0xAE, 0x43, 0xAA, 0x22, 0x60, 0xAF, 0x76, 0xAF, 0x13, 0x78, 0x5C, 0x1B, 0x10, - 0x23, 0x4D, 0x89, 0x42, 0x9A, 0xAE, 0xA3, 0xF6, 0x79, 0x47, 0x94, 0x12, 0x30, 0x49, 0x1E, 0xF2, - 0x38, 0xF6, 0xCA, 0x90, 0x40, 0xA9, 0x77, 0x3D, 0xF4, 0x01, 0x8F, 0x65, 0x65, 0x00, 0xE6, 0xCA, - 0xA5, 0x07, 0xB8, 0xF4, 0x24, 0x5E, 0x02, 0x6E, 0xBF, 0xB0, 0x2A, 0x13, 0x75, 0x09, 0x38, 0xEB, - 0xB8, 0x9A, 0xF7, 0x70, 0x19, 0xDA, 0x02, 0x46, 0x95, 0x22, 0xA5, 0x40, 0x4A, 0xAD, 0x9C, 0xA1, - 0x88, 0xDB, 0x4A, 0xDC, 0x6B, 0x92, 0x39, 0xEC, 0xA3, 0x12, 0x55, 0xE6, 0xB0, 0x38, 0xCC, 0x40, - 0x71, 0x95, 0xD1, 0x5C, 0x85, 0x8E, 0xE6, 0xB2, 0x39, 0xA8, 0xDA, 0x07, 0x96, 0xA4, 0xF1, 0xF0, - 0x02, 0x7F, 0x15, 0x34, 0x1D, 0x38, 0x8F, 0x85, 0x29, 0x3B, 0x92, 0x9D, 0xE7, 0xD3, 0x77, 0x24, - 0x5A, 0x4E, 0x54, 0x64, 0x0C, 0x21, 0x38, 0xA2, 0xC1, 0xC0, 0xD6, 0xAB, 0xA6, 0xBA, 0x98, 0xBE, - 0xA4, 0xA2, 0xDA, 0x0B, 0x1A, 0x83, 0x54, 0xFB, 0x38, 0xC0, 0x59, 0x5F, 0x83, 0x13, 0xDB, 0x8A, - 0x6F, 0x51, 0x51, 0x8F, 0xB3, 0x6E, 0x25, 0xC9, 0xE3, 0x2A, 0xEE, 0xEC, 0x54, 0x0B, 0xE1, 0xF8, - 0xBE, 0xC5, 0x3F, 0x09, 0xDA, 0x0C, 0x1F, 0x90, 0x89, 0xE6, 0x88, 0xE5, 0xBD, 0x53, 0xA5, 0x3B, - 0x4D, 0x4F, 0x5A, 0x3C, 0x1A, 0x77, 0x9B, 0xCA, 0x79, 0x91, 0xDA, 0x3B, 0xAC, 0xC3, 0x5D, 0x0A, - 0x7F, 0x16, 0xBB, 0x9C, 0x7C, 0x3A, 0xC0, 0xF6, 0xF8, 0xB3, 0xE0, 0x6D, 0xEC, 0x53, 0x13, 0x3B, - 0xA0, 0x5F, 0x05, 0x6F, 0x56, 0x87, 0x7B, 0xD8, 0x03, 0xFD, 0x2A, 0xD6, 0xC3, 0xFE, 0x47, 0x5A, - 0x04, 0xFD, 0x2A, 0xB8, 0x8A, 0xC6, 0xBE, 0x58, 0x06, 0xFD, 0x2E, 0x78, 0xB9, 0x6C, 0xD5, 0x69, - 0x21, 0xE2, 0x77, 0xC1, 0xAB, 0xE2, 0x41, 0x5D, 0xEC, 0x27, 0xFD, 0x2E, 0xB8, 0xA3, 0xCD, 0x86, - 0xD8, 0x53, 0xFA, 0xBD, 0x92, 0x97, 0xCE, 0x3B, 0x32, 0x05, 0x02, 0x61, 0x91, 0x10, 0x84, 0x86, - 0x3A, 0x94, 0x4A, 0x6E, 0x4F, 0xCE, 0xAF, 0xBE, 0x33, 0x64, 0x64, 0x91, 0x29, 0x4F, 0x07, 0xD2, - 0xEE, 0x09, 0x03, 0x1D, 0xC8, 0xEA, 0x7A, 0x9F, 0x69, 0x54, 0xCC, 0x1B, 0xCB, 0x26, 0xF5, 0x1D, - 0x14, 0x78, 0x9C, 0xAE, 0x30, 0xF1, 0x25, 0x64, 0x1D, 0xC2, 0x82, 0x7B, 0xD7, 0x7F, 0x8B, 0xB7, - 0x4D, 0x84, 0x7A, 0x59, 0x2C, 0x2F, 0xD3, 0x57, 0xE5, 0xF8, 0x26, 0x7C, 0x66, 0xF2, 0x8F, 0xFC, - 0xBC, 0x2E, 0xDB, 0xDB, 0xB8, 0xE9, 0x96, 0xC2, 0xEF, 0x00, 0xB1, 0xBF, 0xDD, 0x5C, 0x9C, 0x14, - 0x56, 0x1D, 0xB5, 0xDB, 0x9D, 0xDD, 0x8B, 0x47, 0xB4, 0xD5, 0xDE, 0x01, 0xC2, 0xF6, 0xB0, 0x0C, - 0x59, 0x31, 0x4D, 0x92, 0x30, 0x41, 0x85, 0xCF, 0x72, 0x71, 0x00, 0xF7, 0xAB, 0xE6, 0x59, 0x61, - 0xDD, 0xD2, 0xC9, 0xF9, 0xD9, 0xEE, 0xF9, 0xC9, 0xD9, 0xCA, 0x52, 0xEB, 0xF9, 0xC9, 0xDD, 0x49, - 0x9A, 0x34, 0xA5, 0x10, 0x22, 0x0D, 0xED, 0x86, 0xD9, 0xED, 0xC2, 0xE5, 0x04, 0x8B, 0x7E, 0xBB, - 0xAE, 0x65, 0x8A, 0xCA, 0xA7, 0x70, 0x35, 0xC6, 0xBD, 0xC2, 0xAB, 0x0B, 0x15, 0x29, 0xC6, 0x17, - 0x81, 0x7C, 0x4D, 0xCD, 0x62, 0x77, 0xBF, 0xEC, 0xDE, 0xFE, 0x82, 0xE4, 0x6B, 0xC9, 0x2A, 0xA9, - 0x0C, 0xA9, 0xCF, 0x1B, 0xD0, 0xE7, 0x1A, 0xC3, 0x5D, 0x92, 0xFB, 0x93, 0x6A, 0xED, 0x86, 0x20, - 0x41, 0x31, 0x97, 0x63, 0x3F, 0x30, 0x03, 0x83, 0x39, 0x61, 0x80, 0x02, 0x3B, 0xDE, 0x9D, 0xF6, - 0x6D, 0x1F, 0xAF, 0x4C, 0x21, 0xF1, 0x94, 0x20, 0x6A, 0x8C, 0xF2, 0x3C, 0xCC, 0x03, 0xF6, 0x26, - 0xEE, 0x08, 0xEF, 0x60, 0x36, 0x95, 0x22, 0x0F, 0x84, 0xD6, 0xAA, 0x73, 0x7E, 0xB2, 0xDB, 0x39, - 0xBB, 0x16, 0x85, 0xD3, 0x74, 0xB1, 0x9F, 0x35, 0xF6, 0x73, 0x9F, 0x73, 0x6B, 0xF7, 0xDC, 0xF4, - 0xD8, 0x9D, 0xA9, 0x3F, 0xA4, 0xA6, 0x41, 0xCA, 0x03, 0x27, 0xC0, 0x72, 0xE7, 0x20, 0xBA, 0x83, - 0xE4, 0xAE, 0xE9, 0x70, 0x8F, 0xAB, 0x31, 0xB9, 0x8B, 0xA9, 0x77, 0xE5, 0x0D, 0xAD, 0x6B, 0x7A, - 0x03, 0x34, 0xA2, 0x64, 0xE0, 0x13, 0xB3, 0x2D, 0x04, 0xD4, 0x7A, 0xAA, 0xB3, 0x23, 0x2A, 0x47, - 0x91, 0xA6, 0x14, 0x8E, 0x24, 0x64, 0xB0, 0x73, 0xDC, 0x8C, 0x79, 0x45, 0xB0, 0x54, 0x97, 0x23, - 0xB3, 0xDD, 0x08, 0x60, 0x1B, 0x01, 0xEC, 0x7D, 0x0A, 0x60, 0x57, 0xB6, 0xE0, 0xCC, 0xE8, 0x88, - 0xB4, 0x23, 0x3D, 0xB3, 0xB2, 0xE2, 0xD8, 0x28, 0xCB, 0x9F, 0x28, 0x8D, 0x25, 0x78, 0x5A, 0x82, - 0xA5, 0x09, 0x18, 0xAE, 0x9E, 0x28, 0xA6, 0xC8, 0xD7, 0x60, 0x58, 0xEE, 0xC1, 0xF1, 0xD0, 0xC6, - 0x33, 0x67, 0x56, 0x91, 0xC9, 0xD7, 0xD2, 0xF9, 0x0B, 0x9B, 0xEE, 0x45, 0x72, 0xAA, 0xB1, 0x9D, - 0x39, 0x7A, 0xCA, 0xE8, 0xF1, 0x12, 0x94, 0xFF, 0x63, 0x27, 0xB3, 0x74, 0x0B, 0xC0, 0x57, 0x6E, - 0x73, 0x42, 0x64, 0x4D, 0x2C, 0x1C, 0x7D, 0x6C, 0x58, 0x47, 0x8A, 0x0B, 0x70, 0x76, 0xC3, 0x7B, - 0x03, 0xE9, 0x89, 0x38, 0x08, 0x01, 0x8B, 0xBB, 0x14, 0x0B, 0xB1, 0x23, 0x9C, 0x04, 0x61, 0xD3, - 0xD1, 0x95, 0x4F, 0x0A, 0x12, 0xFA, 0x4B, 0x8D, 0xDD, 0xF2, 0xDF, 0x43, 0xD3, 0xE3, 0x3E, 0x43, - 0x07, 0x37, 0x2C, 0x48, 0xCC, 0xDD, 0x0C, 0x9E, 0x4B, 0xAD, 0xBF, 0xE8, 0xA0, 0x51, 0xAF, 0xEF, - 0xD4, 0xEB, 0xF5, 0xD0, 0x97, 0xB2, 0x8A, 0xC5, 0xED, 0x1E, 0x3C, 0x46, 0x01, 0xE5, 0x53, 0xFC, - 0x95, 0x98, 0x01, 0x0F, 0x9E, 0x38, 0xB7, 0xC5, 0x7B, 0x7E, 0x6D, 0xFD, 0x8D, 0x06, 0x13, 0x88, - 0xE6, 0x9C, 0xA3, 0xA3, 0xA5, 0x9F, 0x9F, 0x76, 0xE6, 0xF7, 0xB9, 0x4F, 0x4A, 0x17, 0xA9, 0x99, - 0xDD, 0xC1, 0x06, 0x9C, 0x0A, 0xF8, 0x0B, 0x34, 0x55, 0xD3, 0x80, 0x17, 0x30, 0x4A, 0xDC, 0x8D, - 0x6E, 0x35, 0xDB, 0xFE, 0x7F, 0xFF, 0xD7, 0xFF, 0xA0, 0x62, 0x99, 0x50, 0xF6, 0xB9, 0x9F, 0x4F, - 0xEB, 0x3D, 0xA2, 0xF9, 0x9E, 0x19, 0xBB, 0x39, 0x1D, 0x98, 0xAA, 0x43, 0xBA, 0xB3, 0xFB, 0x9A, - 0xDB, 0xE3, 0xBE, 0x9C, 0x3A, 0xDB, 0x0B, 0x44, 0xC5, 0x6B, 0x62, 0x10, 0x8B, 0x43, 0xC0, 0x76, - 0x92, 0x0D, 0x09, 0xCC, 0x5B, 0x13, 0xBC, 0x92, 0x90, 0x99, 0x03, 0x9B, 0x44, 0x0F, 0xAB, 0x86, - 0x43, 0xA4, 0xAE, 0x27, 0xE4, 0x36, 0x7A, 0x3C, 0xF7, 0x8D, 0x69, 0x26, 0x42, 0xB5, 0x1D, 0x4B, - 0xF3, 0xCC, 0xE0, 0x65, 0xD1, 0x28, 0x15, 0x8D, 0x73, 0x94, 0x87, 0x4F, 0xA5, 0x6E, 0x67, 0xE3, - 0xA7, 0x3D, 0xBA, 0x8D, 0xC3, 0xAF, 0x8A, 0xDC, 0xD7, 0x26, 0x2B, 0x92, 0x6E, 0x4D, 0x2A, 0x92, - 0x8E, 0xDB, 0xA0, 0x28, 0xE9, 0x4F, 0xD6, 0x2B, 0x5D, 0x6A, 0x96, 0x55, 0xA0, 0x33, 0x05, 0xD1, - 0x7F, 0xC1, 0x76, 0x6A, 0xD4, 0xEE, 0x08, 0x51, 0xC5, 0x37, 0x7B, 0x28, 0x2D, 0x3E, 0x99, 0x96, - 0x85, 0xE2, 0x7E, 0x1F, 0xFA, 0x92, 0x2E, 0x78, 0x3A, 0xA9, 0x3A, 0xB6, 0x3D, 0x01, 0x2F, 0x0E, - 0x4B, 0xFC, 0x80, 0xA2, 0x14, 0xBA, 0x56, 0xA4, 0x5E, 0xE8, 0x4A, 0x20, 0xD0, 0x1B, 0x09, 0x09, - 0x29, 0x01, 0xE8, 0xB5, 0x31, 0x36, 0x97, 0x91, 0x99, 0x67, 0x79, 0x92, 0xFF, 0x4F, 0xD2, 0x47, - 0x97, 0x54, 0x9B, 0xD7, 0x4E, 0xAF, 0x87, 0x2E, 0xB4, 0xD9, 0x8B, 0xC0, 0x6C, 0xD8, 0x08, 0xCD, - 0xA8, 0x6C, 0xBF, 0xD8, 0x1B, 0xC3, 0xEC, 0xC9, 0x8C, 0x5E, 0x29, 0xC6, 0xAF, 0x72, 0xE9, 0x37, - 0x0C, 0x18, 0x99, 0x45, 0x0C, 0x2A, 0x96, 0xE9, 0x38, 0xCE, 0xC9, 0xFF, 0x20, 0x6E, 0x01, 0xAD, - 0x7A, 0xAC, 0x8C, 0xD4, 0x5F, 0xD8, 0xED, 0x4D, 0xA7, 0x86, 0xBE, 0x17, 0xDD, 0xD0, 0x92, 0xB7, - 0x6B, 0x74, 0x18, 0x63, 0x96, 0xF9, 0x00, 0x17, 0x8D, 0x10, 0x4D, 0x8D, 0x81, 0x67, 0xC2, 0xDD, - 0x3A, 0xB4, 0xE4, 0x15, 0xBA, 0xC3, 0x85, 0x9F, 0x06, 0x4A, 0x43, 0x80, 0xE2, 0x0F, 0xA8, 0xED, - 0x24, 0x7E, 0xE3, 0x74, 0xE9, 0xF9, 0x6F, 0x17, 0xE7, 0xD5, 0xCB, 0x4F, 0x6D, 0x76, 0x65, 0x07, - 0xBC, 0x27, 0xED, 0xC0, 0x37, 0x9A, 0x1D, 0x6A, 0xA2, 0xFF, 0x81, 0xE3, 0xF1, 0xB4, 0x3E, 0x75, - 0xF6, 0x25, 0x46, 0xD5, 0xA5, 0x76, 0x05, 0xAE, 0x21, 0xAB, 0xE8, 0xF3, 0xFD, 0xE3, 0xE4, 0xF6, - 0xAE, 0xF9, 0xE3, 0xF4, 0x97, 0x2B, 0x3B, 0xA6, 0x3A, 0xF8, 0x0B, 0x36, 0x08, 0x69, 0xE3, 0xBB, - 0x3D, 0x7D, 0xE5, 0xB4, 0x29, 0xD4, 0xC3, 0x52, 0x3C, 0xC0, 0x93, 0x73, 0x5D, 0x9A, 0xC6, 0x29, - 0x01, 0x14, 0xB1, 0x02, 0x40, 0xD9, 0xE1, 0xBA, 0x59, 0x95, 0xF1, 0x5A, 0xAF, 0x96, 0xF0, 0xFE, - 0x16, 0xCA, 0xF8, 0xAE, 0xE7, 0xA0, 0x63, 0xD4, 0x90, 0xDA, 0xBE, 0x5D, 0x7C, 0xAF, 0x9E, 0x7F, - 0x3A, 0x4B, 0x20, 0xEE, 0xA5, 0x96, 0x57, 0xCD, 0xB0, 0x3C, 0x0D, 0x53, 0x69, 0xAE, 0x33, 0xE8, - 0x82, 0xF8, 0xCA, 0x9E, 0x33, 0x65, 0x3B, 0xCA, 0xE0, 0x92, 0x0A, 0xF9, 0xC9, 0x24, 0x1A, 0x4E, - 0x00, 0x7F, 0x02, 0x5A, 0x19, 0x2F, 0x99, 0x27, 0xB3, 0x6B, 0xAE, 0x9A, 0x93, 0xCC, 0xF4, 0xF5, - 0x14, 0xF6, 0x91, 0x19, 0xBD, 0xA9, 0xC2, 0x96, 0x4E, 0xBD, 0x59, 0x7C, 0x83, 0x7B, 0xB7, 0xE3, - 0x3D, 0xF8, 0x47, 0x4B, 0x64, 0x0A, 0x40, 0xD6, 0x4C, 0xF7, 0xB8, 0x01, 0x2D, 0x4D, 0xD8, 0x75, - 0x3A, 0xBE, 0x60, 0xAA, 0x81, 0xC3, 0xF6, 0xC4, 0x36, 0xDA, 0x72, 0x52, 0x35, 0x76, 0x02, 0x62, - 0x69, 0xF4, 0x57, 0x2C, 0xA4, 0xC2, 0xC1, 0x89, 0x16, 0x3D, 0xDB, 0x10, 0x4A, 0x6C, 0xEE, 0x07, - 0xD1, 0x3B, 0xC3, 0xC0, 0x91, 0xF8, 0x65, 0xB4, 0xC9, 0xAD, 0x6F, 0xD8, 0xAD, 0xBA, 0xCE, 0x21, - 0x79, 0x35, 0x44, 0x8C, 0x97, 0x1B, 0xFB, 0xB7, 0x7A, 0xA7, 0x83, 0x31, 0x5C, 0x89, 0xFB, 0x7C, - 0x6B, 0xE4, 0x6E, 0x87, 0xAF, 0xB0, 0x86, 0x4A, 0xFC, 0x48, 0x61, 0xD5, 0x40, 0x1E, 0x27, 0xCB, - 0x31, 0xD3, 0x97, 0x27, 0x5A, 0x00, 0x7B, 0x3D, 0x73, 0x24, 0x77, 0x7C, 0x27, 0x85, 0x35, 0x02, - 0x25, 0x8A, 0x20, 0xF3, 0xED, 0x64, 0x1B, 0x3A, 0x82, 0x4F, 0xC6, 0x8C, 0xDD, 0x6C, 0xFF, 0x3C, - 0x1D, 0x40, 0x2B, 0xBA, 0xD1, 0xF1, 0xEA, 0x0A, 0xEC, 0x6F, 0xD4, 0x76, 0xED, 0xF7, 0xB8, 0xA1, - 0x4A, 0xAD, 0xCD, 0x95, 0xDC, 0x44, 0x31, 0xFD, 0xFC, 0x1B, 0xD8, 0x78, 0x13, 0x04, 0xDA, 0x28, - 0x89, 0x40, 0x57, 0x74, 0x6F, 0xE7, 0x20, 0xD0, 0xC6, 0x9B, 0x21, 0xD0, 0xA6, 0x2A, 0x81, 0xB6, - 0x56, 0x72, 0x13, 0x9B, 0x05, 0x09, 0xB4, 0xF9, 0x26, 0x08, 0xB4, 0x59, 0x12, 0x81, 0xAE, 0xE8, - 0xDE, 0xCE, 0x41, 0xA0, 0xCD, 0x37, 0x43, 0xA0, 0x2D, 0x55, 0x02, 0xDD, 0x5B, 0xC9, 0x4D, 0x6C, - 0x15, 0x24, 0xD0, 0xD6, 0x9B, 0x20, 0xD0, 0x56, 0x49, 0x04, 0xBA, 0xA2, 0x7B, 0x3B, 0x07, 0x81, - 0xB6, 0x5E, 0x9B, 0x40, 0x63, 0x4D, 0x0A, 0x69, 0x2D, 0xEE, 0x60, 0xED, 0xA3, 0x56, 0x4C, 0x35, - 0xD5, 0x6A, 0xBC, 0xEB, 0xA2, 0xAB, 0xEF, 0x8F, 0xDC, 0x3B, 0x69, 0x57, 0x8E, 0x23, 0xDD, 0x0D, - 0x67, 0x37, 0x8E, 0x51, 0xC0, 0xED, 0x33, 0x3D, 0xB9, 0x4A, 0x66, 0xC2, 0x72, 0x94, 0x32, 0x9C, - 0x3F, 0x1B, 0x95, 0xE3, 0x93, 0x76, 0x31, 0x2F, 0xC1, 0x7A, 0xE5, 0x18, 0x15, 0x1C, 0xAB, 0xEA, - 0x1E, 0x78, 0xD2, 0x4E, 0x38, 0x07, 0xCA, 0xF0, 0x52, 0xA1, 0x47, 0xF1, 0x1C, 0xCD, 0xD0, 0x35, - 0x3F, 0x88, 0xFC, 0xA8, 0x75, 0x9D, 0xFB, 0x3E, 0xA3, 0x20, 0x46, 0x86, 0xD1, 0xD4, 0xDC, 0x60, - 0xB7, 0x77, 0x7F, 0xA9, 0x0A, 0x58, 0xD7, 0x18, 0xF4, 0x45, 0x8A, 0x9C, 0xF1, 0xBD, 0x25, 0xA2, - 0xAD, 0xD1, 0x13, 0xDC, 0x12, 0xEF, 0xA2, 0x3E, 0x27, 0xE1, 0x63, 0x4E, 0x4A, 0x1C, 0x4C, 0x29, - 0x80, 0x8D, 0x45, 0x3A, 0x18, 0x18, 0xE4, 0xAA, 0x8D, 0x3E, 0xDC, 0x1E, 0x0C, 0xBE, 0x3E, 0x3A, - 0x9D, 0xC2, 0x0A, 0xE0, 0xBB, 0xB3, 0x36, 0xDB, 0x65, 0x3F, 0xCE, 0xDB, 0x6F, 0x4C, 0x0B, 0x0C, - 0xEB, 0x82, 0x45, 0x15, 0xD2, 0x03, 0xA7, 0x9A, 0x4E, 0xD8, 0x89, 0x2C, 0xD8, 0x32, 0xEA, 0xE0, - 0x40, 0x77, 0x7F, 0x18, 0xEE, 0xAA, 0x29, 0x84, 0x67, 0x2D, 0xAC, 0x14, 0x95, 0x70, 0xE9, 0x16, - 0xB0, 0x3B, 0xDD, 0x3D, 0xB3, 0x4C, 0xE0, 0x34, 0x95, 0x63, 0x84, 0xBA, 0xF8, 0xBC, 0x14, 0x7B, - 0xD6, 0x70, 0xE4, 0xE9, 0x5C, 0x20, 0x4E, 0x62, 0x17, 0x44, 0x0D, 0x4E, 0x9D, 0x67, 0x4E, 0xB9, - 0xFA, 0x96, 0xC7, 0x59, 0xBB, 0x4C, 0x4C, 0xDA, 0xD8, 0x99, 0xC4, 0x07, 0x63, 0x0E, 0xE8, 0x86, - 0x7E, 0x5F, 0xB8, 0x69, 0x63, 0x82, 0x4A, 0xE0, 0x7D, 0x3D, 0xF3, 0x91, 0xDB, 0x84, 0xD3, 0xBE, - 0x28, 0x55, 0x83, 0x69, 0x26, 0x13, 0xDF, 0xA0, 0xB3, 0x76, 0x6D, 0x4D, 0x4C, 0x61, 0x29, 0x61, - 0x22, 0xDE, 0x90, 0x02, 0x49, 0x54, 0x0A, 0xA5, 0xA7, 0x88, 0x07, 0xC4, 0x50, 0x90, 0x4A, 0x21, - 0x1F, 0x28, 0x2C, 0xB2, 0x51, 0xA6, 0xD3, 0x4E, 0xEC, 0x8F, 0x03, 0xDB, 0x4B, 0x5E, 0xF7, 0xB0, - 0xE9, 0xA1, 0x9F, 0xCC, 0x7A, 0xD5, 0xFC, 0xB4, 0x77, 0xB8, 0xC9, 0xD5, 0x50, 0x48, 0xF4, 0x4E, - 0xEF, 0xB7, 0x7A, 0x6A, 0x86, 0x54, 0xBB, 0x57, 0xCB, 0xC4, 0xB0, 0x00, 0xBC, 0xC7, 0x9A, 0x3D, - 0x85, 0xF0, 0x1E, 0x1B, 0x62, 0x5F, 0xB3, 0x41, 0x38, 0x3C, 0x05, 0x8E, 0x5E, 0xD5, 0xB9, 0x0D, - 0xAF, 0x04, 0xE4, 0xF8, 0x2F, 0x84, 0xC5, 0xC8, 0x87, 0xA6, 0x8F, 0x0B, 0x79, 0xEA, 0x9B, 0x7A, - 0x5F, 0xB8, 0xDA, 0xC0, 0x6C, 0x75, 0x9A, 0xAD, 0xF0, 0x3C, 0x88, 0x6C, 0x86, 0xC8, 0x84, 0x29, - 0xE6, 0xA5, 0xB6, 0x21, 0xBD, 0xF9, 0x48, 0x4F, 0xA0, 0x5C, 0x0E, 0xEB, 0xDD, 0x38, 0x3A, 0xC4, - 0x4E, 0x56, 0x2E, 0x23, 0xCA, 0x1C, 0xCA, 0x0F, 0x77, 0x9C, 0x1C, 0x53, 0x68, 0x81, 0xAF, 0xED, - 0x01, 0x05, 0xB3, 0x17, 0x29, 0xF3, 0x85, 0xFC, 0x27, 0x3E, 0x2F, 0x4B, 0xFE, 0x93, 0x23, 0xAB, - 0xCB, 0x7F, 0xA2, 0xC1, 0xEA, 0xC8, 0x7F, 0x70, 0x6F, 0x76, 0x9E, 0x98, 0x69, 0xDF, 0x3B, 0x21, - 0x48, 0x7E, 0xC4, 0x8C, 0x84, 0x44, 0x48, 0x89, 0x30, 0xD3, 0xD2, 0xE0, 0x18, 0xA9, 0x4F, 0xBA, - 0xE1, 0x46, 0x1C, 0x0C, 0x93, 0xA1, 0x8B, 0xE6, 0xAB, 0xEB, 0xF0, 0x30, 0x4B, 0x20, 0x4C, 0x56, - 0x34, 0x5C, 0x8A, 0x40, 0x28, 0x06, 0xDC, 0x08, 0x84, 0xEF, 0xE5, 0x54, 0x4A, 0xEC, 0x77, 0xAE, - 0x83, 0x68, 0xD8, 0xEE, 0x0D, 0x1F, 0x44, 0x62, 0x91, 0x6B, 0x79, 0x10, 0xFD, 0x30, 0xE2, 0x83, - 0x08, 0x15, 0x3F, 0x4B, 0x3C, 0x88, 0x86, 0x23, 0x2B, 0x1E, 0x44, 0xA1, 0xE1, 0xAE, 0xCE, 0x11, - 0x34, 0x54, 0xEC, 0xD2, 0x29, 0xE3, 0x43, 0xBF, 0xDC, 0xD6, 0xB9, 0x28, 0x66, 0x81, 0x3A, 0xB4, - 0x75, 0x3C, 0x48, 0x42, 0x63, 0x9E, 0x04, 0xAD, 0x85, 0x8E, 0x92, 0xD0, 0x58, 0xD9, 0xA3, 0x04, - 0xE9, 0x61, 0xFC, 0x51, 0xD2, 0xA8, 0x37, 0x1A, 0xF5, 0xCD, 0x59, 0x52, 0xE8, 0x2C, 0x49, 0x6F, - 0xB8, 0xFA, 0x59, 0x92, 0x6A, 0xF7, 0x56, 0xCF, 0x92, 0x98, 0x27, 0x96, 0x7C, 0x96, 0x14, 0xB6, - 0xA4, 0x88, 0xDC, 0x7E, 0x6F, 0xCB, 0x8A, 0x42, 0x6B, 0x2A, 0x64, 0x44, 0x49, 0xB6, 0x9C, 0xB0, - 0x07, 0x49, 0x80, 0x65, 0xEC, 0x27, 0x94, 0x7B, 0x6D, 0xD5, 0xCC, 0x27, 0x33, 0x96, 0xB4, 0x9A, - 0xD6, 0x93, 0x0B, 0xDF, 0xFD, 0x86, 0x54, 0x75, 0xD1, 0x69, 0x57, 0xE1, 0xC3, 0x72, 0x4A, 0x41, - 0x44, 0x83, 0x2E, 0x35, 0x93, 0x18, 0x25, 0xCC, 0xC2, 0x50, 0x1E, 0x58, 0x6A, 0xAB, 0x19, 0xE5, - 0x96, 0x89, 0x13, 0x73, 0x09, 0x43, 0x32, 0x90, 0x43, 0x95, 0x3E, 0xEC, 0xA0, 0xE6, 0x2E, 0x7E, - 0x34, 0x80, 0xB3, 0xCA, 0x14, 0x96, 0x66, 0x42, 0x3D, 0x0A, 0x17, 0xA0, 0x4A, 0x5D, 0xB2, 0x7E, - 0x97, 0xEF, 0x53, 0x54, 0xDB, 0x4F, 0xCE, 0x13, 0x7F, 0xC4, 0x9C, 0x1E, 0xA7, 0xB0, 0xE6, 0xC0, - 0x71, 0x82, 0x3E, 0xEB, 0xB4, 0xDB, 0x38, 0x96, 0xED, 0x04, 0xC3, 0xE1, 0x02, 0xBA, 0x45, 0xFB, - 0xA8, 0x1F, 0xC4, 0x8C, 0x1C, 0x7F, 0xC6, 0xC7, 0x89, 0x26, 0xA7, 0xD7, 0x17, 0x89, 0x13, 0xF2, - 0x7B, 0xB7, 0xBB, 0x9E, 0x79, 0x6C, 0x08, 0x52, 0x85, 0x93, 0x70, 0x8C, 0x47, 0xFD, 0x99, 0x85, - 0xED, 0x68, 0x77, 0x6E, 0x4E, 0xCE, 0xE2, 0xE2, 0x2E, 0x34, 0x0B, 0x78, 0x30, 0xB9, 0xAE, 0xCB, - 0xC9, 0xC9, 0xD1, 0xE9, 0xE9, 0xD1, 0xD9, 0xD9, 0xD1, 0xF9, 0xF9, 0xD1, 0xC5, 0xC5, 0xD1, 0xE5, - 0x65, 0x71, 0x1F, 0x96, 0xE2, 0x13, 0x6F, 0x6B, 0x26, 0xA6, 0xB4, 0xA3, 0xF9, 0xFB, 0x47, 0x39, - 0x13, 0x42, 0x28, 0x8D, 0x90, 0x38, 0x21, 0x5D, 0xCE, 0x3D, 0x00, 0x89, 0x3F, 0xAD, 0xD6, 0x8D, - 0xCD, 0xCB, 0x3B, 0xFE, 0x17, 0x22, 0xF9, 0x2E, 0xA8, 0x12, 0x19, 0x15, 0x43, 0x0C, 0x6C, 0xDC, - 0x0F, 0xB1, 0x19, 0x93, 0x8A, 0x93, 0xB1, 0xB1, 0x92, 0xB5, 0xA2, 0x99, 0x20, 0xBE, 0x89, 0xB9, - 0xF1, 0x38, 0x58, 0xB4, 0xD2, 0x90, 0xC1, 0xB0, 0xC0, 0xF3, 0xBC, 0x90, 0x83, 0x40, 0x0E, 0xDF, - 0x4A, 0x9C, 0x50, 0x2C, 0x65, 0xB6, 0x48, 0x9B, 0x46, 0xA2, 0x46, 0xC1, 0x93, 0x23, 0xAF, 0x70, - 0xFE, 0x0E, 0xE3, 0xCF, 0x66, 0x80, 0x6E, 0x3B, 0x52, 0xB4, 0x11, 0xFE, 0x36, 0xA4, 0x39, 0x24, - 0xB3, 0x87, 0xCF, 0x03, 0xD8, 0x51, 0x09, 0x6B, 0x51, 0x84, 0x69, 0x0B, 0xD7, 0xB5, 0x85, 0xDA, - 0x42, 0x9F, 0x63, 0xBE, 0xF8, 0x1F, 0xB6, 0x19, 0xC8, 0xD0, 0x2A, 0xFF, 0x49, 0x73, 0x91, 0x7E, - 0x23, 0xAB, 0x09, 0xF7, 0xA5, 0x53, 0x0E, 0x80, 0x19, 0x86, 0x1F, 0x0C, 0x42, 0x9B, 0x12, 0x7E, - 0xD9, 0x3D, 0x64, 0xA3, 0x36, 0xB0, 0x36, 0xE0, 0xD2, 0x4F, 0x68, 0x92, 0xB6, 0x6B, 0xEF, 0x3C, - 0xC4, 0x3F, 0x77, 0x4A, 0x23, 0xF5, 0xC4, 0x00, 0x39, 0x85, 0x8A, 0x4B, 0x07, 0xE5, 0x44, 0x49, - 0x3E, 0x51, 0x58, 0xB2, 0x78, 0x88, 0xD1, 0x74, 0x6A, 0xBB, 0x14, 0xA1, 0xBD, 0x72, 0x8A, 0x8F, - 0xF9, 0xE5, 0x92, 0xD4, 0xBC, 0xD5, 0x66, 0x19, 0xDA, 0xD4, 0x23, 0x37, 0x5E, 0x95, 0x2E, 0x81, - 0xD2, 0x28, 0x81, 0x82, 0xA6, 0xEB, 0x26, 0x86, 0x34, 0x82, 0x94, 0x63, 0x70, 0x8B, 0x47, 0xA1, - 0xFB, 0xAE, 0x38, 0x5C, 0x64, 0x51, 0x52, 0x94, 0x3D, 0x22, 0x30, 0xB0, 0x41, 0x88, 0x66, 0x55, - 0xD3, 0xF3, 0x03, 0x91, 0x69, 0x8F, 0xD6, 0x02, 0x1F, 0xBB, 0x18, 0xCA, 0x4F, 0xA1, 0x8D, 0x82, - 0x70, 0x81, 0x56, 0x89, 0x9C, 0x15, 0xF4, 0xFA, 0x6B, 0x42, 0x66, 0x73, 0x9E, 0xA4, 0xD3, 0x0E, - 0x8F, 0x14, 0x1E, 0x4D, 0xAA, 0x6D, 0x99, 0xF3, 0xA0, 0xE8, 0x52, 0x9F, 0x42, 0x4C, 0x18, 0x3D, - 0x30, 0x8E, 0x87, 0xD4, 0x55, 0xE0, 0xBC, 0x70, 0xC7, 0x4D, 0xFC, 0xC6, 0xEF, 0x65, 0x6E, 0xCD, - 0x9D, 0x90, 0x5C, 0x2E, 0xCB, 0x54, 0x0C, 0xAC, 0x25, 0x8F, 0xF3, 0x5D, 0xDB, 0x79, 0x3A, 0x8D, - 0xB4, 0x96, 0x95, 0xE3, 0xF8, 0x23, 0xFB, 0x2E, 0xCA, 0xEF, 0xF2, 0x65, 0x71, 0xAD, 0xCC, 0x4C, - 0x56, 0x81, 0x1B, 0x51, 0x1D, 0x24, 0x94, 0x5E, 0x76, 0xA2, 0x62, 0xC4, 0x70, 0x84, 0xA3, 0xC0, - 0x29, 0x0E, 0x72, 0x9F, 0xDB, 0x86, 0x8F, 0x56, 0x47, 0xE1, 0xED, 0xF0, 0x68, 0x6A, 0x09, 0xFD, - 0x6F, 0xE0, 0xD0, 0x37, 0x74, 0x41, 0xF3, 0xB1, 0x68, 0xB1, 0x87, 0x89, 0x3F, 0x81, 0x0D, 0xC1, - 0x51, 0xDF, 0xD7, 0x1E, 0x39, 0x8B, 0x6E, 0xA9, 0x52, 0x8F, 0x5C, 0x30, 0x8D, 0xC8, 0xDA, 0xCB, - 0x00, 0xA5, 0xA7, 0x79, 0x48, 0x16, 0x83, 0x6C, 0x7B, 0xA6, 0x83, 0x49, 0xAF, 0xDE, 0x98, 0xAA, - 0x2A, 0xB1, 0xC4, 0x68, 0x85, 0x85, 0x14, 0x57, 0x93, 0xFB, 0x99, 0xB0, 0x9D, 0x49, 0xD8, 0x8E, - 0x55, 0x66, 0x25, 0x2A, 0x4F, 0x2E, 0x5E, 0xA5, 0x95, 0x57, 0xA9, 0x95, 0x6B, 0xB9, 0x25, 0xE6, - 0x8C, 0xC8, 0x11, 0xBC, 0x93, 0x80, 0x5F, 0xC7, 0x09, 0x3D, 0x38, 0xA2, 0xAE, 0xCD, 0x2E, 0x47, - 0xC5, 0xCA, 0x18, 0x23, 0xC8, 0x5E, 0x7C, 0x55, 0x3B, 0xA0, 0x0F, 0x07, 0x23, 0x46, 0x90, 0xE4, - 0x7E, 0x89, 0xFE, 0x58, 0xD4, 0xDF, 0xD1, 0xD2, 0x33, 0x3E, 0x9D, 0x24, 0x33, 0xD3, 0xF8, 0x62, - 0x36, 0xA2, 0x7A, 0x2D, 0xF0, 0xC7, 0x2E, 0xB3, 0x1D, 0xC1, 0x46, 0x41, 0x3A, 0xC3, 0xDC, 0x4A, - 0xE6, 0xA3, 0xCC, 0xFD, 0x4E, 0x85, 0xBB, 0x06, 0x9A, 0xFD, 0x22, 0xD3, 0xD5, 0xFB, 0xB5, 0x21, - 0x59, 0x47, 0x0E, 0x66, 0xC2, 0x89, 0x43, 0x7A, 0xF8, 0xD2, 0x45, 0x0A, 0x13, 0xAF, 0x61, 0x22, - 0x0B, 0x31, 0x8E, 0xAC, 0x3D, 0x7F, 0xC4, 0xF6, 0xA9, 0x94, 0x3C, 0xDC, 0x71, 0xA3, 0xBE, 0x56, - 0x3A, 0x55, 0x53, 0x8E, 0x90, 0xAB, 0x2D, 0x89, 0x09, 0xC2, 0x10, 0xB6, 0xB7, 0x95, 0x23, 0xE4, - 0x6A, 0x4B, 0x64, 0x94, 0xDC, 0x8A, 0x7A, 0x4A, 0x1A, 0x67, 0xB6, 0x32, 0x44, 0x9D, 0x45, 0xCA, - 0x79, 0x74, 0x4B, 0x2E, 0x9B, 0xDE, 0xF9, 0x32, 0x0C, 0xE7, 0x6A, 0x49, 0x5D, 0x46, 0xC9, 0x68, - 0x78, 0xB4, 0x2C, 0x2F, 0xD1, 0xCB, 0x89, 0x8F, 0xC9, 0x05, 0x09, 0xC5, 0xDD, 0x88, 0x00, 0xE0, - 0x42, 0xC4, 0x35, 0xBD, 0x9F, 0xAA, 0xF8, 0x1B, 0xA1, 0x3C, 0x09, 0xDB, 0x18, 0xF2, 0xA3, 0x45, - 0xD4, 0x06, 0xB8, 0x6F, 0xDA, 0xBA, 0xC7, 0x31, 0x6D, 0x33, 0x6A, 0x29, 0xA2, 0x6E, 0xA2, 0x77, - 0xC9, 0xA5, 0x53, 0x12, 0x0E, 0x25, 0x28, 0x7F, 0xC0, 0xF7, 0xE8, 0xB1, 0xE5, 0x3C, 0xC1, 0xD3, - 0x1A, 0x15, 0x37, 0xE9, 0xA1, 0x22, 0xC3, 0x43, 0xA5, 0x2F, 0xD2, 0x28, 0x79, 0x4D, 0x6D, 0x75, - 0x50, 0xA4, 0x49, 0x1D, 0x09, 0x5B, 0x79, 0xEE, 0x59, 0x2B, 0x9B, 0x30, 0x26, 0x29, 0x0A, 0x48, - 0x26, 0x3B, 0x78, 0xAE, 0x62, 0xED, 0x0A, 0x81, 0x35, 0x59, 0x1C, 0x8E, 0xD0, 0xE2, 0xDA, 0x9C, - 0xEE, 0x9B, 0x39, 0xFE, 0xCE, 0x35, 0xE1, 0x7A, 0x15, 0x0F, 0x82, 0xBD, 0x9F, 0xD2, 0xBB, 0xF5, - 0xCA, 0x71, 0x5D, 0xE1, 0x5A, 0x34, 0xEF, 0x30, 0x8D, 0xCA, 0x71, 0x63, 0x09, 0xC3, 0xC0, 0x86, - 0x36, 0x97, 0x30, 0x0C, 0xDC, 0x9B, 0x5A, 0x4B, 0x18, 0x66, 0xAF, 0x72, 0xBC, 0xB7, 0x84, 0x61, - 0xF6, 0x2B, 0xC7, 0xFB, 0x4B, 0x18, 0xE6, 0xA0, 0x72, 0x7C, 0xA0, 0x34, 0x8C, 0x97, 0x7B, 0x12, - 0x13, 0x68, 0x47, 0x5E, 0x84, 0x8A, 0xAA, 0x1B, 0x62, 0x35, 0x03, 0xF0, 0x1E, 0x1E, 0xDC, 0x39, - 0x67, 0x93, 0x47, 0x40, 0x9F, 0xA1, 0x5B, 0x7C, 0x0B, 0xD9, 0x5D, 0xF4, 0x70, 0xC6, 0x62, 0x4B, - 0xBF, 0xB0, 0x74, 0x5E, 0xFC, 0x80, 0x0F, 0xDE, 0xD8, 0x15, 0x45, 0x2C, 0xAA, 0xD0, 0xAD, 0x24, - 0xD5, 0x74, 0xC2, 0x26, 0xA4, 0x60, 0x96, 0xB9, 0x83, 0xF8, 0xA2, 0xFD, 0xCA, 0x5D, 0x3F, 0x66, - 0xAD, 0x6B, 0xAE, 0x4A, 0x8E, 0xA1, 0x6B, 0x39, 0x9A, 0xF1, 0x8D, 0x3F, 0x5D, 0xCA, 0x1A, 0x49, - 0xE7, 0xE6, 0x63, 0xDE, 0x02, 0x42, 0xD3, 0x55, 0x45, 0x23, 0x23, 0x54, 0x8E, 0xE5, 0x2E, 0x44, - 0x0F, 0x54, 0x92, 0x04, 0xD0, 0x39, 0x4F, 0xB6, 0xCC, 0xE0, 0x21, 0x6A, 0xF7, 0x57, 0xEE, 0xA1, - 0xC9, 0xF9, 0x87, 0xDB, 0xF3, 0x34, 0x83, 0x4F, 0x36, 0xE4, 0x3D, 0xD6, 0x6B, 0xF5, 0x39, 0x8F, - 0xF5, 0x59, 0xC2, 0xB4, 0x66, 0x81, 0x88, 0x05, 0xE0, 0x47, 0xBF, 0x3D, 0x6F, 0xA6, 0xD0, 0x32, - 0x4D, 0x6F, 0x7A, 0x86, 0x00, 0x4C, 0x42, 0x4B, 0xC5, 0xF4, 0xA6, 0x70, 0x99, 0x8A, 0xB9, 0x9B, - 0x9E, 0x19, 0x00, 0x79, 0x19, 0x0D, 0x4A, 0xB7, 0x26, 0xF8, 0x22, 0xDE, 0x97, 0x04, 0x1E, 0x2F, - 0xFD, 0xD2, 0x27, 0x66, 0x14, 0xD7, 0x4A, 0x06, 0x36, 0xEB, 0x73, 0x4E, 0xD7, 0x3D, 0x98, 0x60, - 0x5C, 0xCF, 0x0B, 0x24, 0xC5, 0x61, 0xA6, 0xC1, 0xF8, 0xD2, 0x27, 0xAC, 0x72, 0xAB, 0x7C, 0x45, - 0x4B, 0xDC, 0x63, 0xA2, 0xB5, 0x44, 0xFB, 0x8E, 0x2A, 0x67, 0x79, 0x4F, 0x99, 0xAD, 0xE6, 0x2D, - 0xD7, 0x64, 0x75, 0x7B, 0x36, 0x24, 0xD1, 0x13, 0x8A, 0x89, 0x38, 0xE5, 0x70, 0xB1, 0x1E, 0xA2, - 0xC3, 0x12, 0xCD, 0x50, 0xC9, 0xB9, 0xBC, 0x9A, 0x1E, 0x97, 0x96, 0x1F, 0x23, 0x1B, 0x9E, 0x38, - 0x9A, 0x69, 0xFB, 0x52, 0x59, 0x80, 0xF7, 0x1A, 0xD6, 0xE5, 0x5A, 0x10, 0xA2, 0x22, 0x02, 0x28, - 0x05, 0xEE, 0x3D, 0x2F, 0x4C, 0xFA, 0xB8, 0xF8, 0x01, 0x2E, 0xA2, 0xC6, 0xBE, 0xC1, 0x9F, 0x20, - 0x44, 0x38, 0x03, 0x98, 0x83, 0x21, 0x15, 0x13, 0x5D, 0x93, 0x5B, 0x70, 0xFD, 0x71, 0xBC, 0x87, - 0xB7, 0x66, 0xAD, 0x9D, 0x2E, 0xE3, 0xE5, 0x62, 0xA1, 0xA2, 0x5E, 0x9C, 0xF9, 0xF8, 0x95, 0x07, - 0x29, 0x66, 0x98, 0xE1, 0xF1, 0xB6, 0x63, 0xF3, 0xB9, 0xD8, 0x6D, 0xB6, 0xFF, 0x92, 0x99, 0x6D, - 0x2F, 0xD5, 0x3D, 0xB2, 0xDA, 0x1F, 0xAE, 0x41, 0x35, 0x12, 0x1D, 0xF6, 0xD8, 0xAA, 0x35, 0xF6, - 0x6A, 0x8D, 0x7D, 0x75, 0x36, 0x2B, 0x60, 0x73, 0xFC, 0xD9, 0xF5, 0x9C, 0x1E, 0xF9, 0x15, 0x24, - 0x19, 0x88, 0xE8, 0xB8, 0x2D, 0xBF, 0x3A, 0xD5, 0xBC, 0x98, 0xAE, 0x1A, 0x70, 0xDD, 0x1C, 0x68, - 0xCF, 0xF0, 0xA1, 0x5E, 0x57, 0x24, 0x00, 0x09, 0xE6, 0x27, 0xD3, 0x08, 0xFA, 0x47, 0xAD, 0x7A, - 0x9D, 0xDC, 0x49, 0x80, 0x2B, 0xC9, 0xDE, 0xD5, 0x0D, 0x6A, 0xE3, 0x67, 0x37, 0xC5, 0xAE, 0xD6, - 0xFA, 0xF8, 0x8F, 0x2A, 0xA6, 0x35, 0x09, 0x8A, 0x85, 0xA5, 0xD9, 0x51, 0x3E, 0xD0, 0xD3, 0xFC, - 0x35, 0x7B, 0xE3, 0xC8, 0x93, 0xC1, 0x08, 0xAB, 0xCE, 0x57, 0x64, 0x12, 0x9D, 0x7B, 0xA0, 0x6F, - 0xFA, 0x93, 0x04, 0xD3, 0xF0, 0x7E, 0x60, 0x06, 0x11, 0x12, 0x5D, 0xD2, 0x73, 0xC7, 0x16, 0x15, - 0xE1, 0x92, 0x10, 0x46, 0x39, 0xEB, 0x67, 0xCD, 0x0C, 0xD0, 0x28, 0xBA, 0x3B, 0x63, 0x64, 0xF1, - 0x36, 0x3B, 0xBD, 0xFA, 0x36, 0x97, 0x22, 0xB1, 0x5C, 0x4D, 0x55, 0x44, 0x1B, 0xC0, 0x5F, 0x43, - 0xDB, 0x0C, 0xB6, 0xFC, 0x21, 0xF3, 0xBD, 0x7F, 0x61, 0x42, 0x90, 0x24, 0xAF, 0x17, 0x10, 0xC6, - 0x6D, 0x24, 0x4B, 0x84, 0x91, 0xC8, 0x53, 0x4E, 0x06, 0xFD, 0x28, 0xEC, 0x8E, 0xB9, 0x7D, 0xE0, - 0x0B, 0xE8, 0xBD, 0xD8, 0x3E, 0x7B, 0x3D, 0x15, 0xD2, 0x8C, 0x9B, 0x6D, 0x96, 0x3E, 0x70, 0x71, - 0x85, 0xEC, 0xCD, 0x53, 0x31, 0x7D, 0x0A, 0xE7, 0x8D, 0xEF, 0x00, 0x30, 0x5E, 0xD0, 0x09, 0x00, - 0xF2, 0x73, 0x55, 0x10, 0x8D, 0x7B, 0x89, 0xE5, 0xFB, 0x2B, 0xD8, 0x43, 0xAC, 0x37, 0x4B, 0x4F, - 0xF3, 0x27, 0x92, 0x1A, 0x76, 0x98, 0x9E, 0x65, 0x59, 0xA5, 0x8C, 0x6F, 0x9D, 0xC7, 0xA2, 0x15, - 0x88, 0x1B, 0x95, 0xE3, 0x53, 0xCD, 0xE7, 0x45, 0xCB, 0x17, 0x1F, 0x7F, 0xBB, 0x6B, 0xAF, 0x64, - 0xEE, 0xA9, 0x76, 0x28, 0xDD, 0x72, 0xC5, 0x06, 0x9A, 0x36, 0x1C, 0x53, 0x9E, 0x43, 0xDE, 0xBC, - 0x54, 0xB3, 0x0F, 0x2F, 0x08, 0x77, 0x22, 0x39, 0x55, 0xEC, 0x7A, 0xD6, 0x26, 0xD7, 0xB3, 0xEF, - 0x36, 0x7E, 0x49, 0x3A, 0x91, 0xDA, 0x7A, 0xBA, 0xEA, 0x5A, 0x4E, 0xEF, 0xCE, 0xE9, 0x9C, 0xC3, - 0xFD, 0xDF, 0x78, 0xFD, 0xA2, 0x92, 0x71, 0x7D, 0x15, 0x2C, 0x77, 0x02, 0x9B, 0xD0, 0x39, 0x67, - 0x38, 0xB1, 0xA5, 0xD5, 0x91, 0x7C, 0xBD, 0xFA, 0x2E, 0x57, 0x5D, 0x60, 0xEF, 0x03, 0x53, 0xF7, - 0x60, 0x2F, 0x48, 0x93, 0xC1, 0xE8, 0x46, 0x17, 0x10, 0x63, 0xDF, 0x21, 0xDF, 0x88, 0x01, 0x30, - 0x44, 0x0D, 0x8D, 0x09, 0x91, 0x19, 0x0F, 0xB6, 0xAE, 0x97, 0xF2, 0x84, 0x90, 0x55, 0x21, 0xDF, - 0x48, 0x59, 0xC7, 0xE4, 0x8E, 0xCC, 0xF4, 0x25, 0x5F, 0x56, 0x1D, 0x3D, 0x10, 0x28, 0x61, 0x4A, - 0x77, 0xB3, 0x2C, 0xCC, 0x22, 0xCC, 0xEE, 0xE3, 0x88, 0x85, 0xF9, 0x46, 0x7B, 0x8E, 0x4A, 0x1D, - 0xA9, 0x49, 0xA4, 0x54, 0xCB, 0x71, 0x7B, 0x60, 0xDA, 0x2A, 0xC5, 0x1B, 0x17, 0x71, 0x27, 0x4C, - 0xE0, 0xE8, 0x77, 0x5B, 0x17, 0x52, 0x0A, 0x00, 0x01, 0x91, 0x4F, 0xD4, 0x14, 0x45, 0x65, 0x84, - 0xDE, 0x37, 0xF9, 0x23, 0xE2, 0xA9, 0x25, 0xD6, 0x26, 0x13, 0x4C, 0xA1, 0xE5, 0xAC, 0xC6, 0xEE, - 0x50, 0x39, 0x21, 0xCA, 0x93, 0x47, 0xD5, 0x88, 0x2C, 0x34, 0x2F, 0xE3, 0x7B, 0x96, 0x03, 0x3F, - 0x40, 0xD4, 0x1C, 0x08, 0x97, 0x21, 0x1B, 0x27, 0xB6, 0x83, 0xD7, 0xC8, 0xC0, 0xD4, 0x99, 0x1F, - 0x7A, 0x8F, 0xFC, 0xC5, 0x27, 0xDF, 0x20, 0xE8, 0xCC, 0xC3, 0x6B, 0x68, 0x54, 0x55, 0x10, 0x33, - 0xAA, 0xC0, 0xE8, 0xC9, 0x70, 0xC2, 0x3D, 0x00, 0x3F, 0x00, 0x2A, 0x0C, 0xB8, 0x1F, 0x1B, 0xB0, - 0x1B, 0xD8, 0xB8, 0x79, 0x78, 0x38, 0xFC, 0x46, 0xF5, 0xEE, 0xB9, 0xD8, 0xFB, 0xA7, 0xF2, 0x1D, - 0x54, 0x4D, 0x20, 0x1D, 0x2B, 0x58, 0x4F, 0xA9, 0x7C, 0x48, 0x17, 0x3B, 0x7F, 0x00, 0x5C, 0x45, - 0x70, 0xBF, 0x04, 0x56, 0xAB, 0xDF, 0x71, 0x86, 0x8D, 0x4A, 0x09, 0x24, 0x5C, 0x2E, 0x05, 0xCB, - 0x42, 0x8F, 0x73, 0xD0, 0xB0, 0xDA, 0x26, 0xE3, 0xB5, 0x85, 0x5D, 0xCB, 0x4A, 0x98, 0x44, 0xC6, - 0x8B, 0x27, 0x50, 0xA0, 0xB5, 0x34, 0x95, 0xA4, 0x69, 0x54, 0x23, 0x65, 0x22, 0xD2, 0x6F, 0x74, - 0x90, 0xA0, 0x8D, 0x1B, 0xD3, 0x76, 0x8C, 0x23, 0x55, 0xFA, 0x0E, 0x49, 0x55, 0x04, 0x42, 0x59, - 0x74, 0xEC, 0xC8, 0x00, 0x6D, 0x4D, 0xD0, 0xAF, 0xA0, 0xD3, 0x77, 0x46, 0x8A, 0x8B, 0x26, 0x46, - 0xF5, 0x4A, 0xA4, 0x29, 0x72, 0x2C, 0xA1, 0xFC, 0x68, 0xCE, 0xB2, 0xA2, 0x80, 0x0E, 0xE2, 0x6E, - 0x2E, 0x47, 0x53, 0x25, 0xC9, 0x04, 0x41, 0xAB, 0xD6, 0x1F, 0x1D, 0xB9, 0x7B, 0x65, 0x86, 0x4E, - 0x30, 0x86, 0x94, 0xE6, 0x8A, 0xC4, 0x49, 0xBA, 0x34, 0xE3, 0x15, 0xEB, 0x48, 0x20, 0x93, 0x3A, - 0xEE, 0xE1, 0xBF, 0xC4, 0x4A, 0xBF, 0x69, 0x83, 0x29, 0x56, 0x97, 0xCE, 0xE5, 0xC5, 0xDF, 0x60, - 0xB8, 0x5A, 0x78, 0xFF, 0x9C, 0x13, 0x05, 0x95, 0x99, 0xFC, 0xAA, 0x94, 0x17, 0x9E, 0x3B, 0x0C, - 0x6B, 0xBA, 0x9A, 0x12, 0xA4, 0x00, 0x0F, 0xD5, 0x88, 0x00, 0xCD, 0xB2, 0x14, 0x94, 0x23, 0x8A, - 0xCA, 0xC4, 0x18, 0xA8, 0xA5, 0xEC, 0xE0, 0x9F, 0x64, 0x0C, 0x82, 0x07, 0x39, 0xDC, 0xE8, 0x17, - 0x2C, 0x78, 0x9D, 0x59, 0x0E, 0x46, 0x43, 0x91, 0xB2, 0x27, 0xF4, 0x3C, 0x0C, 0xF7, 0x40, 0xF6, - 0x4D, 0x4E, 0xD5, 0x38, 0x63, 0x5F, 0xF2, 0x74, 0xC7, 0xE6, 0xEB, 0xC9, 0x54, 0x17, 0x86, 0xD0, - 0xF1, 0x2D, 0xB5, 0x91, 0xE1, 0x08, 0xA5, 0x5A, 0x90, 0x4E, 0x6E, 0xDB, 0xD9, 0xFA, 0xA7, 0xF0, - 0x28, 0x5F, 0x4D, 0xD3, 0x92, 0x6E, 0xB0, 0x89, 0xA9, 0xAC, 0x42, 0x48, 0x40, 0x32, 0xF1, 0x0B, - 0xA2, 0xEF, 0x09, 0x26, 0x78, 0xB1, 0x35, 0x76, 0xCB, 0xBB, 0xDC, 0xC3, 0x54, 0x2F, 0xAC, 0xED, - 0xF8, 0x26, 0xA9, 0x89, 0x48, 0x9F, 0x49, 0x81, 0xD5, 0x8D, 0x7A, 0x7D, 0x7F, 0x17, 0x7E, 0x1C, - 0xC4, 0x02, 0x8A, 0x66, 0x18, 0x94, 0x10, 0x51, 0xFA, 0xD6, 0xF5, 0xD6, 0xCD, 0x82, 0xA4, 0x78, - 0x94, 0x66, 0xB7, 0xB0, 0x70, 0x04, 0x75, 0x39, 0x0C, 0x3E, 0x7B, 0xDC, 0x0E, 0x27, 0x86, 0x45, - 0x60, 0x3D, 0xC0, 0xBE, 0x42, 0xF2, 0x33, 0x74, 0xA3, 0xCE, 0xA2, 0xE4, 0x80, 0x2C, 0x1A, 0x91, - 0x6D, 0xFB, 0xAA, 0x37, 0xE1, 0x45, 0x31, 0xE5, 0x34, 0x7A, 0x23, 0xA1, 0x47, 0xB7, 0x5E, 0x90, - 0x9C, 0x55, 0xB1, 0x3D, 0xAD, 0xC3, 0x41, 0xAD, 0xA2, 0x29, 0x57, 0x28, 0xB3, 0x85, 0x66, 0xBD, - 0xB8, 0xF3, 0xF0, 0xF5, 0xC5, 0xF3, 0xF6, 0x5C, 0xFC, 0x3D, 0x9F, 0x78, 0x33, 0x8F, 0xE8, 0x3C, - 0x06, 0x43, 0x55, 0x47, 0x74, 0x27, 0x74, 0x30, 0x97, 0x28, 0x9D, 0xF7, 0x74, 0x5B, 0x90, 0x55, - 0x8F, 0x8C, 0xBE, 0x51, 0x8E, 0x09, 0x0A, 0xF1, 0x1B, 0x5F, 0x40, 0x03, 0xB8, 0x0A, 0xCB, 0x53, - 0x45, 0x63, 0xB4, 0xCF, 0xCA, 0xF1, 0x30, 0x97, 0x45, 0xDB, 0x73, 0x02, 0x07, 0x88, 0x3F, 0xBF, - 0x09, 0x64, 0x4C, 0xBF, 0x13, 0xD6, 0x50, 0x96, 0x51, 0xA4, 0xD3, 0x6E, 0x17, 0x37, 0x89, 0x5C, - 0x5F, 0x14, 0xB6, 0x88, 0x60, 0x8A, 0x90, 0x7F, 0x62, 0x85, 0x7B, 0x80, 0x9D, 0xFA, 0xDE, 0xED, - 0xAE, 0xA4, 0x4D, 0xE5, 0x2C, 0x0E, 0xD8, 0xC7, 0xD4, 0x27, 0xC8, 0x1D, 0xCF, 0xB0, 0x6B, 0x53, - 0x4F, 0x26, 0x48, 0xE1, 0x1E, 0x1A, 0xCA, 0x30, 0x17, 0x15, 0x62, 0x0B, 0xDD, 0xD0, 0xB6, 0x01, - 0x24, 0x1F, 0x92, 0x59, 0x54, 0xAE, 0x9D, 0xA7, 0xEA, 0x85, 0xCD, 0xBD, 0xDE, 0x0B, 0xDB, 0x06, - 0x40, 0x7D, 0xA0, 0xF4, 0x2C, 0x41, 0xE8, 0xD9, 0x89, 0x77, 0x9C, 0x6E, 0x37, 0xA1, 0x7E, 0x88, - 0x81, 0xBA, 0xE6, 0x85, 0x57, 0x4B, 0xCF, 0xF8, 0x73, 0xA9, 0xE9, 0x81, 0xE3, 0x0D, 0x1D, 0x86, - 0xE3, 0xF8, 0x7C, 0xF1, 0x3C, 0xE1, 0xD2, 0xBB, 0x84, 0x4C, 0x40, 0xD9, 0xC9, 0x28, 0x89, 0xAB, - 0x25, 0x23, 0x69, 0x76, 0xE1, 0xE2, 0x58, 0xE6, 0x1E, 0x1A, 0xFD, 0xF0, 0xF0, 0x0D, 0x7D, 0xEE, - 0x61, 0x16, 0x0B, 0x4A, 0xE6, 0x47, 0xF7, 0x2D, 0x4F, 0xB8, 0x3F, 0x27, 0x93, 0x0A, 0xC9, 0xF0, - 0x2B, 0x8F, 0xBC, 0xF5, 0x80, 0xE3, 0x3D, 0xC4, 0x2D, 0x6A, 0x20, 0x01, 0xBC, 0x48, 0x7D, 0x99, - 0x8D, 0xC6, 0x2C, 0x34, 0xE9, 0x0F, 0x34, 0x93, 0x1C, 0xAA, 0x48, 0xDF, 0x36, 0x36, 0x7E, 0x7F, - 0x38, 0xC6, 0x22, 0x63, 0xF5, 0x57, 0x2D, 0x75, 0x62, 0xAE, 0x80, 0xEF, 0xC9, 0x5A, 0x83, 0x6E, - 0x16, 0xAD, 0x4A, 0x71, 0x8A, 0xCF, 0x20, 0x6B, 0x2A, 0xFE, 0x3E, 0xF6, 0x88, 0x1F, 0x25, 0xA3, - 0xD9, 0x61, 0x00, 0xEE, 0xB8, 0x49, 0xCF, 0xE5, 0x0F, 0x31, 0xE1, 0xDB, 0x14, 0x97, 0x10, 0xB1, - 0x38, 0xC4, 0x19, 0x0C, 0x7E, 0x1F, 0xF6, 0x7E, 0x23, 0x7F, 0xB2, 0x73, 0xFC, 0xC8, 0xF0, 0xF3, - 0x0C, 0xD7, 0xE4, 0x32, 0xAE, 0xD9, 0x79, 0x1C, 0x34, 0x11, 0xC0, 0xE7, 0x42, 0xD1, 0x06, 0xB3, - 0x14, 0x1F, 0x84, 0xD1, 0x9D, 0x9D, 0x39, 0x21, 0xD2, 0xE1, 0x52, 0x38, 0x56, 0x6A, 0x1E, 0xAF, - 0xC1, 0xAE, 0x4E, 0x18, 0xC9, 0xBA, 0x4C, 0x48, 0xC4, 0xE3, 0x6F, 0xC7, 0x52, 0x21, 0x09, 0xEC, - 0xC9, 0x88, 0xB2, 0xE5, 0x90, 0xE3, 0xA6, 0x68, 0xE2, 0x60, 0xE0, 0x28, 0x10, 0x01, 0x3A, 0x2F, - 0x54, 0xE1, 0x83, 0x60, 0x35, 0xFA, 0x0B, 0x90, 0x3C, 0x70, 0xAB, 0x1F, 0xBE, 0xF4, 0xD5, 0x24, - 0xA4, 0x40, 0x29, 0xB8, 0x40, 0x98, 0xFD, 0x8A, 0xF0, 0x95, 0xC2, 0xF1, 0x25, 0x17, 0x00, 0x2E, - 0xCF, 0x26, 0xD4, 0x7A, 0xCD, 0x08, 0x13, 0x42, 0x3B, 0x39, 0x95, 0x28, 0x2E, 0xA4, 0xEC, 0xA8, - 0x93, 0x8B, 0x4C, 0xFF, 0xB9, 0xE2, 0x4E, 0x32, 0x8D, 0xC7, 0x8F, 0x9B, 0xC3, 0x6F, 0x35, 0x03, - 0xF7, 0x4C, 0x94, 0x4A, 0x0C, 0x8A, 0x15, 0xCB, 0xFC, 0x98, 0x81, 0xC2, 0x3A, 0x24, 0x7F, 0x94, - 0x33, 0x3E, 0xFF, 0xE9, 0xAC, 0x0D, 0x12, 0x60, 0x04, 0xF5, 0x10, 0x35, 0xCC, 0xF8, 0x6C, 0xD1, - 0xAC, 0x34, 0x39, 0xBC, 0xE2, 0x21, 0x6C, 0xF4, 0x75, 0x37, 0x9A, 0x28, 0x1E, 0xBD, 0x4B, 0x67, - 0xBC, 0x49, 0x35, 0x66, 0x0C, 0x31, 0x62, 0xBF, 0x98, 0xBE, 0x11, 0x97, 0x52, 0x8B, 0xF8, 0xA3, - 0xCC, 0x73, 0xCC, 0xD0, 0x83, 0xFE, 0x59, 0x94, 0x0C, 0x3C, 0x11, 0xF9, 0xCC, 0x76, 0xD8, 0xF9, - 0xB7, 0xCE, 0x0E, 0xFB, 0x0A, 0x37, 0xA2, 0x27, 0x60, 0xD0, 0x28, 0x4D, 0x76, 0xC2, 0x7B, 0xEC, - 0xE9, 0x46, 0xF3, 0x1F, 0xF2, 0xBB, 0xF1, 0xAC, 0xD6, 0xE5, 0x45, 0xC5, 0xE3, 0x92, 0x20, 0x72, - 0xD5, 0x4E, 0x67, 0xC7, 0x8E, 0xE0, 0xB9, 0xF8, 0x2C, 0xD9, 0x11, 0xEA, 0x5D, 0xB5, 0x53, 0xF5, - 0x5D, 0xF7, 0x47, 0x34, 0x94, 0x97, 0x99, 0x9D, 0x3B, 0x7A, 0x4D, 0xFD, 0x39, 0x62, 0x17, 0x39, - 0x83, 0xC9, 0xF3, 0x77, 0x1C, 0x06, 0x92, 0xBA, 0x30, 0x8B, 0x6F, 0x6F, 0x3D, 0xB5, 0xF6, 0x7E, - 0xD9, 0x49, 0xB5, 0x13, 0xF8, 0xA1, 0x6E, 0x76, 0x1F, 0x36, 0x7A, 0x03, 0xB5, 0xBA, 0x62, 0xE6, - 0xFC, 0xAD, 0x33, 0x83, 0x44, 0xE0, 0x8D, 0xF5, 0xA0, 0x0A, 0x5C, 0xCA, 0x86, 0x10, 0x8A, 0x11, - 0x82, 0x22, 0xEC, 0x32, 0x94, 0x00, 0xAD, 0xDE, 0x10, 0x29, 0xC8, 0xE3, 0x7A, 0x06, 0x39, 0xC8, - 0xB7, 0xD6, 0x83, 0x24, 0xA2, 0x25, 0x6D, 0xC8, 0xA2, 0x18, 0x59, 0xE4, 0x80, 0x5F, 0x86, 0x34, - 0x64, 0xCB, 0x37, 0x44, 0x1E, 0x42, 0x82, 0x9D, 0x41, 0x1D, 0x09, 0x31, 0x77, 0x3D, 0x28, 0xC4, - 0x17, 0x13, 0x1E, 0xC0, 0x84, 0x37, 0x54, 0x52, 0x90, 0x4A, 0x24, 0x66, 0xE4, 0x27, 0x12, 0xD1, - 0xF0, 0xD5, 0x8B, 0x93, 0x14, 0xBC, 0xE7, 0xCC, 0x95, 0xCF, 0x2E, 0x02, 0xC1, 0xB7, 0xC0, 0x4D, - 0x55, 0xF2, 0x19, 0x4F, 0x56, 0x31, 0xF2, 0x62, 0x70, 0x92, 0x42, 0x01, 0x9F, 0xFC, 0xC5, 0x7B, - 0x46, 0x46, 0x88, 0x6F, 0xA9, 0x48, 0x46, 0x8D, 0x66, 0xEB, 0xAD, 0xE4, 0x83, 0x53, 0xA6, 0x06, - 0x55, 0xCF, 0x84, 0x34, 0x2D, 0x44, 0xFB, 0xA9, 0x96, 0x1B, 0x21, 0xD3, 0xAA, 0x30, 0x25, 0x14, - 0xC3, 0xF2, 0xC2, 0x8A, 0x53, 0xC4, 0x91, 0xD7, 0xD7, 0x99, 0xDA, 0x81, 0xBB, 0x28, 0x75, 0x29, - 0x2C, 0xB0, 0x90, 0xA6, 0x74, 0xD8, 0x6E, 0x6E, 0x25, 0xE9, 0x10, 0xC6, 0x19, 0xFD, 0x28, 0x2E, - 0x7B, 0xC5, 0x54, 0xA3, 0xC3, 0x65, 0xAF, 0x4C, 0xBE, 0x50, 0x1B, 0x29, 0xCA, 0xB2, 0x2E, 0x9E, - 0x5D, 0x80, 0xB1, 0x3D, 0x8B, 0xBF, 0xE2, 0xAB, 0x2C, 0x7A, 0x77, 0xF9, 0x09, 0x40, 0x45, 0x30, - 0x86, 0x30, 0xE3, 0x48, 0xEF, 0xDF, 0x81, 0xF6, 0x6C, 0x0E, 0xC2, 0x41, 0xEC, 0x2B, 0xC6, 0xEE, - 0x79, 0xF0, 0xC4, 0xB9, 0x0D, 0x02, 0x0B, 0xD9, 0x07, 0xCD, 0x47, 0x1E, 0x87, 0x09, 0xD6, 0xD8, - 0x45, 0xAD, 0x57, 0x13, 0x36, 0x21, 0xC9, 0xB3, 0x49, 0x11, 0x8B, 0x36, 0xA0, 0x03, 0x34, 0x51, - 0xFB, 0x43, 0x33, 0x36, 0x76, 0x85, 0xD1, 0x19, 0xFF, 0xEB, 0x80, 0x7D, 0x61, 0x07, 0x7B, 0xFE, - 0x86, 0xAD, 0x4F, 0x65, 0xEB, 0x59, 0x34, 0x52, 0x63, 0xEB, 0x99, 0x56, 0x0B, 0x65, 0xEB, 0x8B, - 0x23, 0x1F, 0x8F, 0xEB, 0x26, 0xA6, 0x9F, 0x9A, 0x45, 0x3B, 0xD1, 0x7B, 0x2B, 0x41, 0x37, 0x6E, - 0x34, 0x9B, 0xA8, 0x12, 0xBB, 0x8C, 0xF4, 0xD6, 0x2D, 0x47, 0x7F, 0x98, 0x46, 0x28, 0x55, 0xCA, - 0x7D, 0x1B, 0x64, 0x7B, 0x21, 0x5A, 0xC1, 0xEF, 0xBE, 0xB0, 0x7F, 0x6F, 0x84, 0x1B, 0x72, 0x99, - 0x4D, 0x2E, 0x31, 0xDA, 0xA8, 0xD3, 0x4A, 0xD4, 0x64, 0x3D, 0x09, 0xE5, 0xD6, 0x71, 0x82, 0x73, - 0x6E, 0xCD, 0xD4, 0x1C, 0xE1, 0x7B, 0x8C, 0x5E, 0x5C, 0x09, 0x4A, 0x09, 0x1C, 0xF2, 0x40, 0xC2, - 0x92, 0xE0, 0xD5, 0xC0, 0x33, 0x5D, 0x2C, 0x26, 0xA2, 0xBD, 0x44, 0xCE, 0x05, 0x5E, 0xEC, 0xC8, - 0x4C, 0x94, 0x83, 0x79, 0xFA, 0x43, 0x3F, 0x61, 0xB9, 0xAA, 0x6F, 0x28, 0x61, 0x16, 0x25, 0x0C, - 0xF1, 0x42, 0x99, 0x12, 0xE2, 0x26, 0x6B, 0x4C, 0x09, 0x20, 0xDB, 0x8A, 0xB4, 0x85, 0x4A, 0xE4, - 0x10, 0xBF, 0xBD, 0x52, 0x52, 0x17, 0x47, 0x50, 0x03, 0x0D, 0x58, 0x20, 0x79, 0x3F, 0x72, 0x55, - 0x9A, 0x68, 0xD4, 0xEB, 0x1B, 0xB2, 0x50, 0x23, 0x8B, 0x21, 0x92, 0xE4, 0xA3, 0x8D, 0xB8, 0xDD, - 0x9A, 0x12, 0x48, 0x84, 0x41, 0x57, 0xC6, 0x2C, 0xEA, 0x88, 0x71, 0xED, 0xEA, 0xFC, 0x95, 0x48, - 0x43, 0xC7, 0x24, 0x38, 0xE4, 0xA9, 0x6A, 0x76, 0x4D, 0x49, 0x20, 0x19, 0x12, 0x48, 0x20, 0xFF, - 0xD7, 0x76, 0x67, 0x18, 0x00, 0x8E, 0xD9, 0xF6, 0xFB, 0x9A, 0xA7, 0xE9, 0x70, 0xE3, 0x78, 0xE7, - 0x32, 0xD3, 0x0C, 0x1D, 0x6A, 0x06, 0x29, 0xD4, 0xA9, 0x61, 0xD8, 0x68, 0x5D, 0xB4, 0x46, 0x94, - 0x20, 0xE1, 0x46, 0xB3, 0xE1, 0xCA, 0xEA, 0x95, 0xAD, 0x37, 0x72, 0x6C, 0x3D, 0xCE, 0x47, 0x88, - 0xE3, 0x60, 0x96, 0x79, 0xF4, 0x1F, 0x12, 0xBE, 0x28, 0x16, 0x97, 0xC3, 0x56, 0x8A, 0xA5, 0x7D, - 0x9E, 0xA6, 0x3A, 0xCA, 0xAA, 0x99, 0x26, 0x68, 0x94, 0x2E, 0x93, 0x93, 0x18, 0xAB, 0x53, 0x1A, - 0x3F, 0xC8, 0x04, 0x45, 0x53, 0xAA, 0xBB, 0x1C, 0x5A, 0xA5, 0xD4, 0x1E, 0x48, 0x85, 0x52, 0x02, - 0x3E, 0xAB, 0xA6, 0x58, 0x4A, 0x2E, 0xB3, 0x4C, 0xD5, 0x92, 0x72, 0xF2, 0xC3, 0xCE, 0x39, 0xEB, - 0x98, 0x7F, 0xF0, 0xB8, 0xD0, 0xAC, 0x6F, 0xE0, 0x9F, 0x93, 0x73, 0x02, 0xD4, 0xD9, 0xCD, 0x29, - 0x12, 0x1D, 0xDB, 0x65, 0x97, 0x1E, 0x4F, 0xB6, 0xC3, 0x3F, 0x3B, 0x2E, 0x30, 0xE4, 0x19, 0x5C, - 0x78, 0x56, 0xCF, 0x85, 0x4C, 0x19, 0x94, 0xAC, 0x35, 0xBB, 0xD9, 0x77, 0xF8, 0x70, 0xEA, 0xE1, - 0x15, 0x78, 0x12, 0x52, 0x5B, 0x16, 0xEF, 0x06, 0x33, 0x4B, 0xA7, 0x04, 0xFD, 0x63, 0xCC, 0x98, - 0xF0, 0x79, 0x17, 0x3E, 0xCC, 0x7E, 0x15, 0x01, 0xA9, 0xF4, 0xAA, 0x71, 0x9C, 0x62, 0xA8, 0x43, - 0x6F, 0xC3, 0x68, 0x3D, 0x1D, 0x0A, 0x78, 0x3A, 0xB1, 0xAC, 0xCA, 0x44, 0x4F, 0xC5, 0xBC, 0x75, - 0xF8, 0x12, 0x50, 0x22, 0x02, 0xC7, 0x94, 0x01, 0x30, 0xD9, 0xA9, 0x8E, 0x88, 0xBB, 0x81, 0x57, - 0x26, 0x30, 0x0D, 0x4A, 0x30, 0x71, 0xF1, 0x4C, 0x51, 0x1E, 0x7F, 0x8B, 0x3C, 0xE9, 0xFE, 0x56, - 0xAF, 0x05, 0xCF, 0xC1, 0x8C, 0xA9, 0x44, 0x1D, 0xEC, 0x13, 0xCE, 0x28, 0xBD, 0x3A, 0x01, 0xC4, - 0x22, 0x4A, 0x0F, 0xC1, 0x71, 0x75, 0x2E, 0x00, 0x3E, 0x79, 0x52, 0x8A, 0x40, 0x9E, 0xB0, 0x45, - 0x2C, 0xC9, 0x86, 0x94, 0xAA, 0x00, 0xBE, 0xE6, 0x76, 0x34, 0x9B, 0x8D, 0x7A, 0xAB, 0xF1, 0xB7, - 0x7A, 0xB3, 0xDE, 0xA8, 0x1F, 0x88, 0x0C, 0x20, 0x4A, 0x60, 0x86, 0x76, 0xEC, 0x2F, 0x0B, 0xDD, - 0x93, 0x91, 0x99, 0xBD, 0xCF, 0x6D, 0x69, 0xD6, 0x3F, 0xE5, 0xD8, 0x96, 0xBD, 0xFA, 0xE1, 0xD2, - 0xB6, 0x45, 0xCE, 0x6C, 0x6D, 0xB6, 0x05, 0xBE, 0xC2, 0x83, 0xE2, 0x78, 0xDA, 0xD1, 0xA2, 0xB6, - 0xA3, 0xE2, 0xB8, 0x55, 0xD9, 0xD3, 0xE9, 0xE6, 0xC0, 0xCA, 0x50, 0xDC, 0x4B, 0x80, 0xE1, 0x1C, - 0x6B, 0xE1, 0x12, 0xA3, 0x16, 0x9F, 0x14, 0x93, 0xBA, 0xA8, 0x6E, 0x7A, 0xB9, 0xAF, 0x15, 0x59, - 0x1F, 0x08, 0x5D, 0x98, 0x42, 0x97, 0x56, 0x28, 0x3F, 0x97, 0xB3, 0x46, 0xA5, 0xCD, 0x9F, 0xE6, - 0x24, 0x31, 0xE5, 0xE6, 0x9B, 0x3F, 0x6D, 0xF4, 0xC4, 0x94, 0xD1, 0xF8, 0xB9, 0x31, 0x3C, 0xF5, - 0x1B, 0xC9, 0x1C, 0xD1, 0x22, 0x75, 0x32, 0x8A, 0x8B, 0xB3, 0x72, 0x43, 0x8B, 0x3C, 0xC4, 0x93, - 0x56, 0x3B, 0x35, 0x16, 0x6E, 0x6C, 0x76, 0x72, 0x77, 0x4C, 0x3E, 0xF2, 0x7A, 0x22, 0x1D, 0xF9, - 0xCC, 0x4C, 0xE3, 0x33, 0x52, 0x7D, 0x4B, 0x01, 0x52, 0x2C, 0x10, 0xD3, 0x03, 0x87, 0xFE, 0xE4, - 0xF2, 0x09, 0xC5, 0x43, 0xA1, 0x6C, 0x23, 0x7B, 0x25, 0xCB, 0xBC, 0xDF, 0xF7, 0xA6, 0x48, 0xEF, - 0x13, 0xB4, 0x20, 0xE3, 0xD2, 0xDE, 0x67, 0xEE, 0xD2, 0x18, 0xD0, 0xED, 0xC3, 0x95, 0x02, 0x3E, - 0x37, 0x48, 0x09, 0xD2, 0x68, 0x46, 0x8F, 0xEA, 0x53, 0x93, 0x9F, 0x4C, 0xC9, 0x26, 0xA5, 0x3D, - 0xF2, 0xD3, 0x60, 0xB4, 0x94, 0x93, 0xC8, 0xAF, 0x91, 0xA6, 0x2F, 0x7C, 0x57, 0x98, 0xAE, 0x29, - 0x29, 0x14, 0xFC, 0x35, 0xAD, 0xD8, 0x5D, 0xCA, 0x1A, 0x3F, 0xA2, 0xB1, 0xC0, 0xBE, 0x50, 0x3B, - 0xD1, 0x88, 0xB5, 0x13, 0xB3, 0x0A, 0x26, 0xB9, 0xC9, 0xF9, 0x16, 0xAB, 0xEA, 0x97, 0xEA, 0x22, - 0x8A, 0x1D, 0xCD, 0x15, 0x51, 0x3A, 0x31, 0xAC, 0x4E, 0x61, 0xF3, 0xC4, 0x86, 0xE5, 0xDF, 0x22, - 0xFE, 0x6C, 0x06, 0xE3, 0xB6, 0xC8, 0x09, 0x03, 0x9C, 0xF1, 0xD8, 0xAD, 0xC2, 0x36, 0xC3, 0xAD, - 0xBA, 0x80, 0xBF, 0x30, 0xB0, 0x66, 0xF2, 0x76, 0x51, 0x0C, 0xE7, 0xE8, 0x2E, 0x79, 0x7C, 0xE0, - 0x3C, 0x4A, 0x95, 0x52, 0x3C, 0x4C, 0x91, 0x6D, 0x93, 0x6B, 0x18, 0xB7, 0x6D, 0x2A, 0x31, 0xBC, - 0xEE, 0xF1, 0x3F, 0xD9, 0xF7, 0xBE, 0xFB, 0x67, 0xF5, 0x4D, 0xC9, 0x3E, 0x1B, 0xF9, 0xDB, 0xD7, - 0x3D, 0xD3, 0x0D, 0x98, 0xEF, 0xE9, 0x80, 0x11, 0x9E, 0xBE, 0x8B, 0xF1, 0xE7, 0xB5, 0xBF, 0xD3, - 0x34, 0xC4, 0x57, 0xF2, 0xE5, 0x64, 0xC3, 0xCF, 0xA9, 0x6F, 0x48, 0xE2, 0x70, 0x6C, 0xAA, 0x72, - 0xE8, 0x60, 0x12, 0x48, 0x9F, 0x7D, 0x61, 0x86, 0xA3, 0x87, 0xA8, 0x45, 0xAC, 0xFD, 0x1E, 0x72, - 0xEF, 0x45, 0x5C, 0xB6, 0x1C, 0x0F, 0xAE, 0x5B, 0xDB, 0x5B, 0xB5, 0x20, 0xD8, 0xFA, 0x30, 0x6C, - 0x1A, 0x35, 0xAA, 0x81, 0xB8, 0x72, 0xA1, 0xE9, 0xFD, 0xED, 0x80, 0x7D, 0x39, 0x66, 0xFF, 0x9A, - 0x5E, 0x06, 0xA6, 0x2F, 0xBB, 0x77, 0x9C, 0xC0, 0x0F, 0x3C, 0xCD, 0xAD, 0xDD, 0x89, 0x26, 0xDB, - 0x41, 0xA2, 0x9B, 0x7F, 0xFB, 0x10, 0xCD, 0x33, 0x9E, 0x1C, 0x6C, 0x09, 0xDC, 0xEA, 0x89, 0x2B, - 0x7D, 0xDE, 0xED, 0x07, 0x03, 0xEB, 0xF8, 0xFF, 0x03, 0x3D, 0xB9, 0x4C, 0x96, 0x59, 0xFF, 0x00 + 0x1F, 0x8B, 0x08, 0x08, 0x5A, 0x67, 0x4B, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x52, 0xE3, 0x4A, + 0x93, 0xE0, 0xFF, 0xF3, 0x14, 0x35, 0x9E, 0x9D, 0x81, 0x9E, 0xC1, 0xC6, 0x17, 0xA0, 0x69, 0xBE, + 0x6E, 0x22, 0xB8, 0x76, 0xB3, 0x1F, 0x74, 0x3B, 0x30, 0xFD, 0x9D, 0xCB, 0xC6, 0xEE, 0x09, 0x21, + 0x95, 0x6D, 0x7D, 0xC8, 0x92, 0x8E, 0x2E, 0xD0, 0x9C, 0x89, 0x99, 0x98, 0xC7, 0xD8, 0x7D, 0x90, + 0x7D, 0x81, 0x7D, 0x94, 0x79, 0x92, 0xCD, 0xCC, 0x2A, 0xC9, 0x92, 0x2C, 0xDB, 0x25, 0x21, 0x1B, + 0x1B, 0xE8, 0x13, 0x07, 0x8C, 0xAC, 0xBA, 0x65, 0x65, 0x66, 0x65, 0x66, 0xE5, 0xE5, 0xE3, 0x3F, + 0x9C, 0x7E, 0x3B, 0xB9, 0xF9, 0xB5, 0x7B, 0xC6, 0x86, 0xC1, 0xC8, 0x3A, 0xFC, 0xE9, 0x23, 0xFE, + 0x62, 0x96, 0x66, 0x0F, 0x3E, 0xD5, 0xB8, 0x5D, 0x3B, 0xFC, 0x09, 0x9E, 0x70, 0xCD, 0x38, 0xFC, + 0x89, 0xC1, 0xBF, 0x8F, 0x23, 0x1E, 0x68, 0x4C, 0x1F, 0x6A, 0x9E, 0xCF, 0x83, 0x4F, 0xB5, 0x30, + 0xE8, 0xD7, 0xF7, 0x6B, 0x6C, 0x3B, 0xF9, 0xE5, 0x30, 0x08, 0xDC, 0x3A, 0xFF, 0x23, 0x34, 0xEF, + 0x3F, 0xD5, 0x7E, 0xA9, 0x7F, 0x3F, 0xAA, 0x9F, 0x38, 0x23, 0x57, 0x0B, 0xCC, 0x5B, 0x8B, 0xD7, + 0x98, 0xEE, 0xD8, 0x01, 0xB7, 0xA1, 0xE5, 0xC5, 0xD9, 0x27, 0x6E, 0x0C, 0xF8, 0x96, 0x3E, 0xF4, + 0x9C, 0x11, 0xFF, 0xD4, 0x1A, 0x77, 0x12, 0x98, 0x81, 0xC5, 0x0F, 0x7B, 0xAE, 0xE6, 0xDD, 0x9D, + 0x87, 0x36, 0xBB, 0xBE, 0xF9, 0x2B, 0xEB, 0xF1, 0x20, 0x74, 0x3F, 0x6E, 0x8B, 0x6F, 0x12, 0x43, + 0xD9, 0x1A, 0x34, 0xAD, 0xDD, 0x9B, 0xFC, 0xC1, 0x75, 0xBC, 0xA0, 0x46, 0xDF, 0xE0, 0xBF, 0x78, + 0x94, 0x07, 0xD3, 0x08, 0x86, 0x9F, 0x0C, 0x7E, 0x6F, 0xEA, 0xBC, 0x4E, 0x7F, 0x6C, 0x31, 0xD3, + 0x36, 0x03, 0x53, 0xB3, 0xEA, 0xBE, 0xAE, 0x59, 0x30, 0xF0, 0x16, 0x1B, 0x69, 0x3F, 0xCC, 0x51, + 0x38, 0x1A, 0x3F, 0x08, 0x7D, 0xEE, 0xD1, 0x5F, 0x1A, 0xCC, 0xF9, 0x53, 0x73, 0x8B, 0xF9, 0x43, + 0xCF, 0xB4, 0xEF, 0xEA, 0x81, 0x53, 0xEF, 0x9B, 0xC1, 0xA7, 0x47, 0xEE, 0x8F, 0x67, 0x6B, 0xC1, + 0x17, 0xCC, 0xE3, 0xD6, 0xA7, 0x9A, 0x1F, 0x3C, 0x5A, 0xDC, 0x1F, 0x72, 0x1E, 0xD4, 0xD8, 0xD0, + 0xE3, 0x7D, 0x78, 0xE2, 0xE9, 0xDB, 0xB7, 0x8E, 0x13, 0xF8, 0x81, 0xA7, 0xB9, 0x8D, 0x91, 0x69, + 0x37, 0x74, 0xDF, 0xAF, 0x29, 0x36, 0xA4, 0xA7, 0xC9, 0x06, 0xBE, 0xEE, 0x99, 0x6E, 0xC0, 0xE0, + 0x3B, 0xF1, 0xC2, 0xDF, 0xFF, 0x08, 0xB9, 0xF7, 0x58, 0xEF, 0x34, 0xF6, 0x1A, 0x4D, 0xEA, 0xFC, + 0xEF, 0xF0, 0xEA, 0xC7, 0x6D, 0xF1, 0xDA, 0x94, 0x36, 0xE9, 0xD9, 0x14, 0x6A, 0x70, 0x1B, 0xDA, + 0x06, 0x4C, 0x68, 0xB2, 0x5D, 0xB2, 0xE1, 0x61, 0xBC, 0x05, 0xFF, 0x6D, 0xD3, 0x70, 0xF4, 0x70, + 0x04, 0xBB, 0xF0, 0xAE, 0xE1, 0xD8, 0x9B, 0x1B, 0xBA, 0x65, 0xEA, 0x77, 0x1B, 0x5B, 0x6C, 0xA3, + 0x11, 0x38, 0x83, 0x81, 0xC5, 0xEB, 0xB7, 0x81, 0x0D, 0x7F, 0xF6, 0x43, 0x5B, 0x0F, 0x4C, 0xC7, + 0x66, 0x9B, 0xFC, 0x1D, 0xFB, 0xB7, 0xB8, 0xB5, 0xE8, 0x01, 0x96, 0x1F, 0x7A, 0x1E, 0x74, 0x71, + 0xA3, 0x79, 0x03, 0x1E, 0x34, 0xF4, 0xA1, 0x69, 0x19, 0xF0, 0xF7, 0xFF, 0x68, 0xFE, 0xCF, 0x77, + 0xB2, 0x9B, 0x13, 0x4B, 0xF3, 0xFD, 0xCD, 0x0D, 0x13, 0x76, 0xBC, 0xAE, 0x6B, 0x1E, 0x0F, 0xEA, + 0x86, 0xF3, 0x60, 0xB3, 0xC4, 0xDF, 0xA1, 0xBB, 0xF1, 0xEE, 0x2F, 0x71, 0xC7, 0xFF, 0xFE, 0x4E, + 0x4C, 0x37, 0x3B, 0x7B, 0x04, 0xF6, 0x78, 0xF2, 0x0D, 0x3F, 0x00, 0x84, 0xD5, 0xEB, 0x03, 0xCF, + 0x09, 0xDD, 0xCC, 0xB4, 0x86, 0xDC, 0x1C, 0x0C, 0x83, 0x03, 0xD6, 0xFC, 0x4B, 0xEA, 0xB1, 0x73, + 0xCF, 0xBD, 0xBE, 0xE5, 0x3C, 0x1C, 0xB0, 0xA1, 0x69, 0x18, 0xDC, 0x4E, 0x7F, 0x0B, 0x10, 0xB4, + 0x7D, 0x13, 0x17, 0x7A, 0x20, 0x3B, 0x60, 0xCD, 0xC6, 0x8E, 0xCF, 0xB8, 0xE6, 0xF3, 0xF4, 0x9B, + 0xB7, 0x8E, 0x67, 0x00, 0xF6, 0xDD, 0x3A, 0x41, 0xE0, 0x8C, 0x0E, 0x98, 0xEF, 0x58, 0xA6, 0xC1, + 0x5A, 0xEE, 0x0F, 0xF6, 0x8F, 0x7A, 0x13, 0xFF, 0x4B, 0x2C, 0xE5, 0xA7, 0xF1, 0x7C, 0x2D, 0xD3, + 0x0F, 0x56, 0x7B, 0xB6, 0xF8, 0xCF, 0xD5, 0x0C, 0xC3, 0xB4, 0x07, 0x75, 0x4F, 0xCC, 0x69, 0xB7, + 0xE9, 0xFE, 0xC8, 0x5F, 0x8E, 0xE8, 0x16, 0x88, 0xC2, 0x67, 0x81, 0xB1, 0x95, 0xFF, 0x7C, 0x98, + 0x59, 0xA9, 0xF8, 0xEE, 0x80, 0xD9, 0x8E, 0x9D, 0x99, 0xE4, 0x08, 0xB0, 0xC7, 0xB4, 0xEB, 0x16, + 0xEF, 0x23, 0x20, 0xA6, 0x8C, 0x79, 0x1B, 0xC2, 0x12, 0xEC, 0x83, 0x3E, 0x20, 0xAD, 0x9F, 0xE9, + 0xD9, 0x09, 0x03, 0x20, 0x56, 0x9E, 0x02, 0x62, 0x72, 0xB6, 0xA6, 0x8D, 0x5F, 0x9F, 0x79, 0x9E, + 0xE3, 0x65, 0x5A, 0x1A, 0xA6, 0xEF, 0x5A, 0xDA, 0xE3, 0x01, 0x13, 0xAF, 0xA4, 0xA7, 0xA5, 0x3B, + 0x96, 0x03, 0xF3, 0xF5, 0xB8, 0x91, 0x7E, 0xDE, 0x07, 0xE6, 0x55, 0xF7, 0xCD, 0x3F, 0x61, 0x40, + 0x7F, 0xA4, 0x59, 0x16, 0xF7, 0x66, 0x0D, 0xDB, 0x0B, 0x75, 0x1D, 0xE1, 0x51, 0x7C, 0xE0, 0x81, + 0xC7, 0xB3, 0x1B, 0x3F, 0x6B, 0xE8, 0xF8, 0xFB, 0x07, 0x89, 0x52, 0xB7, 0x8E, 0x65, 0x4C, 0xDB, + 0xBE, 0x1F, 0x75, 0x6A, 0x9F, 0x99, 0xD5, 0xF4, 0x8D, 0xC0, 0x7F, 0xC4, 0x9E, 0x0F, 0x58, 0xA7, + 0xF9, 0x4F, 0xD3, 0x7B, 0x15, 0x3D, 0xB4, 0x9B, 0xB3, 0x3A, 0x6E, 0xCF, 0x40, 0xAB, 0xA8, 0x87, + 0x9D, 0x99, 0x3D, 0xEC, 0x4C, 0xEF, 0x41, 0x0B, 0x02, 0x60, 0xBA, 0x99, 0xC6, 0xAE, 0x13, 0x51, + 0x8B, 0x76, 0x0B, 0x24, 0x10, 0x06, 0x19, 0x80, 0xFF, 0x59, 0x37, 0x6D, 0x83, 0xFF, 0x38, 0x60, + 0xAD, 0x66, 0x33, 0x43, 0x12, 0x92, 0x14, 0x5A, 0x13, 0xD0, 0x80, 0x43, 0xA9, 0x2E, 0x21, 0xB2, + 0xD7, 0xCC, 0xF9, 0x96, 0xA6, 0x1B, 0x38, 0x2E, 0x90, 0x51, 0x7A, 0xB2, 0x92, 0xBD, 0x09, 0x86, + 0xF6, 0x71, 0x5B, 0x1C, 0xDD, 0x3F, 0x7D, 0xBC, 0x75, 0x8C, 0x47, 0xC9, 0xE3, 0x0D, 0xF3, 0x9E, + 0xE9, 0xC8, 0x37, 0x3F, 0xD5, 0xF0, 0xA0, 0xD4, 0x00, 0x41, 0xBC, 0x1A, 0x33, 0x8D, 0x4F, 0x35, + 0xB9, 0xBC, 0x0B, 0x78, 0x5C, 0x1B, 0x73, 0x43, 0x6A, 0xA0, 0x59, 0xE6, 0xC0, 0xFE, 0x54, 0xA3, + 0xF9, 0xD6, 0xA2, 0xE6, 0xF2, 0xFD, 0xC4, 0xBB, 0xF4, 0xBE, 0x39, 0x1A, 0x64, 0xBB, 0x3B, 0x37, + 0x2D, 0xFE, 0x15, 0x4E, 0xEB, 0xDA, 0xF8, 0x68, 0x39, 0x16, 0xDF, 0xB6, 0x7F, 0x3F, 0x19, 0xD2, + 0x6A, 0x06, 0x0D, 0xD7, 0x1E, 0xD4, 0x60, 0x20, 0x38, 0xB7, 0xE5, 0x77, 0xCC, 0xE2, 0xF7, 0xDC, + 0xAA, 0x1D, 0x02, 0x83, 0x76, 0x35, 0x3B, 0xD9, 0x67, 0x97, 0x7B, 0x3A, 0x1C, 0x0C, 0xB5, 0xD4, + 0xC0, 0x84, 0xDC, 0x62, 0x66, 0x84, 0x7E, 0x30, 0x18, 0x82, 0xE1, 0x53, 0x2D, 0x22, 0x07, 0x49, + 0x0D, 0xB5, 0xC3, 0x7F, 0xDD, 0x7B, 0x0F, 0x30, 0x82, 0x3E, 0x13, 0xAB, 0xDC, 0x86, 0x65, 0x4A, + 0x08, 0x89, 0x8F, 0xB3, 0xA0, 0x95, 0xE9, 0x98, 0x98, 0x4E, 0x72, 0x57, 0x08, 0x09, 0xC7, 0x7B, + 0x28, 0xB6, 0x50, 0x00, 0xD9, 0xE3, 0x20, 0x3A, 0x5D, 0xD8, 0x5D, 0xCF, 0x41, 0xC2, 0x4D, 0xC2, + 0xF9, 0xF6, 0xF0, 0x1A, 0xBF, 0x0B, 0x00, 0x16, 0x1F, 0xB7, 0x6F, 0x0F, 0x3F, 0xDE, 0x7A, 0xF4, + 0x3F, 0x4A, 0x40, 0x42, 0x84, 0x61, 0xA6, 0x0F, 0xFC, 0x02, 0xCF, 0x64, 0x04, 0x17, 0xEB, 0x5A, + 0xC8, 0x91, 0xD9, 0x83, 0x66, 0x06, 0x8D, 0x46, 0x63, 0x59, 0x53, 0x47, 0x71, 0xCE, 0xE2, 0x01, + 0xCF, 0x99, 0x39, 0x3B, 0x85, 0xCE, 0xA6, 0x4C, 0x7D, 0xA8, 0xF9, 0xC0, 0x9B, 0x1F, 0x18, 0xF5, + 0xB1, 0x8C, 0xC9, 0xF6, 0x4D, 0x6F, 0xF4, 0x00, 0x22, 0xC0, 0x77, 0xD7, 0x72, 0x34, 0x23, 0x7F, + 0xD6, 0xD9, 0xF9, 0x9E, 0xCB, 0x36, 0x2C, 0x74, 0x0D, 0x2D, 0xE0, 0xC0, 0x2A, 0x45, 0xAB, 0x06, + 0x4B, 0x6F, 0x82, 0x58, 0x48, 0xB4, 0x11, 0x8A, 0x8B, 0x39, 0xFC, 0x29, 0x97, 0xA4, 0x10, 0x8F, + 0x71, 0xA9, 0xF1, 0xFB, 0x20, 0x9A, 0x8E, 0xEA, 0xAD, 0x36, 0xC8, 0x58, 0x48, 0x48, 0x31, 0xBD, + 0x78, 0xC1, 0x5D, 0xDD, 0x47, 0x41, 0x38, 0x41, 0x27, 0x29, 0x29, 0xF9, 0x67, 0xF3, 0xDC, 0x14, + 0xA2, 0x32, 0x8A, 0x67, 0x89, 0xD9, 0x28, 0x83, 0x39, 0x01, 0xD8, 0xD6, 0x74, 0xC0, 0x8E, 0xA0, + 0x51, 0x57, 0x1B, 0x70, 0xC5, 0x05, 0x79, 0xCE, 0xC3, 0xC4, 0x3E, 0xDE, 0x5A, 0x8E, 0x7E, 0xF7, + 0x97, 0x64, 0x07, 0x73, 0x3A, 0x11, 0xC7, 0x09, 0xB2, 0xE7, 0x0C, 0xB3, 0xC1, 0x7F, 0xB8, 0xF8, + 0x33, 0x90, 0x68, 0x1E, 0x1F, 0x86, 0x1C, 0xF6, 0x2E, 0xDA, 0xC4, 0x83, 0x04, 0xDB, 0x00, 0xE0, + 0x45, 0x8F, 0xFF, 0xC6, 0x3D, 0x1F, 0x98, 0xF5, 0x74, 0xE6, 0x70, 0xDF, 0x6C, 0x34, 0x25, 0x77, + 0x40, 0x9C, 0x98, 0x18, 0x6E, 0xDC, 0xEB, 0xC0, 0xF6, 0x7D, 0xE5, 0x6E, 0x3F, 0x7F, 0xED, 0xF5, + 0x12, 0x73, 0x4B, 0x8C, 0xC2, 0xE6, 0x0C, 0x23, 0xF0, 0xEE, 0xF8, 0xE6, 0xE2, 0x74, 0x7A, 0xEF, + 0xA7, 0x02, 0x37, 0x8F, 0xAD, 0x90, 0x07, 0x80, 0x96, 0x43, 0x76, 0x71, 0x0A, 0x67, 0x2C, 0xFC, + 0x53, 0x1C, 0x43, 0x77, 0x40, 0x7E, 0x32, 0x6D, 0x40, 0x7A, 0xFF, 0xF2, 0xF2, 0xCB, 0xF4, 0x71, + 0x2E, 0x2F, 0x87, 0x07, 0x13, 0xDD, 0x64, 0xA0, 0xC2, 0x1D, 0x83, 0x83, 0xF8, 0x7C, 0xA9, 0x05, + 0xD3, 0xFB, 0xD9, 0x81, 0xE5, 0x7F, 0x68, 0xB6, 0x3F, 0xEC, 0xBC, 0xFF, 0x20, 0x67, 0xB8, 0xA5, + 0xDA, 0xED, 0x2C, 0x20, 0xD7, 0x5B, 0xCD, 0xDD, 0x46, 0x6B, 0x7F, 0xB7, 0xB9, 0xFB, 0x7E, 0xAF, + 0x55, 0xB0, 0xE3, 0x23, 0x6B, 0xC6, 0x7C, 0x5B, 0xBB, 0x7B, 0x30, 0xE3, 0xFD, 0x68, 0xB2, 0x6C, + 0xF3, 0xA8, 0x7B, 0xF2, 0x6E, 0x12, 0x9E, 0x4A, 0x68, 0x93, 0x80, 0xF5, 0xD9, 0xC9, 0xD9, 0xF9, + 0xF4, 0x41, 0xF1, 0xDB, 0x79, 0xD0, 0xE6, 0x3A, 0xEF, 0xFF, 0x32, 0x0B, 0x20, 0xED, 0xFD, 0x66, + 0xBB, 0xB9, 0xD7, 0xD8, 0xDD, 0xDB, 0x57, 0x84, 0x07, 0xF6, 0xF8, 0xEB, 0x8C, 0x1E, 0x77, 0xDE, + 0xB7, 0xF6, 0xF6, 0x9B, 0x3B, 0x8D, 0x9D, 0x66, 0xA7, 0x40, 0x8F, 0xBF, 0xCD, 0xC2, 0x85, 0xFD, + 0xBD, 0xBD, 0xBD, 0xDD, 0xC6, 0xCE, 0xFE, 0x4E, 0xF6, 0x54, 0x9E, 0x07, 0xD8, 0x24, 0x6F, 0xCB, + 0xFD, 0x7B, 0xE8, 0x45, 0x2C, 0x64, 0x14, 0xD4, 0x9B, 0x59, 0xA9, 0x66, 0x92, 0xEF, 0xD1, 0x81, + 0x32, 0xC1, 0x98, 0xFE, 0xA1, 0x5E, 0x67, 0xF5, 0xE8, 0x1F, 0x83, 0xA3, 0xBB, 0x0F, 0xF2, 0x0C, + 0x3B, 0x71, 0xEC, 0xBE, 0x39, 0x48, 0x7C, 0x51, 0xAF, 0x1F, 0x4E, 0x32, 0x34, 0x39, 0xBC, 0x01, + 0xFA, 0x19, 0x28, 0x47, 0x03, 0xCD, 0xAD, 0xB7, 0x73, 0x78, 0xD8, 0x47, 0xA1, 0x80, 0xC4, 0x92, + 0x55, 0x60, 0x33, 0xF8, 0xBF, 0xEE, 0x7A, 0x26, 0x4C, 0xEE, 0x91, 0x8D, 0x95, 0x66, 0xC1, 0x83, + 0x5D, 0x31, 0x05, 0x31, 0x83, 0x1A, 0x0B, 0x1E, 0x5D, 0x58, 0x86, 0xE8, 0xA2, 0xC6, 0xE0, 0xE8, + 0xD2, 0xEA, 0xA2, 0x05, 0x9D, 0x27, 0x96, 0xE6, 0xFA, 0xBC, 0x96, 0xBB, 0x47, 0xE2, 0x55, 0x52, + 0xAF, 0x3F, 0xD5, 0xFE, 0x31, 0x7A, 0xB7, 0x9B, 0xEE, 0x5D, 0xF3, 0x4C, 0xAD, 0xCE, 0x7F, 0xC0, + 0x06, 0x18, 0x1C, 0x0F, 0x56, 0xCD, 0x82, 0xEE, 0xC4, 0x53, 0x3C, 0x43, 0x3C, 0xC7, 0xF2, 0xC7, + 0xE3, 0xA4, 0xDB, 0x1E, 0xE6, 0x8E, 0x9A, 0x06, 0x60, 0xE8, 0x69, 0x64, 0x02, 0xF8, 0x68, 0xA6, + 0x96, 0x86, 0xDA, 0xFB, 0xF8, 0x54, 0x24, 0x5D, 0x1E, 0xD5, 0x7A, 0x76, 0x6B, 0xB2, 0x8C, 0xBA, + 0x8F, 0xC7, 0x9D, 0x99, 0x87, 0x33, 0x02, 0x20, 0xB9, 0x18, 0x33, 0x6D, 0x9B, 0xA2, 0x65, 0xB0, + 0xD1, 0x2D, 0xEC, 0x93, 0x24, 0x57, 0xB5, 0x95, 0xA5, 0xBA, 0xD1, 0x3C, 0x83, 0xE1, 0x8F, 0x3A, + 0x0A, 0xDE, 0x59, 0x7C, 0xCA, 0x6B, 0xD1, 0x77, 0xBC, 0x91, 0x54, 0xE1, 0x01, 0x53, 0xDB, 0x53, + 0x20, 0x97, 0x80, 0xDE, 0xC1, 0xD4, 0x17, 0x04, 0xE1, 0xC9, 0x7E, 0x83, 0x40, 0x22, 0xC4, 0xAD, + 0x5F, 0x07, 0xB2, 0xD3, 0xF9, 0x88, 0x2C, 0x63, 0x42, 0x90, 0x9F, 0xDA, 0x05, 0x99, 0x01, 0xD0, + 0xDC, 0x06, 0x32, 0x06, 0xB7, 0xB8, 0x1E, 0x30, 0x8D, 0xC9, 0x8D, 0x61, 0x80, 0x06, 0xA0, 0x7E, + 0x73, 0x9B, 0x41, 0xFF, 0x70, 0x56, 0x33, 0x29, 0xB2, 0x82, 0x4E, 0xEE, 0xC0, 0x73, 0x2D, 0x88, + 0x5E, 0x6C, 0xB0, 0xA3, 0x40, 0x88, 0x7B, 0x5B, 0x49, 0xF1, 0xE9, 0xC1, 0x84, 0x93, 0x3C, 0x04, + 0x08, 0xFB, 0xD4, 0x31, 0x37, 0xC6, 0xEF, 0x47, 0x78, 0xA1, 0x0F, 0x35, 0x7B, 0xC0, 0x7D, 0x86, + 0x92, 0x98, 0xAF, 0xDD, 0xC3, 0x2B, 0x0F, 0x34, 0x1E, 0xE8, 0xB5, 0xFD, 0x3E, 0x47, 0x8B, 0x50, + 0x3C, 0x19, 0x10, 0xC6, 0xE2, 0x7E, 0x40, 0xFF, 0xA6, 0xF7, 0x36, 0x7A, 0xD0, 0x26, 0x8D, 0x5C, + 0x1B, 0xF8, 0xA2, 0x0B, 0x93, 0xF1, 0xB9, 0xD1, 0x98, 0x01, 0xDB, 0x09, 0xF0, 0x11, 0xAA, 0x99, + 0x76, 0xDF, 0xA9, 0xEB, 0xA6, 0xA7, 0xC3, 0x80, 0x01, 0xFF, 0x11, 0xC4, 0x64, 0x39, 0xF2, 0x71, + 0xA7, 0xA6, 0x31, 0xAD, 0x0C, 0xF3, 0xCA, 0x47, 0x81, 0x0C, 0xC3, 0x52, 0x40, 0x0F, 0x14, 0xA8, + 0x0E, 0xE7, 0x6C, 0x7E, 0x3E, 0xAB, 0x4D, 0xA9, 0xB9, 0x11, 0xA7, 0x9B, 0x09, 0x0A, 0xD3, 0x76, + 0xC3, 0x40, 0xB2, 0x17, 0x4F, 0x33, 0x4C, 0xA7, 0x26, 0x8D, 0xAE, 0x12, 0xFE, 0xD7, 0xE2, 0xD9, + 0xBD, 0x06, 0x72, 0xC7, 0xA7, 0x5A, 0x73, 0x5E, 0x77, 0x96, 0x76, 0xCB, 0xAD, 0x24, 0x95, 0x37, + 0x49, 0x29, 0x3C, 0x94, 0x1B, 0x0F, 0x27, 0x36, 0xBD, 0xF1, 0x24, 0x50, 0xBE, 0x08, 0x48, 0xB6, + 0x0A, 0x43, 0xB2, 0x25, 0x20, 0xD9, 0x6A, 0x77, 0x76, 0x76, 0xF7, 0xDE, 0xEF, 0x7F, 0x68, 0x8E, + 0x3F, 0xBD, 0x41, 0x55, 0x42, 0xB5, 0x5D, 0x18, 0xAA, 0x6D, 0x01, 0xD5, 0x37, 0x08, 0x4A, 0x08, + 0x76, 0x0A, 0x43, 0xB0, 0xF3, 0x06, 0xC1, 0x14, 0x04, 0x77, 0x0A, 0x43, 0x70, 0xE7, 0x0D, 0x82, + 0x29, 0x08, 0xEE, 0x16, 0x86, 0xE0, 0xEE, 0x1B, 0x04, 0x53, 0x10, 0xDC, 0x2B, 0x0C, 0xC1, 0xBD, + 0x37, 0x08, 0xA6, 0x20, 0xF8, 0xBE, 0x30, 0x04, 0xDF, 0x57, 0x07, 0xC1, 0x0A, 0x41, 0x28, 0xA6, + 0x09, 0xEF, 0xC7, 0xF3, 0x14, 0x56, 0xFA, 0x48, 0x0D, 0x4D, 0xDE, 0xB9, 0x48, 0xCB, 0x64, 0x87, + 0x3E, 0xEC, 0xD0, 0x4F, 0x1A, 0x88, 0xFA, 0x88, 0x65, 0xB8, 0x99, 0x60, 0xC1, 0xCE, 0x0F, 0xE6, + 0x83, 0x20, 0xAD, 0x8F, 0xE1, 0xA0, 0xFB, 0x34, 0xDC, 0xFB, 0x22, 0x9B, 0x88, 0x82, 0x7A, 0x2D, + 0x05, 0x11, 0xA9, 0xAC, 0xA6, 0x34, 0x68, 0xB1, 0x2B, 0xB3, 0x7B, 0x75, 0xB3, 0x0D, 0xE8, 0xAE, + 0x2F, 0xEE, 0x3B, 0x71, 0xFF, 0x87, 0xFB, 0xEB, 0xCE, 0xDA, 0xDB, 0xA9, 0x14, 0x30, 0x39, 0xD0, + 0x09, 0x29, 0x41, 0x57, 0xA0, 0xB2, 0xA0, 0xAD, 0x35, 0x3D, 0x98, 0xBC, 0xF5, 0x9B, 0x31, 0x5C, + 0xF5, 0xA8, 0x32, 0x69, 0x2F, 0x91, 0xD7, 0xBE, 0xBB, 0x0A, 0xD4, 0x25, 0xAD, 0x1B, 0x69, 0x3B, + 0x05, 0xDD, 0xE7, 0x04, 0x36, 0x5D, 0x1D, 0x48, 0xEC, 0xA9, 0x4D, 0x33, 0x80, 0xE4, 0x62, 0xE2, + 0x6C, 0xFD, 0x95, 0xEE, 0x6E, 0xED, 0x13, 0x74, 0x3C, 0x98, 0x18, 0x67, 0xF3, 0x5D, 0x4D, 0x5E, + 0x59, 0xC8, 0x07, 0xF9, 0xC6, 0x82, 0x05, 0x69, 0xD6, 0x09, 0xED, 0x5A, 0x4C, 0x22, 0xAB, 0x0A, + 0xA3, 0x2A, 0xDD, 0xD7, 0xF4, 0xC0, 0x81, 0x95, 0x1B, 0xBC, 0xAF, 0x85, 0x56, 0xE0, 0xCF, 0x53, + 0x5B, 0x17, 0xA2, 0xBA, 0xCE, 0xE3, 0x48, 0xEA, 0x58, 0xED, 0x25, 0xA0, 0x7F, 0xE5, 0x0F, 0x2A, + 0x43, 0xE8, 0x3C, 0x7B, 0x4E, 0xCE, 0xAB, 0x19, 0x13, 0x1E, 0x19, 0xE3, 0x97, 0x68, 0xBF, 0x1B, + 0x05, 0xC0, 0x37, 0x93, 0x46, 0xBC, 0x8A, 0x2D, 0x76, 0xB8, 0x9E, 0x52, 0xE6, 0xBA, 0x44, 0xC3, + 0x7C, 0xB8, 0x27, 0x20, 0x95, 0x31, 0xD4, 0xE1, 0xED, 0xC7, 0x33, 0x5B, 0xE9, 0xD2, 0x06, 0xBA, + 0x99, 0x6B, 0x99, 0x6E, 0x9D, 0x63, 0x6E, 0x50, 0x6F, 0xCD, 0x34, 0xD1, 0xD1, 0xAD, 0x17, 0xD7, + 0xFC, 0xD0, 0x23, 0x1A, 0xBF, 0xD6, 0x02, 0x7E, 0x81, 0x27, 0xCD, 0x0C, 0x8A, 0xBC, 0x1A, 0xBF, + 0xCE, 0xF0, 0xFD, 0x03, 0xA5, 0xD3, 0x6E, 0x36, 0x0B, 0x9E, 0x72, 0x36, 0xB6, 0x89, 0x1F, 0xB6, + 0xDA, 0x48, 0xD2, 0x1D, 0x36, 0x66, 0xE8, 0x2A, 0xFC, 0x22, 0x71, 0xFE, 0x67, 0x16, 0xF8, 0xE5, + 0xCF, 0xD4, 0x95, 0x64, 0xF2, 0xA4, 0xBF, 0xB0, 0xE7, 0x76, 0x8C, 0xFF, 0xBE, 0xFC, 0x79, 0xA0, + 0xF4, 0x5E, 0x85, 0x4C, 0x35, 0xC3, 0x5C, 0x6F, 0x86, 0x9C, 0xD9, 0xE1, 0xE8, 0x96, 0x7B, 0xCC, + 0xE9, 0x33, 0x72, 0xCD, 0x00, 0xFC, 0xF5, 0xD1, 0x50, 0x68, 0x39, 0xBA, 0x40, 0xE6, 0xFF, 0xFA, + 0xCF, 0xFF, 0xDD, 0x37, 0x7F, 0x70, 0xFF, 0xBF, 0xFE, 0xF3, 0xFF, 0x30, 0x17, 0x5E, 0xF4, 0x39, + 0xA0, 0xAD, 0xD1, 0x60, 0x47, 0xF6, 0x63, 0x30, 0x34, 0xED, 0x01, 0xD3, 0x6E, 0x9D, 0x7B, 0xCE, + 0x76, 0xBE, 0xFC, 0x09, 0x32, 0xE5, 0x23, 0x60, 0x0D, 0x9A, 0x2E, 0xC7, 0xD7, 0x6C, 0xF0, 0xF2, + 0x80, 0xFB, 0xD4, 0x13, 0xD0, 0xDB, 0x36, 0xF5, 0x3C, 0x40, 0x6F, 0x06, 0xF4, 0xC1, 0xD1, 0x3D, + 0x0E, 0x4B, 0xD3, 0x4D, 0xEE, 0x37, 0xD8, 0x57, 0x07, 0x90, 0x80, 0xE1, 0x8C, 0x12, 0x80, 0x66, + 0x1E, 0xDE, 0x32, 0x9B, 0x3E, 0x39, 0x64, 0x79, 0xE4, 0x8A, 0x85, 0xAC, 0xBF, 0x05, 0x83, 0x91, + 0x25, 0xD3, 0xB4, 0xD9, 0x31, 0x5E, 0xF1, 0x8F, 0x1C, 0x83, 0x37, 0xD8, 0xA9, 0x38, 0x09, 0x0E, + 0x70, 0x32, 0x0D, 0x76, 0x69, 0x8E, 0x4C, 0xF4, 0xA3, 0x69, 0x34, 0x9B, 0xCD, 0x56, 0xBB, 0x4D, + 0xED, 0x9A, 0xF0, 0x85, 0xC2, 0xB6, 0x2F, 0xF4, 0xB8, 0x50, 0x3D, 0x36, 0xC6, 0xEF, 0xCD, 0x11, + 0x07, 0x15, 0xCE, 0x98, 0x29, 0x94, 0x21, 0x84, 0xD4, 0xDD, 0x32, 0x84, 0x91, 0x94, 0x24, 0x05, + 0x0A, 0xE5, 0xCA, 0x92, 0x89, 0x6B, 0x82, 0x49, 0xFA, 0x51, 0x18, 0xC6, 0xCD, 0x6F, 0x5A, 0x56, + 0xC0, 0x9C, 0x27, 0xF9, 0x25, 0xC6, 0x4D, 0x5D, 0xAC, 0x13, 0x80, 0xF0, 0x82, 0x0C, 0xD7, 0xD3, + 0x84, 0x41, 0xF8, 0xE8, 0xD0, 0xF1, 0x3E, 0x6E, 0xC3, 0x2F, 0x1A, 0x6F, 0x35, 0x58, 0x52, 0x8F, + 0xEB, 0xB5, 0xC3, 0x1E, 0xD1, 0xA7, 0xCF, 0x6E, 0x79, 0xF0, 0xC0, 0x81, 0x44, 0x12, 0xEF, 0xF8, + 0x2B, 0xC6, 0x6F, 0x66, 0xCC, 0xB4, 0x01, 0x9C, 0x00, 0xC8, 0x5E, 0x60, 0x99, 0x89, 0xEE, 0x8C, + 0xC0, 0x06, 0x6C, 0x60, 0x02, 0x40, 0xEC, 0xD0, 0x34, 0xC8, 0x63, 0x13, 0x78, 0xEF, 0x02, 0xAF, + 0x02, 0xFF, 0xE9, 0x87, 0x96, 0xE0, 0x0F, 0x81, 0x76, 0x47, 0x2C, 0x2A, 0xF5, 0x32, 0x47, 0x57, + 0x08, 0xD6, 0xE7, 0x0F, 0xF1, 0x0C, 0x34, 0xDD, 0x73, 0x7C, 0xF8, 0x05, 0xBC, 0x09, 0xDE, 0x86, + 0x17, 0xEF, 0xF9, 0x23, 0xDB, 0x6C, 0xEF, 0xFC, 0x2B, 0x1B, 0x3A, 0xA1, 0xE7, 0xBF, 0xAB, 0x82, + 0x3B, 0xC5, 0xEC, 0xA8, 0x85, 0xEF, 0xEC, 0xB7, 0x3E, 0xEC, 0x45, 0xC3, 0x03, 0x47, 0x22, 0x90, + 0x2B, 0x43, 0x33, 0xE1, 0xC7, 0xF5, 0xC6, 0x94, 0x2A, 0x65, 0x4A, 0x44, 0x41, 0x25, 0xB9, 0x12, + 0xB4, 0xAD, 0x80, 0x2D, 0x95, 0xF8, 0xBA, 0xA4, 0x2A, 0x2B, 0x5C, 0x67, 0x1E, 0x6D, 0x6D, 0x64, + 0xEA, 0x57, 0x80, 0xA1, 0xD6, 0xA9, 0xE7, 0xB8, 0x42, 0x10, 0x55, 0xB2, 0x87, 0x24, 0x9B, 0xD6, + 0x72, 0xF7, 0x70, 0x6F, 0xC2, 0x06, 0x72, 0x2A, 0xDA, 0x30, 0x6A, 0x74, 0xB0, 0x64, 0x55, 0xF2, + 0xC8, 0xF8, 0x7B, 0xE8, 0x07, 0x11, 0x2F, 0x09, 0xB8, 0x67, 0x6B, 0x16, 0xD3, 0xAC, 0x81, 0xE3, + 0x99, 0xC1, 0x70, 0x84, 0x54, 0x39, 0xD2, 0x02, 0x7D, 0x48, 0xDF, 0x83, 0x7A, 0x20, 0x14, 0x4E, + 0xCD, 0x75, 0x41, 0x41, 0x16, 0xA2, 0x10, 0xB7, 0xEF, 0x4D, 0xCF, 0xB1, 0x71, 0x6C, 0xC9, 0x9F, + 0xE4, 0xD5, 0x2E, 0x33, 0x47, 0xA0, 0x98, 0xDE, 0x73, 0xD1, 0xB7, 0xC7, 0x75, 0x6E, 0x02, 0x47, + 0xD8, 0xF0, 0xC5, 0x30, 0x2E, 0x48, 0xF8, 0xA2, 0x03, 0xE0, 0x5C, 0x49, 0x26, 0x27, 0x6F, 0x8A, + 0x43, 0xBC, 0x79, 0x75, 0xEE, 0x4D, 0x03, 0x6F, 0x74, 0x81, 0x59, 0x78, 0xC0, 0xCA, 0x74, 0x3D, + 0x24, 0xE6, 0x12, 0xB9, 0xCE, 0xA2, 0x93, 0x35, 0xE0, 0x76, 0x03, 0xFD, 0xD7, 0x68, 0xC4, 0xE4, + 0x40, 0x38, 0x75, 0x80, 0x55, 0x68, 0xFB, 0xA1, 0x19, 0x60, 0x4C, 0x06, 0x03, 0x18, 0x05, 0x08, + 0x77, 0x62, 0x3D, 0xB4, 0x5F, 0xD4, 0x60, 0x00, 0x6F, 0xDB, 0xD3, 0x96, 0x84, 0x8C, 0xCC, 0x32, + 0xEF, 0xB8, 0x85, 0xDE, 0x14, 0x78, 0x2F, 0x0D, 0xA2, 0x14, 0xB2, 0x30, 0xE4, 0x8A, 0xC0, 0x1C, + 0x61, 0xEE, 0xF1, 0x78, 0x20, 0x07, 0x62, 0xEF, 0x20, 0xBA, 0x09, 0xAE, 0x1B, 0xCF, 0x52, 0xCC, + 0x5B, 0x7F, 0x5C, 0x5D, 0x55, 0xBC, 0xB8, 0x69, 0x4D, 0xE2, 0xF2, 0xDC, 0x4B, 0x71, 0xE1, 0x06, + 0x20, 0x6C, 0xA2, 0x69, 0xDA, 0xC8, 0x12, 0x5A, 0x9A, 0x29, 0x19, 0x92, 0xEC, 0x04, 0x57, 0x9A, + 0xBB, 0x3E, 0x1A, 0x66, 0x99, 0x7C, 0x42, 0x8D, 0x1B, 0x8C, 0x4C, 0xFB, 0xCC, 0xE2, 0xF7, 0xAA, + 0x8C, 0xE0, 0x0A, 0x10, 0xAB, 0xF7, 0x37, 0x86, 0x4D, 0x08, 0x11, 0x97, 0xCD, 0x0B, 0x60, 0x7C, + 0x8C, 0x69, 0x62, 0x3C, 0x9A, 0x00, 0x62, 0xBA, 0xC1, 0xD1, 0xE7, 0xDF, 0x27, 0x72, 0xD1, 0x84, + 0x62, 0xEF, 0x03, 0x11, 0x5A, 0x96, 0x19, 0x90, 0xC5, 0xE9, 0x96, 0xA3, 0x70, 0x61, 0x08, 0xA2, + 0x00, 0xA5, 0xA8, 0xF1, 0x0A, 0xD1, 0x5C, 0xF1, 0x88, 0x95, 0xA7, 0xAB, 0x44, 0x0A, 0x25, 0xFB, + 0xB1, 0x7C, 0x79, 0x01, 0xB6, 0xE3, 0x45, 0x23, 0xFE, 0xC9, 0xD7, 0x6F, 0x45, 0xF0, 0xFE, 0x64, + 0xFB, 0x6B, 0xF3, 0xB9, 0xF0, 0x7D, 0x8C, 0xCF, 0xE8, 0x9A, 0xA4, 0x59, 0x22, 0x82, 0x20, 0x17, + 0xB9, 0xC7, 0xEA, 0xF4, 0x9E, 0x71, 0x0C, 0x22, 0x2D, 0x52, 0xC5, 0x6F, 0x67, 0xA7, 0xF5, 0xF3, + 0x0F, 0x5D, 0x62, 0xFA, 0xAD, 0x66, 0xFC, 0xF8, 0xFB, 0xD5, 0x87, 0xFD, 0xE6, 0x1B, 0x35, 0xCC, + 0xA7, 0x06, 0xC4, 0x14, 0x55, 0x62, 0x80, 0x77, 0x57, 0x83, 0x16, 0xD0, 0x36, 0x1B, 0x19, 0x12, + 0x6D, 0x1F, 0xF1, 0x87, 0x38, 0xE6, 0xC9, 0x90, 0xEB, 0x77, 0xC7, 0xCE, 0x0F, 0xEE, 0x2B, 0x52, + 0x0A, 0xD9, 0x43, 0x93, 0x3D, 0x40, 0xC3, 0xF4, 0xDF, 0x0A, 0x57, 0x5F, 0x95, 0xBA, 0xEE, 0xDD, + 0x24, 0x85, 0x28, 0x10, 0x7F, 0x74, 0xCD, 0x25, 0xF1, 0x09, 0x64, 0x1D, 0x58, 0xAA, 0x0C, 0xAE, + 0x04, 0x79, 0x48, 0xBC, 0x83, 0x62, 0x97, 0xA0, 0x1A, 0x38, 0x22, 0x3C, 0x07, 0x84, 0x2B, 0xA0, + 0x0E, 0xD3, 0xB5, 0xF8, 0x98, 0xAA, 0x62, 0x55, 0x32, 0xFE, 0x2A, 0x05, 0x32, 0x50, 0x6B, 0x7B, + 0xCE, 0x88, 0x27, 0x25, 0x30, 0x9F, 0x19, 0xA6, 0x1E, 0xA0, 0xA8, 0x87, 0x02, 0x9A, 0xCD, 0x81, + 0x02, 0xD1, 0x4D, 0x30, 0xF4, 0x50, 0x5A, 0x84, 0x69, 0x70, 0x0F, 0x63, 0x10, 0xD2, 0xDD, 0xD0, + 0x7C, 0x5C, 0xFC, 0x84, 0x44, 0x2A, 0x24, 0x02, 0xA1, 0xE6, 0x0A, 0x01, 0x2F, 0xFD, 0x32, 0xF9, + 0x13, 0x0A, 0xB3, 0x5C, 0x56, 0x68, 0x84, 0xC5, 0xA0, 0xB4, 0x19, 0x0C, 0x1D, 0x9F, 0xC7, 0x4B, + 0x03, 0x71, 0x15, 0x3A, 0x89, 0x84, 0xCC, 0x91, 0x58, 0xEA, 0x2D, 0xC7, 0xBF, 0x89, 0x41, 0x18, + 0xA1, 0x87, 0x9F, 0x63, 0x99, 0x4F, 0xD7, 0x2C, 0x3D, 0x8C, 0xD7, 0x17, 0x33, 0x8D, 0xCF, 0xDD, + 0xDE, 0x16, 0xEB, 0x1D, 0x1F, 0xC1, 0xCF, 0xCF, 0x97, 0xDF, 0xBE, 0x1E, 0xF5, 0xE0, 0xC3, 0x31, + 0x37, 0x4F, 0x9D, 0x70, 0x8B, 0xD8, 0xC7, 0x67, 0xCD, 0x32, 0x2D, 0xEE, 0xAC, 0x94, 0xB3, 0x61, + 0xCA, 0xA0, 0x9D, 0x87, 0xAE, 0xA5, 0xEF, 0x78, 0xCA, 0x9C, 0x32, 0x09, 0x76, 0x30, 0x39, 0x97, + 0xE7, 0x60, 0x0D, 0x38, 0x93, 0xC0, 0xB4, 0x28, 0xC2, 0x89, 0xDB, 0x3E, 0x4D, 0x44, 0xEA, 0x23, + 0x7E, 0xAD, 0xC0, 0xE2, 0x75, 0xE4, 0x1C, 0x82, 0xAD, 0x28, 0xDB, 0xBB, 0x26, 0xDA, 0xCB, 0x13, + 0x55, 0xB0, 0x16, 0x6E, 0x23, 0xDD, 0xDE, 0x64, 0xE6, 0x56, 0x3B, 0x3C, 0xA3, 0xE7, 0x0C, 0xBF, + 0x60, 0xC9, 0x6F, 0xD4, 0xCC, 0x17, 0x82, 0xBB, 0x4F, 0x8E, 0x4C, 0xCF, 0xA3, 0x2B, 0x2A, 0x7A, + 0x74, 0xEB, 0xFC, 0x88, 0x5D, 0x1F, 0x04, 0xAB, 0x9C, 0x32, 0xA3, 0xF1, 0x85, 0x6B, 0x16, 0x90, + 0xC4, 0x49, 0xF1, 0xDA, 0x75, 0xC9, 0x92, 0xC1, 0x77, 0xE4, 0x0B, 0x08, 0x1F, 0x3D, 0x31, 0x99, + 0x04, 0x1D, 0x0B, 0x10, 0x1A, 0xAB, 0x7E, 0xBB, 0x3A, 0x9F, 0x9E, 0x5D, 0xC7, 0xE2, 0x97, 0xDC, + 0x1E, 0x04, 0xC3, 0x99, 0xF7, 0x79, 0x4F, 0x26, 0xD9, 0xEC, 0xB1, 0x87, 0xC0, 0xED, 0xC6, 0x63, + 0xAB, 0xD9, 0x4C, 0xD5, 0x84, 0x49, 0xEC, 0x95, 0x89, 0x6E, 0xD9, 0xE6, 0xE8, 0xDD, 0x73, 0x5B, + 0x77, 0x69, 0x3A, 0x96, 0x98, 0x0E, 0x59, 0x1C, 0x66, 0x60, 0x55, 0xAB, 0xB1, 0x3F, 0x7A, 0x91, + 0x17, 0x31, 0x4F, 0x92, 0x27, 0xCB, 0xC9, 0x95, 0x19, 0x04, 0x53, 0x1C, 0xC2, 0xCD, 0x69, 0xFB, + 0x14, 0xFB, 0xA5, 0xAA, 0xC1, 0x77, 0x39, 0x66, 0x4E, 0xA5, 0x23, 0xA6, 0xC0, 0xD1, 0xF2, 0x35, + 0xF0, 0x4C, 0x17, 0x38, 0x37, 0xC6, 0x54, 0x47, 0xA7, 0xCA, 0xD7, 0x9B, 0xEB, 0x8B, 0x2E, 0x13, + 0x0F, 0xE7, 0x0B, 0xAE, 0x4F, 0x3F, 0x4C, 0x52, 0x73, 0x58, 0x92, 0x84, 0x4C, 0xA7, 0x03, 0x5A, + 0x3A, 0xC5, 0x62, 0x75, 0x1A, 0x1D, 0x45, 0x47, 0xB4, 0x58, 0x61, 0xDC, 0x30, 0xE0, 0x35, 0x48, + 0xC9, 0x22, 0x47, 0x09, 0x8E, 0x24, 0xC4, 0x45, 0x0D, 0xA4, 0x42, 0x9F, 0x44, 0x48, 0x9F, 0x7B, + 0x18, 0xD5, 0xD2, 0x60, 0xBF, 0x3A, 0xA1, 0x17, 0x85, 0xB8, 0x8C, 0x42, 0x3F, 0x40, 0x85, 0xF3, + 0xC1, 0xC4, 0x2B, 0x64, 0x11, 0x98, 0xEB, 0xA1, 0x37, 0x17, 0xD3, 0x02, 0x86, 0xF7, 0x6D, 0x81, + 0x39, 0xE2, 0x49, 0x61, 0xF2, 0xD4, 0xF4, 0x95, 0x4E, 0xA1, 0xD5, 0x0A, 0x4D, 0xC1, 0xAD, 0xB3, + 0xC7, 0x9B, 0x16, 0xF9, 0x9F, 0xE4, 0x46, 0x52, 0x2D, 0x42, 0x76, 0x4C, 0x1C, 0x42, 0xC9, 0x69, + 0xC0, 0xCE, 0x70, 0xEF, 0x8B, 0xE3, 0x2B, 0x70, 0xF8, 0xB9, 0x6E, 0x8E, 0xBB, 0x13, 0x87, 0x92, + 0xE8, 0x7E, 0x6E, 0xCF, 0x38, 0xFE, 0x81, 0x9A, 0x18, 0x36, 0xCD, 0xDB, 0x71, 0xAF, 0xE8, 0x95, + 0xD0, 0x1C, 0x8F, 0xC7, 0x7C, 0x18, 0x29, 0x5F, 0x07, 0xE5, 0x36, 0x5F, 0xFC, 0x8D, 0xD0, 0x92, + 0xF1, 0xA6, 0x9B, 0x4A, 0x24, 0xB5, 0x7C, 0xBC, 0xC1, 0xF1, 0x97, 0x8D, 0x37, 0x73, 0x4F, 0xE0, + 0x7C, 0x28, 0x95, 0xC7, 0x1C, 0x6C, 0xFE, 0xE2, 0x30, 0x07, 0x8E, 0x12, 0xEF, 0x39, 0x31, 0x07, + 0xC7, 0x5F, 0x75, 0x8E, 0x43, 0x30, 0x2A, 0x8F, 0x37, 0xD8, 0xFC, 0x45, 0xE2, 0x4D, 0xF7, 0xE7, + 0x27, 0x61, 0xCE, 0x34, 0x05, 0xAA, 0x00, 0xE6, 0xB0, 0xEE, 0xCF, 0xA5, 0x91, 0xE7, 0xBD, 0x40, + 0xDC, 0x65, 0x20, 0x0F, 0x00, 0xEA, 0x69, 0xE8, 0xD3, 0xFD, 0xF9, 0x05, 0x21, 0xD0, 0x95, 0x13, + 0xDA, 0xA0, 0xDE, 0x98, 0x76, 0x50, 0x2B, 0xC3, 0x58, 0xA8, 0xB9, 0xC2, 0x89, 0x04, 0xFD, 0xAF, + 0x2E, 0x63, 0x49, 0xC0, 0xA0, 0x0C, 0x66, 0x8C, 0x9B, 0xBF, 0x48, 0xBC, 0x58, 0x10, 0x63, 0x29, + 0x80, 0x39, 0xF3, 0xDF, 0x5A, 0x61, 0xC6, 0x93, 0x02, 0xE4, 0xD3, 0xD0, 0x6B, 0xB5, 0x18, 0x4F, + 0x6C, 0x3F, 0x68, 0xA5, 0x22, 0x6B, 0xD4, 0xD0, 0x6D, 0xB6, 0x41, 0x21, 0xB1, 0xFA, 0x1B, 0x4C, + 0x24, 0x39, 0x32, 0x83, 0xCF, 0x9F, 0x8F, 0x6A, 0x87, 0xD1, 0x1F, 0x0C, 0xFE, 0x42, 0x0D, 0x5B, + 0xF0, 0xE4, 0xC5, 0x5B, 0xAA, 0xA7, 0xCC, 0x67, 0xEE, 0x66, 0x86, 0x36, 0x75, 0xC8, 0x8D, 0x65, + 0x5B, 0xAC, 0xE9, 0x0A, 0x4D, 0x27, 0xE8, 0x60, 0xBA, 0xB7, 0x3F, 0x42, 0x13, 0x3D, 0xA6, 0xE0, + 0xD3, 0x20, 0xB4, 0x34, 0x6F, 0x7C, 0x31, 0x25, 0x73, 0x94, 0x91, 0x41, 0x82, 0x6E, 0xBE, 0xD0, + 0x4D, 0x93, 0x6D, 0x22, 0x78, 0x47, 0x22, 0x6A, 0xEC, 0x1D, 0xF3, 0x65, 0x4A, 0x0E, 0xFC, 0x5E, + 0x74, 0x09, 0xBF, 0x6C, 0xA6, 0x85, 0x81, 0x33, 0xC2, 0x14, 0xA7, 0x9A, 0x65, 0x3D, 0xCA, 0xE8, + 0x23, 0x79, 0x41, 0xA7, 0x79, 0xDC, 0x0F, 0x98, 0x76, 0xAF, 0x99, 0x94, 0xFE, 0x36, 0x6B, 0xFF, + 0xC8, 0x31, 0x5A, 0xAC, 0x61, 0x5C, 0x92, 0x92, 0x69, 0x43, 0x02, 0x11, 0x7D, 0x1F, 0x8F, 0x45, + 0x9C, 0xCE, 0x8C, 0xB1, 0x64, 0xF8, 0x4F, 0x7C, 0xFD, 0x31, 0xE0, 0x81, 0x0C, 0xDD, 0xBB, 0x34, + 0xFD, 0x60, 0xF3, 0xDD, 0x44, 0x60, 0xDB, 0xC8, 0xA0, 0x5F, 0x32, 0xB9, 0xE8, 0xD4, 0x40, 0xA1, + 0xD9, 0x46, 0x2C, 0x85, 0x20, 0xA2, 0xB9, 0x01, 0x43, 0x18, 0x8C, 0x35, 0x73, 0x94, 0x92, 0xF1, + 0x44, 0xD8, 0xEF, 0xEC, 0x0D, 0x94, 0x00, 0xA2, 0xF8, 0x18, 0x3F, 0x19, 0x55, 0x04, 0x4D, 0x9F, + 0x1E, 0x58, 0x34, 0xDE, 0xEB, 0x79, 0x91, 0x7D, 0xD5, 0x9A, 0x14, 0xBF, 0x5E, 0x9D, 0x1D, 0xD1, + 0x0D, 0xF0, 0xF5, 0xD1, 0xCF, 0xBF, 0x50, 0x0A, 0x1B, 0x24, 0xAC, 0xE0, 0xC1, 0x61, 0x23, 0xC7, + 0xA7, 0x0B, 0x83, 0x91, 0x63, 0xD3, 0xA5, 0x3B, 0x26, 0xAD, 0xC6, 0xFB, 0x70, 0xD8, 0x45, 0x5F, + 0xF8, 0x4E, 0x0A, 0x78, 0xDC, 0x86, 0x41, 0xFA, 0x2A, 0xDB, 0x0F, 0x5D, 0x7C, 0xD7, 0x17, 0xCE, + 0x93, 0x40, 0xD0, 0x36, 0x7B, 0xDF, 0x4C, 0x24, 0xC3, 0x91, 0x0D, 0xFD, 0x06, 0x3B, 0xD3, 0xF4, + 0x61, 0xDC, 0x8F, 0x70, 0xDF, 0x16, 0xAC, 0x53, 0x6E, 0x14, 0x7B, 0x18, 0x9A, 0xE3, 0x37, 0x44, + 0x86, 0x1D, 0x43, 0xD2, 0x31, 0xDB, 0x6C, 0xBE, 0xA3, 0x89, 0x0F, 0x9D, 0x07, 0x98, 0x4E, 0x80, + 0xDE, 0xDE, 0xE4, 0x10, 0x2E, 0x7A, 0xA3, 0xDC, 0x93, 0x72, 0xCA, 0x9B, 0x2D, 0xF6, 0x09, 0x70, + 0x7D, 0xFC, 0x65, 0xFC, 0x0D, 0x86, 0xD0, 0xB4, 0xD0, 0xBF, 0x66, 0x8B, 0xED, 0xCA, 0x77, 0xC4, + 0x77, 0xD2, 0x2D, 0x7D, 0x97, 0x51, 0xB4, 0xCD, 0xBB, 0x04, 0x1F, 0x21, 0x80, 0x01, 0xD7, 0xDA, + 0x62, 0x9F, 0x7B, 0xF4, 0xE3, 0x06, 0x7F, 0xFC, 0x4D, 0x5C, 0xA3, 0x5F, 0x5F, 0x9D, 0xC8, 0x50, + 0x17, 0xFF, 0x80, 0x35, 0xF1, 0xDC, 0x68, 0x37, 0xD7, 0x32, 0x81, 0xCF, 0xBC, 0x90, 0xB5, 0xD9, + 0xE4, 0x32, 0x23, 0xB7, 0x54, 0x4E, 0x12, 0xB3, 0xDD, 0x9C, 0x1C, 0x66, 0xB9, 0x3D, 0x96, 0x8D, + 0xE7, 0x4D, 0xB2, 0xBC, 0xC9, 0x98, 0x5E, 0x7B, 0xC4, 0x35, 0xB9, 0xBB, 0xFE, 0xB4, 0x80, 0x5E, + 0xB5, 0xDB, 0xB7, 0x98, 0x9D, 0x52, 0xF4, 0xE8, 0x8D, 0xD3, 0xA3, 0xD0, 0x05, 0xD3, 0x1E, 0x44, + 0xDD, 0x8F, 0xE3, 0x78, 0x01, 0x33, 0xE2, 0x6F, 0x23, 0xDC, 0xF2, 0x15, 0xA3, 0x7A, 0x15, 0xFD, + 0xF8, 0x17, 0x03, 0x2D, 0x19, 0x2F, 0xB6, 0x18, 0x80, 0x5D, 0xA6, 0x3B, 0x4F, 0x81, 0x4B, 0x7E, + 0x57, 0x0E, 0x58, 0x0A, 0xC8, 0x95, 0x38, 0x43, 0xF1, 0x0C, 0xAC, 0x2D, 0xF8, 0xE2, 0x4C, 0xE1, + 0x71, 0xEE, 0xDC, 0x33, 0x91, 0xC1, 0x14, 0xD1, 0xF2, 0x9C, 0x91, 0xC1, 0x22, 0xCB, 0xB1, 0xBF, + 0xA8, 0xDC, 0x7E, 0xC7, 0x89, 0xAE, 0x0B, 0x9D, 0xEC, 0x89, 0x86, 0x53, 0xF6, 0x01, 0x01, 0x99, + 0x93, 0xB0, 0xB7, 0x76, 0x38, 0x01, 0xBE, 0xE8, 0x5F, 0x02, 0xD8, 0x99, 0xE0, 0x62, 0x82, 0xC0, + 0x2A, 0x05, 0x17, 0xCF, 0x5C, 0x7E, 0xC9, 0xD4, 0x7F, 0xD8, 0xBF, 0x88, 0xC6, 0xBA, 0xB0, 0x45, + 0x7E, 0x91, 0xB9, 0x17, 0xAC, 0xA9, 0x04, 0x25, 0x11, 0xA0, 0x6E, 0xE0, 0x61, 0x4F, 0xF6, 0x13, + 0xA5, 0x2D, 0x89, 0x9E, 0xA7, 0x15, 0x5D, 0xD9, 0x70, 0xAE, 0x66, 0x93, 0x34, 0x2C, 0x4C, 0x8C, + 0x70, 0x28, 0x3E, 0xD5, 0x2F, 0xEC, 0x25, 0xFB, 0x33, 0x5E, 0x88, 0xC8, 0x38, 0x17, 0x04, 0x23, + 0x13, 0x10, 0x27, 0x8E, 0xE1, 0x05, 0xD9, 0x49, 0x63, 0x38, 0x4D, 0xE6, 0xCB, 0x48, 0x14, 0xCA, + 0xD1, 0x1C, 0xB0, 0x3B, 0x9B, 0xAA, 0x41, 0x04, 0x14, 0xBA, 0x7B, 0xCB, 0x99, 0x73, 0x4B, 0x19, + 0x8F, 0x41, 0xF4, 0x7E, 0xC4, 0xC0, 0x5F, 0x3F, 0x3A, 0x30, 0x30, 0xF8, 0x17, 0x7B, 0x8E, 0x7A, + 0x6C, 0x50, 0x28, 0x1C, 0xF5, 0x08, 0x3D, 0xA1, 0xC4, 0x42, 0x8E, 0xC3, 0x28, 0xCD, 0xD0, 0xC4, + 0x45, 0x64, 0x8B, 0x76, 0x87, 0x12, 0x94, 0xEB, 0x7A, 0xCE, 0x0F, 0xA0, 0xE5, 0x00, 0x23, 0x4B, + 0xF6, 0x9A, 0x71, 0xD0, 0xDD, 0x03, 0x08, 0x3D, 0x43, 0x11, 0x56, 0xA2, 0x19, 0x51, 0x7E, 0x44, + 0x31, 0x01, 0x9C, 0x2D, 0x6A, 0x59, 0x7D, 0x98, 0x59, 0xBC, 0x08, 0x1C, 0xCD, 0x60, 0x8E, 0x9D, + 0x0D, 0xFE, 0x8B, 0x62, 0x05, 0x47, 0x3C, 0x18, 0x3A, 0x06, 0x03, 0x01, 0xCF, 0xE4, 0x18, 0x8A, + 0xF3, 0x1F, 0x9D, 0xA6, 0x3E, 0xCA, 0x89, 0xA4, 0x41, 0xE9, 0x11, 0x75, 0xBC, 0x7B, 0xE0, 0x2E, + 0x0D, 0x76, 0x61, 0xEB, 0x30, 0xBE, 0x1F, 0x85, 0xD4, 0x44, 0x7E, 0xD2, 0xDF, 0x6E, 0xF1, 0xE2, + 0x5A, 0x0C, 0x7C, 0x63, 0x8E, 0x78, 0x14, 0xBC, 0x7C, 0x2D, 0xD4, 0x4D, 0x03, 0xE3, 0xD7, 0x6D, + 0x86, 0x49, 0x85, 0x13, 0x4E, 0x96, 0xA6, 0xE8, 0x8B, 0xC7, 0x61, 0x30, 0x34, 0x16, 0x09, 0xB3, + 0x18, 0xA1, 0x03, 0x53, 0x30, 0x31, 0x72, 0xE8, 0x98, 0x63, 0x8A, 0xF6, 0xF1, 0x4B, 0xA6, 0x1F, + 0x4D, 0xDA, 0xA0, 0x1B, 0x71, 0x8A, 0x42, 0xAC, 0xC3, 0x2B, 0xA3, 0x38, 0x56, 0x5A, 0x06, 0xD9, + 0x50, 0x5A, 0x47, 0xCC, 0x03, 0x41, 0xE9, 0xCD, 0xC7, 0xFE, 0xD9, 0x4D, 0x11, 0x4A, 0xB4, 0xDB, + 0x68, 0x8E, 0xC6, 0xC2, 0xE0, 0x1E, 0x49, 0x83, 0x1F, 0x9A, 0x4D, 0x7F, 0x8B, 0xB5, 0x1A, 0xF4, + 0x07, 0xBD, 0xB0, 0x76, 0x57, 0xE8, 0x11, 0x07, 0x78, 0xCE, 0xFB, 0x73, 0x67, 0x8C, 0x0F, 0x32, + 0xC0, 0x76, 0xA6, 0x45, 0xB9, 0xD5, 0xCE, 0xF3, 0xFC, 0x47, 0xCC, 0x9A, 0x9F, 0x91, 0x25, 0x81, + 0x79, 0xE8, 0x06, 0xC1, 0x36, 0xFD, 0x77, 0xA5, 0x0D, 0x80, 0xA9, 0x58, 0x4A, 0x85, 0xF8, 0xA2, + 0xE2, 0x57, 0x9F, 0x39, 0x80, 0x51, 0xB6, 0x03, 0x4E, 0xB6, 0x5D, 0x77, 0x1B, 0x73, 0x62, 0x45, + 0x5D, 0xC9, 0x6F, 0x8E, 0xA2, 0x90, 0xB8, 0xA7, 0xD8, 0x99, 0x73, 0xF0, 0x29, 0xE2, 0x44, 0x73, + 0xBB, 0x25, 0x4E, 0xD5, 0x39, 0x65, 0xBD, 0x00, 0x78, 0x04, 0x9E, 0xBD, 0x31, 0xD7, 0x9A, 0xDB, + 0x14, 0x9D, 0x0A, 0xCB, 0xA3, 0x1E, 0x21, 0x9D, 0xC4, 0xBF, 0x5B, 0x35, 0x5F, 0xDF, 0xB2, 0xA8, + 0x37, 0x01, 0xEC, 0x32, 0x38, 0x98, 0xED, 0x64, 0x45, 0xA3, 0x79, 0x45, 0xED, 0x06, 0x38, 0x71, + 0x9F, 0x2A, 0x11, 0x9D, 0x63, 0x27, 0x93, 0xE2, 0x50, 0x9C, 0x61, 0x35, 0x47, 0x30, 0x2A, 0x26, + 0x10, 0x89, 0x01, 0x0E, 0xE9, 0x57, 0xEA, 0x58, 0x11, 0xD5, 0x47, 0x0E, 0xD9, 0xE6, 0xC9, 0xD0, + 0xC1, 0xD0, 0x03, 0xCC, 0xE3, 0xCE, 0x9C, 0xF9, 0x17, 0xB1, 0x9F, 0x65, 0x26, 0xFA, 0x77, 0x51, + 0xBA, 0xF3, 0x67, 0x11, 0xAF, 0x92, 0x62, 0x55, 0x90, 0x10, 0x83, 0x62, 0x61, 0x0A, 0xA5, 0x0B, + 0x10, 0xA6, 0xA8, 0x42, 0x83, 0x10, 0x8C, 0x38, 0x1C, 0xEB, 0x70, 0xE4, 0xCB, 0x75, 0xC6, 0xEB, + 0x60, 0x89, 0x4C, 0xF7, 0x28, 0x8A, 0x08, 0x57, 0x3B, 0x8C, 0xD9, 0x4D, 0xDB, 0xB7, 0x84, 0x74, + 0x31, 0x1A, 0x71, 0xC3, 0x14, 0x62, 0xD4, 0x2D, 0x1F, 0x98, 0x51, 0x4C, 0x30, 0xB9, 0xD9, 0x5D, + 0xDF, 0x9C, 0x5C, 0x4D, 0x9A, 0xA2, 0x8F, 0xA4, 0x68, 0x16, 0xCB, 0x3E, 0xA6, 0x2F, 0x04, 0xAB, + 0x58, 0xCE, 0x23, 0x79, 0xA3, 0xDB, 0xED, 0xB2, 0x4D, 0x57, 0x14, 0x4B, 0xF1, 0x39, 0x48, 0x81, + 0xA1, 0xC7, 0x82, 0x30, 0x70, 0x40, 0xCF, 0xB1, 0xDE, 0x51, 0xD6, 0x68, 0x7C, 0x2B, 0x23, 0x7F, + 0x30, 0x6D, 0x00, 0x5D, 0xA0, 0x29, 0x1C, 0xE6, 0x49, 0x76, 0x36, 0x3D, 0x16, 0x2F, 0x13, 0xB2, + 0x49, 0x54, 0x81, 0x63, 0xC3, 0x1F, 0xC3, 0x0D, 0xF3, 0x22, 0x38, 0xA1, 0x65, 0x70, 0x6F, 0x0B, + 0x94, 0x1B, 0xCB, 0x01, 0xDC, 0x72, 0xD6, 0x4F, 0x2C, 0x21, 0xD0, 0x56, 0x20, 0x93, 0x28, 0xC4, + 0x41, 0x4C, 0xA3, 0x64, 0x9A, 0x82, 0x50, 0xBC, 0x22, 0x3C, 0x42, 0xBA, 0x13, 0x45, 0x13, 0x64, + 0x76, 0x46, 0xB9, 0xF5, 0x29, 0xDA, 0x6E, 0x2A, 0x1F, 0x46, 0x63, 0xDA, 0x2F, 0x71, 0x0F, 0x46, + 0xCC, 0x60, 0xD6, 0x1C, 0xA9, 0x80, 0x03, 0x1B, 0x7F, 0xE1, 0x47, 0x04, 0x9D, 0x5B, 0x20, 0xA2, + 0xD0, 0x49, 0x1E, 0x95, 0x55, 0x98, 0xB3, 0x41, 0x0B, 0x0C, 0x01, 0x48, 0x34, 0x4E, 0x15, 0xD6, + 0x4A, 0x5D, 0xFC, 0xEF, 0x4F, 0x9C, 0xEB, 0x6A, 0xDE, 0xDB, 0x53, 0xAD, 0x65, 0xA1, 0x4F, 0xA0, + 0x4D, 0xC0, 0x54, 0x29, 0x65, 0xA0, 0xBA, 0xB3, 0x7F, 0x6C, 0x41, 0x9B, 0x1C, 0x09, 0xAD, 0x67, + 0x97, 0xE8, 0x13, 0x4C, 0xDB, 0x7A, 0x8E, 0xF7, 0x6E, 0xBF, 0x9D, 0x9D, 0xAA, 0x99, 0xCD, 0x16, + 0x70, 0x5D, 0x98, 0xE1, 0xDE, 0xDD, 0x50, 0xE6, 0x7E, 0x90, 0x71, 0x7D, 0x62, 0x96, 0x09, 0x0E, + 0x8C, 0xD9, 0x1A, 0x1C, 0x7A, 0x43, 0x70, 0xCD, 0x5F, 0xB6, 0x7F, 0xDD, 0xFE, 0x0D, 0xA1, 0xC4, + 0xFD, 0x35, 0x4C, 0x1A, 0xA5, 0xEA, 0x89, 0xBF, 0x1C, 0x0A, 0x48, 0xE5, 0x3D, 0xEA, 0xA8, 0x62, + 0x79, 0x96, 0x8D, 0x9C, 0x89, 0x5A, 0x2E, 0xD3, 0xA8, 0x2A, 0x49, 0x46, 0xBF, 0x1C, 0xA8, 0x87, + 0x6B, 0xCC, 0x87, 0xD5, 0x4C, 0xF5, 0x6A, 0x7F, 0x21, 0x51, 0x1D, 0x89, 0x05, 0x17, 0x8A, 0xE8, + 0x18, 0xB7, 0x5B, 0x5E, 0x34, 0xC7, 0xBA, 0xE1, 0xD0, 0xAF, 0x6A, 0x38, 0xF4, 0xEB, 0x8B, 0xC1, + 0xA1, 0x5F, 0x4B, 0xE2, 0xD0, 0xAF, 0x6F, 0x38, 0x34, 0x0D, 0x87, 0x7E, 0x53, 0xC3, 0xA1, 0xDF, + 0x5E, 0x0C, 0x0E, 0xFD, 0x56, 0x12, 0x87, 0x7E, 0x7B, 0xC3, 0xA1, 0xAC, 0x27, 0x22, 0xC8, 0x4F, + 0x28, 0x9D, 0x0B, 0x39, 0x5D, 0x05, 0x8B, 0xD4, 0xF2, 0x82, 0x3F, 0x2B, 0x22, 0xCD, 0x73, 0x1A, + 0x4C, 0xAE, 0xB9, 0x10, 0x22, 0x25, 0x5B, 0xBE, 0x08, 0x54, 0x12, 0xBB, 0x78, 0x12, 0xF9, 0xB9, + 0x7C, 0xC7, 0x6B, 0x8D, 0x84, 0x14, 0xFD, 0xEC, 0x39, 0x1A, 0x29, 0x0F, 0x18, 0x1A, 0x09, 0xFA, + 0x29, 0xE9, 0x58, 0x5A, 0x35, 0x28, 0x07, 0x04, 0xC8, 0xC9, 0x7F, 0x84, 0xB0, 0x2F, 0x30, 0x7D, + 0xDD, 0x71, 0x1F, 0xB7, 0x5D, 0x74, 0x9D, 0x93, 0x06, 0x90, 0x09, 0x89, 0x7A, 0xBD, 0xE5, 0x68, + 0xF5, 0x3C, 0x87, 0x8B, 0xE5, 0x3E, 0x45, 0xD4, 0xA7, 0x2C, 0xD9, 0xDC, 0x10, 0x6D, 0x4E, 0x2B, + 0x2F, 0xF8, 0x55, 0xBE, 0x79, 0x20, 0x76, 0x6A, 0x66, 0x41, 0xCC, 0xFC, 0x31, 0x93, 0xA9, 0xCF, + 0x7A, 0xC2, 0x04, 0x74, 0x92, 0xAD, 0xE1, 0x88, 0x73, 0x9A, 0xF6, 0x1D, 0x96, 0xD4, 0xC6, 0xBA, + 0x25, 0xCA, 0xB8, 0x11, 0x7B, 0x9A, 0x44, 0xF5, 0x57, 0x3B, 0xBB, 0x4D, 0x35, 0x3F, 0x93, 0x78, + 0xD2, 0x0E, 0x25, 0x50, 0x49, 0xD4, 0x93, 0xBA, 0x94, 0xE6, 0xA9, 0x23, 0x96, 0xAC, 0x09, 0xC9, + 0x92, 0xE5, 0x1C, 0x59, 0xAA, 0x12, 0xA3, 0xE8, 0xA1, 0xF4, 0x90, 0xED, 0xF1, 0x90, 0xC7, 0x4B, + 0x1A, 0xB2, 0x43, 0x43, 0x9E, 0x2C, 0x69, 0xB4, 0x9D, 0xDA, 0xE1, 0x11, 0x1E, 0x5C, 0x37, 0x43, + 0x2D, 0xB8, 0xF0, 0x6F, 0x1C, 0xE7, 0xD2, 0xB1, 0x07, 0x37, 0xCE, 0x31, 0x3F, 0x15, 0x18, 0x08, + 0x7C, 0x64, 0xEA, 0x44, 0x0A, 0xE5, 0x42, 0x2D, 0x3D, 0xE9, 0xF9, 0xE9, 0xF4, 0x56, 0x55, 0x06, + 0x99, 0xB8, 0x24, 0xAA, 0xD0, 0x84, 0xA4, 0x19, 0x46, 0x5A, 0x32, 0xA9, 0xD6, 0x6E, 0x24, 0xBB, + 0x47, 0x63, 0xD1, 0x91, 0x61, 0x14, 0xB4, 0x0E, 0xCD, 0xF0, 0x12, 0xD3, 0x16, 0x3A, 0xEB, 0xA8, + 0xFF, 0xC8, 0xC6, 0x55, 0xD5, 0xBC, 0x0D, 0x8E, 0xF5, 0xB3, 0x17, 0x39, 0xF3, 0xF1, 0x08, 0x38, + 0xF7, 0x53, 0xFA, 0x6B, 0x55, 0x6C, 0x72, 0x80, 0x00, 0x20, 0x4B, 0x6C, 0x89, 0x84, 0xF3, 0x9A, + 0x41, 0xBE, 0xFA, 0x5B, 0x64, 0x82, 0x8B, 0x2B, 0x7E, 0x78, 0x5C, 0x87, 0xD3, 0x22, 0x21, 0x49, + 0xD0, 0xDB, 0x62, 0x51, 0xCC, 0x0C, 0x5E, 0xB0, 0x65, 0xAE, 0x8A, 0x9B, 0xEC, 0xEA, 0x2F, 0x17, + 0x3E, 0x73, 0x67, 0xE6, 0xDD, 0x42, 0xEB, 0xF9, 0xEF, 0x16, 0x70, 0x8A, 0x87, 0xD1, 0x1D, 0x5B, + 0xB5, 0x57, 0x0A, 0x51, 0x2D, 0xEC, 0x92, 0xF7, 0x3E, 0x6B, 0x7C, 0xAB, 0xF0, 0x39, 0x5E, 0xF9, + 0xF8, 0x66, 0x41, 0x99, 0xF2, 0x54, 0x38, 0x5B, 0xEA, 0x66, 0x21, 0x67, 0xB4, 0xF8, 0x76, 0xE1, + 0xF2, 0x72, 0xA8, 0x3C, 0xF0, 0xCA, 0x5F, 0x42, 0xC0, 0x62, 0xB2, 0xF7, 0x0E, 0xF8, 0xE8, 0xED, + 0xD6, 0xA1, 0x8A, 0xD4, 0x5B, 0x04, 0xCF, 0x4B, 0x2D, 0x20, 0xFD, 0xA7, 0x48, 0xE2, 0xAD, 0x3C, + 0xD2, 0x9A, 0x56, 0xD7, 0x0D, 0xFA, 0x37, 0x83, 0xD0, 0x28, 0x62, 0x9F, 0xA9, 0x34, 0x3F, 0xD4, + 0x1C, 0xC3, 0x4B, 0x0A, 0x06, 0xC5, 0x2D, 0x78, 0xB2, 0xE5, 0xCB, 0x31, 0xBC, 0x24, 0x31, 0x03, + 0xF5, 0x91, 0x85, 0xA2, 0x06, 0x0C, 0xB0, 0xFA, 0xB8, 0x11, 0x41, 0xA1, 0x04, 0x72, 0xC8, 0xA6, + 0x2F, 0xC6, 0xC2, 0x2B, 0x24, 0xF2, 0x80, 0x24, 0xCF, 0x73, 0xCC, 0x70, 0x1F, 0xE4, 0xDA, 0x67, + 0x8B, 0xD9, 0x7C, 0xA7, 0x85, 0x03, 0x83, 0x2C, 0x2E, 0x46, 0x62, 0x62, 0x28, 0x75, 0x24, 0x49, + 0x5B, 0x7A, 0xD2, 0x13, 0x9E, 0x6D, 0xEB, 0x59, 0xD7, 0xFB, 0xE3, 0xC2, 0x8D, 0x73, 0x09, 0xFE, + 0xC8, 0x12, 0xAC, 0xBA, 0x36, 0x9F, 0x98, 0x27, 0x63, 0xFA, 0xBF, 0x1C, 0x9D, 0x29, 0x9F, 0xC6, + 0x57, 0x9A, 0x77, 0xB7, 0x0D, 0xA3, 0x29, 0x67, 0x65, 0x5C, 0x90, 0xD4, 0x91, 0x90, 0x3C, 0xBE, + 0x70, 0x6C, 0xCA, 0x8E, 0xA8, 0x5A, 0xD7, 0x99, 0x65, 0x99, 0xAE, 0xEF, 0x98, 0x46, 0x5C, 0x4C, + 0x07, 0x26, 0x1C, 0xD5, 0xDC, 0x91, 0x02, 0x4A, 0x2C, 0x79, 0xA1, 0xBE, 0xA5, 0x49, 0xC8, 0x25, + 0xDF, 0xC7, 0xE7, 0x23, 0xC7, 0x0E, 0xA9, 0x78, 0x84, 0xF4, 0xCB, 0xC7, 0x2D, 0xB2, 0x8D, 0x22, + 0x82, 0xCB, 0xC2, 0x85, 0x97, 0x22, 0x02, 0x8C, 0xB2, 0xC9, 0x77, 0x2E, 0xBB, 0xDE, 0x29, 0x22, + 0xBB, 0x15, 0xBF, 0x90, 0x8B, 0x31, 0x59, 0x75, 0x4D, 0x6A, 0x37, 0x42, 0x8A, 0xAF, 0xB9, 0x93, + 0x13, 0x59, 0x78, 0x45, 0xAE, 0x27, 0x71, 0x12, 0xD5, 0x4A, 0xC8, 0x3B, 0x05, 0xAC, 0xC8, 0xD3, + 0x2B, 0x22, 0x23, 0x71, 0xA4, 0xCB, 0x21, 0xB7, 0x6A, 0x49, 0xFB, 0x17, 0x96, 0xA1, 0x01, 0x6E, + 0x32, 0x37, 0xD9, 0x6F, 0x86, 0x8F, 0x51, 0xB4, 0x95, 0x66, 0xE9, 0xD0, 0x14, 0xF9, 0x0B, 0xA6, + 0x2F, 0x12, 0x99, 0xB7, 0x39, 0x83, 0x47, 0xC4, 0x73, 0x4A, 0x9C, 0x20, 0x8B, 0xD0, 0x72, 0x2E, + 0xFA, 0x4C, 0xA4, 0xAC, 0x34, 0xB6, 0xE2, 0xA9, 0x89, 0xFC, 0xEA, 0x72, 0xC2, 0x14, 0x60, 0xF4, + 0x2F, 0x7E, 0x78, 0x1B, 0x78, 0x1A, 0xE5, 0x2E, 0xFF, 0x17, 0x51, 0x75, 0x47, 0x7A, 0xCC, 0x1E, + 0xC1, 0x6F, 0xDB, 0xD6, 0x98, 0xE4, 0x59, 0x18, 0xDB, 0x72, 0x74, 0xDD, 0x1D, 0x67, 0x72, 0x88, + 0xB9, 0x51, 0x1C, 0x56, 0x0D, 0xDD, 0xE1, 0x17, 0x54, 0xB3, 0x23, 0x72, 0x9B, 0x1D, 0xF3, 0xB3, + 0x21, 0xF4, 0xF0, 0x28, 0x6A, 0x72, 0x89, 0xC0, 0x21, 0x59, 0x14, 0x0C, 0xA7, 0x45, 0xBE, 0xAD, + 0x9A, 0xBC, 0xBB, 0xC2, 0x1C, 0xC1, 0x6C, 0x98, 0x1A, 0x75, 0x8B, 0x82, 0x78, 0x42, 0x5B, 0xBC, + 0x40, 0x4D, 0xE2, 0xA2, 0x21, 0xC9, 0xBA, 0x60, 0xF1, 0x3A, 0x69, 0xCB, 0x29, 0xA8, 0xC7, 0x7A, + 0xD0, 0x1E, 0x7D, 0x69, 0xC0, 0x92, 0x79, 0xDD, 0x87, 0x18, 0xCE, 0x37, 0xE5, 0xE2, 0x8F, 0x51, + 0xED, 0x9E, 0x35, 0x54, 0xFA, 0x54, 0x52, 0x51, 0x14, 0xAA, 0x04, 0xB6, 0x7E, 0x04, 0xDE, 0x9E, + 0x42, 0xE0, 0x4C, 0x29, 0x47, 0x4A, 0x3E, 0xA1, 0x5B, 0xD0, 0xC5, 0x51, 0xF7, 0x24, 0x4B, 0xE7, + 0xF0, 0x68, 0x45, 0xC9, 0x1C, 0x66, 0x96, 0x43, 0xE5, 0x9A, 0x61, 0xA8, 0x12, 0xB8, 0xA4, 0x10, + 0x55, 0xF2, 0x7E, 0x23, 0xBE, 0x22, 0xC4, 0xB7, 0x24, 0xCD, 0x5A, 0x13, 0x5B, 0x2B, 0x76, 0x56, + 0x41, 0xD0, 0x9E, 0x4C, 0xBB, 0x26, 0x91, 0x43, 0xAD, 0x86, 0x2E, 0x0D, 0xB3, 0x39, 0x7A, 0xFE, + 0xEC, 0xE7, 0xA7, 0xA6, 0x1F, 0x50, 0x41, 0xB4, 0xF8, 0x94, 0xA2, 0xB8, 0x10, 0x29, 0x2F, 0x4B, + 0xA8, 0x44, 0x68, 0x28, 0xC4, 0xE7, 0x94, 0xC8, 0x1C, 0x1F, 0x56, 0xA1, 0x1F, 0x52, 0xD6, 0x21, + 0xCA, 0x8A, 0xE2, 0x04, 0x54, 0xA3, 0x87, 0x72, 0xAA, 0x3B, 0x51, 0x74, 0xAF, 0xE9, 0x8F, 0xC4, + 0x49, 0x85, 0x74, 0xA3, 0xD9, 0x8F, 0x0C, 0x70, 0x8D, 0xDB, 0xBE, 0x28, 0xC0, 0x71, 0x34, 0xC2, + 0x94, 0x5A, 0x44, 0x02, 0x86, 0x44, 0x7C, 0xA4, 0x8E, 0x5B, 0xDE, 0xC7, 0xDC, 0x28, 0x30, 0x47, + 0x8F, 0x02, 0x46, 0x84, 0xA9, 0x11, 0xA7, 0xB8, 0xBE, 0x3E, 0x19, 0xE5, 0x8D, 0x29, 0xBB, 0x0B, + 0x71, 0x95, 0x4B, 0xA3, 0x7E, 0x21, 0x73, 0x4A, 0xAA, 0xE9, 0x4B, 0x33, 0xB6, 0xC9, 0xC5, 0x5D, + 0x47, 0x61, 0x42, 0xD3, 0x32, 0x32, 0x4A, 0xD6, 0xF0, 0x34, 0x8E, 0x10, 0x8F, 0x22, 0xD2, 0xEB, + 0xAD, 0x02, 0x6B, 0xC0, 0xA3, 0x4D, 0x6A, 0xD5, 0x46, 0x11, 0x2E, 0x11, 0xFD, 0xE9, 0x0E, 0xF1, + 0x1D, 0x9D, 0x0E, 0xCF, 0x49, 0x3E, 0x01, 0x04, 0x67, 0x07, 0xE3, 0xC8, 0x78, 0xDF, 0x34, 0x26, + 0xFA, 0x93, 0x95, 0x71, 0x13, 0x07, 0xB3, 0x2C, 0xE2, 0x13, 0xBD, 0x00, 0xDF, 0x98, 0xB7, 0x9E, + 0x94, 0x69, 0x8B, 0x73, 0x10, 0x79, 0xAC, 0xE2, 0x19, 0xEE, 0x1F, 0xB0, 0x73, 0x00, 0x57, 0xC0, + 0x2E, 0xEB, 0xC7, 0x38, 0xEC, 0xE6, 0xDE, 0x07, 0xD8, 0x01, 0x76, 0xE3, 0x78, 0xFA, 0x70, 0xB3, + 0xD5, 0x6C, 0xC3, 0x1F, 0xAF, 0xAF, 0xEE, 0xC3, 0x42, 0xD9, 0x4D, 0x86, 0xAC, 0xCA, 0xB0, 0x9D, + 0x74, 0x17, 0x2F, 0xD2, 0xD6, 0x2F, 0x65, 0xE9, 0x32, 0xF2, 0x88, 0x14, 0x6D, 0x57, 0xA0, 0xC2, + 0xCA, 0x6C, 0x1B, 0x5E, 0x24, 0x54, 0x77, 0x89, 0x5D, 0x9C, 0x64, 0xD8, 0x05, 0xF1, 0x86, 0x70, + 0x94, 0x65, 0x0D, 0x42, 0xD9, 0xDD, 0x4A, 0xF1, 0x18, 0x91, 0x59, 0x8C, 0x64, 0x14, 0xF1, 0x35, + 0x89, 0xDA, 0xE8, 0xF9, 0xE9, 0x31, 0x6E, 0x88, 0x12, 0xB3, 0x5B, 0xCC, 0x1F, 0xA2, 0x42, 0x8C, + 0x85, 0x5E, 0x90, 0x26, 0xD1, 0xF4, 0x4C, 0x31, 0xB1, 0x20, 0x5C, 0x37, 0xDE, 0x28, 0xBC, 0x42, + 0x53, 0x5F, 0x84, 0xB9, 0x51, 0x1A, 0xBA, 0xE2, 0xD7, 0x34, 0xA2, 0x87, 0xA5, 0x91, 0x35, 0x79, + 0x5A, 0x2C, 0x87, 0xB4, 0x23, 0x27, 0xD7, 0xC8, 0x5D, 0xA0, 0x56, 0xE6, 0x96, 0x8E, 0x9C, 0xEB, + 0x9F, 0x99, 0xB2, 0x3F, 0x83, 0x46, 0x2B, 0xA2, 0xBF, 0x29, 0x49, 0x0C, 0xD3, 0x58, 0xB4, 0xB4, + 0xE8, 0xDC, 0x15, 0x6A, 0x34, 0x86, 0x97, 0x4B, 0xE9, 0x20, 0x4E, 0x94, 0x48, 0x1E, 0xD9, 0x49, + 0xAF, 0x6B, 0xF4, 0xDE, 0x6E, 0xBC, 0x55, 0x57, 0xAA, 0xE2, 0x86, 0x74, 0x02, 0xC1, 0x4A, 0x85, + 0x2E, 0x44, 0xAD, 0xDF, 0xC2, 0x17, 0x16, 0x4E, 0x48, 0xD5, 0x87, 0x2F, 0x5C, 0x6A, 0xC1, 0x36, + 0x5E, 0x74, 0xE3, 0x7D, 0xDE, 0x5B, 0x14, 0xC3, 0x33, 0x45, 0x31, 0x44, 0x14, 0xA4, 0x18, 0xC9, + 0xA0, 0xBC, 0x3D, 0xC9, 0xCD, 0xAD, 0x3C, 0xF0, 0x61, 0x7C, 0x2A, 0xE5, 0x07, 0x3F, 0x8C, 0xBF, + 0x5F, 0xB1, 0x00, 0x88, 0x9D, 0x66, 0xA3, 0xF9, 0xA1, 0xD9, 0xFE, 0xB0, 0xF3, 0xFE, 0x03, 0xAB, + 0xB7, 0x9A, 0xBB, 0x8D, 0xD6, 0xFE, 0x6E, 0x73, 0xF7, 0xFD, 0x5E, 0x8B, 0xB5, 0x76, 0xF7, 0xE0, + 0xBB, 0xFD, 0x0F, 0xD5, 0x46, 0x3F, 0x2C, 0x61, 0xBC, 0x28, 0xF4, 0x61, 0x09, 0x43, 0x29, 0xC4, + 0x3D, 0x4C, 0x9D, 0x45, 0xA1, 0x6B, 0xF3, 0x72, 0x33, 0x7E, 0x0B, 0x7A, 0x98, 0x12, 0xF4, 0x30, + 0x29, 0x44, 0x56, 0x1E, 0xF8, 0x10, 0x0D, 0xB1, 0x80, 0xE0, 0x87, 0x45, 0xCF, 0x3E, 0x39, 0xC6, + 0x62, 0x82, 0x20, 0x16, 0xBD, 0x82, 0xF4, 0x28, 0x6B, 0x1F, 0x0C, 0x91, 0x3C, 0xBA, 0x5E, 0x4D, + 0x4C, 0xC4, 0x7A, 0x16, 0x0E, 0xED, 0x71, 0xEF, 0x1E, 0x0B, 0x7B, 0xA5, 0x0A, 0x87, 0x8A, 0x87, + 0x4B, 0x2B, 0x1C, 0x1A, 0xCD, 0xE1, 0x79, 0x0A, 0x87, 0xFA, 0x34, 0x3A, 0x0A, 0xDE, 0xA1, 0x4B, + 0xC8, 0x1D, 0x99, 0xBE, 0x37, 0xFC, 0x89, 0x0A, 0xA2, 0x94, 0x2B, 0x75, 0xA2, 0x7E, 0xE8, 0x37, + 0xCA, 0xA0, 0x26, 0x0A, 0x88, 0x0A, 0x69, 0x3E, 0x40, 0x7F, 0x0E, 0x4D, 0xC7, 0x7C, 0x64, 0x52, + 0x21, 0x4E, 0xF7, 0x13, 0x8A, 0x34, 0x65, 0x76, 0xAA, 0x76, 0xE9, 0xCB, 0x29, 0x2A, 0x2A, 0x36, + 0xB4, 0x6C, 0x7E, 0xAB, 0xF9, 0xC2, 0xF8, 0x94, 0xBC, 0xDC, 0x55, 0xD4, 0xE5, 0x20, 0x3C, 0x29, + 0x5E, 0x9B, 0x63, 0x62, 0xD9, 0x0A, 0xA7, 0x80, 0x52, 0x0A, 0xEF, 0x9C, 0x8E, 0xE7, 0x33, 0xAD, + 0x24, 0x15, 0xB3, 0x16, 0xE6, 0xE5, 0xAE, 0xA0, 0x18, 0x87, 0x40, 0x81, 0xB9, 0x05, 0x39, 0xC6, + 0xCC, 0x4E, 0xAD, 0x22, 0x42, 0x2A, 0x63, 0x77, 0xE1, 0xD5, 0x96, 0x2A, 0xAE, 0x30, 0x73, 0x72, + 0x95, 0x88, 0x86, 0x13, 0xC6, 0xC0, 0xC4, 0xBA, 0xE2, 0x02, 0xAC, 0xBF, 0x37, 0x8B, 0x47, 0x29, + 0x55, 0x5F, 0x7B, 0x32, 0x76, 0x57, 0x50, 0xAE, 0x7A, 0x3B, 0xC3, 0xDA, 0xB5, 0x5F, 0xC8, 0xDA, + 0x55, 0xD8, 0xE2, 0x35, 0x05, 0x8A, 0x05, 0x46, 0x73, 0x67, 0x75, 0xF4, 0x54, 0x1B, 0x98, 0xA2, + 0xBC, 0xA0, 0xAA, 0x9C, 0x2C, 0x1E, 0x0B, 0xB1, 0x98, 0xEB, 0x6A, 0x61, 0xA1, 0x7A, 0x0D, 0xDD, + 0xC5, 0x61, 0xA1, 0x5A, 0x4D, 0xDD, 0x1C, 0x38, 0x3E, 0x1D, 0x0F, 0x45, 0x47, 0xAF, 0x0E, 0x0F, + 0xB1, 0xBA, 0xE7, 0x6A, 0xE1, 0xA1, 0x7A, 0x45, 0xDE, 0xD5, 0xE1, 0x86, 0x12, 0x8A, 0x4F, 0xC7, + 0x42, 0xD1, 0xD1, 0xAB, 0xC4, 0xC2, 0xEE, 0xCF, 0x15, 0xE1, 0xE1, 0x13, 0xEB, 0xFA, 0x26, 0xF1, + 0x50, 0xB9, 0xCC, 0xE6, 0x0C, 0x54, 0x7C, 0x5F, 0xE8, 0x2A, 0xB8, 0x12, 0x54, 0x24, 0x50, 0x56, + 0x83, 0x8C, 0xD8, 0xD5, 0x2B, 0x42, 0xC7, 0x71, 0xE5, 0xD1, 0x05, 0x33, 0x45, 0xB5, 0x5A, 0xB0, + 0xE3, 0xB3, 0x59, 0xB9, 0x9A, 0xF0, 0x2A, 0x30, 0xC5, 0x14, 0x14, 0x9F, 0x82, 0x87, 0xC9, 0x8E, + 0x5E, 0x25, 0x16, 0x2E, 0x9C, 0x29, 0x96, 0xC0, 0xC3, 0xB5, 0x62, 0x8A, 0x19, 0x50, 0x56, 0x83, + 0x8C, 0xCF, 0xC3, 0x14, 0x9F, 0xF0, 0x8A, 0x4A, 0x26, 0x93, 0xB5, 0xB7, 0xFB, 0xB4, 0x16, 0x65, + 0xF7, 0x69, 0x15, 0xB5, 0xFB, 0xB4, 0xD7, 0xD9, 0xEE, 0xD3, 0x7A, 0xC9, 0x76, 0x9F, 0xD6, 0x9B, + 0xDD, 0xA7, 0x02, 0xBB, 0x4F, 0xAB, 0x2A, 0xBB, 0x4F, 0xEB, 0x75, 0xDA, 0x7D, 0x5A, 0x6F, 0x76, + 0x9F, 0x4A, 0xEC, 0x3E, 0xAD, 0xAA, 0xEC, 0x3E, 0xAD, 0xD7, 0x69, 0xF7, 0x69, 0xBD, 0xD9, 0x7D, + 0x2A, 0xB0, 0xFB, 0xB4, 0xAA, 0xB2, 0xFB, 0xB4, 0x5E, 0xAB, 0xDD, 0xA7, 0xF5, 0x66, 0xF7, 0xA9, + 0xCA, 0xEE, 0xD3, 0xAA, 0xCE, 0xEE, 0xD3, 0x7A, 0x9D, 0x76, 0x9F, 0xD6, 0x9B, 0xDD, 0xA7, 0x02, + 0xBB, 0x4F, 0xAB, 0x2A, 0xBB, 0x4F, 0xEB, 0xB5, 0xDA, 0x7D, 0x5A, 0x6F, 0x76, 0x9F, 0xAA, 0xEC, + 0x3E, 0xAD, 0xEA, 0xEC, 0x3E, 0xAD, 0x37, 0xBB, 0xCF, 0xAA, 0xD9, 0x7D, 0xDA, 0x8B, 0xB2, 0xFB, + 0xB4, 0x8B, 0xDA, 0x7D, 0x3A, 0xEB, 0x6C, 0xF7, 0x69, 0xBF, 0x64, 0xBB, 0x4F, 0xFB, 0xCD, 0xEE, + 0x53, 0x81, 0xDD, 0xA7, 0x5D, 0x95, 0xDD, 0xA7, 0xFD, 0x3A, 0xED, 0x3E, 0xED, 0x37, 0xBB, 0x4F, + 0x25, 0x76, 0x9F, 0x76, 0x55, 0x76, 0x9F, 0xF6, 0xEB, 0xB4, 0xFB, 0xB4, 0xDF, 0xEC, 0x3E, 0x15, + 0xD8, 0x7D, 0xDA, 0x55, 0xD9, 0x7D, 0xDA, 0xAF, 0xD5, 0xEE, 0xD3, 0x7E, 0xB3, 0xFB, 0x54, 0x65, + 0xF7, 0x69, 0x57, 0x67, 0xF7, 0x69, 0xBF, 0x4E, 0xBB, 0x4F, 0xFB, 0xCD, 0xEE, 0x53, 0x81, 0xDD, + 0xA7, 0x5D, 0x95, 0xDD, 0xA7, 0xFD, 0x5A, 0xED, 0x3E, 0xED, 0x37, 0xBB, 0x4F, 0x55, 0x76, 0x9F, + 0x76, 0x75, 0x76, 0x9F, 0xF6, 0x9B, 0xDD, 0x67, 0xD5, 0xEC, 0x3E, 0x9D, 0x45, 0xD9, 0x7D, 0x3A, + 0x45, 0xED, 0x3E, 0x3B, 0xEB, 0x6C, 0xF7, 0xE9, 0xBC, 0x64, 0xBB, 0x4F, 0xE7, 0xCD, 0xEE, 0x53, + 0x81, 0xDD, 0xA7, 0x53, 0x95, 0xDD, 0xA7, 0xF3, 0x3A, 0xED, 0x3E, 0x9D, 0x37, 0xBB, 0x4F, 0x25, + 0x76, 0x9F, 0x4E, 0x55, 0x76, 0x9F, 0xCE, 0xEB, 0xB4, 0xFB, 0x74, 0xDE, 0xEC, 0x3E, 0x15, 0xD8, + 0x7D, 0x3A, 0x55, 0xD9, 0x7D, 0x3A, 0xAF, 0xD5, 0xEE, 0xD3, 0x79, 0xB3, 0xFB, 0x54, 0x65, 0xF7, + 0xE9, 0x54, 0x67, 0xF7, 0xE9, 0xBC, 0x4E, 0xBB, 0x4F, 0xE7, 0xCD, 0xEE, 0x53, 0x81, 0xDD, 0xA7, + 0x53, 0x95, 0xDD, 0xA7, 0xF3, 0x5A, 0xED, 0x3E, 0x9D, 0x37, 0xBB, 0x4F, 0x55, 0x76, 0x9F, 0x4E, + 0x75, 0x76, 0x9F, 0xCE, 0x8B, 0xB1, 0xFB, 0xCC, 0xCB, 0x21, 0x34, 0xA3, 0x57, 0x69, 0x0B, 0x8A, + 0x73, 0xA6, 0x0D, 0x78, 0x70, 0xC5, 0x7D, 0x5F, 0x1B, 0xF0, 0x4B, 0xD3, 0x0F, 0xB0, 0xD4, 0x36, + 0x15, 0x35, 0xAA, 0xDE, 0x54, 0x54, 0xC2, 0x4C, 0x14, 0x3D, 0xC7, 0xAA, 0x40, 0xC2, 0xC0, 0x71, + 0xE5, 0x0F, 0x70, 0x8A, 0xB3, 0x47, 0x52, 0xB2, 0x14, 0x4D, 0xEF, 0x7B, 0xF6, 0xAE, 0x5D, 0xDF, + 0x9C, 0x5C, 0xB1, 0x6B, 0x4A, 0x1E, 0xFB, 0xD1, 0x24, 0x74, 0xC3, 0x24, 0x57, 0xD0, 0xF6, 0x04, + 0x2D, 0x43, 0xB5, 0x2A, 0x4C, 0x47, 0x0A, 0x66, 0xA3, 0x4A, 0x33, 0x79, 0xD1, 0x92, 0x30, 0x81, + 0xBC, 0xA7, 0xD9, 0xFE, 0xC8, 0x0C, 0x12, 0xF5, 0x98, 0xA8, 0x76, 0x85, 0x86, 0xD9, 0xAA, 0x0D, + 0x91, 0x54, 0x0B, 0x93, 0xEE, 0xB6, 0xBE, 0xFC, 0x49, 0x59, 0xE1, 0x47, 0x02, 0x6F, 0x7C, 0xD6, + 0x6A, 0x36, 0x77, 0xB7, 0xE0, 0xE7, 0xFB, 0x1D, 0xFC, 0xB9, 0x4F, 0x3F, 0x3F, 0xE0, 0xCF, 0x56, + 0x7B, 0x47, 0xA4, 0x9A, 0x6F, 0x36, 0xA2, 0x46, 0xAD, 0x76, 0xA7, 0x29, 0x73, 0xD6, 0xCB, 0x84, + 0xBD, 0x96, 0xF3, 0x40, 0x25, 0xA3, 0xF0, 0x5B, 0x2A, 0xC2, 0xE5, 0x8B, 0x92, 0x6D, 0xF0, 0x1C, + 0xC6, 0xB7, 0x0D, 0x4A, 0x7F, 0x8A, 0xE9, 0xEF, 0x02, 0xCD, 0xB4, 0x1C, 0x4F, 0x96, 0x7A, 0x92, + 0x73, 0xC5, 0xEA, 0x38, 0xDB, 0x9A, 0x65, 0x89, 0x7D, 0x89, 0x66, 0xD4, 0x60, 0x97, 0x26, 0x7C, + 0xE9, 0x1F, 0xB0, 0x26, 0xBE, 0xDC, 0x6E, 0x26, 0x4B, 0x49, 0x89, 0x02, 0x71, 0x04, 0x25, 0x18, + 0x2F, 0xA0, 0x62, 0x52, 0x0E, 0xF0, 0x0A, 0xCF, 0x34, 0x0C, 0x6E, 0xE3, 0xFB, 0x38, 0x57, 0xAA, + 0x25, 0x67, 0xDA, 0x0C, 0x51, 0x82, 0x8D, 0x1C, 0x83, 0xAF, 0x57, 0x12, 0xB1, 0x5C, 0x7B, 0x61, + 0x19, 0x9C, 0x2F, 0x65, 0x32, 0x9C, 0x6F, 0x84, 0x4C, 0x37, 0xBD, 0x75, 0x00, 0xDF, 0x47, 0x49, + 0x83, 0xA3, 0x8A, 0x3D, 0x3B, 0xCD, 0x51, 0xF2, 0x53, 0x4A, 0x26, 0xAA, 0xB6, 0x79, 0xDC, 0xE7, + 0xC1, 0x8D, 0x83, 0x88, 0x22, 0x33, 0xC4, 0x51, 0xC5, 0xF9, 0x6B, 0x7C, 0x8C, 0xBB, 0x1E, 0x3D, + 0x54, 0xCB, 0x16, 0xA9, 0x5A, 0xF0, 0xEE, 0x79, 0x17, 0x7A, 0xE9, 0x3C, 0x1C, 0x47, 0x24, 0x94, + 0x5A, 0x2C, 0x7C, 0xC1, 0xE2, 0x6F, 0x80, 0x5A, 0xEC, 0xBB, 0x42, 0xCB, 0x9E, 0xBF, 0x6E, 0xC4, + 0xB7, 0x51, 0xFA, 0x60, 0xA9, 0x2D, 0x3A, 0x01, 0xA4, 0xC2, 0xE3, 0xBC, 0x41, 0x3E, 0xFE, 0x43, + 0xBD, 0xCE, 0xEA, 0xD1, 0xBF, 0x48, 0x60, 0xE2, 0x5E, 0x1F, 0x53, 0x3F, 0x0B, 0x3A, 0x49, 0x7C, + 0x5D, 0xAF, 0x67, 0x7A, 0x4C, 0x10, 0x88, 0x01, 0xD2, 0xA4, 0x69, 0xB0, 0x81, 0xE6, 0xD6, 0xF3, + 0xEE, 0xAB, 0xA6, 0x5C, 0xC4, 0x4C, 0x3B, 0x4E, 0x09, 0x86, 0xAE, 0x1B, 0x25, 0x00, 0x54, 0x39, + 0x40, 0x73, 0xA1, 0x93, 0x7F, 0xA8, 0x76, 0xBB, 0x51, 0xC7, 0x85, 0xCE, 0xCB, 0xB8, 0x59, 0xEE, + 0x50, 0x99, 0xBC, 0xDD, 0xB6, 0x63, 0x4F, 0xDB, 0x75, 0x21, 0x94, 0xA5, 0x80, 0x1C, 0x8A, 0xFA, + 0x44, 0xD1, 0xB9, 0xEA, 0x26, 0xDE, 0x78, 0xFA, 0xE1, 0x9A, 0x8F, 0xDE, 0x79, 0x18, 0x32, 0x97, + 0x7D, 0xC6, 0x20, 0xC8, 0x19, 0x65, 0x3A, 0xB7, 0x2C, 0x25, 0xAE, 0x9D, 0x52, 0x36, 0x4C, 0x76, + 0x71, 0x7A, 0x10, 0x09, 0xB7, 0x43, 0xE8, 0xF0, 0x01, 0x16, 0x7B, 0x71, 0x3A, 0x23, 0x4B, 0xFA, + 0xF6, 0x11, 0xCA, 0xB3, 0x33, 0xD3, 0x9C, 0x9F, 0x62, 0xF1, 0x44, 0x10, 0x8E, 0x4D, 0x8B, 0xDD, + 0x71, 0xF8, 0x08, 0xFB, 0x6F, 0x7A, 0x3C, 0x1E, 0xC6, 0x80, 0xAF, 0xAF, 0xF9, 0x48, 0x33, 0x6D, + 0xD3, 0x1E, 0xCC, 0x18, 0xC9, 0x61, 0x7F, 0x85, 0xD6, 0x53, 0xA5, 0xE7, 0x67, 0xCD, 0xCC, 0x9A, + 0x44, 0xB1, 0x93, 0x38, 0x75, 0xA8, 0x1F, 0x67, 0x69, 0xCD, 0xA0, 0x60, 0xFC, 0x02, 0x5B, 0x46, + 0xCA, 0xD6, 0xA9, 0x93, 0x5B, 0x62, 0xFA, 0x56, 0x59, 0xC1, 0x6B, 0x9B, 0x5D, 0x74, 0xD3, 0xC0, + 0xD0, 0x13, 0xC0, 0x20, 0x41, 0x48, 0xBB, 0x07, 0xD9, 0x8B, 0xEA, 0x67, 0x4E, 0x66, 0x57, 0x5D, + 0xBB, 0xE4, 0xAA, 0x03, 0xEE, 0x0C, 0x3C, 0xCD, 0x1D, 0x9A, 0xFA, 0x35, 0x1F, 0xC0, 0x1A, 0x4F, + 0x3D, 0xC7, 0x15, 0x9C, 0x63, 0x1E, 0xD6, 0x11, 0x72, 0x65, 0x9B, 0xD7, 0x0E, 0x3F, 0xC7, 0x4F, + 0x98, 0x78, 0x34, 0x5F, 0xD7, 0x4E, 0x57, 0x16, 0x98, 0xE8, 0x32, 0x77, 0x9E, 0x69, 0xED, 0xD9, + 0x90, 0xB3, 0x8E, 0x12, 0xC1, 0xCE, 0xDC, 0x83, 0x74, 0xFE, 0xFA, 0x66, 0xED, 0xF0, 0x7B, 0x4F, + 0x2D, 0xA7, 0xFC, 0x64, 0x11, 0x81, 0xB3, 0xEF, 0xA5, 0x5A, 0xC2, 0x14, 0x8F, 0xCA, 0xB5, 0x04, + 0x6E, 0xF0, 0xD7, 0xEB, 0x52, 0x2D, 0x77, 0x6A, 0x87, 0xFF, 0x5D, 0x03, 0x5C, 0x99, 0xDF, 0x78, + 0x7E, 0xCA, 0xFC, 0x6A, 0xA9, 0xAF, 0x27, 0x76, 0xFF, 0xD1, 0x09, 0x3D, 0x36, 0xDE, 0x66, 0xE6, + 0xD1, 0x3E, 0x4B, 0xF5, 0x08, 0x34, 0x2E, 0x60, 0xB2, 0x22, 0xF3, 0xB1, 0xA4, 0xD4, 0xBE, 0xC7, + 0xFF, 0x08, 0xB9, 0xAD, 0x3F, 0x92, 0x52, 0x25, 0xB0, 0x42, 0xB3, 0x12, 0xBC, 0x0B, 0xC4, 0x07, + 0xD7, 0xD4, 0x13, 0x44, 0xFA, 0xBD, 0xB7, 0x4A, 0xE4, 0x29, 0x84, 0x20, 0xEF, 0x09, 0xB4, 0xEB, + 0xBA, 0x3D, 0x1E, 0x60, 0xDE, 0x68, 0x7F, 0xEA, 0x19, 0xFC, 0xB4, 0xF3, 0x45, 0xF9, 0x8C, 0xD1, + 0xC2, 0xC0, 0x81, 0xB3, 0xEF, 0x9A, 0xDB, 0xFC, 0x41, 0xC3, 0x12, 0x96, 0xF0, 0x37, 0x1E, 0x86, + 0x4C, 0x3E, 0x51, 0xAC, 0xC9, 0xF2, 0x94, 0x93, 0x24, 0x3B, 0x05, 0xF5, 0x8D, 0x7E, 0x5A, 0x5A, + 0x7B, 0x89, 0xC4, 0x3F, 0xE3, 0xC9, 0x40, 0xC2, 0x03, 0xF2, 0x22, 0x50, 0xE5, 0x51, 0x63, 0x6F, + 0xEF, 0x33, 0x94, 0x1D, 0x50, 0xC7, 0x20, 0x91, 0xE2, 0x71, 0x8B, 0xE1, 0x34, 0xB1, 0x78, 0x9C, + 0x4E, 0xD5, 0x2C, 0xB5, 0x20, 0xE0, 0x23, 0x97, 0x94, 0x10, 0xC0, 0x36, 0x1B, 0xC9, 0x00, 0x3E, + 0x6E, 0x7C, 0x71, 0x46, 0x7C, 0x83, 0xFD, 0x6C, 0x9E, 0x9B, 0x5B, 0xA0, 0xC9, 0x80, 0xCC, 0xA3, + 0x61, 0x3F, 0x5B, 0xF8, 0x9D, 0x87, 0xEB, 0xA3, 0x81, 0x12, 0x88, 0x2D, 0xCE, 0x70, 0x43, 0xB9, + 0x74, 0x78, 0xC5, 0x09, 0xF0, 0xE7, 0x53, 0xC1, 0x7C, 0xAF, 0xAD, 0x52, 0x66, 0xE8, 0xE4, 0x49, + 0x94, 0x94, 0x90, 0x85, 0xA4, 0xD8, 0xF5, 0x9C, 0xBE, 0x69, 0xF1, 0x1B, 0xE7, 0x8E, 0x2B, 0x78, + 0x6E, 0xCD, 0xBD, 0x03, 0x99, 0x2C, 0xA5, 0x26, 0x05, 0x52, 0x39, 0x0E, 0xA3, 0x81, 0x0E, 0x8A, + 0x6D, 0xC1, 0xD3, 0x4B, 0x2A, 0x8C, 0xAB, 0x93, 0x13, 0x03, 0x75, 0xBC, 0x81, 0x66, 0x9B, 0x7F, + 0x0A, 0xE5, 0x61, 0xA8, 0xF9, 0x98, 0x5C, 0xDE, 0xF1, 0x5C, 0x87, 0x8C, 0x3B, 0xC0, 0x4A, 0xED, + 0x41, 0x2F, 0xF0, 0xB8, 0x36, 0x22, 0xA6, 0x99, 0x92, 0x73, 0x34, 0x5D, 0x47, 0x03, 0xF1, 0x96, + 0x48, 0x64, 0x6F, 0x92, 0xB0, 0xE3, 0x71, 0xEC, 0x95, 0x21, 0x55, 0x52, 0xEF, 0x7A, 0xE8, 0x03, + 0xFA, 0xCA, 0xBC, 0xF4, 0xCC, 0x95, 0x0B, 0x0F, 0x70, 0xE1, 0x49, 0x74, 0x04, 0x94, 0x7E, 0x64, + 0x75, 0x26, 0xB2, 0xE2, 0x73, 0xD6, 0x73, 0x35, 0xEF, 0xEE, 0x3C, 0xB4, 0x05, 0x84, 0x6A, 0x25, + 0x2A, 0x4F, 0x54, 0x59, 0xAA, 0x41, 0x0D, 0xA3, 0x55, 0xD8, 0xD5, 0xB4, 0x1B, 0xAA, 0xF7, 0x2A, + 0x84, 0x58, 0xE0, 0x3A, 0x60, 0x0E, 0x6A, 0x2B, 0x0C, 0xE6, 0x2A, 0xF4, 0xF3, 0x94, 0x0B, 0x01, + 0x35, 0xF3, 0xFD, 0x12, 0xAC, 0x15, 0x5E, 0xE0, 0x3F, 0xBF, 0x95, 0x02, 0x67, 0xB1, 0x28, 0x43, + 0x45, 0xB2, 0xEF, 0x62, 0xB6, 0x8A, 0x44, 0xCB, 0x69, 0x56, 0x88, 0x31, 0xF4, 0x26, 0xCC, 0x0F, + 0xD8, 0x78, 0xA5, 0xEC, 0x0E, 0x33, 0x97, 0x53, 0xCE, 0xF4, 0x40, 0x03, 0x90, 0xD5, 0x1D, 0x7B, + 0x3F, 0x19, 0x6A, 0x70, 0x22, 0x5B, 0xB1, 0x42, 0x14, 0xF5, 0x37, 0x47, 0xC5, 0x48, 0x9E, 0x49, + 0x71, 0x5F, 0xC7, 0x5A, 0x08, 0xA7, 0xF3, 0x35, 0xFE, 0x49, 0x60, 0x66, 0xF8, 0x80, 0x6E, 0x4E, + 0x0E, 0x58, 0x41, 0xF5, 0x28, 0xDD, 0x67, 0x7A, 0xCA, 0xE2, 0x51, 0x9E, 0x62, 0x54, 0x4C, 0x27, + 0xDA, 0xD9, 0x6F, 0x82, 0x5A, 0x84, 0x3F, 0x4B, 0xA9, 0x1A, 0x1F, 0xF6, 0xB0, 0x39, 0xFE, 0x2C, + 0xA7, 0x57, 0x7D, 0x68, 0x63, 0x7B, 0xFA, 0x55, 0x4E, 0x49, 0xDA, 0xDF, 0xC1, 0x0E, 0xE8, 0x57, + 0xA9, 0x0E, 0x76, 0xDF, 0xD3, 0x0A, 0xE8, 0x57, 0xB9, 0x25, 0xB4, 0x76, 0xC5, 0x1A, 0xE8, 0x77, + 0x39, 0x1D, 0xB1, 0xD3, 0xA4, 0x55, 0x88, 0xDF, 0xE5, 0x54, 0xBE, 0xBD, 0xA6, 0xD8, 0x48, 0xFA, + 0x5D, 0x6E, 0x2B, 0xDB, 0x2D, 0xB1, 0x99, 0xF4, 0x7B, 0xF5, 0x74, 0xC7, 0x1B, 0xBA, 0x97, 0x03, + 0x5A, 0x22, 0xF9, 0x06, 0x6F, 0xCD, 0x50, 0xE0, 0xB8, 0x3E, 0x3A, 0xBD, 0xF8, 0xC6, 0x90, 0x69, + 0x45, 0xF7, 0x6A, 0x3A, 0x10, 0xF3, 0x40, 0xDC, 0x96, 0x81, 0xF4, 0xAD, 0x0F, 0x99, 0x46, 0x05, + 0x9E, 0xB1, 0x1E, 0xCF, 0xD0, 0x41, 0x59, 0xC6, 0xE9, 0x8B, 0xFB, 0xB6, 0x84, 0x18, 0x43, 0xDB, + 0x7F, 0xEB, 0xFA, 0x2F, 0x4B, 0x69, 0x44, 0x70, 0x57, 0xC4, 0xDE, 0x32, 0x5D, 0xD5, 0x0E, 0xAF, + 0xC2, 0x1F, 0x4C, 0xFE, 0x51, 0x98, 0xAF, 0x65, 0x3B, 0xCB, 0x9B, 0x6C, 0x15, 0xBC, 0x0D, 0x90, + 0xF9, 0xEB, 0xD5, 0xD9, 0x51, 0x59, 0x8B, 0x4F, 0xB7, 0xDB, 0xDB, 0x3E, 0xBB, 0xC7, 0xEB, 0xD2, + 0x1B, 0xC0, 0xD2, 0x01, 0x96, 0xB4, 0x2A, 0x65, 0x00, 0x12, 0x77, 0x42, 0xE1, 0x0F, 0xB9, 0x32, + 0x00, 0xF9, 0x45, 0xFB, 0xA4, 0xAC, 0x49, 0xE8, 0xE8, 0xF4, 0x64, 0xFB, 0xF4, 0xE8, 0x64, 0x35, + 0xC9, 0xF3, 0xF4, 0xE8, 0xE6, 0x28, 0x4D, 0x8B, 0x52, 0xC2, 0x90, 0xD7, 0xDC, 0x86, 0xD9, 0xEF, + 0x83, 0xA2, 0x81, 0x65, 0xA0, 0x5D, 0xD7, 0x32, 0x45, 0x95, 0x4C, 0xD0, 0x6E, 0x71, 0x97, 0x50, + 0x0D, 0xA1, 0x1A, 0xB6, 0xF8, 0x22, 0xD0, 0xAB, 0xA9, 0x59, 0xEC, 0xE6, 0x97, 0xED, 0xEB, 0x5F, + 0x90, 0x5E, 0x2D, 0x59, 0x51, 0x33, 0x59, 0x91, 0xBD, 0xC1, 0x70, 0x83, 0xE4, 0xD6, 0xA4, 0x5A, + 0xBB, 0x21, 0x48, 0x47, 0xCC, 0xE5, 0xD8, 0x0F, 0xCC, 0xC0, 0x60, 0x4E, 0x18, 0xA0, 0x04, 0x8E, + 0x7A, 0xD0, 0xAE, 0xED, 0xA3, 0xFA, 0x13, 0x12, 0x13, 0x09, 0xA2, 0xC6, 0x28, 0xA0, 0xC3, 0x3C, + 0x60, 0x5F, 0xE2, 0x8E, 0x50, 0x9F, 0xB2, 0xA9, 0x38, 0x75, 0x20, 0xAC, 0x4D, 0xBD, 0xD3, 0xA3, + 0xED, 0xDE, 0xC9, 0xA5, 0x28, 0xC1, 0xA5, 0x8B, 0xBD, 0x6C, 0xB0, 0x9F, 0x87, 0x9C, 0x5B, 0xDB, + 0xA7, 0xA6, 0xC7, 0x6E, 0x4C, 0xFD, 0x2E, 0x35, 0x0D, 0xD2, 0xFF, 0x9D, 0x00, 0x0B, 0x60, 0x9B, + 0x58, 0x7D, 0xBE, 0xAF, 0xE9, 0xA0, 0x93, 0x35, 0x98, 0xDC, 0xC2, 0xD4, 0xBB, 0x52, 0xDB, 0xEA, + 0x9B, 0xDE, 0x08, 0x6F, 0x39, 0x32, 0xF0, 0x89, 0xF9, 0x14, 0x02, 0x6A, 0xED, 0xEC, 0xCE, 0x11, + 0x65, 0xA3, 0xC8, 0x52, 0x05, 0x0F, 0x12, 0x12, 0xD6, 0x29, 0x6E, 0xC3, 0x13, 0x05, 0xAC, 0x54, + 0x8F, 0x13, 0x73, 0x7D, 0x13, 0xAF, 0xDE, 0xC4, 0xAB, 0xD7, 0x23, 0x5E, 0x5D, 0xD8, 0x82, 0x0D, + 0xA3, 0xCF, 0xCF, 0x96, 0x74, 0x82, 0xCA, 0x0A, 0x5B, 0x93, 0xFC, 0x7D, 0xAA, 0xAC, 0x95, 0x60, + 0x60, 0x09, 0xFE, 0x25, 0xE0, 0xB7, 0x62, 0x82, 0x96, 0x12, 0x13, 0x83, 0x21, 0xB9, 0x07, 0xC7, + 0x40, 0x17, 0xCF, 0x96, 0x39, 0xB5, 0x09, 0x9F, 0xC9, 0x32, 0x2F, 0x2E, 0x58, 0xCF, 0x92, 0x13, + 0x8D, 0xEF, 0x7C, 0xA3, 0xA7, 0x8C, 0x1E, 0x2F, 0xDE, 0x44, 0x9F, 0x3B, 0x97, 0x25, 0xDB, 0xE9, + 0x3F, 0x73, 0x9B, 0x13, 0xFA, 0x6A, 0x62, 0xD5, 0xE8, 0xDB, 0xC2, 0x7A, 0x52, 0x22, 0x80, 0xE3, + 0x19, 0xDE, 0x1B, 0x49, 0x57, 0xBF, 0x51, 0x08, 0xB8, 0xDB, 0xA7, 0x48, 0x82, 0x2D, 0xE1, 0x85, + 0x07, 0xFB, 0x8D, 0xBE, 0x72, 0x52, 0x56, 0xD0, 0x1F, 0x1B, 0xEC, 0x9A, 0xFF, 0x11, 0x9A, 0x1E, + 0xF7, 0x19, 0xBA, 0x91, 0x61, 0xC1, 0x5A, 0xEE, 0x66, 0xB0, 0x5B, 0xDA, 0xE6, 0x45, 0x07, 0xAD, + 0x66, 0x73, 0xAB, 0xD9, 0x6C, 0x86, 0xBE, 0x14, 0x47, 0x2C, 0x6E, 0x0F, 0xE0, 0x31, 0xCA, 0x20, + 0x1F, 0xE2, 0xAF, 0xC4, 0x0C, 0x78, 0xF0, 0xC0, 0xB9, 0x2D, 0xDE, 0xF3, 0x1B, 0x6B, 0x6D, 0xDA, + 0x9F, 0x42, 0x2A, 0xA7, 0x1C, 0x9D, 0x18, 0xFD, 0xC2, 0x14, 0xF3, 0x64, 0xCF, 0xF5, 0xA4, 0xFC, + 0x90, 0x9A, 0xD7, 0x0D, 0x40, 0xFE, 0x58, 0x00, 0x5E, 0x60, 0xA7, 0x92, 0xA5, 0xBA, 0xC4, 0xCD, + 0xC1, 0xCD, 0xE4, 0x16, 0xB3, 0xCD, 0xFF, 0xF7, 0x7F, 0xFD, 0x77, 0x0A, 0xD7, 0x07, 0xAA, 0x9E, + 0xEB, 0x4F, 0x32, 0x4F, 0x4F, 0x98, 0xA8, 0xE7, 0x46, 0x36, 0xCE, 0x06, 0xA4, 0xE2, 0x88, 0xEE, + 0xFC, 0xAE, 0x9E, 0xEA, 0xB7, 0xBE, 0x12, 0x65, 0xDE, 0xA7, 0x21, 0xE0, 0x25, 0xF1, 0x83, 0x85, + 0xA1, 0x5D, 0x37, 0xC9, 0x74, 0x04, 0xBE, 0xAD, 0x05, 0x3A, 0x49, 0xB0, 0x94, 0x47, 0x22, 0xD1, + 0xC1, 0x2A, 0xA1, 0x0E, 0x59, 0xD5, 0x09, 0x9F, 0x8D, 0x01, 0x2F, 0xAA, 0x00, 0xCD, 0xC5, 0xA3, + 0xAE, 0x63, 0x69, 0x9E, 0x19, 0x3C, 0x2E, 0x18, 0x93, 0xA2, 0x61, 0x0E, 0x0A, 0x70, 0xA5, 0x94, + 0xAE, 0x95, 0x3F, 0xE9, 0xC9, 0xFD, 0x1B, 0x7F, 0x55, 0x42, 0xFB, 0x9A, 0x6E, 0x08, 0xBA, 0x36, + 0xA9, 0x68, 0x36, 0x6E, 0x81, 0x9A, 0xF8, 0x3E, 0xDD, 0x2E, 0x74, 0xAE, 0x59, 0x56, 0xF1, 0xBE, + 0xE6, 0xCB, 0xF3, 0x8B, 0xBD, 0x35, 0x46, 0xFB, 0x8C, 0x90, 0x44, 0x7C, 0x73, 0x80, 0x92, 0xE0, + 0x83, 0x69, 0x59, 0x28, 0xC3, 0x0F, 0xA1, 0x2B, 0xE9, 0xED, 0xA6, 0x93, 0xB1, 0x62, 0xD3, 0x13, + 0xB0, 0xE2, 0xB0, 0xBE, 0x77, 0x28, 0x29, 0xA1, 0x7F, 0x43, 0xEA, 0x85, 0xBE, 0x84, 0x00, 0xBD, + 0x91, 0x10, 0x80, 0x12, 0x40, 0x5E, 0x8F, 0xAB, 0xDF, 0x27, 0x67, 0xA0, 0x59, 0x9A, 0x38, 0xFF, + 0x45, 0xFA, 0xBF, 0x92, 0x41, 0xF2, 0xD2, 0x19, 0x0C, 0xD0, 0x3F, 0x35, 0x2B, 0xDD, 0xCF, 0x85, + 0x8A, 0x30, 0x67, 0xCA, 0xE6, 0x0B, 0xD5, 0x02, 0xE6, 0x4E, 0x65, 0x52, 0x4B, 0xC8, 0x5F, 0xE2, + 0x92, 0x95, 0x06, 0x18, 0x97, 0x45, 0xFC, 0x28, 0x16, 0xD7, 0x38, 0xCE, 0xC8, 0x7F, 0x27, 0x04, + 0xFB, 0x4E, 0x33, 0x36, 0x21, 0xEA, 0x8F, 0xEC, 0xFA, 0xAA, 0xD7, 0x40, 0xEF, 0x87, 0x7E, 0x68, + 0x49, 0x35, 0x19, 0x9D, 0xB4, 0x98, 0x65, 0xDE, 0x81, 0xEE, 0x10, 0xE2, 0x25, 0x60, 0xE0, 0x99, + 0xA0, 0x24, 0x87, 0x96, 0xD4, 0x85, 0x7B, 0x5C, 0x78, 0x4A, 0xA0, 0xB0, 0x03, 0x78, 0x7D, 0x87, + 0x36, 0x4A, 0x62, 0x30, 0x4E, 0x9F, 0x9E, 0xFF, 0x76, 0x76, 0x5A, 0x3F, 0xFF, 0xD0, 0x65, 0x17, + 0x76, 0xC0, 0x07, 0xF2, 0x6A, 0xF6, 0x4A, 0xB3, 0x43, 0x4D, 0xF4, 0x3F, 0x72, 0x3C, 0x9E, 0xB6, + 0x82, 0xCE, 0xD7, 0x4B, 0x14, 0x3D, 0x56, 0x9F, 0x5B, 0xB3, 0x58, 0x39, 0x47, 0xEA, 0xEF, 0x47, + 0xD7, 0x37, 0xED, 0xEF, 0xC7, 0xBF, 0x5C, 0xD8, 0x31, 0xA5, 0xC1, 0x5F, 0xB0, 0x33, 0x48, 0x11, + 0xDF, 0xEC, 0x99, 0x6B, 0xA6, 0xCD, 0xA0, 0x0E, 0x96, 0xE1, 0x55, 0x9D, 0x9C, 0xE9, 0x92, 0xEC, + 0x45, 0x09, 0x80, 0x88, 0xF9, 0x03, 0x9E, 0x8E, 0x17, 0xCD, 0xEA, 0x8C, 0x37, 0x06, 0x8D, 0x84, + 0x47, 0xB5, 0xB0, 0x9B, 0xF7, 0x3D, 0x07, 0xFD, 0x91, 0xC6, 0x24, 0xF6, 0xF5, 0xEC, 0x5B, 0xFD, + 0xF4, 0xC3, 0x49, 0x02, 0x5B, 0xCF, 0xB5, 0x82, 0xC6, 0x82, 0x25, 0xD9, 0x87, 0xAA, 0xF1, 0x5B, + 0x41, 0x4F, 0xBF, 0x67, 0x75, 0x5B, 0xA9, 0xD8, 0x4B, 0x05, 0xD7, 0x53, 0xCA, 0x49, 0x25, 0xD1, + 0x30, 0x1F, 0xEC, 0x09, 0x48, 0x65, 0x5C, 0x54, 0x1E, 0xCC, 0xBE, 0xB9, 0x52, 0x1E, 0x2A, 0x33, + 0xD7, 0x52, 0xD2, 0x41, 0x65, 0x52, 0xE1, 0x84, 0xAD, 0x9C, 0xA5, 0x29, 0x7C, 0x05, 0xCD, 0xD9, + 0xF1, 0xEE, 0xFC, 0x83, 0xA5, 0x31, 0x00, 0x20, 0x61, 0xA6, 0x7B, 0xDC, 0x80, 0x86, 0x26, 0xEC, + 0x35, 0x9D, 0x4F, 0x30, 0xCF, 0xC0, 0x61, 0x3B, 0x62, 0xF7, 0x6C, 0x39, 0xA5, 0x06, 0x3B, 0x02, + 0x59, 0x33, 0xFA, 0x2B, 0x96, 0x3C, 0xE1, 0x64, 0xC4, 0x8B, 0x36, 0xDB, 0x10, 0xE6, 0x66, 0xEE, + 0x07, 0xD1, 0x3B, 0xE3, 0xC0, 0x8B, 0xF8, 0x65, 0xBC, 0x2A, 0x5B, 0xCB, 0x58, 0x54, 0x65, 0x93, + 0x41, 0x52, 0xC5, 0x43, 0x14, 0x97, 0x1B, 0xFA, 0x7B, 0xB3, 0xD7, 0xC3, 0xA8, 0xA7, 0x84, 0x42, + 0xDE, 0x99, 0x50, 0xD2, 0xF0, 0x15, 0xD6, 0x52, 0x88, 0xBF, 0x28, 0xAB, 0xDA, 0x17, 0x71, 0x62, + 0xCC, 0x99, 0xBC, 0x3C, 0xB3, 0x02, 0xD8, 0xE3, 0x79, 0x03, 0xB9, 0xF9, 0x7D, 0x94, 0xD5, 0xE8, + 0xAB, 0x12, 0x2E, 0x9E, 0xB4, 0x83, 0x5D, 0xE8, 0x07, 0x3E, 0x19, 0x73, 0x76, 0xB1, 0xFB, 0xF3, + 0x4C, 0xD0, 0xAC, 0xE4, 0xFE, 0xC6, 0x4B, 0x2B, 0xBE, 0xAD, 0x51, 0xD3, 0x75, 0xDE, 0xDA, 0x96, + 0x2A, 0x71, 0xB6, 0x57, 0x70, 0xF3, 0xC4, 0xE4, 0x0B, 0x6F, 0x5C, 0x6B, 0xDD, 0xE9, 0xB1, 0x55, + 0x0D, 0x3D, 0xAE, 0xE4, 0x96, 0x96, 0xA7, 0xC7, 0xD6, 0x4B, 0xA0, 0xC7, 0xB6, 0x2A, 0x3D, 0x76, + 0x56, 0x70, 0xF3, 0xDA, 0xE5, 0xE8, 0xB1, 0xBD, 0xEE, 0xF4, 0xD8, 0xAE, 0x86, 0x1E, 0x57, 0x72, + 0x4B, 0xCB, 0xD3, 0x63, 0xFB, 0x25, 0xD0, 0x63, 0x47, 0x95, 0x1E, 0x77, 0x56, 0x70, 0xF3, 0x3A, + 0xE5, 0xE8, 0xB1, 0xB3, 0xEE, 0xF4, 0xD8, 0xA9, 0x86, 0x1E, 0x57, 0x72, 0x4B, 0xCB, 0xD3, 0x63, + 0xE7, 0x39, 0xE9, 0x31, 0xB6, 0x7B, 0x90, 0x99, 0xE1, 0x06, 0x96, 0x3D, 0x79, 0x93, 0xA8, 0x64, + 0xF8, 0x8C, 0x37, 0x5B, 0xF4, 0xF4, 0xED, 0x9E, 0x7B, 0x47, 0xDD, 0xDA, 0x61, 0x64, 0x68, 0xE1, + 0xEC, 0xCA, 0x31, 0x8A, 0x7B, 0x52, 0xA6, 0xA7, 0x56, 0xCB, 0x4C, 0x57, 0x0E, 0x52, 0x81, 0x3F, + 0x65, 0xAB, 0x76, 0x78, 0xD4, 0x2D, 0xE5, 0x7F, 0xD7, 0xAC, 0x1D, 0xA2, 0x4D, 0x62, 0x25, 0x1D, + 0xEF, 0x8E, 0xBA, 0x09, 0xB7, 0x3B, 0x19, 0x71, 0x29, 0xEC, 0x1E, 0x9E, 0xA3, 0x19, 0xBA, 0xE6, + 0x07, 0x91, 0x3B, 0xB2, 0xAE, 0x73, 0xDF, 0x67, 0x14, 0xDD, 0xC7, 0x30, 0xAE, 0x98, 0x1B, 0xEC, + 0xFA, 0xE6, 0xAF, 0x75, 0x01, 0xE6, 0x06, 0x83, 0xBE, 0xC8, 0xF0, 0x92, 0xDF, 0x5B, 0x22, 0xEE, + 0x18, 0x1D, 0xAA, 0x2D, 0xF1, 0x2E, 0xDA, 0x5F, 0x12, 0xAE, 0xDA, 0x64, 0x74, 0xC1, 0x88, 0x7A, + 0x6C, 0x2C, 0xF2, 0x9E, 0xC0, 0x20, 0x17, 0x5D, 0x74, 0x85, 0xF6, 0x60, 0xF0, 0xB5, 0xB0, 0xC1, + 0x94, 0xB3, 0xCD, 0xDE, 0x9C, 0x74, 0xD9, 0x36, 0xFB, 0x7E, 0xDA, 0x7D, 0x49, 0x06, 0x5A, 0x58, + 0x14, 0xAC, 0xA8, 0x94, 0x89, 0x36, 0xD5, 0x34, 0x7F, 0x03, 0xB2, 0x20, 0xCB, 0x58, 0x6A, 0x03, + 0xDD, 0xFD, 0x6E, 0xB8, 0x2B, 0x65, 0xAB, 0x9D, 0xB3, 0xA8, 0x0A, 0xAC, 0xB5, 0x55, 0x5F, 0x43, + 0xDD, 0xE8, 0xEE, 0x89, 0x65, 0x02, 0x57, 0xA9, 0x1D, 0x22, 0xB8, 0xC5, 0xE7, 0x65, 0xDC, 0x2A, + 0x8D, 0x07, 0x9E, 0x49, 0xF1, 0x71, 0x02, 0xB6, 0x20, 0x7A, 0xFF, 0xD8, 0xF9, 0xC1, 0x29, 0xC9, + 0xDC, 0xB2, 0x58, 0x68, 0x9F, 0x89, 0x19, 0x1B, 0x5B, 0xD3, 0x18, 0x5E, 0xCC, 0xEA, 0xDC, 0xD0, + 0x1F, 0x0A, 0x4F, 0x67, 0x4C, 0xA7, 0x08, 0x4C, 0x6E, 0x60, 0xDE, 0x73, 0x9B, 0x10, 0xD9, 0x17, + 0xA5, 0x50, 0x30, 0x29, 0x62, 0xE2, 0x1B, 0xF4, 0x77, 0x6E, 0xAC, 0xC1, 0x7D, 0x54, 0x4A, 0x54, + 0x88, 0xB7, 0xA2, 0x78, 0xBA, 0x90, 0x32, 0x19, 0x19, 0xE2, 0xE1, 0x30, 0x76, 0xA2, 0x56, 0xCA, + 0xCB, 0x08, 0x4B, 0x3A, 0x54, 0xE8, 0x1A, 0x13, 0xBB, 0xBD, 0xC0, 0xBE, 0x92, 0xC7, 0x3A, 0xEC, + 0x76, 0xE8, 0x27, 0xF3, 0x38, 0xB5, 0x3F, 0xEC, 0xEC, 0xBF, 0x25, 0x28, 0x28, 0x2A, 0x4B, 0xA7, + 0x77, 0x5A, 0x39, 0x1F, 0x41, 0xAA, 0xD9, 0xF3, 0xA4, 0x1F, 0xA8, 0x1E, 0xD9, 0xB1, 0x1E, 0x4C, + 0x29, 0x64, 0xC7, 0x86, 0xD8, 0xD7, 0x5C, 0xE8, 0x8D, 0xF9, 0xFD, 0xC1, 0x33, 0xBA, 0x8D, 0xA1, + 0x88, 0x4F, 0x1E, 0xF3, 0x42, 0x02, 0x8C, 0x3C, 0x55, 0x86, 0xB8, 0x8A, 0x87, 0xA1, 0xA9, 0x0F, + 0x85, 0x43, 0x0B, 0xCC, 0x55, 0xA7, 0xB9, 0x8A, 0xAB, 0xFE, 0xE8, 0xE2, 0x0E, 0x19, 0x2E, 0x85, + 0x88, 0x34, 0xDE, 0xA8, 0xAD, 0x34, 0xB5, 0x09, 0x54, 0x53, 0xBF, 0x45, 0xCB, 0x23, 0x3D, 0xEC, + 0x63, 0xA5, 0x32, 0x7F, 0x94, 0xB7, 0x5B, 0xB8, 0x79, 0x52, 0x4A, 0x99, 0xB5, 0x3D, 0xAB, 0x7F, + 0x11, 0xCC, 0x5C, 0xA4, 0x6B, 0x17, 0x82, 0x9D, 0xF8, 0xBC, 0x24, 0xC1, 0x4E, 0x0E, 0xAC, 0x2C, + 0xD8, 0x89, 0xF7, 0x57, 0x45, 0xB0, 0x03, 0xCD, 0xD7, 0x79, 0x60, 0xA6, 0x7D, 0xEB, 0x84, 0x20, + 0xD2, 0x11, 0xE7, 0x11, 0xA2, 0x1E, 0xA5, 0x6E, 0x4C, 0x8B, 0x79, 0x39, 0xE2, 0x9C, 0xF4, 0x66, + 0x8D, 0xD8, 0x15, 0xE6, 0xE4, 0x16, 0xCD, 0x57, 0xD3, 0xC5, 0x60, 0x9E, 0xA4, 0x97, 0x2C, 0x85, + 0xB7, 0x04, 0x49, 0x4F, 0x0C, 0xF7, 0x26, 0xE9, 0xBD, 0xFC, 0xB3, 0x27, 0xB1, 0xD3, 0x45, 0x8E, + 0x9B, 0x71, 0xB3, 0x97, 0x79, 0xDC, 0x88, 0xF5, 0xAD, 0xDD, 0x71, 0xF3, 0xDD, 0x88, 0x8F, 0x1B, + 0x34, 0xD8, 0x2C, 0xEF, 0xB8, 0x19, 0x0F, 0xAC, 0x76, 0xDC, 0x84, 0x86, 0xBB, 0x2A, 0x07, 0xCD, + 0xD8, 0x00, 0x4B, 0x67, 0x89, 0x0F, 0xDD, 0x72, 0x5B, 0xE7, 0xA2, 0x72, 0x02, 0xDA, 0xBD, 0xD6, + 0xED, 0xB8, 0x08, 0x8D, 0x27, 0x64, 0x12, 0x2D, 0x73, 0x60, 0x84, 0xC6, 0xAA, 0x1E, 0x18, 0x48, + 0x04, 0xF9, 0x07, 0x46, 0xAB, 0xD9, 0x6A, 0x35, 0xDF, 0x4E, 0x8C, 0xA2, 0x27, 0x46, 0x7A, 0xAB, + 0x95, 0x4F, 0x8C, 0x54, 0xB3, 0x17, 0x78, 0x62, 0xC4, 0xEC, 0xAF, 0xCA, 0x13, 0xA3, 0xDC, 0x0D, + 0x87, 0x48, 0x4B, 0xF7, 0x82, 0x6E, 0x37, 0x68, 0x41, 0xA5, 0x2E, 0x37, 0x92, 0x2D, 0xF3, 0x41, + 0x9F, 0x04, 0x56, 0xE6, 0x5E, 0x83, 0xF2, 0x87, 0xAD, 0xD4, 0xB5, 0xC6, 0xEC, 0xE5, 0xAC, 0xE0, + 0xAD, 0xC6, 0x99, 0xEF, 0x7E, 0x45, 0x1A, 0x3A, 0xEB, 0x75, 0xEB, 0xF0, 0x61, 0x29, 0xC5, 0x07, + 0xA2, 0x31, 0x97, 0x98, 0x12, 0x8B, 0x32, 0x3F, 0x61, 0xA0, 0x0B, 0xAC, 0xB3, 0xD3, 0x8E, 0xF2, + 0xA6, 0xC4, 0x19, 0xA6, 0xC4, 0x55, 0x2E, 0x90, 0x40, 0x9D, 0x3E, 0x6C, 0xA1, 0x99, 0x2D, 0x7E, + 0x34, 0x82, 0xC3, 0xC8, 0x14, 0x77, 0xBD, 0x84, 0x70, 0xE4, 0x60, 0x4F, 0x05, 0x9F, 0x64, 0x19, + 0x28, 0xDF, 0xA7, 0x40, 0xAF, 0x2F, 0xCE, 0x03, 0xBF, 0xC7, 0xCC, 0x15, 0xC7, 0xB0, 0xE2, 0xC0, + 0x71, 0x82, 0x21, 0xEB, 0x75, 0xBB, 0x38, 0x96, 0xED, 0x04, 0xE3, 0xE1, 0x02, 0xD2, 0x82, 0x7D, + 0x34, 0xE6, 0x61, 0xDE, 0x89, 0xBF, 0xE0, 0xE3, 0x44, 0x93, 0xE3, 0xCB, 0xB3, 0xC4, 0x11, 0xF8, + 0xAD, 0xDF, 0x5F, 0xBB, 0x1C, 0x2D, 0x04, 0xA4, 0xB2, 0xA9, 0x26, 0xF2, 0x11, 0x7E, 0x5E, 0x55, + 0x34, 0xDA, 0x96, 0xAB, 0xA3, 0x93, 0xB8, 0x80, 0x08, 0xCD, 0x01, 0x1E, 0x4C, 0xAF, 0x1D, 0x72, + 0x74, 0x74, 0x70, 0x7C, 0x7C, 0x70, 0x72, 0x72, 0x70, 0x7A, 0x7A, 0x70, 0x76, 0x76, 0x70, 0x7E, + 0x5E, 0xD6, 0x67, 0xA4, 0xF4, 0xAC, 0xBB, 0x9A, 0x89, 0x19, 0xD9, 0x68, 0xF2, 0xFE, 0x41, 0xB1, + 0xDC, 0x07, 0x2A, 0xFD, 0x27, 0x4E, 0x40, 0x97, 0x73, 0x0F, 0xA0, 0xE1, 0xCF, 0x2A, 0xA5, 0x62, + 0xF3, 0x8A, 0x4E, 0xF6, 0x05, 0x08, 0xB2, 0x8B, 0x29, 0x65, 0x45, 0xE5, 0xF3, 0x02, 0x1B, 0xF7, + 0x41, 0x6C, 0xC2, 0xB4, 0xEA, 0x56, 0x2C, 0x57, 0x4E, 0x56, 0x33, 0xE0, 0xC7, 0xEA, 0x94, 0x1B, + 0x0F, 0x83, 0x25, 0x0E, 0x0D, 0x19, 0x0C, 0x0A, 0xFC, 0xCD, 0x0B, 0x39, 0x48, 0xD7, 0xF0, 0xAD, + 0x44, 0x05, 0xB5, 0x52, 0x58, 0x0B, 0xBC, 0x6B, 0x48, 0xA4, 0xC6, 0x7F, 0x70, 0xA4, 0x1E, 0xE6, + 0x6F, 0x31, 0xFE, 0xC3, 0x0C, 0xD0, 0x47, 0x46, 0xCA, 0x2D, 0xC2, 0xB9, 0x85, 0x8C, 0x7C, 0x74, + 0x1D, 0xE1, 0xF3, 0x00, 0x36, 0x53, 0x02, 0x5A, 0x94, 0xF6, 0xD9, 0xC0, 0x55, 0x6D, 0xA0, 0x61, + 0xCF, 0xE7, 0x98, 0xAF, 0xFC, 0xBB, 0x6D, 0x06, 0x32, 0xEE, 0xC8, 0x7F, 0xD0, 0x5C, 0xA4, 0xD8, + 0xE8, 0x36, 0x83, 0xFB, 0xD2, 0x03, 0x06, 0x60, 0x0C, 0xC3, 0x8F, 0x46, 0xA1, 0x4D, 0x79, 0xAB, + 0xEC, 0x01, 0x72, 0x4C, 0x1B, 0xD8, 0x18, 0x30, 0xE4, 0x07, 0xBC, 0x16, 0xB6, 0x1B, 0xAF, 0x36, + 0xA8, 0xBD, 0x68, 0x8A, 0x1E, 0xE5, 0x48, 0xF8, 0x82, 0x42, 0xC3, 0xB9, 0x83, 0xF2, 0x9F, 0xA4, + 0x99, 0x28, 0x26, 0x57, 0x3C, 0xC4, 0x10, 0x33, 0xA5, 0xDD, 0x89, 0x70, 0x5D, 0x35, 0x8B, 0xC5, + 0xD3, 0xC5, 0x8E, 0xD4, 0xAC, 0x95, 0xE6, 0x18, 0xDA, 0xD4, 0x21, 0x37, 0x9E, 0x91, 0x14, 0x81, + 0xB8, 0x28, 0x5B, 0x80, 0xA6, 0xEB, 0x26, 0x86, 0xF8, 0x81, 0x0C, 0x63, 0x70, 0x8B, 0x47, 0xB1, + 0xEA, 0xAE, 0x38, 0x44, 0x64, 0xE5, 0x4A, 0x94, 0x2C, 0x22, 0x18, 0xB0, 0x51, 0x88, 0xD7, 0x9B, + 0xA6, 0xE7, 0x07, 0x22, 0x47, 0x1C, 0xAD, 0x04, 0x3E, 0xF6, 0x31, 0x76, 0x9D, 0x42, 0xFD, 0x04, + 0xAD, 0x02, 0x79, 0x12, 0x05, 0xCF, 0xB7, 0xBA, 0xAF, 0x03, 0x65, 0x3D, 0xED, 0xB8, 0x9C, 0x75, + 0x4E, 0xA4, 0xF0, 0x67, 0x5A, 0x1D, 0xC4, 0x62, 0x67, 0x42, 0x9F, 0xBA, 0x14, 0x82, 0xC0, 0xE4, + 0xD9, 0x70, 0x38, 0x26, 0xA9, 0xE2, 0x47, 0x83, 0x9B, 0x37, 0xED, 0x2B, 0x7F, 0x90, 0x51, 0x7C, + 0x7B, 0x21, 0xF9, 0x32, 0x56, 0xA6, 0xD6, 0xAF, 0x1F, 0x47, 0xF3, 0x5D, 0xDB, 0x79, 0x38, 0x8E, + 0x0C, 0x8C, 0xB5, 0xC3, 0xF8, 0x23, 0xFB, 0x26, 0xCA, 0xB2, 0xF2, 0x25, 0x31, 0xA9, 0xCC, 0x44, + 0x9E, 0x9F, 0xFB, 0x50, 0x85, 0x1D, 0x14, 0x4F, 0xB6, 0xA2, 0x0A, 0xB5, 0x70, 0x4A, 0xA3, 0x28, + 0x29, 0xCE, 0x6A, 0x9F, 0xDB, 0x86, 0x8F, 0x77, 0x80, 0xC2, 0xD1, 0xE0, 0xDE, 0xD4, 0x12, 0x76, + 0xDA, 0xC0, 0xA1, 0x6F, 0x48, 0xDD, 0xF2, 0xB1, 0x92, 0xAD, 0x87, 0x29, 0x2A, 0x81, 0xED, 0xC0, + 0x69, 0x3E, 0xD4, 0xEE, 0x39, 0x8B, 0x14, 0x4E, 0x69, 0xEF, 0x2D, 0x97, 0x27, 0x63, 0x9D, 0x8F, + 0xF9, 0x4A, 0xF3, 0x19, 0x24, 0xEB, 0x07, 0x76, 0x3D, 0xD3, 0xC1, 0xD4, 0x4D, 0x2F, 0xC9, 0xC0, + 0x94, 0x58, 0x5F, 0xB4, 0xBC, 0x52, 0xE6, 0xA6, 0xE9, 0xFD, 0xE4, 0x6F, 0x62, 0x12, 0xAE, 0xB9, + 0x26, 0xA8, 0x44, 0xAD, 0xC2, 0x05, 0x1B, 0xA2, 0x0A, 0x5A, 0xA2, 0x8A, 0xAC, 0xB4, 0xB2, 0xDC, + 0x08, 0xEA, 0x71, 0x2E, 0x09, 0xB8, 0xF5, 0x9C, 0xD0, 0x83, 0x33, 0xE8, 0xD2, 0xEC, 0x73, 0x34, + 0x88, 0xE4, 0x5C, 0x4E, 0xEC, 0xC4, 0x4A, 0xD7, 0x1E, 0x7D, 0xD8, 0x9B, 0xB8, 0x9C, 0x48, 0xEE, + 0x93, 0xE8, 0x8F, 0x45, 0xFD, 0x1D, 0x2C, 0x39, 0x75, 0xD1, 0x51, 0x32, 0xDB, 0x8A, 0x2F, 0xE6, + 0x22, 0xCA, 0x9B, 0x02, 0x1F, 0xEC, 0x33, 0xDB, 0x11, 0xEC, 0x12, 0xA4, 0x2E, 0x4C, 0x12, 0x64, + 0xDE, 0xCB, 0xD4, 0xE3, 0x54, 0x03, 0x6A, 0xA4, 0xD9, 0x8F, 0x32, 0x5B, 0xBA, 0xDF, 0x18, 0x13, + 0x72, 0xE4, 0xC3, 0x25, 0x5C, 0x27, 0xA4, 0xC3, 0x2C, 0xE9, 0x44, 0x98, 0x35, 0x0C, 0x13, 0x36, + 0x88, 0x71, 0x64, 0xE1, 0xF1, 0x03, 0xB6, 0x4B, 0x75, 0xC4, 0x41, 0x57, 0x8D, 0xFA, 0x5A, 0xDD, + 0x9C, 0x43, 0xEA, 0x91, 0x49, 0x1B, 0x12, 0x07, 0xC4, 0xD5, 0xD4, 0xCE, 0x86, 0x7A, 0x64, 0xD2, + 0x86, 0x48, 0x7E, 0xB8, 0x11, 0x75, 0x94, 0xBC, 0x33, 0xD9, 0xC8, 0x50, 0x71, 0x16, 0x1B, 0xCB, + 0xDB, 0x84, 0x5C, 0x36, 0xBB, 0xEB, 0x85, 0xDF, 0x5C, 0x2B, 0xE5, 0x2B, 0x99, 0xA4, 0x9C, 0xF1, + 0x09, 0xB2, 0xAC, 0x1C, 0x26, 0x47, 0x3E, 0x26, 0xC3, 0x23, 0xAC, 0x76, 0x23, 0x9C, 0x07, 0xDD, + 0x86, 0x6B, 0xFA, 0x30, 0x55, 0x0C, 0x36, 0xC2, 0x72, 0x92, 0x9E, 0x31, 0x3A, 0x46, 0x8B, 0x08, + 0x0C, 0xD0, 0xDD, 0xB4, 0x75, 0x8F, 0x63, 0x16, 0x61, 0xB4, 0x31, 0x44, 0xDD, 0x44, 0xEF, 0x92, + 0xA3, 0xA4, 0xA4, 0x15, 0xCA, 0x92, 0x7D, 0x87, 0xEF, 0xD1, 0x63, 0xCB, 0x79, 0x80, 0xA7, 0x0D, + 0x2A, 0xA3, 0x31, 0x40, 0x33, 0x84, 0x87, 0xD6, 0x59, 0x24, 0x4B, 0x72, 0x4F, 0xDA, 0xE8, 0xA1, + 0xB4, 0x92, 0xE2, 0xFD, 0x1B, 0x05, 0x54, 0xA6, 0x95, 0xCC, 0x85, 0x92, 0x3C, 0xEB, 0x25, 0x43, + 0x1D, 0xFD, 0xA8, 0x63, 0xA1, 0x04, 0x81, 0x2D, 0x59, 0xC4, 0x8D, 0xF0, 0x01, 0x4B, 0xA9, 0xCF, + 0x22, 0x88, 0x42, 0x05, 0xE3, 0xA3, 0x31, 0xB0, 0xF3, 0x63, 0x7A, 0xB7, 0x59, 0x3B, 0x6C, 0xCE, + 0xD7, 0x70, 0x9E, 0x3A, 0x4A, 0xAB, 0x76, 0xD8, 0x5A, 0xFC, 0x28, 0xB0, 0x93, 0xED, 0xC5, 0x8F, + 0x02, 0x5A, 0x50, 0x67, 0xF1, 0xA3, 0xEC, 0xD4, 0x0E, 0x77, 0x16, 0x3F, 0xCA, 0x6E, 0xED, 0x70, + 0x77, 0xF1, 0xA3, 0xEC, 0xD5, 0x0E, 0xF7, 0x54, 0x46, 0xF1, 0x8A, 0x4E, 0x61, 0x0A, 0xC9, 0x48, + 0xAD, 0xA6, 0xA4, 0xC1, 0x20, 0x36, 0x14, 0x00, 0xB3, 0xE1, 0xC1, 0x8D, 0x73, 0x32, 0x7D, 0x00, + 0xF4, 0xD2, 0xB9, 0xC6, 0xB7, 0x90, 0xBF, 0x45, 0x0F, 0x67, 0xAF, 0xB4, 0x52, 0x0D, 0xA4, 0xF7, + 0xE8, 0x07, 0x7C, 0xF4, 0x92, 0x74, 0x0E, 0xB1, 0xA2, 0x52, 0x6A, 0x46, 0xAA, 0x69, 0x3E, 0xF0, + 0x53, 0xF0, 0xCA, 0x28, 0x15, 0xBE, 0x68, 0xBE, 0x52, 0xFA, 0xC4, 0x9C, 0x25, 0x3D, 0xA1, 0xFE, + 0x5F, 0xE8, 0x5A, 0x8E, 0x66, 0x7C, 0xE5, 0x0F, 0xE7, 0xB2, 0xEC, 0xCE, 0xA9, 0x79, 0x5F, 0xB0, + 0x30, 0xCD, 0x6C, 0x13, 0xCF, 0xC4, 0x00, 0xB5, 0x43, 0x09, 0xFD, 0xE8, 0x81, 0x4A, 0xC5, 0x74, + 0x3C, 0xC7, 0xE9, 0x6A, 0x31, 0xB8, 0x8B, 0x9A, 0xFD, 0x8D, 0x7B, 0x78, 0xF5, 0xFB, 0xDD, 0x1D, + 0x78, 0x9A, 0xC1, 0xA7, 0x5F, 0xAE, 0xDD, 0x37, 0x1B, 0xCD, 0xA7, 0x9C, 0xDB, 0x73, 0xC4, 0x63, + 0xCD, 0x02, 0xE9, 0x09, 0xC0, 0x8E, 0x5E, 0x71, 0xDE, 0x3C, 0x79, 0x64, 0x96, 0x85, 0xF3, 0x04, + 0x41, 0x97, 0x84, 0x93, 0xCA, 0x7D, 0xD8, 0x7C, 0xC5, 0x28, 0xE6, 0x62, 0x7A, 0xA6, 0x7F, 0xE4, + 0x59, 0x34, 0x26, 0x69, 0x40, 0xF0, 0x45, 0xBC, 0x21, 0x63, 0xCC, 0x5D, 0xB2, 0xF6, 0x26, 0xA6, + 0x13, 0xD7, 0xCF, 0x05, 0x5E, 0xEA, 0x73, 0x4E, 0x7A, 0x1B, 0xCC, 0x2E, 0xAE, 0x0B, 0x05, 0xF2, + 0xDF, 0x38, 0x35, 0x5E, 0xAC, 0xBD, 0x89, 0x9B, 0xB2, 0x95, 0xD5, 0xB5, 0x12, 0x4A, 0x49, 0xB4, + 0x90, 0x68, 0xC3, 0xD1, 0x2E, 0x2C, 0x94, 0x8E, 0xB9, 0xE6, 0xD8, 0x4A, 0x2F, 0x92, 0xAE, 0x4F, + 0xC6, 0x24, 0x79, 0x44, 0xC1, 0x04, 0xC7, 0x1C, 0x74, 0xE3, 0x31, 0x16, 0x2C, 0xEF, 0x76, 0x28, + 0x39, 0x95, 0x67, 0xB2, 0xB7, 0xD2, 0xDA, 0x63, 0x1C, 0xC3, 0x53, 0x45, 0x33, 0x6D, 0x5F, 0x2A, + 0xFB, 0xA8, 0xA4, 0xB0, 0x3E, 0xD7, 0x82, 0x10, 0x0D, 0x09, 0x40, 0x1D, 0xA0, 0xC4, 0x3C, 0x32, + 0xE9, 0x59, 0xE2, 0x07, 0xB8, 0x84, 0x06, 0xFB, 0x0A, 0x7F, 0x82, 0x80, 0xE0, 0x8C, 0x60, 0x0A, + 0x86, 0x34, 0x2C, 0xF4, 0x4D, 0x6E, 0x81, 0x2E, 0xE3, 0x78, 0x77, 0x2F, 0xE8, 0xE2, 0x74, 0xA6, + 0xE0, 0x56, 0x84, 0x5B, 0x8A, 0x72, 0x63, 0xE6, 0xFD, 0x67, 0x1E, 0xA4, 0x18, 0x5F, 0x86, 0x95, + 0xDB, 0x8E, 0xCD, 0x9F, 0xC2, 0x59, 0xB3, 0xDD, 0x57, 0xCB, 0x57, 0x07, 0xA9, 0xDE, 0x91, 0xAB, + 0x7E, 0x77, 0x0D, 0xAA, 0xAC, 0xE7, 0xB0, 0xFB, 0x4E, 0xA3, 0xB5, 0xD3, 0x68, 0xED, 0xAA, 0x72, + 0x54, 0x01, 0x97, 0xC3, 0x8F, 0xAE, 0xE7, 0x0C, 0xE8, 0x5E, 0x3F, 0xC9, 0x2F, 0x44, 0xB7, 0x5D, + 0xF9, 0xD5, 0xB1, 0xE6, 0xC5, 0xA4, 0xD4, 0x02, 0xAD, 0x71, 0xA4, 0xFD, 0x80, 0x0F, 0xCD, 0xA6, + 0x1A, 0xD2, 0x4B, 0x08, 0x3F, 0x98, 0x46, 0x30, 0x3C, 0xE8, 0x34, 0x9B, 0xE4, 0xC9, 0x01, 0x3C, + 0x48, 0x76, 0xAE, 0x7C, 0xC5, 0x95, 0x3F, 0xB7, 0x19, 0x37, 0x5D, 0x9D, 0xF7, 0xFF, 0xA4, 0x70, + 0xD9, 0x25, 0xE1, 0xB0, 0x90, 0x2C, 0x32, 0xAA, 0x07, 0x76, 0x9A, 0x93, 0x66, 0x35, 0x87, 0x02, + 0x99, 0x79, 0xB0, 0xE4, 0x78, 0x4D, 0xE6, 0x88, 0xB9, 0x05, 0x62, 0xA6, 0x3F, 0x49, 0xD2, 0x0C, + 0x6F, 0x47, 0x66, 0x10, 0x61, 0xCE, 0x39, 0x3D, 0x77, 0x6C, 0x51, 0x4F, 0x2C, 0x09, 0x5A, 0x14, + 0xA0, 0x7E, 0xD6, 0xCC, 0x00, 0xAF, 0x27, 0xB7, 0x67, 0x0F, 0x2C, 0x5E, 0x66, 0xC7, 0x17, 0x5F, + 0x9F, 0x60, 0xF5, 0xAB, 0xD4, 0xBC, 0x14, 0x11, 0x03, 0xF0, 0xD1, 0xD0, 0x36, 0x83, 0x0D, 0x7F, + 0xCC, 0x64, 0x6F, 0x1F, 0x99, 0x90, 0x0E, 0xC9, 0xD1, 0x04, 0x24, 0x6B, 0x1B, 0xC9, 0x10, 0xE1, + 0x23, 0x72, 0x64, 0xD3, 0x85, 0x7A, 0x14, 0x94, 0xC6, 0xDC, 0x21, 0xB0, 0x01, 0xF4, 0x0D, 0xEC, + 0x9E, 0x3C, 0x97, 0xDD, 0x67, 0xB6, 0x66, 0x9A, 0xA5, 0x08, 0x5C, 0x59, 0x99, 0x3B, 0xDF, 0x59, + 0xC8, 0x3D, 0x95, 0xC3, 0xC6, 0x02, 0x3D, 0x8C, 0x15, 0xF4, 0x02, 0x00, 0xF9, 0x53, 0xCA, 0x4C, + 0xC6, 0x9D, 0xC4, 0xC2, 0xFA, 0x05, 0xEC, 0x1D, 0x96, 0x23, 0xA5, 0xA7, 0x85, 0x53, 0x23, 0x8D, + 0xFB, 0x4B, 0xCF, 0xB1, 0xA2, 0x0A, 0xB7, 0xD7, 0xCE, 0x7D, 0xC9, 0xCA, 0xB4, 0xAD, 0xDA, 0xE1, + 0xB1, 0xE6, 0xF3, 0x92, 0x55, 0x6D, 0x0F, 0xBF, 0xDE, 0x74, 0x57, 0x2F, 0x99, 0x52, 0x37, 0x94, + 0x5E, 0xAE, 0x62, 0xE7, 0x4C, 0x1B, 0x0E, 0x22, 0xCF, 0x21, 0xE7, 0x58, 0x2A, 0xF4, 0x86, 0xD2, + 0xFE, 0x8D, 0xC8, 0xB6, 0x14, 0xBB, 0x77, 0x75, 0xC9, 0xBD, 0xEB, 0x9B, 0x8D, 0x5F, 0x92, 0x21, + 0xA3, 0xB1, 0x76, 0x9E, 0xAF, 0x96, 0x33, 0xB8, 0x71, 0x7A, 0xA7, 0xA0, 0xB8, 0x1B, 0xCF, 0x5D, + 0x7F, 0x30, 0x2E, 0xDC, 0x81, 0x95, 0x34, 0x00, 0xFA, 0xBD, 0x53, 0x86, 0xD3, 0x5A, 0x56, 0xC9, + 0xC1, 0xE7, 0xAA, 0x1B, 0x72, 0xD1, 0x07, 0x2E, 0x3E, 0x32, 0x75, 0x0F, 0xB6, 0x81, 0x4C, 0x10, + 0x8C, 0xF4, 0xB2, 0x80, 0xF8, 0xF7, 0x16, 0xB9, 0x24, 0x8C, 0x80, 0xF5, 0x69, 0x68, 0xE8, 0x8F, + 0x6E, 0xD5, 0x60, 0xD7, 0x06, 0x29, 0x07, 0x04, 0x59, 0x40, 0x70, 0xFD, 0x2B, 0x00, 0x26, 0xB7, + 0x62, 0x9E, 0x43, 0xF6, 0x72, 0x6A, 0xAF, 0x81, 0x88, 0x08, 0xF3, 0xB9, 0x99, 0x77, 0xCD, 0x2B, + 0x62, 0xD0, 0xDE, 0x4F, 0x5C, 0xF3, 0x5E, 0x69, 0x3F, 0xA2, 0xB2, 0x39, 0x4A, 0x32, 0x26, 0x55, + 0xFD, 0xDB, 0x1C, 0x99, 0xB6, 0x42, 0x99, 0xBF, 0x05, 0xE8, 0x75, 0x09, 0xC4, 0xFC, 0x66, 0xEB, + 0x42, 0x02, 0x01, 0x08, 0x20, 0xC6, 0x89, 0x9A, 0x93, 0x68, 0x47, 0xD0, 0x87, 0x26, 0xBF, 0x47, + 0xE4, 0xB4, 0xC4, 0xC2, 0x64, 0xCE, 0x24, 0xBC, 0xCA, 0x6A, 0xB0, 0x1B, 0xB4, 0x2B, 0x88, 0x0A, + 0xD5, 0x51, 0x69, 0x1B, 0x0B, 0xAF, 0x78, 0xF1, 0x3D, 0xCB, 0x81, 0x1F, 0x20, 0x40, 0x8E, 0x84, + 0x7B, 0x8E, 0x8D, 0xF3, 0xDA, 0x42, 0x55, 0x30, 0x30, 0x75, 0xE6, 0x87, 0xDE, 0x3D, 0x7F, 0xF4, + 0xC9, 0x0F, 0x07, 0x3A, 0xF3, 0x50, 0x95, 0x8C, 0xEA, 0xD0, 0x61, 0xE2, 0x10, 0x18, 0x3D, 0x19, + 0x69, 0xB7, 0x03, 0xB0, 0x07, 0x30, 0x85, 0x01, 0xF7, 0xE3, 0x4B, 0xE4, 0x16, 0x36, 0x6E, 0xEF, + 0xEF, 0x8F, 0xBF, 0x51, 0xD4, 0x1F, 0x17, 0xAA, 0x43, 0xAA, 0xEA, 0x91, 0x4A, 0x72, 0x66, 0xAE, + 0xB0, 0x3C, 0xA3, 0x52, 0x1E, 0x29, 0x68, 0xFE, 0x08, 0xD8, 0x88, 0x2C, 0x27, 0x3F, 0x46, 0x67, + 0x65, 0x7D, 0x65, 0xDC, 0xA6, 0x82, 0x20, 0xBB, 0x65, 0x52, 0xAD, 0xAC, 0x09, 0xF8, 0x04, 0xBA, + 0x55, 0xDA, 0x5C, 0x54, 0x42, 0xD8, 0xA5, 0xAC, 0x98, 0x48, 0xA4, 0xBB, 0x70, 0xAA, 0x04, 0x02, + 0x4B, 0x93, 0x46, 0x9A, 0x30, 0x35, 0x32, 0xFE, 0x21, 0xD1, 0x46, 0x47, 0x06, 0xDE, 0x34, 0x63, + 0x96, 0x8A, 0x3C, 0xFA, 0xA4, 0xEF, 0x90, 0x3E, 0x45, 0xDC, 0x90, 0x45, 0x07, 0x8C, 0x8C, 0x54, + 0xD6, 0x04, 0xD1, 0x0A, 0xE2, 0x7C, 0x45, 0xF4, 0xB7, 0x60, 0x02, 0x54, 0xAE, 0x56, 0x99, 0x22, + 0xC1, 0xA7, 0x97, 0xA8, 0x2C, 0x54, 0x7B, 0x12, 0xB0, 0x40, 0xE8, 0xD7, 0x72, 0x28, 0x45, 0x32, + 0x4C, 0xD0, 0xB0, 0x62, 0x8D, 0xCA, 0x09, 0x4D, 0x2A, 0x33, 0x70, 0x82, 0x15, 0xA4, 0xEC, 0x4D, + 0x24, 0x2A, 0x92, 0xEA, 0x8B, 0x1A, 0xD3, 0x81, 0x40, 0x21, 0x65, 0x84, 0xC3, 0x7F, 0x89, 0x65, + 0x7E, 0xD5, 0x46, 0x33, 0x2E, 0x44, 0x7A, 0xE7, 0x67, 0xBF, 0xC3, 0x68, 0x8D, 0xF0, 0xF6, 0x47, + 0x31, 0xBC, 0x53, 0xE5, 0xE7, 0xAB, 0x50, 0x72, 0xF6, 0xA9, 0x41, 0x4B, 0xB3, 0x8D, 0x8A, 0x70, + 0xCE, 0x7B, 0x68, 0xF5, 0x03, 0x30, 0x56, 0x64, 0x4E, 0x9C, 0x30, 0x2B, 0x26, 0x86, 0x40, 0x9B, + 0x62, 0x0F, 0xFF, 0xA4, 0x5B, 0x1A, 0x78, 0xA0, 0xEE, 0x89, 0xBE, 0x58, 0xB9, 0xEA, 0xC4, 0x72, + 0x30, 0x76, 0x88, 0xEC, 0x34, 0xA1, 0xE7, 0x61, 0xA4, 0x04, 0x32, 0x6A, 0xF2, 0x4F, 0xC6, 0xF9, + 0xFA, 0x92, 0x7B, 0x3B, 0x36, 0x5F, 0x43, 0xF6, 0xB9, 0x18, 0x2C, 0x8E, 0xF5, 0xCD, 0x56, 0x86, + 0x01, 0x54, 0x79, 0xB5, 0x73, 0x74, 0xDD, 0xCD, 0xD6, 0xC7, 0x84, 0x47, 0x85, 0x8A, 0x5E, 0x56, + 0xA4, 0x8B, 0x26, 0x66, 0xF2, 0xFC, 0x3E, 0xF5, 0xC9, 0x0C, 0x27, 0x88, 0xB4, 0x47, 0x98, 0xC9, + 0xC4, 0xD6, 0xD8, 0x35, 0xEF, 0x73, 0x0F, 0x73, 0x9A, 0xB0, 0xAE, 0xE3, 0x9B, 0x64, 0xE3, 0x21, + 0x03, 0x24, 0xC5, 0x19, 0xB7, 0x9A, 0xCD, 0xDD, 0x6D, 0xF8, 0xB1, 0x17, 0x0B, 0x20, 0x9A, 0x61, + 0x50, 0x32, 0x3F, 0xE9, 0xC1, 0x36, 0x58, 0xA7, 0xAB, 0x1D, 0xB5, 0xE3, 0x32, 0xBB, 0x77, 0x4F, + 0xA9, 0x5D, 0xFF, 0x64, 0x5E, 0x9E, 0x3D, 0x52, 0xC7, 0xD3, 0xC2, 0xFA, 0xA0, 0x1E, 0x20, 0x5D, + 0x29, 0xB1, 0x18, 0xBA, 0x51, 0xE6, 0x48, 0x72, 0x3C, 0x16, 0x0D, 0xC8, 0x36, 0x7D, 0x45, 0xA5, + 0x76, 0x41, 0x0C, 0x38, 0x8D, 0xD4, 0x48, 0xDB, 0x91, 0x02, 0x0B, 0xF2, 0xB0, 0x2A, 0x8E, 0xA7, + 0x6D, 0x30, 0x68, 0x0B, 0x34, 0xE5, 0xFA, 0x64, 0x7E, 0xCB, 0xAC, 0x53, 0x74, 0x01, 0x1E, 0xBE, + 0x70, 0x3E, 0x5E, 0x84, 0x97, 0x17, 0x12, 0x5F, 0x9E, 0x22, 0x11, 0xE7, 0xA0, 0x66, 0xA1, 0x2A, + 0xEE, 0x93, 0xED, 0x97, 0x57, 0xC4, 0x7D, 0x11, 0x77, 0x6D, 0x74, 0x01, 0x1B, 0x65, 0x57, 0xA0, + 0x28, 0xB8, 0xFC, 0xAA, 0x0D, 0xC0, 0x45, 0x58, 0x81, 0xD2, 0x0D, 0x93, 0x5D, 0xD6, 0x0E, 0xC7, + 0x49, 0x1C, 0xBA, 0x9E, 0x13, 0x38, 0x40, 0xED, 0x85, 0x6F, 0x29, 0x72, 0xBA, 0x9D, 0xB2, 0x82, + 0x8A, 0xEE, 0x2D, 0x7A, 0xDD, 0x6E, 0xE9, 0x5B, 0x8B, 0xCB, 0xB3, 0xB2, 0x97, 0x16, 0x98, 0x17, + 0xE3, 0x9F, 0x59, 0xD9, 0x0E, 0x60, 0x8F, 0xBE, 0xF5, 0xFB, 0xAB, 0x77, 0xEB, 0x71, 0x12, 0x87, + 0xAD, 0x63, 0xAE, 0x0F, 0xE4, 0x84, 0x27, 0xD8, 0xB3, 0xA9, 0x27, 0x33, 0x82, 0x70, 0x0F, 0xEF, + 0xB0, 0x30, 0xC7, 0x12, 0x62, 0x09, 0xA9, 0x5B, 0x9B, 0x00, 0x8E, 0x77, 0xC9, 0xB4, 0x21, 0x97, + 0xCE, 0x43, 0xFD, 0xCC, 0xE6, 0xDE, 0xE0, 0x91, 0x6D, 0x02, 0x90, 0xDE, 0x51, 0x3E, 0x92, 0x20, + 0xF4, 0xEC, 0xC4, 0x3B, 0x4E, 0xBF, 0x9F, 0x30, 0x20, 0xC4, 0x00, 0x5D, 0xDF, 0xDA, 0x9C, 0x55, + 0x67, 0xB6, 0x39, 0xD7, 0xF4, 0xC0, 0xF1, 0xC6, 0x0E, 0xB8, 0x71, 0x9C, 0xBA, 0x78, 0x9E, 0xF0, + 0x91, 0x5D, 0x7C, 0xC6, 0x9B, 0xEC, 0x5C, 0x54, 0xE4, 0xD0, 0x6A, 0x71, 0x33, 0xBB, 0x6A, 0x71, + 0xF2, 0x72, 0x0F, 0x6F, 0xE3, 0xF0, 0x7C, 0x0D, 0x7D, 0xEE, 0x61, 0x0A, 0x07, 0x4A, 0x49, 0x47, + 0xEA, 0x93, 0x27, 0x9C, 0x89, 0x93, 0xC9, 0x73, 0x64, 0xC0, 0x92, 0x47, 0x6E, 0x71, 0xC0, 0xE0, + 0xEE, 0xE2, 0x16, 0x0D, 0x38, 0xE4, 0x1F, 0xA5, 0xA1, 0xCB, 0xC6, 0xCB, 0x26, 0xBC, 0x5C, 0x1F, + 0x69, 0x26, 0xB9, 0x30, 0x91, 0xA1, 0x2C, 0x37, 0x92, 0x7D, 0x3C, 0xC6, 0x02, 0xA3, 0xD6, 0x57, + 0x2A, 0xF9, 0x5F, 0x91, 0x08, 0xE8, 0xE9, 0xCA, 0x7F, 0x3F, 0x8B, 0x4F, 0x55, 0x38, 0x97, 0x67, + 0x90, 0x34, 0x15, 0x89, 0x1E, 0x7B, 0x96, 0x4F, 0x52, 0xCF, 0x5C, 0x5F, 0x7A, 0x37, 0x6F, 0xCA, + 0x4F, 0xF0, 0x4A, 0xF8, 0x69, 0x3E, 0x63, 0x10, 0x51, 0x2C, 0xC4, 0x0C, 0x0C, 0x7E, 0x1B, 0x0E, + 0x7E, 0x23, 0xF7, 0xAD, 0x53, 0xFC, 0xC8, 0xF0, 0xF3, 0x6C, 0x7F, 0xDF, 0x0A, 0x14, 0xE6, 0x22, + 0x3E, 0x90, 0x08, 0xDA, 0x53, 0x61, 0x21, 0x83, 0x39, 0x8A, 0x0F, 0xE2, 0x06, 0x9C, 0x9D, 0x38, + 0x21, 0xD2, 0xDE, 0x32, 0x58, 0x54, 0x6A, 0x1A, 0xCB, 0xE7, 0x4F, 0x47, 0x8C, 0x64, 0x58, 0x26, + 0x24, 0xDD, 0x7C, 0x3D, 0x57, 0x9A, 0x11, 0x81, 0x1F, 0x19, 0x51, 0x6E, 0x18, 0xF2, 0x8D, 0x14, + 0x4D, 0x1C, 0x8C, 0xAD, 0x04, 0xD4, 0x47, 0x37, 0x82, 0x3A, 0x7C, 0x10, 0xBC, 0x45, 0x7F, 0x04, + 0x22, 0x07, 0xF6, 0xF4, 0xDD, 0x97, 0xEE, 0x90, 0x84, 0x0F, 0x28, 0xDE, 0x16, 0x8F, 0x38, 0x5F, + 0xDF, 0x72, 0xF7, 0x67, 0x00, 0x27, 0xCF, 0x26, 0x84, 0x7A, 0xBE, 0xF0, 0x0C, 0xC2, 0x35, 0x39, + 0x91, 0x28, 0xAA, 0xA2, 0xE2, 0x90, 0x8D, 0xB3, 0x4C, 0xF7, 0x85, 0x82, 0x36, 0x32, 0x8D, 0x7F, + 0x9A, 0xE1, 0xB4, 0xA8, 0xE0, 0x16, 0x9A, 0x01, 0x79, 0x26, 0xC2, 0x23, 0x86, 0xC3, 0x2A, 0x25, + 0x2F, 0xCC, 0x00, 0x60, 0xD5, 0xF3, 0x17, 0xCA, 0xD9, 0x9E, 0x7E, 0x39, 0xE9, 0x82, 0x70, 0x17, + 0x81, 0x3B, 0x44, 0x73, 0x30, 0x3E, 0x5B, 0x30, 0xD3, 0x4C, 0x8E, 0xAE, 0x76, 0xCC, 0x1A, 0x43, + 0xDD, 0x8D, 0xA6, 0x89, 0x87, 0xEB, 0x92, 0x39, 0x6C, 0xD2, 0xF2, 0x18, 0x43, 0x8B, 0xF8, 0x2C, + 0x26, 0x20, 0xC4, 0x75, 0x34, 0x22, 0x46, 0x28, 0x53, 0xF1, 0x32, 0xF4, 0x46, 0xFF, 0x21, 0xCA, + 0xCE, 0x1D, 0x89, 0x34, 0x5D, 0x5B, 0xEC, 0xF4, 0x6B, 0x6F, 0x8B, 0x7D, 0x06, 0x15, 0xE7, 0x01, + 0x38, 0x31, 0xCA, 0x89, 0xBD, 0xF0, 0x16, 0x7B, 0xBA, 0xD2, 0xFC, 0xBB, 0xC2, 0x3E, 0x34, 0xAB, + 0xA3, 0x8D, 0xCC, 0xF7, 0x6A, 0x24, 0x50, 0x5C, 0x74, 0xD3, 0x69, 0x9B, 0x23, 0x40, 0x2E, 0x3A, + 0x7D, 0x73, 0x84, 0x6E, 0x17, 0xDD, 0x54, 0x2D, 0xD0, 0xDD, 0x09, 0x93, 0xE2, 0x79, 0x66, 0xC3, + 0x0E, 0x9E, 0xCF, 0xCE, 0x8D, 0x28, 0x45, 0xEE, 0x57, 0xF2, 0x74, 0xCD, 0x43, 0x3B, 0x32, 0xF0, + 0x65, 0x91, 0xEC, 0x25, 0xA7, 0x7C, 0xDE, 0xAD, 0x38, 0xD9, 0x73, 0x02, 0x31, 0x94, 0xAF, 0xBF, + 0xC7, 0x6D, 0xD6, 0xBC, 0x04, 0x54, 0xCC, 0x84, 0xBF, 0xF6, 0xE6, 0x90, 0x05, 0xBC, 0xB1, 0x0E, + 0x94, 0x80, 0x0B, 0x79, 0x43, 0xFE, 0xC2, 0xC8, 0xAF, 0x06, 0xB6, 0x0C, 0xF6, 0x43, 0xA3, 0x17, + 0x82, 0xFE, 0xF2, 0x34, 0x9E, 0x43, 0x02, 0xF2, 0xAD, 0x75, 0x20, 0x83, 0x68, 0x41, 0x6F, 0xA4, + 0x50, 0x98, 0x14, 0xD4, 0x41, 0x97, 0x21, 0x07, 0xD9, 0xF0, 0x85, 0x90, 0x84, 0x10, 0x4A, 0xE7, + 0x50, 0x44, 0x42, 0x72, 0x5D, 0x07, 0xAA, 0xF0, 0xC5, 0x74, 0x47, 0x30, 0xDD, 0x37, 0xCA, 0x28, + 0x4E, 0x19, 0x12, 0x25, 0x0A, 0x13, 0x86, 0x68, 0xF7, 0xAC, 0x05, 0x31, 0xCA, 0xA8, 0x2C, 0x4F, + 0x49, 0xCE, 0x16, 0x2D, 0xFD, 0x6B, 0xE0, 0xA6, 0xCA, 0xC5, 0xE4, 0x93, 0x51, 0x8C, 0xAE, 0x18, + 0xD2, 0x33, 0xBF, 0x4A, 0x4C, 0xF1, 0x0A, 0x31, 0x13, 0x03, 0xC4, 0x7A, 0x26, 0xD2, 0x4D, 0xAB, + 0xDD, 0x79, 0x09, 0xD9, 0xCD, 0x54, 0xD1, 0x5F, 0xD5, 0x2F, 0x20, 0x8D, 0xFC, 0xD1, 0x4E, 0x2A, + 0x65, 0x07, 0xC8, 0x34, 0x2A, 0x8B, 0xFA, 0x25, 0xF0, 0xBA, 0x9C, 0x75, 0x13, 0xD1, 0xE2, 0xB9, + 0x0D, 0x9B, 0x76, 0xE0, 0x2E, 0xC8, 0xA6, 0x09, 0xAB, 0x2B, 0x65, 0xCE, 0x1C, 0xB7, 0x7B, 0xA2, + 0x25, 0x73, 0x0C, 0xDE, 0x8C, 0x11, 0x13, 0xD7, 0xBC, 0x4A, 0xF6, 0xCB, 0xF1, 0x8A, 0x57, 0x22, + 0xC5, 0xA5, 0x8D, 0xE4, 0x63, 0x59, 0x67, 0x3F, 0x5C, 0x80, 0xAD, 0x3D, 0x8F, 0x8B, 0xE2, 0xAB, + 0x2C, 0x7A, 0x77, 0xD9, 0x39, 0x2B, 0x45, 0x18, 0x83, 0xB8, 0x56, 0x91, 0xDE, 0xB4, 0x23, 0xED, + 0x87, 0x39, 0x0A, 0x47, 0xB1, 0x3F, 0x16, 0xBB, 0xE5, 0xC1, 0x03, 0xE7, 0x36, 0x88, 0x21, 0x74, + 0x4F, 0x67, 0xDE, 0xF3, 0x38, 0x94, 0xAE, 0xC1, 0xCE, 0x1A, 0x83, 0x86, 0xB8, 0xA3, 0x91, 0x8C, + 0x99, 0x8C, 0xA5, 0x78, 0x27, 0xB3, 0x87, 0x77, 0xC4, 0xFE, 0xF8, 0x1E, 0x19, 0xBB, 0xC2, 0xB8, + 0x86, 0xFF, 0xB5, 0xC7, 0x3E, 0xB1, 0xBD, 0x1D, 0xFF, 0x8D, 0x77, 0x4F, 0xE3, 0xDD, 0x59, 0xFC, + 0x51, 0xE2, 0xDD, 0x99, 0x46, 0x8B, 0xE3, 0xDD, 0x0B, 0x23, 0x19, 0x8F, 0xEB, 0x26, 0x66, 0x55, + 0x9A, 0x47, 0x2F, 0xD1, 0x7B, 0x2B, 0x40, 0x2B, 0x6E, 0x34, 0x97, 0xA8, 0x26, 0xB7, 0x8C, 0x7B, + 0xD6, 0x2D, 0x47, 0xBF, 0x9B, 0x45, 0x1C, 0x75, 0x4A, 0xD1, 0x1A, 0x64, 0x7B, 0x21, 0xFA, 0xC0, + 0xEF, 0x3E, 0xB1, 0xFF, 0x68, 0x85, 0x6F, 0x24, 0x32, 0x93, 0x44, 0x62, 0x7C, 0x51, 0xA6, 0x8F, + 0xA8, 0xC5, 0xFA, 0x11, 0xC7, 0xB5, 0xE3, 0x04, 0xA7, 0xDC, 0x9A, 0x6B, 0xEB, 0xC1, 0xF7, 0x18, + 0xBD, 0xB8, 0x02, 0xD4, 0x11, 0x38, 0xE4, 0xEA, 0x83, 0x35, 0xA2, 0xEB, 0x81, 0x67, 0xBA, 0x58, + 0xBF, 0x42, 0x7B, 0x8C, 0x2E, 0xF5, 0xBD, 0xD8, 0x29, 0x98, 0xA8, 0x05, 0x53, 0xC5, 0x87, 0x7E, + 0xE2, 0x22, 0xA9, 0xF9, 0x86, 0xFD, 0x33, 0xB0, 0x7F, 0x8C, 0x10, 0xAA, 0xD8, 0x1F, 0xB7, 0x58, + 0x53, 0xEC, 0x07, 0x79, 0x55, 0x64, 0xDD, 0x53, 0x22, 0x81, 0xF8, 0xED, 0x15, 0x92, 0xA8, 0x38, + 0x02, 0x19, 0xF0, 0xDE, 0x02, 0x61, 0xFA, 0x9E, 0xAB, 0xD2, 0x41, 0xAB, 0xD9, 0x7C, 0x23, 0x85, + 0xB9, 0xA4, 0x30, 0xC6, 0x8E, 0x42, 0xF4, 0x10, 0x37, 0x5B, 0x43, 0xA2, 0x88, 0xF0, 0xE6, 0xC2, + 0x98, 0x47, 0x11, 0x31, 0x86, 0x5D, 0x9C, 0x3E, 0x0B, 0x39, 0xE8, 0x98, 0xEE, 0x85, 0x5C, 0x3F, + 0xCD, 0xBE, 0x29, 0x89, 0x22, 0x83, 0xF6, 0x09, 0x84, 0xFF, 0xDC, 0xED, 0x8D, 0x43, 0xA1, 0x31, + 0xE9, 0xFB, 0x50, 0xF3, 0x34, 0x1D, 0x34, 0x88, 0xD7, 0x2B, 0x0F, 0xCD, 0xB1, 0x74, 0x66, 0xB0, + 0x41, 0x99, 0x02, 0xC6, 0x6D, 0x56, 0xDE, 0xD4, 0x43, 0xC9, 0x01, 0xAE, 0x34, 0x1B, 0xB4, 0x4E, + 0xAF, 0x5A, 0x63, 0x8F, 0x63, 0xEB, 0x71, 0x32, 0x3D, 0x1C, 0x05, 0x73, 0x9D, 0xA3, 0x97, 0x8E, + 0x70, 0xFD, 0xB0, 0xB8, 0x1C, 0xB4, 0x56, 0x2E, 0x1B, 0xF1, 0x0C, 0x7B, 0x4F, 0xD6, 0x34, 0x34, + 0xC5, 0x0C, 0x74, 0x9E, 0x9C, 0x43, 0xAE, 0x21, 0x28, 0x77, 0x8C, 0x29, 0xC6, 0xA1, 0x54, 0x6F, + 0xEA, 0xA6, 0xA0, 0x14, 0xF8, 0xA5, 0x15, 0x28, 0x01, 0x9C, 0x95, 0xB2, 0x06, 0x25, 0x97, 0x58, + 0x99, 0x3D, 0x48, 0x35, 0x73, 0x5F, 0xEF, 0x94, 0xF5, 0xCC, 0x3F, 0x79, 0x5C, 0x8F, 0xD4, 0x37, + 0xF0, 0xCF, 0xE9, 0x01, 0xF1, 0x4D, 0x76, 0x75, 0x8C, 0x14, 0xC6, 0xB6, 0xD9, 0xB9, 0xC7, 0x93, + 0xED, 0xF0, 0xCF, 0x9E, 0x0B, 0x6C, 0x77, 0x36, 0xAF, 0x9D, 0xD7, 0x71, 0xF1, 0xEB, 0x05, 0x4A, + 0x29, 0x9A, 0xDD, 0xE1, 0x1B, 0x7C, 0x38, 0xEB, 0x70, 0x0A, 0x3C, 0x09, 0xA3, 0x0D, 0x8B, 0xF7, + 0x83, 0x79, 0x35, 0x3A, 0x82, 0xE1, 0x21, 0x26, 0x0A, 0xF8, 0xB8, 0x0D, 0x1F, 0xE6, 0xBE, 0x89, + 0x10, 0x54, 0x79, 0xD3, 0x38, 0x4C, 0x31, 0xCD, 0xB1, 0x03, 0x5F, 0xB4, 0x96, 0x1E, 0x45, 0x05, + 0x1D, 0x59, 0x56, 0x6D, 0xAA, 0xF3, 0x5F, 0xC1, 0x32, 0x6E, 0x09, 0x00, 0x11, 0x39, 0x63, 0xB8, + 0x3C, 0x4C, 0x75, 0x96, 0x6F, 0xDF, 0x76, 0xE0, 0x55, 0x07, 0x46, 0x83, 0x32, 0x2A, 0x9C, 0xFD, + 0xA0, 0x88, 0x88, 0xDF, 0x23, 0x17, 0xB5, 0xDF, 0x9B, 0x8D, 0xE0, 0x47, 0x30, 0x7B, 0x1E, 0x51, + 0xFB, 0x5D, 0xC2, 0x13, 0x95, 0x37, 0xA7, 0x00, 0x57, 0xC4, 0xAF, 0x21, 0x24, 0x2E, 0x4E, 0x05, + 0xA8, 0xA7, 0x4F, 0x49, 0x0D, 0xBC, 0x53, 0xF6, 0x86, 0x25, 0x19, 0x8E, 0x4A, 0x0D, 0xB9, 0x67, + 0xDB, 0x87, 0x76, 0xBB, 0xD5, 0xEC, 0xB4, 0x7E, 0x6F, 0xB6, 0x9B, 0xAD, 0xE6, 0x9E, 0xC8, 0x75, + 0xA1, 0x02, 0x60, 0x68, 0xC6, 0xFE, 0xBA, 0xC8, 0xCD, 0x98, 0x98, 0xD7, 0xAB, 0xDB, 0x8F, 0x76, + 0xF3, 0x83, 0xFA, 0x7E, 0xEC, 0x34, 0xF7, 0x97, 0xB5, 0x1F, 0x72, 0x5E, 0x6B, 0xB1, 0x1F, 0xF0, + 0x0D, 0x1E, 0x06, 0x87, 0x33, 0x4E, 0x0F, 0xA5, 0x8D, 0x14, 0x67, 0xA9, 0xC2, 0x56, 0xCE, 0xBE, + 0x96, 0xAB, 0x8D, 0x25, 0xB8, 0x04, 0x00, 0x4E, 0xB1, 0x54, 0x2A, 0xB1, 0x63, 0xF1, 0x49, 0x2D, + 0x6D, 0x89, 0xE2, 0x5E, 0x57, 0xF9, 0x56, 0x99, 0xB5, 0x81, 0x18, 0x85, 0x09, 0x5E, 0x69, 0x75, + 0xF2, 0x73, 0x15, 0xEB, 0x53, 0xD8, 0xF2, 0xE9, 0x0E, 0x09, 0x33, 0x34, 0xD6, 0xC2, 0x69, 0x8C, + 0xA7, 0xA6, 0x30, 0xC6, 0xCF, 0xAD, 0xF1, 0x79, 0xDE, 0x4A, 0xE6, 0x2C, 0x16, 0xE9, 0x7C, 0x51, + 0xF8, 0x9B, 0x93, 0xAB, 0x58, 0x64, 0xC7, 0xFD, 0xA9, 0xB0, 0x22, 0x97, 0x9F, 0x21, 0xDB, 0xCD, + 0xC9, 0x89, 0xDD, 0x4C, 0xA4, 0xC4, 0x9E, 0x9B, 0xEE, 0x7A, 0x76, 0xC6, 0x69, 0x29, 0x0E, 0x8A, + 0xC5, 0x61, 0xDE, 0xDA, 0xD0, 0x9F, 0x96, 0xB0, 0xBF, 0x64, 0x84, 0x90, 0x6D, 0x64, 0xF4, 0xA9, + 0xF4, 0xDB, 0x43, 0x6F, 0xBA, 0xFC, 0x9D, 0x6F, 0xAF, 0xC8, 0x4B, 0xB6, 0x9E, 0xD1, 0x7D, 0x31, + 0x88, 0xD9, 0x07, 0x85, 0x00, 0x3E, 0xB7, 0xC8, 0x5C, 0xD1, 0x6A, 0x47, 0x8F, 0x9A, 0xB3, 0xF2, + 0x7A, 0xCC, 0xC8, 0x8A, 0xA4, 0xDD, 0xF3, 0xE3, 0x60, 0xB2, 0x22, 0x90, 0x48, 0x1F, 0x91, 0x26, + 0x25, 0x7C, 0x57, 0xDC, 0x17, 0x53, 0x76, 0x23, 0xF8, 0x6B, 0x46, 0x91, 0xB4, 0xD4, 0xF5, 0xF7, + 0x84, 0x71, 0x01, 0xBB, 0x42, 0x43, 0x42, 0x2B, 0x36, 0x24, 0xCC, 0xA9, 0xBC, 0xE3, 0x26, 0x67, + 0x5B, 0xAA, 0x10, 0x5C, 0xAA, 0x87, 0x28, 0x76, 0xB2, 0x48, 0x44, 0xE5, 0xB4, 0x00, 0x33, 0x85, + 0x6D, 0x13, 0x5B, 0x55, 0x78, 0x73, 0xB0, 0x80, 0x7C, 0xDE, 0xE6, 0x38, 0x61, 0x80, 0xD3, 0xCD, + 0xDD, 0x24, 0x6C, 0x33, 0xDE, 0xA4, 0x33, 0x2C, 0x41, 0x0F, 0x4A, 0xEF, 0xD4, 0x8D, 0xA2, 0x28, + 0xC6, 0xC9, 0xFD, 0xF1, 0xF8, 0xC8, 0xB9, 0x97, 0x76, 0x9F, 0x78, 0x94, 0x12, 0x1B, 0x26, 0x57, + 0x90, 0xB7, 0x61, 0x0A, 0xE1, 0xAB, 0xEE, 0xE1, 0x3F, 0xDB, 0xB7, 0xBE, 0xFB, 0x17, 0xD5, 0xED, + 0xC8, 0x3C, 0xCA, 0xFE, 0xE9, 0xEB, 0x9E, 0xE9, 0x06, 0xCC, 0xF7, 0x74, 0xC0, 0x03, 0x4F, 0xDF, + 0xC6, 0x70, 0xEB, 0xC6, 0xDF, 0x69, 0x06, 0xE2, 0x2B, 0xF1, 0x6E, 0xA2, 0xD9, 0xC7, 0xE4, 0x73, + 0x12, 0x21, 0x1C, 0x9B, 0x0A, 0xE2, 0x39, 0x98, 0xA9, 0xD0, 0x67, 0x9F, 0x98, 0xE1, 0xE8, 0x21, + 0xDA, 0xF7, 0x1A, 0x7F, 0x84, 0xDC, 0x7B, 0x14, 0x8A, 0x92, 0xE3, 0x81, 0xAA, 0xB4, 0xB9, 0xD1, + 0x08, 0x82, 0x8D, 0x77, 0x71, 0xCB, 0xA8, 0x4D, 0x03, 0xC4, 0x8F, 0x33, 0x4D, 0x1F, 0x6E, 0x06, + 0xEC, 0xD3, 0x21, 0xFB, 0xB7, 0xD4, 0xFC, 0x31, 0xEF, 0xD6, 0xAD, 0xE3, 0x04, 0x7E, 0xE0, 0x69, + 0x6E, 0xE3, 0x46, 0xB4, 0xD8, 0x0C, 0xC6, 0x9D, 0xFC, 0xFB, 0x3B, 0x39, 0xC3, 0x68, 0x5E, 0xB0, + 0x09, 0xA0, 0x81, 0x03, 0xEF, 0xF9, 0xB8, 0x3D, 0x0C, 0x46, 0xD6, 0xE1, 0xFF, 0x07, 0xE8, 0x95, + 0xD1, 0x46, 0x1C, 0xF7, 0x00 }; ///index_html //Content of bootstrap.bundle.min.jss with gzip compression From 044224c0c8dae8b2b73d98d0e740e6c06dbe2d67 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 20 May 2024 17:16:52 +0100 Subject: [PATCH 047/358] Migrate to ETH, WebServer, NetworkClient and NetworkUDP --- Firmware/RTK_Everywhere/Display.ino | 2 +- Firmware/RTK_Everywhere/Ethernet.ino | 117 +++++++++++---------- Firmware/RTK_Everywhere/NTP.ino | 13 +-- Firmware/RTK_Everywhere/RTKNetworkClient.h | 10 +- Firmware/RTK_Everywhere/RTKNetworkUDP.h | 10 +- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 27 ++--- Firmware/RTK_Everywhere/States.ino | 4 +- Firmware/RTK_Everywhere/menuFirmware.ino | 4 +- Firmware/RTK_Everywhere/menuSystem.ino | 6 +- 9 files changed, 103 insertions(+), 90 deletions(-) diff --git a/Firmware/RTK_Everywhere/Display.ino b/Firmware/RTK_Everywhere/Display.ino index a4c37ca69..dabe6252b 100644 --- a/Firmware/RTK_Everywhere/Display.ino +++ b/Firmware/RTK_Everywhere/Display.ino @@ -1801,7 +1801,7 @@ void paintIPAddress() char ipAddress[32]; snprintf(ipAddress, sizeof(ipAddress), " %d.%d.%d.%d ", #ifdef COMPILE_ETHERNET - Ethernet.localIP()[0], Ethernet.localIP()[1], Ethernet.localIP()[2], Ethernet.localIP()[3]); + ETH.localIP()[0], ETH.localIP()[1], ETH.localIP()[2], ETH.localIP()[3]); #else // COMPILE_ETHERNET 0, 0, 0, 0); #endif // COMPILE_ETHERNET diff --git a/Firmware/RTK_Everywhere/Ethernet.ino b/Firmware/RTK_Everywhere/Ethernet.ino index b6de454a2..2bf39ccd2 100644 --- a/Firmware/RTK_Everywhere/Ethernet.ino +++ b/Firmware/RTK_Everywhere/Ethernet.ino @@ -144,16 +144,18 @@ void ethernetBegin() switch (online.ethernetStatus) { case (ETH_NOT_STARTED): - Ethernet.init(pin_Ethernet_CS); + // TODO: Ethernet.init(pin_Ethernet_CS); // First we start Ethernet without DHCP to detect if a cable is connected // DHCP causes system freeze for ~62 seconds so we avoid it until a cable is connected - Ethernet.begin(ethernetMACAddress, settings.ethernetIP, settings.ethernetDNS, settings.ethernetGateway, - settings.ethernetSubnet); + // TODO: Ethernet.begin(ethernetMACAddress, settings.ethernetIP, settings.ethernetDNS, settings.ethernetGateway, + // settings.ethernetSubnet); - if (Ethernet.hardwareStatus() == EthernetNoHardware) // Check that a W5n00 has been detected + // if (Ethernet.hardwareStatus() == EthernetNoHardware) // Check that a W5n00 has been detected + if (!(ETH.begin(ETH_PHY_W5500, 0, pin_Ethernet_CS, pin_Ethernet_Interrupt, -1, SPI))) { - log_d("Ethernet hardware not found"); + if (settings.debugNetworkLayer) + systemPrintln("Ethernet begin failed"); online.ethernetStatus = ETH_CAN_NOT_BEGIN; return; } @@ -168,9 +170,10 @@ void ethernetBegin() { lastEthernetCheck = millis(); - if (Ethernet.linkStatus() == LinkON) + if (eth_connected) { - log_d("Ethernet cable detected"); + if (settings.debugNetworkLayer) + systemPrintln("Ethernet connected"); if (settings.ethernetDHCP) { @@ -179,7 +182,8 @@ void ethernetBegin() } else { - systemPrintln("Ethernet started with static IP"); + if (settings.debugNetworkLayer) + systemPrintln("Ethernet started with static IP"); online.ethernetStatus = ETH_CONNECTED; } } @@ -195,18 +199,20 @@ void ethernetBegin() { lastEthernetCheck = millis(); - if (Ethernet.begin(ethernetMACAddress, 20000)) // Restart Ethernet with DHCP. Use 20s timeout + // TODO: if (Ethernet.begin(ethernetMACAddress, 20000)) // Restart Ethernet with DHCP. Use 20s timeout { - log_d("Ethernet started with DHCP"); + if (settings.debugNetworkLayer) + systemPrintln("Ethernet started with DHCP"); online.ethernetStatus = ETH_CONNECTED; } } break; case (ETH_CONNECTED): - if (Ethernet.linkStatus() == LinkOFF) + if (!eth_connected) { - log_d("Ethernet cable disconnected!"); + if (settings.debugNetworkLayer) + systemPrintln("Ethernet disconnected!"); online.ethernetStatus = ETH_STARTED_CHECK_CABLE; } break; @@ -232,7 +238,7 @@ void ethernetDisplayState() // Return the IP address for the Ethernet controller IPAddress ethernetGetIpAddress() { - return Ethernet.localIP(); + return ETH.localIP(); } // Determine if Ethernet is needed. Saves RAM... @@ -295,47 +301,6 @@ void ethernetUpdate() return; ethernetBegin(); // This updates the link status - - // Maintain the ethernet connection - if ((online.ethernetStatus >= ETH_STARTED_CHECK_CABLE) && (online.ethernetStatus <= ETH_CONNECTED)) - switch (Ethernet.maintain()) - { - case 1: - // renewed fail - if (settings.enablePrintEthernetDiag && (!inMainMenu)) - systemPrintln("Ethernet: Error: renewed fail"); - ethernetRestart(); // Restart Ethernet - break; - - case 2: - // renewed success - if (settings.enablePrintEthernetDiag && (!inMainMenu)) - { - systemPrint("Ethernet: Renewed success. IP address: "); - systemPrintln(Ethernet.localIP()); - } - break; - - case 3: - // rebind fail - if (settings.enablePrintEthernetDiag && (!inMainMenu)) - systemPrintln("Ethernet: Error: rebind fail"); - ethernetRestart(); // Restart Ethernet - break; - - case 4: - // rebind success - if (settings.enablePrintEthernetDiag && (!inMainMenu)) - { - systemPrint("Ethernet: Rebind success. IP address: "); - systemPrintln(Ethernet.localIP()); - } - break; - - default: - // nothing happened - break; - } } // Verify the Ethernet tables @@ -346,6 +311,48 @@ void ethernetVerifyTables() reportFatalError("Please fix ethernetStates table to match ethernetStatus_e"); } +void onEthernetEvent(arduino_event_id_t event, arduino_event_info_t info) +{ + switch (event) + { + case ARDUINO_EVENT_ETH_START: + if (settings.enablePrintEthernetDiag && (!inMainMenu)) + systemPrintln("ETH Started"); + // set eth hostname here + ETH.setHostname("esp32-eth0"); + break; + case ARDUINO_EVENT_ETH_CONNECTED: + if (settings.enablePrintEthernetDiag && (!inMainMenu)) + systemPrintln("ETH Connected"); + break; + case ARDUINO_EVENT_ETH_GOT_IP: + if (settings.enablePrintEthernetDiag && (!inMainMenu)) + { + systemPrintf("ETH Got IP: '%s'\n", esp_netif_get_desc(info.got_ip.esp_netif)); + //systemPrintln(ETH); + } + eth_connected = true; + break; + case ARDUINO_EVENT_ETH_LOST_IP: + if (settings.enablePrintEthernetDiag && (!inMainMenu)) + systemPrintln("ETH Lost IP"); + eth_connected = false; + break; + case ARDUINO_EVENT_ETH_DISCONNECTED: + if (settings.enablePrintEthernetDiag && (!inMainMenu)) + systemPrintln("ETH Disconnected"); + eth_connected = false; + break; + case ARDUINO_EVENT_ETH_STOP: + if (settings.enablePrintEthernetDiag && (!inMainMenu)) + systemPrintln("ETH Stopped"); + eth_connected = false; + break; + default: + break; + } +} + //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Web server routines //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -356,6 +363,8 @@ void ethernetWebServerStartESP32W5500() // Configure the W5500 // TODO + Network.onEvent(onEthernetEvent); + // start the ethernet connection and the server: // Use DHCP dynamic IP // bool begin(int POCI_GPIO, int PICO_GPIO, int SCLK_GPIO, int CS_GPIO, int INT_GPIO, int SPI_CLOCK_MHZ, diff --git a/Firmware/RTK_Everywhere/NTP.ino b/Firmware/RTK_Everywhere/NTP.ino index 1bc3bb6b5..739b27dfd 100644 --- a/Firmware/RTK_Everywhere/NTP.ino +++ b/Firmware/RTK_Everywhere/NTP.ino @@ -76,7 +76,7 @@ const RtkMode_t ntpServerMode = RTK_MODE_NTP; // Locals //---------------------------------------- -static derivedEthernetUDP *ntpServer; // This will be instantiated when we know the NTP port +static NetworkUDP *ntpServer; // This will be instantiated when we know the NTP port static uint8_t ntpServerState; static volatile uint8_t ntpSockIndex; // The W5500 socket index for NTP - so we can enable and read the correct interrupt @@ -844,17 +844,18 @@ void ntpServerUpdate() // Attempt to start the NTP server else { - ntpServer = new derivedEthernetUDP; + ntpServer = new NetworkUDP; if (!ntpServer) // Insufficient memory to start the NTP server ntpServerStop(); else { // Start the NTP server - ntpServer->begin(settings.ethernetNtpPort); - ntpSockIndex = ntpServer->getSockIndex(); // Get the socket index - w5500ClearSocketInterrupts(); // Clear all interrupts - w5500EnableSocketInterrupt(ntpSockIndex); // Enable the RECV interrupt for the desired socket index + // TODO + //ntpServer->begin(settings.ethernetNtpPort); + //ntpSockIndex = ntpServer->getSockIndex(); // Get the socket index + //w5500ClearSocketInterrupts(); // Clear all interrupts + //w5500EnableSocketInterrupt(ntpSockIndex); // Enable the RECV interrupt for the desired socket index online.ethernetNTPServer = true; if (!inMainMenu) reportHeapNow(settings.debugNtp); diff --git a/Firmware/RTK_Everywhere/RTKNetworkClient.h b/Firmware/RTK_Everywhere/RTKNetworkClient.h index c126a551b..d5ce8db1d 100644 --- a/Firmware/RTK_Everywhere/RTKNetworkClient.h +++ b/Firmware/RTK_Everywhere/RTKNetworkClient.h @@ -27,7 +27,7 @@ class RTKNetworkClient : public Client _networkType = networkGetType(user); #if defined(COMPILE_ETHERNET) if (_networkType == NETWORK_TYPE_ETHERNET) - _client = new EthernetClient; + _client = new NetworkClient; else #endif // COMPILE_ETHERNET #if defined(COMPILE_WIFI) @@ -161,7 +161,7 @@ class RTKNetworkClient : public Client { #if defined(COMPILE_ETHERNET) if (_networkType == NETWORK_TYPE_ETHERNET) - return ((EthernetClient *)_client)->remoteIP(); + return ((NetworkClient *)_client)->remoteIP(); #endif // COMPILE_ETHERNET #if defined(COMPILE_WIFI) if (_networkType == NETWORK_TYPE_WIFI) @@ -178,7 +178,7 @@ class RTKNetworkClient : public Client { #if defined(COMPILE_ETHERNET) if (_networkType == NETWORK_TYPE_ETHERNET) - return ((EthernetClient *)_client)->remotePort(); + return ((NetworkClient *)_client)->remotePort(); #endif // COMPILE_ETHERNET #if defined(COMPILE_WIFI) if (_networkType == NETWORK_TYPE_WIFI) @@ -243,14 +243,14 @@ class RTKNetworkClient : public Client class NetworkEthernetClient : public RTKNetworkClient { private: - EthernetClient _ethernetClient; + NetworkClient _ethernetClient; public: NetworkEthernetClient() : RTKNetworkClient(&_ethernetClient, NETWORK_TYPE_ETHERNET) { } - NetworkEthernetClient(EthernetClient &client) + NetworkEthernetClient(NetworkClient &client) : _ethernetClient{client}, RTKNetworkClient(&_ethernetClient, NETWORK_TYPE_ETHERNET) { } diff --git a/Firmware/RTK_Everywhere/RTKNetworkUDP.h b/Firmware/RTK_Everywhere/RTKNetworkUDP.h index ebf540456..bcb04c773 100644 --- a/Firmware/RTK_Everywhere/RTKNetworkUDP.h +++ b/Firmware/RTK_Everywhere/RTKNetworkUDP.h @@ -29,7 +29,7 @@ class RTKNetworkUDP : public UDP _networkType = networkGetType(user); #if defined(COMPILE_ETHERNET) if (_networkType == NETWORK_TYPE_ETHERNET) - _udp = new EthernetUDP; + _udp = new NetworkUDP; else #endif // COMPILE_ETHERNET #if defined(COMPILE_WIFI) @@ -223,7 +223,7 @@ class RTKNetworkUDP : public UDP { #if defined(COMPILE_ETHERNET) if (_networkType == NETWORK_TYPE_ETHERNET) - return ((EthernetUDP *)_udp)->remoteIP(); + return ((NetworkUDP *)_udp)->remoteIP(); #endif // COMPILE_ETHERNET #if defined(COMPILE_WIFI) if (_networkType == NETWORK_TYPE_WIFI) @@ -240,7 +240,7 @@ class RTKNetworkUDP : public UDP { #if defined(COMPILE_ETHERNET) if (_networkType == NETWORK_TYPE_ETHERNET) - return ((EthernetUDP *)_udp)->remotePort(); + return ((NetworkUDP *)_udp)->remotePort(); #endif // COMPILE_ETHERNET #if defined(COMPILE_WIFI) if (_networkType == NETWORK_TYPE_WIFI) @@ -264,11 +264,11 @@ class NetworkEthernetUdp : public RTKNetworkUDP { private: - EthernetUDP _udp; + NetworkUDP _udp; public: - NetworkEthernetUdp(EthernetUDP& udp) : + NetworkEthernetUdp(NetworkUDP& udp) : _udp{udp}, RTKNetworkUDP(&_udp, NETWORK_TYPE_ETHERNET) { diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index 4cedae49b..7e527fbed 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -76,9 +76,11 @@ //#include #include +#include +#include + #ifdef COMPILE_ETHERNET #include -#include // http://librarymanager/All#Arduino_Ethernet by Arduino v2.0.2 #endif // COMPILE_ETHERNET #ifdef COMPILE_WIFI @@ -559,11 +561,10 @@ unsigned long lastRockerSwitchChange; // If quick toggle is detected (less than #ifdef COMPILE_WIFI #ifdef COMPILE_AP -#include "ESPAsyncWebServer.h" //Get from: https://github.com/me-no-dev/ESPAsyncWebServer v1.2.3 +#include "WebServer.h" #include "form.h" -AsyncWebServer *webserver; -AsyncWebSocket *websocket; +WebServer *webserver; #endif // COMPILE_AP #endif // COMPILE_WIFI @@ -615,18 +616,20 @@ IPAddress ethernetDNS; IPAddress ethernetGateway; IPAddress ethernetSubnetMask; -class derivedEthernetUDP : public EthernetUDP -{ - public: - uint8_t getSockIndex() - { - return sockindex; // sockindex is protected in EthernetUDP. A derived class can access it. - } -}; +// TODO +// class derivedEthernetUDP : public EthernetUDP +// { +// public: +// uint8_t getSockIndex() +// { +// return sockindex; // sockindex is protected in EthernetUDP. A derived class can access it. +// } +// }; volatile struct timeval ethernetNtpTv; // This will hold the time the Ethernet NTP packet arrived bool ntpLogIncreasing; #endif // COMPILE_ETHERNET +static bool eth_connected = false; unsigned long lastEthernetCheck; // Prevents cable checking from continually happening //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/Firmware/RTK_Everywhere/States.ino b/Firmware/RTK_Everywhere/States.ino index 5ac70b873..208aff414 100644 --- a/Firmware/RTK_Everywhere/States.ino +++ b/Firmware/RTK_Everywhere/States.ino @@ -474,7 +474,7 @@ void stateUpdate() createDynamicDataString(settingsCSV); // log_d("Sending coordinates: %s", settingsCSV); - websocket->textAll(settingsCSV); + sendStringToWebsocket((char *)settingsCSV); } } #endif // COMPILE_AP @@ -947,7 +947,7 @@ void stateUpdate() createDynamicDataString(settingsCSV); // log_d("Sending coordinates: %s", settingsCSV); - websocket->textAll(settingsCSV); + sendStringToWebsocket((char *)settingsCSV); } } #endif // COMPILE_AP diff --git a/Firmware/RTK_Everywhere/menuFirmware.ino b/Firmware/RTK_Everywhere/menuFirmware.ino index f199dbaf5..441ba0a31 100644 --- a/Firmware/RTK_Everywhere/menuFirmware.ino +++ b/Firmware/RTK_Everywhere/menuFirmware.ino @@ -555,7 +555,7 @@ void overTheAirUpdate() { #ifdef COMPILE_AP // Tell AP page to display reset info - websocket->textAll("confirmReset,1,"); + sendStringToWebsocket((char *)"confirmReset,1,"); #endif // COMPILE_AP } ESP.restart(); @@ -623,7 +623,7 @@ void otaDisplayPercentage(int bytesWritten, int totalLength, bool alwaysDisplay) #ifdef COMPILE_AP char myProgress[50]; snprintf(myProgress, sizeof(myProgress), "otaFirmwareStatus,%d,", percent); - websocket->textAll(myProgress); + sendStringToWebsocket((char *)myProgress); #endif // COMPILE_AP } diff --git a/Firmware/RTK_Everywhere/menuSystem.ino b/Firmware/RTK_Everywhere/menuSystem.ino index cbdbb4662..bc73c47e8 100644 --- a/Firmware/RTK_Everywhere/menuSystem.ino +++ b/Firmware/RTK_Everywhere/menuSystem.ino @@ -98,8 +98,8 @@ void menuSystem() #ifdef COMPILE_ETHERNET if (present.ethernet_ws5500 == true) { - systemPrint("Ethernet cable: "); - if (Ethernet.linkStatus() == LinkON) + systemPrint("Ethernet: "); + if (eth_connected) systemPrintln("connected"); else systemPrintln("disconnected"); @@ -107,7 +107,7 @@ void menuSystem() systemPrintf("%02X:%02X:%02X:%02X:%02X:%02X\r\n", ethernetMACAddress[0], ethernetMACAddress[1], ethernetMACAddress[2], ethernetMACAddress[3], ethernetMACAddress[4], ethernetMACAddress[5]); systemPrint("Ethernet IP Address: "); - systemPrintln(Ethernet.localIP()); + systemPrintln(ETH.localIP()); if (!settings.ethernetDHCP) { systemPrint("Ethernet DNS: "); From 188d882ea57af07df06d59ecb8bf7a81beb3de74 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 20 May 2024 17:17:30 +0100 Subject: [PATCH 048/358] Starting to add WebServer methods - WIP --- Firmware/RTK_Everywhere/Form.ino | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/Firmware/RTK_Everywhere/Form.ino b/Firmware/RTK_Everywhere/Form.ino index 9e9995eaa..8488d2e92 100644 --- a/Firmware/RTK_Everywhere/Form.ino +++ b/Firmware/RTK_Everywhere/Form.ino @@ -100,19 +100,15 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) } createSettingsString(settingsCSV); - webserver = new AsyncWebServer(httpPort); + webserver = new WebServer(httpPort); + // TODO: webserver = new WebServer(WiFi.localIP(), httpPort); + // TODO: webserver = new WebServer(ETH.localIP(), httpPort); + if (!webserver) { systemPrintln("ERROR: Failed to allocate webserver"); break; } - websocket = new AsyncWebSocket("/ws"); - if (!websocket) - { - systemPrintln("ERROR: Failed to allocate websocket"); - break; - } - if (settings.enableCaptivePortal == true) webserver->addHandler(new CaptiveRequestHandler()).setFilter(ON_AP_FILTER); // only when requested from AP @@ -141,7 +137,7 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) // * /listMessagesBase responds with a CSV of RTCM Base messages supported by this platform // * /file allows the download or deletion of a file - webserver->onNotFound(notFound); + webserver->onNotFound(notFound(webserver)); webserver->onFileUpload( handleUpload); // Run handleUpload function when any file is uploaded. Must be before server.on() calls. @@ -341,7 +337,7 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) }); // Handler for file manager - webserver->on("/file", HTTP_GET, [](AsyncWebServerRequest *request) { handleFileManager(request); }); + webserver->on("/file", HTTP_GET, [](WebServer *request) { handleFileManager(request); }); webserver->begin(); @@ -365,12 +361,6 @@ void stopWebServer() webserver = nullptr; } - if (websocket != nullptr) - { - delete websocket; - websocket = nullptr; - } - if (settingsCSV != nullptr) { free(settingsCSV); @@ -388,7 +378,7 @@ void stopWebServer() reportHeapNow(false); } -void notFound(AsyncWebServerRequest *request) +void notFound(WebServer *request) { String logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url(); systemPrintln(logmessage); @@ -396,7 +386,7 @@ void notFound(AsyncWebServerRequest *request) } // Handler for firmware file downloads -static void handleFileManager(AsyncWebServerRequest *request) +static void handleFileManager(WebServer *request) { // This section does not tolerate semaphore transactions String logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url(); @@ -961,7 +951,7 @@ void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, void sendStringToWebsocket(char *stringToSend) { - websocket->textAll(stringToSend); + webserver->sendContent(stringToSend); } #endif // COMPILE_AP From 85bac7378a63d9ce47d6280fe5458bf22b6c4af9 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Mon, 20 May 2024 12:46:27 -0600 Subject: [PATCH 049/358] Fix um980 developer function type --- Firmware/RTK_Everywhere/Developer.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/Developer.ino b/Firmware/RTK_Everywhere/Developer.ino index a5758f70b..4c995647c 100644 --- a/Firmware/RTK_Everywhere/Developer.ino +++ b/Firmware/RTK_Everywhere/Developer.ino @@ -218,7 +218,7 @@ bool um980IsValidTime() {return false;} void um980PrintInfo() {} int um980PushRawData(uint8_t *dataToSend, int dataLength) {return 0;} bool um980SaveConfiguration() {} -void um980SetBaudRateCOM3(uint32_t baudRate) {} +bool um980SetBaudRateCOM3(uint32_t baudRate) {} bool um980SetConstellations() {return false;} void um980SetMinCNO(uint8_t cnoValue) {} void um980SetMinElevation(uint8_t elevationDegrees) {} From 37e0235ba93d48b0529019c62b91e3d1c88663a8 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Tue, 21 May 2024 14:26:37 +0100 Subject: [PATCH 050/358] webserver updates - compiling! --- Firmware/RTK_Everywhere/Developer.ino | 2 +- Firmware/RTK_Everywhere/Form.ino | 436 +++++++++------------ Firmware/RTK_Everywhere/RTK_Everywhere.ino | 8 +- Firmware/RTK_Everywhere/States.ino | 4 +- Firmware/RTK_Everywhere/menuCommands.ino | 8 +- Firmware/RTK_Everywhere/menuFirmware.ino | 4 +- 6 files changed, 210 insertions(+), 252 deletions(-) diff --git a/Firmware/RTK_Everywhere/Developer.ino b/Firmware/RTK_Everywhere/Developer.ino index a5758f70b..2b705a72e 100644 --- a/Firmware/RTK_Everywhere/Developer.ino +++ b/Firmware/RTK_Everywhere/Developer.ino @@ -127,7 +127,7 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) } void stopWebServer() {} bool parseIncomingSettings() {return false;} -void sendStringToWebsocket(char* stringToSend) {} +void sendStringToWebsocket(const char* stringToSend) {} #endif // COMPILE_AP #ifndef COMPILE_WIFI diff --git a/Firmware/RTK_Everywhere/Form.ino b/Firmware/RTK_Everywhere/Form.ino index 8488d2e92..cf3f55fac 100644 --- a/Firmware/RTK_Everywhere/Form.ino +++ b/Firmware/RTK_Everywhere/Form.ino @@ -11,6 +11,7 @@ Form.ino bool websocketConnected = false; +/* class CaptiveRequestHandler : public AsyncWebHandler { public: @@ -53,6 +54,25 @@ class CaptiveRequestHandler : public AsyncWebHandler request->send(response); } }; +*/ + + +void responsePortal() +{ + String logmessage = "Captive Portal Client:" + webserver->client().remoteIP().toString() + " " + webserver->uri(); + systemPrintln(logmessage); + String response = "RTK Config"; + response += "
"; + response += "
SparkFun RTK WiFi Setup
"; + response += "

Configure your RTK receiver here

"; + response += "
"; + webserver->send(200, "text/html", response); +} + // Start webserver in AP mode bool startWebServer(bool startWiFi = true, int httpPort = 80) @@ -100,6 +120,13 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) } createSettingsString(settingsCSV); + // https://github.com/espressif/arduino-esp32/blob/master/libraries/DNSServer/examples/CaptivePortal/CaptivePortal.ino + if (settings.enableCaptivePortal == true) + { + dnsserver = new DNSServer; + dnsserver->start(); + } + webserver = new WebServer(httpPort); // TODO: webserver = new WebServer(WiFi.localIP(), httpPort); // TODO: webserver = new WebServer(ETH.localIP(), httpPort); @@ -109,11 +136,16 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) systemPrintln("ERROR: Failed to allocate webserver"); break; } - if (settings.enableCaptivePortal == true) - webserver->addHandler(new CaptiveRequestHandler()).setFilter(ON_AP_FILTER); // only when requested from AP - websocket->onEvent(onWsEvent); - webserver->addHandler(websocket); + if (settings.enableCaptivePortal == true) + { + webserver->on("/hotspot-detect.html", responsePortal); + webserver->on("/library/test/success.html", responsePortal); + webserver->on("/generate_204", responsePortal); + webserver->on("/ncsi.txt", responsePortal); + webserver->on("/check_network_status.txt", responsePortal); + webserver->on("/portal", responsePortal); + } // * index.html (not gz'd) // * favicon.ico @@ -137,207 +169,153 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) // * /listMessagesBase responds with a CSV of RTCM Base messages supported by this platform // * /file allows the download or deletion of a file - webserver->onNotFound(notFound(webserver)); + webserver->onNotFound(notFound); webserver->onFileUpload( handleUpload); // Run handleUpload function when any file is uploaded. Must be before server.on() calls. - webserver->on("/", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "text/html", index_html, sizeof(index_html)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "text/html", (const char *)index_html, sizeof(index_html)); }); - webserver->on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "text/plain", favicon_ico, sizeof(favicon_ico)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/favicon.ico", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "text/plain", (const char *)favicon_ico, sizeof(favicon_ico)); }); - webserver->on("/src/bootstrap.bundle.min.js", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = request->beginResponse_P(200, "text/javascript", bootstrap_bundle_min_js, - sizeof(bootstrap_bundle_min_js)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/bootstrap.bundle.min.js", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "text/javascript", (const char *)bootstrap_bundle_min_js, sizeof(bootstrap_bundle_min_js)); }); - webserver->on("/src/bootstrap.min.css", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "text/css", bootstrap_min_css, sizeof(bootstrap_min_css)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/bootstrap.min.css", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "text/css", (const char *)bootstrap_min_css, sizeof(bootstrap_min_css)); }); - webserver->on("/src/bootstrap.min.js", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "text/javascript", bootstrap_min_js, sizeof(bootstrap_min_js)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/bootstrap.min.js", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "text/javascript", (const char *)bootstrap_min_js, sizeof(bootstrap_min_js)); }); - webserver->on("/src/jquery-3.6.0.min.js", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "text/javascript", jquery_js, sizeof(jquery_js)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/jquery-3.6.0.min.js", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "text/javascript", (const char *)jquery_js, sizeof(jquery_js)); }); - webserver->on("/src/main.js", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "text/javascript", main_js, sizeof(main_js)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/main.js", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "text/javascript", (const char *)main_js, sizeof(main_js)); }); - webserver->on("/src/rtk-setup.png", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response; + webserver->on("/src/rtk-setup.png", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); if (productVariant == RTK_EVK) - response = request->beginResponse_P(200, "image/png", rtkSetup_png, sizeof(rtkSetup_png)); + webserver->send_P(200, "image/png", (const char *)rtkSetup_png, sizeof(rtkSetup_png)); else - response = request->beginResponse_P(200, "image/png", rtkSetupWiFi_png, sizeof(rtkSetupWiFi_png)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->send_P(200, "image/png", (const char *)rtkSetupWiFi_png, sizeof(rtkSetupWiFi_png)); }); // Battery icons - webserver->on("/src/BatteryBlank.png", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "image/png", batteryBlank_png, sizeof(batteryBlank_png)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/BatteryBlank.png", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "image/png", (const char *)batteryBlank_png, sizeof(batteryBlank_png)); }); - webserver->on("/src/Battery0.png", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "image/png", battery0_png, sizeof(battery0_png)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/Battery0.png", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "image/png", (const char *)battery0_png, sizeof(battery0_png)); }); - webserver->on("/src/Battery1.png", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "image/png", battery1_png, sizeof(battery1_png)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/Battery1.png", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "image/png", (const char *)battery1_png, sizeof(battery1_png)); }); - webserver->on("/src/Battery2.png", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "image/png", battery2_png, sizeof(battery2_png)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/Battery2.png", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "image/png", (const char *)battery2_png, sizeof(battery2_png)); }); - webserver->on("/src/Battery3.png", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "image/png", battery3_png, sizeof(battery3_png)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/Battery3.png", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "image/png", (const char *)battery3_png, sizeof(battery3_png)); }); - webserver->on("/src/Battery0_Charging.png", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "image/png", battery0_Charging_png, sizeof(battery0_Charging_png)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/Battery0_Charging.png", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "image/png", (const char *)battery0_Charging_png, sizeof(battery0_Charging_png)); }); - webserver->on("/src/Battery1_Charging.png", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "image/png", battery1_Charging_png, sizeof(battery1_Charging_png)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/Battery1_Charging.png", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "image/png", (const char *)battery1_Charging_png, sizeof(battery1_Charging_png)); }); - webserver->on("/src/Battery2_Charging.png", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "image/png", battery2_Charging_png, sizeof(battery2_Charging_png)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/Battery2_Charging.png", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "image/png", (const char *)battery2_Charging_png, sizeof(battery2_Charging_png)); }); - webserver->on("/src/Battery3_Charging.png", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "image/png", battery3_Charging_png, sizeof(battery3_Charging_png)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/Battery3_Charging.png", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "image/png", (const char *)battery3_Charging_png, sizeof(battery3_Charging_png)); }); - webserver->on("/src/style.css", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = request->beginResponse_P(200, "text/css", style_css, sizeof(style_css)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/style.css", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "text/css", (const char *)style_css, sizeof(style_css)); }); - webserver->on("/src/fonts/icomoon.eot", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "text/plain", icomoon_eot, sizeof(icomoon_eot)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/fonts/icomoon.eot", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "text/plain", (const char *)icomoon_eot, sizeof(icomoon_eot)); }); - webserver->on("/src/fonts/icomoon.svg", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "text/plain", icomoon_svg, sizeof(icomoon_svg)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/fonts/icomoon.svg", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "text/plain", (const char *)icomoon_svg, sizeof(icomoon_svg)); }); - webserver->on("/src/fonts/icomoon.ttf", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "text/plain", icomoon_ttf, sizeof(icomoon_ttf)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/fonts/icomoon.ttf", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "text/plain", (const char *)icomoon_ttf, sizeof(icomoon_ttf)); }); - webserver->on("/src/fonts/icomoon.woof", HTTP_GET, [](AsyncWebServerRequest *request) { - AsyncWebServerResponse *response = - request->beginResponse_P(200, "text/plain", icomoon_woof, sizeof(icomoon_woof)); - response->addHeader("Content-Encoding", "gzip"); - request->send(response); + webserver->on("/src/fonts/icomoon.woof", HTTP_GET, []() { + webserver->sendHeader("Content-Encoding", "gzip"); + webserver->send_P(200, "text/plain", (const char *)icomoon_woof, sizeof(icomoon_woof)); }); // Handler for the /upload form POST webserver->on( - "/upload", HTTP_POST, [](AsyncWebServerRequest *request) { request->send(200); }, handleFirmwareFileUpload); + "/upload", HTTP_POST, handleFirmwareFileUpload); // Handler for file manager - webserver->on("/listfiles", HTTP_GET, [](AsyncWebServerRequest *request) { - String logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url(); + webserver->on("/listfiles", HTTP_GET, []() { + String logmessage = "Client:" + webserver->client().remoteIP().toString() + " " + webserver->uri(); systemPrintln(logmessage); String files; getFileList(files); - request->send(200, "text/plain", files); + webserver->send(200, "text/plain", files); }); - /* - // Handler for corrections priorities list - webserver->on("/listCorrections", HTTP_GET, [](AsyncWebServerRequest *request) { - String logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url(); - systemPrintln(logmessage); - String corrections; - createCorrectionsList(corrections); - request->send(200, "text/plain", corrections); - }); - */ - // Handler for supported messages list - webserver->on("/listMessages", HTTP_GET, [](AsyncWebServerRequest *request) { - String logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url(); + webserver->on("/listMessages", HTTP_GET, []() { + String logmessage = "Client:" + webserver->client().remoteIP().toString() + " " + webserver->uri(); systemPrintln(logmessage); String messages; createMessageList(messages); systemPrintln(messages); - request->send(200, "text/plain", messages); + webserver->send(200, "text/plain", messages); }); // Handler for supported RTCM/Base messages list - webserver->on("/listMessagesBase", HTTP_GET, [](AsyncWebServerRequest *request) { - String logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url(); + webserver->on("/listMessagesBase", HTTP_GET, []() { + String logmessage = "Client:" + webserver->client().remoteIP().toString() + " " + webserver->uri(); systemPrintln(logmessage); String messageList; createMessageListBase(messageList); systemPrintln(messageList); - request->send(200, "text/plain", messageList); + webserver->send(200, "text/plain", messageList); }); // Handler for file manager - webserver->on("/file", HTTP_GET, [](WebServer *request) { handleFileManager(request); }); + webserver->on("/file", HTTP_GET, handleFileManager); webserver->begin(); @@ -356,7 +334,7 @@ void stopWebServer() { if (webserver != nullptr) { - webserver->end(); + webserver->close(); free(webserver); webserver = nullptr; } @@ -378,29 +356,29 @@ void stopWebServer() reportHeapNow(false); } -void notFound(WebServer *request) +void notFound() { - String logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url(); + String logmessage = "Client:" + webserver->client().remoteIP().toString() + " " + webserver->uri(); systemPrintln(logmessage); - request->send(404, "text/plain", "Not found"); + webserver->send(404, "text/plain", "Not found"); } // Handler for firmware file downloads -static void handleFileManager(WebServer *request) +static void handleFileManager() { // This section does not tolerate semaphore transactions - String logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url(); + String logmessage = "Client:" + webserver->client().remoteIP().toString() + " " + webserver->uri(); - if (request->hasParam("name") && request->hasParam("action")) + if (webserver->hasArg("name") && webserver->hasArg("action")) { - const char *fileName = request->getParam("name")->value().c_str(); - const char *fileAction = request->getParam("action")->value().c_str(); + String fileName = webserver->arg("name"); + String fileAction = webserver->arg("action"); - logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url() + - "?name=" + String(fileName) + "&action=" + String(fileAction); + logmessage = "Client:" + webserver->client().remoteIP().toString() + " " + webserver->uri() + + "?name=" + fileName + "&action=" + fileAction; char slashFileName[60]; - snprintf(slashFileName, sizeof(slashFileName), "/%s", request->getParam("name")->value().c_str()); + snprintf(slashFileName, sizeof(slashFileName), "/%s", webserver->arg("name")); bool fileExists; fileExists = sd->exists(slashFileName); @@ -408,101 +386,67 @@ static void handleFileManager(WebServer *request) if (fileExists == false) { systemPrintln(logmessage + " ERROR: file does not exist"); - request->send(400, "text/plain", "ERROR: file does not exist"); + webserver->send(400, "text/plain", "ERROR: file does not exist"); } else { systemPrintln(logmessage + " file exists"); - if (strcmp(fileAction, "download") == 0) + if (fileAction == "download") { logmessage += " downloaded"; - if (managerFileOpen == false) - { - // Allocate the managerTempFile - if (!managerTempFile) - { - managerTempFile = new SdFile; - if (!managerTempFile) - { - systemPrintln("Failed to allocate managerTempFile!"); - return; - } - } - - if (managerTempFile->open(slashFileName, O_READ) == true) - managerFileOpen = true; - else - systemPrintln("Error: File Manager failed to open file"); - } - else + if (managerTempFile.open(slashFileName, O_READ) != true) { - // File is already in use. Wait your turn. - request->send(202, "text/plain", "ERROR: File already downloading"); + systemPrintln("Error: File Manager failed to open file"); + return; } - int dataAvailable; - dataAvailable = managerTempFile->size() - managerTempFile->position(); + webserver->sendHeader("Cache-Control", "no-cache"); + webserver->sendHeader("Content-Disposition", "attachment; filename=" + fileName); + webserver->sendHeader("Access-Control-Allow-Origin", "*"); - AsyncWebServerResponse *response = request->beginResponse( - "text/plain", dataAvailable, [](uint8_t *buffer, size_t maxLen, size_t index) -> size_t { - uint32_t bytes = 0; - uint32_t availableBytes; - availableBytes = managerTempFile->available(); + // TODO: webserver->streamFile(managerTempFile, "application/octet-stream"); - if (availableBytes > maxLen) - { - bytes = managerTempFile->read(buffer, maxLen); - } - else - { - bytes = managerTempFile->read(buffer, availableBytes); - managerTempFile->close(); + managerTempFile.close(); - managerFileOpen = false; - - websocket->textAll("fmNext,1,"); // Tell browser to send next file if needed - } - - return bytes; - }); - - response->addHeader("Cache-Control", "no-cache"); - response->addHeader("Content-Disposition", "attachment; filename=" + String(fileName)); - response->addHeader("Access-Control-Allow-Origin", "*"); - request->send(response); + // TODO: websocket->textAll("fmNext,1,"); // Tell browser to send next file if needed } - else if (strcmp(fileAction, "delete") == 0) + else if (fileAction == "delete") { logmessage += " deleted"; sd->remove(slashFileName); - request->send(200, "text/plain", "Deleted File: " + String(fileName)); + webserver->send(200, "text/plain", "Deleted File: " + fileName); } else { logmessage += " ERROR: invalid action param supplied"; - request->send(400, "text/plain", "ERROR: invalid action param supplied"); + webserver->send(400, "text/plain", "ERROR: invalid action param supplied"); } systemPrintln(logmessage); } } else { - request->send(400, "text/plain", "ERROR: name and action params required"); + webserver->send(400, "text/plain", "ERROR: name and action params required"); } } // Handler for firmware file upload -static void handleFirmwareFileUpload(AsyncWebServerRequest *request, String fileName, size_t index, uint8_t *data, - size_t len, bool final) +static void handleFirmwareFileUpload() { - if (!index) + String fileName = ""; + + HTTPUpload &upload = webserver->upload(); + + if (upload.status == UPLOAD_FILE_START) { // Check file name against valid firmware names const char *BIN_EXT = "bin"; const char *BIN_HEADER = "RTK_Everywhere_Firmware"; + fileName = upload.filename; + int fnameLen = fileName.length(); char fname[fnameLen + 2] = {'/'}; // Filename must start with / or VERY bad things happen on SD_MMC fileName.toCharArray(&fname[1], fnameLen + 1); @@ -518,30 +462,36 @@ static void handleFirmwareFileUpload(AsyncWebServerRequest *request, String file if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { Update.printError(Serial); - return request->send(400, "text/plain", "OTA could not begin"); + webserver->send(400, "text/plain", "OTA could not begin"); + return; } } else { systemPrintf("Unknown: %s\r\n", fname); - return request->send(400, "text/html", "Error: Unknown file type"); + webserver->send(400, "text/html", "Error: Unknown file type"); + return; } } else { systemPrintf("Unknown: %s\r\n", fname); - return request->send(400, "text/html", "Error: Unknown file type"); + webserver->send(400, "text/html", "Error: Unknown file type"); + return; } } // Write chunked data to the free sketch space - if (len) + else if (upload.status == UPLOAD_FILE_WRITE) { - if (Update.write(data, len) != len) - return request->send(400, "text/plain", "OTA could not begin"); + if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) + { + webserver->send(400, "text/plain", "OTA could not begin"); + return; + } else { - binBytesSent += len; + binBytesSent = upload.currentSize; // Send an update to browser every 100k if (binBytesSent - binBytesLastUpdate > 100000) @@ -558,21 +508,22 @@ static void handleFirmwareFileUpload(AsyncWebServerRequest *request, String file bytesSentMsg); // Convert to "firmwareUploadMsg,11214 bytes sent," systemPrintf("msg: %s\r\n", statusMsg); - websocket->textAll(statusMsg); + sendStringToWebsocket(statusMsg); } } } - if (final) + else if (upload.status == UPLOAD_FILE_END) { if (!Update.end(true)) { Update.printError(Serial); - return request->send(400, "text/plain", "Could not end OTA"); + webserver->send(400, "text/plain", "Could not end OTA"); + return; } else { - websocket->textAll("firmwareUploadComplete,1,"); + sendStringToWebsocket("firmwareUploadComplete,1,"); systemPrintln("Firmware update complete. Restarting"); delay(500); ESP.restart(); @@ -580,6 +531,7 @@ static void handleFirmwareFileUpload(AsyncWebServerRequest *request, String file } } +/* // Events triggered by web sockets void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) @@ -619,6 +571,7 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp systemPrintf("onWsEvent: unrecognised AwsEventType %d\r\n", type); } } +*/ // Create a csv string with the dynamic data to update (current coordinates, battery level, etc) void createDynamicDataString(char *settingsCSV) @@ -729,7 +682,7 @@ bool parseIncomingSettings() // Confirm receipt if (settings.debugWiFiConfig == true) systemPrintln("Sending receipt confirmation of settings"); - websocket->textAll("confirmDataReceipt,1,"); + sendStringToWebsocket("confirmDataReceipt,1,"); } return (true); @@ -879,35 +832,35 @@ void createMessageListBase(String &returnText) } // Handles uploading of user files to SD -void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) +// https://github.com/espressif/arduino-esp32/blob/master/libraries/WebServer/examples/FSBrowser/FSBrowser.ino +void handleUpload() { + if (webserver->uri() != "/edit") { + return; + } + String logmessage = ""; + String filename = ""; + + HTTPUpload &upload = webserver->upload(); - if (!index) + if (upload.status == UPLOAD_FILE_START) { - logmessage = "Upload Start: " + String(filename); + filename = upload.filename; + + logmessage = "Upload Start: " + filename; int fileNameLen = filename.length(); char tempFileName[fileNameLen + 2] = {'/'}; // Filename must start with / or VERY bad things happen on SD_MMC filename.toCharArray(&tempFileName[1], fileNameLen + 1); tempFileName[fileNameLen + 1] = '\0'; // Terminate array - // Allocate the managerTempFile - if (!managerTempFile) - { - managerTempFile = new SdFile; - if (!managerTempFile) - { - systemPrintln("Failed to allocate managerTempFile!"); - return; - } - } // Attempt to gain access to the SD card if (xSemaphoreTake(sdCardSemaphore, fatSemaphore_longWait_ms) == pdPASS) { markSemaphore(FUNCTION_FILEMANAGER_UPLOAD1); - managerTempFile->open(tempFileName, O_CREAT | O_APPEND | O_WRITE); + managerTempFile.open(tempFileName, O_CREAT | O_APPEND | O_WRITE); xSemaphoreGive(sdCardSemaphore); } @@ -915,41 +868,44 @@ void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, systemPrintln(logmessage); } - if (len) + else if (upload.status == UPLOAD_FILE_WRITE) { // Attempt to gain access to the SD card if (xSemaphoreTake(sdCardSemaphore, fatSemaphore_longWait_ms) == pdPASS) { markSemaphore(FUNCTION_FILEMANAGER_UPLOAD2); - managerTempFile->write(data, len); // stream the incoming chunk to the opened file + managerTempFile.write(upload.buf, upload.currentSize); // stream the incoming chunk to the opened file xSemaphoreGive(sdCardSemaphore); } } - if (final) + else if (upload.status == UPLOAD_FILE_END) { - logmessage = "Upload Complete: " + String(filename) + ",size: " + String(index + len); + logmessage = "Upload Complete: " + filename + ",size: " + String(upload.totalSize); // Attempt to gain access to the SD card if (xSemaphoreTake(sdCardSemaphore, fatSemaphore_longWait_ms) == pdPASS) { markSemaphore(FUNCTION_FILEMANAGER_UPLOAD3); - sdUpdateFileCreateTimestamp(managerTempFile); // Update the file create time & date + sdUpdateFileCreateTimestamp(&managerTempFile); // Update the file create time & date - managerTempFile->close(); + managerTempFile.close(); xSemaphoreGive(sdCardSemaphore); } systemPrintln(logmessage); - request->redirect("/"); + + // Redirect to "/" + webserver->sendHeader("Location", "/"); + webserver->send(302); } } -void sendStringToWebsocket(char *stringToSend) +void sendStringToWebsocket(const char *stringToSend) { webserver->sendContent(stringToSend); } diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index 7e527fbed..4225682ea 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -244,8 +244,7 @@ typedef enum LoggingType } LoggingType; LoggingType loggingType; -SdFile *managerTempFile; // File used for uploading or downloading in the file manager section of AP config -bool managerFileOpen; +SdFile managerTempFile; // File used for uploading or downloading in the file manager section of AP config TaskHandle_t sdSizeCheckTaskHandle; // Store handles so that we can delete the task once the size is found const uint8_t sdSizeCheckTaskPriority = 0; // 3 being the highest, and 0 being the lowest @@ -561,9 +560,12 @@ unsigned long lastRockerSwitchChange; // If quick toggle is detected (less than #ifdef COMPILE_WIFI #ifdef COMPILE_AP -#include "WebServer.h" +#include +#include #include "form.h" +// https://github.com/espressif/arduino-esp32/blob/master/libraries/DNSServer/examples/CaptivePortal/CaptivePortal.ino +DNSServer *dnsserver; WebServer *webserver; #endif // COMPILE_AP diff --git a/Firmware/RTK_Everywhere/States.ino b/Firmware/RTK_Everywhere/States.ino index 208aff414..86fdb41ae 100644 --- a/Firmware/RTK_Everywhere/States.ino +++ b/Firmware/RTK_Everywhere/States.ino @@ -474,7 +474,7 @@ void stateUpdate() createDynamicDataString(settingsCSV); // log_d("Sending coordinates: %s", settingsCSV); - sendStringToWebsocket((char *)settingsCSV); + sendStringToWebsocket(settingsCSV); } } #endif // COMPILE_AP @@ -947,7 +947,7 @@ void stateUpdate() createDynamicDataString(settingsCSV); // log_d("Sending coordinates: %s", settingsCSV); - sendStringToWebsocket((char *)settingsCSV); + sendStringToWebsocket(settingsCSV); } } #endif // COMPILE_AP diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 7932155f3..1fec0130e 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -755,7 +755,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr if (settings.debugWiFiConfig == true) systemPrintln("Sending reset confirmation"); - sendStringToWebsocket((char *)"confirmReset,1,"); + sendStringToWebsocket("confirmReset,1,"); delay(500); // Allow for delivery if (configureViaEthernet) @@ -856,7 +856,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr if (settings.debugWiFiConfig == true) systemPrintln("Checking for new OTA Pull firmware"); - sendStringToWebsocket((char *)"checkingNewFirmware,1,"); // Tell the config page we received their request + sendStringToWebsocket("checkingNewFirmware,1,"); // Tell the config page we received their request char reportedVersion[20]; char newVersionCSV[100]; @@ -897,13 +897,13 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr if (settings.debugWiFiConfig == true) systemPrintln("Getting new OTA Pull firmware"); - sendStringToWebsocket((char *)"gettingNewFirmware,1,"); + sendStringToWebsocket("gettingNewFirmware,1,"); apConfigFirmwareUpdateInProcess = true; otaUpdate(); // otaUpdate will call wifiConnect if needed. Also does previouslyConnected check // We get here if WiFi failed to connect - sendStringToWebsocket((char *)"gettingNewFirmware,ERROR,"); + sendStringToWebsocket("gettingNewFirmware,ERROR,"); knownSetting = true; } diff --git a/Firmware/RTK_Everywhere/menuFirmware.ino b/Firmware/RTK_Everywhere/menuFirmware.ino index 441ba0a31..6d593950d 100644 --- a/Firmware/RTK_Everywhere/menuFirmware.ino +++ b/Firmware/RTK_Everywhere/menuFirmware.ino @@ -555,7 +555,7 @@ void overTheAirUpdate() { #ifdef COMPILE_AP // Tell AP page to display reset info - sendStringToWebsocket((char *)"confirmReset,1,"); + sendStringToWebsocket("confirmReset,1,"); #endif // COMPILE_AP } ESP.restart(); @@ -623,7 +623,7 @@ void otaDisplayPercentage(int bytesWritten, int totalLength, bool alwaysDisplay) #ifdef COMPILE_AP char myProgress[50]; snprintf(myProgress, sizeof(myProgress), "otaFirmwareStatus,%d,", percent); - sendStringToWebsocket((char *)myProgress); + sendStringToWebsocket(myProgress); #endif // COMPILE_AP } From dd9197ef9dc7bf04e9479fd12c32e7918c2c11d4 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Tue, 21 May 2024 10:08:09 -0600 Subject: [PATCH 051/358] Add notes to UM980 bootload limitations --- Firmware/RTK_Everywhere/menuSystem.ino | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/menuSystem.ino b/Firmware/RTK_Everywhere/menuSystem.ino index bb7d65cd6..1fb811d4e 100644 --- a/Firmware/RTK_Everywhere/menuSystem.ino +++ b/Firmware/RTK_Everywhere/menuSystem.ino @@ -509,6 +509,13 @@ void menuDebugHardware() } else if (incoming == 13 && present.gnss_um980) { + // Note: We cannot increase the bootloading speed beyond 115200 because + // we would need to alter the UM980 baud, then save to NVM, then allow the UM980 to reset. + // This is workable, but the next time the RTK Torch resets, it assumes communication at 115200bps + // This fails and communication is broken. We could program in some logic that attempts comm at 460800 + // then reconfigures the UM980 to 115200bps, then resets, but autobaud detection in the UM980 library is + // not yet supported. + // Stop all UART tasks tasksStopGnssUart(); @@ -943,7 +950,7 @@ void menuOperation() systemPrintln(settings.uartReceiveBufferSize); // ZED - if(present.gnss_zedf9p) + if (present.gnss_zedf9p) systemPrintln("10) Mirror ZED-F9x's UART1 settings to USB"); // PPL Float Lock timeout From 6dee07bd9bc3513ae7b9d77625248a97846407f1 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Tue, 21 May 2024 17:55:45 +0100 Subject: [PATCH 052/358] ~working - but needs a replacement for websocket (onWsEvent) --- Firmware/RTK_Everywhere/Form.ino | 115 +++++++++++++-------- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 4 + Firmware/RTK_Everywhere/settings.h | 3 + 3 files changed, 77 insertions(+), 45 deletions(-) diff --git a/Firmware/RTK_Everywhere/Form.ino b/Firmware/RTK_Everywhere/Form.ino index cf3f55fac..413560c62 100644 --- a/Firmware/RTK_Everywhere/Form.ino +++ b/Firmware/RTK_Everywhere/Form.ino @@ -11,8 +11,9 @@ Form.ino bool websocketConnected = false; -/* -class CaptiveRequestHandler : public AsyncWebHandler +// ===== Request Handler class used to answer more complex requests ===== +// https://github.com/espressif/arduino-esp32/blob/master/libraries/WebServer/examples/WebServer/WebServer.ino +class CaptiveRequestHandler : public RequestHandler { public: // https://en.wikipedia.org/wiki/Captive_portal @@ -20,58 +21,39 @@ class CaptiveRequestHandler : public AsyncWebHandler "/check_network_status.txt"}; CaptiveRequestHandler() { + systemPrintln("CaptiveRequestHandler is registered"); } virtual ~CaptiveRequestHandler() { } - bool canHandle(AsyncWebServerRequest *request) - { - for (int i = 0; i < 5; i++) + bool canHandle(HTTPMethod requestMethod, String uri) override { + for (int i = 0; i < sizeof(urls); i++) { - if (request->url().equals(urls[i])) + if (uri == urls[i]) return true; } return false; } - // Provide a custom small site for redirecting the user to the config site - // HTTP redirect does not work and the relative links on the default config site do not work, because the phone is - // requesting a different server - void handleRequest(AsyncWebServerRequest *request) + bool handle(WebServer &server, HTTPMethod requestMethod, String requestUri) override { - String logmessage = "Captive Portal Client:" + request->client()->remoteIP().toString() + " " + request->url(); + String logmessage = "Captive Portal Client:" + server.client().remoteIP().toString() + " " + requestUri; systemPrintln(logmessage); - AsyncResponseStream *response = request->beginResponseStream("text/html"); - response->print("RTK Config"); - response->print("
"); - response->printf("
SparkFun "
-                         "RTK WiFi Setup
", - WiFi.softAPIP().toString().c_str()); - response->printf("

Configure your RTK receiver here

", - WiFi.softAPIP().toString().c_str()); - response->print("
"); - request->send(response); + String response = "RTK Config"; + response += "
"; + response += "
SparkFun RTK WiFi Setup
"; + response += "

Configure your RTK receiver here

"; + response += "
"; + server.send(200, "text/html", response); + + return true; } }; -*/ - - -void responsePortal() -{ - String logmessage = "Captive Portal Client:" + webserver->client().remoteIP().toString() + " " + webserver->uri(); - systemPrintln(logmessage); - String response = "RTK Config"; - response += "
"; - response += "
SparkFun RTK WiFi Setup
"; - response += "

Configure your RTK receiver here

"; - response += "
"; - webserver->send(200, "text/html", response); -} // Start webserver in AP mode @@ -139,14 +121,11 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) if (settings.enableCaptivePortal == true) { - webserver->on("/hotspot-detect.html", responsePortal); - webserver->on("/library/test/success.html", responsePortal); - webserver->on("/generate_204", responsePortal); - webserver->on("/ncsi.txt", responsePortal); - webserver->on("/check_network_status.txt", responsePortal); - webserver->on("/portal", responsePortal); + webserver->addHandler(new CaptiveRequestHandler()); } + webserver->on("/ws", onWsEvent); // websocket + // * index.html (not gz'd) // * favicon.ico @@ -319,6 +298,15 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) webserver->begin(); + // Starts task for feeding NMEA+RTCM to PPL + if (online.updatePplTaskRunning == false) + xTaskCreate(updateWebServerTask, + "UpdateWebServer", // Just for humans + updateWebServerTaskStackSize, // Stack Size + nullptr, // Task input parameter + updateWebServerTaskPriority, + &updatePplTaskHandle); // Task handle + if (settings.debugWiFiConfig == true) systemPrintln("Web Server Started"); reportHeapNow(false); @@ -330,8 +318,40 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) return false; } +void updateWebServerTask(void *e) +{ + // Start notification + online.updateWebServerTaskRunning = true; + if (settings.printTaskStartStop) + systemPrintln("Task updateWebServerTask started"); + + // Verify that the task is still running + while (online.updateWebServerTaskRunning) + { + // Display an alive message + if (PERIODIC_DISPLAY(PD_TASK_UPDATE_WEBSERVER)) + { + PERIODIC_CLEAR(PD_TASK_UPDATE_WEBSERVER); + systemPrintln("updateWebServerTask running"); + } + + webserver->handleClient(); + + feedWdt(); + taskYIELD(); + } + + // Stop notification + if (settings.printTaskStartStop) + systemPrintln("Task updateWebServerTask stopped"); + online.updateWebServerTaskRunning = false; + vTaskDelete(NULL); +} + void stopWebServer() { + online.updatePplTaskRunning = false; + if (webserver != nullptr) { webserver->close(); @@ -531,6 +551,11 @@ static void handleFirmwareFileUpload() } } +void onWsEvent() +{ + +} + /* // Events triggered by web sockets void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index 4225682ea..c96efa00b 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -568,6 +568,10 @@ unsigned long lastRockerSwitchChange; // If quick toggle is detected (less than DNSServer *dnsserver; WebServer *webserver; +TaskHandle_t webserverTaskHandle; +const uint8_t updateWebServerTaskPriority = 0; // 3 being the highest, and 0 being the lowest +const int updateWebServerTaskStackSize = 3000; + #endif // COMPILE_AP #endif // COMPILE_WIFI diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index aaef967c9..6484323dd 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -574,6 +574,8 @@ enum PeriodDisplayValues PD_MQTT_CLIENT_DATA, // 32 PD_MQTT_CLIENT_STATE, // 33 + + PD_TASK_UPDATE_WEBSERVER, // 34 // Add new values before this line }; @@ -1721,6 +1723,7 @@ struct struct_online volatile bool idleTask1Running = false; volatile bool sdSizeCheckTaskRunning = false; volatile bool updatePplTaskRunning = false; + volatile bool updateWebServerTaskRunning = false; bool ppl = false; bool batteryCharger = false; } online; From 4a484f061d5b98a443a6528bc2f01088e7a24aac Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 18 May 2024 20:40:05 -1000 Subject: [PATCH 053/358] Add exit command --- Firmware/RTK_Everywhere/menuCommands.ino | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index b6bcf4db0..50e7130d6 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -15,6 +15,12 @@ void menuCommands() if (response != INPUT_RESPONSE_VALID) continue; + if ((strcmp(cmdBuffer, "x") == 0) || (strcmp(cmdBuffer, "exit") == 0)) + { + systemPrintln("Exiting COMMAND MODE"); + break; // Exit while(1) loop + } + if (strcmp(cmdBuffer, "list") == 0) { printAvailableSettings(); From 370defa7ab0f6caafa5c71c4768dba23cf0a6fc7 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Mon, 20 May 2024 09:08:04 -1000 Subject: [PATCH 054/358] Support entering commands without $ and checksum for testing --- Firmware/RTK_Everywhere/menuCommands.ino | 26 ++++++++++++++++-------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 50e7130d6..8f4c0fcce 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -1,6 +1,7 @@ void menuCommands() { char cmdBuffer[200]; + char * command; char responseBuffer[200]; char valueBuffer[100]; const int MAX_TOKENS = 10; @@ -21,24 +22,31 @@ void menuCommands() break; // Exit while(1) loop } - if (strcmp(cmdBuffer, "list") == 0) + else if (strcmp(cmdBuffer, "list") == 0) { printAvailableSettings(); continue; } + // Allow command input via serial menu + else if (cmdBuffer[0] != '$') + command = cmdBuffer; + // Verify command structure - else if (commandValid(cmdBuffer) == false) + else { - commandSendErrorResponse("SP", "Bad command structure"); - continue; - } + if (commandValid(cmdBuffer) == false) + { + commandSendErrorResponse("SP", "Bad command structure"); + continue; + } - // Remove $ - char *command = cmdBuffer + 1; + // Remove $ + command = cmdBuffer + 1; - // Remove * and CRC - command[strlen(command) - 3] = '\0'; + // Remove * and CRC + command[strlen(command) - 3] = '\0'; + } int tokenCount = 0; tokens[tokenCount] = strtok(command, delimiter); From 60ac42f6a2aabf5933bdf27e9b154480d36aa9e6 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 18 May 2024 09:19:02 -1000 Subject: [PATCH 055/358] Move bool columns in RTK_Settings_Entry and rtkSettingsEntries --- Firmware/RTK_Everywhere/settings.h | 488 +++++++++++++++-------------- 1 file changed, 248 insertions(+), 240 deletions(-) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index dd40a1c6d..dc2681e0d 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1365,17 +1365,19 @@ typedef enum { // (Maintain the enum of existing settings types!) } RTK_Settings_Types; -typedef struct { +typedef struct +{ + bool updateGNSSOnChange; + bool inSettingsString; + bool inCommands; void *var; const char *name; - const RTK_Settings_Types type; - const int qualifier; - const bool updateGNSSOnChange; - const bool inSettingsString; - const bool inCommands; + RTK_Settings_Types type; + int qualifier; } RTK_Settings_Entry; -enum Settings_float_Precision { +enum Settings_float_Precision +{ noPrecision = 0, point1float, point2float, @@ -1384,248 +1386,254 @@ enum Settings_float_Precision { point9float = 9, }; -const RTK_Settings_Entry rtkSettingsEntries[] = { +const RTK_Settings_Entry rtkSettingsEntries[] = +{ // Note: don't use "_" in the name - "_" is reserved for settings arrays like "ubxMessageRate_" - { & settings.enableSD, "enableSD", _bool, 0, false, true, true }, - { & settings.maxLogTime_minutes, "maxLogTime", _int, 0, false, true, true }, - { & settings.maxLogLength_minutes, "maxLogLength", _int, 0, false, true, true }, - { & settings.observationSeconds, "observationSeconds", _int, 0, true, true, true }, - { & settings.observationPositionAccuracy, "observationPositionAccuracy", _float, point2float, true, true, true }, - { & settings.fixedBase, "fixedBase", _bool, 0, true, false, true }, - { & settings.fixedBaseCoordinateType, "fixedBaseCoordinateType", _bool, 0, true, false, true }, - { & settings.fixedEcefX, "fixedEcefX", _double, point3float, true, true, true }, - { & settings.fixedEcefY, "fixedEcefY", _double, point3float, true, true, true }, - { & settings.fixedEcefZ, "fixedEcefZ", _double, point3float, true, true, true }, - { & settings.fixedLat, "fixedLat", _double, point9float, true, true, true }, - { & settings.fixedLong, "fixedLong", _double, point9float, true, true, true }, - { & settings.fixedAltitude, "fixedAltitude", _double, point4float, true, true, true }, - { & settings.dataPortBaud, "dataPortBaud", _uint32_t, 0, true, true, true }, - { & settings.radioPortBaud, "radioPortBaud", _uint32_t, 0, true, true, true }, - { & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", _float, point1float, true, true, true }, - { & settings.measurementRateMs, "measurementRateMs", _uint16_t, 0, true, false, true }, - { & settings.navigationRate, "navigationRate", _uint16_t, 0, true, false, true }, - { & settings.debugGnss, "debugGnss", _bool, 0, false, true, true }, - { & settings.enableHeapReport, "enableHeapReport", _bool, 0, false, true, true }, - { & settings.enableTaskReports, "enableTaskReports", _bool, 0, false, true, true }, - { & settings.dataPortChannel, "dataPortChannel", _muxConnectionType_e, 0, false, true, true }, - { & settings.spiFrequency, "spiFrequency", _uint16_t, 0, false, true, true }, - { & settings.enableLogging, "enableLogging", _bool, 0, false, true, true }, - { & settings.enableARPLogging, "enableARPLogging", _bool, 0, false, true, true }, - { & settings.ARPLoggingInterval_s, "ARPLoggingInterval", _uint16_t, 0, false, true, true }, - { & settings.sppRxQueueSize, "sppRxQueueSize", _uint16_t, 0, false, true, true }, - { & settings.sppTxQueueSize, "sppTxQueueSize", _uint16_t, 0, false, true, true }, - { & settings.dynamicModel, "dynamicModel", _uint8_t, 0, true, true, true }, - { & settings.lastState, "lastState", _SystemState, 0, true, false, true }, - { & settings.enableResetDisplay, "enableResetDisplay", _bool, 0, false, true, true }, - { & settings.resetCount, "resetCount", _int, 0, false, true, true }, - { & settings.enableExternalPulse, "enableExternalPulse", _bool, 0, true, true, true }, - { & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", _uint64_t, 0, true, true, true }, - { & settings.externalPulseLength_us, "externalPulseLength", _uint64_t, 0, true, true, true }, - { & settings.externalPulsePolarity, "externalPulsePolarity", _pulseEdgeType_e, 0, true, true, true }, - { & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", _bool, 0, true, true, true }, - { & settings.enableUART2UBXIn, "enableUART2UBXIn", _bool, 0, false, true, true }, - - { & settings.ubxMessageRates[0], "ubxMessageRate_", _ubxMessageRates, MAX_UBX_MSG, true, false, true }, - - { & settings.ubxConstellations[0], "ubxConstellation_", _ubxConstellations, MAX_CONSTELLATIONS, true, true, true }, - - { & settings.profileName, "profileName", _charArray, sizeof(settings.profileName), false, false, true }, - - { & settings.serialTimeoutGNSS, "serialTimeoutGNSS", _int16_t, 0, false, true, true }, - - { & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", _charArray, sizeof(settings.pointPerfectDeviceProfileToken), false, true, true }, - { & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", _bool, 0, false, true, true }, - { & settings.autoKeyRenewal, "autoKeyRenewal", _bool, 0, false, true, true }, - { & settings.pointPerfectClientID, "pointPerfectClientID", _charArray, sizeof(settings.pointPerfectClientID), false, true, true }, - { & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", _charArray, sizeof(settings.pointPerfectBrokerHost), false, true, true }, - { & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", _charArray, sizeof(settings.pointPerfectKeyDistributionTopic), false, true, true }, - - { & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", _charArray, sizeof(settings.pointPerfectCurrentKey), false, true, true }, - { & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", _uint64_t, 0, false, true, true }, - { & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", _uint64_t, 0, false, true, true }, - - { & settings.pointPerfectNextKey, "pointPerfectNextKey", _charArray, sizeof(settings.pointPerfectNextKey), false, true, true }, - { & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", _uint64_t, 0, false, true, true }, - { & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", _uint64_t, 0, false, true, true }, - - { & settings.lastKeyAttempt, "lastKeyAttempt", _uint64_t, 0, false, true, true }, - { & settings.updateGNSSSettings, "updateGNSSSettings", _bool, 0, false, true, true }, - - { & settings.debugPpCertificate, "debugPpCertificate", _bool, 0, false, false, true }, - - { & settings.timeZoneHours, "timeZoneHours", _int8_t, 0, false, true, true }, - { & settings.timeZoneMinutes, "timeZoneMinutes", _int8_t, 0, false, true, true }, - { & settings.timeZoneSeconds, "timeZoneSeconds", _int8_t, 0, false, true, true }, - - { & settings.enablePrintState, "enablePrintState", _bool, 0, false, true, true }, - { & settings.enablePrintPosition, "enablePrintPosition", _bool, 0, false, true, true }, - { & settings.enablePrintIdleTime, "enablePrintIdleTime", _bool, 0, false, true, true }, - { & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", _bool, 0, false, true, true }, - { & settings.enablePrintRoverAccuracy, "enablePrintRoverAccuracy", _bool, 0, false, true, true }, - { & settings.enablePrintBadMessages, "enablePrintBadMessages", _bool, 0, false, true, true }, - { & settings.enablePrintLogFileMessages, "enablePrintLogFileMessages", _bool, 0, false, true, true }, - { & settings.enablePrintLogFileStatus, "enablePrintLogFileStatus", _bool, 0, false, true, true }, - { & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", _bool, 0, false, true, true }, - { & settings.enablePrintStates, "enablePrintStates", _bool, 0, false, true, true }, - { & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", _bool, 0, false, true, true }, - { & settings.enablePrintRtcSync, "enablePrintRtcSync", _bool, 0, false, true, true }, - - { & settings.espnowPeers[0][0], "espnowPeer_", _espnowPeers, ESPNOW_MAX_PEERS, false, true, true }, - - { & settings.espnowPeerCount, "espnowPeerCount", _uint8_t, 0, false, true, true }, - { & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", _bool, 0, false, false, true }, - { & settings.bluetoothRadioType, "bluetoothRadioType", _BluetoothRadioType_e, 0, false, true, true }, - { & settings.runLogTest, "runLogTest", _bool, 0, false, true, true }, // Not stored in NVM - { & settings.espnowBroadcast, "espnowBroadcast", _bool, 0, false, true, true }, - { & settings.antennaHeight, "antennaHeight", _int16_t, 0, false, true, true }, - { & settings.antennaReferencePoint, "antennaReferencePoint", _float, point2float, false, true, true }, - { & settings.echoUserInput, "echoUserInput", _bool, 0, false, true, true }, - { & settings.uartReceiveBufferSize, "uartReceiveBufferSize", _int, 0, false, true, true }, - { & settings.gnssHandlerBufferSize, "gnssHandlerBufferSize", _int, 0, false, true, true }, - - { & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", _bool, 0, false, true, true }, - { & settings.enablePrintSDBuffers, "enablePrintSDBuffers", _bool, 0, false, true, true }, - { & settings.periodicDisplay, "periodicDisplay", _PeriodicDisplay_t, 0, false, true, true }, - { & settings.periodicDisplayInterval, "periodicDisplayInterval", _uint32_t, 0, false, true, true }, - - { & settings.rebootSeconds, "rebootSeconds", _uint32_t, 0, false, true, true }, - { & settings.forceResetOnSDFail, "forceResetOnSDFail", _bool, 0, false, true, true }, - - { & settings.minElev, "minElev", _uint8_t, 0, true, true, true }, - - { & settings.ubxMessageRatesBase[0], "ubxMessageRateBase_", _ubxMessageRateBase, MAX_UBX_MSG_RTCM, true, false, true }, - - { & settings.coordinateInputType, "coordinateInputType", _CoordinateInputType, 0, false, true, true }, - { & settings.lbandFixTimeout_seconds, "lbandFixTimeout", _uint16_t, 0, false, true, true }, - { & settings.minCNO, "minCNO", _int16_t, 0, true, false, true }, - { & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", _uint16_t, 0, false, true, true }, - { & settings.btReadTaskPriority, "btReadTaskPriority", _uint8_t, 0, false, true, true }, - { & settings.gnssReadTaskPriority, "gnssReadTaskPriority", _uint8_t, 0, false, true, true }, - { & settings.handleGnssDataTaskPriority, "handleGnssDataTaskPriority", _uint8_t, 0, false, true, true }, - { & settings.btReadTaskCore, "btReadTaskCore", _uint8_t, 0, false, true, true }, - { & settings.gnssReadTaskCore, "gnssReadTaskCore", _uint8_t, 0, false, true, true }, - { & settings.handleGnssDataTaskCore, "handleGnssDataTaskCore", _uint8_t, 0, false, true, true }, - { & settings.gnssUartInterruptsCore, "gnssUartInterruptsCore", _uint8_t, 0, false, true, true }, - { & settings.bluetoothInterruptsCore, "bluetoothInterruptsCore", _uint8_t, 0, false, true, true }, - { & settings.i2cInterruptsCore, "i2cInterruptsCore", _uint8_t, 0, false, true, true }, - { & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", _uint32_t, 0, false, true, true }, - { & settings.disableSetupButton, "disableSetupButton", _bool, 0, false, true, true }, - - { & settings.enablePrintEthernetDiag, "enablePrintEthernetDiag", _bool, 0, false, true, true }, - { & settings.ethernetDHCP, "ethernetDHCP", _bool, 0, false, true, true }, - { & settings.ethernetIP, "ethernetIP", _IPString, 0, false, true, true }, - { & settings.ethernetDNS, "ethernetDNS", _IPString, 0, false, true, true }, - { & settings.ethernetGateway, "ethernetGateway", _IPString, 0, false, true, true }, - { & settings.ethernetSubnet, "ethernetSubnet", _IPString, 0, false, true, true }, - { & settings.httpPort, "httpPort", _uint16_t, 0, false, true, true }, - - { & settings.debugWifiState, "debugWifiState", _bool, 0, false, true, true }, - { & settings.wifiConfigOverAP, "wifiConfigOverAP", _bool, 0, false, false, true }, // TODO: check drop downs - - { & settings.wifiNetworks, "wifiNetwork_", _wifiNetwork, MAX_WIFI_NETWORKS, false, true, true }, - - { & settings.defaultNetworkType, "defaultNetworkType", _uint8_t, 0, false, true, true }, - { & settings.debugNetworkLayer, "debugNetworkLayer", _bool, 0, false, true, true }, - { & settings.enableNetworkFailover, "enableNetworkFailover", _bool, 0, false, true, true }, - { & settings.printNetworkStatus, "printNetworkStatus", _bool, 0, false, true, true }, - - { & settings.mdnsEnable, "mdnsEnable", _bool, 0, false, true, true }, - - { & settings.debugMqttClientData, "debugMqttClientData", _bool, 0, false, true, true }, - { & settings.debugMqttClientState, "debugMqttClientState", _bool, 0, false, true, true }, - - { & settings.debugNtp, "debugNtp", _bool, 0, false, true, true }, - { & settings.ethernetNtpPort, "ethernetNtpPort", _uint16_t, 0, false, true, true }, - { & settings.enableNTPFile, "enableNTPFile", _bool, 0, false, true, true }, - { & settings.ntpPollExponent, "ntpPollExponent", _uint8_t, 0, false, true, true }, - { & settings.ntpPrecision, "ntpPrecision", _int8_t, 0, false, true, true }, - { & settings.ntpRootDelay, "ntpRootDelay", _uint32_t, 0, false, true, true }, - { & settings.ntpRootDispersion, "ntpRootDispersion", _uint32_t, 0, false, true, true }, - { & settings.ntpReferenceId, "ntpReferenceId", _charArray, sizeof(settings.ntpReferenceId), false, true, true }, - - { & settings.debugNtripClientRtcm, "debugNtripClientRtcm", _bool, 0, false, true, true }, - { & settings.debugNtripClientState, "debugNtripClientState", _bool, 0, false, true, true }, - { & settings.enableNtripClient, "enableNtripClient", _bool, 0, false, true, true }, - { & settings.ntripClient_CasterHost, "ntripClientCasterHost", _charArray, sizeof(settings.ntripClient_CasterHost), false, true, true }, - { & settings.ntripClient_CasterPort, "ntripClientCasterPort", _uint16_t, 0, false, true, true }, - { & settings.ntripClient_CasterUser, "ntripClientCasterUser", _charArray, sizeof(settings.ntripClient_CasterUser), false, true, true }, - { & settings.ntripClient_CasterUserPW, "ntripClientCasterUserPW", _charArray, sizeof(settings.ntripClient_CasterUserPW), false, true, true }, - { & settings.ntripClient_MountPoint, "ntripClientMountPoint", _charArray, sizeof(settings.ntripClient_MountPoint), false, true, true }, - { & settings.ntripClient_MountPointPW, "ntripClientMountPointPW", _charArray, sizeof(settings.ntripClient_MountPointPW), false, true, true }, - { & settings.ntripClient_TransmitGGA, "ntripClientTransmitGGA", _bool, 0, false, true, true }, - - { & settings.debugNtripServerRtcm, "debugNtripServerRtcm", _bool, 0, false, true, true }, - { & settings.debugNtripServerState, "debugNtripServerState", _bool, 0, false, true, true }, - { & settings.enableNtripServer, "enableNtripServer", _bool, 0, false, true, true }, - - { & settings.ntripServer_CasterHost[0], "ntripServerCasterHost_", _ntripServerCasterHost, NTRIP_SERVER_MAX, false, true, true }, - { & settings.ntripServer_CasterPort[0], "ntripServerCasterPort_", _ntripServerCasterPort, NTRIP_SERVER_MAX, false, true, true }, - { & settings.ntripServer_CasterUser[0], "ntripServerCasterUser_", _ntripServerCasterUser, NTRIP_SERVER_MAX, false, true, true }, - { & settings.ntripServer_CasterUserPW[0], "ntripServerCasterUserPW_", _ntripServerCasterUserPW, NTRIP_SERVER_MAX, false, true, true }, - { & settings.ntripServer_MountPoint[0], "ntripServerMountPoint_", _ntripServerMountPoint, NTRIP_SERVER_MAX, false, true, true }, - { & settings.ntripServer_MountPointPW[0], "ntripServerMountPointPW_", _ntripServerMountPointPW, NTRIP_SERVER_MAX, false, true, true }, - - { & settings.debugTcpClient, "debugTcpClient", _bool, 0, false, true, true }, - { & settings.enableTcpClient, "enableTcpClient", _bool, 0, false, true, true }, - { & settings.tcpClientPort, "tcpClientPort", _uint16_t, 0, false, true, true }, - { & settings.tcpClientHost, "tcpClientHost", _charArray, sizeof(settings.tcpClientHost), false, true, true }, - - { & settings.debugTcpServer, "debugTcpServer", _bool, 0, false, true, true }, - { & settings.enableTcpServer, "enableTcpServer", _bool, 0, false, true, true }, - { & settings.tcpServerPort, "tcpServerPort", _uint16_t, 0, false, true, true }, - - { & settings.debugUdpServer, "debugUdpServer", _bool, 0, false, true, true }, - { & settings.enableUdpServer, "enableUdpServer", _bool, 0, false, true, true }, - { & settings.udpServerPort, "udpServerPort", _uint16_t, 0, false, true, true }, - - { & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", _um980MessageRatesNMEA, MAX_UM980_NMEA_MSG, false, false, true }, - { & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", _um980MessageRatesRTCMRover, MAX_UM980_RTCM_MSG, false, false, true }, - { & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", _um980MessageRatesRTCMBase, MAX_UM980_RTCM_MSG, false, false, true }, - { & settings.um980Constellations, "um980Constellations_", _um980Constellations, MAX_UM980_CONSTELLATIONS, false, true, true }, - - { & settings.enableTiltCompensation, "enableTiltCompensation", _bool, 0, false, true, true }, - { & settings.tiltPoleLength, "tiltPoleLength", _float, point3float, false, true, true }, - { & settings.enableImuDebug, "enableImuDebug", _bool, 0, false, true, true }, - - { & settings.debugFirmwareUpdate, "debugFirmwareUpdate", _bool, 0, false, true, true }, - { & settings.enableAutoFirmwareUpdate, "enableAutoFirmwareUpdate", _bool, 0, false, true, true }, - { & settings.autoFirmwareCheckMinutes, "autoFirmwareCheckMinutes", _uint32_t, 0, false, true, true }, - - { & settings.debugCorrections, "debugCorrections", _bool, 0, false, true, true }, - { & settings.enableCaptivePortal, "enableCaptivePortal", _bool, 0, false, true, true }, - - { & settings.printBootTimes, "printBootTimes", _bool, 0, false, true, true }, - - { & settings.printPartitionTable, "printPartitionTable", _bool, 0, false, true, true }, - - { & settings.measurementScale, "measurementScale", _uint8_t, 0, false, true, true }, - - { & settings.debugWiFiConfig, "debugWiFiConfig", _bool, 0, false, true, true }, - { & settings.enablePsram, "enablePsram", _bool, 0, false, true, true }, - { & settings.printTaskStartStop, "printTaskStartStop", _bool, 0, false, true, true }, - { & settings.psramMallocLevel, "psramMallocLevel", _uint16_t, 0, false, true, true }, - { & settings.enableBeeper, "enableBeeper", _bool, 0, false, true, true }, - { & settings.enableImuCompensationDebug, "enableImuCompensationDebug", _bool, 0, false, true, true }, - - { & settings.correctionsSourcesPriority, "correctionsPriority_", _correctionsSourcesPriority, correctionsSource::CORR_NUM, false, true, true }, - { & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", _int, 0, false, true, true }, +// G S C +// N e m +// S t d +// S t s Type Qual Name Variable + { 0, 1, 1, & settings.enableSD, "enableSD", _bool, 0}, + { 0, 1, 1, & settings.maxLogTime_minutes, "maxLogTime", _int, 0}, + { 0, 1, 1, & settings.maxLogLength_minutes, "maxLogLength", _int, 0, }, + { 1, 1, 1, & settings.observationSeconds, "observationSeconds", _int, 0, }, + { 1, 1, 1, & settings.observationPositionAccuracy, "observationPositionAccuracy", _float, point2float, }, + { 1, 0, 1, & settings.fixedBase, "fixedBase", _bool, 0, }, + { 1, 0, 1, & settings.fixedBaseCoordinateType, "fixedBaseCoordinateType", _bool, 0, }, + { 1, 1, 1, & settings.fixedEcefX, "fixedEcefX", _double, point3float, }, + { 1, 1, 1, & settings.fixedEcefY, "fixedEcefY", _double, point3float, }, + { 1, 1, 1, & settings.fixedEcefZ, "fixedEcefZ", _double, point3float, }, + { 1, 1, 1, & settings.fixedLat, "fixedLat", _double, point9float, }, + { 1, 1, 1, & settings.fixedLong, "fixedLong", _double, point9float, }, + { 1, 1, 1, & settings.fixedAltitude, "fixedAltitude", _double, point4float, }, + { 1, 1, 1, & settings.dataPortBaud, "dataPortBaud", _uint32_t, 0, }, + { 1, 1, 1, & settings.radioPortBaud, "radioPortBaud", _uint32_t, 0, }, + { 1, 1, 1, & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", _float, point1float, }, + { 1, 0, 1, & settings.measurementRateMs, "measurementRateMs", _uint16_t, 0, }, + { 1, 0, 1, & settings.navigationRate, "navigationRate", _uint16_t, 0, }, + { 0, 1, 1, & settings.debugGnss, "debugGnss", _bool, 0, }, + { 0, 1, 1, & settings.enableHeapReport, "enableHeapReport", _bool, 0, }, + { 0, 1, 1, & settings.enableTaskReports, "enableTaskReports", _bool, 0, }, + { 0, 1, 1, & settings.dataPortChannel, "dataPortChannel", _muxConnectionType_e, 0, }, + { 0, 1, 1, & settings.spiFrequency, "spiFrequency", _uint16_t, 0, }, + { 0, 1, 1, & settings.enableLogging, "enableLogging", _bool, 0, }, + { 0, 1, 1, & settings.enableARPLogging, "enableARPLogging", _bool, 0, }, + { 0, 1, 1, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", _uint16_t, 0, }, + { 0, 1, 1, & settings.sppRxQueueSize, "sppRxQueueSize", _uint16_t, 0, }, + { 0, 1, 1, & settings.sppTxQueueSize, "sppTxQueueSize", _uint16_t, 0, }, + { 1, 1, 1, & settings.dynamicModel, "dynamicModel", _uint8_t, 0, }, + { 1, 0, 1, & settings.lastState, "lastState", _SystemState, 0, }, + { 0, 1, 1, & settings.enableResetDisplay, "enableResetDisplay", _bool, 0, }, + { 0, 1, 1, & settings.resetCount, "resetCount", _int, 0, }, + { 1, 1, 1, & settings.enableExternalPulse, "enableExternalPulse", _bool, 0, }, + { 1, 1, 1, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", _uint64_t, 0, }, + { 1, 1, 1, & settings.externalPulseLength_us, "externalPulseLength", _uint64_t, 0, }, + { 1, 1, 1, & settings.externalPulsePolarity, "externalPulsePolarity", _pulseEdgeType_e, 0, }, + { 1, 1, 1, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", _bool, 0, }, + { 0, 1, 1, & settings.enableUART2UBXIn, "enableUART2UBXIn", _bool, 0, }, + + { 1, 0, 1, & settings.ubxMessageRates[0], "ubxMessageRate_", _ubxMessageRates, MAX_UBX_MSG, }, + + { 1, 1, 1, & settings.ubxConstellations[0], "ubxConstellation_", _ubxConstellations, MAX_CONSTELLATIONS, }, + + { 0, 0, 1, & settings.profileName, "profileName", _charArray, sizeof(settings.profileName), }, + + { 0, 1, 1, & settings.serialTimeoutGNSS, "serialTimeoutGNSS", _int16_t, 0, }, + + { 0, 1, 1, & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", _charArray, sizeof(settings.pointPerfectDeviceProfileToken), }, + { 0, 1, 1, & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", _bool, 0, }, + { 0, 1, 1, & settings.autoKeyRenewal, "autoKeyRenewal", _bool, 0, }, + { 0, 1, 1, & settings.pointPerfectClientID, "pointPerfectClientID", _charArray, sizeof(settings.pointPerfectClientID), }, + { 0, 1, 1, & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", _charArray, sizeof(settings.pointPerfectBrokerHost), }, + { 0, 1, 1, & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", _charArray, sizeof(settings.pointPerfectKeyDistributionTopic), }, + + { 0, 1, 1, & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", _charArray, sizeof(settings.pointPerfectCurrentKey), }, + { 0, 1, 1, & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", _uint64_t, 0, }, + { 0, 1, 1, & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", _uint64_t, 0, }, + + { 0, 1, 1, & settings.pointPerfectNextKey, "pointPerfectNextKey", _charArray, sizeof(settings.pointPerfectNextKey), }, + { 0, 1, 1, & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", _uint64_t, 0, }, + { 0, 1, 1, & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", _uint64_t, 0, }, + + { 0, 1, 1, & settings.lastKeyAttempt, "lastKeyAttempt", _uint64_t, 0, }, + { 0, 1, 1, & settings.updateGNSSSettings, "updateGNSSSettings", _bool, 0, }, + + { 0, 0, 1, & settings.debugPpCertificate, "debugPpCertificate", _bool, 0, }, + + { 0, 1, 1, & settings.timeZoneHours, "timeZoneHours", _int8_t, 0, }, + { 0, 1, 1, & settings.timeZoneMinutes, "timeZoneMinutes", _int8_t, 0, }, + { 0, 1, 1, & settings.timeZoneSeconds, "timeZoneSeconds", _int8_t, 0, }, + + { 0, 1, 1, & settings.enablePrintState, "enablePrintState", _bool, 0, }, + { 0, 1, 1, & settings.enablePrintPosition, "enablePrintPosition", _bool, 0, }, + { 0, 1, 1, & settings.enablePrintIdleTime, "enablePrintIdleTime", _bool, 0, }, + { 0, 1, 1, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", _bool, 0, }, + { 0, 1, 1, & settings.enablePrintRoverAccuracy, "enablePrintRoverAccuracy", _bool, 0, }, + { 0, 1, 1, & settings.enablePrintBadMessages, "enablePrintBadMessages", _bool, 0, }, + { 0, 1, 1, & settings.enablePrintLogFileMessages, "enablePrintLogFileMessages", _bool, 0, }, + { 0, 1, 1, & settings.enablePrintLogFileStatus, "enablePrintLogFileStatus", _bool, 0, }, + { 0, 1, 1, & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", _bool, 0, }, + { 0, 1, 1, & settings.enablePrintStates, "enablePrintStates", _bool, 0, }, + { 0, 1, 1, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", _bool, 0, }, + { 0, 1, 1, & settings.enablePrintRtcSync, "enablePrintRtcSync", _bool, 0, }, + + { 0, 1, 1, & settings.espnowPeers[0][0], "espnowPeer_", _espnowPeers, ESPNOW_MAX_PEERS, }, + + { 0, 1, 1, & settings.espnowPeerCount, "espnowPeerCount", _uint8_t, 0, }, + { 0, 0, 1, & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", _bool, 0, }, + { 0, 1, 1, & settings.bluetoothRadioType, "bluetoothRadioType", _BluetoothRadioType_e, 0, }, + { 0, 1, 1, & settings.runLogTest, "runLogTest", _bool, 0, }, // Not stored in NVM + { 0, 1, 1, & settings.espnowBroadcast, "espnowBroadcast", _bool, 0, }, + { 0, 1, 1, & settings.antennaHeight, "antennaHeight", _int16_t, 0, }, + { 0, 1, 1, & settings.antennaReferencePoint, "antennaReferencePoint", _float, point2float }, + { 0, 1, 1, & settings.echoUserInput, "echoUserInput", _bool, 0, }, + { 0, 1, 1, & settings.uartReceiveBufferSize, "uartReceiveBufferSize", _int, 0, }, + { 0, 1, 1, & settings.gnssHandlerBufferSize, "gnssHandlerBufferSize", _int, 0, }, + + { 0, 1, 1, & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", _bool, 0, }, + { 0, 1, 1, & settings.enablePrintSDBuffers, "enablePrintSDBuffers", _bool, 0, }, + { 0, 1, 1, & settings.periodicDisplay, "periodicDisplay", _PeriodicDisplay_t, 0, }, + { 0, 1, 1, & settings.periodicDisplayInterval, "periodicDisplayInterval", _uint32_t, 0, }, + + { 0, 1, 1, & settings.rebootSeconds, "rebootSeconds", _uint32_t, 0, }, + { 0, 1, 1, & settings.forceResetOnSDFail, "forceResetOnSDFail", _bool, 0, }, + + { 1, 1, 1, & settings.minElev, "minElev", _uint8_t, 0, }, + + { 1, 0, 1, & settings.ubxMessageRatesBase[0], "ubxMessageRateBase_", _ubxMessageRateBase, MAX_UBX_MSG_RTCM, }, + + { 0, 1, 1, & settings.coordinateInputType, "coordinateInputType", _CoordinateInputType, 0, }, + { 0, 1, 1, & settings.lbandFixTimeout_seconds, "lbandFixTimeout", _uint16_t, 0, }, + { 1, 0, 1, & settings.minCNO, "minCNO", _int16_t, 0, }, + { 0, 1, 1, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", _uint16_t, 0, }, + { 0, 1, 1, & settings.btReadTaskPriority, "btReadTaskPriority", _uint8_t, 0, }, + { 0, 1, 1, & settings.gnssReadTaskPriority, "gnssReadTaskPriority", _uint8_t, 0, }, + { 0, 1, 1, & settings.handleGnssDataTaskPriority, "handleGnssDataTaskPriority", _uint8_t, 0, }, + { 0, 1, 1, & settings.btReadTaskCore, "btReadTaskCore", _uint8_t, 0, }, + { 0, 1, 1, & settings.gnssReadTaskCore, "gnssReadTaskCore", _uint8_t, 0, }, + { 0, 1, 1, & settings.handleGnssDataTaskCore, "handleGnssDataTaskCore", _uint8_t, 0, }, + { 0, 1, 1, & settings.gnssUartInterruptsCore, "gnssUartInterruptsCore", _uint8_t, 0, }, + { 0, 1, 1, & settings.bluetoothInterruptsCore, "bluetoothInterruptsCore", _uint8_t, 0, }, + { 0, 1, 1, & settings.i2cInterruptsCore, "i2cInterruptsCore", _uint8_t, 0, }, + { 0, 1, 1, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", _uint32_t, 0, }, + { 0, 1, 1, & settings.disableSetupButton, "disableSetupButton", _bool, 0, }, + + { 0, 1, 1, & settings.enablePrintEthernetDiag, "enablePrintEthernetDiag", _bool, 0, }, + { 0, 1, 1, & settings.ethernetDHCP, "ethernetDHCP", _bool, 0, }, + { 0, 1, 1, & settings.ethernetIP, "ethernetIP", _IPString, 0, }, + { 0, 1, 1, & settings.ethernetDNS, "ethernetDNS", _IPString, 0, }, + { 0, 1, 1, & settings.ethernetGateway, "ethernetGateway", _IPString, 0, }, + { 0, 1, 1, & settings.ethernetSubnet, "ethernetSubnet", _IPString, 0, }, + { 0, 1, 1, & settings.httpPort, "httpPort", _uint16_t, 0, }, + + { 0, 1, 1, & settings.debugWifiState, "debugWifiState", _bool, 0, }, + { 0, 0, 1, & settings.wifiConfigOverAP, "wifiConfigOverAP", _bool, 0, }, // TODO: check drop downs + + { 0, 1, 1, & settings.wifiNetworks, "wifiNetwork_", _wifiNetwork, MAX_WIFI_NETWORKS, }, + + { 0, 1, 1, & settings.defaultNetworkType, "defaultNetworkType", _uint8_t, 0, }, + { 0, 1, 1, & settings.debugNetworkLayer, "debugNetworkLayer", _bool, 0, }, + { 0, 1, 1, & settings.enableNetworkFailover, "enableNetworkFailover", _bool, 0, }, + { 0, 1, 1, & settings.printNetworkStatus, "printNetworkStatus", _bool, 0, }, + + { 0, 1, 1, & settings.mdnsEnable, "mdnsEnable", _bool, 0, }, + + { 0, 1, 1, & settings.debugMqttClientData, "debugMqttClientData", _bool, 0, }, + { 0, 1, 1, & settings.debugMqttClientState, "debugMqttClientState", _bool, 0, }, + + { 0, 1, 1, & settings.debugNtp, "debugNtp", _bool, 0, }, + { 0, 1, 1, & settings.ethernetNtpPort, "ethernetNtpPort", _uint16_t, 0, }, + { 0, 1, 1, & settings.enableNTPFile, "enableNTPFile", _bool, 0, }, + { 0, 1, 1, & settings.ntpPollExponent, "ntpPollExponent", _uint8_t, 0, }, + { 0, 1, 1, & settings.ntpPrecision, "ntpPrecision", _int8_t, 0, }, + { 0, 1, 1, & settings.ntpRootDelay, "ntpRootDelay", _uint32_t, 0, }, + { 0, 1, 1, & settings.ntpRootDispersion, "ntpRootDispersion", _uint32_t, 0, }, + { 0, 1, 1, & settings.ntpReferenceId, "ntpReferenceId", _charArray, sizeof(settings.ntpReferenceId), }, + + { 0, 1, 1, & settings.debugNtripClientRtcm, "debugNtripClientRtcm", _bool, 0, }, + { 0, 1, 1, & settings.debugNtripClientState, "debugNtripClientState", _bool, 0, }, + { 0, 1, 1, & settings.enableNtripClient, "enableNtripClient", _bool, 0, }, + { 0, 1, 1, & settings.ntripClient_CasterHost, "ntripClientCasterHost", _charArray, sizeof(settings.ntripClient_CasterHost), }, + { 0, 1, 1, & settings.ntripClient_CasterPort, "ntripClientCasterPort", _uint16_t, 0, }, + { 0, 1, 1, & settings.ntripClient_CasterUser, "ntripClientCasterUser", _charArray, sizeof(settings.ntripClient_CasterUser), }, + { 0, 1, 1, & settings.ntripClient_CasterUserPW, "ntripClientCasterUserPW", _charArray, sizeof(settings.ntripClient_CasterUserPW), }, + { 0, 1, 1, & settings.ntripClient_MountPoint, "ntripClientMountPoint", _charArray, sizeof(settings.ntripClient_MountPoint), }, + { 0, 1, 1, & settings.ntripClient_MountPointPW, "ntripClientMountPointPW", _charArray, sizeof(settings.ntripClient_MountPointPW), }, + { 0, 1, 1, & settings.ntripClient_TransmitGGA, "ntripClientTransmitGGA", _bool, 0, }, + + { 0, 1, 1, & settings.debugNtripServerRtcm, "debugNtripServerRtcm", _bool, 0, }, + { 0, 1, 1, & settings.debugNtripServerState, "debugNtripServerState", _bool, 0, }, + { 0, 1, 1, & settings.enableNtripServer, "enableNtripServer", _bool, 0, }, + + { 0, 1, 1, & settings.ntripServer_CasterHost[0], "ntripServerCasterHost_", _ntripServerCasterHost, NTRIP_SERVER_MAX, }, + { 0, 1, 1, & settings.ntripServer_CasterPort[0], "ntripServerCasterPort_", _ntripServerCasterPort, NTRIP_SERVER_MAX, }, + { 0, 1, 1, & settings.ntripServer_CasterUser[0], "ntripServerCasterUser_", _ntripServerCasterUser, NTRIP_SERVER_MAX, }, + { 0, 1, 1, & settings.ntripServer_CasterUserPW[0], "ntripServerCasterUserPW_", _ntripServerCasterUserPW, NTRIP_SERVER_MAX, }, + { 0, 1, 1, & settings.ntripServer_MountPoint[0], "ntripServerMountPoint_", _ntripServerMountPoint, NTRIP_SERVER_MAX, }, + { 0, 1, 1, & settings.ntripServer_MountPointPW[0], "ntripServerMountPointPW_", _ntripServerMountPointPW, NTRIP_SERVER_MAX, }, + + { 0, 1, 1, & settings.debugTcpClient, "debugTcpClient", _bool, 0, }, + { 0, 1, 1, & settings.enableTcpClient, "enableTcpClient", _bool, 0, }, + { 0, 1, 1, & settings.tcpClientPort, "tcpClientPort", _uint16_t, 0, }, + { 0, 1, 1, & settings.tcpClientHost, "tcpClientHost", _charArray, sizeof(settings.tcpClientHost), }, + + { 0, 1, 1, & settings.debugTcpServer, "debugTcpServer", _bool, 0, }, + { 0, 1, 1, & settings.enableTcpServer, "enableTcpServer", _bool, 0, }, + { 0, 1, 1, & settings.tcpServerPort, "tcpServerPort", _uint16_t, 0, }, + + { 0, 1, 1, & settings.debugUdpServer, "debugUdpServer", _bool, 0, }, + { 0, 1, 1, & settings.enableUdpServer, "enableUdpServer", _bool, 0, }, + { 0, 1, 1, & settings.udpServerPort, "udpServerPort", _uint16_t, 0, }, + + { 0, 0, 1, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", _um980MessageRatesNMEA, MAX_UM980_NMEA_MSG, }, + { 0, 0, 1, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", _um980MessageRatesRTCMRover, MAX_UM980_RTCM_MSG, }, + { 0, 0, 1, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", _um980MessageRatesRTCMBase, MAX_UM980_RTCM_MSG, }, + { 0, 1, 1, & settings.um980Constellations, "um980Constellations_", _um980Constellations, MAX_UM980_CONSTELLATIONS, }, + + { 0, 1, 1, & settings.enableTiltCompensation, "enableTiltCompensation", _bool, 0, }, + { 0, 1, 1, & settings.tiltPoleLength, "tiltPoleLength", _float, point3float, }, + { 0, 1, 1, & settings.enableImuDebug, "enableImuDebug", _bool, 0, }, + + { 0, 1, 1, & settings.debugFirmwareUpdate, "debugFirmwareUpdate", _bool, 0, }, + { 0, 1, 1, & settings.enableAutoFirmwareUpdate, "enableAutoFirmwareUpdate", _bool, 0, }, + { 0, 1, 1, & settings.autoFirmwareCheckMinutes, "autoFirmwareCheckMinutes", _uint32_t, 0, }, + + { 0, 1, 1, & settings.debugCorrections, "debugCorrections", _bool, 0, }, + { 0, 1, 1, & settings.enableCaptivePortal, "enableCaptivePortal", _bool, 0, }, + + { 0, 1, 1, & settings.printBootTimes, "printBootTimes", _bool, 0, }, + + { 0, 1, 1, & settings.printPartitionTable, "printPartitionTable", _bool, 0, }, + + { 0, 1, 1, & settings.measurementScale, "measurementScale", _uint8_t, 0, }, + + { 0, 1, 1, & settings.debugWiFiConfig, "debugWiFiConfig", _bool, 0, }, + { 0, 1, 1, & settings.enablePsram, "enablePsram", _bool, 0, }, + { 0, 1, 1, & settings.printTaskStartStop, "printTaskStartStop", _bool, 0, }, + { 0, 1, 1, & settings.psramMallocLevel, "psramMallocLevel", _uint16_t, 0, }, + { 0, 1, 1, & settings.enableBeeper, "enableBeeper", _bool, 0, }, + { 0, 1, 1, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", _bool, 0, }, + + { 0, 1, 1, & settings.correctionsSourcesPriority, "correctionsPriority_", _correctionsSourcesPriority, correctionsSource::CORR_NUM, }, + + { 0, 1, 1, & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", _int, 0, }, - { & settings.geographicRegion, "geographicRegion", _int, 0, false, true, true }, + { 0, 1, 1, & settings.geographicRegion, "geographicRegion", _int, 0, }, - { & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", _regionalCorrectionTopics, numRegionalAreas, false, true, true }, + { 0, 1, 1, & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", _regionalCorrectionTopics, numRegionalAreas, }, - { & settings.debugEspNow, "debugEspNow", _bool, 0, false, true, true }, - { & settings.enableEspNow, "enableEspNow", _bool, 0, false, true, true }, - { & settings.wifiChannel, "wifiChannel", _uint8_t, 0, false, true, true }, - { & settings.enableGalileoHas, "enableGalileoHas", _bool, 0, false, true, true }, + { 0, 1, 1, & settings.debugEspNow, "debugEspNow", _bool, 0, }, + { 0, 1, 1, & settings.enableEspNow, "enableEspNow", _bool, 0, }, + { 0, 1, 1, & settings.wifiChannel, "wifiChannel", _uint8_t, 0, }, + { 0, 1, 1, & settings.enableGalileoHas, "enableGalileoHas", _bool, 0, }, - { & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", _bool, 0, false, true, true }, - { & settings.pplFixTimeoutS, "pplFixTimeoutS", _uint16_t, 0, false, true, true }, + { 0, 1, 1, & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", _bool, 0, }, + { 0, 1, 1, & settings.pplFixTimeoutS, "pplFixTimeoutS", _uint16_t, 0, }, // Add new settings above <------------------------------------------------------------> /* - { & settings., "", , 0, false, true }, + { 0, 1, 1, & settings., "", type, 0, }, */ }; From 2f17438280e8c6456d582a71a9e85165b479b541 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 18 May 2024 10:10:36 -1000 Subject: [PATCH 056/358] Move type columns in RTK_Settings_Entry and rtkSettingsEntries --- Firmware/RTK_Everywhere/settings.h | 474 ++++++++++++++--------------- 1 file changed, 237 insertions(+), 237 deletions(-) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index dc2681e0d..01f3f5aad 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1370,10 +1370,10 @@ typedef struct bool updateGNSSOnChange; bool inSettingsString; bool inCommands; - void *var; - const char *name; RTK_Settings_Types type; int qualifier; + void *var; + const char *name; } RTK_Settings_Entry; enum Settings_float_Precision @@ -1394,242 +1394,242 @@ const RTK_Settings_Entry rtkSettingsEntries[] = // N e m // S t d // S t s Type Qual Name Variable - { 0, 1, 1, & settings.enableSD, "enableSD", _bool, 0}, - { 0, 1, 1, & settings.maxLogTime_minutes, "maxLogTime", _int, 0}, - { 0, 1, 1, & settings.maxLogLength_minutes, "maxLogLength", _int, 0, }, - { 1, 1, 1, & settings.observationSeconds, "observationSeconds", _int, 0, }, - { 1, 1, 1, & settings.observationPositionAccuracy, "observationPositionAccuracy", _float, point2float, }, - { 1, 0, 1, & settings.fixedBase, "fixedBase", _bool, 0, }, - { 1, 0, 1, & settings.fixedBaseCoordinateType, "fixedBaseCoordinateType", _bool, 0, }, - { 1, 1, 1, & settings.fixedEcefX, "fixedEcefX", _double, point3float, }, - { 1, 1, 1, & settings.fixedEcefY, "fixedEcefY", _double, point3float, }, - { 1, 1, 1, & settings.fixedEcefZ, "fixedEcefZ", _double, point3float, }, - { 1, 1, 1, & settings.fixedLat, "fixedLat", _double, point9float, }, - { 1, 1, 1, & settings.fixedLong, "fixedLong", _double, point9float, }, - { 1, 1, 1, & settings.fixedAltitude, "fixedAltitude", _double, point4float, }, - { 1, 1, 1, & settings.dataPortBaud, "dataPortBaud", _uint32_t, 0, }, - { 1, 1, 1, & settings.radioPortBaud, "radioPortBaud", _uint32_t, 0, }, - { 1, 1, 1, & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", _float, point1float, }, - { 1, 0, 1, & settings.measurementRateMs, "measurementRateMs", _uint16_t, 0, }, - { 1, 0, 1, & settings.navigationRate, "navigationRate", _uint16_t, 0, }, - { 0, 1, 1, & settings.debugGnss, "debugGnss", _bool, 0, }, - { 0, 1, 1, & settings.enableHeapReport, "enableHeapReport", _bool, 0, }, - { 0, 1, 1, & settings.enableTaskReports, "enableTaskReports", _bool, 0, }, - { 0, 1, 1, & settings.dataPortChannel, "dataPortChannel", _muxConnectionType_e, 0, }, - { 0, 1, 1, & settings.spiFrequency, "spiFrequency", _uint16_t, 0, }, - { 0, 1, 1, & settings.enableLogging, "enableLogging", _bool, 0, }, - { 0, 1, 1, & settings.enableARPLogging, "enableARPLogging", _bool, 0, }, - { 0, 1, 1, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", _uint16_t, 0, }, - { 0, 1, 1, & settings.sppRxQueueSize, "sppRxQueueSize", _uint16_t, 0, }, - { 0, 1, 1, & settings.sppTxQueueSize, "sppTxQueueSize", _uint16_t, 0, }, - { 1, 1, 1, & settings.dynamicModel, "dynamicModel", _uint8_t, 0, }, - { 1, 0, 1, & settings.lastState, "lastState", _SystemState, 0, }, - { 0, 1, 1, & settings.enableResetDisplay, "enableResetDisplay", _bool, 0, }, - { 0, 1, 1, & settings.resetCount, "resetCount", _int, 0, }, - { 1, 1, 1, & settings.enableExternalPulse, "enableExternalPulse", _bool, 0, }, - { 1, 1, 1, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", _uint64_t, 0, }, - { 1, 1, 1, & settings.externalPulseLength_us, "externalPulseLength", _uint64_t, 0, }, - { 1, 1, 1, & settings.externalPulsePolarity, "externalPulsePolarity", _pulseEdgeType_e, 0, }, - { 1, 1, 1, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", _bool, 0, }, - { 0, 1, 1, & settings.enableUART2UBXIn, "enableUART2UBXIn", _bool, 0, }, - - { 1, 0, 1, & settings.ubxMessageRates[0], "ubxMessageRate_", _ubxMessageRates, MAX_UBX_MSG, }, - - { 1, 1, 1, & settings.ubxConstellations[0], "ubxConstellation_", _ubxConstellations, MAX_CONSTELLATIONS, }, - - { 0, 0, 1, & settings.profileName, "profileName", _charArray, sizeof(settings.profileName), }, - - { 0, 1, 1, & settings.serialTimeoutGNSS, "serialTimeoutGNSS", _int16_t, 0, }, - - { 0, 1, 1, & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", _charArray, sizeof(settings.pointPerfectDeviceProfileToken), }, - { 0, 1, 1, & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", _bool, 0, }, - { 0, 1, 1, & settings.autoKeyRenewal, "autoKeyRenewal", _bool, 0, }, - { 0, 1, 1, & settings.pointPerfectClientID, "pointPerfectClientID", _charArray, sizeof(settings.pointPerfectClientID), }, - { 0, 1, 1, & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", _charArray, sizeof(settings.pointPerfectBrokerHost), }, - { 0, 1, 1, & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", _charArray, sizeof(settings.pointPerfectKeyDistributionTopic), }, - - { 0, 1, 1, & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", _charArray, sizeof(settings.pointPerfectCurrentKey), }, - { 0, 1, 1, & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", _uint64_t, 0, }, - { 0, 1, 1, & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", _uint64_t, 0, }, - - { 0, 1, 1, & settings.pointPerfectNextKey, "pointPerfectNextKey", _charArray, sizeof(settings.pointPerfectNextKey), }, - { 0, 1, 1, & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", _uint64_t, 0, }, - { 0, 1, 1, & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", _uint64_t, 0, }, - - { 0, 1, 1, & settings.lastKeyAttempt, "lastKeyAttempt", _uint64_t, 0, }, - { 0, 1, 1, & settings.updateGNSSSettings, "updateGNSSSettings", _bool, 0, }, - - { 0, 0, 1, & settings.debugPpCertificate, "debugPpCertificate", _bool, 0, }, - - { 0, 1, 1, & settings.timeZoneHours, "timeZoneHours", _int8_t, 0, }, - { 0, 1, 1, & settings.timeZoneMinutes, "timeZoneMinutes", _int8_t, 0, }, - { 0, 1, 1, & settings.timeZoneSeconds, "timeZoneSeconds", _int8_t, 0, }, - - { 0, 1, 1, & settings.enablePrintState, "enablePrintState", _bool, 0, }, - { 0, 1, 1, & settings.enablePrintPosition, "enablePrintPosition", _bool, 0, }, - { 0, 1, 1, & settings.enablePrintIdleTime, "enablePrintIdleTime", _bool, 0, }, - { 0, 1, 1, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", _bool, 0, }, - { 0, 1, 1, & settings.enablePrintRoverAccuracy, "enablePrintRoverAccuracy", _bool, 0, }, - { 0, 1, 1, & settings.enablePrintBadMessages, "enablePrintBadMessages", _bool, 0, }, - { 0, 1, 1, & settings.enablePrintLogFileMessages, "enablePrintLogFileMessages", _bool, 0, }, - { 0, 1, 1, & settings.enablePrintLogFileStatus, "enablePrintLogFileStatus", _bool, 0, }, - { 0, 1, 1, & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", _bool, 0, }, - { 0, 1, 1, & settings.enablePrintStates, "enablePrintStates", _bool, 0, }, - { 0, 1, 1, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", _bool, 0, }, - { 0, 1, 1, & settings.enablePrintRtcSync, "enablePrintRtcSync", _bool, 0, }, - - { 0, 1, 1, & settings.espnowPeers[0][0], "espnowPeer_", _espnowPeers, ESPNOW_MAX_PEERS, }, - - { 0, 1, 1, & settings.espnowPeerCount, "espnowPeerCount", _uint8_t, 0, }, - { 0, 0, 1, & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", _bool, 0, }, - { 0, 1, 1, & settings.bluetoothRadioType, "bluetoothRadioType", _BluetoothRadioType_e, 0, }, - { 0, 1, 1, & settings.runLogTest, "runLogTest", _bool, 0, }, // Not stored in NVM - { 0, 1, 1, & settings.espnowBroadcast, "espnowBroadcast", _bool, 0, }, - { 0, 1, 1, & settings.antennaHeight, "antennaHeight", _int16_t, 0, }, - { 0, 1, 1, & settings.antennaReferencePoint, "antennaReferencePoint", _float, point2float }, - { 0, 1, 1, & settings.echoUserInput, "echoUserInput", _bool, 0, }, - { 0, 1, 1, & settings.uartReceiveBufferSize, "uartReceiveBufferSize", _int, 0, }, - { 0, 1, 1, & settings.gnssHandlerBufferSize, "gnssHandlerBufferSize", _int, 0, }, - - { 0, 1, 1, & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", _bool, 0, }, - { 0, 1, 1, & settings.enablePrintSDBuffers, "enablePrintSDBuffers", _bool, 0, }, - { 0, 1, 1, & settings.periodicDisplay, "periodicDisplay", _PeriodicDisplay_t, 0, }, - { 0, 1, 1, & settings.periodicDisplayInterval, "periodicDisplayInterval", _uint32_t, 0, }, - - { 0, 1, 1, & settings.rebootSeconds, "rebootSeconds", _uint32_t, 0, }, - { 0, 1, 1, & settings.forceResetOnSDFail, "forceResetOnSDFail", _bool, 0, }, - - { 1, 1, 1, & settings.minElev, "minElev", _uint8_t, 0, }, - - { 1, 0, 1, & settings.ubxMessageRatesBase[0], "ubxMessageRateBase_", _ubxMessageRateBase, MAX_UBX_MSG_RTCM, }, - - { 0, 1, 1, & settings.coordinateInputType, "coordinateInputType", _CoordinateInputType, 0, }, - { 0, 1, 1, & settings.lbandFixTimeout_seconds, "lbandFixTimeout", _uint16_t, 0, }, - { 1, 0, 1, & settings.minCNO, "minCNO", _int16_t, 0, }, - { 0, 1, 1, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", _uint16_t, 0, }, - { 0, 1, 1, & settings.btReadTaskPriority, "btReadTaskPriority", _uint8_t, 0, }, - { 0, 1, 1, & settings.gnssReadTaskPriority, "gnssReadTaskPriority", _uint8_t, 0, }, - { 0, 1, 1, & settings.handleGnssDataTaskPriority, "handleGnssDataTaskPriority", _uint8_t, 0, }, - { 0, 1, 1, & settings.btReadTaskCore, "btReadTaskCore", _uint8_t, 0, }, - { 0, 1, 1, & settings.gnssReadTaskCore, "gnssReadTaskCore", _uint8_t, 0, }, - { 0, 1, 1, & settings.handleGnssDataTaskCore, "handleGnssDataTaskCore", _uint8_t, 0, }, - { 0, 1, 1, & settings.gnssUartInterruptsCore, "gnssUartInterruptsCore", _uint8_t, 0, }, - { 0, 1, 1, & settings.bluetoothInterruptsCore, "bluetoothInterruptsCore", _uint8_t, 0, }, - { 0, 1, 1, & settings.i2cInterruptsCore, "i2cInterruptsCore", _uint8_t, 0, }, - { 0, 1, 1, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", _uint32_t, 0, }, - { 0, 1, 1, & settings.disableSetupButton, "disableSetupButton", _bool, 0, }, - - { 0, 1, 1, & settings.enablePrintEthernetDiag, "enablePrintEthernetDiag", _bool, 0, }, - { 0, 1, 1, & settings.ethernetDHCP, "ethernetDHCP", _bool, 0, }, - { 0, 1, 1, & settings.ethernetIP, "ethernetIP", _IPString, 0, }, - { 0, 1, 1, & settings.ethernetDNS, "ethernetDNS", _IPString, 0, }, - { 0, 1, 1, & settings.ethernetGateway, "ethernetGateway", _IPString, 0, }, - { 0, 1, 1, & settings.ethernetSubnet, "ethernetSubnet", _IPString, 0, }, - { 0, 1, 1, & settings.httpPort, "httpPort", _uint16_t, 0, }, - - { 0, 1, 1, & settings.debugWifiState, "debugWifiState", _bool, 0, }, - { 0, 0, 1, & settings.wifiConfigOverAP, "wifiConfigOverAP", _bool, 0, }, // TODO: check drop downs - - { 0, 1, 1, & settings.wifiNetworks, "wifiNetwork_", _wifiNetwork, MAX_WIFI_NETWORKS, }, - - { 0, 1, 1, & settings.defaultNetworkType, "defaultNetworkType", _uint8_t, 0, }, - { 0, 1, 1, & settings.debugNetworkLayer, "debugNetworkLayer", _bool, 0, }, - { 0, 1, 1, & settings.enableNetworkFailover, "enableNetworkFailover", _bool, 0, }, - { 0, 1, 1, & settings.printNetworkStatus, "printNetworkStatus", _bool, 0, }, - - { 0, 1, 1, & settings.mdnsEnable, "mdnsEnable", _bool, 0, }, - - { 0, 1, 1, & settings.debugMqttClientData, "debugMqttClientData", _bool, 0, }, - { 0, 1, 1, & settings.debugMqttClientState, "debugMqttClientState", _bool, 0, }, - - { 0, 1, 1, & settings.debugNtp, "debugNtp", _bool, 0, }, - { 0, 1, 1, & settings.ethernetNtpPort, "ethernetNtpPort", _uint16_t, 0, }, - { 0, 1, 1, & settings.enableNTPFile, "enableNTPFile", _bool, 0, }, - { 0, 1, 1, & settings.ntpPollExponent, "ntpPollExponent", _uint8_t, 0, }, - { 0, 1, 1, & settings.ntpPrecision, "ntpPrecision", _int8_t, 0, }, - { 0, 1, 1, & settings.ntpRootDelay, "ntpRootDelay", _uint32_t, 0, }, - { 0, 1, 1, & settings.ntpRootDispersion, "ntpRootDispersion", _uint32_t, 0, }, - { 0, 1, 1, & settings.ntpReferenceId, "ntpReferenceId", _charArray, sizeof(settings.ntpReferenceId), }, - - { 0, 1, 1, & settings.debugNtripClientRtcm, "debugNtripClientRtcm", _bool, 0, }, - { 0, 1, 1, & settings.debugNtripClientState, "debugNtripClientState", _bool, 0, }, - { 0, 1, 1, & settings.enableNtripClient, "enableNtripClient", _bool, 0, }, - { 0, 1, 1, & settings.ntripClient_CasterHost, "ntripClientCasterHost", _charArray, sizeof(settings.ntripClient_CasterHost), }, - { 0, 1, 1, & settings.ntripClient_CasterPort, "ntripClientCasterPort", _uint16_t, 0, }, - { 0, 1, 1, & settings.ntripClient_CasterUser, "ntripClientCasterUser", _charArray, sizeof(settings.ntripClient_CasterUser), }, - { 0, 1, 1, & settings.ntripClient_CasterUserPW, "ntripClientCasterUserPW", _charArray, sizeof(settings.ntripClient_CasterUserPW), }, - { 0, 1, 1, & settings.ntripClient_MountPoint, "ntripClientMountPoint", _charArray, sizeof(settings.ntripClient_MountPoint), }, - { 0, 1, 1, & settings.ntripClient_MountPointPW, "ntripClientMountPointPW", _charArray, sizeof(settings.ntripClient_MountPointPW), }, - { 0, 1, 1, & settings.ntripClient_TransmitGGA, "ntripClientTransmitGGA", _bool, 0, }, - - { 0, 1, 1, & settings.debugNtripServerRtcm, "debugNtripServerRtcm", _bool, 0, }, - { 0, 1, 1, & settings.debugNtripServerState, "debugNtripServerState", _bool, 0, }, - { 0, 1, 1, & settings.enableNtripServer, "enableNtripServer", _bool, 0, }, - - { 0, 1, 1, & settings.ntripServer_CasterHost[0], "ntripServerCasterHost_", _ntripServerCasterHost, NTRIP_SERVER_MAX, }, - { 0, 1, 1, & settings.ntripServer_CasterPort[0], "ntripServerCasterPort_", _ntripServerCasterPort, NTRIP_SERVER_MAX, }, - { 0, 1, 1, & settings.ntripServer_CasterUser[0], "ntripServerCasterUser_", _ntripServerCasterUser, NTRIP_SERVER_MAX, }, - { 0, 1, 1, & settings.ntripServer_CasterUserPW[0], "ntripServerCasterUserPW_", _ntripServerCasterUserPW, NTRIP_SERVER_MAX, }, - { 0, 1, 1, & settings.ntripServer_MountPoint[0], "ntripServerMountPoint_", _ntripServerMountPoint, NTRIP_SERVER_MAX, }, - { 0, 1, 1, & settings.ntripServer_MountPointPW[0], "ntripServerMountPointPW_", _ntripServerMountPointPW, NTRIP_SERVER_MAX, }, - - { 0, 1, 1, & settings.debugTcpClient, "debugTcpClient", _bool, 0, }, - { 0, 1, 1, & settings.enableTcpClient, "enableTcpClient", _bool, 0, }, - { 0, 1, 1, & settings.tcpClientPort, "tcpClientPort", _uint16_t, 0, }, - { 0, 1, 1, & settings.tcpClientHost, "tcpClientHost", _charArray, sizeof(settings.tcpClientHost), }, - - { 0, 1, 1, & settings.debugTcpServer, "debugTcpServer", _bool, 0, }, - { 0, 1, 1, & settings.enableTcpServer, "enableTcpServer", _bool, 0, }, - { 0, 1, 1, & settings.tcpServerPort, "tcpServerPort", _uint16_t, 0, }, - - { 0, 1, 1, & settings.debugUdpServer, "debugUdpServer", _bool, 0, }, - { 0, 1, 1, & settings.enableUdpServer, "enableUdpServer", _bool, 0, }, - { 0, 1, 1, & settings.udpServerPort, "udpServerPort", _uint16_t, 0, }, - - { 0, 0, 1, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", _um980MessageRatesNMEA, MAX_UM980_NMEA_MSG, }, - { 0, 0, 1, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", _um980MessageRatesRTCMRover, MAX_UM980_RTCM_MSG, }, - { 0, 0, 1, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", _um980MessageRatesRTCMBase, MAX_UM980_RTCM_MSG, }, - { 0, 1, 1, & settings.um980Constellations, "um980Constellations_", _um980Constellations, MAX_UM980_CONSTELLATIONS, }, - - { 0, 1, 1, & settings.enableTiltCompensation, "enableTiltCompensation", _bool, 0, }, - { 0, 1, 1, & settings.tiltPoleLength, "tiltPoleLength", _float, point3float, }, - { 0, 1, 1, & settings.enableImuDebug, "enableImuDebug", _bool, 0, }, - - { 0, 1, 1, & settings.debugFirmwareUpdate, "debugFirmwareUpdate", _bool, 0, }, - { 0, 1, 1, & settings.enableAutoFirmwareUpdate, "enableAutoFirmwareUpdate", _bool, 0, }, - { 0, 1, 1, & settings.autoFirmwareCheckMinutes, "autoFirmwareCheckMinutes", _uint32_t, 0, }, - - { 0, 1, 1, & settings.debugCorrections, "debugCorrections", _bool, 0, }, - { 0, 1, 1, & settings.enableCaptivePortal, "enableCaptivePortal", _bool, 0, }, - - { 0, 1, 1, & settings.printBootTimes, "printBootTimes", _bool, 0, }, - - { 0, 1, 1, & settings.printPartitionTable, "printPartitionTable", _bool, 0, }, - - { 0, 1, 1, & settings.measurementScale, "measurementScale", _uint8_t, 0, }, - - { 0, 1, 1, & settings.debugWiFiConfig, "debugWiFiConfig", _bool, 0, }, - { 0, 1, 1, & settings.enablePsram, "enablePsram", _bool, 0, }, - { 0, 1, 1, & settings.printTaskStartStop, "printTaskStartStop", _bool, 0, }, - { 0, 1, 1, & settings.psramMallocLevel, "psramMallocLevel", _uint16_t, 0, }, - { 0, 1, 1, & settings.enableBeeper, "enableBeeper", _bool, 0, }, - { 0, 1, 1, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", _bool, 0, }, - - { 0, 1, 1, & settings.correctionsSourcesPriority, "correctionsPriority_", _correctionsSourcesPriority, correctionsSource::CORR_NUM, }, - - { 0, 1, 1, & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", _int, 0, }, - - { 0, 1, 1, & settings.geographicRegion, "geographicRegion", _int, 0, }, - - { 0, 1, 1, & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", _regionalCorrectionTopics, numRegionalAreas, }, - - { 0, 1, 1, & settings.debugEspNow, "debugEspNow", _bool, 0, }, - { 0, 1, 1, & settings.enableEspNow, "enableEspNow", _bool, 0, }, - { 0, 1, 1, & settings.wifiChannel, "wifiChannel", _uint8_t, 0, }, - { 0, 1, 1, & settings.enableGalileoHas, "enableGalileoHas", _bool, 0, }, + { 0, 1, 1, _bool, 0, & settings.enableSD, "enableSD"}, + { 0, 1, 1, _int, 0, & settings.maxLogTime_minutes, "maxLogTime"}, + { 0, 1, 1, _int, 0, & settings.maxLogLength_minutes, "maxLogLength", }, + { 1, 1, 1, _int, 0, & settings.observationSeconds, "observationSeconds", }, + { 1, 1, 1, _float, point2float, & settings.observationPositionAccuracy, "observationPositionAccuracy", }, + { 1, 0, 1, _bool, 0, & settings.fixedBase, "fixedBase", }, + { 1, 0, 1, _bool, 0, & settings.fixedBaseCoordinateType, "fixedBaseCoordinateType", }, + { 1, 1, 1, _double, point3float, & settings.fixedEcefX, "fixedEcefX", }, + { 1, 1, 1, _double, point3float, & settings.fixedEcefY, "fixedEcefY", }, + { 1, 1, 1, _double, point3float, & settings.fixedEcefZ, "fixedEcefZ", }, + { 1, 1, 1, _double, point9float, & settings.fixedLat, "fixedLat", }, + { 1, 1, 1, _double, point9float, & settings.fixedLong, "fixedLong", }, + { 1, 1, 1, _double, point4float, & settings.fixedAltitude, "fixedAltitude", }, + { 1, 1, 1, _uint32_t, 0, & settings.dataPortBaud, "dataPortBaud", }, + { 1, 1, 1, _uint32_t, 0, & settings.radioPortBaud, "radioPortBaud", }, + { 1, 1, 1, _float, point1float, & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", }, + { 1, 0, 1, _uint16_t, 0, & settings.measurementRateMs, "measurementRateMs", }, + { 1, 0, 1, _uint16_t, 0, & settings.navigationRate, "navigationRate", }, + { 0, 1, 1, _bool, 0, & settings.debugGnss, "debugGnss", }, + { 0, 1, 1, _bool, 0, & settings.enableHeapReport, "enableHeapReport", }, + { 0, 1, 1, _bool, 0, & settings.enableTaskReports, "enableTaskReports", }, + { 0, 1, 1, _muxConnectionType_e, 0, & settings.dataPortChannel, "dataPortChannel", }, + { 0, 1, 1, _uint16_t, 0, & settings.spiFrequency, "spiFrequency", }, + { 0, 1, 1, _bool, 0, & settings.enableLogging, "enableLogging", }, + { 0, 1, 1, _bool, 0, & settings.enableARPLogging, "enableARPLogging", }, + { 0, 1, 1, _uint16_t, 0, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", }, + { 0, 1, 1, _uint16_t, 0, & settings.sppRxQueueSize, "sppRxQueueSize", }, + { 0, 1, 1, _uint16_t, 0, & settings.sppTxQueueSize, "sppTxQueueSize", }, + { 1, 1, 1, _uint8_t, 0, & settings.dynamicModel, "dynamicModel", }, + { 1, 0, 1, _SystemState, 0, & settings.lastState, "lastState", }, + { 0, 1, 1, _bool, 0, & settings.enableResetDisplay, "enableResetDisplay", }, + { 0, 1, 1, _int, 0, & settings.resetCount, "resetCount", }, + { 1, 1, 1, _bool, 0, & settings.enableExternalPulse, "enableExternalPulse", }, + { 1, 1, 1, _uint64_t, 0, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", }, + { 1, 1, 1, _uint64_t, 0, & settings.externalPulseLength_us, "externalPulseLength", }, + { 1, 1, 1, _pulseEdgeType_e, 0, & settings.externalPulsePolarity, "externalPulsePolarity", }, + { 1, 1, 1, _bool, 0, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", }, + { 0, 1, 1, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, + + { 1, 0, 1, _ubxMessageRates, MAX_UBX_MSG, & settings.ubxMessageRates[0], "ubxMessageRate_", }, + + { 1, 1, 1, _ubxConstellations, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "ubxConstellation_", }, + + { 0, 0, 1, _charArray, sizeof(settings.profileName), & settings.profileName, "profileName", }, + + { 0, 1, 1, _int16_t, 0, & settings.serialTimeoutGNSS, "serialTimeoutGNSS", }, + + { 0, 1, 1, _charArray, sizeof(settings.pointPerfectDeviceProfileToken), & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", }, + { 0, 1, 1, _bool, 0, & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", }, + { 0, 1, 1, _bool, 0, & settings.autoKeyRenewal, "autoKeyRenewal", }, + { 0, 1, 1, _charArray, sizeof(settings.pointPerfectClientID), & settings.pointPerfectClientID, "pointPerfectClientID", }, + { 0, 1, 1, _charArray, sizeof(settings.pointPerfectBrokerHost), & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", }, + { 0, 1, 1, _charArray, sizeof(settings.pointPerfectKeyDistributionTopic), & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", }, + + { 0, 1, 1, _charArray, sizeof(settings.pointPerfectCurrentKey), & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", }, + { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", }, + { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", }, + + { 0, 1, 1, _charArray, sizeof(settings.pointPerfectNextKey), & settings.pointPerfectNextKey, "pointPerfectNextKey", }, + { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", }, + { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", }, + + { 0, 1, 1, _uint64_t, 0, & settings.lastKeyAttempt, "lastKeyAttempt", }, + { 0, 1, 1, _bool, 0, & settings.updateGNSSSettings, "updateGNSSSettings", }, + + { 0, 0, 1, _bool, 0, & settings.debugPpCertificate, "debugPpCertificate", }, + + { 0, 1, 1, _int8_t, 0, & settings.timeZoneHours, "timeZoneHours", }, + { 0, 1, 1, _int8_t, 0, & settings.timeZoneMinutes, "timeZoneMinutes", }, + { 0, 1, 1, _int8_t, 0, & settings.timeZoneSeconds, "timeZoneSeconds", }, + + { 0, 1, 1, _bool, 0, & settings.enablePrintState, "enablePrintState", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintPosition, "enablePrintPosition", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintIdleTime, "enablePrintIdleTime", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintRoverAccuracy, "enablePrintRoverAccuracy", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintBadMessages, "enablePrintBadMessages", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintLogFileMessages, "enablePrintLogFileMessages", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintLogFileStatus, "enablePrintLogFileStatus", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintStates, "enablePrintStates", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintRtcSync, "enablePrintRtcSync", }, + + { 0, 1, 1, _espnowPeers, ESPNOW_MAX_PEERS, & settings.espnowPeers[0][0], "espnowPeer_", }, + + { 0, 1, 1, _uint8_t, 0, & settings.espnowPeerCount, "espnowPeerCount", }, + { 0, 0, 1, _bool, 0, & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", }, + { 0, 1, 1, _BluetoothRadioType_e, 0, & settings.bluetoothRadioType, "bluetoothRadioType", }, + { 0, 1, 1, _bool, 0, & settings.runLogTest, "runLogTest", }, // Not stored in NVM + { 0, 1, 1, _bool, 0, & settings.espnowBroadcast, "espnowBroadcast", }, + { 0, 1, 1, _int16_t, 0, & settings.antennaHeight, "antennaHeight", }, + { 0, 1, 1, _float, point2float, & settings.antennaReferencePoint, "antennaReferencePoint" }, + { 0, 1, 1, _bool, 0, & settings.echoUserInput, "echoUserInput", }, + { 0, 1, 1, _int, 0, & settings.uartReceiveBufferSize, "uartReceiveBufferSize", }, + { 0, 1, 1, _int, 0, & settings.gnssHandlerBufferSize, "gnssHandlerBufferSize", }, + + { 0, 1, 1, _bool, 0, & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintSDBuffers, "enablePrintSDBuffers", }, + { 0, 1, 1, _PeriodicDisplay_t, 0, & settings.periodicDisplay, "periodicDisplay", }, + { 0, 1, 1, _uint32_t, 0, & settings.periodicDisplayInterval, "periodicDisplayInterval", }, + + { 0, 1, 1, _uint32_t, 0, & settings.rebootSeconds, "rebootSeconds", }, + { 0, 1, 1, _bool, 0, & settings.forceResetOnSDFail, "forceResetOnSDFail", }, + + { 1, 1, 1, _uint8_t, 0, & settings.minElev, "minElev", }, + + { 1, 0, 1, _ubxMessageRateBase, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "ubxMessageRateBase_", }, + + { 0, 1, 1, _CoordinateInputType, 0, & settings.coordinateInputType, "coordinateInputType", }, + { 0, 1, 1, _uint16_t, 0, & settings.lbandFixTimeout_seconds, "lbandFixTimeout", }, + { 1, 0, 1, _int16_t, 0, & settings.minCNO, "minCNO", }, + { 0, 1, 1, _uint16_t, 0, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", }, + { 0, 1, 1, _uint8_t, 0, & settings.btReadTaskPriority, "btReadTaskPriority", }, + { 0, 1, 1, _uint8_t, 0, & settings.gnssReadTaskPriority, "gnssReadTaskPriority", }, + { 0, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskPriority, "handleGnssDataTaskPriority", }, + { 0, 1, 1, _uint8_t, 0, & settings.btReadTaskCore, "btReadTaskCore", }, + { 0, 1, 1, _uint8_t, 0, & settings.gnssReadTaskCore, "gnssReadTaskCore", }, + { 0, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskCore, "handleGnssDataTaskCore", }, + { 0, 1, 1, _uint8_t, 0, & settings.gnssUartInterruptsCore, "gnssUartInterruptsCore", }, + { 0, 1, 1, _uint8_t, 0, & settings.bluetoothInterruptsCore, "bluetoothInterruptsCore", }, + { 0, 1, 1, _uint8_t, 0, & settings.i2cInterruptsCore, "i2cInterruptsCore", }, + { 0, 1, 1, _uint32_t, 0, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", }, + { 0, 1, 1, _bool, 0, & settings.disableSetupButton, "disableSetupButton", }, + + { 0, 1, 1, _bool, 0, & settings.enablePrintEthernetDiag, "enablePrintEthernetDiag", }, + { 0, 1, 1, _bool, 0, & settings.ethernetDHCP, "ethernetDHCP", }, + { 0, 1, 1, _IPString, 0, & settings.ethernetIP, "ethernetIP", }, + { 0, 1, 1, _IPString, 0, & settings.ethernetDNS, "ethernetDNS", }, + { 0, 1, 1, _IPString, 0, & settings.ethernetGateway, "ethernetGateway", }, + { 0, 1, 1, _IPString, 0, & settings.ethernetSubnet, "ethernetSubnet", }, + { 0, 1, 1, _uint16_t, 0, & settings.httpPort, "httpPort", }, + + { 0, 1, 1, _bool, 0, & settings.debugWifiState, "debugWifiState", }, + { 0, 0, 1, _bool, 0, & settings.wifiConfigOverAP, "wifiConfigOverAP", }, // TODO: check drop downs + + { 0, 1, 1, _wifiNetwork, MAX_WIFI_NETWORKS, & settings.wifiNetworks, "wifiNetwork_", }, + + { 0, 1, 1, _uint8_t, 0, & settings.defaultNetworkType, "defaultNetworkType", }, + { 0, 1, 1, _bool, 0, & settings.debugNetworkLayer, "debugNetworkLayer", }, + { 0, 1, 1, _bool, 0, & settings.enableNetworkFailover, "enableNetworkFailover", }, + { 0, 1, 1, _bool, 0, & settings.printNetworkStatus, "printNetworkStatus", }, + + { 0, 1, 1, _bool, 0, & settings.mdnsEnable, "mdnsEnable", }, + + { 0, 1, 1, _bool, 0, & settings.debugMqttClientData, "debugMqttClientData", }, + { 0, 1, 1, _bool, 0, & settings.debugMqttClientState, "debugMqttClientState", }, + + { 0, 1, 1, _bool, 0, & settings.debugNtp, "debugNtp", }, + { 0, 1, 1, _uint16_t, 0, & settings.ethernetNtpPort, "ethernetNtpPort", }, + { 0, 1, 1, _bool, 0, & settings.enableNTPFile, "enableNTPFile", }, + { 0, 1, 1, _uint8_t, 0, & settings.ntpPollExponent, "ntpPollExponent", }, + { 0, 1, 1, _int8_t, 0, & settings.ntpPrecision, "ntpPrecision", }, + { 0, 1, 1, _uint32_t, 0, & settings.ntpRootDelay, "ntpRootDelay", }, + { 0, 1, 1, _uint32_t, 0, & settings.ntpRootDispersion, "ntpRootDispersion", }, + { 0, 1, 1, _charArray, sizeof(settings.ntpReferenceId), & settings.ntpReferenceId, "ntpReferenceId", }, + + { 0, 1, 1, _bool, 0, & settings.debugNtripClientRtcm, "debugNtripClientRtcm", }, + { 0, 1, 1, _bool, 0, & settings.debugNtripClientState, "debugNtripClientState", }, + { 0, 1, 1, _bool, 0, & settings.enableNtripClient, "enableNtripClient", }, + { 0, 1, 1, _charArray, sizeof(settings.ntripClient_CasterHost), & settings.ntripClient_CasterHost, "ntripClientCasterHost", }, + { 0, 1, 1, _uint16_t, 0, & settings.ntripClient_CasterPort, "ntripClientCasterPort", }, + { 0, 1, 1, _charArray, sizeof(settings.ntripClient_CasterUser), & settings.ntripClient_CasterUser, "ntripClientCasterUser", }, + { 0, 1, 1, _charArray, sizeof(settings.ntripClient_CasterUserPW), & settings.ntripClient_CasterUserPW, "ntripClientCasterUserPW", }, + { 0, 1, 1, _charArray, sizeof(settings.ntripClient_MountPoint), & settings.ntripClient_MountPoint, "ntripClientMountPoint", }, + { 0, 1, 1, _charArray, sizeof(settings.ntripClient_MountPointPW), & settings.ntripClient_MountPointPW, "ntripClientMountPointPW", }, + { 0, 1, 1, _bool, 0, & settings.ntripClient_TransmitGGA, "ntripClientTransmitGGA", }, + + { 0, 1, 1, _bool, 0, & settings.debugNtripServerRtcm, "debugNtripServerRtcm", }, + { 0, 1, 1, _bool, 0, & settings.debugNtripServerState, "debugNtripServerState", }, + { 0, 1, 1, _bool, 0, & settings.enableNtripServer, "enableNtripServer", }, + + { 0, 1, 1, _ntripServerCasterHost, NTRIP_SERVER_MAX, & settings.ntripServer_CasterHost[0], "ntripServerCasterHost_", }, + { 0, 1, 1, _ntripServerCasterPort, NTRIP_SERVER_MAX, & settings.ntripServer_CasterPort[0], "ntripServerCasterPort_", }, + { 0, 1, 1, _ntripServerCasterUser, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUser[0], "ntripServerCasterUser_", }, + { 0, 1, 1, _ntripServerCasterUserPW, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUserPW[0], "ntripServerCasterUserPW_", }, + { 0, 1, 1, _ntripServerMountPoint, NTRIP_SERVER_MAX, & settings.ntripServer_MountPoint[0], "ntripServerMountPoint_", }, + { 0, 1, 1, _ntripServerMountPointPW, NTRIP_SERVER_MAX, & settings.ntripServer_MountPointPW[0], "ntripServerMountPointPW_", }, + + { 0, 1, 1, _bool, 0, & settings.debugTcpClient, "debugTcpClient", }, + { 0, 1, 1, _bool, 0, & settings.enableTcpClient, "enableTcpClient", }, + { 0, 1, 1, _uint16_t, 0, & settings.tcpClientPort, "tcpClientPort", }, + { 0, 1, 1, _charArray, sizeof(settings.tcpClientHost), & settings.tcpClientHost, "tcpClientHost", }, + + { 0, 1, 1, _bool, 0, & settings.debugTcpServer, "debugTcpServer", }, + { 0, 1, 1, _bool, 0, & settings.enableTcpServer, "enableTcpServer", }, + { 0, 1, 1, _uint16_t, 0, & settings.tcpServerPort, "tcpServerPort", }, + + { 0, 1, 1, _bool, 0, & settings.debugUdpServer, "debugUdpServer", }, + { 0, 1, 1, _bool, 0, & settings.enableUdpServer, "enableUdpServer", }, + { 0, 1, 1, _uint16_t, 0, & settings.udpServerPort, "udpServerPort", }, + + { 0, 0, 1, _um980MessageRatesNMEA, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", }, + { 0, 0, 1, _um980MessageRatesRTCMRover, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", }, + { 0, 0, 1, _um980MessageRatesRTCMBase, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", }, + { 0, 1, 1, _um980Constellations, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "um980Constellations_", }, + + { 0, 1, 1, _bool, 0, & settings.enableTiltCompensation, "enableTiltCompensation", }, + { 0, 1, 1, _float, point3float, & settings.tiltPoleLength, "tiltPoleLength", }, + { 0, 1, 1, _bool, 0, & settings.enableImuDebug, "enableImuDebug", }, + + { 0, 1, 1, _bool, 0, & settings.debugFirmwareUpdate, "debugFirmwareUpdate", }, + { 0, 1, 1, _bool, 0, & settings.enableAutoFirmwareUpdate, "enableAutoFirmwareUpdate", }, + { 0, 1, 1, _uint32_t, 0, & settings.autoFirmwareCheckMinutes, "autoFirmwareCheckMinutes", }, + + { 0, 1, 1, _bool, 0, & settings.debugCorrections, "debugCorrections", }, + { 0, 1, 1, _bool, 0, & settings.enableCaptivePortal, "enableCaptivePortal", }, + + { 0, 1, 1, _bool, 0, & settings.printBootTimes, "printBootTimes", }, + + { 0, 1, 1, _bool, 0, & settings.printPartitionTable, "printPartitionTable", }, + + { 0, 1, 1, _uint8_t, 0, & settings.measurementScale, "measurementScale", }, + + { 0, 1, 1, _bool, 0, & settings.debugWiFiConfig, "debugWiFiConfig", }, + { 0, 1, 1, _bool, 0, & settings.enablePsram, "enablePsram", }, + { 0, 1, 1, _bool, 0, & settings.printTaskStartStop, "printTaskStartStop", }, + { 0, 1, 1, _uint16_t, 0, & settings.psramMallocLevel, "psramMallocLevel", }, + { 0, 1, 1, _bool, 0, & settings.enableBeeper, "enableBeeper", }, + { 0, 1, 1, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", }, + + { 0, 1, 1, _correctionsSourcesPriority, correctionsSource::CORR_NUM, & settings.correctionsSourcesPriority, "correctionsPriority_", }, + + { 0, 1, 1, _int, 0, & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", }, + + { 0, 1, 1, _int, 0, & settings.geographicRegion, "geographicRegion", }, + + { 0, 1, 1, _regionalCorrectionTopics, numRegionalAreas, & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", }, + + { 0, 1, 1, _bool, 0, & settings.debugEspNow, "debugEspNow", }, + { 0, 1, 1, _bool, 0, & settings.enableEspNow, "enableEspNow", }, + { 0, 1, 1, _uint8_t, 0, & settings.wifiChannel, "wifiChannel", }, + { 0, 1, 1, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", }, - { 0, 1, 1, & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", _bool, 0, }, - { 0, 1, 1, & settings.pplFixTimeoutS, "pplFixTimeoutS", _uint16_t, 0, }, + { 0, 1, 1, _bool, 0, & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", }, + { 0, 1, 1, _uint16_t, 0, & settings.pplFixTimeoutS, "pplFixTimeoutS", }, // Add new settings above <------------------------------------------------------------> /* From b35b571ad19da58b7aae122d0769684ce5368935 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 18 May 2024 11:00:31 -1000 Subject: [PATCH 057/358] Remove pointxfloat symbols, use numbers instead --- Firmware/RTK_Everywhere/NVM.ino | 52 +--- Firmware/RTK_Everywhere/menuCommands.ino | 9 +- Firmware/RTK_Everywhere/settings.h | 336 +++++++++++------------ 3 files changed, 181 insertions(+), 216 deletions(-) diff --git a/Firmware/RTK_Everywhere/NVM.ino b/Firmware/RTK_Everywhere/NVM.ino index da59bdf4e..af529acbe 100644 --- a/Firmware/RTK_Everywhere/NVM.ino +++ b/Firmware/RTK_Everywhere/NVM.ino @@ -7,7 +7,7 @@ Records all settings to the selected file (LFS or SD) as setting=value\r\n Uses standard settingsFile->printf to do the printing / writing Settings Refactor: Done - + parseLine(); In this file NVM.ino Splits a line from a settings file (setting=value\r\n) into settingName plus string / double value @@ -16,11 +16,11 @@ Settings Refactor: Done Note: there is a _lot_ of commonality between this and updateSettingWithValue. It should be possible to update parseLine so it calls updateSettingWithValue to do the actual updating. - + createSettingsString(); In menuCommands.ino Generates a CSV string of all settings and their values - if they are inSettingsString - Called by startWebServer, onWsEvent, updateSettingWithValue (when setting / resetting a profile), + Called by startWebServer, onWsEvent, updateSettingWithValue (when setting / resetting a profile), Calls the stringRecord methods - also in menuCommands.ino Settings Refactor: Done Note: there is a _lot_ of commonality between this and recordSystemSettingsToFile. It may be @@ -253,49 +253,19 @@ void recordSystemSettingsToFile(File *settingsFile) case _float: { float *ptr = (float *)rtkSettingsEntries[i].var; - switch (rtkSettingsEntries[i].qualifier) - { - case point1float: - settingsFile->printf("%s=%0.1f\r\n", rtkSettingsEntries[i].name, *ptr); - break; - default: - case point2float: - settingsFile->printf("%s=%0.2f\r\n", rtkSettingsEntries[i].name, *ptr); - break; - case point3float: - settingsFile->printf("%s=%0.3f\r\n", rtkSettingsEntries[i].name, *ptr); - break; - case point4float: - settingsFile->printf("%s=%0.4f\r\n", rtkSettingsEntries[i].name, *ptr); - break; - case point9float: - settingsFile->printf("%s=%0.9f\r\n", rtkSettingsEntries[i].name, *ptr); - break; - } + settingsFile->printf("%s=%0.*f\r\n", + rtkSettingsEntries[i].name, + rtkSettingsEntries[i].qualifier, + *ptr); } break; case _double: { double *ptr = (double *)rtkSettingsEntries[i].var; - switch (rtkSettingsEntries[i].qualifier) - { - case point1float: - settingsFile->printf("%s=%0.1f\r\n", rtkSettingsEntries[i].name, *ptr); - break; - default: - case point2float: - settingsFile->printf("%s=%0.2f\r\n", rtkSettingsEntries[i].name, *ptr); - break; - case point3float: - settingsFile->printf("%s=%0.3f\r\n", rtkSettingsEntries[i].name, *ptr); - break; - case point4float: - settingsFile->printf("%s=%0.4f\r\n", rtkSettingsEntries[i].name, *ptr); - break; - case point9float: - settingsFile->printf("%s=%0.9f\r\n", rtkSettingsEntries[i].name, *ptr); - break; - } + settingsFile->printf("%s=%0.*f\r\n", + rtkSettingsEntries[i].name, + rtkSettingsEntries[i].qualifier, + *ptr); } break; case _uint8_t: diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 8f4c0fcce..f949134c0 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -1651,10 +1651,15 @@ void writeToString(char *settingValueStr, uint32_t value) { sprintf(settingValueStr, "%" PRIu32, value); } + void writeToString(char *settingValueStr, double value) { sprintf(settingValueStr, "%f", value); } +void writeToString(char *settingValueStr, double value, int decimalPoints) +{ + sprintf(settingValueStr, "%0.*f", decimalPoints, value); +} void writeToString(char *settingValueStr, char *value) { @@ -1720,13 +1725,13 @@ bool getSettingValue(const char *settingName, char *settingValueStr) break; case _float: { float *ptr = (float *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (double)*ptr); + writeToString(settingValueStr, (double)*ptr, rtkSettingsEntries[i].qualifier); knownSetting = true; } break; case _double: { double *ptr = (double *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, *ptr); + writeToString(settingValueStr, *ptr, rtkSettingsEntries[i].qualifier); knownSetting = true; } break; diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 01f3f5aad..cb0522069 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1376,16 +1376,6 @@ typedef struct const char *name; } RTK_Settings_Entry; -enum Settings_float_Precision -{ - noPrecision = 0, - point1float, - point2float, - point3float, - point4float, - point9float = 9, -}; - const RTK_Settings_Entry rtkSettingsEntries[] = { // Note: don't use "_" in the name - "_" is reserved for settings arrays like "ubxMessageRate_" @@ -1393,45 +1383,45 @@ const RTK_Settings_Entry rtkSettingsEntries[] = // G S C // N e m // S t d -// S t s Type Qual Name Variable - { 0, 1, 1, _bool, 0, & settings.enableSD, "enableSD"}, - { 0, 1, 1, _int, 0, & settings.maxLogTime_minutes, "maxLogTime"}, - { 0, 1, 1, _int, 0, & settings.maxLogLength_minutes, "maxLogLength", }, - { 1, 1, 1, _int, 0, & settings.observationSeconds, "observationSeconds", }, - { 1, 1, 1, _float, point2float, & settings.observationPositionAccuracy, "observationPositionAccuracy", }, - { 1, 0, 1, _bool, 0, & settings.fixedBase, "fixedBase", }, - { 1, 0, 1, _bool, 0, & settings.fixedBaseCoordinateType, "fixedBaseCoordinateType", }, - { 1, 1, 1, _double, point3float, & settings.fixedEcefX, "fixedEcefX", }, - { 1, 1, 1, _double, point3float, & settings.fixedEcefY, "fixedEcefY", }, - { 1, 1, 1, _double, point3float, & settings.fixedEcefZ, "fixedEcefZ", }, - { 1, 1, 1, _double, point9float, & settings.fixedLat, "fixedLat", }, - { 1, 1, 1, _double, point9float, & settings.fixedLong, "fixedLong", }, - { 1, 1, 1, _double, point4float, & settings.fixedAltitude, "fixedAltitude", }, - { 1, 1, 1, _uint32_t, 0, & settings.dataPortBaud, "dataPortBaud", }, - { 1, 1, 1, _uint32_t, 0, & settings.radioPortBaud, "radioPortBaud", }, - { 1, 1, 1, _float, point1float, & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", }, - { 1, 0, 1, _uint16_t, 0, & settings.measurementRateMs, "measurementRateMs", }, - { 1, 0, 1, _uint16_t, 0, & settings.navigationRate, "navigationRate", }, - { 0, 1, 1, _bool, 0, & settings.debugGnss, "debugGnss", }, - { 0, 1, 1, _bool, 0, & settings.enableHeapReport, "enableHeapReport", }, - { 0, 1, 1, _bool, 0, & settings.enableTaskReports, "enableTaskReports", }, +// S t s Type Qual Variable Name + { 0, 1, 1, _bool, 0, & settings.enableSD, "enableSD"}, + { 0, 1, 1, _int, 0, & settings.maxLogTime_minutes, "maxLogTime"}, + { 0, 1, 1, _int, 0, & settings.maxLogLength_minutes, "maxLogLength", }, + { 1, 1, 1, _int, 0, & settings.observationSeconds, "observationSeconds", }, + { 1, 1, 1, _float, 2, & settings.observationPositionAccuracy, "observationPositionAccuracy", }, + { 1, 0, 1, _bool, 0, & settings.fixedBase, "fixedBase", }, + { 1, 0, 1, _bool, 0, & settings.fixedBaseCoordinateType, "fixedBaseCoordinateType", }, + { 1, 1, 1, _double, 3, & settings.fixedEcefX, "fixedEcefX", }, + { 1, 1, 1, _double, 3, & settings.fixedEcefY, "fixedEcefY", }, + { 1, 1, 1, _double, 3, & settings.fixedEcefZ, "fixedEcefZ", }, + { 1, 1, 1, _double, 9, & settings.fixedLat, "fixedLat", }, + { 1, 1, 1, _double, 9, & settings.fixedLong, "fixedLong", }, + { 1, 1, 1, _double, 4, & settings.fixedAltitude, "fixedAltitude", }, + { 1, 1, 1, _uint32_t, 0, & settings.dataPortBaud, "dataPortBaud", }, + { 1, 1, 1, _uint32_t, 0, & settings.radioPortBaud, "radioPortBaud", }, + { 1, 1, 1, _float, 1, & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", }, + { 1, 0, 1, _uint16_t, 0, & settings.measurementRateMs, "measurementRateMs", }, + { 1, 0, 1, _uint16_t, 0, & settings.navigationRate, "navigationRate", }, + { 0, 1, 1, _bool, 0, & settings.debugGnss, "debugGnss", }, + { 0, 1, 1, _bool, 0, & settings.enableHeapReport, "enableHeapReport", }, + { 0, 1, 1, _bool, 0, & settings.enableTaskReports, "enableTaskReports", }, { 0, 1, 1, _muxConnectionType_e, 0, & settings.dataPortChannel, "dataPortChannel", }, - { 0, 1, 1, _uint16_t, 0, & settings.spiFrequency, "spiFrequency", }, - { 0, 1, 1, _bool, 0, & settings.enableLogging, "enableLogging", }, - { 0, 1, 1, _bool, 0, & settings.enableARPLogging, "enableARPLogging", }, - { 0, 1, 1, _uint16_t, 0, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", }, - { 0, 1, 1, _uint16_t, 0, & settings.sppRxQueueSize, "sppRxQueueSize", }, - { 0, 1, 1, _uint16_t, 0, & settings.sppTxQueueSize, "sppTxQueueSize", }, - { 1, 1, 1, _uint8_t, 0, & settings.dynamicModel, "dynamicModel", }, + { 0, 1, 1, _uint16_t, 0, & settings.spiFrequency, "spiFrequency", }, + { 0, 1, 1, _bool, 0, & settings.enableLogging, "enableLogging", }, + { 0, 1, 1, _bool, 0, & settings.enableARPLogging, "enableARPLogging", }, + { 0, 1, 1, _uint16_t, 0, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", }, + { 0, 1, 1, _uint16_t, 0, & settings.sppRxQueueSize, "sppRxQueueSize", }, + { 0, 1, 1, _uint16_t, 0, & settings.sppTxQueueSize, "sppTxQueueSize", }, + { 1, 1, 1, _uint8_t, 0, & settings.dynamicModel, "dynamicModel", }, { 1, 0, 1, _SystemState, 0, & settings.lastState, "lastState", }, - { 0, 1, 1, _bool, 0, & settings.enableResetDisplay, "enableResetDisplay", }, - { 0, 1, 1, _int, 0, & settings.resetCount, "resetCount", }, - { 1, 1, 1, _bool, 0, & settings.enableExternalPulse, "enableExternalPulse", }, - { 1, 1, 1, _uint64_t, 0, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", }, - { 1, 1, 1, _uint64_t, 0, & settings.externalPulseLength_us, "externalPulseLength", }, + { 0, 1, 1, _bool, 0, & settings.enableResetDisplay, "enableResetDisplay", }, + { 0, 1, 1, _int, 0, & settings.resetCount, "resetCount", }, + { 1, 1, 1, _bool, 0, & settings.enableExternalPulse, "enableExternalPulse", }, + { 1, 1, 1, _uint64_t, 0, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", }, + { 1, 1, 1, _uint64_t, 0, & settings.externalPulseLength_us, "externalPulseLength", }, { 1, 1, 1, _pulseEdgeType_e, 0, & settings.externalPulsePolarity, "externalPulsePolarity", }, - { 1, 1, 1, _bool, 0, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", }, - { 0, 1, 1, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, + { 1, 1, 1, _bool, 0, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", }, + { 0, 1, 1, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, { 1, 0, 1, _ubxMessageRates, MAX_UBX_MSG, & settings.ubxMessageRates[0], "ubxMessageRate_", }, @@ -1439,132 +1429,132 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { 0, 0, 1, _charArray, sizeof(settings.profileName), & settings.profileName, "profileName", }, - { 0, 1, 1, _int16_t, 0, & settings.serialTimeoutGNSS, "serialTimeoutGNSS", }, + { 0, 1, 1, _int16_t, 0, & settings.serialTimeoutGNSS, "serialTimeoutGNSS", }, { 0, 1, 1, _charArray, sizeof(settings.pointPerfectDeviceProfileToken), & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", }, - { 0, 1, 1, _bool, 0, & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", }, - { 0, 1, 1, _bool, 0, & settings.autoKeyRenewal, "autoKeyRenewal", }, + { 0, 1, 1, _bool, 0, & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", }, + { 0, 1, 1, _bool, 0, & settings.autoKeyRenewal, "autoKeyRenewal", }, { 0, 1, 1, _charArray, sizeof(settings.pointPerfectClientID), & settings.pointPerfectClientID, "pointPerfectClientID", }, { 0, 1, 1, _charArray, sizeof(settings.pointPerfectBrokerHost), & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", }, { 0, 1, 1, _charArray, sizeof(settings.pointPerfectKeyDistributionTopic), & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", }, { 0, 1, 1, _charArray, sizeof(settings.pointPerfectCurrentKey), & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", }, - { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", }, - { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", }, + { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", }, + { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", }, { 0, 1, 1, _charArray, sizeof(settings.pointPerfectNextKey), & settings.pointPerfectNextKey, "pointPerfectNextKey", }, - { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", }, - { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", }, - - { 0, 1, 1, _uint64_t, 0, & settings.lastKeyAttempt, "lastKeyAttempt", }, - { 0, 1, 1, _bool, 0, & settings.updateGNSSSettings, "updateGNSSSettings", }, - - { 0, 0, 1, _bool, 0, & settings.debugPpCertificate, "debugPpCertificate", }, - - { 0, 1, 1, _int8_t, 0, & settings.timeZoneHours, "timeZoneHours", }, - { 0, 1, 1, _int8_t, 0, & settings.timeZoneMinutes, "timeZoneMinutes", }, - { 0, 1, 1, _int8_t, 0, & settings.timeZoneSeconds, "timeZoneSeconds", }, - - { 0, 1, 1, _bool, 0, & settings.enablePrintState, "enablePrintState", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintPosition, "enablePrintPosition", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintIdleTime, "enablePrintIdleTime", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintRoverAccuracy, "enablePrintRoverAccuracy", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintBadMessages, "enablePrintBadMessages", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintLogFileMessages, "enablePrintLogFileMessages", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintLogFileStatus, "enablePrintLogFileStatus", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintStates, "enablePrintStates", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintRtcSync, "enablePrintRtcSync", }, + { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", }, + { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", }, + + { 0, 1, 1, _uint64_t, 0, & settings.lastKeyAttempt, "lastKeyAttempt", }, + { 0, 1, 1, _bool, 0, & settings.updateGNSSSettings, "updateGNSSSettings", }, + + { 0, 0, 1, _bool, 0, & settings.debugPpCertificate, "debugPpCertificate", }, + + { 0, 1, 1, _int8_t, 0, & settings.timeZoneHours, "timeZoneHours", }, + { 0, 1, 1, _int8_t, 0, & settings.timeZoneMinutes, "timeZoneMinutes", }, + { 0, 1, 1, _int8_t, 0, & settings.timeZoneSeconds, "timeZoneSeconds", }, + + { 0, 1, 1, _bool, 0, & settings.enablePrintState, "enablePrintState", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintPosition, "enablePrintPosition", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintIdleTime, "enablePrintIdleTime", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintRoverAccuracy, "enablePrintRoverAccuracy", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintBadMessages, "enablePrintBadMessages", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintLogFileMessages, "enablePrintLogFileMessages", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintLogFileStatus, "enablePrintLogFileStatus", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintStates, "enablePrintStates", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintRtcSync, "enablePrintRtcSync", }, { 0, 1, 1, _espnowPeers, ESPNOW_MAX_PEERS, & settings.espnowPeers[0][0], "espnowPeer_", }, - { 0, 1, 1, _uint8_t, 0, & settings.espnowPeerCount, "espnowPeerCount", }, - { 0, 0, 1, _bool, 0, & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", }, + { 0, 1, 1, _uint8_t, 0, & settings.espnowPeerCount, "espnowPeerCount", }, + { 0, 0, 1, _bool, 0, & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", }, { 0, 1, 1, _BluetoothRadioType_e, 0, & settings.bluetoothRadioType, "bluetoothRadioType", }, - { 0, 1, 1, _bool, 0, & settings.runLogTest, "runLogTest", }, // Not stored in NVM - { 0, 1, 1, _bool, 0, & settings.espnowBroadcast, "espnowBroadcast", }, - { 0, 1, 1, _int16_t, 0, & settings.antennaHeight, "antennaHeight", }, - { 0, 1, 1, _float, point2float, & settings.antennaReferencePoint, "antennaReferencePoint" }, - { 0, 1, 1, _bool, 0, & settings.echoUserInput, "echoUserInput", }, - { 0, 1, 1, _int, 0, & settings.uartReceiveBufferSize, "uartReceiveBufferSize", }, - { 0, 1, 1, _int, 0, & settings.gnssHandlerBufferSize, "gnssHandlerBufferSize", }, - - { 0, 1, 1, _bool, 0, & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintSDBuffers, "enablePrintSDBuffers", }, + { 0, 1, 1, _bool, 0, & settings.runLogTest, "runLogTest", }, // Not stored in NVM + { 0, 1, 1, _bool, 0, & settings.espnowBroadcast, "espnowBroadcast", }, + { 0, 1, 1, _int16_t, 0, & settings.antennaHeight, "antennaHeight", }, + { 0, 1, 1, _float, 2, & settings.antennaReferencePoint, "antennaReferencePoint" }, + { 0, 1, 1, _bool, 0, & settings.echoUserInput, "echoUserInput", }, + { 0, 1, 1, _int, 0, & settings.uartReceiveBufferSize, "uartReceiveBufferSize", }, + { 0, 1, 1, _int, 0, & settings.gnssHandlerBufferSize, "gnssHandlerBufferSize", }, + + { 0, 1, 1, _bool, 0, & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintSDBuffers, "enablePrintSDBuffers", }, { 0, 1, 1, _PeriodicDisplay_t, 0, & settings.periodicDisplay, "periodicDisplay", }, - { 0, 1, 1, _uint32_t, 0, & settings.periodicDisplayInterval, "periodicDisplayInterval", }, + { 0, 1, 1, _uint32_t, 0, & settings.periodicDisplayInterval, "periodicDisplayInterval", }, - { 0, 1, 1, _uint32_t, 0, & settings.rebootSeconds, "rebootSeconds", }, - { 0, 1, 1, _bool, 0, & settings.forceResetOnSDFail, "forceResetOnSDFail", }, + { 0, 1, 1, _uint32_t, 0, & settings.rebootSeconds, "rebootSeconds", }, + { 0, 1, 1, _bool, 0, & settings.forceResetOnSDFail, "forceResetOnSDFail", }, - { 1, 1, 1, _uint8_t, 0, & settings.minElev, "minElev", }, + { 1, 1, 1, _uint8_t, 0, & settings.minElev, "minElev", }, { 1, 0, 1, _ubxMessageRateBase, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "ubxMessageRateBase_", }, { 0, 1, 1, _CoordinateInputType, 0, & settings.coordinateInputType, "coordinateInputType", }, - { 0, 1, 1, _uint16_t, 0, & settings.lbandFixTimeout_seconds, "lbandFixTimeout", }, - { 1, 0, 1, _int16_t, 0, & settings.minCNO, "minCNO", }, - { 0, 1, 1, _uint16_t, 0, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", }, - { 0, 1, 1, _uint8_t, 0, & settings.btReadTaskPriority, "btReadTaskPriority", }, - { 0, 1, 1, _uint8_t, 0, & settings.gnssReadTaskPriority, "gnssReadTaskPriority", }, - { 0, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskPriority, "handleGnssDataTaskPriority", }, - { 0, 1, 1, _uint8_t, 0, & settings.btReadTaskCore, "btReadTaskCore", }, - { 0, 1, 1, _uint8_t, 0, & settings.gnssReadTaskCore, "gnssReadTaskCore", }, - { 0, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskCore, "handleGnssDataTaskCore", }, - { 0, 1, 1, _uint8_t, 0, & settings.gnssUartInterruptsCore, "gnssUartInterruptsCore", }, - { 0, 1, 1, _uint8_t, 0, & settings.bluetoothInterruptsCore, "bluetoothInterruptsCore", }, - { 0, 1, 1, _uint8_t, 0, & settings.i2cInterruptsCore, "i2cInterruptsCore", }, - { 0, 1, 1, _uint32_t, 0, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", }, - { 0, 1, 1, _bool, 0, & settings.disableSetupButton, "disableSetupButton", }, - - { 0, 1, 1, _bool, 0, & settings.enablePrintEthernetDiag, "enablePrintEthernetDiag", }, - { 0, 1, 1, _bool, 0, & settings.ethernetDHCP, "ethernetDHCP", }, - { 0, 1, 1, _IPString, 0, & settings.ethernetIP, "ethernetIP", }, - { 0, 1, 1, _IPString, 0, & settings.ethernetDNS, "ethernetDNS", }, - { 0, 1, 1, _IPString, 0, & settings.ethernetGateway, "ethernetGateway", }, - { 0, 1, 1, _IPString, 0, & settings.ethernetSubnet, "ethernetSubnet", }, - { 0, 1, 1, _uint16_t, 0, & settings.httpPort, "httpPort", }, - - { 0, 1, 1, _bool, 0, & settings.debugWifiState, "debugWifiState", }, - { 0, 0, 1, _bool, 0, & settings.wifiConfigOverAP, "wifiConfigOverAP", }, // TODO: check drop downs + { 0, 1, 1, _uint16_t, 0, & settings.lbandFixTimeout_seconds, "lbandFixTimeout", }, + { 1, 0, 1, _int16_t, 0, & settings.minCNO, "minCNO", }, + { 0, 1, 1, _uint16_t, 0, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", }, + { 0, 1, 1, _uint8_t, 0, & settings.btReadTaskPriority, "btReadTaskPriority", }, + { 0, 1, 1, _uint8_t, 0, & settings.gnssReadTaskPriority, "gnssReadTaskPriority", }, + { 0, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskPriority, "handleGnssDataTaskPriority", }, + { 0, 1, 1, _uint8_t, 0, & settings.btReadTaskCore, "btReadTaskCore", }, + { 0, 1, 1, _uint8_t, 0, & settings.gnssReadTaskCore, "gnssReadTaskCore", }, + { 0, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskCore, "handleGnssDataTaskCore", }, + { 0, 1, 1, _uint8_t, 0, & settings.gnssUartInterruptsCore, "gnssUartInterruptsCore", }, + { 0, 1, 1, _uint8_t, 0, & settings.bluetoothInterruptsCore, "bluetoothInterruptsCore", }, + { 0, 1, 1, _uint8_t, 0, & settings.i2cInterruptsCore, "i2cInterruptsCore", }, + { 0, 1, 1, _uint32_t, 0, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", }, + { 0, 1, 1, _bool, 0, & settings.disableSetupButton, "disableSetupButton", }, + + { 0, 1, 1, _bool, 0, & settings.enablePrintEthernetDiag, "enablePrintEthernetDiag", }, + { 0, 1, 1, _bool, 0, & settings.ethernetDHCP, "ethernetDHCP", }, + { 0, 1, 1, _IPString, 0, & settings.ethernetIP, "ethernetIP", }, + { 0, 1, 1, _IPString, 0, & settings.ethernetDNS, "ethernetDNS", }, + { 0, 1, 1, _IPString, 0, & settings.ethernetGateway, "ethernetGateway", }, + { 0, 1, 1, _IPString, 0, & settings.ethernetSubnet, "ethernetSubnet", }, + { 0, 1, 1, _uint16_t, 0, & settings.httpPort, "httpPort", }, + + { 0, 1, 1, _bool, 0, & settings.debugWifiState, "debugWifiState", }, + { 0, 0, 1, _bool, 0, & settings.wifiConfigOverAP, "wifiConfigOverAP", }, // TODO: check drop downs { 0, 1, 1, _wifiNetwork, MAX_WIFI_NETWORKS, & settings.wifiNetworks, "wifiNetwork_", }, - { 0, 1, 1, _uint8_t, 0, & settings.defaultNetworkType, "defaultNetworkType", }, - { 0, 1, 1, _bool, 0, & settings.debugNetworkLayer, "debugNetworkLayer", }, - { 0, 1, 1, _bool, 0, & settings.enableNetworkFailover, "enableNetworkFailover", }, - { 0, 1, 1, _bool, 0, & settings.printNetworkStatus, "printNetworkStatus", }, + { 0, 1, 1, _uint8_t, 0, & settings.defaultNetworkType, "defaultNetworkType", }, + { 0, 1, 1, _bool, 0, & settings.debugNetworkLayer, "debugNetworkLayer", }, + { 0, 1, 1, _bool, 0, & settings.enableNetworkFailover, "enableNetworkFailover", }, + { 0, 1, 1, _bool, 0, & settings.printNetworkStatus, "printNetworkStatus", }, - { 0, 1, 1, _bool, 0, & settings.mdnsEnable, "mdnsEnable", }, + { 0, 1, 1, _bool, 0, & settings.mdnsEnable, "mdnsEnable", }, - { 0, 1, 1, _bool, 0, & settings.debugMqttClientData, "debugMqttClientData", }, - { 0, 1, 1, _bool, 0, & settings.debugMqttClientState, "debugMqttClientState", }, + { 0, 1, 1, _bool, 0, & settings.debugMqttClientData, "debugMqttClientData", }, + { 0, 1, 1, _bool, 0, & settings.debugMqttClientState, "debugMqttClientState", }, - { 0, 1, 1, _bool, 0, & settings.debugNtp, "debugNtp", }, - { 0, 1, 1, _uint16_t, 0, & settings.ethernetNtpPort, "ethernetNtpPort", }, - { 0, 1, 1, _bool, 0, & settings.enableNTPFile, "enableNTPFile", }, - { 0, 1, 1, _uint8_t, 0, & settings.ntpPollExponent, "ntpPollExponent", }, - { 0, 1, 1, _int8_t, 0, & settings.ntpPrecision, "ntpPrecision", }, - { 0, 1, 1, _uint32_t, 0, & settings.ntpRootDelay, "ntpRootDelay", }, - { 0, 1, 1, _uint32_t, 0, & settings.ntpRootDispersion, "ntpRootDispersion", }, + { 0, 1, 1, _bool, 0, & settings.debugNtp, "debugNtp", }, + { 0, 1, 1, _uint16_t, 0, & settings.ethernetNtpPort, "ethernetNtpPort", }, + { 0, 1, 1, _bool, 0, & settings.enableNTPFile, "enableNTPFile", }, + { 0, 1, 1, _uint8_t, 0, & settings.ntpPollExponent, "ntpPollExponent", }, + { 0, 1, 1, _int8_t, 0, & settings.ntpPrecision, "ntpPrecision", }, + { 0, 1, 1, _uint32_t, 0, & settings.ntpRootDelay, "ntpRootDelay", }, + { 0, 1, 1, _uint32_t, 0, & settings.ntpRootDispersion, "ntpRootDispersion", }, { 0, 1, 1, _charArray, sizeof(settings.ntpReferenceId), & settings.ntpReferenceId, "ntpReferenceId", }, - { 0, 1, 1, _bool, 0, & settings.debugNtripClientRtcm, "debugNtripClientRtcm", }, - { 0, 1, 1, _bool, 0, & settings.debugNtripClientState, "debugNtripClientState", }, - { 0, 1, 1, _bool, 0, & settings.enableNtripClient, "enableNtripClient", }, + { 0, 1, 1, _bool, 0, & settings.debugNtripClientRtcm, "debugNtripClientRtcm", }, + { 0, 1, 1, _bool, 0, & settings.debugNtripClientState, "debugNtripClientState", }, + { 0, 1, 1, _bool, 0, & settings.enableNtripClient, "enableNtripClient", }, { 0, 1, 1, _charArray, sizeof(settings.ntripClient_CasterHost), & settings.ntripClient_CasterHost, "ntripClientCasterHost", }, - { 0, 1, 1, _uint16_t, 0, & settings.ntripClient_CasterPort, "ntripClientCasterPort", }, + { 0, 1, 1, _uint16_t, 0, & settings.ntripClient_CasterPort, "ntripClientCasterPort", }, { 0, 1, 1, _charArray, sizeof(settings.ntripClient_CasterUser), & settings.ntripClient_CasterUser, "ntripClientCasterUser", }, { 0, 1, 1, _charArray, sizeof(settings.ntripClient_CasterUserPW), & settings.ntripClient_CasterUserPW, "ntripClientCasterUserPW", }, { 0, 1, 1, _charArray, sizeof(settings.ntripClient_MountPoint), & settings.ntripClient_MountPoint, "ntripClientMountPoint", }, { 0, 1, 1, _charArray, sizeof(settings.ntripClient_MountPointPW), & settings.ntripClient_MountPointPW, "ntripClientMountPointPW", }, - { 0, 1, 1, _bool, 0, & settings.ntripClient_TransmitGGA, "ntripClientTransmitGGA", }, + { 0, 1, 1, _bool, 0, & settings.ntripClient_TransmitGGA, "ntripClientTransmitGGA", }, - { 0, 1, 1, _bool, 0, & settings.debugNtripServerRtcm, "debugNtripServerRtcm", }, - { 0, 1, 1, _bool, 0, & settings.debugNtripServerState, "debugNtripServerState", }, - { 0, 1, 1, _bool, 0, & settings.enableNtripServer, "enableNtripServer", }, + { 0, 1, 1, _bool, 0, & settings.debugNtripServerRtcm, "debugNtripServerRtcm", }, + { 0, 1, 1, _bool, 0, & settings.debugNtripServerState, "debugNtripServerState", }, + { 0, 1, 1, _bool, 0, & settings.enableNtripServer, "enableNtripServer", }, { 0, 1, 1, _ntripServerCasterHost, NTRIP_SERVER_MAX, & settings.ntripServer_CasterHost[0], "ntripServerCasterHost_", }, { 0, 1, 1, _ntripServerCasterPort, NTRIP_SERVER_MAX, & settings.ntripServer_CasterPort[0], "ntripServerCasterPort_", }, @@ -1573,67 +1563,67 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { 0, 1, 1, _ntripServerMountPoint, NTRIP_SERVER_MAX, & settings.ntripServer_MountPoint[0], "ntripServerMountPoint_", }, { 0, 1, 1, _ntripServerMountPointPW, NTRIP_SERVER_MAX, & settings.ntripServer_MountPointPW[0], "ntripServerMountPointPW_", }, - { 0, 1, 1, _bool, 0, & settings.debugTcpClient, "debugTcpClient", }, - { 0, 1, 1, _bool, 0, & settings.enableTcpClient, "enableTcpClient", }, - { 0, 1, 1, _uint16_t, 0, & settings.tcpClientPort, "tcpClientPort", }, + { 0, 1, 1, _bool, 0, & settings.debugTcpClient, "debugTcpClient", }, + { 0, 1, 1, _bool, 0, & settings.enableTcpClient, "enableTcpClient", }, + { 0, 1, 1, _uint16_t, 0, & settings.tcpClientPort, "tcpClientPort", }, { 0, 1, 1, _charArray, sizeof(settings.tcpClientHost), & settings.tcpClientHost, "tcpClientHost", }, - { 0, 1, 1, _bool, 0, & settings.debugTcpServer, "debugTcpServer", }, - { 0, 1, 1, _bool, 0, & settings.enableTcpServer, "enableTcpServer", }, - { 0, 1, 1, _uint16_t, 0, & settings.tcpServerPort, "tcpServerPort", }, + { 0, 1, 1, _bool, 0, & settings.debugTcpServer, "debugTcpServer", }, + { 0, 1, 1, _bool, 0, & settings.enableTcpServer, "enableTcpServer", }, + { 0, 1, 1, _uint16_t, 0, & settings.tcpServerPort, "tcpServerPort", }, - { 0, 1, 1, _bool, 0, & settings.debugUdpServer, "debugUdpServer", }, - { 0, 1, 1, _bool, 0, & settings.enableUdpServer, "enableUdpServer", }, - { 0, 1, 1, _uint16_t, 0, & settings.udpServerPort, "udpServerPort", }, + { 0, 1, 1, _bool, 0, & settings.debugUdpServer, "debugUdpServer", }, + { 0, 1, 1, _bool, 0, & settings.enableUdpServer, "enableUdpServer", }, + { 0, 1, 1, _uint16_t, 0, & settings.udpServerPort, "udpServerPort", }, { 0, 0, 1, _um980MessageRatesNMEA, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", }, { 0, 0, 1, _um980MessageRatesRTCMRover, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", }, { 0, 0, 1, _um980MessageRatesRTCMBase, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", }, { 0, 1, 1, _um980Constellations, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "um980Constellations_", }, - { 0, 1, 1, _bool, 0, & settings.enableTiltCompensation, "enableTiltCompensation", }, - { 0, 1, 1, _float, point3float, & settings.tiltPoleLength, "tiltPoleLength", }, - { 0, 1, 1, _bool, 0, & settings.enableImuDebug, "enableImuDebug", }, + { 0, 1, 1, _bool, 0, & settings.enableTiltCompensation, "enableTiltCompensation", }, + { 0, 1, 1, _float, 3, & settings.tiltPoleLength, "tiltPoleLength", }, + { 0, 1, 1, _bool, 0, & settings.enableImuDebug, "enableImuDebug", }, - { 0, 1, 1, _bool, 0, & settings.debugFirmwareUpdate, "debugFirmwareUpdate", }, - { 0, 1, 1, _bool, 0, & settings.enableAutoFirmwareUpdate, "enableAutoFirmwareUpdate", }, - { 0, 1, 1, _uint32_t, 0, & settings.autoFirmwareCheckMinutes, "autoFirmwareCheckMinutes", }, + { 0, 1, 1, _bool, 0, & settings.debugFirmwareUpdate, "debugFirmwareUpdate", }, + { 0, 1, 1, _bool, 0, & settings.enableAutoFirmwareUpdate, "enableAutoFirmwareUpdate", }, + { 0, 1, 1, _uint32_t, 0, & settings.autoFirmwareCheckMinutes, "autoFirmwareCheckMinutes", }, - { 0, 1, 1, _bool, 0, & settings.debugCorrections, "debugCorrections", }, - { 0, 1, 1, _bool, 0, & settings.enableCaptivePortal, "enableCaptivePortal", }, + { 0, 1, 1, _bool, 0, & settings.debugCorrections, "debugCorrections", }, + { 0, 1, 1, _bool, 0, & settings.enableCaptivePortal, "enableCaptivePortal", }, - { 0, 1, 1, _bool, 0, & settings.printBootTimes, "printBootTimes", }, + { 0, 1, 1, _bool, 0, & settings.printBootTimes, "printBootTimes", }, - { 0, 1, 1, _bool, 0, & settings.printPartitionTable, "printPartitionTable", }, + { 0, 1, 1, _bool, 0, & settings.printPartitionTable, "printPartitionTable", }, - { 0, 1, 1, _uint8_t, 0, & settings.measurementScale, "measurementScale", }, + { 0, 1, 1, _uint8_t, 0, & settings.measurementScale, "measurementScale", }, - { 0, 1, 1, _bool, 0, & settings.debugWiFiConfig, "debugWiFiConfig", }, - { 0, 1, 1, _bool, 0, & settings.enablePsram, "enablePsram", }, - { 0, 1, 1, _bool, 0, & settings.printTaskStartStop, "printTaskStartStop", }, - { 0, 1, 1, _uint16_t, 0, & settings.psramMallocLevel, "psramMallocLevel", }, - { 0, 1, 1, _bool, 0, & settings.enableBeeper, "enableBeeper", }, - { 0, 1, 1, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", }, + { 0, 1, 1, _bool, 0, & settings.debugWiFiConfig, "debugWiFiConfig", }, + { 0, 1, 1, _bool, 0, & settings.enablePsram, "enablePsram", }, + { 0, 1, 1, _bool, 0, & settings.printTaskStartStop, "printTaskStartStop", }, + { 0, 1, 1, _uint16_t, 0, & settings.psramMallocLevel, "psramMallocLevel", }, + { 0, 1, 1, _bool, 0, & settings.enableBeeper, "enableBeeper", }, + { 0, 1, 1, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", }, { 0, 1, 1, _correctionsSourcesPriority, correctionsSource::CORR_NUM, & settings.correctionsSourcesPriority, "correctionsPriority_", }, - { 0, 1, 1, _int, 0, & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", }, + { 0, 1, 1, _int, 0, & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", }, - { 0, 1, 1, _int, 0, & settings.geographicRegion, "geographicRegion", }, + { 0, 1, 1, _int, 0, & settings.geographicRegion, "geographicRegion", }, { 0, 1, 1, _regionalCorrectionTopics, numRegionalAreas, & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", }, - { 0, 1, 1, _bool, 0, & settings.debugEspNow, "debugEspNow", }, - { 0, 1, 1, _bool, 0, & settings.enableEspNow, "enableEspNow", }, - { 0, 1, 1, _uint8_t, 0, & settings.wifiChannel, "wifiChannel", }, - { 0, 1, 1, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", }, + { 0, 1, 1, _bool, 0, & settings.debugEspNow, "debugEspNow", }, + { 0, 1, 1, _bool, 0, & settings.enableEspNow, "enableEspNow", }, + { 0, 1, 1, _uint8_t, 0, & settings.wifiChannel, "wifiChannel", }, + { 0, 1, 1, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", }, - { 0, 1, 1, _bool, 0, & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", }, - { 0, 1, 1, _uint16_t, 0, & settings.pplFixTimeoutS, "pplFixTimeoutS", }, + { 0, 1, 1, _bool, 0, & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", }, + { 0, 1, 1, _uint16_t, 0, & settings.pplFixTimeoutS, "pplFixTimeoutS", }, // Add new settings above <------------------------------------------------------------> /* - { 0, 1, 1, & settings., "", type, 0, }, + { 0, 1, 1, , 0, & settings., ""}, */ }; From 90c30d70c1ee0c35c44731288170c79cab9097fa Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 18 May 2024 11:40:01 -1000 Subject: [PATCH 058/358] Shorten type names to better fit the column --- Firmware/RTK_Everywhere/NVM.ino | 96 ++++++------ Firmware/RTK_Everywhere/menuCommands.ino | 192 +++++++++++------------ Firmware/RTK_Everywhere/settings.h | 122 +++++++------- 3 files changed, 205 insertions(+), 205 deletions(-) diff --git a/Firmware/RTK_Everywhere/NVM.ino b/Firmware/RTK_Everywhere/NVM.ino index af529acbe..ffe0bd5a7 100644 --- a/Firmware/RTK_Everywhere/NVM.ino +++ b/Firmware/RTK_Everywhere/NVM.ino @@ -304,43 +304,43 @@ void recordSystemSettingsToFile(File *settingsFile) settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, *ptr); } break; - case _muxConnectionType_e: + case tMuxConn: { muxConnectionType_e *ptr = (muxConnectionType_e *)rtkSettingsEntries[i].var; settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, (int)*ptr); } break; - case _SystemState: + case tSysState: { SystemState *ptr = (SystemState *)rtkSettingsEntries[i].var; settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, (int)*ptr); } break; - case _pulseEdgeType_e: + case tPulseEdg: { pulseEdgeType_e *ptr = (pulseEdgeType_e *)rtkSettingsEntries[i].var; settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, (int)*ptr); } break; - case _BluetoothRadioType_e: + case tBtRadio: { BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)rtkSettingsEntries[i].var; settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, (int)*ptr); } break; - case _PeriodicDisplay_t: + case tPerDisp: { PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)rtkSettingsEntries[i].var; settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, (int)*ptr); } break; - case _CoordinateInputType: + case tCoordInp: { CoordinateInputType *ptr = (CoordinateInputType *)rtkSettingsEntries[i].var; settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, (int)*ptr); } break; - case _charArray: + case tCharArry: { char *ptr = (char *)rtkSettingsEntries[i].var; settingsFile->printf("%s=%s\r\n", rtkSettingsEntries[i].name, ptr); @@ -353,7 +353,7 @@ void recordSystemSettingsToFile(File *settingsFile) // Note: toString separates the four bytes with dots / periods "192.168.1.1" } break; - case _ubxMessageRates: + case tUbxMsgRt: { // Record message settings for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) @@ -365,7 +365,7 @@ void recordSystemSettingsToFile(File *settingsFile) } } break; - case _ubxConstellations: + case tUbxConst: { // Record constellation settings for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) @@ -377,7 +377,7 @@ void recordSystemSettingsToFile(File *settingsFile) } } break; - case _espnowPeers: + case tEspNowPr: { // Record ESP-Now peer MAC addresses for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) @@ -390,7 +390,7 @@ void recordSystemSettingsToFile(File *settingsFile) } } break; - case _ubxMessageRateBase: + case tUbMsgRtb: { // Record message settings @@ -405,7 +405,7 @@ void recordSystemSettingsToFile(File *settingsFile) } } break; - case _wifiNetwork: + case tWiFiNet: { // Record WiFi credential table for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) @@ -419,7 +419,7 @@ void recordSystemSettingsToFile(File *settingsFile) } } break; - case _ntripServerCasterHost: + case tNSCHost: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -428,7 +428,7 @@ void recordSystemSettingsToFile(File *settingsFile) } } break; - case _ntripServerCasterPort: + case tNSCPort: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -437,7 +437,7 @@ void recordSystemSettingsToFile(File *settingsFile) } } break; - case _ntripServerCasterUser: + case tNSCUser: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -446,7 +446,7 @@ void recordSystemSettingsToFile(File *settingsFile) } } break; - case _ntripServerCasterUserPW: + case tNSCUsrPw: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -455,7 +455,7 @@ void recordSystemSettingsToFile(File *settingsFile) } } break; - case _ntripServerMountPoint: + case tNSMtPt: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -464,7 +464,7 @@ void recordSystemSettingsToFile(File *settingsFile) } } break; - case _ntripServerMountPointPW: + case tNSMtPtPw: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -473,7 +473,7 @@ void recordSystemSettingsToFile(File *settingsFile) } } break; - case _um980MessageRatesNMEA: + case tUmMRNmea: { // Record UM980 NMEA rates for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) @@ -485,7 +485,7 @@ void recordSystemSettingsToFile(File *settingsFile) } } break; - case _um980MessageRatesRTCMRover: + case tUmMRRvRT: { // Record UM980 Rover RTCM rates for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) @@ -497,7 +497,7 @@ void recordSystemSettingsToFile(File *settingsFile) } } break; - case _um980MessageRatesRTCMBase: + case tUmMRBaRT: { // Record UM980 Base RTCM rates for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) @@ -509,7 +509,7 @@ void recordSystemSettingsToFile(File *settingsFile) } } break; - case _um980Constellations: + case tUmConst: { // Record UM980 Constellations for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) @@ -521,7 +521,7 @@ void recordSystemSettingsToFile(File *settingsFile) } } break; - case _correctionsSourcesPriority: + case tCorrSPri: { // Record corrections priorities for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) @@ -533,7 +533,7 @@ void recordSystemSettingsToFile(File *settingsFile) } } break; - case _regionalCorrectionTopics: + case tRegCorTp: { for (int r = 0; r < rtkSettingsEntries[i].qualifier; r++) { @@ -1022,49 +1022,49 @@ bool parseLine(char *str) knownSetting = true; } break; - case _muxConnectionType_e: + case tMuxConn: { muxConnectionType_e *ptr = (muxConnectionType_e *)rtkSettingsEntries[i].var; *ptr = (muxConnectionType_e)d; knownSetting = true; } break; - case _SystemState: + case tSysState: { SystemState *ptr = (SystemState *)rtkSettingsEntries[i].var; *ptr = (SystemState)d; knownSetting = true; } break; - case _pulseEdgeType_e: + case tPulseEdg: { pulseEdgeType_e *ptr = (pulseEdgeType_e *)rtkSettingsEntries[i].var; *ptr = (pulseEdgeType_e)d; knownSetting = true; } break; - case _BluetoothRadioType_e: + case tBtRadio: { BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)rtkSettingsEntries[i].var; *ptr = (BluetoothRadioType_e)d; knownSetting = true; } break; - case _PeriodicDisplay_t: + case tPerDisp: { PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)rtkSettingsEntries[i].var; *ptr = (PeriodicDisplay_t)d; knownSetting = true; } break; - case _CoordinateInputType: + case tCoordInp: { CoordinateInputType *ptr = (CoordinateInputType *)rtkSettingsEntries[i].var; *ptr = (CoordinateInputType)d; knownSetting = true; } break; - case _charArray: + case tCharArry: { char *ptr = (char *)rtkSettingsEntries[i].var; strncpy(ptr, settingString, rtkSettingsEntries[i].qualifier); @@ -1080,7 +1080,7 @@ bool parseLine(char *str) knownSetting = true; } break; - case _ubxMessageRates: + case tUbxMsgRt: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -1093,7 +1093,7 @@ bool parseLine(char *str) } } break; - case _ubxConstellations: + case tUbxConst: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -1106,7 +1106,7 @@ bool parseLine(char *str) } } break; - case _espnowPeers: + case tEspNowPr: { int suffixNum; if (sscanf(suffix, "%d", &suffixNum) == 1) @@ -1121,7 +1121,7 @@ bool parseLine(char *str) } } break; - case _ubxMessageRateBase: + case tUbMsgRtb: { int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); @@ -1136,7 +1136,7 @@ bool parseLine(char *str) } } break; - case _wifiNetwork: + case tWiFiNet: { int network; @@ -1158,7 +1158,7 @@ bool parseLine(char *str) } } break; - case _ntripServerCasterHost: + case tNSCHost: { int server; if (sscanf(suffix, "%d", &server) == 1) @@ -1168,7 +1168,7 @@ bool parseLine(char *str) } } break; - case _ntripServerCasterPort: + case tNSCPort: { int server; if (sscanf(suffix, "%d", &server) == 1) @@ -1178,7 +1178,7 @@ bool parseLine(char *str) } } break; - case _ntripServerCasterUser: + case tNSCUser: { int server; if (sscanf(suffix, "%d", &server) == 1) @@ -1188,7 +1188,7 @@ bool parseLine(char *str) } } break; - case _ntripServerCasterUserPW: + case tNSCUsrPw: { int server; if (sscanf(suffix, "%d", &server) == 1) @@ -1198,7 +1198,7 @@ bool parseLine(char *str) } } break; - case _ntripServerMountPoint: + case tNSMtPt: { int server; if (sscanf(suffix, "%d", &server) == 1) @@ -1208,7 +1208,7 @@ bool parseLine(char *str) } } break; - case _ntripServerMountPointPW: + case tNSMtPtPw: { int server; if (sscanf(suffix, "%d", &server) == 1) @@ -1218,7 +1218,7 @@ bool parseLine(char *str) } } break; - case _um980MessageRatesNMEA: + case tUmMRNmea: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -1231,7 +1231,7 @@ bool parseLine(char *str) } } break; - case _um980MessageRatesRTCMRover: + case tUmMRRvRT: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -1244,7 +1244,7 @@ bool parseLine(char *str) } } break; - case _um980MessageRatesRTCMBase: + case tUmMRBaRT: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -1257,7 +1257,7 @@ bool parseLine(char *str) } } break; - case _um980Constellations: + case tUmConst: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -1270,7 +1270,7 @@ bool parseLine(char *str) } } break; - case _correctionsSourcesPriority: + case tCorrSPri: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -1283,7 +1283,7 @@ bool parseLine(char *str) } } break; - case _regionalCorrectionTopics: + case tRegCorTp: { int region; if (sscanf(suffix, "%d", ®ion) == 1) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index f949134c0..51f3823ff 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -377,43 +377,43 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr knownSetting = true; } break; - case _muxConnectionType_e: { + case tMuxConn: { muxConnectionType_e *ptr = (muxConnectionType_e *)rtkSettingsEntries[i].var; *ptr = (muxConnectionType_e)settingValue; knownSetting = true; } break; - case _SystemState: { + case tSysState: { SystemState *ptr = (SystemState *)rtkSettingsEntries[i].var; *ptr = (SystemState)settingValue; knownSetting = true; } break; - case _pulseEdgeType_e: { + case tPulseEdg: { pulseEdgeType_e *ptr = (pulseEdgeType_e *)rtkSettingsEntries[i].var; *ptr = (pulseEdgeType_e)settingValue; knownSetting = true; } break; - case _BluetoothRadioType_e: { + case tBtRadio: { BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)rtkSettingsEntries[i].var; *ptr = (BluetoothRadioType_e)settingValue; knownSetting = true; } break; - case _PeriodicDisplay_t: { + case tPerDisp: { PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)rtkSettingsEntries[i].var; *ptr = (PeriodicDisplay_t)settingValue; knownSetting = true; } break; - case _CoordinateInputType: { + case tCoordInp: { CoordinateInputType *ptr = (CoordinateInputType *)rtkSettingsEntries[i].var; *ptr = (CoordinateInputType)settingValue; knownSetting = true; } break; - case _charArray: { + case tCharArry: { char *ptr = (char *)rtkSettingsEntries[i].var; strncpy(ptr, settingValueStr, rtkSettingsEntries[i].qualifier); // strncpy pads with zeros. No need to add them here for ntpReferenceId @@ -427,7 +427,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr knownSetting = true; } break; - case _ubxMessageRates: { + case tUbxMsgRt: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { if ((suffix[0] == ubxMessages[x].msgTextName[0]) && @@ -440,7 +440,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } } break; - case _ubxConstellations: { + case tUbxConst: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { if ((suffix[0] == settings.ubxConstellations[x].textName[0]) && @@ -453,7 +453,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } } break; - case _espnowPeers: { + case tEspNowPr: { int suffixNum; if (sscanf(suffix, "%d", &suffixNum) == 1) { @@ -468,7 +468,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } } break; - case _ubxMessageRateBase: { + case tUbMsgRtb: { int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) @@ -483,7 +483,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } } break; - case _wifiNetwork: { + case tWiFiNet: { int network; if (strstr(suffix, "SSID") != nullptr) @@ -506,7 +506,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } } break; - case _ntripServerCasterHost: { + case tNSCHost: { int server; if (sscanf(suffix, "%d", &server) == 1) { @@ -516,7 +516,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } } break; - case _ntripServerCasterPort: { + case tNSCPort: { int server; if (sscanf(suffix, "%d", &server) == 1) { @@ -525,7 +525,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } } break; - case _ntripServerCasterUser: { + case tNSCUser: { int server; if (sscanf(suffix, "%d", &server) == 1) { @@ -535,7 +535,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } } break; - case _ntripServerCasterUserPW: { + case tNSCUsrPw: { int server; if (sscanf(suffix, "%d", &server) == 1) { @@ -545,7 +545,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } } break; - case _ntripServerMountPoint: { + case tNSMtPt: { int server; if (sscanf(suffix, "%d", &server) == 1) { @@ -555,7 +555,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } } break; - case _ntripServerMountPointPW: { + case tNSMtPtPw: { int server; if (sscanf(suffix, "%d", &server) == 1) { @@ -565,7 +565,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } } break; - case _um980MessageRatesNMEA: { + case tUmMRNmea: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { if ((suffix[0] == umMessagesNMEA[x].msgTextName[0]) && @@ -578,7 +578,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } } break; - case _um980MessageRatesRTCMRover: { + case tUmMRRvRT: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && @@ -591,7 +591,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } } break; - case _um980MessageRatesRTCMBase: { + case tUmMRBaRT: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && @@ -604,7 +604,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } } break; - case _um980Constellations: { + case tUmConst: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { if ((suffix[0] == um980ConstellationCommands[x].textName[0]) && @@ -617,7 +617,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } } break; - case _correctionsSourcesPriority: { + case tCorrSPri: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { if ((suffix[0] == correctionsSourceNames[x][0]) && (strcmp(suffix, correctionsSourceNames[x]) == 0)) @@ -629,7 +629,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } } break; - case _regionalCorrectionTopics: { + case tRegCorTp: { int region; if (sscanf(suffix, "%d", ®ion) == 1) { @@ -1075,37 +1075,37 @@ void createSettingsString(char *newSettings) stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); } break; - case _muxConnectionType_e: { + case tMuxConn: { muxConnectionType_e *ptr = (muxConnectionType_e *)rtkSettingsEntries[i].var; stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); } break; - case _SystemState: { + case tSysState: { SystemState *ptr = (SystemState *)rtkSettingsEntries[i].var; stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); } break; - case _pulseEdgeType_e: { + case tPulseEdg: { pulseEdgeType_e *ptr = (pulseEdgeType_e *)rtkSettingsEntries[i].var; stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); } break; - case _BluetoothRadioType_e: { + case tBtRadio: { BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)rtkSettingsEntries[i].var; stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); } break; - case _PeriodicDisplay_t: { + case tPerDisp: { PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)rtkSettingsEntries[i].var; stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); } break; - case _CoordinateInputType: { + case tCoordInp: { CoordinateInputType *ptr = (CoordinateInputType *)rtkSettingsEntries[i].var; stringRecord(newSettings, rtkSettingsEntries[i].name, (int)*ptr); } break; - case _charArray: { + case tCharArry: { char *ptr = (char *)rtkSettingsEntries[i].var; stringRecord(newSettings, rtkSettingsEntries[i].name, ptr); } @@ -1115,7 +1115,7 @@ void createSettingsString(char *newSettings) stringRecord(newSettings, rtkSettingsEntries[i].name, (char *)ptr->toString().c_str()); } break; - case _ubxMessageRates: { + case tUbxMsgRt: { // Record message settings for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -1126,7 +1126,7 @@ void createSettingsString(char *newSettings) } } break; - case _ubxConstellations: { + case tUbxConst: { // Record constellation settings for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -1138,7 +1138,7 @@ void createSettingsString(char *newSettings) } } break; - case _espnowPeers: { + case tEspNowPr: { // Record ESP-Now peer MAC addresses for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -1151,7 +1151,7 @@ void createSettingsString(char *newSettings) } } break; - case _ubxMessageRateBase: { + case tUbMsgRtb: { // Record message settings int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); @@ -1165,7 +1165,7 @@ void createSettingsString(char *newSettings) } } break; - case _wifiNetwork: { + case tWiFiNet: { // Record WiFi credential table for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -1180,7 +1180,7 @@ void createSettingsString(char *newSettings) } } break; - case _ntripServerCasterHost: { + case tNSCHost: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { char tempString[50]; @@ -1190,7 +1190,7 @@ void createSettingsString(char *newSettings) } } break; - case _ntripServerCasterPort: { + case tNSCPort: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { char tempString[50]; @@ -1200,7 +1200,7 @@ void createSettingsString(char *newSettings) } } break; - case _ntripServerCasterUser: { + case tNSCUser: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { char tempString[50]; @@ -1210,7 +1210,7 @@ void createSettingsString(char *newSettings) } } break; - case _ntripServerCasterUserPW: { + case tNSCUsrPw: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { char tempString[50]; @@ -1220,7 +1220,7 @@ void createSettingsString(char *newSettings) } } break; - case _ntripServerMountPoint: { + case tNSMtPt: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { char tempString[50]; @@ -1230,7 +1230,7 @@ void createSettingsString(char *newSettings) } } break; - case _ntripServerMountPointPW: { + case tNSMtPtPw: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { char tempString[50]; @@ -1240,7 +1240,7 @@ void createSettingsString(char *newSettings) } } break; - case _um980MessageRatesNMEA: { + case tUmMRNmea: { // Record UM980 NMEA rates for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -1251,7 +1251,7 @@ void createSettingsString(char *newSettings) } } break; - case _um980MessageRatesRTCMRover: { + case tUmMRRvRT: { // Record UM980 Rover RTCM rates for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -1262,7 +1262,7 @@ void createSettingsString(char *newSettings) } } break; - case _um980MessageRatesRTCMBase: { + case tUmMRBaRT: { // Record UM980 Base RTCM rates for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -1273,7 +1273,7 @@ void createSettingsString(char *newSettings) } } break; - case _um980Constellations: { + case tUmConst: { // Record UM980 Constellations // um980Constellations are uint8_t, but here we have to convert to bool (true / false) so the web page // check boxes are populated correctly. (We can't make it bool, otherwise the 254 initializer will @@ -1288,7 +1288,7 @@ void createSettingsString(char *newSettings) } } break; - case _correctionsSourcesPriority: { + case tCorrSPri: { // Record corrections priorities for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -1299,7 +1299,7 @@ void createSettingsString(char *newSettings) } } break; - case _regionalCorrectionTopics: { + case tRegCorTp: { for (int r = 0; r < rtkSettingsEntries[i].qualifier; r++) { char tempString[50]; @@ -1771,43 +1771,43 @@ bool getSettingValue(const char *settingName, char *settingValueStr) knownSetting = true; } break; - case _muxConnectionType_e: { + case tMuxConn: { muxConnectionType_e *ptr = (muxConnectionType_e *)rtkSettingsEntries[i].var; writeToString(settingValueStr, (int)*ptr); knownSetting = true; } break; - case _SystemState: { + case tSysState: { SystemState *ptr = (SystemState *)rtkSettingsEntries[i].var; writeToString(settingValueStr, (int)*ptr); knownSetting = true; } break; - case _pulseEdgeType_e: { + case tPulseEdg: { pulseEdgeType_e *ptr = (pulseEdgeType_e *)rtkSettingsEntries[i].var; writeToString(settingValueStr, (int)*ptr); knownSetting = true; } break; - case _BluetoothRadioType_e: { + case tBtRadio: { BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)rtkSettingsEntries[i].var; writeToString(settingValueStr, (int)*ptr); knownSetting = true; } break; - case _PeriodicDisplay_t: { + case tPerDisp: { PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)rtkSettingsEntries[i].var; writeToString(settingValueStr, (int)*ptr); knownSetting = true; } break; - case _CoordinateInputType: { + case tCoordInp: { CoordinateInputType *ptr = (CoordinateInputType *)rtkSettingsEntries[i].var; writeToString(settingValueStr, (int)*ptr); knownSetting = true; } break; - case _charArray: { + case tCharArry: { char *ptr = (char *)rtkSettingsEntries[i].var; writeToString(settingValueStr, ptr); knownSetting = true; @@ -1819,7 +1819,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) knownSetting = true; } break; - case _ubxMessageRates: { + case tUbxMsgRt: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { if ((suffix[0] == ubxMessages[x].msgTextName[0]) && @@ -1832,7 +1832,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } } break; - case _ubxConstellations: { + case tUbxConst: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { if ((suffix[0] == settings.ubxConstellations[x].textName[0]) && @@ -1845,7 +1845,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } } break; - case _espnowPeers: { + case tEspNowPr: { int suffixNum; if (sscanf(suffix, "%d", &suffixNum) == 1) { @@ -1859,7 +1859,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } } break; - case _ubxMessageRateBase: { + case tUbMsgRtb: { int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) @@ -1874,7 +1874,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } } break; - case _wifiNetwork: { + case tWiFiNet: { int network; if (strstr(suffix, "SSID") != nullptr) @@ -1895,7 +1895,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } } break; - case _ntripServerCasterHost: { + case tNSCHost: { int server; if (sscanf(suffix, "%d", &server) == 1) { @@ -1904,7 +1904,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } } break; - case _ntripServerCasterPort: { + case tNSCPort: { int server; if (sscanf(suffix, "%d", &server) == 1) { @@ -1913,7 +1913,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } } break; - case _ntripServerCasterUser: { + case tNSCUser: { int server; if (sscanf(suffix, "%d", &server) == 1) { @@ -1922,7 +1922,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } } break; - case _ntripServerCasterUserPW: { + case tNSCUsrPw: { int server; if (sscanf(suffix, "%d", &server) == 1) { @@ -1931,7 +1931,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } } break; - case _ntripServerMountPoint: { + case tNSMtPt: { int server; if (sscanf(suffix, "%d", &server) == 1) { @@ -1940,7 +1940,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } } break; - case _ntripServerMountPointPW: { + case tNSMtPtPw: { int server; if (sscanf(suffix, "%d", &server) == 1) { @@ -1949,7 +1949,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } } break; - case _um980MessageRatesNMEA: { + case tUmMRNmea: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { if ((suffix[0] == umMessagesNMEA[x].msgTextName[0]) && @@ -1962,7 +1962,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } } break; - case _um980MessageRatesRTCMRover: { + case tUmMRRvRT: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && @@ -1975,7 +1975,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } } break; - case _um980MessageRatesRTCMBase: { + case tUmMRBaRT: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && @@ -1988,7 +1988,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } } break; - case _um980Constellations: { + case tUmConst: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { if ((suffix[0] == um980ConstellationCommands[x].textName[0]) && @@ -2001,7 +2001,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } } break; - case _correctionsSourcesPriority: { + case tCorrSPri: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { if ((suffix[0] == correctionsSourceNames[x][0]) && (strcmp(suffix, correctionsSourceNames[x]) == 0)) @@ -2013,7 +2013,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } } break; - case _regionalCorrectionTopics: { + case tRegCorTp: { int region; if (sscanf(suffix, "%d", ®ion) == 1) { @@ -2237,37 +2237,37 @@ void printAvailableSettings() commandSendExecuteListResponse(rtkSettingsEntries[i].name, "int16_t", settingValue); } break; - case _muxConnectionType_e: { + case tMuxConn: { getSettingValue(rtkSettingsEntries[i].name, settingValue); commandSendExecuteListResponse(rtkSettingsEntries[i].name, "muxConnectionType_e", settingValue); } break; - case _SystemState: { + case tSysState: { getSettingValue(rtkSettingsEntries[i].name, settingValue); commandSendExecuteListResponse(rtkSettingsEntries[i].name, "SystemState", settingValue); } break; - case _pulseEdgeType_e: { + case tPulseEdg: { getSettingValue(rtkSettingsEntries[i].name, settingValue); commandSendExecuteListResponse(rtkSettingsEntries[i].name, "pulseEdgeType_e", settingValue); } break; - case _BluetoothRadioType_e: { + case tBtRadio: { getSettingValue(rtkSettingsEntries[i].name, settingValue); commandSendExecuteListResponse(rtkSettingsEntries[i].name, "BluetoothRadioType_e", settingValue); } break; - case _PeriodicDisplay_t: { + case tPerDisp: { getSettingValue(rtkSettingsEntries[i].name, settingValue); commandSendExecuteListResponse(rtkSettingsEntries[i].name, "PeriodicDisplay_t", settingValue); } break; - case _CoordinateInputType: { + case tCoordInp: { getSettingValue(rtkSettingsEntries[i].name, settingValue); commandSendExecuteListResponse(rtkSettingsEntries[i].name, "CoordinateInputType", settingValue); } break; - case _charArray: { + case tCharArry: { snprintf(settingType, sizeof(settingType), "char[%d]", rtkSettingsEntries[i].qualifier); getSettingValue(rtkSettingsEntries[i].name, settingValue); commandSendExecuteListResponse(rtkSettingsEntries[i].name, settingType, settingValue); @@ -2278,7 +2278,7 @@ void printAvailableSettings() commandSendExecuteListResponse(rtkSettingsEntries[i].name, "IPAddress", settingValue); } break; - case _ubxMessageRates: { + case tUbxMsgRt: { // Record message settings for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -2290,7 +2290,7 @@ void printAvailableSettings() } } break; - case _ubxConstellations: { + case tUbxConst: { // Record constellation settings for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -2302,7 +2302,7 @@ void printAvailableSettings() } } break; - case _espnowPeers: { + case tEspNowPr: { // Record ESP-Now peer MAC addresses for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -2314,7 +2314,7 @@ void printAvailableSettings() } } break; - case _ubxMessageRateBase: { + case tUbMsgRtb: { // Record message settings int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); @@ -2328,7 +2328,7 @@ void printAvailableSettings() } } break; - case _wifiNetwork: { + case tWiFiNet: { // Record WiFi credential table for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -2346,7 +2346,7 @@ void printAvailableSettings() } } break; - case _ntripServerCasterHost: { + case tNSCHost: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.ntripServer_CasterHost[x])); @@ -2357,7 +2357,7 @@ void printAvailableSettings() } } break; - case _ntripServerCasterPort: { + case tNSCPort: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); @@ -2367,7 +2367,7 @@ void printAvailableSettings() } } break; - case _ntripServerCasterUser: { + case tNSCUser: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.ntripServer_CasterUser[x])); @@ -2378,7 +2378,7 @@ void printAvailableSettings() } } break; - case _ntripServerCasterUserPW: { + case tNSCUsrPw: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { snprintf(settingType, sizeof(settingType), "char[%d]", @@ -2390,7 +2390,7 @@ void printAvailableSettings() } } break; - case _ntripServerMountPoint: { + case tNSMtPt: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.ntripServer_MountPoint[x])); @@ -2401,7 +2401,7 @@ void printAvailableSettings() } } break; - case _ntripServerMountPointPW: { + case tNSMtPtPw: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { snprintf(settingType, sizeof(settingType), "char[%d]", @@ -2413,7 +2413,7 @@ void printAvailableSettings() } } break; - case _um980MessageRatesNMEA: { + case tUmMRNmea: { // Record UM980 NMEA rates for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -2425,7 +2425,7 @@ void printAvailableSettings() } } break; - case _um980MessageRatesRTCMRover: { + case tUmMRRvRT: { // Record UM980 Rover RTCM rates for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -2437,7 +2437,7 @@ void printAvailableSettings() } } break; - case _um980MessageRatesRTCMBase: { + case tUmMRBaRT: { // Record UM980 Base RTCM rates for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -2449,7 +2449,7 @@ void printAvailableSettings() } } break; - case _um980Constellations: { + case tUmConst: { // Record UM980 Constellations for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -2461,7 +2461,7 @@ void printAvailableSettings() } } break; - case _correctionsSourcesPriority: { + case tCorrSPri: { // Record corrections priorities for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -2473,7 +2473,7 @@ void printAvailableSettings() } } break; - case _regionalCorrectionTopics: { + case tRegCorTp: { for (int r = 0; r < rtkSettingsEntries[i].qualifier; r++) { snprintf(settingType, sizeof(settingType), "char[%d]", diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index cb0522069..b117f7104 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1336,31 +1336,31 @@ typedef enum { _uint64_t, _int8_t, _int16_t, - _muxConnectionType_e, - _SystemState, - _pulseEdgeType_e, - _BluetoothRadioType_e, - _PeriodicDisplay_t, - _CoordinateInputType, - _charArray, + tMuxConn, + tSysState, + tPulseEdg, + tBtRadio, + tPerDisp, + tCoordInp, + tCharArry, _IPString, - _ubxMessageRates, - _ubxConstellations, - _espnowPeers, - _ubxMessageRateBase, - _wifiNetwork, - _ntripServerCasterHost, - _ntripServerCasterPort, - _ntripServerCasterUser, - _ntripServerCasterUserPW, - _ntripServerMountPoint, - _ntripServerMountPointPW, - _um980MessageRatesNMEA, - _um980MessageRatesRTCMRover, - _um980MessageRatesRTCMBase, - _um980Constellations, - _correctionsSourcesPriority, - _regionalCorrectionTopics, + tUbxMsgRt, + tUbxConst, + tEspNowPr, + tUbMsgRtb, + tWiFiNet, + tNSCHost, + tNSCPort, + tNSCUser, + tNSCUsrPw, + tNSMtPt, + tNSMtPtPw, + tUmMRNmea, + tUmMRRvRT, + tUmMRBaRT, + tUmConst, + tCorrSPri, + tRegCorTp, // Add new settings types above <----------------> // (Maintain the enum of existing settings types!) } RTK_Settings_Types; @@ -1405,7 +1405,7 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { 0, 1, 1, _bool, 0, & settings.debugGnss, "debugGnss", }, { 0, 1, 1, _bool, 0, & settings.enableHeapReport, "enableHeapReport", }, { 0, 1, 1, _bool, 0, & settings.enableTaskReports, "enableTaskReports", }, - { 0, 1, 1, _muxConnectionType_e, 0, & settings.dataPortChannel, "dataPortChannel", }, + { 0, 1, 1, tMuxConn, 0, & settings.dataPortChannel, "dataPortChannel", }, { 0, 1, 1, _uint16_t, 0, & settings.spiFrequency, "spiFrequency", }, { 0, 1, 1, _bool, 0, & settings.enableLogging, "enableLogging", }, { 0, 1, 1, _bool, 0, & settings.enableARPLogging, "enableARPLogging", }, @@ -1413,36 +1413,36 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { 0, 1, 1, _uint16_t, 0, & settings.sppRxQueueSize, "sppRxQueueSize", }, { 0, 1, 1, _uint16_t, 0, & settings.sppTxQueueSize, "sppTxQueueSize", }, { 1, 1, 1, _uint8_t, 0, & settings.dynamicModel, "dynamicModel", }, - { 1, 0, 1, _SystemState, 0, & settings.lastState, "lastState", }, + { 1, 0, 1, tSysState, 0, & settings.lastState, "lastState", }, { 0, 1, 1, _bool, 0, & settings.enableResetDisplay, "enableResetDisplay", }, { 0, 1, 1, _int, 0, & settings.resetCount, "resetCount", }, { 1, 1, 1, _bool, 0, & settings.enableExternalPulse, "enableExternalPulse", }, { 1, 1, 1, _uint64_t, 0, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", }, { 1, 1, 1, _uint64_t, 0, & settings.externalPulseLength_us, "externalPulseLength", }, - { 1, 1, 1, _pulseEdgeType_e, 0, & settings.externalPulsePolarity, "externalPulsePolarity", }, + { 1, 1, 1, tPulseEdg, 0, & settings.externalPulsePolarity, "externalPulsePolarity", }, { 1, 1, 1, _bool, 0, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", }, { 0, 1, 1, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, - { 1, 0, 1, _ubxMessageRates, MAX_UBX_MSG, & settings.ubxMessageRates[0], "ubxMessageRate_", }, + { 1, 0, 1, tUbxMsgRt, MAX_UBX_MSG, & settings.ubxMessageRates[0], "ubxMessageRate_", }, - { 1, 1, 1, _ubxConstellations, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "ubxConstellation_", }, + { 1, 1, 1, tUbxConst, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "ubxConstellation_", }, - { 0, 0, 1, _charArray, sizeof(settings.profileName), & settings.profileName, "profileName", }, + { 0, 0, 1, tCharArry, sizeof(settings.profileName), & settings.profileName, "profileName", }, { 0, 1, 1, _int16_t, 0, & settings.serialTimeoutGNSS, "serialTimeoutGNSS", }, - { 0, 1, 1, _charArray, sizeof(settings.pointPerfectDeviceProfileToken), & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", }, + { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectDeviceProfileToken), & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", }, { 0, 1, 1, _bool, 0, & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", }, { 0, 1, 1, _bool, 0, & settings.autoKeyRenewal, "autoKeyRenewal", }, - { 0, 1, 1, _charArray, sizeof(settings.pointPerfectClientID), & settings.pointPerfectClientID, "pointPerfectClientID", }, - { 0, 1, 1, _charArray, sizeof(settings.pointPerfectBrokerHost), & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", }, - { 0, 1, 1, _charArray, sizeof(settings.pointPerfectKeyDistributionTopic), & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", }, + { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectClientID), & settings.pointPerfectClientID, "pointPerfectClientID", }, + { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectBrokerHost), & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", }, + { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectKeyDistributionTopic), & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", }, - { 0, 1, 1, _charArray, sizeof(settings.pointPerfectCurrentKey), & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", }, + { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectCurrentKey), & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", }, { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", }, { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", }, - { 0, 1, 1, _charArray, sizeof(settings.pointPerfectNextKey), & settings.pointPerfectNextKey, "pointPerfectNextKey", }, + { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectNextKey), & settings.pointPerfectNextKey, "pointPerfectNextKey", }, { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", }, { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", }, @@ -1468,11 +1468,11 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { 0, 1, 1, _bool, 0, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", }, { 0, 1, 1, _bool, 0, & settings.enablePrintRtcSync, "enablePrintRtcSync", }, - { 0, 1, 1, _espnowPeers, ESPNOW_MAX_PEERS, & settings.espnowPeers[0][0], "espnowPeer_", }, + { 0, 1, 1, tEspNowPr, ESPNOW_MAX_PEERS, & settings.espnowPeers[0][0], "espnowPeer_", }, { 0, 1, 1, _uint8_t, 0, & settings.espnowPeerCount, "espnowPeerCount", }, { 0, 0, 1, _bool, 0, & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", }, - { 0, 1, 1, _BluetoothRadioType_e, 0, & settings.bluetoothRadioType, "bluetoothRadioType", }, + { 0, 1, 1, tBtRadio, 0, & settings.bluetoothRadioType, "bluetoothRadioType", }, { 0, 1, 1, _bool, 0, & settings.runLogTest, "runLogTest", }, // Not stored in NVM { 0, 1, 1, _bool, 0, & settings.espnowBroadcast, "espnowBroadcast", }, { 0, 1, 1, _int16_t, 0, & settings.antennaHeight, "antennaHeight", }, @@ -1483,7 +1483,7 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { 0, 1, 1, _bool, 0, & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", }, { 0, 1, 1, _bool, 0, & settings.enablePrintSDBuffers, "enablePrintSDBuffers", }, - { 0, 1, 1, _PeriodicDisplay_t, 0, & settings.periodicDisplay, "periodicDisplay", }, + { 0, 1, 1, tPerDisp, 0, & settings.periodicDisplay, "periodicDisplay", }, { 0, 1, 1, _uint32_t, 0, & settings.periodicDisplayInterval, "periodicDisplayInterval", }, { 0, 1, 1, _uint32_t, 0, & settings.rebootSeconds, "rebootSeconds", }, @@ -1491,9 +1491,9 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { 1, 1, 1, _uint8_t, 0, & settings.minElev, "minElev", }, - { 1, 0, 1, _ubxMessageRateBase, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "ubxMessageRateBase_", }, + { 1, 0, 1, tUbMsgRtb, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "ubxMessageRateBase_", }, - { 0, 1, 1, _CoordinateInputType, 0, & settings.coordinateInputType, "coordinateInputType", }, + { 0, 1, 1, tCoordInp, 0, & settings.coordinateInputType, "coordinateInputType", }, { 0, 1, 1, _uint16_t, 0, & settings.lbandFixTimeout_seconds, "lbandFixTimeout", }, { 1, 0, 1, _int16_t, 0, & settings.minCNO, "minCNO", }, { 0, 1, 1, _uint16_t, 0, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", }, @@ -1520,7 +1520,7 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { 0, 1, 1, _bool, 0, & settings.debugWifiState, "debugWifiState", }, { 0, 0, 1, _bool, 0, & settings.wifiConfigOverAP, "wifiConfigOverAP", }, // TODO: check drop downs - { 0, 1, 1, _wifiNetwork, MAX_WIFI_NETWORKS, & settings.wifiNetworks, "wifiNetwork_", }, + { 0, 1, 1, tWiFiNet, MAX_WIFI_NETWORKS, & settings.wifiNetworks, "wifiNetwork_", }, { 0, 1, 1, _uint8_t, 0, & settings.defaultNetworkType, "defaultNetworkType", }, { 0, 1, 1, _bool, 0, & settings.debugNetworkLayer, "debugNetworkLayer", }, @@ -1539,34 +1539,34 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { 0, 1, 1, _int8_t, 0, & settings.ntpPrecision, "ntpPrecision", }, { 0, 1, 1, _uint32_t, 0, & settings.ntpRootDelay, "ntpRootDelay", }, { 0, 1, 1, _uint32_t, 0, & settings.ntpRootDispersion, "ntpRootDispersion", }, - { 0, 1, 1, _charArray, sizeof(settings.ntpReferenceId), & settings.ntpReferenceId, "ntpReferenceId", }, + { 0, 1, 1, tCharArry, sizeof(settings.ntpReferenceId), & settings.ntpReferenceId, "ntpReferenceId", }, { 0, 1, 1, _bool, 0, & settings.debugNtripClientRtcm, "debugNtripClientRtcm", }, { 0, 1, 1, _bool, 0, & settings.debugNtripClientState, "debugNtripClientState", }, { 0, 1, 1, _bool, 0, & settings.enableNtripClient, "enableNtripClient", }, - { 0, 1, 1, _charArray, sizeof(settings.ntripClient_CasterHost), & settings.ntripClient_CasterHost, "ntripClientCasterHost", }, + { 0, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterHost), & settings.ntripClient_CasterHost, "ntripClientCasterHost", }, { 0, 1, 1, _uint16_t, 0, & settings.ntripClient_CasterPort, "ntripClientCasterPort", }, - { 0, 1, 1, _charArray, sizeof(settings.ntripClient_CasterUser), & settings.ntripClient_CasterUser, "ntripClientCasterUser", }, - { 0, 1, 1, _charArray, sizeof(settings.ntripClient_CasterUserPW), & settings.ntripClient_CasterUserPW, "ntripClientCasterUserPW", }, - { 0, 1, 1, _charArray, sizeof(settings.ntripClient_MountPoint), & settings.ntripClient_MountPoint, "ntripClientMountPoint", }, - { 0, 1, 1, _charArray, sizeof(settings.ntripClient_MountPointPW), & settings.ntripClient_MountPointPW, "ntripClientMountPointPW", }, + { 0, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUser), & settings.ntripClient_CasterUser, "ntripClientCasterUser", }, + { 0, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUserPW), & settings.ntripClient_CasterUserPW, "ntripClientCasterUserPW", }, + { 0, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPoint), & settings.ntripClient_MountPoint, "ntripClientMountPoint", }, + { 0, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPointPW), & settings.ntripClient_MountPointPW, "ntripClientMountPointPW", }, { 0, 1, 1, _bool, 0, & settings.ntripClient_TransmitGGA, "ntripClientTransmitGGA", }, { 0, 1, 1, _bool, 0, & settings.debugNtripServerRtcm, "debugNtripServerRtcm", }, { 0, 1, 1, _bool, 0, & settings.debugNtripServerState, "debugNtripServerState", }, { 0, 1, 1, _bool, 0, & settings.enableNtripServer, "enableNtripServer", }, - { 0, 1, 1, _ntripServerCasterHost, NTRIP_SERVER_MAX, & settings.ntripServer_CasterHost[0], "ntripServerCasterHost_", }, - { 0, 1, 1, _ntripServerCasterPort, NTRIP_SERVER_MAX, & settings.ntripServer_CasterPort[0], "ntripServerCasterPort_", }, - { 0, 1, 1, _ntripServerCasterUser, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUser[0], "ntripServerCasterUser_", }, - { 0, 1, 1, _ntripServerCasterUserPW, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUserPW[0], "ntripServerCasterUserPW_", }, - { 0, 1, 1, _ntripServerMountPoint, NTRIP_SERVER_MAX, & settings.ntripServer_MountPoint[0], "ntripServerMountPoint_", }, - { 0, 1, 1, _ntripServerMountPointPW, NTRIP_SERVER_MAX, & settings.ntripServer_MountPointPW[0], "ntripServerMountPointPW_", }, + { 0, 1, 1, tNSCHost, NTRIP_SERVER_MAX, & settings.ntripServer_CasterHost[0], "ntripServerCasterHost_", }, + { 0, 1, 1, tNSCPort, NTRIP_SERVER_MAX, & settings.ntripServer_CasterPort[0], "ntripServerCasterPort_", }, + { 0, 1, 1, tNSCUser, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUser[0], "ntripServerCasterUser_", }, + { 0, 1, 1, tNSCUsrPw, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUserPW[0], "ntripServerCasterUserPW_", }, + { 0, 1, 1, tNSMtPt, NTRIP_SERVER_MAX, & settings.ntripServer_MountPoint[0], "ntripServerMountPoint_", }, + { 0, 1, 1, tNSMtPtPw, NTRIP_SERVER_MAX, & settings.ntripServer_MountPointPW[0], "ntripServerMountPointPW_", }, { 0, 1, 1, _bool, 0, & settings.debugTcpClient, "debugTcpClient", }, { 0, 1, 1, _bool, 0, & settings.enableTcpClient, "enableTcpClient", }, { 0, 1, 1, _uint16_t, 0, & settings.tcpClientPort, "tcpClientPort", }, - { 0, 1, 1, _charArray, sizeof(settings.tcpClientHost), & settings.tcpClientHost, "tcpClientHost", }, + { 0, 1, 1, tCharArry, sizeof(settings.tcpClientHost), & settings.tcpClientHost, "tcpClientHost", }, { 0, 1, 1, _bool, 0, & settings.debugTcpServer, "debugTcpServer", }, { 0, 1, 1, _bool, 0, & settings.enableTcpServer, "enableTcpServer", }, @@ -1576,10 +1576,10 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { 0, 1, 1, _bool, 0, & settings.enableUdpServer, "enableUdpServer", }, { 0, 1, 1, _uint16_t, 0, & settings.udpServerPort, "udpServerPort", }, - { 0, 0, 1, _um980MessageRatesNMEA, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", }, - { 0, 0, 1, _um980MessageRatesRTCMRover, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", }, - { 0, 0, 1, _um980MessageRatesRTCMBase, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", }, - { 0, 1, 1, _um980Constellations, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "um980Constellations_", }, + { 0, 0, 1, tUmMRNmea, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", }, + { 0, 0, 1, tUmMRRvRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", }, + { 0, 0, 1, tUmMRBaRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", }, + { 0, 1, 1, tUmConst, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "um980Constellations_", }, { 0, 1, 1, _bool, 0, & settings.enableTiltCompensation, "enableTiltCompensation", }, { 0, 1, 1, _float, 3, & settings.tiltPoleLength, "tiltPoleLength", }, @@ -1605,13 +1605,13 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { 0, 1, 1, _bool, 0, & settings.enableBeeper, "enableBeeper", }, { 0, 1, 1, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", }, - { 0, 1, 1, _correctionsSourcesPriority, correctionsSource::CORR_NUM, & settings.correctionsSourcesPriority, "correctionsPriority_", }, + { 0, 1, 1, tCorrSPri, correctionsSource::CORR_NUM, & settings.correctionsSourcesPriority, "correctionsPriority_", }, { 0, 1, 1, _int, 0, & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", }, { 0, 1, 1, _int, 0, & settings.geographicRegion, "geographicRegion", }, - { 0, 1, 1, _regionalCorrectionTopics, numRegionalAreas, & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", }, + { 0, 1, 1, tRegCorTp, numRegionalAreas, & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", }, { 0, 1, 1, _bool, 0, & settings.debugEspNow, "debugEspNow", }, { 0, 1, 1, _bool, 0, & settings.enableEspNow, "enableEspNow", }, From 171690afbc1b390f9224e3074d7df24c34699b25 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 18 May 2024 15:26:12 -1000 Subject: [PATCH 059/358] Reorder settings and rtkSettingsEntries --- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 1 - Firmware/RTK_Everywhere/menuSystem.ino | 5 - Firmware/RTK_Everywhere/settings.h | 796 +++++++++++---------- 3 files changed, 424 insertions(+), 378 deletions(-) diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index d48d0c517..147914d55 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -832,7 +832,6 @@ volatile bool deadManWalking; settings.enablePrintIdleTime = true; \ settings.enablePrintBatteryMessages = true; \ settings.enablePrintRoverAccuracy = true; \ - settings.enablePrintBadMessages = true; \ settings.enablePrintLogFileMessages = true; \ settings.enablePrintLogFileStatus = true; \ settings.enablePrintRingBufferOffsets = true; \ diff --git a/Firmware/RTK_Everywhere/menuSystem.ino b/Firmware/RTK_Everywhere/menuSystem.ino index 1fb811d4e..979a295b9 100644 --- a/Firmware/RTK_Everywhere/menuSystem.ino +++ b/Firmware/RTK_Everywhere/menuSystem.ino @@ -417,9 +417,6 @@ void menuDebugHardware() systemPrintf("%s\r\n", settings.enablePrintSDBuffers ? "Enabled" : "Disabled"); // GNSS - systemPrint("8) Print messages with bad checksums or CRCs: "); - systemPrintf("%s\r\n", settings.enablePrintBadMessages ? "Enabled" : "Disabled"); - systemPrint("9) Print GNSS Debugging: "); systemPrintf("%s\r\n", settings.debugGnss ? "Enabled" : "Disabled"); @@ -484,8 +481,6 @@ void menuDebugHardware() } else if (incoming == 7) settings.enablePrintSDBuffers ^= 1; - else if (incoming == 8) - settings.enablePrintBadMessages ^= 1; else if (incoming == 9) { settings.debugGnss ^= 1; diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index b117f7104..8d7219f7a 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -989,11 +989,15 @@ struct Settings int sizeOfSettings = 0; // sizeOfSettings **must** be the first entry and must be int int rtkIdentifier = RTK_IDENTIFIER; // rtkIdentifier **must** be the second entry - bool enableSD = true; - int maxLogTime_minutes = 60 * 24; // Default to 24 hours - int maxLogLength_minutes = 60 * 24; // Default to 24 hours - int observationSeconds = 60; // Default survey in time of 60 seconds - float observationPositionAccuracy = 5.0; // Default survey in pos accy of 5m + // Antenna + int16_t antennaHeight = 0; // in mm + float antennaReferencePoint = 0.0; // in mm + uint16_t ARPLoggingInterval_s = 10; // Log the ARP every 10 seconds - if available + bool enableARPLogging = false; // Log the Antenna Reference Position from RTCM 1005/1006 - if available + + // Base operation + CoordinateInputType coordinateInputType = COORDINATE_INPUT_TYPE_DD; // Default DD.ddddddddd + double fixedAltitude = 1560.089; bool fixedBase = false; // Use survey-in by default bool fixedBaseCoordinateType = COORD_TYPE_ECEF; double fixedEcefX = -1280206.568; @@ -1001,186 +1005,92 @@ struct Settings double fixedEcefZ = 4086665.484; double fixedLat = 40.09029479; double fixedLong = -105.18505761; - double fixedAltitude = 1560.089; - uint32_t dataPortBaud = - (115200 * 2); // Default to 230400bps. This limits GNSS fixes at 4Hz but allows SD buffer to be reduced to 6k. - uint32_t radioPortBaud = 57600; // Default to 57600bps to support connection to SiK1000 type telemetry radios + int observationSeconds = 60; // Default survey in time of 60 seconds + float observationPositionAccuracy = 5.0; // Default survey in pos accy of 5m float surveyInStartingAccuracy = 1.0; // Wait for this horizontal positional accuracy in meters before starting survey in - uint16_t measurementRateMs = 250; // Elapsed ms between GNSS measurements. 25ms to 65535ms. Default 4Hz. - uint16_t navigationRate = - 1; // Ratio between number of measurements and navigation solutions. Default 1 for 4Hz (with measurementRate). - bool debugGnss = false; // Turn on to display GNSS library debug messages - bool enableHeapReport = false; // Turn on to display free heap - bool enableTaskReports = false; // Turn on to display task high water marks - muxConnectionType_e dataPortChannel = MUX_UBLOX_NMEA; // Mux default to ublox UART1 - uint16_t spiFrequency = 16; // By default, use 16MHz SPI - bool enableLogging = true; // If an SD card is present, log default sentences - bool enableARPLogging = false; // Log the Antenna Reference Position from RTCM 1005/1006 - if available - uint16_t ARPLoggingInterval_s = 10; // Log the ARP every 10 seconds - if available - uint16_t sppRxQueueSize = 512 * 4; - uint16_t sppTxQueueSize = 32; - uint8_t dynamicModel = DYN_MODEL_PORTABLE; - SystemState lastState = STATE_NOT_SET; // Start unit in last known state - bool enableResetDisplay = false; - int resetCount = 0; - bool enableExternalPulse = true; // Send pulse once lock is achieved - uint64_t externalPulseTimeBetweenPulse_us = 1000000; // us between pulses, max of 60s = 60 * 1000 * 1000 - uint64_t externalPulseLength_us = 100000; // us length of pulse, max of 60s = 60 * 1000 * 1000 - pulseEdgeType_e externalPulsePolarity = PULSE_RISING_EDGE; // Pulse rises for pulse length, then falls - bool enableExternalHardwareEventLogging = false; // Log when INT/TM2 pin goes low - bool enableUART2UBXIn = false; // UBX Protocol In on UART2 - - uint8_t ubxMessageRates[MAX_UBX_MSG] = {254}; // Mark first record with key so defaults will be applied. - - // Constellations monitored/used for fix - ubxConstellation ubxConstellations[MAX_CONSTELLATIONS] = { - {UBLOX_CFG_SIGNAL_GPS_ENA, SFE_UBLOX_GNSS_ID_GPS, true, "GPS"}, - {UBLOX_CFG_SIGNAL_SBAS_ENA, SFE_UBLOX_GNSS_ID_SBAS, true, "SBAS"}, - {UBLOX_CFG_SIGNAL_GAL_ENA, SFE_UBLOX_GNSS_ID_GALILEO, true, "Galileo"}, - {UBLOX_CFG_SIGNAL_BDS_ENA, SFE_UBLOX_GNSS_ID_BEIDOU, true, "BeiDou"}, - //{UBLOX_CFG_SIGNAL_QZSS_ENA, SFE_UBLOX_GNSS_ID_IMES, false, "IMES"}, //Not yet supported? Config key does not - // exist? - {UBLOX_CFG_SIGNAL_QZSS_ENA, SFE_UBLOX_GNSS_ID_QZSS, true, "QZSS"}, - {UBLOX_CFG_SIGNAL_GLO_ENA, SFE_UBLOX_GNSS_ID_GLONASS, true, "GLONASS"}, - }; - - char profileName[50] = ""; - - int16_t serialTimeoutGNSS = 1; // In ms - used during serialGNSS->begin. Number of ms to pass of no data before - // hardware serial reports data available. - - // Point Perfect - char pointPerfectDeviceProfileToken[40] = ""; - bool enablePointPerfectCorrections = false; // Things are better now. We could default to true. Also change line 940 in index.html - bool autoKeyRenewal = true; // Attempt to get keys if we get under 28 days from the expiration date - char pointPerfectClientID[50] = ""; // Obtained during ZTP - char pointPerfectBrokerHost[50] = ""; // pp.services.u-blox.com - char pointPerfectKeyDistributionTopic[20] = ""; // /pp/ubx/0236/ip or /pp/ubx/0236/Lb - from ZTP - - char pointPerfectCurrentKey[33] = ""; // 32 hexadecimal digits = 128 bits = 16 Bytes - uint64_t pointPerfectCurrentKeyDuration = 0; - uint64_t pointPerfectCurrentKeyStart = 0; - - char pointPerfectNextKey[33] = ""; - uint64_t pointPerfectNextKeyDuration = 0; - uint64_t pointPerfectNextKeyStart = 0; - - uint64_t lastKeyAttempt = 0; // Epoch time of last attempt at obtaining keys - bool updateGNSSSettings = true; // When in doubt, update the ZED with current settings - - bool debugPpCertificate = false; // Debug Point Perfect certificate management - - // Time Zone - Default to UTC - int8_t timeZoneHours = 0; - int8_t timeZoneMinutes = 0; - int8_t timeZoneSeconds = 0; - // Debug settings - bool enablePrintState = false; - bool enablePrintPosition = false; - bool enablePrintIdleTime = false; + // Battery bool enablePrintBatteryMessages = true; - bool enablePrintRoverAccuracy = true; - bool enablePrintBadMessages = false; - bool enablePrintLogFileMessages = false; - bool enablePrintLogFileStatus = true; - bool enablePrintRingBufferOffsets = false; - bool enablePrintStates = true; - bool enablePrintDuplicateStates = false; - bool enablePrintRtcSync = false; + uint32_t shutdownNoChargeTimeout_s = 0; // If > 0, shut down unit after timeout if not charging - uint8_t espnowPeers[ESPNOW_MAX_PEERS][6] = {0}; // Contains the MAC addresses (6 bytes) of paired units + // Beeper + bool enableBeeper = true; // Some platforms have an audible notification - uint8_t espnowPeerCount = 0; - bool enableRtcmMessageChecking = false; + // Bluetooth BluetoothRadioType_e bluetoothRadioType = BLUETOOTH_RADIO_SPP_AND_BLE; - bool runLogTest = false; // When set to true, device will create a series of test logs - bool espnowBroadcast = false; // When true, overrides peers and sends all data via broadcast - int16_t antennaHeight = 0; // in mm - float antennaReferencePoint = 0.0; // in mm - bool echoUserInput = true; - int uartReceiveBufferSize = 1024 * 2; // This buffer is filled automatically as the UART receives characters. - int gnssHandlerBufferSize = - 1024 * 4; // This buffer is filled from the UART receive buffer, and is then written to SD - - bool enablePrintBufferOverrun = false; - bool enablePrintSDBuffers = false; - PeriodicDisplay_t periodicDisplay = (PeriodicDisplay_t)0; //Turn off all periodic debug displays by default. - uint32_t periodicDisplayInterval = 15 * 1000; - - uint32_t rebootSeconds = (uint32_t)-1; // Disabled, reboots after uptime reaches this number of seconds - bool forceResetOnSDFail = false; // Set to true to reset system if SD is detected but fails to start. + uint16_t sppRxQueueSize = 512 * 4; + uint16_t sppTxQueueSize = 32; - uint8_t minElev = 10; // Minimum elevation (in deg) for a GNSS satellite to be used in NAV - uint8_t ubxMessageRatesBase[MAX_UBX_MSG_RTCM] = { - 254}; // Mark first record with key so defaults will be applied. Int value for each supported message - Report - // rates for RTCM Base. Default to u-blox recommended rates. + // Corrections + int correctionsSourcesLifetime_s = 30; // Expire a corrections source if no data is seen for this many seconds + int correctionsSourcesPriority[correctionsSource::CORR_NUM] = { -1 }; // -1 indicates array is uninitialized + bool debugCorrections = false; + // Display + bool enableResetDisplay = false; - CoordinateInputType coordinateInputType = COORDINATE_INPUT_TYPE_DD; // Default DD.ddddddddd - uint16_t lbandFixTimeout_seconds = 180; // Number of seconds of no L-Band fix before resetting ZED - int16_t minCNO = 6; // Minimum satellite signal level for navigation. ZED-F9P default is 6 dBHz - uint16_t serialGNSSRxFullThreshold = 50; // RX FIFO full interrupt. Max of ~128. See pinUART2Task(). - uint8_t btReadTaskPriority = 1; // Read from BT SPP and Write to GNSS. 3 being the highest, and 0 being the lowest - uint8_t gnssReadTaskPriority = - 1; // Read from ZED-F9x and Write to circular buffer (SD, TCP, BT). 3 being the highest, and 0 being the lowest - uint8_t handleGnssDataTaskPriority = 1; // Read from the cicular buffer and dole out to end points (SD, TCP, BT). - uint8_t btReadTaskCore = 1; // Core where task should run, 0=core, 1=Arduino - uint8_t gnssReadTaskCore = 1; // Core where task should run, 0=core, 1=Arduino - uint8_t handleGnssDataTaskCore = 1; // Core where task should run, 0=core, 1=Arduino - uint8_t gnssUartInterruptsCore = - 1; // Core where hardware is started and interrupts are assigned to, 0=core, 1=Arduino - uint8_t bluetoothInterruptsCore = - 1; // Core where hardware is started and interrupts are assigned to, 0=core, 1=Arduino - uint8_t i2cInterruptsCore = 1; // Core where hardware is started and interrupts are assigned to, 0=core, 1=Arduino - uint32_t shutdownNoChargeTimeout_s = 0; // If > 0, shut down unit after timeout if not charging - bool disableSetupButton = false; // By default, allow setup through the overlay button(s) + // ESP Now + bool debugEspNow = false; + bool enableEspNow = false; + bool espnowBroadcast = false; // When true, overrides peers and sends all data via broadcast + uint8_t espnowPeerCount = 0; + uint8_t espnowPeers[ESPNOW_MAX_PEERS][6] = {0}; // Contains the MAC addresses (6 bytes) of paired units // Ethernet bool enablePrintEthernetDiag = false; bool ethernetDHCP = true; - IPAddress ethernetIP = {192, 168, 0, 123}; IPAddress ethernetDNS = {194, 168, 4, 100}; IPAddress ethernetGateway = {192, 168, 0, 1}; + IPAddress ethernetIP = {192, 168, 0, 123}; IPAddress ethernetSubnet = {255, 255, 255, 0}; - uint16_t httpPort = 80; - // WiFi - bool debugWifiState = false; - bool wifiConfigOverAP = true; // Configure device over Access Point or have it connect to WiFi - WiFiNetwork wifiNetworks[MAX_WIFI_NETWORKS] = { - {"", ""}, - {"", ""}, - {"", ""}, - {"", ""}, - }; + // Firmware + uint32_t autoFirmwareCheckMinutes = 24 * 60; + bool debugFirmwareUpdate = false; + bool enableAutoFirmwareUpdate = false; - // Network layer - uint8_t defaultNetworkType = NETWORK_TYPE_USE_DEFAULT; - bool debugNetworkLayer = false; // Enable debugging of the network layer - bool enableNetworkFailover = true; // Enable failover between Ethernet / WiFi - bool printNetworkStatus = true; // Print network status (delays, failovers, IP address) + // GNSS UART + uint16_t serialGNSSRxFullThreshold = 50; // RX FIFO full interrupt. Max of ~128. See pinUART2Task(). + int uartReceiveBufferSize = 1024 * 2; // This buffer is filled automatically as the UART receives characters. - // Multicast DNS Server - bool mdnsEnable = true; // Allows locating of device from browser address 'rtk.local' + // Hardware + bool enableExternalHardwareEventLogging = false; // Log when INT/TM2 pin goes low + uint16_t spiFrequency = 16; // By default, use 16MHz SPI - // MQTT Client (PointPerfect) + // Log file + bool enableLogging = true; // If an SD card is present, log default sentences + bool enablePrintLogFileMessages = false; + bool enablePrintLogFileStatus = true; + int maxLogLength_minutes = 60 * 24; // Default to 24 hours + int maxLogTime_minutes = 60 * 24; // Default to 24 hours + bool runLogTest = false; // When set to true, device will create a series of test logs + + // MQTT bool debugMqttClientData = false; // Debug the MQTT SPARTAN data flow bool debugMqttClientState = false; // Debug the MQTT state machine + // Multicast DNS + bool mdnsEnable = true; // Allows locating of device from browser address 'rtk.local' + + // Network layer + bool debugNetworkLayer = false; // Enable debugging of the network layer + uint8_t defaultNetworkType = NETWORK_TYPE_USE_DEFAULT; + bool enableNetworkFailover = true; // Enable failover between Ethernet / WiFi + bool printNetworkStatus = true; // Print network status (delays, failovers, IP address) + // NTP bool debugNtp = false; - uint16_t ethernetNtpPort = 123; bool enableNTPFile = false; // Log NTP requests to file + uint16_t ethernetNtpPort = 123; uint8_t ntpPollExponent = 6; // NTPpacket::defaultPollExponent 2^6 = 64 seconds int8_t ntpPrecision = -20; // NTPpacket::defaultPrecision 2^-20 = 0.95us + char ntpReferenceId[5] = {'G', 'P', 'S', 0, + 0}; // NTPpacket::defaultReferenceId. Ref ID is 4 chars. Add one extra for a NULL. uint32_t ntpRootDelay = 0; // NTPpacket::defaultRootDelay = 0. ntpRootDelay is defined in microseconds. // ntpProcessOneRequest will convert it to seconds and fraction. uint32_t ntpRootDispersion = 1000; // NTPpacket::defaultRootDispersion 1007us = 2^-16 * 66. ntpRootDispersion is defined in microseconds. // ntpProcessOneRequest will convert it to seconds and fraction. - char ntpReferenceId[5] = {'G', 'P', 'S', 0, - 0}; // NTPpacket::defaultReferenceId. Ref ID is 4 chars. Add one extra for a NULL. // NTRIP Client bool debugNtripClientRtcm = false; @@ -1199,6 +1109,7 @@ struct Settings bool debugNtripServerRtcm = false; bool debugNtripServerState = false; bool enableNtripServer = false; + bool enableRtcmMessageChecking = false; char ntripServer_CasterHost[NTRIP_SERVER_MAX][50] = // It's free... { "rtk2go.com", @@ -1242,63 +1153,53 @@ struct Settings "", }; - // TCP Client - bool debugTcpClient = false; - bool enableTcpClient = false; - uint16_t tcpClientPort = 2948; // TCP client port. 2948 is GPS Daemon: http://tcp-udp-ports.com/port-2948.htm - char tcpClientHost[50] = ""; - - // TCP Server - bool debugTcpServer = false; - bool enableTcpServer = false; - uint16_t tcpServerPort = 2948; // TCP server port, 2948 is GPS Daemon: http://tcp-udp-ports.com/port-2948.htm - - // UDP Server - bool debugUdpServer = false; - bool enableUdpServer = false; - uint16_t udpServerPort = 10110; // NMEA-0183 Navigational Data: https://tcp-udp-ports.com/port-10110.htm - - float um980MessageRatesNMEA[MAX_UM980_NMEA_MSG] = {254}; // Mark first record with key so defaults will be applied. - float um980MessageRatesRTCMRover[MAX_UM980_RTCM_MSG] = { - 254}; // Mark first record with key so defaults will be applied. Int value for each supported message - Report - // rates for RTCM Base. Default to Unicore recommended rates. - float um980MessageRatesRTCMBase[MAX_UM980_RTCM_MSG] = { - 254}; // Mark first record with key so defaults will be applied. Int value for each supported message - Report - // rates for RTCM Base. Default to Unicore recommended rates. - uint8_t um980Constellations[MAX_UM980_CONSTELLATIONS] = {254}; // Mark first record with key so defaults will be applied. - bool enableTiltCompensation = true; // Allow user to disable tilt compensation on the models that have an IMU - float tiltPoleLength = 1.8; // Length of the rod that the device is attached to. Should not include ARP. - bool enableImuDebug = false; // Turn on to display IMU library debug messages - - // Automatic Firmware Update - bool debugFirmwareUpdate = false; - bool enableAutoFirmwareUpdate = false; - uint32_t autoFirmwareCheckMinutes = 24 * 60; - - bool debugCorrections = false; - bool enableCaptivePortal = true; - - // Boot times + // OS + uint8_t bluetoothInterruptsCore = + 1; // Core where hardware is started and interrupts are assigned to, 0=core, 1=Arduino + uint8_t btReadTaskCore = 1; // Core where task should run, 0=core, 1=Arduino + uint8_t btReadTaskPriority = 1; // Read from BT SPP and Write to GNSS. 3 being the highest, and 0 being the lowest + bool enableHeapReport = false; // Turn on to display free heap + bool enablePrintIdleTime = false; + bool enablePsram = true; // Control the use on onboard PSRAM. Used for testing behavior when PSRAM is not available. + bool enableTaskReports = false; // Turn on to display task high water marks + uint8_t gnssReadTaskCore = 1; // Core where task should run, 0=core, 1=Arduino + uint8_t gnssReadTaskPriority = + 1; // Read from ZED-F9x and Write to circular buffer (SD, TCP, BT). 3 being the highest, and 0 being the lowest + uint8_t gnssUartInterruptsCore = + 1; // Core where hardware is started and interrupts are assigned to, 0=core, 1=Arduino + uint8_t handleGnssDataTaskCore = 1; // Core where task should run, 0=core, 1=Arduino + uint8_t handleGnssDataTaskPriority = 1; // Read from the cicular buffer and dole out to end points (SD, TCP, BT). + uint8_t i2cInterruptsCore = 1; // Core where hardware is started and interrupts are assigned to, 0=core, 1=Arduino + uint8_t measurementScale = MEASUREMENTS_IN_METERS; bool printBootTimes = false; // Print times and deltas during boot - - // Partition table bool printPartitionTable = false; - - // Measurement scale - uint8_t measurementScale = MEASUREMENTS_IN_METERS; - - bool debugWiFiConfig = false; - bool enablePsram = true; // Control the use on onboard PSRAM. Used for testing behavior when PSRAM is not available. bool printTaskStartStop = false; uint16_t psramMallocLevel = 40; // By default, push as much as possible to PSRAM. Needed to do secure WiFi (MQTT) + BT + PPL - bool enableBeeper = true; // Some platforms have an audible notification - bool enableImuCompensationDebug = false; + uint32_t rebootSeconds = (uint32_t)-1; // Disabled, reboots after uptime reaches this number of seconds + int resetCount = 0; - int correctionsSourcesPriority[correctionsSource::CORR_NUM] = { -1 }; // -1 indicates array is uninitialized - int correctionsSourcesLifetime_s = 30; // Expire a corrections source if no data is seen for this many seconds - - int geographicRegion = 0; // Default to US - first entry in Regional_Information_Table + // Periodic Display + PeriodicDisplay_t periodicDisplay = (PeriodicDisplay_t)0; //Turn off all periodic debug displays by default. + uint32_t periodicDisplayInterval = 15 * 1000; + // Point Perfect + bool autoKeyRenewal = true; // Attempt to get keys if we get under 28 days from the expiration date + bool debugPpCertificate = false; // Debug Point Perfect certificate management + bool enablePointPerfectCorrections = false; // Things are better now. We could default to true. Also change line 940 in index.html + int geographicRegion = 0; // Default to US - first entry in Regional_Information_Table + uint64_t lastKeyAttempt = 0; // Epoch time of last attempt at obtaining keys + uint16_t lbandFixTimeout_seconds = 180; // Number of seconds of no L-Band fix before resetting ZED + char pointPerfectBrokerHost[50] = ""; // pp.services.u-blox.com + char pointPerfectClientID[50] = ""; // Obtained during ZTP + char pointPerfectCurrentKey[33] = ""; // 32 hexadecimal digits = 128 bits = 16 Bytes + uint64_t pointPerfectCurrentKeyDuration = 0; + uint64_t pointPerfectCurrentKeyStart = 0; + char pointPerfectDeviceProfileToken[40] = ""; + char pointPerfectKeyDistributionTopic[20] = ""; // /pp/ubx/0236/ip or /pp/ubx/0236/Lb - from ZTP + char pointPerfectNextKey[33] = ""; + uint64_t pointPerfectNextKeyDuration = 0; + uint64_t pointPerfectNextKeyStart = 0; + uint16_t pplFixTimeoutS = 180; // Number of seconds of no RTK fix when using PPL before resetting GNSS // The correction topics are provided during ZTP (pointperfectTryZtpToken) // For IP-only plans, these will be /pp/ip/us, /pp/ip/eu, etc. // For L-Band+IP plans, these will be /pp/Lb/us, /pp/Lb/eu, etc. @@ -1312,17 +1213,133 @@ struct Settings "", }; - bool debugEspNow = false; - bool enableEspNow = false; - uint8_t wifiChannel = 1; //Valid channels are 1 to 14 - bool enableGalileoHas = true; // Allow E6 corrections if possible + // Profiles + char profileName[50] = ""; + + // Pulse + bool enableExternalPulse = true; // Send pulse once lock is achieved + uint64_t externalPulseLength_us = 100000; // us length of pulse, max of 60s = 60 * 1000 * 1000 + pulseEdgeType_e externalPulsePolarity = PULSE_RISING_EDGE; // Pulse rises for pulse length, then falls + uint64_t externalPulseTimeBetweenPulse_us = 1000000; // us between pulses, max of 60s = 60 * 1000 * 1000 + // Radio + muxConnectionType_e dataPortChannel = MUX_UBLOX_NMEA; // Mux default to ublox UART1 + bool debugGnss = false; // Turn on to display GNSS library debug messages + bool enablePrintPosition = false; + uint16_t measurementRateMs = 250; // Elapsed ms between GNSS measurements. 25ms to 65535ms. Default 4Hz. + uint16_t navigationRate = + 1; // Ratio between number of measurements and navigation solutions. Default 1 for 4Hz (with measurementRate). + bool updateGNSSSettings = true; // When in doubt, update the ZED with current settings + + // Ring Buffer + bool enablePrintRingBufferOffsets = false; + int gnssHandlerBufferSize = + 1024 * 4; // This buffer is filled from the UART receive buffer, and is then written to SD + + // Rover operation + uint8_t dynamicModel = DYN_MODEL_PORTABLE; + bool enablePrintRoverAccuracy = true; + int16_t minCNO = 6; // Minimum satellite signal level for navigation. ZED-F9P default is 6 dBHz + uint8_t minElev = 10; // Minimum elevation (in deg) for a GNSS satellite to be used in NAV + + // RTC (Real Time Clock) + bool enablePrintRtcSync = false; + + // SD Card + bool enablePrintBufferOverrun = false; + bool enablePrintSDBuffers = false; + bool enableSD = true; + bool forceResetOnSDFail = false; // Set to true to reset system if SD is detected but fails to start. + + // Serial + uint32_t dataPortBaud = + (115200 * 2); // Default to 230400bps. This limits GNSS fixes at 4Hz but allows SD buffer to be reduced to 6k. + bool echoUserInput = true; bool enableGnssToUsbSerial = false; - uint16_t pplFixTimeoutS = 180; // Number of seconds of no RTK fix when using PPL before resetting GNSS + uint32_t radioPortBaud = 57600; // Default to 57600bps to support connection to SiK1000 type telemetry radios + int16_t serialTimeoutGNSS = 1; // In ms - used during serialGNSS->begin. Number of ms to pass of no data before + // hardware serial reports data available. + + // Setup Button + bool disableSetupButton = false; // By default, allow setup through the overlay button(s) + + // State + bool enablePrintDuplicateStates = false; + bool enablePrintState = false; + bool enablePrintStates = true; + SystemState lastState = STATE_NOT_SET; // Start unit in last known state + + // TCP Client + bool debugTcpClient = false; + bool enableTcpClient = false; + char tcpClientHost[50] = ""; + uint16_t tcpClientPort = 2948; // TCP client port. 2948 is GPS Daemon: http://tcp-udp-ports.com/port-2948.htm + + // TCP Server + bool debugTcpServer = false; + bool enableTcpServer = false; + uint16_t tcpServerPort = 2948; // TCP server port, 2948 is GPS Daemon: http://tcp-udp-ports.com/port-2948.htm + + // Time Zone - Default to UTC + int8_t timeZoneHours = 0; + int8_t timeZoneMinutes = 0; + int8_t timeZoneSeconds = 0; + + // UBX (SX1276) + bool enableUART2UBXIn = false; // UBX Protocol In on UART2 + ubxConstellation ubxConstellations[MAX_CONSTELLATIONS] = { // Constellations monitored/used for fix + {UBLOX_CFG_SIGNAL_GPS_ENA, SFE_UBLOX_GNSS_ID_GPS, true, "GPS"}, + {UBLOX_CFG_SIGNAL_SBAS_ENA, SFE_UBLOX_GNSS_ID_SBAS, true, "SBAS"}, + {UBLOX_CFG_SIGNAL_GAL_ENA, SFE_UBLOX_GNSS_ID_GALILEO, true, "Galileo"}, + {UBLOX_CFG_SIGNAL_BDS_ENA, SFE_UBLOX_GNSS_ID_BEIDOU, true, "BeiDou"}, + //{UBLOX_CFG_SIGNAL_QZSS_ENA, SFE_UBLOX_GNSS_ID_IMES, false, "IMES"}, //Not yet supported? Config key does not + // exist? + {UBLOX_CFG_SIGNAL_QZSS_ENA, SFE_UBLOX_GNSS_ID_QZSS, true, "QZSS"}, + {UBLOX_CFG_SIGNAL_GLO_ENA, SFE_UBLOX_GNSS_ID_GLONASS, true, "GLONASS"}, + }; + uint8_t ubxMessageRates[MAX_UBX_MSG] = {254}; // Mark first record with key so defaults will be applied. + uint8_t ubxMessageRatesBase[MAX_UBX_MSG_RTCM] = { + 254}; // Mark first record with key so defaults will be applied. Int value for each supported message - Report + // rates for RTCM Base. Default to u-blox recommended rates. + + // UDP Server + bool debugUdpServer = false; + bool enableUdpServer = false; + uint16_t udpServerPort = 10110; // NMEA-0183 Navigational Data: https://tcp-udp-ports.com/port-10110.htm + + // UM980 + bool enableGalileoHas = true; // Allow E6 corrections if possible + bool enableImuCompensationDebug = false; + bool enableImuDebug = false; // Turn on to display IMU library debug messages + bool enableTiltCompensation = true; // Allow user to disable tilt compensation on the models that have an IMU + float tiltPoleLength = 1.8; // Length of the rod that the device is attached to. Should not include ARP. + uint8_t um980Constellations[MAX_UM980_CONSTELLATIONS] = {254}; // Mark first record with key so defaults will be applied. + float um980MessageRatesNMEA[MAX_UM980_NMEA_MSG] = {254}; // Mark first record with key so defaults will be applied. + float um980MessageRatesRTCMBase[MAX_UM980_RTCM_MSG] = { + 254}; // Mark first record with key so defaults will be applied. Int value for each supported message - Report + // rates for RTCM Base. Default to Unicore recommended rates. + float um980MessageRatesRTCMRover[MAX_UM980_RTCM_MSG] = { + 254}; // Mark first record with key so defaults will be applied. Int value for each supported message - Report + // rates for RTCM Base. Default to Unicore recommended rates. - // Add new settings above <------------------------------------------------------------> - // Then also add to rtkSettingsEntries below + // Web Server + uint16_t httpPort = 80; + // WiFi + bool debugWiFiConfig = false; + bool debugWifiState = false; + bool enableCaptivePortal = true; + uint8_t wifiChannel = 1; //Valid channels are 1 to 14 + bool wifiConfigOverAP = true; // Configure device over Access Point or have it connect to WiFi + WiFiNetwork wifiNetworks[MAX_WIFI_NETWORKS] = { + {"", ""}, + {"", ""}, + {"", ""}, + {"", ""}, + }; + + // Add new settings to appropriate group above or create new group + // Then also add to the same group in rtkSettingsEntries below } settings; typedef enum { @@ -1383,12 +1400,17 @@ const RTK_Settings_Entry rtkSettingsEntries[] = // G S C // N e m // S t d -// S t s Type Qual Variable Name - { 0, 1, 1, _bool, 0, & settings.enableSD, "enableSD"}, - { 0, 1, 1, _int, 0, & settings.maxLogTime_minutes, "maxLogTime"}, - { 0, 1, 1, _int, 0, & settings.maxLogLength_minutes, "maxLogLength", }, - { 1, 1, 1, _int, 0, & settings.observationSeconds, "observationSeconds", }, - { 1, 1, 1, _float, 2, & settings.observationPositionAccuracy, "observationPositionAccuracy", }, +// S t s Type Qual Variable Name + + // Antenna + { 0, 1, 1, _int16_t, 0, & settings.antennaHeight, "antennaHeight", }, + { 0, 1, 1, _float, 2, & settings.antennaReferencePoint, "antennaReferencePoint" }, + { 0, 1, 1, _uint16_t, 0, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", }, + { 0, 1, 1, _bool, 0, & settings.enableARPLogging, "enableARPLogging", }, + + // Base operation + { 0, 1, 1, tCoordInp, 0, & settings.coordinateInputType, "coordinateInputType", }, + { 1, 1, 1, _double, 4, & settings.fixedAltitude, "fixedAltitude", }, { 1, 0, 1, _bool, 0, & settings.fixedBase, "fixedBase", }, { 1, 0, 1, _bool, 0, & settings.fixedBaseCoordinateType, "fixedBaseCoordinateType", }, { 1, 1, 1, _double, 3, & settings.fixedEcefX, "fixedEcefX", }, @@ -1396,151 +1418,90 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { 1, 1, 1, _double, 3, & settings.fixedEcefZ, "fixedEcefZ", }, { 1, 1, 1, _double, 9, & settings.fixedLat, "fixedLat", }, { 1, 1, 1, _double, 9, & settings.fixedLong, "fixedLong", }, - { 1, 1, 1, _double, 4, & settings.fixedAltitude, "fixedAltitude", }, - { 1, 1, 1, _uint32_t, 0, & settings.dataPortBaud, "dataPortBaud", }, - { 1, 1, 1, _uint32_t, 0, & settings.radioPortBaud, "radioPortBaud", }, + { 1, 1, 1, _int, 0, & settings.observationSeconds, "observationSeconds", }, + { 1, 1, 1, _float, 2, & settings.observationPositionAccuracy, "observationPositionAccuracy", }, { 1, 1, 1, _float, 1, & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", }, - { 1, 0, 1, _uint16_t, 0, & settings.measurementRateMs, "measurementRateMs", }, - { 1, 0, 1, _uint16_t, 0, & settings.navigationRate, "navigationRate", }, - { 0, 1, 1, _bool, 0, & settings.debugGnss, "debugGnss", }, - { 0, 1, 1, _bool, 0, & settings.enableHeapReport, "enableHeapReport", }, - { 0, 1, 1, _bool, 0, & settings.enableTaskReports, "enableTaskReports", }, - { 0, 1, 1, tMuxConn, 0, & settings.dataPortChannel, "dataPortChannel", }, - { 0, 1, 1, _uint16_t, 0, & settings.spiFrequency, "spiFrequency", }, - { 0, 1, 1, _bool, 0, & settings.enableLogging, "enableLogging", }, - { 0, 1, 1, _bool, 0, & settings.enableARPLogging, "enableARPLogging", }, - { 0, 1, 1, _uint16_t, 0, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", }, - { 0, 1, 1, _uint16_t, 0, & settings.sppRxQueueSize, "sppRxQueueSize", }, - { 0, 1, 1, _uint16_t, 0, & settings.sppTxQueueSize, "sppTxQueueSize", }, - { 1, 1, 1, _uint8_t, 0, & settings.dynamicModel, "dynamicModel", }, - { 1, 0, 1, tSysState, 0, & settings.lastState, "lastState", }, - { 0, 1, 1, _bool, 0, & settings.enableResetDisplay, "enableResetDisplay", }, - { 0, 1, 1, _int, 0, & settings.resetCount, "resetCount", }, - { 1, 1, 1, _bool, 0, & settings.enableExternalPulse, "enableExternalPulse", }, - { 1, 1, 1, _uint64_t, 0, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", }, - { 1, 1, 1, _uint64_t, 0, & settings.externalPulseLength_us, "externalPulseLength", }, - { 1, 1, 1, tPulseEdg, 0, & settings.externalPulsePolarity, "externalPulsePolarity", }, - { 1, 1, 1, _bool, 0, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", }, - { 0, 1, 1, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, - { 1, 0, 1, tUbxMsgRt, MAX_UBX_MSG, & settings.ubxMessageRates[0], "ubxMessageRate_", }, - - { 1, 1, 1, tUbxConst, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "ubxConstellation_", }, - - { 0, 0, 1, tCharArry, sizeof(settings.profileName), & settings.profileName, "profileName", }, - - { 0, 1, 1, _int16_t, 0, & settings.serialTimeoutGNSS, "serialTimeoutGNSS", }, - - { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectDeviceProfileToken), & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", }, - { 0, 1, 1, _bool, 0, & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", }, - { 0, 1, 1, _bool, 0, & settings.autoKeyRenewal, "autoKeyRenewal", }, - { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectClientID), & settings.pointPerfectClientID, "pointPerfectClientID", }, - { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectBrokerHost), & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", }, - { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectKeyDistributionTopic), & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", }, - - { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectCurrentKey), & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", }, - { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", }, - { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", }, - - { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectNextKey), & settings.pointPerfectNextKey, "pointPerfectNextKey", }, - { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", }, - { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", }, - - { 0, 1, 1, _uint64_t, 0, & settings.lastKeyAttempt, "lastKeyAttempt", }, - { 0, 1, 1, _bool, 0, & settings.updateGNSSSettings, "updateGNSSSettings", }, - - { 0, 0, 1, _bool, 0, & settings.debugPpCertificate, "debugPpCertificate", }, - - { 0, 1, 1, _int8_t, 0, & settings.timeZoneHours, "timeZoneHours", }, - { 0, 1, 1, _int8_t, 0, & settings.timeZoneMinutes, "timeZoneMinutes", }, - { 0, 1, 1, _int8_t, 0, & settings.timeZoneSeconds, "timeZoneSeconds", }, - - { 0, 1, 1, _bool, 0, & settings.enablePrintState, "enablePrintState", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintPosition, "enablePrintPosition", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintIdleTime, "enablePrintIdleTime", }, + // Battery { 0, 1, 1, _bool, 0, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintRoverAccuracy, "enablePrintRoverAccuracy", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintBadMessages, "enablePrintBadMessages", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintLogFileMessages, "enablePrintLogFileMessages", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintLogFileStatus, "enablePrintLogFileStatus", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintStates, "enablePrintStates", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintRtcSync, "enablePrintRtcSync", }, + { 0, 1, 1, _uint32_t, 0, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", }, - { 0, 1, 1, tEspNowPr, ESPNOW_MAX_PEERS, & settings.espnowPeers[0][0], "espnowPeer_", }, + // Beeper + { 0, 1, 1, _bool, 0, & settings.enableBeeper, "enableBeeper", }, - { 0, 1, 1, _uint8_t, 0, & settings.espnowPeerCount, "espnowPeerCount", }, - { 0, 0, 1, _bool, 0, & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", }, + // Bluetooth { 0, 1, 1, tBtRadio, 0, & settings.bluetoothRadioType, "bluetoothRadioType", }, - { 0, 1, 1, _bool, 0, & settings.runLogTest, "runLogTest", }, // Not stored in NVM - { 0, 1, 1, _bool, 0, & settings.espnowBroadcast, "espnowBroadcast", }, - { 0, 1, 1, _int16_t, 0, & settings.antennaHeight, "antennaHeight", }, - { 0, 1, 1, _float, 2, & settings.antennaReferencePoint, "antennaReferencePoint" }, - { 0, 1, 1, _bool, 0, & settings.echoUserInput, "echoUserInput", }, - { 0, 1, 1, _int, 0, & settings.uartReceiveBufferSize, "uartReceiveBufferSize", }, - { 0, 1, 1, _int, 0, & settings.gnssHandlerBufferSize, "gnssHandlerBufferSize", }, - - { 0, 1, 1, _bool, 0, & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintSDBuffers, "enablePrintSDBuffers", }, - { 0, 1, 1, tPerDisp, 0, & settings.periodicDisplay, "periodicDisplay", }, - { 0, 1, 1, _uint32_t, 0, & settings.periodicDisplayInterval, "periodicDisplayInterval", }, - - { 0, 1, 1, _uint32_t, 0, & settings.rebootSeconds, "rebootSeconds", }, - { 0, 1, 1, _bool, 0, & settings.forceResetOnSDFail, "forceResetOnSDFail", }, + { 0, 1, 1, _uint16_t, 0, & settings.sppRxQueueSize, "sppRxQueueSize", }, + { 0, 1, 1, _uint16_t, 0, & settings.sppTxQueueSize, "sppTxQueueSize", }, - { 1, 1, 1, _uint8_t, 0, & settings.minElev, "minElev", }, + // Corrections + { 0, 1, 1, _int, 0, & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", }, + { 0, 1, 1, tCorrSPri, correctionsSource::CORR_NUM, & settings.correctionsSourcesPriority, "correctionsPriority_", }, + { 0, 1, 1, _bool, 0, & settings.debugCorrections, "debugCorrections", }, - { 1, 0, 1, tUbMsgRtb, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "ubxMessageRateBase_", }, + // Display + { 0, 1, 1, _bool, 0, & settings.enableResetDisplay, "enableResetDisplay", }, - { 0, 1, 1, tCoordInp, 0, & settings.coordinateInputType, "coordinateInputType", }, - { 0, 1, 1, _uint16_t, 0, & settings.lbandFixTimeout_seconds, "lbandFixTimeout", }, - { 1, 0, 1, _int16_t, 0, & settings.minCNO, "minCNO", }, - { 0, 1, 1, _uint16_t, 0, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", }, - { 0, 1, 1, _uint8_t, 0, & settings.btReadTaskPriority, "btReadTaskPriority", }, - { 0, 1, 1, _uint8_t, 0, & settings.gnssReadTaskPriority, "gnssReadTaskPriority", }, - { 0, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskPriority, "handleGnssDataTaskPriority", }, - { 0, 1, 1, _uint8_t, 0, & settings.btReadTaskCore, "btReadTaskCore", }, - { 0, 1, 1, _uint8_t, 0, & settings.gnssReadTaskCore, "gnssReadTaskCore", }, - { 0, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskCore, "handleGnssDataTaskCore", }, - { 0, 1, 1, _uint8_t, 0, & settings.gnssUartInterruptsCore, "gnssUartInterruptsCore", }, - { 0, 1, 1, _uint8_t, 0, & settings.bluetoothInterruptsCore, "bluetoothInterruptsCore", }, - { 0, 1, 1, _uint8_t, 0, & settings.i2cInterruptsCore, "i2cInterruptsCore", }, - { 0, 1, 1, _uint32_t, 0, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", }, - { 0, 1, 1, _bool, 0, & settings.disableSetupButton, "disableSetupButton", }, + // ESP Now + { 0, 1, 1, _bool, 0, & settings.debugEspNow, "debugEspNow", }, + { 0, 1, 1, _bool, 0, & settings.enableEspNow, "enableEspNow", }, + { 0, 1, 1, _bool, 0, & settings.espnowBroadcast, "espnowBroadcast", }, + { 0, 1, 1, _uint8_t, 0, & settings.espnowPeerCount, "espnowPeerCount", }, + { 0, 1, 1, tEspNowPr, ESPNOW_MAX_PEERS, & settings.espnowPeers[0][0], "espnowPeer_", }, + // Ethernet { 0, 1, 1, _bool, 0, & settings.enablePrintEthernetDiag, "enablePrintEthernetDiag", }, { 0, 1, 1, _bool, 0, & settings.ethernetDHCP, "ethernetDHCP", }, - { 0, 1, 1, _IPString, 0, & settings.ethernetIP, "ethernetIP", }, { 0, 1, 1, _IPString, 0, & settings.ethernetDNS, "ethernetDNS", }, { 0, 1, 1, _IPString, 0, & settings.ethernetGateway, "ethernetGateway", }, + { 0, 1, 1, _IPString, 0, & settings.ethernetIP, "ethernetIP", }, { 0, 1, 1, _IPString, 0, & settings.ethernetSubnet, "ethernetSubnet", }, - { 0, 1, 1, _uint16_t, 0, & settings.httpPort, "httpPort", }, - { 0, 1, 1, _bool, 0, & settings.debugWifiState, "debugWifiState", }, - { 0, 0, 1, _bool, 0, & settings.wifiConfigOverAP, "wifiConfigOverAP", }, // TODO: check drop downs + // Firmware + { 0, 1, 1, _uint32_t, 0, & settings.autoFirmwareCheckMinutes, "autoFirmwareCheckMinutes", }, + { 0, 1, 1, _bool, 0, & settings.debugFirmwareUpdate, "debugFirmwareUpdate", }, + { 0, 1, 1, _bool, 0, & settings.enableAutoFirmwareUpdate, "enableAutoFirmwareUpdate", }, - { 0, 1, 1, tWiFiNet, MAX_WIFI_NETWORKS, & settings.wifiNetworks, "wifiNetwork_", }, + // GNSS UART + { 0, 1, 1, _uint16_t, 0, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", }, + { 0, 1, 1, _int, 0, & settings.uartReceiveBufferSize, "uartReceiveBufferSize", }, - { 0, 1, 1, _uint8_t, 0, & settings.defaultNetworkType, "defaultNetworkType", }, - { 0, 1, 1, _bool, 0, & settings.debugNetworkLayer, "debugNetworkLayer", }, - { 0, 1, 1, _bool, 0, & settings.enableNetworkFailover, "enableNetworkFailover", }, - { 0, 1, 1, _bool, 0, & settings.printNetworkStatus, "printNetworkStatus", }, + // Hardware + { 1, 1, 1, _bool, 0, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", }, + { 0, 1, 1, _uint16_t, 0, & settings.spiFrequency, "spiFrequency", }, - { 0, 1, 1, _bool, 0, & settings.mdnsEnable, "mdnsEnable", }, + // Log file + { 0, 1, 1, _bool, 0, & settings.enableLogging, "enableLogging", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintLogFileMessages, "enablePrintLogFileMessages", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintLogFileStatus, "enablePrintLogFileStatus", }, + { 0, 1, 1, _int, 0, & settings.maxLogLength_minutes, "maxLogLength", }, + { 0, 1, 1, _int, 0, & settings.maxLogTime_minutes, "maxLogTime"}, + { 0, 1, 1, _bool, 0, & settings.runLogTest, "runLogTest", }, // Not stored in NVM + // MQTT { 0, 1, 1, _bool, 0, & settings.debugMqttClientData, "debugMqttClientData", }, { 0, 1, 1, _bool, 0, & settings.debugMqttClientState, "debugMqttClientState", }, + // Multicast DNS + { 0, 1, 1, _bool, 0, & settings.mdnsEnable, "mdnsEnable", }, + + // Network layer + { 0, 1, 1, _bool, 0, & settings.debugNetworkLayer, "debugNetworkLayer", }, + { 0, 1, 1, _uint8_t, 0, & settings.defaultNetworkType, "defaultNetworkType", }, + { 0, 1, 1, _bool, 0, & settings.enableNetworkFailover, "enableNetworkFailover", }, + { 0, 1, 1, _bool, 0, & settings.printNetworkStatus, "printNetworkStatus", }, + + // NTP { 0, 1, 1, _bool, 0, & settings.debugNtp, "debugNtp", }, - { 0, 1, 1, _uint16_t, 0, & settings.ethernetNtpPort, "ethernetNtpPort", }, { 0, 1, 1, _bool, 0, & settings.enableNTPFile, "enableNTPFile", }, + { 0, 1, 1, _uint16_t, 0, & settings.ethernetNtpPort, "ethernetNtpPort", }, { 0, 1, 1, _uint8_t, 0, & settings.ntpPollExponent, "ntpPollExponent", }, { 0, 1, 1, _int8_t, 0, & settings.ntpPrecision, "ntpPrecision", }, + { 0, 1, 1, tCharArry, sizeof(settings.ntpReferenceId), & settings.ntpReferenceId, "ntpReferenceId", }, { 0, 1, 1, _uint32_t, 0, & settings.ntpRootDelay, "ntpRootDelay", }, { 0, 1, 1, _uint32_t, 0, & settings.ntpRootDispersion, "ntpRootDispersion", }, - { 0, 1, 1, tCharArry, sizeof(settings.ntpReferenceId), & settings.ntpReferenceId, "ntpReferenceId", }, + // NTRIP Client { 0, 1, 1, _bool, 0, & settings.debugNtripClientRtcm, "debugNtripClientRtcm", }, { 0, 1, 1, _bool, 0, & settings.debugNtripClientState, "debugNtripClientState", }, { 0, 1, 1, _bool, 0, & settings.enableNtripClient, "enableNtripClient", }, @@ -1552,10 +1513,11 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { 0, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPointPW), & settings.ntripClient_MountPointPW, "ntripClientMountPointPW", }, { 0, 1, 1, _bool, 0, & settings.ntripClient_TransmitGGA, "ntripClientTransmitGGA", }, + // NTRIP Server { 0, 1, 1, _bool, 0, & settings.debugNtripServerRtcm, "debugNtripServerRtcm", }, { 0, 1, 1, _bool, 0, & settings.debugNtripServerState, "debugNtripServerState", }, { 0, 1, 1, _bool, 0, & settings.enableNtripServer, "enableNtripServer", }, - + { 0, 0, 1, _bool, 0, & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", }, { 0, 1, 1, tNSCHost, NTRIP_SERVER_MAX, & settings.ntripServer_CasterHost[0], "ntripServerCasterHost_", }, { 0, 1, 1, tNSCPort, NTRIP_SERVER_MAX, & settings.ntripServer_CasterPort[0], "ntripServerCasterPort_", }, { 0, 1, 1, tNSCUser, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUser[0], "ntripServerCasterUser_", }, @@ -1563,65 +1525,155 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { 0, 1, 1, tNSMtPt, NTRIP_SERVER_MAX, & settings.ntripServer_MountPoint[0], "ntripServerMountPoint_", }, { 0, 1, 1, tNSMtPtPw, NTRIP_SERVER_MAX, & settings.ntripServer_MountPointPW[0], "ntripServerMountPointPW_", }, + // OS + { 0, 1, 1, _uint8_t, 0, & settings.bluetoothInterruptsCore, "bluetoothInterruptsCore", }, + { 0, 1, 1, _uint8_t, 0, & settings.btReadTaskCore, "btReadTaskCore", }, + { 0, 1, 1, _uint8_t, 0, & settings.btReadTaskPriority, "btReadTaskPriority", }, + { 0, 1, 1, _bool, 0, & settings.enableHeapReport, "enableHeapReport", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintIdleTime, "enablePrintIdleTime", }, + { 0, 1, 1, _bool, 0, & settings.enablePsram, "enablePsram", }, + { 0, 1, 1, _bool, 0, & settings.enableTaskReports, "enableTaskReports", }, + { 0, 1, 1, _uint8_t, 0, & settings.gnssReadTaskCore, "gnssReadTaskCore", }, + { 0, 1, 1, _uint8_t, 0, & settings.gnssReadTaskPriority, "gnssReadTaskPriority", }, + { 0, 1, 1, _uint8_t, 0, & settings.gnssUartInterruptsCore, "gnssUartInterruptsCore", }, + { 0, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskCore, "handleGnssDataTaskCore", }, + { 0, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskPriority, "handleGnssDataTaskPriority", }, + { 0, 1, 1, _uint8_t, 0, & settings.i2cInterruptsCore, "i2cInterruptsCore", }, + { 0, 1, 1, _uint8_t, 0, & settings.measurementScale, "measurementScale", }, + { 0, 1, 1, _bool, 0, & settings.printBootTimes, "printBootTimes", }, + { 0, 1, 1, _bool, 0, & settings.printPartitionTable, "printPartitionTable", }, + { 0, 1, 1, _bool, 0, & settings.printTaskStartStop, "printTaskStartStop", }, + { 0, 1, 1, _uint16_t, 0, & settings.psramMallocLevel, "psramMallocLevel", }, + { 0, 1, 1, _uint32_t, 0, & settings.rebootSeconds, "rebootSeconds", }, + { 0, 1, 1, _int, 0, & settings.resetCount, "resetCount", }, + + // Periodic Display + { 0, 1, 1, tPerDisp, 0, & settings.periodicDisplay, "periodicDisplay", }, + { 0, 1, 1, _uint32_t, 0, & settings.periodicDisplayInterval, "periodicDisplayInterval", }, + + // Point Perfect + { 0, 1, 1, _bool, 0, & settings.autoKeyRenewal, "autoKeyRenewal", }, + { 0, 0, 1, _bool, 0, & settings.debugPpCertificate, "debugPpCertificate", }, + { 0, 1, 1, _bool, 0, & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", }, + { 0, 1, 1, _int, 0, & settings.geographicRegion, "geographicRegion", }, + { 0, 1, 1, _uint64_t, 0, & settings.lastKeyAttempt, "lastKeyAttempt", }, + { 0, 1, 1, _uint16_t, 0, & settings.lbandFixTimeout_seconds, "lbandFixTimeout", }, + { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectBrokerHost), & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", }, + { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectClientID), & settings.pointPerfectClientID, "pointPerfectClientID", }, + { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectCurrentKey), & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", }, + { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", }, + { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", }, + { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectDeviceProfileToken), & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", }, + { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectKeyDistributionTopic), & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", }, + { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectNextKey), & settings.pointPerfectNextKey, "pointPerfectNextKey", }, + { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", }, + { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", }, + { 0, 1, 1, _uint16_t, 0, & settings.pplFixTimeoutS, "pplFixTimeoutS", }, + { 0, 1, 1, tRegCorTp, numRegionalAreas, & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", }, + + // Profiles + { 0, 0, 1, tCharArry, sizeof(settings.profileName), & settings.profileName, "profileName", }, + + // Pulse + { 1, 1, 1, _bool, 0, & settings.enableExternalPulse, "enableExternalPulse", }, + { 1, 1, 1, _uint64_t, 0, & settings.externalPulseLength_us, "externalPulseLength", }, + { 1, 1, 1, tPulseEdg, 0, & settings.externalPulsePolarity, "externalPulsePolarity", }, + { 1, 1, 1, _uint64_t, 0, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", }, + + // Radio + { 0, 1, 1, tMuxConn, 0, & settings.dataPortChannel, "dataPortChannel", }, + { 0, 1, 1, _bool, 0, & settings.debugGnss, "debugGnss", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintPosition, "enablePrintPosition", }, + { 1, 0, 1, _uint16_t, 0, & settings.measurementRateMs, "measurementRateMs", }, + { 1, 0, 1, _uint16_t, 0, & settings.navigationRate, "navigationRate", }, + { 0, 1, 1, _bool, 0, & settings.updateGNSSSettings, "updateGNSSSettings", }, + + // Ring Buffer + { 0, 1, 1, _bool, 0, & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", }, + { 0, 1, 1, _int, 0, & settings.gnssHandlerBufferSize, "gnssHandlerBufferSize", }, + + // Rover operation + { 1, 1, 1, _uint8_t, 0, & settings.dynamicModel, "dynamicModel", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintRoverAccuracy, "enablePrintRoverAccuracy", }, + { 1, 0, 1, _int16_t, 0, & settings.minCNO, "minCNO", }, + { 1, 1, 1, _uint8_t, 0, & settings.minElev, "minElev", }, + + // RTC (Real Time Clock) + { 0, 1, 1, _bool, 0, & settings.enablePrintRtcSync, "enablePrintRtcSync", }, + + // SD Card + { 0, 1, 1, _bool, 0, & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintSDBuffers, "enablePrintSDBuffers", }, + { 0, 1, 1, _bool, 0, & settings.enableSD, "enableSD"}, + { 0, 1, 1, _bool, 0, & settings.forceResetOnSDFail, "forceResetOnSDFail", }, + + // Serial + { 1, 1, 1, _uint32_t, 0, & settings.dataPortBaud, "dataPortBaud", }, + { 0, 1, 1, _bool, 0, & settings.echoUserInput, "echoUserInput", }, + { 0, 1, 1, _bool, 0, & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", }, + { 1, 1, 1, _uint32_t, 0, & settings.radioPortBaud, "radioPortBaud", }, + { 0, 1, 1, _int16_t, 0, & settings.serialTimeoutGNSS, "serialTimeoutGNSS", }, + + // Setup Button + { 0, 1, 1, _bool, 0, & settings.disableSetupButton, "disableSetupButton", }, + + // State + { 0, 1, 1, _bool, 0, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintState, "enablePrintState", }, + { 0, 1, 1, _bool, 0, & settings.enablePrintStates, "enablePrintStates", }, + { 1, 0, 1, tSysState, 0, & settings.lastState, "lastState", }, + + // TCP Client { 0, 1, 1, _bool, 0, & settings.debugTcpClient, "debugTcpClient", }, { 0, 1, 1, _bool, 0, & settings.enableTcpClient, "enableTcpClient", }, - { 0, 1, 1, _uint16_t, 0, & settings.tcpClientPort, "tcpClientPort", }, { 0, 1, 1, tCharArry, sizeof(settings.tcpClientHost), & settings.tcpClientHost, "tcpClientHost", }, + { 0, 1, 1, _uint16_t, 0, & settings.tcpClientPort, "tcpClientPort", }, + // TCP Server { 0, 1, 1, _bool, 0, & settings.debugTcpServer, "debugTcpServer", }, { 0, 1, 1, _bool, 0, & settings.enableTcpServer, "enableTcpServer", }, { 0, 1, 1, _uint16_t, 0, & settings.tcpServerPort, "tcpServerPort", }, + // Time Zone + { 0, 1, 1, _int8_t, 0, & settings.timeZoneHours, "timeZoneHours", }, + { 0, 1, 1, _int8_t, 0, & settings.timeZoneMinutes, "timeZoneMinutes", }, + { 0, 1, 1, _int8_t, 0, & settings.timeZoneSeconds, "timeZoneSeconds", }, + + // UBX (SX1276) + { 0, 1, 1, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, + { 1, 1, 1, tUbxConst, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "ubxConstellation_", }, + { 1, 0, 1, tUbxMsgRt, MAX_UBX_MSG, & settings.ubxMessageRates[0], "ubxMessageRate_", }, + { 1, 0, 1, tUbMsgRtb, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "ubxMessageRateBase_", }, + + // UDP Server { 0, 1, 1, _bool, 0, & settings.debugUdpServer, "debugUdpServer", }, { 0, 1, 1, _bool, 0, & settings.enableUdpServer, "enableUdpServer", }, { 0, 1, 1, _uint16_t, 0, & settings.udpServerPort, "udpServerPort", }, - { 0, 0, 1, tUmMRNmea, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", }, - { 0, 0, 1, tUmMRRvRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", }, - { 0, 0, 1, tUmMRBaRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", }, - { 0, 1, 1, tUmConst, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "um980Constellations_", }, - + // UM980 + { 0, 1, 1, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", }, + { 0, 1, 1, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", }, + { 0, 1, 1, _bool, 0, & settings.enableImuDebug, "enableImuDebug", }, { 0, 1, 1, _bool, 0, & settings.enableTiltCompensation, "enableTiltCompensation", }, { 0, 1, 1, _float, 3, & settings.tiltPoleLength, "tiltPoleLength", }, - { 0, 1, 1, _bool, 0, & settings.enableImuDebug, "enableImuDebug", }, - - { 0, 1, 1, _bool, 0, & settings.debugFirmwareUpdate, "debugFirmwareUpdate", }, - { 0, 1, 1, _bool, 0, & settings.enableAutoFirmwareUpdate, "enableAutoFirmwareUpdate", }, - { 0, 1, 1, _uint32_t, 0, & settings.autoFirmwareCheckMinutes, "autoFirmwareCheckMinutes", }, - - { 0, 1, 1, _bool, 0, & settings.debugCorrections, "debugCorrections", }, - { 0, 1, 1, _bool, 0, & settings.enableCaptivePortal, "enableCaptivePortal", }, - - { 0, 1, 1, _bool, 0, & settings.printBootTimes, "printBootTimes", }, - - { 0, 1, 1, _bool, 0, & settings.printPartitionTable, "printPartitionTable", }, + { 0, 1, 1, tUmConst, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "um980Constellations_", }, + { 0, 0, 1, tUmMRNmea, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", }, + { 0, 0, 1, tUmMRBaRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", }, + { 0, 0, 1, tUmMRRvRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", }, - { 0, 1, 1, _uint8_t, 0, & settings.measurementScale, "measurementScale", }, + // Web Server + { 0, 1, 1, _uint16_t, 0, & settings.httpPort, "httpPort", }, + // WiFi { 0, 1, 1, _bool, 0, & settings.debugWiFiConfig, "debugWiFiConfig", }, - { 0, 1, 1, _bool, 0, & settings.enablePsram, "enablePsram", }, - { 0, 1, 1, _bool, 0, & settings.printTaskStartStop, "printTaskStartStop", }, - { 0, 1, 1, _uint16_t, 0, & settings.psramMallocLevel, "psramMallocLevel", }, - { 0, 1, 1, _bool, 0, & settings.enableBeeper, "enableBeeper", }, - { 0, 1, 1, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", }, - - { 0, 1, 1, tCorrSPri, correctionsSource::CORR_NUM, & settings.correctionsSourcesPriority, "correctionsPriority_", }, - - { 0, 1, 1, _int, 0, & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", }, - - { 0, 1, 1, _int, 0, & settings.geographicRegion, "geographicRegion", }, - - { 0, 1, 1, tRegCorTp, numRegionalAreas, & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", }, - - { 0, 1, 1, _bool, 0, & settings.debugEspNow, "debugEspNow", }, - { 0, 1, 1, _bool, 0, & settings.enableEspNow, "enableEspNow", }, + { 0, 1, 1, _bool, 0, & settings.debugWifiState, "debugWifiState", }, + { 0, 1, 1, _bool, 0, & settings.enableCaptivePortal, "enableCaptivePortal", }, { 0, 1, 1, _uint8_t, 0, & settings.wifiChannel, "wifiChannel", }, - { 0, 1, 1, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", }, - - { 0, 1, 1, _bool, 0, & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", }, - { 0, 1, 1, _uint16_t, 0, & settings.pplFixTimeoutS, "pplFixTimeoutS", }, + { 0, 0, 1, _bool, 0, & settings.wifiConfigOverAP, "wifiConfigOverAP", }, // TODO: check drop downs + { 0, 1, 1, tWiFiNet, MAX_WIFI_NETWORKS, & settings.wifiNetworks, "wifiNetwork_", }, - // Add new settings above <------------------------------------------------------------> + // Add new settings to appropriate group above or create new group + // Then also add to the same group in settings above /* { 0, 1, 1, , 0, & settings., ""}, */ From 5f816c1299c5398b214010c9f315b6ff535c2953 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 18 May 2024 16:59:25 -1000 Subject: [PATCH 060/358] Add EVK column to rtkSettingsEntries --- Firmware/RTK_Everywhere/settings.h | 393 +++++++++++++++-------------- 1 file changed, 197 insertions(+), 196 deletions(-) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 8d7219f7a..5c9ee8eb7 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1387,6 +1387,7 @@ typedef struct bool updateGNSSOnChange; bool inSettingsString; bool inCommands; + bool platEvk; RTK_Settings_Types type; int qualifier; void *var; @@ -1398,284 +1399,284 @@ const RTK_Settings_Entry rtkSettingsEntries[] = // Note: don't use "_" in the name - "_" is reserved for settings arrays like "ubxMessageRate_" // G S C -// N e m -// S t d -// S t s Type Qual Variable Name +// N e m E +// S t d v +// S t s k Type Qual Variable Name // Antenna - { 0, 1, 1, _int16_t, 0, & settings.antennaHeight, "antennaHeight", }, - { 0, 1, 1, _float, 2, & settings.antennaReferencePoint, "antennaReferencePoint" }, - { 0, 1, 1, _uint16_t, 0, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", }, - { 0, 1, 1, _bool, 0, & settings.enableARPLogging, "enableARPLogging", }, + { 0, 1, 1, 1, _int16_t, 0, & settings.antennaHeight, "antennaHeight", }, + { 0, 1, 1, 1, _float, 2, & settings.antennaReferencePoint, "antennaReferencePoint" }, + { 0, 1, 1, 1, _uint16_t, 0, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", }, + { 0, 1, 1, 1, _bool, 0, & settings.enableARPLogging, "enableARPLogging", }, // Base operation - { 0, 1, 1, tCoordInp, 0, & settings.coordinateInputType, "coordinateInputType", }, - { 1, 1, 1, _double, 4, & settings.fixedAltitude, "fixedAltitude", }, - { 1, 0, 1, _bool, 0, & settings.fixedBase, "fixedBase", }, - { 1, 0, 1, _bool, 0, & settings.fixedBaseCoordinateType, "fixedBaseCoordinateType", }, - { 1, 1, 1, _double, 3, & settings.fixedEcefX, "fixedEcefX", }, - { 1, 1, 1, _double, 3, & settings.fixedEcefY, "fixedEcefY", }, - { 1, 1, 1, _double, 3, & settings.fixedEcefZ, "fixedEcefZ", }, - { 1, 1, 1, _double, 9, & settings.fixedLat, "fixedLat", }, - { 1, 1, 1, _double, 9, & settings.fixedLong, "fixedLong", }, - { 1, 1, 1, _int, 0, & settings.observationSeconds, "observationSeconds", }, - { 1, 1, 1, _float, 2, & settings.observationPositionAccuracy, "observationPositionAccuracy", }, - { 1, 1, 1, _float, 1, & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", }, + { 0, 1, 1, 1, tCoordInp, 0, & settings.coordinateInputType, "coordinateInputType", }, + { 1, 1, 1, 1, _double, 4, & settings.fixedAltitude, "fixedAltitude", }, + { 1, 0, 1, 1, _bool, 0, & settings.fixedBase, "fixedBase", }, + { 1, 0, 1, 1, _bool, 0, & settings.fixedBaseCoordinateType, "fixedBaseCoordinateType", }, + { 1, 1, 1, 1, _double, 3, & settings.fixedEcefX, "fixedEcefX", }, + { 1, 1, 1, 1, _double, 3, & settings.fixedEcefY, "fixedEcefY", }, + { 1, 1, 1, 1, _double, 3, & settings.fixedEcefZ, "fixedEcefZ", }, + { 1, 1, 1, 1, _double, 9, & settings.fixedLat, "fixedLat", }, + { 1, 1, 1, 1, _double, 9, & settings.fixedLong, "fixedLong", }, + { 1, 1, 1, 1, _int, 0, & settings.observationSeconds, "observationSeconds", }, + { 1, 1, 1, 1, _float, 2, & settings.observationPositionAccuracy, "observationPositionAccuracy", }, + { 1, 1, 1, 1, _float, 1, & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", }, // Battery - { 0, 1, 1, _bool, 0, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", }, - { 0, 1, 1, _uint32_t, 0, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", }, + { 0, 1, 1, 1, _bool, 0, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", }, + { 0, 1, 1, 1, _uint32_t, 0, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", }, // Beeper - { 0, 1, 1, _bool, 0, & settings.enableBeeper, "enableBeeper", }, + { 0, 1, 1, 0, _bool, 0, & settings.enableBeeper, "enableBeeper", }, // Bluetooth - { 0, 1, 1, tBtRadio, 0, & settings.bluetoothRadioType, "bluetoothRadioType", }, - { 0, 1, 1, _uint16_t, 0, & settings.sppRxQueueSize, "sppRxQueueSize", }, - { 0, 1, 1, _uint16_t, 0, & settings.sppTxQueueSize, "sppTxQueueSize", }, + { 0, 1, 1, 1, tBtRadio, 0, & settings.bluetoothRadioType, "bluetoothRadioType", }, + { 0, 1, 1, 1, _uint16_t, 0, & settings.sppRxQueueSize, "sppRxQueueSize", }, + { 0, 1, 1, 1, _uint16_t, 0, & settings.sppTxQueueSize, "sppTxQueueSize", }, // Corrections - { 0, 1, 1, _int, 0, & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", }, - { 0, 1, 1, tCorrSPri, correctionsSource::CORR_NUM, & settings.correctionsSourcesPriority, "correctionsPriority_", }, - { 0, 1, 1, _bool, 0, & settings.debugCorrections, "debugCorrections", }, + { 0, 1, 1, 1, _int, 0, & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", }, + { 0, 1, 1, 1, tCorrSPri, correctionsSource::CORR_NUM, & settings.correctionsSourcesPriority, "correctionsPriority_", }, + { 0, 1, 1, 1, _bool, 0, & settings.debugCorrections, "debugCorrections", }, // Display - { 0, 1, 1, _bool, 0, & settings.enableResetDisplay, "enableResetDisplay", }, + { 0, 1, 1, 1, _bool, 0, & settings.enableResetDisplay, "enableResetDisplay", }, // ESP Now - { 0, 1, 1, _bool, 0, & settings.debugEspNow, "debugEspNow", }, - { 0, 1, 1, _bool, 0, & settings.enableEspNow, "enableEspNow", }, - { 0, 1, 1, _bool, 0, & settings.espnowBroadcast, "espnowBroadcast", }, - { 0, 1, 1, _uint8_t, 0, & settings.espnowPeerCount, "espnowPeerCount", }, - { 0, 1, 1, tEspNowPr, ESPNOW_MAX_PEERS, & settings.espnowPeers[0][0], "espnowPeer_", }, + { 0, 1, 1, 1, _bool, 0, & settings.debugEspNow, "debugEspNow", }, + { 0, 1, 1, 1, _bool, 0, & settings.enableEspNow, "enableEspNow", }, + { 0, 1, 1, 1, _bool, 0, & settings.espnowBroadcast, "espnowBroadcast", }, + { 0, 1, 1, 1, _uint8_t, 0, & settings.espnowPeerCount, "espnowPeerCount", }, + { 0, 1, 1, 1, tEspNowPr, ESPNOW_MAX_PEERS, & settings.espnowPeers[0][0], "espnowPeer_", }, // Ethernet - { 0, 1, 1, _bool, 0, & settings.enablePrintEthernetDiag, "enablePrintEthernetDiag", }, - { 0, 1, 1, _bool, 0, & settings.ethernetDHCP, "ethernetDHCP", }, - { 0, 1, 1, _IPString, 0, & settings.ethernetDNS, "ethernetDNS", }, - { 0, 1, 1, _IPString, 0, & settings.ethernetGateway, "ethernetGateway", }, - { 0, 1, 1, _IPString, 0, & settings.ethernetIP, "ethernetIP", }, - { 0, 1, 1, _IPString, 0, & settings.ethernetSubnet, "ethernetSubnet", }, + { 0, 1, 1, 1, _bool, 0, & settings.enablePrintEthernetDiag, "enablePrintEthernetDiag", }, + { 0, 1, 1, 1, _bool, 0, & settings.ethernetDHCP, "ethernetDHCP", }, + { 0, 1, 1, 1, _IPString, 0, & settings.ethernetDNS, "ethernetDNS", }, + { 0, 1, 1, 1, _IPString, 0, & settings.ethernetGateway, "ethernetGateway", }, + { 0, 1, 1, 1, _IPString, 0, & settings.ethernetIP, "ethernetIP", }, + { 0, 1, 1, 1, _IPString, 0, & settings.ethernetSubnet, "ethernetSubnet", }, // Firmware - { 0, 1, 1, _uint32_t, 0, & settings.autoFirmwareCheckMinutes, "autoFirmwareCheckMinutes", }, - { 0, 1, 1, _bool, 0, & settings.debugFirmwareUpdate, "debugFirmwareUpdate", }, - { 0, 1, 1, _bool, 0, & settings.enableAutoFirmwareUpdate, "enableAutoFirmwareUpdate", }, + { 0, 1, 1, 1, _uint32_t, 0, & settings.autoFirmwareCheckMinutes, "autoFirmwareCheckMinutes", }, + { 0, 1, 1, 1, _bool, 0, & settings.debugFirmwareUpdate, "debugFirmwareUpdate", }, + { 0, 1, 1, 1, _bool, 0, & settings.enableAutoFirmwareUpdate, "enableAutoFirmwareUpdate", }, // GNSS UART - { 0, 1, 1, _uint16_t, 0, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", }, - { 0, 1, 1, _int, 0, & settings.uartReceiveBufferSize, "uartReceiveBufferSize", }, + { 0, 1, 1, 1, _uint16_t, 0, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", }, + { 0, 1, 1, 1, _int, 0, & settings.uartReceiveBufferSize, "uartReceiveBufferSize", }, // Hardware - { 1, 1, 1, _bool, 0, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", }, - { 0, 1, 1, _uint16_t, 0, & settings.spiFrequency, "spiFrequency", }, + { 1, 1, 1, 1, _bool, 0, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", }, + { 0, 1, 1, 1, _uint16_t, 0, & settings.spiFrequency, "spiFrequency", }, // Log file - { 0, 1, 1, _bool, 0, & settings.enableLogging, "enableLogging", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintLogFileMessages, "enablePrintLogFileMessages", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintLogFileStatus, "enablePrintLogFileStatus", }, - { 0, 1, 1, _int, 0, & settings.maxLogLength_minutes, "maxLogLength", }, - { 0, 1, 1, _int, 0, & settings.maxLogTime_minutes, "maxLogTime"}, - { 0, 1, 1, _bool, 0, & settings.runLogTest, "runLogTest", }, // Not stored in NVM + { 0, 1, 1, 1, _bool, 0, & settings.enableLogging, "enableLogging", }, + { 0, 1, 1, 1, _bool, 0, & settings.enablePrintLogFileMessages, "enablePrintLogFileMessages", }, + { 0, 1, 1, 1, _bool, 0, & settings.enablePrintLogFileStatus, "enablePrintLogFileStatus", }, + { 0, 1, 1, 1, _int, 0, & settings.maxLogLength_minutes, "maxLogLength", }, + { 0, 1, 1, 1, _int, 0, & settings.maxLogTime_minutes, "maxLogTime"}, + { 0, 1, 1, 1, _bool, 0, & settings.runLogTest, "runLogTest", }, // Not stored in NVM // MQTT - { 0, 1, 1, _bool, 0, & settings.debugMqttClientData, "debugMqttClientData", }, - { 0, 1, 1, _bool, 0, & settings.debugMqttClientState, "debugMqttClientState", }, + { 0, 1, 1, 1, _bool, 0, & settings.debugMqttClientData, "debugMqttClientData", }, + { 0, 1, 1, 1, _bool, 0, & settings.debugMqttClientState, "debugMqttClientState", }, // Multicast DNS - { 0, 1, 1, _bool, 0, & settings.mdnsEnable, "mdnsEnable", }, + { 0, 1, 1, 1, _bool, 0, & settings.mdnsEnable, "mdnsEnable", }, // Network layer - { 0, 1, 1, _bool, 0, & settings.debugNetworkLayer, "debugNetworkLayer", }, - { 0, 1, 1, _uint8_t, 0, & settings.defaultNetworkType, "defaultNetworkType", }, - { 0, 1, 1, _bool, 0, & settings.enableNetworkFailover, "enableNetworkFailover", }, - { 0, 1, 1, _bool, 0, & settings.printNetworkStatus, "printNetworkStatus", }, - - // NTP - { 0, 1, 1, _bool, 0, & settings.debugNtp, "debugNtp", }, - { 0, 1, 1, _bool, 0, & settings.enableNTPFile, "enableNTPFile", }, - { 0, 1, 1, _uint16_t, 0, & settings.ethernetNtpPort, "ethernetNtpPort", }, - { 0, 1, 1, _uint8_t, 0, & settings.ntpPollExponent, "ntpPollExponent", }, - { 0, 1, 1, _int8_t, 0, & settings.ntpPrecision, "ntpPrecision", }, - { 0, 1, 1, tCharArry, sizeof(settings.ntpReferenceId), & settings.ntpReferenceId, "ntpReferenceId", }, - { 0, 1, 1, _uint32_t, 0, & settings.ntpRootDelay, "ntpRootDelay", }, - { 0, 1, 1, _uint32_t, 0, & settings.ntpRootDispersion, "ntpRootDispersion", }, + { 0, 1, 1, 1, _bool, 0, & settings.debugNetworkLayer, "debugNetworkLayer", }, + { 0, 1, 1, 1, _uint8_t, 0, & settings.defaultNetworkType, "defaultNetworkType", }, + { 0, 1, 1, 1, _bool, 0, & settings.enableNetworkFailover, "enableNetworkFailover", }, + { 0, 1, 1, 1, _bool, 0, & settings.printNetworkStatus, "printNetworkStatus", }, + + // NTP (Ethernet Only) + { 0, 1, 1, 1, _bool, 0, & settings.debugNtp, "debugNtp", }, + { 0, 1, 1, 1, _bool, 0, & settings.enableNTPFile, "enableNTPFile", }, + { 0, 1, 1, 1, _uint16_t, 0, & settings.ethernetNtpPort, "ethernetNtpPort", }, + { 0, 1, 1, 1, _uint8_t, 0, & settings.ntpPollExponent, "ntpPollExponent", }, + { 0, 1, 1, 1, _int8_t, 0, & settings.ntpPrecision, "ntpPrecision", }, + { 0, 1, 1, 1, tCharArry, sizeof(settings.ntpReferenceId), & settings.ntpReferenceId, "ntpReferenceId", }, + { 0, 1, 1, 1, _uint32_t, 0, & settings.ntpRootDelay, "ntpRootDelay", }, + { 0, 1, 1, 1, _uint32_t, 0, & settings.ntpRootDispersion, "ntpRootDispersion", }, // NTRIP Client - { 0, 1, 1, _bool, 0, & settings.debugNtripClientRtcm, "debugNtripClientRtcm", }, - { 0, 1, 1, _bool, 0, & settings.debugNtripClientState, "debugNtripClientState", }, - { 0, 1, 1, _bool, 0, & settings.enableNtripClient, "enableNtripClient", }, - { 0, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterHost), & settings.ntripClient_CasterHost, "ntripClientCasterHost", }, - { 0, 1, 1, _uint16_t, 0, & settings.ntripClient_CasterPort, "ntripClientCasterPort", }, - { 0, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUser), & settings.ntripClient_CasterUser, "ntripClientCasterUser", }, - { 0, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUserPW), & settings.ntripClient_CasterUserPW, "ntripClientCasterUserPW", }, - { 0, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPoint), & settings.ntripClient_MountPoint, "ntripClientMountPoint", }, - { 0, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPointPW), & settings.ntripClient_MountPointPW, "ntripClientMountPointPW", }, - { 0, 1, 1, _bool, 0, & settings.ntripClient_TransmitGGA, "ntripClientTransmitGGA", }, + { 0, 1, 1, 1, _bool, 0, & settings.debugNtripClientRtcm, "debugNtripClientRtcm", }, + { 0, 1, 1, 1, _bool, 0, & settings.debugNtripClientState, "debugNtripClientState", }, + { 0, 1, 1, 1, _bool, 0, & settings.enableNtripClient, "enableNtripClient", }, + { 0, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterHost), & settings.ntripClient_CasterHost, "ntripClientCasterHost", }, + { 0, 1, 1, 1, _uint16_t, 0, & settings.ntripClient_CasterPort, "ntripClientCasterPort", }, + { 0, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUser), & settings.ntripClient_CasterUser, "ntripClientCasterUser", }, + { 0, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUserPW), & settings.ntripClient_CasterUserPW, "ntripClientCasterUserPW", }, + { 0, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPoint), & settings.ntripClient_MountPoint, "ntripClientMountPoint", }, + { 0, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPointPW), & settings.ntripClient_MountPointPW, "ntripClientMountPointPW", }, + { 0, 1, 1, 1, _bool, 0, & settings.ntripClient_TransmitGGA, "ntripClientTransmitGGA", }, // NTRIP Server - { 0, 1, 1, _bool, 0, & settings.debugNtripServerRtcm, "debugNtripServerRtcm", }, - { 0, 1, 1, _bool, 0, & settings.debugNtripServerState, "debugNtripServerState", }, - { 0, 1, 1, _bool, 0, & settings.enableNtripServer, "enableNtripServer", }, - { 0, 0, 1, _bool, 0, & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", }, - { 0, 1, 1, tNSCHost, NTRIP_SERVER_MAX, & settings.ntripServer_CasterHost[0], "ntripServerCasterHost_", }, - { 0, 1, 1, tNSCPort, NTRIP_SERVER_MAX, & settings.ntripServer_CasterPort[0], "ntripServerCasterPort_", }, - { 0, 1, 1, tNSCUser, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUser[0], "ntripServerCasterUser_", }, - { 0, 1, 1, tNSCUsrPw, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUserPW[0], "ntripServerCasterUserPW_", }, - { 0, 1, 1, tNSMtPt, NTRIP_SERVER_MAX, & settings.ntripServer_MountPoint[0], "ntripServerMountPoint_", }, - { 0, 1, 1, tNSMtPtPw, NTRIP_SERVER_MAX, & settings.ntripServer_MountPointPW[0], "ntripServerMountPointPW_", }, + { 0, 1, 1, 1, _bool, 0, & settings.debugNtripServerRtcm, "debugNtripServerRtcm", }, + { 0, 1, 1, 1, _bool, 0, & settings.debugNtripServerState, "debugNtripServerState", }, + { 0, 1, 1, 1, _bool, 0, & settings.enableNtripServer, "enableNtripServer", }, + { 0, 0, 1, 1, _bool, 0, & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", }, + { 0, 1, 1, 1, tNSCHost, NTRIP_SERVER_MAX, & settings.ntripServer_CasterHost[0], "ntripServerCasterHost_", }, + { 0, 1, 1, 1, tNSCPort, NTRIP_SERVER_MAX, & settings.ntripServer_CasterPort[0], "ntripServerCasterPort_", }, + { 0, 1, 1, 1, tNSCUser, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUser[0], "ntripServerCasterUser_", }, + { 0, 1, 1, 1, tNSCUsrPw, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUserPW[0], "ntripServerCasterUserPW_", }, + { 0, 1, 1, 1, tNSMtPt, NTRIP_SERVER_MAX, & settings.ntripServer_MountPoint[0], "ntripServerMountPoint_", }, + { 0, 1, 1, 1, tNSMtPtPw, NTRIP_SERVER_MAX, & settings.ntripServer_MountPointPW[0], "ntripServerMountPointPW_", }, // OS - { 0, 1, 1, _uint8_t, 0, & settings.bluetoothInterruptsCore, "bluetoothInterruptsCore", }, - { 0, 1, 1, _uint8_t, 0, & settings.btReadTaskCore, "btReadTaskCore", }, - { 0, 1, 1, _uint8_t, 0, & settings.btReadTaskPriority, "btReadTaskPriority", }, - { 0, 1, 1, _bool, 0, & settings.enableHeapReport, "enableHeapReport", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintIdleTime, "enablePrintIdleTime", }, - { 0, 1, 1, _bool, 0, & settings.enablePsram, "enablePsram", }, - { 0, 1, 1, _bool, 0, & settings.enableTaskReports, "enableTaskReports", }, - { 0, 1, 1, _uint8_t, 0, & settings.gnssReadTaskCore, "gnssReadTaskCore", }, - { 0, 1, 1, _uint8_t, 0, & settings.gnssReadTaskPriority, "gnssReadTaskPriority", }, - { 0, 1, 1, _uint8_t, 0, & settings.gnssUartInterruptsCore, "gnssUartInterruptsCore", }, - { 0, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskCore, "handleGnssDataTaskCore", }, - { 0, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskPriority, "handleGnssDataTaskPriority", }, - { 0, 1, 1, _uint8_t, 0, & settings.i2cInterruptsCore, "i2cInterruptsCore", }, - { 0, 1, 1, _uint8_t, 0, & settings.measurementScale, "measurementScale", }, - { 0, 1, 1, _bool, 0, & settings.printBootTimes, "printBootTimes", }, - { 0, 1, 1, _bool, 0, & settings.printPartitionTable, "printPartitionTable", }, - { 0, 1, 1, _bool, 0, & settings.printTaskStartStop, "printTaskStartStop", }, - { 0, 1, 1, _uint16_t, 0, & settings.psramMallocLevel, "psramMallocLevel", }, - { 0, 1, 1, _uint32_t, 0, & settings.rebootSeconds, "rebootSeconds", }, - { 0, 1, 1, _int, 0, & settings.resetCount, "resetCount", }, + { 0, 1, 1, 1, _uint8_t, 0, & settings.bluetoothInterruptsCore, "bluetoothInterruptsCore", }, + { 0, 1, 1, 1, _uint8_t, 0, & settings.btReadTaskCore, "btReadTaskCore", }, + { 0, 1, 1, 1, _uint8_t, 0, & settings.btReadTaskPriority, "btReadTaskPriority", }, + { 0, 1, 1, 1, _bool, 0, & settings.enableHeapReport, "enableHeapReport", }, + { 0, 1, 1, 1, _bool, 0, & settings.enablePrintIdleTime, "enablePrintIdleTime", }, + { 0, 1, 1, 1, _bool, 0, & settings.enablePsram, "enablePsram", }, + { 0, 1, 1, 1, _bool, 0, & settings.enableTaskReports, "enableTaskReports", }, + { 0, 1, 1, 1, _uint8_t, 0, & settings.gnssReadTaskCore, "gnssReadTaskCore", }, + { 0, 1, 1, 1, _uint8_t, 0, & settings.gnssReadTaskPriority, "gnssReadTaskPriority", }, + { 0, 1, 1, 1, _uint8_t, 0, & settings.gnssUartInterruptsCore, "gnssUartInterruptsCore", }, + { 0, 1, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskCore, "handleGnssDataTaskCore", }, + { 0, 1, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskPriority, "handleGnssDataTaskPriority", }, + { 0, 1, 1, 1, _uint8_t, 0, & settings.i2cInterruptsCore, "i2cInterruptsCore", }, + { 0, 1, 1, 1, _uint8_t, 0, & settings.measurementScale, "measurementScale", }, + { 0, 1, 1, 1, _bool, 0, & settings.printBootTimes, "printBootTimes", }, + { 0, 1, 1, 1, _bool, 0, & settings.printPartitionTable, "printPartitionTable", }, + { 0, 1, 1, 1, _bool, 0, & settings.printTaskStartStop, "printTaskStartStop", }, + { 0, 1, 1, 1, _uint16_t, 0, & settings.psramMallocLevel, "psramMallocLevel", }, + { 0, 1, 1, 1, _uint32_t, 0, & settings.rebootSeconds, "rebootSeconds", }, + { 0, 1, 1, 1, _int, 0, & settings.resetCount, "resetCount", }, // Periodic Display - { 0, 1, 1, tPerDisp, 0, & settings.periodicDisplay, "periodicDisplay", }, - { 0, 1, 1, _uint32_t, 0, & settings.periodicDisplayInterval, "periodicDisplayInterval", }, + { 0, 1, 1, 1, tPerDisp, 0, & settings.periodicDisplay, "periodicDisplay", }, + { 0, 1, 1, 1, _uint32_t, 0, & settings.periodicDisplayInterval, "periodicDisplayInterval", }, // Point Perfect - { 0, 1, 1, _bool, 0, & settings.autoKeyRenewal, "autoKeyRenewal", }, - { 0, 0, 1, _bool, 0, & settings.debugPpCertificate, "debugPpCertificate", }, - { 0, 1, 1, _bool, 0, & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", }, - { 0, 1, 1, _int, 0, & settings.geographicRegion, "geographicRegion", }, - { 0, 1, 1, _uint64_t, 0, & settings.lastKeyAttempt, "lastKeyAttempt", }, - { 0, 1, 1, _uint16_t, 0, & settings.lbandFixTimeout_seconds, "lbandFixTimeout", }, - { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectBrokerHost), & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", }, - { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectClientID), & settings.pointPerfectClientID, "pointPerfectClientID", }, - { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectCurrentKey), & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", }, - { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", }, - { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", }, - { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectDeviceProfileToken), & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", }, - { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectKeyDistributionTopic), & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", }, - { 0, 1, 1, tCharArry, sizeof(settings.pointPerfectNextKey), & settings.pointPerfectNextKey, "pointPerfectNextKey", }, - { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", }, - { 0, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", }, - { 0, 1, 1, _uint16_t, 0, & settings.pplFixTimeoutS, "pplFixTimeoutS", }, - { 0, 1, 1, tRegCorTp, numRegionalAreas, & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", }, + { 0, 1, 1, 1, _bool, 0, & settings.autoKeyRenewal, "autoKeyRenewal", }, + { 0, 0, 1, 1, _bool, 0, & settings.debugPpCertificate, "debugPpCertificate", }, + { 0, 1, 1, 1, _bool, 0, & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", }, + { 0, 1, 1, 1, _int, 0, & settings.geographicRegion, "geographicRegion", }, + { 0, 1, 1, 1, _uint64_t, 0, & settings.lastKeyAttempt, "lastKeyAttempt", }, + { 0, 1, 1, 1, _uint16_t, 0, & settings.lbandFixTimeout_seconds, "lbandFixTimeout", }, + { 0, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectBrokerHost), & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", }, + { 0, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectClientID), & settings.pointPerfectClientID, "pointPerfectClientID", }, + { 0, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectCurrentKey), & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", }, + { 0, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", }, + { 0, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", }, + { 0, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectDeviceProfileToken), & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", }, + { 0, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectKeyDistributionTopic), & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", }, + { 0, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectNextKey), & settings.pointPerfectNextKey, "pointPerfectNextKey", }, + { 0, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", }, + { 0, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", }, + { 0, 1, 1, 1, _uint16_t, 0, & settings.pplFixTimeoutS, "pplFixTimeoutS", }, + { 0, 1, 1, 1, tRegCorTp, numRegionalAreas, & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", }, // Profiles - { 0, 0, 1, tCharArry, sizeof(settings.profileName), & settings.profileName, "profileName", }, + { 0, 0, 1, 1, tCharArry, sizeof(settings.profileName), & settings.profileName, "profileName", }, // Pulse - { 1, 1, 1, _bool, 0, & settings.enableExternalPulse, "enableExternalPulse", }, - { 1, 1, 1, _uint64_t, 0, & settings.externalPulseLength_us, "externalPulseLength", }, - { 1, 1, 1, tPulseEdg, 0, & settings.externalPulsePolarity, "externalPulsePolarity", }, - { 1, 1, 1, _uint64_t, 0, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", }, + { 1, 1, 1, 1, _bool, 0, & settings.enableExternalPulse, "enableExternalPulse", }, + { 1, 1, 1, 1, _uint64_t, 0, & settings.externalPulseLength_us, "externalPulseLength", }, + { 1, 1, 1, 1, tPulseEdg, 0, & settings.externalPulsePolarity, "externalPulsePolarity", }, + { 1, 1, 1, 1, _uint64_t, 0, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", }, // Radio - { 0, 1, 1, tMuxConn, 0, & settings.dataPortChannel, "dataPortChannel", }, - { 0, 1, 1, _bool, 0, & settings.debugGnss, "debugGnss", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintPosition, "enablePrintPosition", }, - { 1, 0, 1, _uint16_t, 0, & settings.measurementRateMs, "measurementRateMs", }, - { 1, 0, 1, _uint16_t, 0, & settings.navigationRate, "navigationRate", }, - { 0, 1, 1, _bool, 0, & settings.updateGNSSSettings, "updateGNSSSettings", }, + { 0, 1, 1, 1, tMuxConn, 0, & settings.dataPortChannel, "dataPortChannel", }, + { 0, 1, 1, 1, _bool, 0, & settings.debugGnss, "debugGnss", }, + { 0, 1, 1, 1, _bool, 0, & settings.enablePrintPosition, "enablePrintPosition", }, + { 1, 0, 1, 1, _uint16_t, 0, & settings.measurementRateMs, "measurementRateMs", }, + { 1, 0, 1, 1, _uint16_t, 0, & settings.navigationRate, "navigationRate", }, + { 0, 1, 1, 1, _bool, 0, & settings.updateGNSSSettings, "updateGNSSSettings", }, // Ring Buffer - { 0, 1, 1, _bool, 0, & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", }, - { 0, 1, 1, _int, 0, & settings.gnssHandlerBufferSize, "gnssHandlerBufferSize", }, + { 0, 1, 1, 1, _bool, 0, & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", }, + { 0, 1, 1, 1, _int, 0, & settings.gnssHandlerBufferSize, "gnssHandlerBufferSize", }, // Rover operation - { 1, 1, 1, _uint8_t, 0, & settings.dynamicModel, "dynamicModel", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintRoverAccuracy, "enablePrintRoverAccuracy", }, - { 1, 0, 1, _int16_t, 0, & settings.minCNO, "minCNO", }, - { 1, 1, 1, _uint8_t, 0, & settings.minElev, "minElev", }, + { 1, 1, 1, 1, _uint8_t, 0, & settings.dynamicModel, "dynamicModel", }, + { 0, 1, 1, 1, _bool, 0, & settings.enablePrintRoverAccuracy, "enablePrintRoverAccuracy", }, + { 1, 0, 1, 1, _int16_t, 0, & settings.minCNO, "minCNO", }, + { 1, 1, 1, 1, _uint8_t, 0, & settings.minElev, "minElev", }, // RTC (Real Time Clock) - { 0, 1, 1, _bool, 0, & settings.enablePrintRtcSync, "enablePrintRtcSync", }, + { 0, 1, 1, 1, _bool, 0, & settings.enablePrintRtcSync, "enablePrintRtcSync", }, // SD Card - { 0, 1, 1, _bool, 0, & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintSDBuffers, "enablePrintSDBuffers", }, - { 0, 1, 1, _bool, 0, & settings.enableSD, "enableSD"}, - { 0, 1, 1, _bool, 0, & settings.forceResetOnSDFail, "forceResetOnSDFail", }, + { 0, 1, 1, 1, _bool, 0, & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", }, + { 0, 1, 1, 1, _bool, 0, & settings.enablePrintSDBuffers, "enablePrintSDBuffers", }, + { 0, 1, 1, 1, _bool, 0, & settings.enableSD, "enableSD"}, + { 0, 1, 1, 1, _bool, 0, & settings.forceResetOnSDFail, "forceResetOnSDFail", }, // Serial - { 1, 1, 1, _uint32_t, 0, & settings.dataPortBaud, "dataPortBaud", }, - { 0, 1, 1, _bool, 0, & settings.echoUserInput, "echoUserInput", }, - { 0, 1, 1, _bool, 0, & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", }, - { 1, 1, 1, _uint32_t, 0, & settings.radioPortBaud, "radioPortBaud", }, - { 0, 1, 1, _int16_t, 0, & settings.serialTimeoutGNSS, "serialTimeoutGNSS", }, + { 1, 1, 1, 1, _uint32_t, 0, & settings.dataPortBaud, "dataPortBaud", }, + { 0, 1, 1, 1, _bool, 0, & settings.echoUserInput, "echoUserInput", }, + { 0, 1, 1, 1, _bool, 0, & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", }, + { 1, 1, 1, 1, _uint32_t, 0, & settings.radioPortBaud, "radioPortBaud", }, + { 0, 1, 1, 1, _int16_t, 0, & settings.serialTimeoutGNSS, "serialTimeoutGNSS", }, // Setup Button - { 0, 1, 1, _bool, 0, & settings.disableSetupButton, "disableSetupButton", }, + { 0, 1, 1, 1, _bool, 0, & settings.disableSetupButton, "disableSetupButton", }, // State - { 0, 1, 1, _bool, 0, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintState, "enablePrintState", }, - { 0, 1, 1, _bool, 0, & settings.enablePrintStates, "enablePrintStates", }, - { 1, 0, 1, tSysState, 0, & settings.lastState, "lastState", }, + { 0, 1, 1, 1, _bool, 0, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", }, + { 0, 1, 1, 1, _bool, 0, & settings.enablePrintState, "enablePrintState", }, + { 0, 1, 1, 1, _bool, 0, & settings.enablePrintStates, "enablePrintStates", }, + { 1, 0, 1, 1, tSysState, 0, & settings.lastState, "lastState", }, // TCP Client - { 0, 1, 1, _bool, 0, & settings.debugTcpClient, "debugTcpClient", }, - { 0, 1, 1, _bool, 0, & settings.enableTcpClient, "enableTcpClient", }, - { 0, 1, 1, tCharArry, sizeof(settings.tcpClientHost), & settings.tcpClientHost, "tcpClientHost", }, - { 0, 1, 1, _uint16_t, 0, & settings.tcpClientPort, "tcpClientPort", }, + { 0, 1, 1, 1, _bool, 0, & settings.debugTcpClient, "debugTcpClient", }, + { 0, 1, 1, 1, _bool, 0, & settings.enableTcpClient, "enableTcpClient", }, + { 0, 1, 1, 1, tCharArry, sizeof(settings.tcpClientHost), & settings.tcpClientHost, "tcpClientHost", }, + { 0, 1, 1, 1, _uint16_t, 0, & settings.tcpClientPort, "tcpClientPort", }, // TCP Server - { 0, 1, 1, _bool, 0, & settings.debugTcpServer, "debugTcpServer", }, - { 0, 1, 1, _bool, 0, & settings.enableTcpServer, "enableTcpServer", }, - { 0, 1, 1, _uint16_t, 0, & settings.tcpServerPort, "tcpServerPort", }, + { 0, 1, 1, 1, _bool, 0, & settings.debugTcpServer, "debugTcpServer", }, + { 0, 1, 1, 1, _bool, 0, & settings.enableTcpServer, "enableTcpServer", }, + { 0, 1, 1, 1, _uint16_t, 0, & settings.tcpServerPort, "tcpServerPort", }, // Time Zone - { 0, 1, 1, _int8_t, 0, & settings.timeZoneHours, "timeZoneHours", }, - { 0, 1, 1, _int8_t, 0, & settings.timeZoneMinutes, "timeZoneMinutes", }, - { 0, 1, 1, _int8_t, 0, & settings.timeZoneSeconds, "timeZoneSeconds", }, + { 0, 1, 1, 1, _int8_t, 0, & settings.timeZoneHours, "timeZoneHours", }, + { 0, 1, 1, 1, _int8_t, 0, & settings.timeZoneMinutes, "timeZoneMinutes", }, + { 0, 1, 1, 1, _int8_t, 0, & settings.timeZoneSeconds, "timeZoneSeconds", }, // UBX (SX1276) - { 0, 1, 1, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, - { 1, 1, 1, tUbxConst, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "ubxConstellation_", }, - { 1, 0, 1, tUbxMsgRt, MAX_UBX_MSG, & settings.ubxMessageRates[0], "ubxMessageRate_", }, - { 1, 0, 1, tUbMsgRtb, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "ubxMessageRateBase_", }, + { 0, 1, 1, 1, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, + { 1, 1, 1, 1, tUbxConst, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "ubxConstellation_", }, + { 1, 0, 1, 1, tUbxMsgRt, MAX_UBX_MSG, & settings.ubxMessageRates[0], "ubxMessageRate_", }, + { 1, 0, 1, 1, tUbMsgRtb, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "ubxMessageRateBase_", }, // UDP Server - { 0, 1, 1, _bool, 0, & settings.debugUdpServer, "debugUdpServer", }, - { 0, 1, 1, _bool, 0, & settings.enableUdpServer, "enableUdpServer", }, - { 0, 1, 1, _uint16_t, 0, & settings.udpServerPort, "udpServerPort", }, + { 0, 1, 1, 1, _bool, 0, & settings.debugUdpServer, "debugUdpServer", }, + { 0, 1, 1, 1, _bool, 0, & settings.enableUdpServer, "enableUdpServer", }, + { 0, 1, 1, 1, _uint16_t, 0, & settings.udpServerPort, "udpServerPort", }, // UM980 - { 0, 1, 1, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", }, - { 0, 1, 1, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", }, - { 0, 1, 1, _bool, 0, & settings.enableImuDebug, "enableImuDebug", }, - { 0, 1, 1, _bool, 0, & settings.enableTiltCompensation, "enableTiltCompensation", }, - { 0, 1, 1, _float, 3, & settings.tiltPoleLength, "tiltPoleLength", }, - { 0, 1, 1, tUmConst, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "um980Constellations_", }, - { 0, 0, 1, tUmMRNmea, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", }, - { 0, 0, 1, tUmMRBaRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", }, - { 0, 0, 1, tUmMRRvRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", }, + { 0, 1, 1, 0, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", }, + { 0, 1, 1, 0, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", }, + { 0, 1, 1, 0, _bool, 0, & settings.enableImuDebug, "enableImuDebug", }, + { 0, 1, 1, 0, _bool, 0, & settings.enableTiltCompensation, "enableTiltCompensation", }, + { 0, 1, 1, 0, _float, 3, & settings.tiltPoleLength, "tiltPoleLength", }, + { 0, 1, 1, 0, tUmConst, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "um980Constellations_", }, + { 0, 0, 1, 0, tUmMRNmea, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", }, + { 0, 0, 1, 0, tUmMRBaRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", }, + { 0, 0, 1, 0, tUmMRRvRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", }, // Web Server - { 0, 1, 1, _uint16_t, 0, & settings.httpPort, "httpPort", }, + { 0, 1, 1, 1, _uint16_t, 0, & settings.httpPort, "httpPort", }, // WiFi - { 0, 1, 1, _bool, 0, & settings.debugWiFiConfig, "debugWiFiConfig", }, - { 0, 1, 1, _bool, 0, & settings.debugWifiState, "debugWifiState", }, - { 0, 1, 1, _bool, 0, & settings.enableCaptivePortal, "enableCaptivePortal", }, - { 0, 1, 1, _uint8_t, 0, & settings.wifiChannel, "wifiChannel", }, - { 0, 0, 1, _bool, 0, & settings.wifiConfigOverAP, "wifiConfigOverAP", }, // TODO: check drop downs - { 0, 1, 1, tWiFiNet, MAX_WIFI_NETWORKS, & settings.wifiNetworks, "wifiNetwork_", }, + { 0, 1, 1, 1, _bool, 0, & settings.debugWiFiConfig, "debugWiFiConfig", }, + { 0, 1, 1, 1, _bool, 0, & settings.debugWifiState, "debugWifiState", }, + { 0, 1, 1, 1, _bool, 0, & settings.enableCaptivePortal, "enableCaptivePortal", }, + { 0, 1, 1, 1, _uint8_t, 0, & settings.wifiChannel, "wifiChannel", }, + { 0, 0, 1, 1, _bool, 0, & settings.wifiConfigOverAP, "wifiConfigOverAP", }, // TODO: check drop downs + { 0, 1, 1, 1, tWiFiNet, MAX_WIFI_NETWORKS, & settings.wifiNetworks, "wifiNetwork_", }, // Add new settings to appropriate group above or create new group // Then also add to the same group in settings above /* - { 0, 1, 1, , 0, & settings., ""}, + { 0, 1, 1, 1, , 0, & settings., ""}, */ }; From 0b7926e6683410cba9306c48a78fb91c4101fbb2 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 18 May 2024 17:20:31 -1000 Subject: [PATCH 061/358] Add Torch column to rtkSettingsEntries --- Firmware/RTK_Everywhere/settings.h | 457 +++++++++++++++++------------ 1 file changed, 262 insertions(+), 195 deletions(-) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 5c9ee8eb7..94b07836e 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1388,6 +1388,7 @@ typedef struct bool inSettingsString; bool inCommands; bool platEvk; + bool platTorch; RTK_Settings_Types type; int qualifier; void *var; @@ -1398,285 +1399,351 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { // Note: don't use "_" in the name - "_" is reserved for settings arrays like "ubxMessageRate_" -// G S C -// N e m E -// S t d v -// S t s k Type Qual Variable Name +// T +// G S C o +// N e m E r +// S t d v c +// S t s k h Type Qual Variable Name // Antenna - { 0, 1, 1, 1, _int16_t, 0, & settings.antennaHeight, "antennaHeight", }, - { 0, 1, 1, 1, _float, 2, & settings.antennaReferencePoint, "antennaReferencePoint" }, - { 0, 1, 1, 1, _uint16_t, 0, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", }, - { 0, 1, 1, 1, _bool, 0, & settings.enableARPLogging, "enableARPLogging", }, + { 0, 1, 1, 1, 1, _int16_t, 0, & settings.antennaHeight, "antennaHeight", }, + { 0, 1, 1, 1, 1, _float, 2, & settings.antennaReferencePoint, "antennaReferencePoint" }, + { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enableARPLogging, "enableARPLogging", }, // Base operation - { 0, 1, 1, 1, tCoordInp, 0, & settings.coordinateInputType, "coordinateInputType", }, - { 1, 1, 1, 1, _double, 4, & settings.fixedAltitude, "fixedAltitude", }, - { 1, 0, 1, 1, _bool, 0, & settings.fixedBase, "fixedBase", }, - { 1, 0, 1, 1, _bool, 0, & settings.fixedBaseCoordinateType, "fixedBaseCoordinateType", }, - { 1, 1, 1, 1, _double, 3, & settings.fixedEcefX, "fixedEcefX", }, - { 1, 1, 1, 1, _double, 3, & settings.fixedEcefY, "fixedEcefY", }, - { 1, 1, 1, 1, _double, 3, & settings.fixedEcefZ, "fixedEcefZ", }, - { 1, 1, 1, 1, _double, 9, & settings.fixedLat, "fixedLat", }, - { 1, 1, 1, 1, _double, 9, & settings.fixedLong, "fixedLong", }, - { 1, 1, 1, 1, _int, 0, & settings.observationSeconds, "observationSeconds", }, - { 1, 1, 1, 1, _float, 2, & settings.observationPositionAccuracy, "observationPositionAccuracy", }, - { 1, 1, 1, 1, _float, 1, & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", }, + { 0, 1, 1, 1, 1, tCoordInp, 0, & settings.coordinateInputType, "coordinateInputType", }, + { 1, 1, 1, 1, 1, _double, 4, & settings.fixedAltitude, "fixedAltitude", }, + { 1, 0, 1, 1, 1, _bool, 0, & settings.fixedBase, "fixedBase", }, + { 1, 0, 1, 1, 1, _bool, 0, & settings.fixedBaseCoordinateType, "fixedBaseCoordinateType", }, + { 1, 1, 1, 1, 1, _double, 3, & settings.fixedEcefX, "fixedEcefX", }, + { 1, 1, 1, 1, 1, _double, 3, & settings.fixedEcefY, "fixedEcefY", }, + { 1, 1, 1, 1, 1, _double, 3, & settings.fixedEcefZ, "fixedEcefZ", }, + { 1, 1, 1, 1, 1, _double, 9, & settings.fixedLat, "fixedLat", }, + { 1, 1, 1, 1, 1, _double, 9, & settings.fixedLong, "fixedLong", }, + { 1, 1, 1, 1, 1, _int, 0, & settings.observationSeconds, "observationSeconds", }, + { 1, 1, 1, 1, 1, _float, 2, & settings.observationPositionAccuracy, "observationPositionAccuracy", }, + { 1, 1, 1, 1, 1, _float, 1, & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", }, // Battery - { 0, 1, 1, 1, _bool, 0, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", }, - { 0, 1, 1, 1, _uint32_t, 0, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", }, + { 0, 1, 1, 1, 1, _uint32_t, 0, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", }, + +// T +// G S C o +// N e m E r +// S t d v c +// S t s k h Type Qual Variable Name // Beeper - { 0, 1, 1, 0, _bool, 0, & settings.enableBeeper, "enableBeeper", }, + { 0, 1, 1, 0, 1, _bool, 0, & settings.enableBeeper, "enableBeeper", }, // Bluetooth - { 0, 1, 1, 1, tBtRadio, 0, & settings.bluetoothRadioType, "bluetoothRadioType", }, - { 0, 1, 1, 1, _uint16_t, 0, & settings.sppRxQueueSize, "sppRxQueueSize", }, - { 0, 1, 1, 1, _uint16_t, 0, & settings.sppTxQueueSize, "sppTxQueueSize", }, + { 0, 1, 1, 1, 1, tBtRadio, 0, & settings.bluetoothRadioType, "bluetoothRadioType", }, + { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.sppRxQueueSize, "sppRxQueueSize", }, + { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.sppTxQueueSize, "sppTxQueueSize", }, // Corrections - { 0, 1, 1, 1, _int, 0, & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", }, - { 0, 1, 1, 1, tCorrSPri, correctionsSource::CORR_NUM, & settings.correctionsSourcesPriority, "correctionsPriority_", }, - { 0, 1, 1, 1, _bool, 0, & settings.debugCorrections, "debugCorrections", }, + { 0, 1, 1, 1, 1, _int, 0, & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", }, + { 0, 1, 1, 1, 1, tCorrSPri, correctionsSource::CORR_NUM, & settings.correctionsSourcesPriority, "correctionsPriority_", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.debugCorrections, "debugCorrections", }, + +// T +// G S C o +// N e m E r +// S t d v c +// S t s k h Type Qual Variable Name // Display - { 0, 1, 1, 1, _bool, 0, & settings.enableResetDisplay, "enableResetDisplay", }, + { 0, 1, 1, 1, 0, _bool, 0, & settings.enableResetDisplay, "enableResetDisplay", }, // ESP Now - { 0, 1, 1, 1, _bool, 0, & settings.debugEspNow, "debugEspNow", }, - { 0, 1, 1, 1, _bool, 0, & settings.enableEspNow, "enableEspNow", }, - { 0, 1, 1, 1, _bool, 0, & settings.espnowBroadcast, "espnowBroadcast", }, - { 0, 1, 1, 1, _uint8_t, 0, & settings.espnowPeerCount, "espnowPeerCount", }, - { 0, 1, 1, 1, tEspNowPr, ESPNOW_MAX_PEERS, & settings.espnowPeers[0][0], "espnowPeer_", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.debugEspNow, "debugEspNow", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enableEspNow, "enableEspNow", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.espnowBroadcast, "espnowBroadcast", }, + { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.espnowPeerCount, "espnowPeerCount", }, + { 0, 1, 1, 1, 1, tEspNowPr, ESPNOW_MAX_PEERS, & settings.espnowPeers[0][0], "espnowPeer_", }, + +// T +// G S C o +// N e m E r +// S t d v c +// S t s k h Type Qual Variable Name // Ethernet - { 0, 1, 1, 1, _bool, 0, & settings.enablePrintEthernetDiag, "enablePrintEthernetDiag", }, - { 0, 1, 1, 1, _bool, 0, & settings.ethernetDHCP, "ethernetDHCP", }, - { 0, 1, 1, 1, _IPString, 0, & settings.ethernetDNS, "ethernetDNS", }, - { 0, 1, 1, 1, _IPString, 0, & settings.ethernetGateway, "ethernetGateway", }, - { 0, 1, 1, 1, _IPString, 0, & settings.ethernetIP, "ethernetIP", }, - { 0, 1, 1, 1, _IPString, 0, & settings.ethernetSubnet, "ethernetSubnet", }, + { 0, 1, 1, 1, 0, _bool, 0, & settings.enablePrintEthernetDiag, "enablePrintEthernetDiag", }, + { 0, 1, 1, 1, 0, _bool, 0, & settings.ethernetDHCP, "ethernetDHCP", }, + { 0, 1, 1, 1, 0, _IPString, 0, & settings.ethernetDNS, "ethernetDNS", }, + { 0, 1, 1, 1, 0, _IPString, 0, & settings.ethernetGateway, "ethernetGateway", }, + { 0, 1, 1, 1, 0, _IPString, 0, & settings.ethernetIP, "ethernetIP", }, + { 0, 1, 1, 1, 0, _IPString, 0, & settings.ethernetSubnet, "ethernetSubnet", }, // Firmware - { 0, 1, 1, 1, _uint32_t, 0, & settings.autoFirmwareCheckMinutes, "autoFirmwareCheckMinutes", }, - { 0, 1, 1, 1, _bool, 0, & settings.debugFirmwareUpdate, "debugFirmwareUpdate", }, - { 0, 1, 1, 1, _bool, 0, & settings.enableAutoFirmwareUpdate, "enableAutoFirmwareUpdate", }, + { 0, 1, 1, 1, 1, _uint32_t, 0, & settings.autoFirmwareCheckMinutes, "autoFirmwareCheckMinutes", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.debugFirmwareUpdate, "debugFirmwareUpdate", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enableAutoFirmwareUpdate, "enableAutoFirmwareUpdate", }, // GNSS UART - { 0, 1, 1, 1, _uint16_t, 0, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", }, - { 0, 1, 1, 1, _int, 0, & settings.uartReceiveBufferSize, "uartReceiveBufferSize", }, + { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", }, + { 0, 1, 1, 1, 1, _int, 0, & settings.uartReceiveBufferSize, "uartReceiveBufferSize", }, // Hardware - { 1, 1, 1, 1, _bool, 0, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", }, - { 0, 1, 1, 1, _uint16_t, 0, & settings.spiFrequency, "spiFrequency", }, + { 1, 1, 1, 1, 1, _bool, 0, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", }, + { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.spiFrequency, "spiFrequency", }, + +// T +// G S C o +// N e m E r +// S t d v c +// S t s k h Type Qual Variable Name // Log file - { 0, 1, 1, 1, _bool, 0, & settings.enableLogging, "enableLogging", }, - { 0, 1, 1, 1, _bool, 0, & settings.enablePrintLogFileMessages, "enablePrintLogFileMessages", }, - { 0, 1, 1, 1, _bool, 0, & settings.enablePrintLogFileStatus, "enablePrintLogFileStatus", }, - { 0, 1, 1, 1, _int, 0, & settings.maxLogLength_minutes, "maxLogLength", }, - { 0, 1, 1, 1, _int, 0, & settings.maxLogTime_minutes, "maxLogTime"}, - { 0, 1, 1, 1, _bool, 0, & settings.runLogTest, "runLogTest", }, // Not stored in NVM + { 0, 1, 1, 1, 0, _bool, 0, & settings.enableLogging, "enableLogging", }, + { 0, 1, 1, 1, 0, _bool, 0, & settings.enablePrintLogFileMessages, "enablePrintLogFileMessages", }, + { 0, 1, 1, 1, 0, _bool, 0, & settings.enablePrintLogFileStatus, "enablePrintLogFileStatus", }, + { 0, 1, 1, 1, 0, _int, 0, & settings.maxLogLength_minutes, "maxLogLength", }, + { 0, 1, 1, 1, 0, _int, 0, & settings.maxLogTime_minutes, "maxLogTime"}, + { 0, 1, 1, 1, 0, _bool, 0, & settings.runLogTest, "runLogTest", }, // Not stored in NVM // MQTT - { 0, 1, 1, 1, _bool, 0, & settings.debugMqttClientData, "debugMqttClientData", }, - { 0, 1, 1, 1, _bool, 0, & settings.debugMqttClientState, "debugMqttClientState", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.debugMqttClientData, "debugMqttClientData", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.debugMqttClientState, "debugMqttClientState", }, // Multicast DNS - { 0, 1, 1, 1, _bool, 0, & settings.mdnsEnable, "mdnsEnable", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.mdnsEnable, "mdnsEnable", }, // Network layer - { 0, 1, 1, 1, _bool, 0, & settings.debugNetworkLayer, "debugNetworkLayer", }, - { 0, 1, 1, 1, _uint8_t, 0, & settings.defaultNetworkType, "defaultNetworkType", }, - { 0, 1, 1, 1, _bool, 0, & settings.enableNetworkFailover, "enableNetworkFailover", }, - { 0, 1, 1, 1, _bool, 0, & settings.printNetworkStatus, "printNetworkStatus", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.debugNetworkLayer, "debugNetworkLayer", }, + { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.defaultNetworkType, "defaultNetworkType", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enableNetworkFailover, "enableNetworkFailover", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.printNetworkStatus, "printNetworkStatus", }, + +// T +// G S C o +// N e m E r +// S t d v c +// S t s k h Type Qual Variable Name // NTP (Ethernet Only) - { 0, 1, 1, 1, _bool, 0, & settings.debugNtp, "debugNtp", }, - { 0, 1, 1, 1, _bool, 0, & settings.enableNTPFile, "enableNTPFile", }, - { 0, 1, 1, 1, _uint16_t, 0, & settings.ethernetNtpPort, "ethernetNtpPort", }, - { 0, 1, 1, 1, _uint8_t, 0, & settings.ntpPollExponent, "ntpPollExponent", }, - { 0, 1, 1, 1, _int8_t, 0, & settings.ntpPrecision, "ntpPrecision", }, - { 0, 1, 1, 1, tCharArry, sizeof(settings.ntpReferenceId), & settings.ntpReferenceId, "ntpReferenceId", }, - { 0, 1, 1, 1, _uint32_t, 0, & settings.ntpRootDelay, "ntpRootDelay", }, - { 0, 1, 1, 1, _uint32_t, 0, & settings.ntpRootDispersion, "ntpRootDispersion", }, + { 0, 1, 1, 1, 0, _bool, 0, & settings.debugNtp, "debugNtp", }, + { 0, 1, 1, 1, 0, _bool, 0, & settings.enableNTPFile, "enableNTPFile", }, + { 0, 1, 1, 1, 0, _uint16_t, 0, & settings.ethernetNtpPort, "ethernetNtpPort", }, + { 0, 1, 1, 1, 0, _uint8_t, 0, & settings.ntpPollExponent, "ntpPollExponent", }, + { 0, 1, 1, 1, 0, _int8_t, 0, & settings.ntpPrecision, "ntpPrecision", }, + { 0, 1, 1, 1, 0, tCharArry, sizeof(settings.ntpReferenceId), & settings.ntpReferenceId, "ntpReferenceId", }, + { 0, 1, 1, 1, 0, _uint32_t, 0, & settings.ntpRootDelay, "ntpRootDelay", }, + { 0, 1, 1, 1, 0, _uint32_t, 0, & settings.ntpRootDispersion, "ntpRootDispersion", }, // NTRIP Client - { 0, 1, 1, 1, _bool, 0, & settings.debugNtripClientRtcm, "debugNtripClientRtcm", }, - { 0, 1, 1, 1, _bool, 0, & settings.debugNtripClientState, "debugNtripClientState", }, - { 0, 1, 1, 1, _bool, 0, & settings.enableNtripClient, "enableNtripClient", }, - { 0, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterHost), & settings.ntripClient_CasterHost, "ntripClientCasterHost", }, - { 0, 1, 1, 1, _uint16_t, 0, & settings.ntripClient_CasterPort, "ntripClientCasterPort", }, - { 0, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUser), & settings.ntripClient_CasterUser, "ntripClientCasterUser", }, - { 0, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUserPW), & settings.ntripClient_CasterUserPW, "ntripClientCasterUserPW", }, - { 0, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPoint), & settings.ntripClient_MountPoint, "ntripClientMountPoint", }, - { 0, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPointPW), & settings.ntripClient_MountPointPW, "ntripClientMountPointPW", }, - { 0, 1, 1, 1, _bool, 0, & settings.ntripClient_TransmitGGA, "ntripClientTransmitGGA", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.debugNtripClientRtcm, "debugNtripClientRtcm", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.debugNtripClientState, "debugNtripClientState", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enableNtripClient, "enableNtripClient", }, + { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterHost), & settings.ntripClient_CasterHost, "ntripClientCasterHost", }, + { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.ntripClient_CasterPort, "ntripClientCasterPort", }, + { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUser), & settings.ntripClient_CasterUser, "ntripClientCasterUser", }, + { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUserPW), & settings.ntripClient_CasterUserPW, "ntripClientCasterUserPW", }, + { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPoint), & settings.ntripClient_MountPoint, "ntripClientMountPoint", }, + { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPointPW), & settings.ntripClient_MountPointPW, "ntripClientMountPointPW", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.ntripClient_TransmitGGA, "ntripClientTransmitGGA", }, // NTRIP Server - { 0, 1, 1, 1, _bool, 0, & settings.debugNtripServerRtcm, "debugNtripServerRtcm", }, - { 0, 1, 1, 1, _bool, 0, & settings.debugNtripServerState, "debugNtripServerState", }, - { 0, 1, 1, 1, _bool, 0, & settings.enableNtripServer, "enableNtripServer", }, - { 0, 0, 1, 1, _bool, 0, & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", }, - { 0, 1, 1, 1, tNSCHost, NTRIP_SERVER_MAX, & settings.ntripServer_CasterHost[0], "ntripServerCasterHost_", }, - { 0, 1, 1, 1, tNSCPort, NTRIP_SERVER_MAX, & settings.ntripServer_CasterPort[0], "ntripServerCasterPort_", }, - { 0, 1, 1, 1, tNSCUser, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUser[0], "ntripServerCasterUser_", }, - { 0, 1, 1, 1, tNSCUsrPw, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUserPW[0], "ntripServerCasterUserPW_", }, - { 0, 1, 1, 1, tNSMtPt, NTRIP_SERVER_MAX, & settings.ntripServer_MountPoint[0], "ntripServerMountPoint_", }, - { 0, 1, 1, 1, tNSMtPtPw, NTRIP_SERVER_MAX, & settings.ntripServer_MountPointPW[0], "ntripServerMountPointPW_", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.debugNtripServerRtcm, "debugNtripServerRtcm", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.debugNtripServerState, "debugNtripServerState", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enableNtripServer, "enableNtripServer", }, + { 0, 0, 1, 1, 1, _bool, 0, & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", }, + { 0, 1, 1, 1, 1, tNSCHost, NTRIP_SERVER_MAX, & settings.ntripServer_CasterHost[0], "ntripServerCasterHost_", }, + { 0, 1, 1, 1, 1, tNSCPort, NTRIP_SERVER_MAX, & settings.ntripServer_CasterPort[0], "ntripServerCasterPort_", }, + { 0, 1, 1, 1, 1, tNSCUser, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUser[0], "ntripServerCasterUser_", }, + { 0, 1, 1, 1, 1, tNSCUsrPw, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUserPW[0], "ntripServerCasterUserPW_", }, + { 0, 1, 1, 1, 1, tNSMtPt, NTRIP_SERVER_MAX, & settings.ntripServer_MountPoint[0], "ntripServerMountPoint_", }, + { 0, 1, 1, 1, 1, tNSMtPtPw, NTRIP_SERVER_MAX, & settings.ntripServer_MountPointPW[0], "ntripServerMountPointPW_", }, // OS - { 0, 1, 1, 1, _uint8_t, 0, & settings.bluetoothInterruptsCore, "bluetoothInterruptsCore", }, - { 0, 1, 1, 1, _uint8_t, 0, & settings.btReadTaskCore, "btReadTaskCore", }, - { 0, 1, 1, 1, _uint8_t, 0, & settings.btReadTaskPriority, "btReadTaskPriority", }, - { 0, 1, 1, 1, _bool, 0, & settings.enableHeapReport, "enableHeapReport", }, - { 0, 1, 1, 1, _bool, 0, & settings.enablePrintIdleTime, "enablePrintIdleTime", }, - { 0, 1, 1, 1, _bool, 0, & settings.enablePsram, "enablePsram", }, - { 0, 1, 1, 1, _bool, 0, & settings.enableTaskReports, "enableTaskReports", }, - { 0, 1, 1, 1, _uint8_t, 0, & settings.gnssReadTaskCore, "gnssReadTaskCore", }, - { 0, 1, 1, 1, _uint8_t, 0, & settings.gnssReadTaskPriority, "gnssReadTaskPriority", }, - { 0, 1, 1, 1, _uint8_t, 0, & settings.gnssUartInterruptsCore, "gnssUartInterruptsCore", }, - { 0, 1, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskCore, "handleGnssDataTaskCore", }, - { 0, 1, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskPriority, "handleGnssDataTaskPriority", }, - { 0, 1, 1, 1, _uint8_t, 0, & settings.i2cInterruptsCore, "i2cInterruptsCore", }, - { 0, 1, 1, 1, _uint8_t, 0, & settings.measurementScale, "measurementScale", }, - { 0, 1, 1, 1, _bool, 0, & settings.printBootTimes, "printBootTimes", }, - { 0, 1, 1, 1, _bool, 0, & settings.printPartitionTable, "printPartitionTable", }, - { 0, 1, 1, 1, _bool, 0, & settings.printTaskStartStop, "printTaskStartStop", }, - { 0, 1, 1, 1, _uint16_t, 0, & settings.psramMallocLevel, "psramMallocLevel", }, - { 0, 1, 1, 1, _uint32_t, 0, & settings.rebootSeconds, "rebootSeconds", }, - { 0, 1, 1, 1, _int, 0, & settings.resetCount, "resetCount", }, + { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.bluetoothInterruptsCore, "bluetoothInterruptsCore", }, + { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.btReadTaskCore, "btReadTaskCore", }, + { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.btReadTaskPriority, "btReadTaskPriority", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enableHeapReport, "enableHeapReport", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintIdleTime, "enablePrintIdleTime", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePsram, "enablePsram", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enableTaskReports, "enableTaskReports", }, + { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssReadTaskCore, "gnssReadTaskCore", }, + { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssReadTaskPriority, "gnssReadTaskPriority", }, + { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssUartInterruptsCore, "gnssUartInterruptsCore", }, + { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskCore, "handleGnssDataTaskCore", }, + { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskPriority, "handleGnssDataTaskPriority", }, + { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.i2cInterruptsCore, "i2cInterruptsCore", }, + { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.measurementScale, "measurementScale", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.printBootTimes, "printBootTimes", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.printPartitionTable, "printPartitionTable", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.printTaskStartStop, "printTaskStartStop", }, + { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.psramMallocLevel, "psramMallocLevel", }, + { 0, 1, 1, 1, 1, _uint32_t, 0, & settings.rebootSeconds, "rebootSeconds", }, + { 0, 1, 1, 1, 1, _int, 0, & settings.resetCount, "resetCount", }, // Periodic Display - { 0, 1, 1, 1, tPerDisp, 0, & settings.periodicDisplay, "periodicDisplay", }, - { 0, 1, 1, 1, _uint32_t, 0, & settings.periodicDisplayInterval, "periodicDisplayInterval", }, + { 0, 1, 1, 1, 1, tPerDisp, 0, & settings.periodicDisplay, "periodicDisplay", }, + { 0, 1, 1, 1, 1, _uint32_t, 0, & settings.periodicDisplayInterval, "periodicDisplayInterval", }, // Point Perfect - { 0, 1, 1, 1, _bool, 0, & settings.autoKeyRenewal, "autoKeyRenewal", }, - { 0, 0, 1, 1, _bool, 0, & settings.debugPpCertificate, "debugPpCertificate", }, - { 0, 1, 1, 1, _bool, 0, & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", }, - { 0, 1, 1, 1, _int, 0, & settings.geographicRegion, "geographicRegion", }, - { 0, 1, 1, 1, _uint64_t, 0, & settings.lastKeyAttempt, "lastKeyAttempt", }, - { 0, 1, 1, 1, _uint16_t, 0, & settings.lbandFixTimeout_seconds, "lbandFixTimeout", }, - { 0, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectBrokerHost), & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", }, - { 0, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectClientID), & settings.pointPerfectClientID, "pointPerfectClientID", }, - { 0, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectCurrentKey), & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", }, - { 0, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", }, - { 0, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", }, - { 0, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectDeviceProfileToken), & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", }, - { 0, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectKeyDistributionTopic), & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", }, - { 0, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectNextKey), & settings.pointPerfectNextKey, "pointPerfectNextKey", }, - { 0, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", }, - { 0, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", }, - { 0, 1, 1, 1, _uint16_t, 0, & settings.pplFixTimeoutS, "pplFixTimeoutS", }, - { 0, 1, 1, 1, tRegCorTp, numRegionalAreas, & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.autoKeyRenewal, "autoKeyRenewal", }, + { 0, 0, 1, 1, 1, _bool, 0, & settings.debugPpCertificate, "debugPpCertificate", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", }, + { 0, 1, 1, 1, 1, _int, 0, & settings.geographicRegion, "geographicRegion", }, + { 0, 1, 1, 1, 1, _uint64_t, 0, & settings.lastKeyAttempt, "lastKeyAttempt", }, + { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.lbandFixTimeout_seconds, "lbandFixTimeout", }, + { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectBrokerHost), & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", }, + { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectClientID), & settings.pointPerfectClientID, "pointPerfectClientID", }, + { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectCurrentKey), & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", }, + { 0, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", }, + { 0, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", }, + { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectDeviceProfileToken), & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", }, + { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectKeyDistributionTopic), & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", }, + { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectNextKey), & settings.pointPerfectNextKey, "pointPerfectNextKey", }, + { 0, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", }, + { 0, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", }, + { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.pplFixTimeoutS, "pplFixTimeoutS", }, + { 0, 1, 1, 1, 1, tRegCorTp, numRegionalAreas, & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", }, // Profiles - { 0, 0, 1, 1, tCharArry, sizeof(settings.profileName), & settings.profileName, "profileName", }, + { 0, 0, 1, 1, 1, tCharArry, sizeof(settings.profileName), & settings.profileName, "profileName", }, + +// T +// G S C o +// N e m E r +// S t d v c +// S t s k h Type Qual Variable Name // Pulse - { 1, 1, 1, 1, _bool, 0, & settings.enableExternalPulse, "enableExternalPulse", }, - { 1, 1, 1, 1, _uint64_t, 0, & settings.externalPulseLength_us, "externalPulseLength", }, - { 1, 1, 1, 1, tPulseEdg, 0, & settings.externalPulsePolarity, "externalPulsePolarity", }, - { 1, 1, 1, 1, _uint64_t, 0, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", }, + { 1, 1, 1, 1, 0, _bool, 0, & settings.enableExternalPulse, "enableExternalPulse", }, + { 1, 1, 1, 1, 0, _uint64_t, 0, & settings.externalPulseLength_us, "externalPulseLength", }, + { 1, 1, 1, 1, 0, tPulseEdg, 0, & settings.externalPulsePolarity, "externalPulsePolarity", }, + { 1, 1, 1, 1, 0, _uint64_t, 0, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", }, // Radio - { 0, 1, 1, 1, tMuxConn, 0, & settings.dataPortChannel, "dataPortChannel", }, - { 0, 1, 1, 1, _bool, 0, & settings.debugGnss, "debugGnss", }, - { 0, 1, 1, 1, _bool, 0, & settings.enablePrintPosition, "enablePrintPosition", }, - { 1, 0, 1, 1, _uint16_t, 0, & settings.measurementRateMs, "measurementRateMs", }, - { 1, 0, 1, 1, _uint16_t, 0, & settings.navigationRate, "navigationRate", }, - { 0, 1, 1, 1, _bool, 0, & settings.updateGNSSSettings, "updateGNSSSettings", }, + { 0, 1, 1, 1, 1, tMuxConn, 0, & settings.dataPortChannel, "dataPortChannel", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.debugGnss, "debugGnss", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintPosition, "enablePrintPosition", }, + { 1, 0, 1, 1, 1, _uint16_t, 0, & settings.measurementRateMs, "measurementRateMs", }, + { 1, 0, 1, 1, 1, _uint16_t, 0, & settings.navigationRate, "navigationRate", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.updateGNSSSettings, "updateGNSSSettings", }, // Ring Buffer - { 0, 1, 1, 1, _bool, 0, & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", }, - { 0, 1, 1, 1, _int, 0, & settings.gnssHandlerBufferSize, "gnssHandlerBufferSize", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", }, + { 0, 1, 1, 1, 1, _int, 0, & settings.gnssHandlerBufferSize, "gnssHandlerBufferSize", }, // Rover operation - { 1, 1, 1, 1, _uint8_t, 0, & settings.dynamicModel, "dynamicModel", }, - { 0, 1, 1, 1, _bool, 0, & settings.enablePrintRoverAccuracy, "enablePrintRoverAccuracy", }, - { 1, 0, 1, 1, _int16_t, 0, & settings.minCNO, "minCNO", }, - { 1, 1, 1, 1, _uint8_t, 0, & settings.minElev, "minElev", }, + { 1, 1, 1, 1, 1, _uint8_t, 0, & settings.dynamicModel, "dynamicModel", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRoverAccuracy, "enablePrintRoverAccuracy", }, + { 1, 0, 1, 1, 1, _int16_t, 0, & settings.minCNO, "minCNO", }, + { 1, 1, 1, 1, 1, _uint8_t, 0, & settings.minElev, "minElev", }, // RTC (Real Time Clock) - { 0, 1, 1, 1, _bool, 0, & settings.enablePrintRtcSync, "enablePrintRtcSync", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRtcSync, "enablePrintRtcSync", }, + +// T +// G S C o +// N e m E r +// S t d v c +// S t s k h Type Qual Variable Name // SD Card - { 0, 1, 1, 1, _bool, 0, & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", }, - { 0, 1, 1, 1, _bool, 0, & settings.enablePrintSDBuffers, "enablePrintSDBuffers", }, - { 0, 1, 1, 1, _bool, 0, & settings.enableSD, "enableSD"}, - { 0, 1, 1, 1, _bool, 0, & settings.forceResetOnSDFail, "forceResetOnSDFail", }, + { 0, 1, 1, 1, 0, _bool, 0, & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", }, + { 0, 1, 1, 1, 0, _bool, 0, & settings.enablePrintSDBuffers, "enablePrintSDBuffers", }, + { 0, 1, 1, 1, 0, _bool, 0, & settings.enableSD, "enableSD"}, + { 0, 1, 1, 1, 0, _bool, 0, & settings.forceResetOnSDFail, "forceResetOnSDFail", }, // Serial - { 1, 1, 1, 1, _uint32_t, 0, & settings.dataPortBaud, "dataPortBaud", }, - { 0, 1, 1, 1, _bool, 0, & settings.echoUserInput, "echoUserInput", }, - { 0, 1, 1, 1, _bool, 0, & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", }, - { 1, 1, 1, 1, _uint32_t, 0, & settings.radioPortBaud, "radioPortBaud", }, - { 0, 1, 1, 1, _int16_t, 0, & settings.serialTimeoutGNSS, "serialTimeoutGNSS", }, + { 1, 1, 1, 1, 1, _uint32_t, 0, & settings.dataPortBaud, "dataPortBaud", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.echoUserInput, "echoUserInput", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", }, + { 1, 1, 1, 1, 1, _uint32_t, 0, & settings.radioPortBaud, "radioPortBaud", }, + { 0, 1, 1, 1, 1, _int16_t, 0, & settings.serialTimeoutGNSS, "serialTimeoutGNSS", }, + +// T +// G S C o +// N e m E r +// S t d v c +// S t s k h Type Qual Variable Name // Setup Button - { 0, 1, 1, 1, _bool, 0, & settings.disableSetupButton, "disableSetupButton", }, + { 0, 1, 1, 1, 0, _bool, 0, & settings.disableSetupButton, "disableSetupButton", }, // State - { 0, 1, 1, 1, _bool, 0, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", }, - { 0, 1, 1, 1, _bool, 0, & settings.enablePrintState, "enablePrintState", }, - { 0, 1, 1, 1, _bool, 0, & settings.enablePrintStates, "enablePrintStates", }, - { 1, 0, 1, 1, tSysState, 0, & settings.lastState, "lastState", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintState, "enablePrintState", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintStates, "enablePrintStates", }, + { 1, 0, 1, 1, 1, tSysState, 0, & settings.lastState, "lastState", }, // TCP Client - { 0, 1, 1, 1, _bool, 0, & settings.debugTcpClient, "debugTcpClient", }, - { 0, 1, 1, 1, _bool, 0, & settings.enableTcpClient, "enableTcpClient", }, - { 0, 1, 1, 1, tCharArry, sizeof(settings.tcpClientHost), & settings.tcpClientHost, "tcpClientHost", }, - { 0, 1, 1, 1, _uint16_t, 0, & settings.tcpClientPort, "tcpClientPort", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.debugTcpClient, "debugTcpClient", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enableTcpClient, "enableTcpClient", }, + { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.tcpClientHost), & settings.tcpClientHost, "tcpClientHost", }, + { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.tcpClientPort, "tcpClientPort", }, // TCP Server - { 0, 1, 1, 1, _bool, 0, & settings.debugTcpServer, "debugTcpServer", }, - { 0, 1, 1, 1, _bool, 0, & settings.enableTcpServer, "enableTcpServer", }, - { 0, 1, 1, 1, _uint16_t, 0, & settings.tcpServerPort, "tcpServerPort", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.debugTcpServer, "debugTcpServer", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enableTcpServer, "enableTcpServer", }, + { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.tcpServerPort, "tcpServerPort", }, // Time Zone - { 0, 1, 1, 1, _int8_t, 0, & settings.timeZoneHours, "timeZoneHours", }, - { 0, 1, 1, 1, _int8_t, 0, & settings.timeZoneMinutes, "timeZoneMinutes", }, - { 0, 1, 1, 1, _int8_t, 0, & settings.timeZoneSeconds, "timeZoneSeconds", }, + { 0, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneHours, "timeZoneHours", }, + { 0, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneMinutes, "timeZoneMinutes", }, + { 0, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneSeconds, "timeZoneSeconds", }, + +// T +// G S C o +// N e m E r +// S t d v c +// S t s k h Type Qual Variable Name // UBX (SX1276) - { 0, 1, 1, 1, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, - { 1, 1, 1, 1, tUbxConst, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "ubxConstellation_", }, - { 1, 0, 1, 1, tUbxMsgRt, MAX_UBX_MSG, & settings.ubxMessageRates[0], "ubxMessageRate_", }, - { 1, 0, 1, 1, tUbMsgRtb, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "ubxMessageRateBase_", }, + { 0, 1, 1, 1, 0, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, + { 1, 1, 1, 1, 0, tUbxConst, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "ubxConstellation_", }, + { 1, 0, 1, 1, 0, tUbxMsgRt, MAX_UBX_MSG, & settings.ubxMessageRates[0], "ubxMessageRate_", }, + { 1, 0, 1, 1, 0, tUbMsgRtb, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "ubxMessageRateBase_", }, // UDP Server - { 0, 1, 1, 1, _bool, 0, & settings.debugUdpServer, "debugUdpServer", }, - { 0, 1, 1, 1, _bool, 0, & settings.enableUdpServer, "enableUdpServer", }, - { 0, 1, 1, 1, _uint16_t, 0, & settings.udpServerPort, "udpServerPort", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.debugUdpServer, "debugUdpServer", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enableUdpServer, "enableUdpServer", }, + { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.udpServerPort, "udpServerPort", }, + +// T +// G S C o +// N e m E r +// S t d v c +// S t s k h Type Qual Variable Name // UM980 - { 0, 1, 1, 0, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", }, - { 0, 1, 1, 0, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", }, - { 0, 1, 1, 0, _bool, 0, & settings.enableImuDebug, "enableImuDebug", }, - { 0, 1, 1, 0, _bool, 0, & settings.enableTiltCompensation, "enableTiltCompensation", }, - { 0, 1, 1, 0, _float, 3, & settings.tiltPoleLength, "tiltPoleLength", }, - { 0, 1, 1, 0, tUmConst, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "um980Constellations_", }, - { 0, 0, 1, 0, tUmMRNmea, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", }, - { 0, 0, 1, 0, tUmMRBaRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", }, - { 0, 0, 1, 0, tUmMRRvRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", }, + { 0, 1, 1, 0, 1, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", }, + { 0, 1, 1, 0, 1, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", }, + { 0, 1, 1, 0, 1, _bool, 0, & settings.enableImuDebug, "enableImuDebug", }, + { 0, 1, 1, 0, 1, _bool, 0, & settings.enableTiltCompensation, "enableTiltCompensation", }, + { 0, 1, 1, 0, 1, _float, 3, & settings.tiltPoleLength, "tiltPoleLength", }, + { 0, 1, 1, 0, 1, tUmConst, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "um980Constellations_", }, + { 0, 0, 1, 0, 1, tUmMRNmea, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", }, + { 0, 0, 1, 0, 1, tUmMRBaRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", }, + { 0, 0, 1, 0, 1, tUmMRRvRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", }, // Web Server - { 0, 1, 1, 1, _uint16_t, 0, & settings.httpPort, "httpPort", }, + { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.httpPort, "httpPort", }, // WiFi - { 0, 1, 1, 1, _bool, 0, & settings.debugWiFiConfig, "debugWiFiConfig", }, - { 0, 1, 1, 1, _bool, 0, & settings.debugWifiState, "debugWifiState", }, - { 0, 1, 1, 1, _bool, 0, & settings.enableCaptivePortal, "enableCaptivePortal", }, - { 0, 1, 1, 1, _uint8_t, 0, & settings.wifiChannel, "wifiChannel", }, - { 0, 0, 1, 1, _bool, 0, & settings.wifiConfigOverAP, "wifiConfigOverAP", }, // TODO: check drop downs - { 0, 1, 1, 1, tWiFiNet, MAX_WIFI_NETWORKS, & settings.wifiNetworks, "wifiNetwork_", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.debugWiFiConfig, "debugWiFiConfig", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.debugWifiState, "debugWifiState", }, + { 0, 1, 1, 1, 1, _bool, 0, & settings.enableCaptivePortal, "enableCaptivePortal", }, + { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.wifiChannel, "wifiChannel", }, + { 0, 0, 1, 1, 1, _bool, 0, & settings.wifiConfigOverAP, "wifiConfigOverAP", }, // TODO: check drop downs + { 0, 1, 1, 1, 1, tWiFiNet, MAX_WIFI_NETWORKS, & settings.wifiNetworks, "wifiNetwork_", }, // Add new settings to appropriate group above or create new group // Then also add to the same group in settings above +// T +// G S C o +// N e m E r +// S t d v c +// S t s k h Type Qual Variable Name /* - { 0, 1, 1, 1, , 0, & settings., ""}, + { 0, 1, 1, 1, 1, , 0, & settings., ""}, */ }; From 38f8486dc40633fefdcdb12860bcf3a6a35cc5cf Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 18 May 2024 19:50:04 -1000 Subject: [PATCH 062/358] Add Facet V2 column to rtkSettingsEntries --- Firmware/RTK_Everywhere/settings.h | 555 +++++++++++++++-------------- 1 file changed, 296 insertions(+), 259 deletions(-) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 94b07836e..e77fceae9 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1388,6 +1388,7 @@ typedef struct bool inSettingsString; bool inCommands; bool platEvk; + bool platFacetV2; bool platTorch; RTK_Settings_Types type; int qualifier; @@ -1399,351 +1400,387 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { // Note: don't use "_" in the name - "_" is reserved for settings arrays like "ubxMessageRate_" -// T -// G S C o -// N e m E r -// S t d v c -// S t s k h Type Qual Variable Name +// F +// a +// c +// e T +// G S C t o +// N e m E r +// S t d v V c +// S t s k 2 h Type Qual Variable Name // Antenna - { 0, 1, 1, 1, 1, _int16_t, 0, & settings.antennaHeight, "antennaHeight", }, - { 0, 1, 1, 1, 1, _float, 2, & settings.antennaReferencePoint, "antennaReferencePoint" }, - { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enableARPLogging, "enableARPLogging", }, + { 0, 1, 1, 1, 1, 1, _int16_t, 0, & settings.antennaHeight, "antennaHeight", }, + { 0, 1, 1, 1, 1, 1, _float, 2, & settings.antennaReferencePoint, "antennaReferencePoint" }, + { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableARPLogging, "enableARPLogging", }, // Base operation - { 0, 1, 1, 1, 1, tCoordInp, 0, & settings.coordinateInputType, "coordinateInputType", }, - { 1, 1, 1, 1, 1, _double, 4, & settings.fixedAltitude, "fixedAltitude", }, - { 1, 0, 1, 1, 1, _bool, 0, & settings.fixedBase, "fixedBase", }, - { 1, 0, 1, 1, 1, _bool, 0, & settings.fixedBaseCoordinateType, "fixedBaseCoordinateType", }, - { 1, 1, 1, 1, 1, _double, 3, & settings.fixedEcefX, "fixedEcefX", }, - { 1, 1, 1, 1, 1, _double, 3, & settings.fixedEcefY, "fixedEcefY", }, - { 1, 1, 1, 1, 1, _double, 3, & settings.fixedEcefZ, "fixedEcefZ", }, - { 1, 1, 1, 1, 1, _double, 9, & settings.fixedLat, "fixedLat", }, - { 1, 1, 1, 1, 1, _double, 9, & settings.fixedLong, "fixedLong", }, - { 1, 1, 1, 1, 1, _int, 0, & settings.observationSeconds, "observationSeconds", }, - { 1, 1, 1, 1, 1, _float, 2, & settings.observationPositionAccuracy, "observationPositionAccuracy", }, - { 1, 1, 1, 1, 1, _float, 1, & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", }, + { 0, 1, 1, 1, 1, 1, tCoordInp, 0, & settings.coordinateInputType, "coordinateInputType", }, + { 1, 1, 1, 1, 1, 1, _double, 4, & settings.fixedAltitude, "fixedAltitude", }, + { 1, 0, 1, 1, 1, 1, _bool, 0, & settings.fixedBase, "fixedBase", }, + { 1, 0, 1, 1, 1, 1, _bool, 0, & settings.fixedBaseCoordinateType, "fixedBaseCoordinateType", }, + { 1, 1, 1, 1, 1, 1, _double, 3, & settings.fixedEcefX, "fixedEcefX", }, + { 1, 1, 1, 1, 1, 1, _double, 3, & settings.fixedEcefY, "fixedEcefY", }, + { 1, 1, 1, 1, 1, 1, _double, 3, & settings.fixedEcefZ, "fixedEcefZ", }, + { 1, 1, 1, 1, 1, 1, _double, 9, & settings.fixedLat, "fixedLat", }, + { 1, 1, 1, 1, 1, 1, _double, 9, & settings.fixedLong, "fixedLong", }, + { 1, 1, 1, 1, 1, 1, _int, 0, & settings.observationSeconds, "observationSeconds", }, + { 1, 1, 1, 1, 1, 1, _float, 2, & settings.observationPositionAccuracy, "observationPositionAccuracy", }, + { 1, 1, 1, 1, 1, 1, _float, 1, & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", }, // Battery - { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", }, - { 0, 1, 1, 1, 1, _uint32_t, 0, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", }, - -// T -// G S C o -// N e m E r -// S t d v c -// S t s k h Type Qual Variable Name + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", }, + { 0, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", }, + +// F +// a +// c +// e T +// G S C t o +// N e m E r +// S t d v V c +// S t s k 2 h Type Qual Variable Name // Beeper - { 0, 1, 1, 0, 1, _bool, 0, & settings.enableBeeper, "enableBeeper", }, + { 0, 1, 1, 0, 0, 1, _bool, 0, & settings.enableBeeper, "enableBeeper", }, // Bluetooth - { 0, 1, 1, 1, 1, tBtRadio, 0, & settings.bluetoothRadioType, "bluetoothRadioType", }, - { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.sppRxQueueSize, "sppRxQueueSize", }, - { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.sppTxQueueSize, "sppTxQueueSize", }, + { 0, 1, 1, 1, 1, 1, tBtRadio, 0, & settings.bluetoothRadioType, "bluetoothRadioType", }, + { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.sppRxQueueSize, "sppRxQueueSize", }, + { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.sppTxQueueSize, "sppTxQueueSize", }, // Corrections - { 0, 1, 1, 1, 1, _int, 0, & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", }, - { 0, 1, 1, 1, 1, tCorrSPri, correctionsSource::CORR_NUM, & settings.correctionsSourcesPriority, "correctionsPriority_", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.debugCorrections, "debugCorrections", }, - -// T -// G S C o -// N e m E r -// S t d v c -// S t s k h Type Qual Variable Name + { 0, 1, 1, 1, 1, 1, _int, 0, & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", }, + { 0, 1, 1, 1, 1, 1, tCorrSPri, correctionsSource::CORR_NUM, & settings.correctionsSourcesPriority, "correctionsPriority_", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugCorrections, "debugCorrections", }, + +// F +// a +// c +// e T +// G S C t o +// N e m E r +// S t d v V c +// S t s k 2 h Type Qual Variable Name // Display - { 0, 1, 1, 1, 0, _bool, 0, & settings.enableResetDisplay, "enableResetDisplay", }, + { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.enableResetDisplay, "enableResetDisplay", }, // ESP Now - { 0, 1, 1, 1, 1, _bool, 0, & settings.debugEspNow, "debugEspNow", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enableEspNow, "enableEspNow", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.espnowBroadcast, "espnowBroadcast", }, - { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.espnowPeerCount, "espnowPeerCount", }, - { 0, 1, 1, 1, 1, tEspNowPr, ESPNOW_MAX_PEERS, & settings.espnowPeers[0][0], "espnowPeer_", }, - -// T -// G S C o -// N e m E r -// S t d v c -// S t s k h Type Qual Variable Name + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugEspNow, "debugEspNow", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableEspNow, "enableEspNow", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.espnowBroadcast, "espnowBroadcast", }, + { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.espnowPeerCount, "espnowPeerCount", }, + { 0, 1, 1, 1, 1, 1, tEspNowPr, ESPNOW_MAX_PEERS, & settings.espnowPeers[0][0], "espnowPeer_", }, + +// F +// a +// c +// e T +// G S C t o +// N e m E r +// S t d v V c +// S t s k 2 h Type Qual Variable Name // Ethernet - { 0, 1, 1, 1, 0, _bool, 0, & settings.enablePrintEthernetDiag, "enablePrintEthernetDiag", }, - { 0, 1, 1, 1, 0, _bool, 0, & settings.ethernetDHCP, "ethernetDHCP", }, - { 0, 1, 1, 1, 0, _IPString, 0, & settings.ethernetDNS, "ethernetDNS", }, - { 0, 1, 1, 1, 0, _IPString, 0, & settings.ethernetGateway, "ethernetGateway", }, - { 0, 1, 1, 1, 0, _IPString, 0, & settings.ethernetIP, "ethernetIP", }, - { 0, 1, 1, 1, 0, _IPString, 0, & settings.ethernetSubnet, "ethernetSubnet", }, + { 0, 1, 1, 1, 0, 0, _bool, 0, & settings.enablePrintEthernetDiag, "enablePrintEthernetDiag", }, + { 0, 1, 1, 1, 0, 0, _bool, 0, & settings.ethernetDHCP, "ethernetDHCP", }, + { 0, 1, 1, 1, 0, 0, _IPString, 0, & settings.ethernetDNS, "ethernetDNS", }, + { 0, 1, 1, 1, 0, 0, _IPString, 0, & settings.ethernetGateway, "ethernetGateway", }, + { 0, 1, 1, 1, 0, 0, _IPString, 0, & settings.ethernetIP, "ethernetIP", }, + { 0, 1, 1, 1, 0, 0, _IPString, 0, & settings.ethernetSubnet, "ethernetSubnet", }, // Firmware - { 0, 1, 1, 1, 1, _uint32_t, 0, & settings.autoFirmwareCheckMinutes, "autoFirmwareCheckMinutes", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.debugFirmwareUpdate, "debugFirmwareUpdate", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enableAutoFirmwareUpdate, "enableAutoFirmwareUpdate", }, + { 0, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.autoFirmwareCheckMinutes, "autoFirmwareCheckMinutes", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugFirmwareUpdate, "debugFirmwareUpdate", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableAutoFirmwareUpdate, "enableAutoFirmwareUpdate", }, // GNSS UART - { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", }, - { 0, 1, 1, 1, 1, _int, 0, & settings.uartReceiveBufferSize, "uartReceiveBufferSize", }, + { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", }, + { 0, 1, 1, 1, 1, 1, _int, 0, & settings.uartReceiveBufferSize, "uartReceiveBufferSize", }, // Hardware - { 1, 1, 1, 1, 1, _bool, 0, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", }, - { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.spiFrequency, "spiFrequency", }, - -// T -// G S C o -// N e m E r -// S t d v c -// S t s k h Type Qual Variable Name + { 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", }, + { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.spiFrequency, "spiFrequency", }, + +// F +// a +// c +// e T +// G S C t o +// N e m E r +// S t d v V c +// S t s k 2 h Type Qual Variable Name // Log file - { 0, 1, 1, 1, 0, _bool, 0, & settings.enableLogging, "enableLogging", }, - { 0, 1, 1, 1, 0, _bool, 0, & settings.enablePrintLogFileMessages, "enablePrintLogFileMessages", }, - { 0, 1, 1, 1, 0, _bool, 0, & settings.enablePrintLogFileStatus, "enablePrintLogFileStatus", }, - { 0, 1, 1, 1, 0, _int, 0, & settings.maxLogLength_minutes, "maxLogLength", }, - { 0, 1, 1, 1, 0, _int, 0, & settings.maxLogTime_minutes, "maxLogTime"}, - { 0, 1, 1, 1, 0, _bool, 0, & settings.runLogTest, "runLogTest", }, // Not stored in NVM + { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.enableLogging, "enableLogging", }, + { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.enablePrintLogFileMessages, "enablePrintLogFileMessages", }, + { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.enablePrintLogFileStatus, "enablePrintLogFileStatus", }, + { 0, 1, 1, 1, 1, 0, _int, 0, & settings.maxLogLength_minutes, "maxLogLength", }, + { 0, 1, 1, 1, 1, 0, _int, 0, & settings.maxLogTime_minutes, "maxLogTime"}, + { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.runLogTest, "runLogTest", }, // Not stored in NVM // MQTT - { 0, 1, 1, 1, 1, _bool, 0, & settings.debugMqttClientData, "debugMqttClientData", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.debugMqttClientState, "debugMqttClientState", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugMqttClientData, "debugMqttClientData", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugMqttClientState, "debugMqttClientState", }, // Multicast DNS - { 0, 1, 1, 1, 1, _bool, 0, & settings.mdnsEnable, "mdnsEnable", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.mdnsEnable, "mdnsEnable", }, // Network layer - { 0, 1, 1, 1, 1, _bool, 0, & settings.debugNetworkLayer, "debugNetworkLayer", }, - { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.defaultNetworkType, "defaultNetworkType", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enableNetworkFailover, "enableNetworkFailover", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.printNetworkStatus, "printNetworkStatus", }, - -// T -// G S C o -// N e m E r -// S t d v c -// S t s k h Type Qual Variable Name + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNetworkLayer, "debugNetworkLayer", }, + { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.defaultNetworkType, "defaultNetworkType", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableNetworkFailover, "enableNetworkFailover", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.printNetworkStatus, "printNetworkStatus", }, + +// F +// a +// c +// e T +// G S C t o +// N e m E r +// S t d v V c +// S t s k 2 h Type Qual Variable Name // NTP (Ethernet Only) - { 0, 1, 1, 1, 0, _bool, 0, & settings.debugNtp, "debugNtp", }, - { 0, 1, 1, 1, 0, _bool, 0, & settings.enableNTPFile, "enableNTPFile", }, - { 0, 1, 1, 1, 0, _uint16_t, 0, & settings.ethernetNtpPort, "ethernetNtpPort", }, - { 0, 1, 1, 1, 0, _uint8_t, 0, & settings.ntpPollExponent, "ntpPollExponent", }, - { 0, 1, 1, 1, 0, _int8_t, 0, & settings.ntpPrecision, "ntpPrecision", }, - { 0, 1, 1, 1, 0, tCharArry, sizeof(settings.ntpReferenceId), & settings.ntpReferenceId, "ntpReferenceId", }, - { 0, 1, 1, 1, 0, _uint32_t, 0, & settings.ntpRootDelay, "ntpRootDelay", }, - { 0, 1, 1, 1, 0, _uint32_t, 0, & settings.ntpRootDispersion, "ntpRootDispersion", }, + { 0, 1, 1, 1, 0, 0, _bool, 0, & settings.debugNtp, "debugNtp", }, + { 0, 1, 1, 1, 0, 0, _bool, 0, & settings.enableNTPFile, "enableNTPFile", }, + { 0, 1, 1, 1, 0, 0, _uint16_t, 0, & settings.ethernetNtpPort, "ethernetNtpPort", }, + { 0, 1, 1, 1, 0, 0, _uint8_t, 0, & settings.ntpPollExponent, "ntpPollExponent", }, + { 0, 1, 1, 1, 0, 0, _int8_t, 0, & settings.ntpPrecision, "ntpPrecision", }, + { 0, 1, 1, 1, 0, 0, tCharArry, sizeof(settings.ntpReferenceId), & settings.ntpReferenceId, "ntpReferenceId", }, + { 0, 1, 1, 1, 0, 0, _uint32_t, 0, & settings.ntpRootDelay, "ntpRootDelay", }, + { 0, 1, 1, 1, 0, 0, _uint32_t, 0, & settings.ntpRootDispersion, "ntpRootDispersion", }, // NTRIP Client - { 0, 1, 1, 1, 1, _bool, 0, & settings.debugNtripClientRtcm, "debugNtripClientRtcm", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.debugNtripClientState, "debugNtripClientState", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enableNtripClient, "enableNtripClient", }, - { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterHost), & settings.ntripClient_CasterHost, "ntripClientCasterHost", }, - { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.ntripClient_CasterPort, "ntripClientCasterPort", }, - { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUser), & settings.ntripClient_CasterUser, "ntripClientCasterUser", }, - { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUserPW), & settings.ntripClient_CasterUserPW, "ntripClientCasterUserPW", }, - { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPoint), & settings.ntripClient_MountPoint, "ntripClientMountPoint", }, - { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPointPW), & settings.ntripClient_MountPointPW, "ntripClientMountPointPW", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.ntripClient_TransmitGGA, "ntripClientTransmitGGA", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNtripClientRtcm, "debugNtripClientRtcm", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNtripClientState, "debugNtripClientState", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableNtripClient, "enableNtripClient", }, + { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterHost), & settings.ntripClient_CasterHost, "ntripClientCasterHost", }, + { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.ntripClient_CasterPort, "ntripClientCasterPort", }, + { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUser), & settings.ntripClient_CasterUser, "ntripClientCasterUser", }, + { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUserPW), & settings.ntripClient_CasterUserPW, "ntripClientCasterUserPW", }, + { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPoint), & settings.ntripClient_MountPoint, "ntripClientMountPoint", }, + { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPointPW), & settings.ntripClient_MountPointPW, "ntripClientMountPointPW", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.ntripClient_TransmitGGA, "ntripClientTransmitGGA", }, // NTRIP Server - { 0, 1, 1, 1, 1, _bool, 0, & settings.debugNtripServerRtcm, "debugNtripServerRtcm", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.debugNtripServerState, "debugNtripServerState", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enableNtripServer, "enableNtripServer", }, - { 0, 0, 1, 1, 1, _bool, 0, & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", }, - { 0, 1, 1, 1, 1, tNSCHost, NTRIP_SERVER_MAX, & settings.ntripServer_CasterHost[0], "ntripServerCasterHost_", }, - { 0, 1, 1, 1, 1, tNSCPort, NTRIP_SERVER_MAX, & settings.ntripServer_CasterPort[0], "ntripServerCasterPort_", }, - { 0, 1, 1, 1, 1, tNSCUser, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUser[0], "ntripServerCasterUser_", }, - { 0, 1, 1, 1, 1, tNSCUsrPw, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUserPW[0], "ntripServerCasterUserPW_", }, - { 0, 1, 1, 1, 1, tNSMtPt, NTRIP_SERVER_MAX, & settings.ntripServer_MountPoint[0], "ntripServerMountPoint_", }, - { 0, 1, 1, 1, 1, tNSMtPtPw, NTRIP_SERVER_MAX, & settings.ntripServer_MountPointPW[0], "ntripServerMountPointPW_", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNtripServerRtcm, "debugNtripServerRtcm", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNtripServerState, "debugNtripServerState", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableNtripServer, "enableNtripServer", }, + { 0, 0, 1, 1, 1, 1, _bool, 0, & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", }, + { 0, 1, 1, 1, 1, 1, tNSCHost, NTRIP_SERVER_MAX, & settings.ntripServer_CasterHost[0], "ntripServerCasterHost_", }, + { 0, 1, 1, 1, 1, 1, tNSCPort, NTRIP_SERVER_MAX, & settings.ntripServer_CasterPort[0], "ntripServerCasterPort_", }, + { 0, 1, 1, 1, 1, 1, tNSCUser, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUser[0], "ntripServerCasterUser_", }, + { 0, 1, 1, 1, 1, 1, tNSCUsrPw, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUserPW[0], "ntripServerCasterUserPW_", }, + { 0, 1, 1, 1, 1, 1, tNSMtPt, NTRIP_SERVER_MAX, & settings.ntripServer_MountPoint[0], "ntripServerMountPoint_", }, + { 0, 1, 1, 1, 1, 1, tNSMtPtPw, NTRIP_SERVER_MAX, & settings.ntripServer_MountPointPW[0], "ntripServerMountPointPW_", }, // OS - { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.bluetoothInterruptsCore, "bluetoothInterruptsCore", }, - { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.btReadTaskCore, "btReadTaskCore", }, - { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.btReadTaskPriority, "btReadTaskPriority", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enableHeapReport, "enableHeapReport", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintIdleTime, "enablePrintIdleTime", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePsram, "enablePsram", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enableTaskReports, "enableTaskReports", }, - { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssReadTaskCore, "gnssReadTaskCore", }, - { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssReadTaskPriority, "gnssReadTaskPriority", }, - { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssUartInterruptsCore, "gnssUartInterruptsCore", }, - { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskCore, "handleGnssDataTaskCore", }, - { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskPriority, "handleGnssDataTaskPriority", }, - { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.i2cInterruptsCore, "i2cInterruptsCore", }, - { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.measurementScale, "measurementScale", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.printBootTimes, "printBootTimes", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.printPartitionTable, "printPartitionTable", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.printTaskStartStop, "printTaskStartStop", }, - { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.psramMallocLevel, "psramMallocLevel", }, - { 0, 1, 1, 1, 1, _uint32_t, 0, & settings.rebootSeconds, "rebootSeconds", }, - { 0, 1, 1, 1, 1, _int, 0, & settings.resetCount, "resetCount", }, + { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.bluetoothInterruptsCore, "bluetoothInterruptsCore", }, + { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.btReadTaskCore, "btReadTaskCore", }, + { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.btReadTaskPriority, "btReadTaskPriority", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableHeapReport, "enableHeapReport", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintIdleTime, "enablePrintIdleTime", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePsram, "enablePsram", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableTaskReports, "enableTaskReports", }, + { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssReadTaskCore, "gnssReadTaskCore", }, + { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssReadTaskPriority, "gnssReadTaskPriority", }, + { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssUartInterruptsCore, "gnssUartInterruptsCore", }, + { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskCore, "handleGnssDataTaskCore", }, + { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskPriority, "handleGnssDataTaskPriority", }, + { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.i2cInterruptsCore, "i2cInterruptsCore", }, + { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.measurementScale, "measurementScale", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.printBootTimes, "printBootTimes", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.printPartitionTable, "printPartitionTable", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.printTaskStartStop, "printTaskStartStop", }, + { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.psramMallocLevel, "psramMallocLevel", }, + { 0, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.rebootSeconds, "rebootSeconds", }, + { 0, 1, 1, 1, 1, 1, _int, 0, & settings.resetCount, "resetCount", }, // Periodic Display - { 0, 1, 1, 1, 1, tPerDisp, 0, & settings.periodicDisplay, "periodicDisplay", }, - { 0, 1, 1, 1, 1, _uint32_t, 0, & settings.periodicDisplayInterval, "periodicDisplayInterval", }, + { 0, 1, 1, 1, 1, 1, tPerDisp, 0, & settings.periodicDisplay, "periodicDisplay", }, + { 0, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.periodicDisplayInterval, "periodicDisplayInterval", }, // Point Perfect - { 0, 1, 1, 1, 1, _bool, 0, & settings.autoKeyRenewal, "autoKeyRenewal", }, - { 0, 0, 1, 1, 1, _bool, 0, & settings.debugPpCertificate, "debugPpCertificate", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", }, - { 0, 1, 1, 1, 1, _int, 0, & settings.geographicRegion, "geographicRegion", }, - { 0, 1, 1, 1, 1, _uint64_t, 0, & settings.lastKeyAttempt, "lastKeyAttempt", }, - { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.lbandFixTimeout_seconds, "lbandFixTimeout", }, - { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectBrokerHost), & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", }, - { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectClientID), & settings.pointPerfectClientID, "pointPerfectClientID", }, - { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectCurrentKey), & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", }, - { 0, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", }, - { 0, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", }, - { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectDeviceProfileToken), & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", }, - { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectKeyDistributionTopic), & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", }, - { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectNextKey), & settings.pointPerfectNextKey, "pointPerfectNextKey", }, - { 0, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", }, - { 0, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", }, - { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.pplFixTimeoutS, "pplFixTimeoutS", }, - { 0, 1, 1, 1, 1, tRegCorTp, numRegionalAreas, & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.autoKeyRenewal, "autoKeyRenewal", }, + { 0, 0, 1, 1, 1, 1, _bool, 0, & settings.debugPpCertificate, "debugPpCertificate", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", }, + { 0, 1, 1, 1, 1, 1, _int, 0, & settings.geographicRegion, "geographicRegion", }, + { 0, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.lastKeyAttempt, "lastKeyAttempt", }, + { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.lbandFixTimeout_seconds, "lbandFixTimeout", }, + { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectBrokerHost), & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", }, + { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectClientID), & settings.pointPerfectClientID, "pointPerfectClientID", }, + { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectCurrentKey), & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", }, + { 0, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", }, + { 0, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", }, + { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectDeviceProfileToken), & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", }, + { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectKeyDistributionTopic), & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", }, + { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectNextKey), & settings.pointPerfectNextKey, "pointPerfectNextKey", }, + { 0, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", }, + { 0, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", }, + { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.pplFixTimeoutS, "pplFixTimeoutS", }, + { 0, 1, 1, 1, 1, 1, tRegCorTp, numRegionalAreas, & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", }, // Profiles - { 0, 0, 1, 1, 1, tCharArry, sizeof(settings.profileName), & settings.profileName, "profileName", }, + { 0, 0, 1, 1, 1, 1, tCharArry, sizeof(settings.profileName), & settings.profileName, "profileName", }, -// T -// G S C o -// N e m E r -// S t d v c -// S t s k h Type Qual Variable Name +// F +// a +// c +// e T +// G S C t o +// N e m E r +// S t d v V c +// S t s k 2 h Type Qual Variable Name // Pulse - { 1, 1, 1, 1, 0, _bool, 0, & settings.enableExternalPulse, "enableExternalPulse", }, - { 1, 1, 1, 1, 0, _uint64_t, 0, & settings.externalPulseLength_us, "externalPulseLength", }, - { 1, 1, 1, 1, 0, tPulseEdg, 0, & settings.externalPulsePolarity, "externalPulsePolarity", }, - { 1, 1, 1, 1, 0, _uint64_t, 0, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", }, + { 1, 1, 1, 1, 0, 0, _bool, 0, & settings.enableExternalPulse, "enableExternalPulse", }, + { 1, 1, 1, 1, 0, 0, _uint64_t, 0, & settings.externalPulseLength_us, "externalPulseLength", }, + { 1, 1, 1, 1, 0, 0, tPulseEdg, 0, & settings.externalPulsePolarity, "externalPulsePolarity", }, + { 1, 1, 1, 1, 0, 0, _uint64_t, 0, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", }, // Radio - { 0, 1, 1, 1, 1, tMuxConn, 0, & settings.dataPortChannel, "dataPortChannel", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.debugGnss, "debugGnss", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintPosition, "enablePrintPosition", }, - { 1, 0, 1, 1, 1, _uint16_t, 0, & settings.measurementRateMs, "measurementRateMs", }, - { 1, 0, 1, 1, 1, _uint16_t, 0, & settings.navigationRate, "navigationRate", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.updateGNSSSettings, "updateGNSSSettings", }, + { 0, 1, 1, 1, 1, 1, tMuxConn, 0, & settings.dataPortChannel, "dataPortChannel", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugGnss, "debugGnss", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintPosition, "enablePrintPosition", }, + { 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.measurementRateMs, "measurementRateMs", }, + { 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.navigationRate, "navigationRate", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.updateGNSSSettings, "updateGNSSSettings", }, // Ring Buffer - { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", }, - { 0, 1, 1, 1, 1, _int, 0, & settings.gnssHandlerBufferSize, "gnssHandlerBufferSize", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", }, + { 0, 1, 1, 1, 1, 1, _int, 0, & settings.gnssHandlerBufferSize, "gnssHandlerBufferSize", }, // Rover operation - { 1, 1, 1, 1, 1, _uint8_t, 0, & settings.dynamicModel, "dynamicModel", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRoverAccuracy, "enablePrintRoverAccuracy", }, - { 1, 0, 1, 1, 1, _int16_t, 0, & settings.minCNO, "minCNO", }, - { 1, 1, 1, 1, 1, _uint8_t, 0, & settings.minElev, "minElev", }, + { 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.dynamicModel, "dynamicModel", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRoverAccuracy, "enablePrintRoverAccuracy", }, + { 1, 0, 1, 1, 1, 1, _int16_t, 0, & settings.minCNO, "minCNO", }, + { 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.minElev, "minElev", }, // RTC (Real Time Clock) - { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRtcSync, "enablePrintRtcSync", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRtcSync, "enablePrintRtcSync", }, -// T -// G S C o -// N e m E r -// S t d v c -// S t s k h Type Qual Variable Name +// F +// a +// c +// e T +// G S C t o +// N e m E r +// S t d v V c +// S t s k 2 h Type Qual Variable Name // SD Card - { 0, 1, 1, 1, 0, _bool, 0, & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", }, - { 0, 1, 1, 1, 0, _bool, 0, & settings.enablePrintSDBuffers, "enablePrintSDBuffers", }, - { 0, 1, 1, 1, 0, _bool, 0, & settings.enableSD, "enableSD"}, - { 0, 1, 1, 1, 0, _bool, 0, & settings.forceResetOnSDFail, "forceResetOnSDFail", }, + { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", }, + { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.enablePrintSDBuffers, "enablePrintSDBuffers", }, + { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.enableSD, "enableSD"}, + { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.forceResetOnSDFail, "forceResetOnSDFail", }, // Serial - { 1, 1, 1, 1, 1, _uint32_t, 0, & settings.dataPortBaud, "dataPortBaud", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.echoUserInput, "echoUserInput", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", }, - { 1, 1, 1, 1, 1, _uint32_t, 0, & settings.radioPortBaud, "radioPortBaud", }, - { 0, 1, 1, 1, 1, _int16_t, 0, & settings.serialTimeoutGNSS, "serialTimeoutGNSS", }, - -// T -// G S C o -// N e m E r -// S t d v c -// S t s k h Type Qual Variable Name + { 1, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.dataPortBaud, "dataPortBaud", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.echoUserInput, "echoUserInput", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", }, + { 1, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.radioPortBaud, "radioPortBaud", }, + { 0, 1, 1, 1, 1, 1, _int16_t, 0, & settings.serialTimeoutGNSS, "serialTimeoutGNSS", }, + +// F +// a +// c +// e T +// G S C t o +// N e m E r +// S t d v V c +// S t s k 2 h Type Qual Variable Name // Setup Button - { 0, 1, 1, 1, 0, _bool, 0, & settings.disableSetupButton, "disableSetupButton", }, + { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.disableSetupButton, "disableSetupButton", }, // State - { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintState, "enablePrintState", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintStates, "enablePrintStates", }, - { 1, 0, 1, 1, 1, tSysState, 0, & settings.lastState, "lastState", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintState, "enablePrintState", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintStates, "enablePrintStates", }, + { 1, 0, 1, 1, 1, 1, tSysState, 0, & settings.lastState, "lastState", }, // TCP Client - { 0, 1, 1, 1, 1, _bool, 0, & settings.debugTcpClient, "debugTcpClient", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enableTcpClient, "enableTcpClient", }, - { 0, 1, 1, 1, 1, tCharArry, sizeof(settings.tcpClientHost), & settings.tcpClientHost, "tcpClientHost", }, - { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.tcpClientPort, "tcpClientPort", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugTcpClient, "debugTcpClient", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableTcpClient, "enableTcpClient", }, + { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.tcpClientHost), & settings.tcpClientHost, "tcpClientHost", }, + { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.tcpClientPort, "tcpClientPort", }, // TCP Server - { 0, 1, 1, 1, 1, _bool, 0, & settings.debugTcpServer, "debugTcpServer", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enableTcpServer, "enableTcpServer", }, - { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.tcpServerPort, "tcpServerPort", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugTcpServer, "debugTcpServer", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableTcpServer, "enableTcpServer", }, + { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.tcpServerPort, "tcpServerPort", }, // Time Zone - { 0, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneHours, "timeZoneHours", }, - { 0, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneMinutes, "timeZoneMinutes", }, - { 0, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneSeconds, "timeZoneSeconds", }, - -// T -// G S C o -// N e m E r -// S t d v c -// S t s k h Type Qual Variable Name + { 0, 1, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneHours, "timeZoneHours", }, + { 0, 1, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneMinutes, "timeZoneMinutes", }, + { 0, 1, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneSeconds, "timeZoneSeconds", }, + +// F +// a +// c +// e T +// G S C t o +// N e m E r +// S t d v V c +// S t s k 2 h Type Qual Variable Name // UBX (SX1276) - { 0, 1, 1, 1, 0, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, - { 1, 1, 1, 1, 0, tUbxConst, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "ubxConstellation_", }, - { 1, 0, 1, 1, 0, tUbxMsgRt, MAX_UBX_MSG, & settings.ubxMessageRates[0], "ubxMessageRate_", }, - { 1, 0, 1, 1, 0, tUbMsgRtb, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "ubxMessageRateBase_", }, + { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, + { 1, 1, 1, 1, 1, 0, tUbxConst, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "ubxConstellation_", }, + { 1, 0, 1, 1, 1, 0, tUbxMsgRt, MAX_UBX_MSG, & settings.ubxMessageRates[0], "ubxMessageRate_", }, + { 1, 0, 1, 1, 1, 0, tUbMsgRtb, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "ubxMessageRateBase_", }, // UDP Server - { 0, 1, 1, 1, 1, _bool, 0, & settings.debugUdpServer, "debugUdpServer", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enableUdpServer, "enableUdpServer", }, - { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.udpServerPort, "udpServerPort", }, - -// T -// G S C o -// N e m E r -// S t d v c -// S t s k h Type Qual Variable Name + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugUdpServer, "debugUdpServer", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableUdpServer, "enableUdpServer", }, + { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.udpServerPort, "udpServerPort", }, + +// F +// a +// c +// e T +// G S C t o +// N e m E r +// S t d v V c +// S t s k 2 h Type Qual Variable Name // UM980 - { 0, 1, 1, 0, 1, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", }, - { 0, 1, 1, 0, 1, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", }, - { 0, 1, 1, 0, 1, _bool, 0, & settings.enableImuDebug, "enableImuDebug", }, - { 0, 1, 1, 0, 1, _bool, 0, & settings.enableTiltCompensation, "enableTiltCompensation", }, - { 0, 1, 1, 0, 1, _float, 3, & settings.tiltPoleLength, "tiltPoleLength", }, - { 0, 1, 1, 0, 1, tUmConst, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "um980Constellations_", }, - { 0, 0, 1, 0, 1, tUmMRNmea, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", }, - { 0, 0, 1, 0, 1, tUmMRBaRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", }, - { 0, 0, 1, 0, 1, tUmMRRvRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", }, + { 0, 1, 1, 0, 0, 1, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", }, + { 0, 1, 1, 0, 0, 1, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", }, + { 0, 1, 1, 0, 0, 1, _bool, 0, & settings.enableImuDebug, "enableImuDebug", }, + { 0, 1, 1, 0, 0, 1, _bool, 0, & settings.enableTiltCompensation, "enableTiltCompensation", }, + { 0, 1, 1, 0, 0, 1, _float, 3, & settings.tiltPoleLength, "tiltPoleLength", }, + { 0, 1, 1, 0, 0, 1, tUmConst, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "um980Constellations_", }, + { 0, 0, 1, 0, 0, 1, tUmMRNmea, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", }, + { 0, 0, 1, 0, 0, 1, tUmMRBaRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", }, + { 0, 0, 1, 0, 0, 1, tUmMRRvRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", }, // Web Server - { 0, 1, 1, 1, 1, _uint16_t, 0, & settings.httpPort, "httpPort", }, + { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.httpPort, "httpPort", }, // WiFi - { 0, 1, 1, 1, 1, _bool, 0, & settings.debugWiFiConfig, "debugWiFiConfig", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.debugWifiState, "debugWifiState", }, - { 0, 1, 1, 1, 1, _bool, 0, & settings.enableCaptivePortal, "enableCaptivePortal", }, - { 0, 1, 1, 1, 1, _uint8_t, 0, & settings.wifiChannel, "wifiChannel", }, - { 0, 0, 1, 1, 1, _bool, 0, & settings.wifiConfigOverAP, "wifiConfigOverAP", }, // TODO: check drop downs - { 0, 1, 1, 1, 1, tWiFiNet, MAX_WIFI_NETWORKS, & settings.wifiNetworks, "wifiNetwork_", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugWiFiConfig, "debugWiFiConfig", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugWifiState, "debugWifiState", }, + { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableCaptivePortal, "enableCaptivePortal", }, + { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.wifiChannel, "wifiChannel", }, + { 0, 0, 1, 1, 1, 1, _bool, 0, & settings.wifiConfigOverAP, "wifiConfigOverAP", }, // TODO: check drop downs + { 0, 1, 1, 1, 1, 1, tWiFiNet, MAX_WIFI_NETWORKS, & settings.wifiNetworks, "wifiNetwork_", }, // Add new settings to appropriate group above or create new group // Then also add to the same group in settings above -// T -// G S C o -// N e m E r -// S t d v c -// S t s k h Type Qual Variable Name +// F +// a +// c +// e T +// G S C t o +// N e m E r +// S t d v V c +// S t s k 2 h Type Qual Variable Name /* - { 0, 1, 1, 1, 1, , 0, & settings., ""}, + { 0, 1, 1, 1, 1, 1, , 0, & settings., ""}, */ }; From cd0ba41b0cea5750afc47379df5b3c478cf92cce Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 18 May 2024 20:06:29 -1000 Subject: [PATCH 063/358] Add Facet Mosaic column to rtkSettingsEntries --- Firmware/RTK_Everywhere/settings.h | 615 ++++++++++++++++------------- 1 file changed, 332 insertions(+), 283 deletions(-) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index e77fceae9..2753faedf 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1389,6 +1389,7 @@ typedef struct bool inCommands; bool platEvk; bool platFacetV2; + bool platFacetMosaic; bool platTorch; RTK_Settings_Types type; int qualifier; @@ -1400,387 +1401,435 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { // Note: don't use "_" in the name - "_" is reserved for settings arrays like "ubxMessageRate_" -// F +// F +// a +// c +// e +// F t // a -// c -// e T -// G S C t o -// N e m E r -// S t d v V c -// S t s k 2 h Type Qual Variable Name +// c M +// e o T +// G S C t s o +// N e m E a r +// S t d v V i c +// S t s k 2 c h Type Qual Variable Name // Antenna - { 0, 1, 1, 1, 1, 1, _int16_t, 0, & settings.antennaHeight, "antennaHeight", }, - { 0, 1, 1, 1, 1, 1, _float, 2, & settings.antennaReferencePoint, "antennaReferencePoint" }, - { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableARPLogging, "enableARPLogging", }, + { 0, 1, 1, 1, 1, 1, 1, _int16_t, 0, & settings.antennaHeight, "antennaHeight", }, + { 0, 1, 1, 1, 1, 1, 1, _float, 2, & settings.antennaReferencePoint, "antennaReferencePoint" }, + { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableARPLogging, "enableARPLogging", }, // Base operation - { 0, 1, 1, 1, 1, 1, tCoordInp, 0, & settings.coordinateInputType, "coordinateInputType", }, - { 1, 1, 1, 1, 1, 1, _double, 4, & settings.fixedAltitude, "fixedAltitude", }, - { 1, 0, 1, 1, 1, 1, _bool, 0, & settings.fixedBase, "fixedBase", }, - { 1, 0, 1, 1, 1, 1, _bool, 0, & settings.fixedBaseCoordinateType, "fixedBaseCoordinateType", }, - { 1, 1, 1, 1, 1, 1, _double, 3, & settings.fixedEcefX, "fixedEcefX", }, - { 1, 1, 1, 1, 1, 1, _double, 3, & settings.fixedEcefY, "fixedEcefY", }, - { 1, 1, 1, 1, 1, 1, _double, 3, & settings.fixedEcefZ, "fixedEcefZ", }, - { 1, 1, 1, 1, 1, 1, _double, 9, & settings.fixedLat, "fixedLat", }, - { 1, 1, 1, 1, 1, 1, _double, 9, & settings.fixedLong, "fixedLong", }, - { 1, 1, 1, 1, 1, 1, _int, 0, & settings.observationSeconds, "observationSeconds", }, - { 1, 1, 1, 1, 1, 1, _float, 2, & settings.observationPositionAccuracy, "observationPositionAccuracy", }, - { 1, 1, 1, 1, 1, 1, _float, 1, & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", }, + { 0, 1, 1, 1, 1, 1, 1, tCoordInp, 0, & settings.coordinateInputType, "coordinateInputType", }, + { 1, 1, 1, 1, 1, 1, 1, _double, 4, & settings.fixedAltitude, "fixedAltitude", }, + { 1, 0, 1, 1, 1, 1, 1, _bool, 0, & settings.fixedBase, "fixedBase", }, + { 1, 0, 1, 1, 1, 1, 1, _bool, 0, & settings.fixedBaseCoordinateType, "fixedBaseCoordinateType", }, + { 1, 1, 1, 1, 1, 1, 1, _double, 3, & settings.fixedEcefX, "fixedEcefX", }, + { 1, 1, 1, 1, 1, 1, 1, _double, 3, & settings.fixedEcefY, "fixedEcefY", }, + { 1, 1, 1, 1, 1, 1, 1, _double, 3, & settings.fixedEcefZ, "fixedEcefZ", }, + { 1, 1, 1, 1, 1, 1, 1, _double, 9, & settings.fixedLat, "fixedLat", }, + { 1, 1, 1, 1, 1, 1, 1, _double, 9, & settings.fixedLong, "fixedLong", }, + { 1, 1, 1, 1, 1, 1, 1, _int, 0, & settings.observationSeconds, "observationSeconds", }, + { 1, 1, 1, 1, 1, 1, 1, _float, 2, & settings.observationPositionAccuracy, "observationPositionAccuracy", }, + { 1, 1, 1, 1, 1, 1, 1, _float, 1, & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", }, // Battery - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", }, - { 0, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", }, - -// F + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", }, + { 0, 1, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", }, + +// F +// a +// c +// e +// F t // a -// c -// e T -// G S C t o -// N e m E r -// S t d v V c -// S t s k 2 h Type Qual Variable Name +// c M +// e o T +// G S C t s o +// N e m E a r +// S t d v V i c +// S t s k 2 c h Type Qual Variable Name // Beeper - { 0, 1, 1, 0, 0, 1, _bool, 0, & settings.enableBeeper, "enableBeeper", }, + { 0, 1, 1, 0, 0, 1, 1, _bool, 0, & settings.enableBeeper, "enableBeeper", }, // Bluetooth - { 0, 1, 1, 1, 1, 1, tBtRadio, 0, & settings.bluetoothRadioType, "bluetoothRadioType", }, - { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.sppRxQueueSize, "sppRxQueueSize", }, - { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.sppTxQueueSize, "sppTxQueueSize", }, + { 0, 1, 1, 1, 1, 1, 1, tBtRadio, 0, & settings.bluetoothRadioType, "bluetoothRadioType", }, + { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.sppRxQueueSize, "sppRxQueueSize", }, + { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.sppTxQueueSize, "sppTxQueueSize", }, // Corrections - { 0, 1, 1, 1, 1, 1, _int, 0, & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", }, - { 0, 1, 1, 1, 1, 1, tCorrSPri, correctionsSource::CORR_NUM, & settings.correctionsSourcesPriority, "correctionsPriority_", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugCorrections, "debugCorrections", }, - -// F + { 0, 1, 1, 1, 1, 1, 1, _int, 0, & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", }, + { 0, 1, 1, 1, 1, 1, 1, tCorrSPri, correctionsSource::CORR_NUM, & settings.correctionsSourcesPriority, "correctionsPriority_", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugCorrections, "debugCorrections", }, + +// F +// a +// c +// e +// F t // a -// c -// e T -// G S C t o -// N e m E r -// S t d v V c -// S t s k 2 h Type Qual Variable Name +// c M +// e o T +// G S C t s o +// N e m E a r +// S t d v V i c +// S t s k 2 c h Type Qual Variable Name // Display - { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.enableResetDisplay, "enableResetDisplay", }, + { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.enableResetDisplay, "enableResetDisplay", }, // ESP Now - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugEspNow, "debugEspNow", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableEspNow, "enableEspNow", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.espnowBroadcast, "espnowBroadcast", }, - { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.espnowPeerCount, "espnowPeerCount", }, - { 0, 1, 1, 1, 1, 1, tEspNowPr, ESPNOW_MAX_PEERS, & settings.espnowPeers[0][0], "espnowPeer_", }, - -// F + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugEspNow, "debugEspNow", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableEspNow, "enableEspNow", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.espnowBroadcast, "espnowBroadcast", }, + { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.espnowPeerCount, "espnowPeerCount", }, + { 0, 1, 1, 1, 1, 1, 1, tEspNowPr, ESPNOW_MAX_PEERS, & settings.espnowPeers[0][0], "espnowPeer_", }, + +// F +// a +// c +// e +// F t // a -// c -// e T -// G S C t o -// N e m E r -// S t d v V c -// S t s k 2 h Type Qual Variable Name +// c M +// e o T +// G S C t s o +// N e m E a r +// S t d v V i c +// S t s k 2 c h Type Qual Variable Name // Ethernet - { 0, 1, 1, 1, 0, 0, _bool, 0, & settings.enablePrintEthernetDiag, "enablePrintEthernetDiag", }, - { 0, 1, 1, 1, 0, 0, _bool, 0, & settings.ethernetDHCP, "ethernetDHCP", }, - { 0, 1, 1, 1, 0, 0, _IPString, 0, & settings.ethernetDNS, "ethernetDNS", }, - { 0, 1, 1, 1, 0, 0, _IPString, 0, & settings.ethernetGateway, "ethernetGateway", }, - { 0, 1, 1, 1, 0, 0, _IPString, 0, & settings.ethernetIP, "ethernetIP", }, - { 0, 1, 1, 1, 0, 0, _IPString, 0, & settings.ethernetSubnet, "ethernetSubnet", }, + { 0, 1, 1, 1, 0, 0, 0, _bool, 0, & settings.enablePrintEthernetDiag, "enablePrintEthernetDiag", }, + { 0, 1, 1, 1, 0, 0, 0, _bool, 0, & settings.ethernetDHCP, "ethernetDHCP", }, + { 0, 1, 1, 1, 0, 0, 0, _IPString, 0, & settings.ethernetDNS, "ethernetDNS", }, + { 0, 1, 1, 1, 0, 0, 0, _IPString, 0, & settings.ethernetGateway, "ethernetGateway", }, + { 0, 1, 1, 1, 0, 0, 0, _IPString, 0, & settings.ethernetIP, "ethernetIP", }, + { 0, 1, 1, 1, 0, 0, 0, _IPString, 0, & settings.ethernetSubnet, "ethernetSubnet", }, // Firmware - { 0, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.autoFirmwareCheckMinutes, "autoFirmwareCheckMinutes", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugFirmwareUpdate, "debugFirmwareUpdate", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableAutoFirmwareUpdate, "enableAutoFirmwareUpdate", }, + { 0, 1, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.autoFirmwareCheckMinutes, "autoFirmwareCheckMinutes", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugFirmwareUpdate, "debugFirmwareUpdate", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableAutoFirmwareUpdate, "enableAutoFirmwareUpdate", }, // GNSS UART - { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", }, - { 0, 1, 1, 1, 1, 1, _int, 0, & settings.uartReceiveBufferSize, "uartReceiveBufferSize", }, + { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", }, + { 0, 1, 1, 1, 1, 1, 1, _int, 0, & settings.uartReceiveBufferSize, "uartReceiveBufferSize", }, // Hardware - { 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", }, - { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.spiFrequency, "spiFrequency", }, - -// F + { 1, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", }, + { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.spiFrequency, "spiFrequency", }, + +// F +// a +// c +// e +// F t // a -// c -// e T -// G S C t o -// N e m E r -// S t d v V c -// S t s k 2 h Type Qual Variable Name +// c M +// e o T +// G S C t s o +// N e m E a r +// S t d v V i c +// S t s k 2 c h Type Qual Variable Name // Log file - { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.enableLogging, "enableLogging", }, - { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.enablePrintLogFileMessages, "enablePrintLogFileMessages", }, - { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.enablePrintLogFileStatus, "enablePrintLogFileStatus", }, - { 0, 1, 1, 1, 1, 0, _int, 0, & settings.maxLogLength_minutes, "maxLogLength", }, - { 0, 1, 1, 1, 1, 0, _int, 0, & settings.maxLogTime_minutes, "maxLogTime"}, - { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.runLogTest, "runLogTest", }, // Not stored in NVM + { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.enableLogging, "enableLogging", }, + { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.enablePrintLogFileMessages, "enablePrintLogFileMessages", }, + { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.enablePrintLogFileStatus, "enablePrintLogFileStatus", }, + { 0, 1, 1, 1, 1, 1, 0, _int, 0, & settings.maxLogLength_minutes, "maxLogLength", }, + { 0, 1, 1, 1, 1, 1, 0, _int, 0, & settings.maxLogTime_minutes, "maxLogTime"}, + { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.runLogTest, "runLogTest", }, // Not stored in NVM // MQTT - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugMqttClientData, "debugMqttClientData", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugMqttClientState, "debugMqttClientState", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugMqttClientData, "debugMqttClientData", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugMqttClientState, "debugMqttClientState", }, // Multicast DNS - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.mdnsEnable, "mdnsEnable", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.mdnsEnable, "mdnsEnable", }, // Network layer - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNetworkLayer, "debugNetworkLayer", }, - { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.defaultNetworkType, "defaultNetworkType", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableNetworkFailover, "enableNetworkFailover", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.printNetworkStatus, "printNetworkStatus", }, - -// F + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNetworkLayer, "debugNetworkLayer", }, + { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.defaultNetworkType, "defaultNetworkType", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableNetworkFailover, "enableNetworkFailover", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.printNetworkStatus, "printNetworkStatus", }, + +// F +// a +// c +// e +// F t // a -// c -// e T -// G S C t o -// N e m E r -// S t d v V c -// S t s k 2 h Type Qual Variable Name +// c M +// e o T +// G S C t s o +// N e m E a r +// S t d v V i c +// S t s k 2 c h Type Qual Variable Name // NTP (Ethernet Only) - { 0, 1, 1, 1, 0, 0, _bool, 0, & settings.debugNtp, "debugNtp", }, - { 0, 1, 1, 1, 0, 0, _bool, 0, & settings.enableNTPFile, "enableNTPFile", }, - { 0, 1, 1, 1, 0, 0, _uint16_t, 0, & settings.ethernetNtpPort, "ethernetNtpPort", }, - { 0, 1, 1, 1, 0, 0, _uint8_t, 0, & settings.ntpPollExponent, "ntpPollExponent", }, - { 0, 1, 1, 1, 0, 0, _int8_t, 0, & settings.ntpPrecision, "ntpPrecision", }, - { 0, 1, 1, 1, 0, 0, tCharArry, sizeof(settings.ntpReferenceId), & settings.ntpReferenceId, "ntpReferenceId", }, - { 0, 1, 1, 1, 0, 0, _uint32_t, 0, & settings.ntpRootDelay, "ntpRootDelay", }, - { 0, 1, 1, 1, 0, 0, _uint32_t, 0, & settings.ntpRootDispersion, "ntpRootDispersion", }, + { 0, 1, 1, 1, 0, 0, 0, _bool, 0, & settings.debugNtp, "debugNtp", }, + { 0, 1, 1, 1, 0, 0, 0, _bool, 0, & settings.enableNTPFile, "enableNTPFile", }, + { 0, 1, 1, 1, 0, 0, 0, _uint16_t, 0, & settings.ethernetNtpPort, "ethernetNtpPort", }, + { 0, 1, 1, 1, 0, 0, 0, _uint8_t, 0, & settings.ntpPollExponent, "ntpPollExponent", }, + { 0, 1, 1, 1, 0, 0, 0, _int8_t, 0, & settings.ntpPrecision, "ntpPrecision", }, + { 0, 1, 1, 1, 0, 0, 0, tCharArry, sizeof(settings.ntpReferenceId), & settings.ntpReferenceId, "ntpReferenceId", }, + { 0, 1, 1, 1, 0, 0, 0, _uint32_t, 0, & settings.ntpRootDelay, "ntpRootDelay", }, + { 0, 1, 1, 1, 0, 0, 0, _uint32_t, 0, & settings.ntpRootDispersion, "ntpRootDispersion", }, // NTRIP Client - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNtripClientRtcm, "debugNtripClientRtcm", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNtripClientState, "debugNtripClientState", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableNtripClient, "enableNtripClient", }, - { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterHost), & settings.ntripClient_CasterHost, "ntripClientCasterHost", }, - { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.ntripClient_CasterPort, "ntripClientCasterPort", }, - { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUser), & settings.ntripClient_CasterUser, "ntripClientCasterUser", }, - { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUserPW), & settings.ntripClient_CasterUserPW, "ntripClientCasterUserPW", }, - { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPoint), & settings.ntripClient_MountPoint, "ntripClientMountPoint", }, - { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPointPW), & settings.ntripClient_MountPointPW, "ntripClientMountPointPW", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.ntripClient_TransmitGGA, "ntripClientTransmitGGA", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNtripClientRtcm, "debugNtripClientRtcm", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNtripClientState, "debugNtripClientState", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableNtripClient, "enableNtripClient", }, + { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterHost), & settings.ntripClient_CasterHost, "ntripClientCasterHost", }, + { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.ntripClient_CasterPort, "ntripClientCasterPort", }, + { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUser), & settings.ntripClient_CasterUser, "ntripClientCasterUser", }, + { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUserPW), & settings.ntripClient_CasterUserPW, "ntripClientCasterUserPW", }, + { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPoint), & settings.ntripClient_MountPoint, "ntripClientMountPoint", }, + { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPointPW), & settings.ntripClient_MountPointPW, "ntripClientMountPointPW", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.ntripClient_TransmitGGA, "ntripClientTransmitGGA", }, // NTRIP Server - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNtripServerRtcm, "debugNtripServerRtcm", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNtripServerState, "debugNtripServerState", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableNtripServer, "enableNtripServer", }, - { 0, 0, 1, 1, 1, 1, _bool, 0, & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", }, - { 0, 1, 1, 1, 1, 1, tNSCHost, NTRIP_SERVER_MAX, & settings.ntripServer_CasterHost[0], "ntripServerCasterHost_", }, - { 0, 1, 1, 1, 1, 1, tNSCPort, NTRIP_SERVER_MAX, & settings.ntripServer_CasterPort[0], "ntripServerCasterPort_", }, - { 0, 1, 1, 1, 1, 1, tNSCUser, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUser[0], "ntripServerCasterUser_", }, - { 0, 1, 1, 1, 1, 1, tNSCUsrPw, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUserPW[0], "ntripServerCasterUserPW_", }, - { 0, 1, 1, 1, 1, 1, tNSMtPt, NTRIP_SERVER_MAX, & settings.ntripServer_MountPoint[0], "ntripServerMountPoint_", }, - { 0, 1, 1, 1, 1, 1, tNSMtPtPw, NTRIP_SERVER_MAX, & settings.ntripServer_MountPointPW[0], "ntripServerMountPointPW_", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNtripServerRtcm, "debugNtripServerRtcm", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNtripServerState, "debugNtripServerState", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableNtripServer, "enableNtripServer", }, + { 0, 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", }, + { 0, 1, 1, 1, 1, 1, 1, tNSCHost, NTRIP_SERVER_MAX, & settings.ntripServer_CasterHost[0], "ntripServerCasterHost_", }, + { 0, 1, 1, 1, 1, 1, 1, tNSCPort, NTRIP_SERVER_MAX, & settings.ntripServer_CasterPort[0], "ntripServerCasterPort_", }, + { 0, 1, 1, 1, 1, 1, 1, tNSCUser, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUser[0], "ntripServerCasterUser_", }, + { 0, 1, 1, 1, 1, 1, 1, tNSCUsrPw, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUserPW[0], "ntripServerCasterUserPW_", }, + { 0, 1, 1, 1, 1, 1, 1, tNSMtPt, NTRIP_SERVER_MAX, & settings.ntripServer_MountPoint[0], "ntripServerMountPoint_", }, + { 0, 1, 1, 1, 1, 1, 1, tNSMtPtPw, NTRIP_SERVER_MAX, & settings.ntripServer_MountPointPW[0], "ntripServerMountPointPW_", }, // OS - { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.bluetoothInterruptsCore, "bluetoothInterruptsCore", }, - { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.btReadTaskCore, "btReadTaskCore", }, - { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.btReadTaskPriority, "btReadTaskPriority", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableHeapReport, "enableHeapReport", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintIdleTime, "enablePrintIdleTime", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePsram, "enablePsram", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableTaskReports, "enableTaskReports", }, - { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssReadTaskCore, "gnssReadTaskCore", }, - { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssReadTaskPriority, "gnssReadTaskPriority", }, - { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssUartInterruptsCore, "gnssUartInterruptsCore", }, - { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskCore, "handleGnssDataTaskCore", }, - { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskPriority, "handleGnssDataTaskPriority", }, - { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.i2cInterruptsCore, "i2cInterruptsCore", }, - { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.measurementScale, "measurementScale", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.printBootTimes, "printBootTimes", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.printPartitionTable, "printPartitionTable", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.printTaskStartStop, "printTaskStartStop", }, - { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.psramMallocLevel, "psramMallocLevel", }, - { 0, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.rebootSeconds, "rebootSeconds", }, - { 0, 1, 1, 1, 1, 1, _int, 0, & settings.resetCount, "resetCount", }, + { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.bluetoothInterruptsCore, "bluetoothInterruptsCore", }, + { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.btReadTaskCore, "btReadTaskCore", }, + { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.btReadTaskPriority, "btReadTaskPriority", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableHeapReport, "enableHeapReport", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintIdleTime, "enablePrintIdleTime", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePsram, "enablePsram", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableTaskReports, "enableTaskReports", }, + { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssReadTaskCore, "gnssReadTaskCore", }, + { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssReadTaskPriority, "gnssReadTaskPriority", }, + { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssUartInterruptsCore, "gnssUartInterruptsCore", }, + { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskCore, "handleGnssDataTaskCore", }, + { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskPriority, "handleGnssDataTaskPriority", }, + { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.i2cInterruptsCore, "i2cInterruptsCore", }, + { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.measurementScale, "measurementScale", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.printBootTimes, "printBootTimes", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.printPartitionTable, "printPartitionTable", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.printTaskStartStop, "printTaskStartStop", }, + { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.psramMallocLevel, "psramMallocLevel", }, + { 0, 1, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.rebootSeconds, "rebootSeconds", }, + { 0, 1, 1, 1, 1, 1, 1, _int, 0, & settings.resetCount, "resetCount", }, // Periodic Display - { 0, 1, 1, 1, 1, 1, tPerDisp, 0, & settings.periodicDisplay, "periodicDisplay", }, - { 0, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.periodicDisplayInterval, "periodicDisplayInterval", }, + { 0, 1, 1, 1, 1, 1, 1, tPerDisp, 0, & settings.periodicDisplay, "periodicDisplay", }, + { 0, 1, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.periodicDisplayInterval, "periodicDisplayInterval", }, // Point Perfect - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.autoKeyRenewal, "autoKeyRenewal", }, - { 0, 0, 1, 1, 1, 1, _bool, 0, & settings.debugPpCertificate, "debugPpCertificate", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", }, - { 0, 1, 1, 1, 1, 1, _int, 0, & settings.geographicRegion, "geographicRegion", }, - { 0, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.lastKeyAttempt, "lastKeyAttempt", }, - { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.lbandFixTimeout_seconds, "lbandFixTimeout", }, - { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectBrokerHost), & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", }, - { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectClientID), & settings.pointPerfectClientID, "pointPerfectClientID", }, - { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectCurrentKey), & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", }, - { 0, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", }, - { 0, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", }, - { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectDeviceProfileToken), & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", }, - { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectKeyDistributionTopic), & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", }, - { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectNextKey), & settings.pointPerfectNextKey, "pointPerfectNextKey", }, - { 0, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", }, - { 0, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", }, - { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.pplFixTimeoutS, "pplFixTimeoutS", }, - { 0, 1, 1, 1, 1, 1, tRegCorTp, numRegionalAreas, & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.autoKeyRenewal, "autoKeyRenewal", }, + { 0, 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugPpCertificate, "debugPpCertificate", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", }, + { 0, 1, 1, 1, 1, 1, 1, _int, 0, & settings.geographicRegion, "geographicRegion", }, + { 0, 1, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.lastKeyAttempt, "lastKeyAttempt", }, + { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.lbandFixTimeout_seconds, "lbandFixTimeout", }, + { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectBrokerHost), & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", }, + { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectClientID), & settings.pointPerfectClientID, "pointPerfectClientID", }, + { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectCurrentKey), & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", }, + { 0, 1, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", }, + { 0, 1, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", }, + { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectDeviceProfileToken), & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", }, + { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectKeyDistributionTopic), & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", }, + { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectNextKey), & settings.pointPerfectNextKey, "pointPerfectNextKey", }, + { 0, 1, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", }, + { 0, 1, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", }, + { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.pplFixTimeoutS, "pplFixTimeoutS", }, + { 0, 1, 1, 1, 1, 1, 1, tRegCorTp, numRegionalAreas, & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", }, // Profiles - { 0, 0, 1, 1, 1, 1, tCharArry, sizeof(settings.profileName), & settings.profileName, "profileName", }, + { 0, 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.profileName), & settings.profileName, "profileName", }, -// F +// F +// a +// c +// e +// F t // a -// c -// e T -// G S C t o -// N e m E r -// S t d v V c -// S t s k 2 h Type Qual Variable Name +// c M +// e o T +// G S C t s o +// N e m E a r +// S t d v V i c +// S t s k 2 c h Type Qual Variable Name // Pulse - { 1, 1, 1, 1, 0, 0, _bool, 0, & settings.enableExternalPulse, "enableExternalPulse", }, - { 1, 1, 1, 1, 0, 0, _uint64_t, 0, & settings.externalPulseLength_us, "externalPulseLength", }, - { 1, 1, 1, 1, 0, 0, tPulseEdg, 0, & settings.externalPulsePolarity, "externalPulsePolarity", }, - { 1, 1, 1, 1, 0, 0, _uint64_t, 0, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", }, + { 1, 1, 1, 1, 0, 0, 0, _bool, 0, & settings.enableExternalPulse, "enableExternalPulse", }, + { 1, 1, 1, 1, 0, 0, 0, _uint64_t, 0, & settings.externalPulseLength_us, "externalPulseLength", }, + { 1, 1, 1, 1, 0, 0, 0, tPulseEdg, 0, & settings.externalPulsePolarity, "externalPulsePolarity", }, + { 1, 1, 1, 1, 0, 0, 0, _uint64_t, 0, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", }, // Radio - { 0, 1, 1, 1, 1, 1, tMuxConn, 0, & settings.dataPortChannel, "dataPortChannel", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugGnss, "debugGnss", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintPosition, "enablePrintPosition", }, - { 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.measurementRateMs, "measurementRateMs", }, - { 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.navigationRate, "navigationRate", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.updateGNSSSettings, "updateGNSSSettings", }, + { 0, 1, 1, 1, 1, 1, 1, tMuxConn, 0, & settings.dataPortChannel, "dataPortChannel", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugGnss, "debugGnss", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintPosition, "enablePrintPosition", }, + { 1, 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.measurementRateMs, "measurementRateMs", }, + { 1, 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.navigationRate, "navigationRate", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.updateGNSSSettings, "updateGNSSSettings", }, // Ring Buffer - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", }, - { 0, 1, 1, 1, 1, 1, _int, 0, & settings.gnssHandlerBufferSize, "gnssHandlerBufferSize", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", }, + { 0, 1, 1, 1, 1, 1, 1, _int, 0, & settings.gnssHandlerBufferSize, "gnssHandlerBufferSize", }, // Rover operation - { 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.dynamicModel, "dynamicModel", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRoverAccuracy, "enablePrintRoverAccuracy", }, - { 1, 0, 1, 1, 1, 1, _int16_t, 0, & settings.minCNO, "minCNO", }, - { 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.minElev, "minElev", }, + { 1, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.dynamicModel, "dynamicModel", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRoverAccuracy, "enablePrintRoverAccuracy", }, + { 1, 0, 1, 1, 1, 1, 1, _int16_t, 0, & settings.minCNO, "minCNO", }, + { 1, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.minElev, "minElev", }, // RTC (Real Time Clock) - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRtcSync, "enablePrintRtcSync", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRtcSync, "enablePrintRtcSync", }, -// F +// F +// a +// c +// e +// F t // a -// c -// e T -// G S C t o -// N e m E r -// S t d v V c -// S t s k 2 h Type Qual Variable Name +// c M +// e o T +// G S C t s o +// N e m E a r +// S t d v V i c +// S t s k 2 c h Type Qual Variable Name // SD Card - { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", }, - { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.enablePrintSDBuffers, "enablePrintSDBuffers", }, - { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.enableSD, "enableSD"}, - { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.forceResetOnSDFail, "forceResetOnSDFail", }, + { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", }, + { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.enablePrintSDBuffers, "enablePrintSDBuffers", }, + { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.enableSD, "enableSD"}, + { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.forceResetOnSDFail, "forceResetOnSDFail", }, // Serial - { 1, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.dataPortBaud, "dataPortBaud", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.echoUserInput, "echoUserInput", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", }, - { 1, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.radioPortBaud, "radioPortBaud", }, - { 0, 1, 1, 1, 1, 1, _int16_t, 0, & settings.serialTimeoutGNSS, "serialTimeoutGNSS", }, - -// F + { 1, 1, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.dataPortBaud, "dataPortBaud", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.echoUserInput, "echoUserInput", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", }, + { 1, 1, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.radioPortBaud, "radioPortBaud", }, + { 0, 1, 1, 1, 1, 1, 1, _int16_t, 0, & settings.serialTimeoutGNSS, "serialTimeoutGNSS", }, + +// F +// a +// c +// e +// F t // a -// c -// e T -// G S C t o -// N e m E r -// S t d v V c -// S t s k 2 h Type Qual Variable Name +// c M +// e o T +// G S C t s o +// N e m E a r +// S t d v V i c +// S t s k 2 c h Type Qual Variable Name // Setup Button - { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.disableSetupButton, "disableSetupButton", }, + { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.disableSetupButton, "disableSetupButton", }, // State - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintState, "enablePrintState", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintStates, "enablePrintStates", }, - { 1, 0, 1, 1, 1, 1, tSysState, 0, & settings.lastState, "lastState", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintState, "enablePrintState", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintStates, "enablePrintStates", }, + { 1, 0, 1, 1, 1, 1, 1, tSysState, 0, & settings.lastState, "lastState", }, // TCP Client - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugTcpClient, "debugTcpClient", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableTcpClient, "enableTcpClient", }, - { 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.tcpClientHost), & settings.tcpClientHost, "tcpClientHost", }, - { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.tcpClientPort, "tcpClientPort", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugTcpClient, "debugTcpClient", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableTcpClient, "enableTcpClient", }, + { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.tcpClientHost), & settings.tcpClientHost, "tcpClientHost", }, + { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.tcpClientPort, "tcpClientPort", }, // TCP Server - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugTcpServer, "debugTcpServer", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableTcpServer, "enableTcpServer", }, - { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.tcpServerPort, "tcpServerPort", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugTcpServer, "debugTcpServer", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableTcpServer, "enableTcpServer", }, + { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.tcpServerPort, "tcpServerPort", }, // Time Zone - { 0, 1, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneHours, "timeZoneHours", }, - { 0, 1, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneMinutes, "timeZoneMinutes", }, - { 0, 1, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneSeconds, "timeZoneSeconds", }, - -// F + { 0, 1, 1, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneHours, "timeZoneHours", }, + { 0, 1, 1, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneMinutes, "timeZoneMinutes", }, + { 0, 1, 1, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneSeconds, "timeZoneSeconds", }, + +// F +// a +// c +// e +// F t // a -// c -// e T -// G S C t o -// N e m E r -// S t d v V c -// S t s k 2 h Type Qual Variable Name +// c M +// e o T +// G S C t s o +// N e m E a r +// S t d v V i c +// S t s k 2 c h Type Qual Variable Name // UBX (SX1276) - { 0, 1, 1, 1, 1, 0, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, - { 1, 1, 1, 1, 1, 0, tUbxConst, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "ubxConstellation_", }, - { 1, 0, 1, 1, 1, 0, tUbxMsgRt, MAX_UBX_MSG, & settings.ubxMessageRates[0], "ubxMessageRate_", }, - { 1, 0, 1, 1, 1, 0, tUbMsgRtb, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "ubxMessageRateBase_", }, + { 0, 1, 1, 1, 1, 0, 0, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, + { 1, 1, 1, 1, 1, 0, 0, tUbxConst, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "ubxConstellation_", }, + { 1, 0, 1, 1, 1, 0, 0, tUbxMsgRt, MAX_UBX_MSG, & settings.ubxMessageRates[0], "ubxMessageRate_", }, + { 1, 0, 1, 1, 1, 0, 0, tUbMsgRtb, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "ubxMessageRateBase_", }, // UDP Server - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugUdpServer, "debugUdpServer", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableUdpServer, "enableUdpServer", }, - { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.udpServerPort, "udpServerPort", }, - -// F + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugUdpServer, "debugUdpServer", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableUdpServer, "enableUdpServer", }, + { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.udpServerPort, "udpServerPort", }, + +// F +// a +// c +// e +// F t // a -// c -// e T -// G S C t o -// N e m E r -// S t d v V c -// S t s k 2 h Type Qual Variable Name +// c M +// e o T +// G S C t s o +// N e m E a r +// S t d v V i c +// S t s k 2 c h Type Qual Variable Name // UM980 - { 0, 1, 1, 0, 0, 1, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", }, - { 0, 1, 1, 0, 0, 1, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", }, - { 0, 1, 1, 0, 0, 1, _bool, 0, & settings.enableImuDebug, "enableImuDebug", }, - { 0, 1, 1, 0, 0, 1, _bool, 0, & settings.enableTiltCompensation, "enableTiltCompensation", }, - { 0, 1, 1, 0, 0, 1, _float, 3, & settings.tiltPoleLength, "tiltPoleLength", }, - { 0, 1, 1, 0, 0, 1, tUmConst, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "um980Constellations_", }, - { 0, 0, 1, 0, 0, 1, tUmMRNmea, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", }, - { 0, 0, 1, 0, 0, 1, tUmMRBaRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", }, - { 0, 0, 1, 0, 0, 1, tUmMRRvRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", }, + { 0, 1, 1, 0, 0, 0, 1, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", }, + { 0, 1, 1, 0, 0, 0, 1, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", }, + { 0, 1, 1, 0, 0, 0, 1, _bool, 0, & settings.enableImuDebug, "enableImuDebug", }, + { 0, 1, 1, 0, 0, 0, 1, _bool, 0, & settings.enableTiltCompensation, "enableTiltCompensation", }, + { 0, 1, 1, 0, 0, 0, 1, _float, 3, & settings.tiltPoleLength, "tiltPoleLength", }, + { 0, 1, 1, 0, 0, 0, 1, tUmConst, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "um980Constellations_", }, + { 0, 0, 1, 0, 0, 0, 1, tUmMRNmea, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", }, + { 0, 0, 1, 0, 0, 0, 1, tUmMRBaRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", }, + { 0, 0, 1, 0, 0, 0, 1, tUmMRRvRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", }, // Web Server - { 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.httpPort, "httpPort", }, + { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.httpPort, "httpPort", }, // WiFi - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugWiFiConfig, "debugWiFiConfig", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugWifiState, "debugWifiState", }, - { 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableCaptivePortal, "enableCaptivePortal", }, - { 0, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.wifiChannel, "wifiChannel", }, - { 0, 0, 1, 1, 1, 1, _bool, 0, & settings.wifiConfigOverAP, "wifiConfigOverAP", }, // TODO: check drop downs - { 0, 1, 1, 1, 1, 1, tWiFiNet, MAX_WIFI_NETWORKS, & settings.wifiNetworks, "wifiNetwork_", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugWiFiConfig, "debugWiFiConfig", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugWifiState, "debugWifiState", }, + { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableCaptivePortal, "enableCaptivePortal", }, + { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.wifiChannel, "wifiChannel", }, + { 0, 0, 1, 1, 1, 1, 1, _bool, 0, & settings.wifiConfigOverAP, "wifiConfigOverAP", }, // TODO: check drop downs + { 0, 1, 1, 1, 1, 1, 1, tWiFiNet, MAX_WIFI_NETWORKS, & settings.wifiNetworks, "wifiNetwork_", }, // Add new settings to appropriate group above or create new group // Then also add to the same group in settings above -// F +// F +// a +// c +// e +// F t // a -// c -// e T -// G S C t o -// N e m E r -// S t d v V c -// S t s k 2 h Type Qual Variable Name +// c M +// e o T +// G S C t s o +// N e m E a r +// S t d v V i c +// S t s k 2 c h Type Qual Variable Name /* - { 0, 1, 1, 1, 1, 1, , 0, & settings., ""}, + { 0, 1, 1, 1, 1, 1, 1, , 0, & settings., ""}, */ }; From 773a31e0d5d9dc8bcf3ac862903230c9ecace9ca Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 18 May 2024 19:32:57 -1000 Subject: [PATCH 064/358] Add commandIndex which contains the index into rtkSettingsEntries --- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 12 +- Firmware/RTK_Everywhere/menuCommands.ino | 682 ++++++++++++--------- Firmware/RTK_Everywhere/settings.h | 5 + 3 files changed, 393 insertions(+), 306 deletions(-) diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index 147914d55..639fce38f 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -775,11 +775,15 @@ unsigned long beepCount; // Number of beeps to do unsigned long lastMqttToPpl = 0; unsigned long lastGnssToPpl = 0; + +// Command processing +int commandCount; +int16_t * commandIndex; //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- // Display boot times //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -#define MAX_BOOT_TIME_ENTRIES 39 +#define MAX_BOOT_TIME_ENTRIES 40 uint8_t bootTimeIndex; uint32_t bootTime[MAX_BOOT_TIME_ENTRIES]; const char *bootTimeString[MAX_BOOT_TIME_ENTRIES]; @@ -978,11 +982,15 @@ void setup() DMW_b("identifyBoard"); identifyBoard(); // Determine what hardware platform we are running on. + DMW_b("commandIndexFill"); + if (!commandIndexFill()) // Initialize the command table index + reportFatalError("Failed to allocate and fill the commandIndex!"); + DMW_b("beginBoard"); beginBoard(); // Set all pin numbers and pin initial states DMW_b("beginFS"); - beginFS(); // Load NVM settings + beginFS(); // Start the LittleFS file system in the spiffs partition DMW_b("checkConfigureViaEthernet"); configureViaEthernet = diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 51f3823ff..655953cd8 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -2173,347 +2173,421 @@ bool getSettingValue(const char *settingName, char *settingValueStr) // List available settings, their type in CSV, and value // See issue: https://github.com/sparkfun/SparkFun_RTK_Everywhere_Firmware/issues/190 -void printAvailableSettings() +void commandList(int i) { char settingName[100]; char settingType[100]; char settingValue[100]; - for (int i = 0; i < numRtkSettingsEntries; i++) + switch (rtkSettingsEntries[i].type) { - if (rtkSettingsEntries[i].inCommands) + default: + break; + case _bool: { + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "bool", settingValue); + } + break; + case _int: { + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "int", settingValue); + } + break; + case _float: { + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "float", settingValue); + } + break; + case _double: { + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "double", settingValue); + } + break; + case _uint8_t: { + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint8_t", settingValue); + } + break; + case _uint16_t: { + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint16_t", settingValue); + } + break; + case _uint32_t: { + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint32_t", settingValue); + } + break; + case _uint64_t: { + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint64_t", settingValue); + } + break; + case _int8_t: { + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "int8_t", settingValue); + } + break; + case _int16_t: { + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "int16_t", settingValue); + } + break; + case tMuxConn: { + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "muxConnectionType_e", settingValue); + } + break; + case tSysState: { + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "SystemState", settingValue); + } + break; + case tPulseEdg: { + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "pulseEdgeType_e", settingValue); + } + break; + case tBtRadio: { + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "BluetoothRadioType_e", settingValue); + } + break; + case tPerDisp: { + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "PeriodicDisplay_t", settingValue); + } + break; + case tCoordInp: { + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "CoordinateInputType", settingValue); + } + break; + case tCharArry: { + snprintf(settingType, sizeof(settingType), "char[%d]", rtkSettingsEntries[i].qualifier); + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, settingType, settingValue); + } + break; + case _IPString: { + getSettingValue(rtkSettingsEntries[i].name, settingValue); + commandSendExecuteListResponse(rtkSettingsEntries[i].name, "IPAddress", settingValue); + } + break; + case tUbxMsgRt: { + // Record message settings + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - switch (rtkSettingsEntries[i].type) - { - default: - break; - case _bool: { - getSettingValue(rtkSettingsEntries[i].name, settingValue); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "bool", settingValue); - } - break; - case _int: { - getSettingValue(rtkSettingsEntries[i].name, settingValue); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "int", settingValue); - } - break; - case _float: { - getSettingValue(rtkSettingsEntries[i].name, settingValue); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "float", settingValue); - } - break; - case _double: { - getSettingValue(rtkSettingsEntries[i].name, settingValue); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "double", settingValue); - } - break; - case _uint8_t: { - getSettingValue(rtkSettingsEntries[i].name, settingValue); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint8_t", settingValue); - } - break; - case _uint16_t: { - getSettingValue(rtkSettingsEntries[i].name, settingValue); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint16_t", settingValue); - } - break; - case _uint32_t: { - getSettingValue(rtkSettingsEntries[i].name, settingValue); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint32_t", settingValue); - } - break; - case _uint64_t: { - getSettingValue(rtkSettingsEntries[i].name, settingValue); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "uint64_t", settingValue); - } - break; - case _int8_t: { - getSettingValue(rtkSettingsEntries[i].name, settingValue); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "int8_t", settingValue); - } - break; - case _int16_t: { - getSettingValue(rtkSettingsEntries[i].name, settingValue); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "int16_t", settingValue); - } - break; - case tMuxConn: { - getSettingValue(rtkSettingsEntries[i].name, settingValue); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "muxConnectionType_e", settingValue); - } - break; - case tSysState: { - getSettingValue(rtkSettingsEntries[i].name, settingValue); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "SystemState", settingValue); - } - break; - case tPulseEdg: { - getSettingValue(rtkSettingsEntries[i].name, settingValue); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "pulseEdgeType_e", settingValue); - } - break; - case tBtRadio: { - getSettingValue(rtkSettingsEntries[i].name, settingValue); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "BluetoothRadioType_e", settingValue); - } - break; - case tPerDisp: { - getSettingValue(rtkSettingsEntries[i].name, settingValue); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "PeriodicDisplay_t", settingValue); - } - break; - case tCoordInp: { - getSettingValue(rtkSettingsEntries[i].name, settingValue); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "CoordinateInputType", settingValue); - } - break; - case tCharArry: { - snprintf(settingType, sizeof(settingType), "char[%d]", rtkSettingsEntries[i].qualifier); - getSettingValue(rtkSettingsEntries[i].name, settingValue); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, settingType, settingValue); - } - break; - case _IPString: { - getSettingValue(rtkSettingsEntries[i].name, settingValue); - commandSendExecuteListResponse(rtkSettingsEntries[i].name, "IPAddress", settingValue); - } - break; - case tUbxMsgRt: { - // Record message settings - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, - ubxMessages[x].msgTextName); + snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, + ubxMessages[x].msgTextName); - getSettingValue(settingName, settingValue); - commandSendExecuteListResponse(settingName, "uint8_t", settingValue); - } - } - break; - case tUbxConst: { - // Record constellation settings - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, - settings.ubxConstellations[x].textName); - - getSettingValue(settingName, settingValue); - commandSendExecuteListResponse(settingName, "bool", settingValue); - } - } - break; - case tEspNowPr: { - // Record ESP-Now peer MAC addresses - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - snprintf(settingType, sizeof(settingType), "uint8_t[%d]", sizeof(settings.espnowPeers[0])); - snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, "uint8_t", settingValue); + } + } + break; + case tUbxConst: { + // Record constellation settings + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, + settings.ubxConstellations[x].textName); - getSettingValue(settingName, settingValue); - commandSendExecuteListResponse(settingName, settingType, settingValue); - } - } - break; - case tUbMsgRtb: { - // Record message settings - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, "bool", settingValue); + } + } + break; + case tEspNowPr: { + // Record ESP-Now peer MAC addresses + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + snprintf(settingType, sizeof(settingType), "uint8_t[%d]", sizeof(settings.espnowPeers[0])); + snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, - ubxMessages[firstRTCMRecord + x].msgTextName); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, settingType, settingValue); + } + } + break; + case tUbMsgRtb: { + // Record message settings + int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); - getSettingValue(settingName, settingValue); - commandSendExecuteListResponse(settingName, "uint8_t", settingValue); - } - } - break; - case tWiFiNet: { - // Record WiFi credential table - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.wifiNetworks[0].ssid)); - snprintf(settingName, sizeof(settingName), "%s%dSSID", rtkSettingsEntries[i].name, x); + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, + ubxMessages[firstRTCMRecord + x].msgTextName); - getSettingValue(settingName, settingValue); - commandSendExecuteListResponse(settingName, settingType, settingValue); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, "uint8_t", settingValue); + } + } + break; + case tWiFiNet: { + // Record WiFi credential table + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.wifiNetworks[0].password)); + snprintf(settingName, sizeof(settingName), "%s%dPassword", rtkSettingsEntries[i].name, x); - snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.wifiNetworks[0].password)); - snprintf(settingName, sizeof(settingName), "%s%dPassword", rtkSettingsEntries[i].name, x); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, settingType, settingValue); - getSettingValue(settingName, settingValue); - commandSendExecuteListResponse(settingName, settingType, settingValue); - } - } - break; - case tNSCHost: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.ntripServer_CasterHost[x])); - snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); + snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.wifiNetworks[0].ssid)); + snprintf(settingName, sizeof(settingName), "%s%dSSID", rtkSettingsEntries[i].name, x); - getSettingValue(settingName, settingValue); - commandSendExecuteListResponse(settingName, settingType, settingValue); - } - } - break; - case tNSCPort: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, settingType, settingValue); + } + } + break; + case tNSCHost: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.ntripServer_CasterHost[x])); + snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); - getSettingValue(settingName, settingValue); - commandSendExecuteListResponse(settingName, "uint16_t", settingValue); - } - } - break; - case tNSCUser: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.ntripServer_CasterUser[x])); - snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, settingType, settingValue); + } + } + break; + case tNSCPort: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); - getSettingValue(settingName, settingValue); - commandSendExecuteListResponse(settingName, settingType, settingValue); - } - } - break; - case tNSCUsrPw: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - snprintf(settingType, sizeof(settingType), "char[%d]", - sizeof(settings.ntripServer_CasterUserPW[x])); - snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, "uint16_t", settingValue); + } + } + break; + case tNSCUser: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.ntripServer_CasterUser[x])); + snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); - getSettingValue(settingName, settingValue); - commandSendExecuteListResponse(settingName, settingType, settingValue); - } - } - break; - case tNSMtPt: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.ntripServer_MountPoint[x])); - snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, settingType, settingValue); + } + } + break; + case tNSCUsrPw: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + snprintf(settingType, sizeof(settingType), "char[%d]", + sizeof(settings.ntripServer_CasterUserPW[x])); + snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); - getSettingValue(settingName, settingValue); - commandSendExecuteListResponse(settingName, settingType, settingValue); - } - } - break; - case tNSMtPtPw: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - snprintf(settingType, sizeof(settingType), "char[%d]", - sizeof(settings.ntripServer_MountPointPW[x])); - snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, settingType, settingValue); + } + } + break; + case tNSMtPt: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.ntripServer_MountPoint[x])); + snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); - getSettingValue(settingName, settingValue); - commandSendExecuteListResponse(settingName, settingType, settingValue); - } - } - break; - case tUmMRNmea: { - // Record UM980 NMEA rates - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, - umMessagesNMEA[x].msgTextName); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, settingType, settingValue); + } + } + break; + case tNSMtPtPw: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + snprintf(settingType, sizeof(settingType), "char[%d]", + sizeof(settings.ntripServer_MountPointPW[x])); + snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); - getSettingValue(settingName, settingValue); - commandSendExecuteListResponse(settingName, "float", settingValue); - } - } - break; - case tUmMRRvRT: { - // Record UM980 Rover RTCM rates - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, - umMessagesRTCM[x].msgTextName); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, settingType, settingValue); + } + } + break; + case tUmMRNmea: { + // Record UM980 NMEA rates + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, + umMessagesNMEA[x].msgTextName); - getSettingValue(settingName, settingValue); - commandSendExecuteListResponse(settingName, "float", settingValue); - } - } - break; - case tUmMRBaRT: { - // Record UM980 Base RTCM rates - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, - umMessagesRTCM[x].msgTextName); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, "float", settingValue); + } + } + break; + case tUmMRRvRT: { + // Record UM980 Rover RTCM rates + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, + umMessagesRTCM[x].msgTextName); - getSettingValue(settingName, settingValue); - commandSendExecuteListResponse(settingName, "float", settingValue); - } - } - break; - case tUmConst: { - // Record UM980 Constellations - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, - um980ConstellationCommands[x].textName); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, "float", settingValue); + } + } + break; + case tUmMRBaRT: { + // Record UM980 Base RTCM rates + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, + umMessagesRTCM[x].msgTextName); - getSettingValue(settingName, settingValue); - commandSendExecuteListResponse(settingName, "uint8_t", settingValue); - } - } - break; - case tCorrSPri: { - // Record corrections priorities - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, - correctionsSourceNames[x]); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, "float", settingValue); + } + } + break; + case tUmConst: { + // Record UM980 Constellations + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, + um980ConstellationCommands[x].textName); - getSettingValue(settingName, settingValue); - commandSendExecuteListResponse(settingName, "int", settingValue); - } - } - break; - case tRegCorTp: { - for (int r = 0; r < rtkSettingsEntries[i].qualifier; r++) - { - snprintf(settingType, sizeof(settingType), "char[%d]", - sizeof(settings.regionalCorrectionTopics[0])); - snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, r); + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, "uint8_t", settingValue); + } + } + break; + case tCorrSPri: { + // Record corrections priorities + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, + correctionsSourceNames[x]); - getSettingValue(settingName, settingValue); - commandSendExecuteListResponse(settingName, settingType, settingValue); - } - } - break; - } + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, "int", settingValue); } } + break; + case tRegCorTp: { + for (int r = 0; r < rtkSettingsEntries[i].qualifier; r++) + { + snprintf(settingType, sizeof(settingType), "char[%d]", + sizeof(settings.regionalCorrectionTopics[0])); + snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, r); - // Below are commands formed specifically for the Man-Machine-Interface + getSettingValue(settingName, settingValue); + commandSendExecuteListResponse(settingName, settingType, settingValue); + } + } + break; + } +} - // Device ID - used in PointPerfect - char hardwareID[15]; - snprintf(hardwareID, sizeof(hardwareID), "%02X%02X%02X%02X%02X%02X%02X", btMACAddress[0], btMACAddress[1], - btMACAddress[2], btMACAddress[3], btMACAddress[4], btMACAddress[5], productVariant); +const char * commandGetName(int stringIndex, int rtkIndex) +{ + int number; + static char temp[2][16]; - snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(hardwareID)); - commandSendExecuteListResponse("deviceId", settingType, hardwareID); + // Display the command from rtkSettingsEntries + if (rtkIndex >= 0) + return rtkSettingsEntries[rtkIndex].name; - // Profile Names - used in Profiles - for (int index = 0; index < MAX_PROFILE_COUNT; index++) + // Display the profile name - used in Profiles + else if (rtkIndex >= -MAX_PROFILE_COUNT) { - char settingName[100]; - snprintf(settingName, sizeof(settingName), "profile%dName", index); + number = -rtkIndex - 1; + snprintf(&temp[stringIndex][0], sizeof(temp[0]), "profile%dName", number); + return &temp[stringIndex][0]; + } - char settingType[100]; - snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(profileNames[0])); + // Display the current Profile Number - used in Profiles + else if (rtkIndex == COMMAND_PROFILE_NUMBER) + return "profileNumber"; - commandSendExecuteListResponse(settingName, settingType, profileNames[index]); + // Display the device ID - used in PointPerfect + return "deviceId"; +} + +// Allocate and fill the commandIndex table +bool commandIndexFill() +{ + int i; + int length; + + // Count the commands + commandCount = 0; + for (i = 0; i < numRtkSettingsEntries; i++) + { + commandCount += 1; } + commandCount += COMMAND_UNKNOWN - 1; + + // Allocate the command array + length = commandCount * sizeof(*commandIndex); + commandIndex = (int16_t *)malloc(length); + if (!commandIndex) + { + // Failed to allocate the commandIndex + systemPrintln("ERROR: Failed to allocate commandIndex!"); + return false; + } + + // Initialize commandIndex with index values into rtkSettingsEntries + commandCount = 0; + for (i = 0; i < numRtkSettingsEntries; i++) + commandIndex[commandCount++] = i; + + // Add the man-machine interface commands to the list + for (i = 1; i < COMMAND_UNKNOWN; i++) + commandIndex[commandCount++] = -i; + return true; +} + +// List available settings, their type in CSV, and value +void printAvailableSettings() +{ + // Display the commands + for (int i = 0; i < commandCount; i++) + { + // Display the command from rtkSettingsEntries + if (commandIndex[i] >= 0) + commandList(commandIndex[i]); - // Current Profile Number - used in Profiles - snprintf(settingValue, sizeof(settingValue), "%d", profileNumber); - commandSendExecuteListResponse("profileNumber", "uint8_t", settingValue); + // Below are commands formed specifically for the Man-Machine-Interface + // Display the profile name - used in Profiles + else if (commandIndex[i] >= -MAX_PROFILE_COUNT) + { + int index; + const char * settingName; + char settingType[100]; + settingName = commandGetName(0, commandIndex[i]); + index = -commandIndex[i] - 1; + snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(profileNames[0])); + commandSendExecuteListResponse(settingName, settingType, profileNames[index]); + } + + // Display the current Profile Number - used in Profiles + else if (commandIndex[i] == COMMAND_PROFILE_NUMBER) + { + char settingValue[100]; + + snprintf(settingValue, sizeof(settingValue), "%d", profileNumber); + commandSendExecuteListResponse("profileNumber", "uint8_t", settingValue); + } + + // Display the device ID - used in PointPerfect + else if (commandIndex[i] == COMMAND_DEVICE_ID) + { + char hardwareID[15]; + char settingType[100]; + + snprintf(hardwareID, sizeof(hardwareID), "%02X%02X%02X%02X%02X%02X%02X", btMACAddress[0], btMACAddress[1], + btMACAddress[2], btMACAddress[3], btMACAddress[4], btMACAddress[5], productVariant); + snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(hardwareID)); + commandSendExecuteListResponse("deviceId", settingType, hardwareID); + } + } systemPrintln(); } diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 2753faedf..e1fa8af0a 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1397,6 +1397,11 @@ typedef struct const char *name; } RTK_Settings_Entry; +#define COMMAND_PROFILE_0_INDEX -1 +#define COMMAND_PROFILE_NUMBER (COMMAND_PROFILE_0_INDEX - MAX_PROFILE_COUNT) +#define COMMAND_DEVICE_ID (COMMAND_PROFILE_NUMBER - 1) +#define COMMAND_UNKNOWN (-(COMMAND_DEVICE_ID - 1)) + const RTK_Settings_Entry rtkSettingsEntries[] = { // Note: don't use "_" in the name - "_" is reserved for settings arrays like "ubxMessageRate_" From 4248fd760bf71388838249c0063b6ddf833e5ee8 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Mon, 20 May 2024 10:04:41 -1000 Subject: [PATCH 065/358] Sort the commands alphabetically --- Firmware/RTK_Everywhere/menuCommands.ino | 27 ++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 655953cd8..298c76fb5 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -2513,7 +2513,11 @@ const char * commandGetName(int stringIndex, int rtkIndex) bool commandIndexFill() { int i; + const char * iCommandName; + int j; + const char * jCommandName; int length; + int16_t temp; // Count the commands commandCount = 0; @@ -2541,6 +2545,29 @@ bool commandIndexFill() // Add the man-machine interface commands to the list for (i = 1; i < COMMAND_UNKNOWN; i++) commandIndex[commandCount++] = -i; + + // Sort the commands + for (i = 0; i < commandCount - 1; i++) + { + iCommandName = commandGetName(0, commandIndex[i]); + for (j = i + 1; j < commandCount; j++) + { + jCommandName = commandGetName(1, commandIndex[j]); + + //Determine if the commands are out of order + if (strncasecmp(iCommandName, jCommandName, strlen(iCommandName) + 1) > 0) + { + // Out of order, switch the two entries + temp = commandIndex[i]; + commandIndex[i] = commandIndex[j]; + commandIndex[j] = temp; + + // Get the updated names + iCommandName = commandGetName(0, commandIndex[i]); + jCommandName = commandGetName(1, commandIndex[j]); + } + } + } return true; } From d62340c116105296feb0078d92438ced8bfc5c7a Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sun, 19 May 2024 11:16:52 -1000 Subject: [PATCH 066/358] Use tables to handle unknown variables --- Firmware/RTK_Everywhere/menuCommands.ino | 239 ++++++++--------------- 1 file changed, 80 insertions(+), 159 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 298c76fb5..23d26b1b1 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -267,6 +267,24 @@ bool commandValid(char *commandString) return (true); } +// Check for unknown variables +bool commandCheckForUnknownVariable(const char * settingName, + const char ** entry, + int tableEntries) +{ + const char ** tableEnd; + + // Walk table of unused variables - read to avoid errors + tableEnd = &entry[tableEntries]; + while (entry < tableEnd) + { + // Determine if the settingName is found in the table + if (strcmp(settingName, *entry++) == 0) + return true; + } + return false; +} + // Given a settingName, and string value, update a given setting bool updateSettingWithValue(const char *settingName, const char *settingValueStr) { @@ -921,51 +939,29 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr knownSetting = true; } - // Unused variables - read to avoid errors - else if (strcmp(settingName, "measurementRateSec") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "baseTypeSurveyIn") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "fixedBaseCoordinateTypeGeo") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "saveToArduino") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "enableFactoryDefaults") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "enableFirmwareUpdate") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "enableForgetRadios") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "nicknameECEF") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "nicknameGeodetic") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "fileSelectAll") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "fixedHAEAPC") == 0) + // Unused variables - read to avoid errors + else + { + const char * table[] = { - knownSetting = true; - } + "baseTypeSurveyIn", + "enableFactoryDefaults", + "enableFirmwareUpdate", + "enableForgetRadios", + "fileSelectAll", + "fixedBaseCoordinateTypeGeo", + "fixedHAEAPC", + "measurementRateSec", + "nicknameECEF", + "nicknameGeodetic", + "saveToArduino", + }; + const int tableEntries = sizeof(table) / sizeof(table[0]); + + knownSetting = commandCheckForUnknownVariable(settingName, + table, + tableEntries); + } } // Last catch @@ -2039,127 +2035,52 @@ bool getSettingValue(const char *settingName, char *settingValueStr) knownSetting = true; } - // Unused variables - read to avoid errors - // TODO: check this! Is this really what we want? - else if (strcmp(settingName, "fixedLatText") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "fixedLongText") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "measurementRateHz") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "stationGeodetic") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "minCNO") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "fixedHAEAPC") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "baseTypeFixed") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "fixedBaseCoordinateTypeECEF") == 0) - { - knownSetting = true; - } // Special actions else if (strcmp(settingName, "enableRCFirmware") == 0) { writeToString(settingValueStr, enableRCFirmware); knownSetting = true; } - else if (strcmp(settingName, "firmwareFileName") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "factoryDefaultReset") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "exitAndReset") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "setProfile") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "resetProfile") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "forgetEspNowPeers") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "startNewLog") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "checkNewFirmware") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "getNewFirmware") == 0) - { - knownSetting = true; - } - // Unused variables - read to avoid errors - else if (strcmp(settingName, "measurementRateSec") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "baseTypeSurveyIn") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "fixedBaseCoordinateTypeGeo") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "saveToArduino") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "enableFactoryDefaults") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "enableFirmwareUpdate") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "enableForgetRadios") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "nicknameECEF") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "nicknameGeodetic") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "fileSelectAll") == 0) - { - knownSetting = true; - } - else if (strcmp(settingName, "fixedHAEAPC") == 0) - { - knownSetting = true; - } + // Unused variables - read to avoid errors + // TODO: check this! Is this really what we want? + else + { + const char * table[] = + { + "baseTypeFixed", + "baseTypeSurveyIn", + "checkNewFirmware", + "enableFactoryDefaults", + "enableFirmwareUpdate", + "enableForgetRadios", + "exitAndReset", + "factoryDefaultReset", + "fileSelectAll", + "firmwareFileName", + "fixedBaseCoordinateTypeECEF", + "fixedBaseCoordinateTypeGeo", + "fixedHAEAPC", + "fixedLatText", + "fixedLongText", + "forgetEspNowPeers", + "getNewFirmware", + "measurementRateHz", + "measurementRateSec", + "minCNO", + "nicknameECEF", + "nicknameGeodetic", + "resetProfile", + "saveToArduino", + "setProfile", + "startNewLog", + "stationGeodetic", + }; + const int tableEntries = sizeof(table) / sizeof(table[0]); + + knownSetting = commandCheckForUnknownVariable(settingName, + table, + tableEntries); + } } if (knownSetting == false) From 0b1c253c04d93136f1f4f22c8a73f3765050649f Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sun, 19 May 2024 12:23:00 -1000 Subject: [PATCH 067/358] Use table to handle unknown settings in NVM --- Firmware/RTK_Everywhere/NVM.ino | 44 ++++++++++++++------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/Firmware/RTK_Everywhere/NVM.ino b/Firmware/RTK_Everywhere/NVM.ino index ffe0bd5a7..c143b6885 100644 --- a/Firmware/RTK_Everywhere/NVM.ino +++ b/Firmware/RTK_Everywhere/NVM.ino @@ -869,11 +869,7 @@ bool parseLine(char *str) // log_d("settingName: %s - value: %s - d: %0.9f", settingName, settingString, d); // Exceptions: - // runLogTest not stored in NVM - if (strcmp(settingName, "runLogTest") == 0) - knownSetting = true; - - else if (strcmp(settingName, "sizeOfSettings") == 0) + if (strcmp(settingName, "sizeOfSettings") == 0) { // We may want to cause a factory reset from the settings file rather than the menu // If user sets sizeOfSettings to -1 in config file, RTK device will factory reset @@ -891,27 +887,25 @@ bool parseLine(char *str) knownSetting = true; } - else if (strcmp(settingName, "rtkIdentifier") == 0) - { - knownSetting = true; - } // Do nothing. Just read it to avoid 'Unknown setting' error - else if (strcmp(settingName, "rtkFirmwareVersion") == 0) - { - knownSetting = true; - } // Do nothing. Just read it to avoid 'Unknown setting' error - else if (strcmp(settingName, "gnssFirmwareVersion") == 0) - { - knownSetting = true; - } // Do nothing. Just read it to avoid 'Unknown setting' error - else if (strcmp(settingName, "gnssUniqueId") == 0) - { - knownSetting = true; - } // Do nothing. Just read it to avoid 'Unknown setting' error - else if (strcmp(settingName, "neoFirmwareVersion") == 0) + // Handle unknown settings + // Do nothing. Just read it to avoid 'Unknown setting' error + else { - knownSetting = true; - } // Do nothing. Just read it to avoid 'Unknown setting' error - + const char * table[] = + { + "gnssFirmwareVersion", + "gnssUniqueId", + "neoFirmwareVersion", + "rtkFirmwareVersion", + "rtkIdentifier", + "runLogTest", + }; + const int tableEntries = sizeof(table) / sizeof(table[0]); + + knownSetting = commandCheckForUnknownVariable(settingName, + table, + tableEntries); + } if (knownSetting == false) { From 4102f629c21c16b0cb7fc84334dd445688e4e015 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sun, 19 May 2024 07:12:21 -1000 Subject: [PATCH 068/358] Add useSuffix column to rtkSettingsEntries --- Firmware/RTK_Everywhere/settings.h | 691 +++++++++++++++-------------- 1 file changed, 346 insertions(+), 345 deletions(-) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index e1fa8af0a..7b65620c3 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1387,6 +1387,7 @@ typedef struct bool updateGNSSOnChange; bool inSettingsString; bool inCommands; + bool useSuffix; // Split command at underscore, use suffix in alternate command table bool platEvk; bool platFacetV2; bool platFacetMosaic; @@ -1406,435 +1407,435 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { // Note: don't use "_" in the name - "_" is reserved for settings arrays like "ubxMessageRate_" -// F -// a -// c -// e -// F t -// a -// c M -// e o T -// G S C t s o -// N e m E a r -// S t d v V i c -// S t s k 2 c h Type Qual Variable Name +// F +// a +// u i i c +// p n n u e +// d S C s F t +// a e o e a +// t t m S c M +// e t m u e o T +// G i a f t s o +// N n n f E a r +// S g d i v V i c +// S t s x k 2 c h Type Qual Variable Name // Antenna - { 0, 1, 1, 1, 1, 1, 1, _int16_t, 0, & settings.antennaHeight, "antennaHeight", }, - { 0, 1, 1, 1, 1, 1, 1, _float, 2, & settings.antennaReferencePoint, "antennaReferencePoint" }, - { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableARPLogging, "enableARPLogging", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _int16_t, 0, & settings.antennaHeight, "antennaHeight", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _float, 2, & settings.antennaReferencePoint, "antennaReferencePoint" }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enableARPLogging, "enableARPLogging", }, // Base operation - { 0, 1, 1, 1, 1, 1, 1, tCoordInp, 0, & settings.coordinateInputType, "coordinateInputType", }, - { 1, 1, 1, 1, 1, 1, 1, _double, 4, & settings.fixedAltitude, "fixedAltitude", }, - { 1, 0, 1, 1, 1, 1, 1, _bool, 0, & settings.fixedBase, "fixedBase", }, - { 1, 0, 1, 1, 1, 1, 1, _bool, 0, & settings.fixedBaseCoordinateType, "fixedBaseCoordinateType", }, - { 1, 1, 1, 1, 1, 1, 1, _double, 3, & settings.fixedEcefX, "fixedEcefX", }, - { 1, 1, 1, 1, 1, 1, 1, _double, 3, & settings.fixedEcefY, "fixedEcefY", }, - { 1, 1, 1, 1, 1, 1, 1, _double, 3, & settings.fixedEcefZ, "fixedEcefZ", }, - { 1, 1, 1, 1, 1, 1, 1, _double, 9, & settings.fixedLat, "fixedLat", }, - { 1, 1, 1, 1, 1, 1, 1, _double, 9, & settings.fixedLong, "fixedLong", }, - { 1, 1, 1, 1, 1, 1, 1, _int, 0, & settings.observationSeconds, "observationSeconds", }, - { 1, 1, 1, 1, 1, 1, 1, _float, 2, & settings.observationPositionAccuracy, "observationPositionAccuracy", }, - { 1, 1, 1, 1, 1, 1, 1, _float, 1, & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", }, + { 0, 1, 1, 0, 1, 1, 1, 1, tCoordInp, 0, & settings.coordinateInputType, "coordinateInputType", }, + { 1, 1, 1, 0, 1, 1, 1, 1, _double, 4, & settings.fixedAltitude, "fixedAltitude", }, + { 1, 0, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.fixedBase, "fixedBase", }, + { 1, 0, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.fixedBaseCoordinateType, "fixedBaseCoordinateType", }, + { 1, 1, 1, 0, 1, 1, 1, 1, _double, 3, & settings.fixedEcefX, "fixedEcefX", }, + { 1, 1, 1, 0, 1, 1, 1, 1, _double, 3, & settings.fixedEcefY, "fixedEcefY", }, + { 1, 1, 1, 0, 1, 1, 1, 1, _double, 3, & settings.fixedEcefZ, "fixedEcefZ", }, + { 1, 1, 1, 0, 1, 1, 1, 1, _double, 9, & settings.fixedLat, "fixedLat", }, + { 1, 1, 1, 0, 1, 1, 1, 1, _double, 9, & settings.fixedLong, "fixedLong", }, + { 1, 1, 1, 0, 1, 1, 1, 1, _int, 0, & settings.observationSeconds, "observationSeconds", }, + { 1, 1, 1, 0, 1, 1, 1, 1, _float, 2, & settings.observationPositionAccuracy, "observationPositionAccuracy", }, + { 1, 1, 1, 0, 1, 1, 1, 1, _float, 1, & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", }, // Battery - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", }, - { 0, 1, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", }, - -// F -// a -// c -// e -// F t -// a -// c M -// e o T -// G S C t s o -// N e m E a r -// S t d v V i c -// S t s k 2 c h Type Qual Variable Name + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint32_t, 0, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", }, + +// F +// a +// u i i c +// p n n u e +// d S C s F t +// a e o e a +// t t m S c M +// e t m u e o T +// G i a f t s o +// N n n f E a r +// S g d i v V i c +// S t s x k 2 c h Type Qual Variable Name // Beeper - { 0, 1, 1, 0, 0, 1, 1, _bool, 0, & settings.enableBeeper, "enableBeeper", }, + { 0, 1, 1, 0, 0, 0, 1, 1, _bool, 0, & settings.enableBeeper, "enableBeeper", }, // Bluetooth - { 0, 1, 1, 1, 1, 1, 1, tBtRadio, 0, & settings.bluetoothRadioType, "bluetoothRadioType", }, - { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.sppRxQueueSize, "sppRxQueueSize", }, - { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.sppTxQueueSize, "sppTxQueueSize", }, + { 0, 1, 1, 0, 1, 1, 1, 1, tBtRadio, 0, & settings.bluetoothRadioType, "bluetoothRadioType", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.sppRxQueueSize, "sppRxQueueSize", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.sppTxQueueSize, "sppTxQueueSize", }, // Corrections - { 0, 1, 1, 1, 1, 1, 1, _int, 0, & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", }, - { 0, 1, 1, 1, 1, 1, 1, tCorrSPri, correctionsSource::CORR_NUM, & settings.correctionsSourcesPriority, "correctionsPriority_", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugCorrections, "debugCorrections", }, - -// F -// a -// c -// e -// F t -// a -// c M -// e o T -// G S C t s o -// N e m E a r -// S t d v V i c -// S t s k 2 c h Type Qual Variable Name + { 0, 1, 1, 0, 1, 1, 1, 1, _int, 0, & settings.correctionsSourcesLifetime_s, "correctionsSourcesLifetime", }, + { 0, 1, 1, 1, 1, 1, 1, 1, tCorrSPri, correctionsSource::CORR_NUM, & settings.correctionsSourcesPriority, "correctionsPriority_", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugCorrections, "debugCorrections", }, + +// F +// a +// u i i c +// p n n u e +// d S C s F t +// a e o e a +// t t m S c M +// e t m u e o T +// G i a f t s o +// N n n f E a r +// S g d i v V i c +// S t s x k 2 c h Type Qual Variable Name // Display - { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.enableResetDisplay, "enableResetDisplay", }, + { 0, 1, 1, 0, 1, 1, 1, 0, _bool, 0, & settings.enableResetDisplay, "enableResetDisplay", }, // ESP Now - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugEspNow, "debugEspNow", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableEspNow, "enableEspNow", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.espnowBroadcast, "espnowBroadcast", }, - { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.espnowPeerCount, "espnowPeerCount", }, - { 0, 1, 1, 1, 1, 1, 1, tEspNowPr, ESPNOW_MAX_PEERS, & settings.espnowPeers[0][0], "espnowPeer_", }, - -// F -// a -// c -// e -// F t -// a -// c M -// e o T -// G S C t s o -// N e m E a r -// S t d v V i c -// S t s k 2 c h Type Qual Variable Name + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugEspNow, "debugEspNow", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enableEspNow, "enableEspNow", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.espnowBroadcast, "espnowBroadcast", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint8_t, 0, & settings.espnowPeerCount, "espnowPeerCount", }, + { 0, 1, 1, 1, 1, 1, 1, 1, tEspNowPr, ESPNOW_MAX_PEERS, & settings.espnowPeers[0][0], "espnowPeer_", }, + +// F +// a +// u i i c +// p n n u e +// d S C s F t +// a e o e a +// t t m S c M +// e t m u e o T +// G i a f t s o +// N n n f E a r +// S g d i v V i c +// S t s x k 2 c h Type Qual Variable Name // Ethernet - { 0, 1, 1, 1, 0, 0, 0, _bool, 0, & settings.enablePrintEthernetDiag, "enablePrintEthernetDiag", }, - { 0, 1, 1, 1, 0, 0, 0, _bool, 0, & settings.ethernetDHCP, "ethernetDHCP", }, - { 0, 1, 1, 1, 0, 0, 0, _IPString, 0, & settings.ethernetDNS, "ethernetDNS", }, - { 0, 1, 1, 1, 0, 0, 0, _IPString, 0, & settings.ethernetGateway, "ethernetGateway", }, - { 0, 1, 1, 1, 0, 0, 0, _IPString, 0, & settings.ethernetIP, "ethernetIP", }, - { 0, 1, 1, 1, 0, 0, 0, _IPString, 0, & settings.ethernetSubnet, "ethernetSubnet", }, + { 0, 1, 1, 0, 1, 0, 0, 0, _bool, 0, & settings.enablePrintEthernetDiag, "enablePrintEthernetDiag", }, + { 0, 1, 1, 0, 1, 0, 0, 0, _bool, 0, & settings.ethernetDHCP, "ethernetDHCP", }, + { 0, 1, 1, 0, 1, 0, 0, 0, _IPString, 0, & settings.ethernetDNS, "ethernetDNS", }, + { 0, 1, 1, 0, 1, 0, 0, 0, _IPString, 0, & settings.ethernetGateway, "ethernetGateway", }, + { 0, 1, 1, 0, 1, 0, 0, 0, _IPString, 0, & settings.ethernetIP, "ethernetIP", }, + { 0, 1, 1, 0, 1, 0, 0, 0, _IPString, 0, & settings.ethernetSubnet, "ethernetSubnet", }, // Firmware - { 0, 1, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.autoFirmwareCheckMinutes, "autoFirmwareCheckMinutes", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugFirmwareUpdate, "debugFirmwareUpdate", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableAutoFirmwareUpdate, "enableAutoFirmwareUpdate", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint32_t, 0, & settings.autoFirmwareCheckMinutes, "autoFirmwareCheckMinutes", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugFirmwareUpdate, "debugFirmwareUpdate", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enableAutoFirmwareUpdate, "enableAutoFirmwareUpdate", }, // GNSS UART - { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", }, - { 0, 1, 1, 1, 1, 1, 1, _int, 0, & settings.uartReceiveBufferSize, "uartReceiveBufferSize", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _int, 0, & settings.uartReceiveBufferSize, "uartReceiveBufferSize", }, // Hardware - { 1, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", }, - { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.spiFrequency, "spiFrequency", }, - -// F -// a -// c -// e -// F t -// a -// c M -// e o T -// G S C t s o -// N e m E a r -// S t d v V i c -// S t s k 2 c h Type Qual Variable Name + { 1, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.spiFrequency, "spiFrequency", }, + +// F +// a +// u i i c +// p n n u e +// d S C s F t +// a e o e a +// t t m S c M +// e t m u e o T +// G i a f t s o +// N n n f E a r +// S g d i v V i c +// S t s x k 2 c h Type Qual Variable Name // Log file - { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.enableLogging, "enableLogging", }, - { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.enablePrintLogFileMessages, "enablePrintLogFileMessages", }, - { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.enablePrintLogFileStatus, "enablePrintLogFileStatus", }, - { 0, 1, 1, 1, 1, 1, 0, _int, 0, & settings.maxLogLength_minutes, "maxLogLength", }, - { 0, 1, 1, 1, 1, 1, 0, _int, 0, & settings.maxLogTime_minutes, "maxLogTime"}, - { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.runLogTest, "runLogTest", }, // Not stored in NVM + { 0, 1, 1, 0, 1, 1, 1, 0, _bool, 0, & settings.enableLogging, "enableLogging", }, + { 0, 1, 1, 0, 1, 1, 1, 0, _bool, 0, & settings.enablePrintLogFileMessages, "enablePrintLogFileMessages", }, + { 0, 1, 1, 0, 1, 1, 1, 0, _bool, 0, & settings.enablePrintLogFileStatus, "enablePrintLogFileStatus", }, + { 0, 1, 1, 0, 1, 1, 1, 0, _int, 0, & settings.maxLogLength_minutes, "maxLogLength", }, + { 0, 1, 1, 0, 1, 1, 1, 0, _int, 0, & settings.maxLogTime_minutes, "maxLogTime"}, + { 0, 1, 1, 0, 1, 1, 1, 0, _bool, 0, & settings.runLogTest, "runLogTest", }, // Not stored in NVM // MQTT - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugMqttClientData, "debugMqttClientData", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugMqttClientState, "debugMqttClientState", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugMqttClientData, "debugMqttClientData", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugMqttClientState, "debugMqttClientState", }, // Multicast DNS - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.mdnsEnable, "mdnsEnable", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.mdnsEnable, "mdnsEnable", }, // Network layer - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNetworkLayer, "debugNetworkLayer", }, - { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.defaultNetworkType, "defaultNetworkType", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableNetworkFailover, "enableNetworkFailover", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.printNetworkStatus, "printNetworkStatus", }, - -// F -// a -// c -// e -// F t -// a -// c M -// e o T -// G S C t s o -// N e m E a r -// S t d v V i c -// S t s k 2 c h Type Qual Variable Name + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugNetworkLayer, "debugNetworkLayer", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint8_t, 0, & settings.defaultNetworkType, "defaultNetworkType", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enableNetworkFailover, "enableNetworkFailover", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.printNetworkStatus, "printNetworkStatus", }, + +// F +// a +// u i i c +// p n n u e +// d S C s F t +// a e o e a +// t t m S c M +// e t m u e o T +// G i a f t s o +// N n n f E a r +// S g d i v V i c +// S t s x k 2 c h Type Qual Variable Name // NTP (Ethernet Only) - { 0, 1, 1, 1, 0, 0, 0, _bool, 0, & settings.debugNtp, "debugNtp", }, - { 0, 1, 1, 1, 0, 0, 0, _bool, 0, & settings.enableNTPFile, "enableNTPFile", }, - { 0, 1, 1, 1, 0, 0, 0, _uint16_t, 0, & settings.ethernetNtpPort, "ethernetNtpPort", }, - { 0, 1, 1, 1, 0, 0, 0, _uint8_t, 0, & settings.ntpPollExponent, "ntpPollExponent", }, - { 0, 1, 1, 1, 0, 0, 0, _int8_t, 0, & settings.ntpPrecision, "ntpPrecision", }, - { 0, 1, 1, 1, 0, 0, 0, tCharArry, sizeof(settings.ntpReferenceId), & settings.ntpReferenceId, "ntpReferenceId", }, - { 0, 1, 1, 1, 0, 0, 0, _uint32_t, 0, & settings.ntpRootDelay, "ntpRootDelay", }, - { 0, 1, 1, 1, 0, 0, 0, _uint32_t, 0, & settings.ntpRootDispersion, "ntpRootDispersion", }, + { 0, 1, 1, 0, 1, 0, 0, 0, _bool, 0, & settings.debugNtp, "debugNtp", }, + { 0, 1, 1, 0, 1, 0, 0, 0, _bool, 0, & settings.enableNTPFile, "enableNTPFile", }, + { 0, 1, 1, 0, 1, 0, 0, 0, _uint16_t, 0, & settings.ethernetNtpPort, "ethernetNtpPort", }, + { 0, 1, 1, 0, 1, 0, 0, 0, _uint8_t, 0, & settings.ntpPollExponent, "ntpPollExponent", }, + { 0, 1, 1, 0, 1, 0, 0, 0, _int8_t, 0, & settings.ntpPrecision, "ntpPrecision", }, + { 0, 1, 1, 0, 1, 0, 0, 0, tCharArry, sizeof(settings.ntpReferenceId), & settings.ntpReferenceId, "ntpReferenceId", }, + { 0, 1, 1, 0, 1, 0, 0, 0, _uint32_t, 0, & settings.ntpRootDelay, "ntpRootDelay", }, + { 0, 1, 1, 0, 1, 0, 0, 0, _uint32_t, 0, & settings.ntpRootDispersion, "ntpRootDispersion", }, // NTRIP Client - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNtripClientRtcm, "debugNtripClientRtcm", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNtripClientState, "debugNtripClientState", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableNtripClient, "enableNtripClient", }, - { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterHost), & settings.ntripClient_CasterHost, "ntripClientCasterHost", }, - { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.ntripClient_CasterPort, "ntripClientCasterPort", }, - { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUser), & settings.ntripClient_CasterUser, "ntripClientCasterUser", }, - { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUserPW), & settings.ntripClient_CasterUserPW, "ntripClientCasterUserPW", }, - { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPoint), & settings.ntripClient_MountPoint, "ntripClientMountPoint", }, - { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPointPW), & settings.ntripClient_MountPointPW, "ntripClientMountPointPW", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.ntripClient_TransmitGGA, "ntripClientTransmitGGA", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugNtripClientRtcm, "debugNtripClientRtcm", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugNtripClientState, "debugNtripClientState", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enableNtripClient, "enableNtripClient", }, + { 0, 1, 1, 0, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterHost), & settings.ntripClient_CasterHost, "ntripClientCasterHost", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.ntripClient_CasterPort, "ntripClientCasterPort", }, + { 0, 1, 1, 0, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUser), & settings.ntripClient_CasterUser, "ntripClientCasterUser", }, + { 0, 1, 1, 0, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_CasterUserPW), & settings.ntripClient_CasterUserPW, "ntripClientCasterUserPW", }, + { 0, 1, 1, 0, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPoint), & settings.ntripClient_MountPoint, "ntripClientMountPoint", }, + { 0, 1, 1, 0, 1, 1, 1, 1, tCharArry, sizeof(settings.ntripClient_MountPointPW), & settings.ntripClient_MountPointPW, "ntripClientMountPointPW", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.ntripClient_TransmitGGA, "ntripClientTransmitGGA", }, // NTRIP Server - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNtripServerRtcm, "debugNtripServerRtcm", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugNtripServerState, "debugNtripServerState", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableNtripServer, "enableNtripServer", }, - { 0, 0, 1, 1, 1, 1, 1, _bool, 0, & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", }, - { 0, 1, 1, 1, 1, 1, 1, tNSCHost, NTRIP_SERVER_MAX, & settings.ntripServer_CasterHost[0], "ntripServerCasterHost_", }, - { 0, 1, 1, 1, 1, 1, 1, tNSCPort, NTRIP_SERVER_MAX, & settings.ntripServer_CasterPort[0], "ntripServerCasterPort_", }, - { 0, 1, 1, 1, 1, 1, 1, tNSCUser, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUser[0], "ntripServerCasterUser_", }, - { 0, 1, 1, 1, 1, 1, 1, tNSCUsrPw, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUserPW[0], "ntripServerCasterUserPW_", }, - { 0, 1, 1, 1, 1, 1, 1, tNSMtPt, NTRIP_SERVER_MAX, & settings.ntripServer_MountPoint[0], "ntripServerMountPoint_", }, - { 0, 1, 1, 1, 1, 1, 1, tNSMtPtPw, NTRIP_SERVER_MAX, & settings.ntripServer_MountPointPW[0], "ntripServerMountPointPW_", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugNtripServerRtcm, "debugNtripServerRtcm", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugNtripServerState, "debugNtripServerState", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enableNtripServer, "enableNtripServer", }, + { 0, 0, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enableRtcmMessageChecking, "enableRtcmMessageChecking", }, + { 0, 1, 1, 1, 1, 1, 1, 1, tNSCHost, NTRIP_SERVER_MAX, & settings.ntripServer_CasterHost[0], "ntripServerCasterHost_", }, + { 0, 1, 1, 1, 1, 1, 1, 1, tNSCPort, NTRIP_SERVER_MAX, & settings.ntripServer_CasterPort[0], "ntripServerCasterPort_", }, + { 0, 1, 1, 1, 1, 1, 1, 1, tNSCUser, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUser[0], "ntripServerCasterUser_", }, + { 0, 1, 1, 1, 1, 1, 1, 1, tNSCUsrPw, NTRIP_SERVER_MAX, & settings.ntripServer_CasterUserPW[0], "ntripServerCasterUserPW_", }, + { 0, 1, 1, 1, 1, 1, 1, 1, tNSMtPt, NTRIP_SERVER_MAX, & settings.ntripServer_MountPoint[0], "ntripServerMountPoint_", }, + { 0, 1, 1, 1, 1, 1, 1, 1, tNSMtPtPw, NTRIP_SERVER_MAX, & settings.ntripServer_MountPointPW[0], "ntripServerMountPointPW_", }, // OS - { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.bluetoothInterruptsCore, "bluetoothInterruptsCore", }, - { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.btReadTaskCore, "btReadTaskCore", }, - { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.btReadTaskPriority, "btReadTaskPriority", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableHeapReport, "enableHeapReport", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintIdleTime, "enablePrintIdleTime", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePsram, "enablePsram", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableTaskReports, "enableTaskReports", }, - { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssReadTaskCore, "gnssReadTaskCore", }, - { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssReadTaskPriority, "gnssReadTaskPriority", }, - { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssUartInterruptsCore, "gnssUartInterruptsCore", }, - { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskCore, "handleGnssDataTaskCore", }, - { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskPriority, "handleGnssDataTaskPriority", }, - { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.i2cInterruptsCore, "i2cInterruptsCore", }, - { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.measurementScale, "measurementScale", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.printBootTimes, "printBootTimes", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.printPartitionTable, "printPartitionTable", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.printTaskStartStop, "printTaskStartStop", }, - { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.psramMallocLevel, "psramMallocLevel", }, - { 0, 1, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.rebootSeconds, "rebootSeconds", }, - { 0, 1, 1, 1, 1, 1, 1, _int, 0, & settings.resetCount, "resetCount", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint8_t, 0, & settings.bluetoothInterruptsCore, "bluetoothInterruptsCore", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint8_t, 0, & settings.btReadTaskCore, "btReadTaskCore", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint8_t, 0, & settings.btReadTaskPriority, "btReadTaskPriority", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enableHeapReport, "enableHeapReport", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintIdleTime, "enablePrintIdleTime", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enablePsram, "enablePsram", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enableTaskReports, "enableTaskReports", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssReadTaskCore, "gnssReadTaskCore", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssReadTaskPriority, "gnssReadTaskPriority", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint8_t, 0, & settings.gnssUartInterruptsCore, "gnssUartInterruptsCore", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskCore, "handleGnssDataTaskCore", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint8_t, 0, & settings.handleGnssDataTaskPriority, "handleGnssDataTaskPriority", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint8_t, 0, & settings.i2cInterruptsCore, "i2cInterruptsCore", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint8_t, 0, & settings.measurementScale, "measurementScale", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.printBootTimes, "printBootTimes", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.printPartitionTable, "printPartitionTable", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.printTaskStartStop, "printTaskStartStop", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.psramMallocLevel, "psramMallocLevel", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint32_t, 0, & settings.rebootSeconds, "rebootSeconds", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _int, 0, & settings.resetCount, "resetCount", }, // Periodic Display - { 0, 1, 1, 1, 1, 1, 1, tPerDisp, 0, & settings.periodicDisplay, "periodicDisplay", }, - { 0, 1, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.periodicDisplayInterval, "periodicDisplayInterval", }, + { 0, 1, 1, 0, 1, 1, 1, 1, tPerDisp, 0, & settings.periodicDisplay, "periodicDisplay", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint32_t, 0, & settings.periodicDisplayInterval, "periodicDisplayInterval", }, // Point Perfect - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.autoKeyRenewal, "autoKeyRenewal", }, - { 0, 0, 1, 1, 1, 1, 1, _bool, 0, & settings.debugPpCertificate, "debugPpCertificate", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", }, - { 0, 1, 1, 1, 1, 1, 1, _int, 0, & settings.geographicRegion, "geographicRegion", }, - { 0, 1, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.lastKeyAttempt, "lastKeyAttempt", }, - { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.lbandFixTimeout_seconds, "lbandFixTimeout", }, - { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectBrokerHost), & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", }, - { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectClientID), & settings.pointPerfectClientID, "pointPerfectClientID", }, - { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectCurrentKey), & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", }, - { 0, 1, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", }, - { 0, 1, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", }, - { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectDeviceProfileToken), & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", }, - { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectKeyDistributionTopic), & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", }, - { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectNextKey), & settings.pointPerfectNextKey, "pointPerfectNextKey", }, - { 0, 1, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", }, - { 0, 1, 1, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", }, - { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.pplFixTimeoutS, "pplFixTimeoutS", }, - { 0, 1, 1, 1, 1, 1, 1, tRegCorTp, numRegionalAreas, & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.autoKeyRenewal, "autoKeyRenewal", }, + { 0, 0, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugPpCertificate, "debugPpCertificate", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enablePointPerfectCorrections, "enablePointPerfectCorrections", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _int, 0, & settings.geographicRegion, "geographicRegion", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint64_t, 0, & settings.lastKeyAttempt, "lastKeyAttempt", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.lbandFixTimeout_seconds, "lbandFixTimeout", }, + { 0, 1, 1, 0, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectBrokerHost), & settings.pointPerfectBrokerHost, "pointPerfectBrokerHost", }, + { 0, 1, 1, 0, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectClientID), & settings.pointPerfectClientID, "pointPerfectClientID", }, + { 0, 1, 1, 0, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectCurrentKey), & settings.pointPerfectCurrentKey, "pointPerfectCurrentKey", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyDuration, "pointPerfectCurrentKeyDuration", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectCurrentKeyStart, "pointPerfectCurrentKeyStart", }, + { 0, 1, 1, 0, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectDeviceProfileToken), & settings.pointPerfectDeviceProfileToken, "pointPerfectDeviceProfileToken", }, + { 0, 1, 1, 0, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectKeyDistributionTopic), & settings.pointPerfectKeyDistributionTopic, "pointPerfectKeyDistributionTopic", }, + { 0, 1, 1, 0, 1, 1, 1, 1, tCharArry, sizeof(settings.pointPerfectNextKey), & settings.pointPerfectNextKey, "pointPerfectNextKey", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyDuration, "pointPerfectNextKeyDuration", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint64_t, 0, & settings.pointPerfectNextKeyStart, "pointPerfectNextKeyStart", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.pplFixTimeoutS, "pplFixTimeoutS", }, + { 0, 1, 1, 1, 1, 1, 1, 1, tRegCorTp, numRegionalAreas, & settings.regionalCorrectionTopics, "regionalCorrectionTopics_", }, // Profiles - { 0, 0, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.profileName), & settings.profileName, "profileName", }, - -// F -// a -// c -// e -// F t -// a -// c M -// e o T -// G S C t s o -// N e m E a r -// S t d v V i c -// S t s k 2 c h Type Qual Variable Name + { 0, 0, 1, 0, 1, 1, 1, 1, tCharArry, sizeof(settings.profileName), & settings.profileName, "profileName", }, + +// F +// a +// u i i c +// p n n u e +// d S C s F t +// a e o e a +// t t m S c M +// e t m u e o T +// G i a f t s o +// N n n f E a r +// S g d i v V i c +// S t s x k 2 c h Type Qual Variable Name // Pulse - { 1, 1, 1, 1, 0, 0, 0, _bool, 0, & settings.enableExternalPulse, "enableExternalPulse", }, - { 1, 1, 1, 1, 0, 0, 0, _uint64_t, 0, & settings.externalPulseLength_us, "externalPulseLength", }, - { 1, 1, 1, 1, 0, 0, 0, tPulseEdg, 0, & settings.externalPulsePolarity, "externalPulsePolarity", }, - { 1, 1, 1, 1, 0, 0, 0, _uint64_t, 0, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", }, + { 1, 1, 1, 0, 1, 0, 0, 0, _bool, 0, & settings.enableExternalPulse, "enableExternalPulse", }, + { 1, 1, 1, 0, 1, 0, 0, 0, _uint64_t, 0, & settings.externalPulseLength_us, "externalPulseLength", }, + { 1, 1, 1, 0, 1, 0, 0, 0, tPulseEdg, 0, & settings.externalPulsePolarity, "externalPulsePolarity", }, + { 1, 1, 1, 0, 1, 0, 0, 0, _uint64_t, 0, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", }, // Radio - { 0, 1, 1, 1, 1, 1, 1, tMuxConn, 0, & settings.dataPortChannel, "dataPortChannel", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugGnss, "debugGnss", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintPosition, "enablePrintPosition", }, - { 1, 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.measurementRateMs, "measurementRateMs", }, - { 1, 0, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.navigationRate, "navigationRate", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.updateGNSSSettings, "updateGNSSSettings", }, + { 0, 1, 1, 0, 1, 1, 1, 1, tMuxConn, 0, & settings.dataPortChannel, "dataPortChannel", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugGnss, "debugGnss", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintPosition, "enablePrintPosition", }, + { 1, 0, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.measurementRateMs, "measurementRateMs", }, + { 1, 0, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.navigationRate, "navigationRate", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.updateGNSSSettings, "updateGNSSSettings", }, // Ring Buffer - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", }, - { 0, 1, 1, 1, 1, 1, 1, _int, 0, & settings.gnssHandlerBufferSize, "gnssHandlerBufferSize", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _int, 0, & settings.gnssHandlerBufferSize, "gnssHandlerBufferSize", }, // Rover operation - { 1, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.dynamicModel, "dynamicModel", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRoverAccuracy, "enablePrintRoverAccuracy", }, - { 1, 0, 1, 1, 1, 1, 1, _int16_t, 0, & settings.minCNO, "minCNO", }, - { 1, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.minElev, "minElev", }, + { 1, 1, 1, 0, 1, 1, 1, 1, _uint8_t, 0, & settings.dynamicModel, "dynamicModel", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRoverAccuracy, "enablePrintRoverAccuracy", }, + { 1, 0, 1, 0, 1, 1, 1, 1, _int16_t, 0, & settings.minCNO, "minCNO", }, + { 1, 1, 1, 0, 1, 1, 1, 1, _uint8_t, 0, & settings.minElev, "minElev", }, // RTC (Real Time Clock) - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRtcSync, "enablePrintRtcSync", }, - -// F -// a -// c -// e -// F t -// a -// c M -// e o T -// G S C t s o -// N e m E a r -// S t d v V i c -// S t s k 2 c h Type Qual Variable Name + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRtcSync, "enablePrintRtcSync", }, + +// F +// a +// u i i c +// p n n u e +// d S C s F t +// a e o e a +// t t m S c M +// e t m u e o T +// G i a f t s o +// N n n f E a r +// S g d i v V i c +// S t s x k 2 c h Type Qual Variable Name // SD Card - { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", }, - { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.enablePrintSDBuffers, "enablePrintSDBuffers", }, - { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.enableSD, "enableSD"}, - { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.forceResetOnSDFail, "forceResetOnSDFail", }, + { 0, 1, 1, 0, 1, 1, 1, 0, _bool, 0, & settings.enablePrintBufferOverrun, "enablePrintBufferOverrun", }, + { 0, 1, 1, 0, 1, 1, 1, 0, _bool, 0, & settings.enablePrintSDBuffers, "enablePrintSDBuffers", }, + { 0, 1, 1, 0, 1, 1, 1, 0, _bool, 0, & settings.enableSD, "enableSD"}, + { 0, 1, 1, 0, 1, 1, 1, 0, _bool, 0, & settings.forceResetOnSDFail, "forceResetOnSDFail", }, // Serial - { 1, 1, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.dataPortBaud, "dataPortBaud", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.echoUserInput, "echoUserInput", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", }, - { 1, 1, 1, 1, 1, 1, 1, _uint32_t, 0, & settings.radioPortBaud, "radioPortBaud", }, - { 0, 1, 1, 1, 1, 1, 1, _int16_t, 0, & settings.serialTimeoutGNSS, "serialTimeoutGNSS", }, - -// F -// a -// c -// e -// F t -// a -// c M -// e o T -// G S C t s o -// N e m E a r -// S t d v V i c -// S t s k 2 c h Type Qual Variable Name + { 1, 1, 1, 0, 1, 1, 1, 1, _uint32_t, 0, & settings.dataPortBaud, "dataPortBaud", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.echoUserInput, "echoUserInput", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enableGnssToUsbSerial, "enableGnssToUsbSerial", }, + { 1, 1, 1, 0, 1, 1, 1, 1, _uint32_t, 0, & settings.radioPortBaud, "radioPortBaud", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _int16_t, 0, & settings.serialTimeoutGNSS, "serialTimeoutGNSS", }, + +// F +// a +// u i i c +// p n n u e +// d S C s F t +// a e o e a +// t t m S c M +// e t m u e o T +// G i a f t s o +// N n n f E a r +// S g d i v V i c +// S t s x k 2 c h Type Qual Variable Name // Setup Button - { 0, 1, 1, 1, 1, 1, 0, _bool, 0, & settings.disableSetupButton, "disableSetupButton", }, + { 0, 1, 1, 0, 1, 1, 1, 0, _bool, 0, & settings.disableSetupButton, "disableSetupButton", }, // State - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintState, "enablePrintState", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enablePrintStates, "enablePrintStates", }, - { 1, 0, 1, 1, 1, 1, 1, tSysState, 0, & settings.lastState, "lastState", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintState, "enablePrintState", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintStates, "enablePrintStates", }, + { 1, 0, 1, 0, 1, 1, 1, 1, tSysState, 0, & settings.lastState, "lastState", }, // TCP Client - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugTcpClient, "debugTcpClient", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableTcpClient, "enableTcpClient", }, - { 0, 1, 1, 1, 1, 1, 1, tCharArry, sizeof(settings.tcpClientHost), & settings.tcpClientHost, "tcpClientHost", }, - { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.tcpClientPort, "tcpClientPort", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugTcpClient, "debugTcpClient", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enableTcpClient, "enableTcpClient", }, + { 0, 1, 1, 0, 1, 1, 1, 1, tCharArry, sizeof(settings.tcpClientHost), & settings.tcpClientHost, "tcpClientHost", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.tcpClientPort, "tcpClientPort", }, // TCP Server - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugTcpServer, "debugTcpServer", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableTcpServer, "enableTcpServer", }, - { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.tcpServerPort, "tcpServerPort", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugTcpServer, "debugTcpServer", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enableTcpServer, "enableTcpServer", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.tcpServerPort, "tcpServerPort", }, // Time Zone - { 0, 1, 1, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneHours, "timeZoneHours", }, - { 0, 1, 1, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneMinutes, "timeZoneMinutes", }, - { 0, 1, 1, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneSeconds, "timeZoneSeconds", }, - -// F -// a -// c -// e -// F t -// a -// c M -// e o T -// G S C t s o -// N e m E a r -// S t d v V i c -// S t s k 2 c h Type Qual Variable Name + { 0, 1, 1, 0, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneHours, "timeZoneHours", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneMinutes, "timeZoneMinutes", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _int8_t, 0, & settings.timeZoneSeconds, "timeZoneSeconds", }, + +// F +// a +// u i i c +// p n n u e +// d S C s F t +// a e o e a +// t t m S c M +// e t m u e o T +// G i a f t s o +// N n n f E a r +// S g d i v V i c +// S t s x k 2 c h Type Qual Variable Name // UBX (SX1276) - { 0, 1, 1, 1, 1, 0, 0, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, - { 1, 1, 1, 1, 1, 0, 0, tUbxConst, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "ubxConstellation_", }, - { 1, 0, 1, 1, 1, 0, 0, tUbxMsgRt, MAX_UBX_MSG, & settings.ubxMessageRates[0], "ubxMessageRate_", }, - { 1, 0, 1, 1, 1, 0, 0, tUbMsgRtb, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "ubxMessageRateBase_", }, + { 0, 1, 1, 0, 1, 1, 0, 0, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, + { 1, 1, 1, 1, 1, 1, 0, 0, tUbxConst, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "Constellation_", }, + { 1, 0, 1, 1, 1, 1, 0, 0, tUbxMsgRt, MAX_UBX_MSG, & settings.ubxMessageRates[0], "MessageRate_", }, + { 1, 0, 1, 1, 1, 1, 0, 0, tUbMsgRtb, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "MessageRateBase_", }, // UDP Server - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugUdpServer, "debugUdpServer", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableUdpServer, "enableUdpServer", }, - { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.udpServerPort, "udpServerPort", }, - -// F -// a -// c -// e -// F t -// a -// c M -// e o T -// G S C t s o -// N e m E a r -// S t d v V i c -// S t s k 2 c h Type Qual Variable Name + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugUdpServer, "debugUdpServer", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enableUdpServer, "enableUdpServer", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.udpServerPort, "udpServerPort", }, + +// F +// a +// u i i c +// p n n u e +// d S C s F t +// a e o e a +// t t m S c M +// e t m u e o T +// G i a f t s o +// N n n f E a r +// S g d i v V i c +// S t s x k 2 c h Type Qual Variable Name // UM980 - { 0, 1, 1, 0, 0, 0, 1, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", }, - { 0, 1, 1, 0, 0, 0, 1, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", }, - { 0, 1, 1, 0, 0, 0, 1, _bool, 0, & settings.enableImuDebug, "enableImuDebug", }, - { 0, 1, 1, 0, 0, 0, 1, _bool, 0, & settings.enableTiltCompensation, "enableTiltCompensation", }, - { 0, 1, 1, 0, 0, 0, 1, _float, 3, & settings.tiltPoleLength, "tiltPoleLength", }, - { 0, 1, 1, 0, 0, 0, 1, tUmConst, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "um980Constellations_", }, - { 0, 0, 1, 0, 0, 0, 1, tUmMRNmea, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", }, - { 0, 0, 1, 0, 0, 0, 1, tUmMRBaRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", }, - { 0, 0, 1, 0, 0, 0, 1, tUmMRRvRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", }, + { 0, 1, 1, 0, 0, 0, 0, 1, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", }, + { 0, 1, 1, 0, 0, 0, 0, 1, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", }, + { 0, 1, 1, 0, 0, 0, 0, 1, _bool, 0, & settings.enableImuDebug, "enableImuDebug", }, + { 0, 1, 1, 0, 0, 0, 0, 1, _bool, 0, & settings.enableTiltCompensation, "enableTiltCompensation", }, + { 0, 1, 1, 0, 0, 0, 0, 1, _float, 3, & settings.tiltPoleLength, "tiltPoleLength", }, + { 0, 1, 1, 1, 0, 0, 0, 1, tUmConst, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "um980Constellations_", }, + { 0, 0, 1, 1, 0, 0, 0, 1, tUmMRNmea, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", }, + { 0, 0, 1, 1, 0, 0, 0, 1, tUmMRBaRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", }, + { 0, 0, 1, 1, 0, 0, 0, 1, tUmMRRvRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", }, // Web Server - { 0, 1, 1, 1, 1, 1, 1, _uint16_t, 0, & settings.httpPort, "httpPort", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.httpPort, "httpPort", }, // WiFi - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugWiFiConfig, "debugWiFiConfig", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.debugWifiState, "debugWifiState", }, - { 0, 1, 1, 1, 1, 1, 1, _bool, 0, & settings.enableCaptivePortal, "enableCaptivePortal", }, - { 0, 1, 1, 1, 1, 1, 1, _uint8_t, 0, & settings.wifiChannel, "wifiChannel", }, - { 0, 0, 1, 1, 1, 1, 1, _bool, 0, & settings.wifiConfigOverAP, "wifiConfigOverAP", }, // TODO: check drop downs - { 0, 1, 1, 1, 1, 1, 1, tWiFiNet, MAX_WIFI_NETWORKS, & settings.wifiNetworks, "wifiNetwork_", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugWiFiConfig, "debugWiFiConfig", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugWifiState, "debugWifiState", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enableCaptivePortal, "enableCaptivePortal", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _uint8_t, 0, & settings.wifiChannel, "wifiChannel", }, + { 0, 0, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.wifiConfigOverAP, "wifiConfigOverAP", }, // TODO: check drop downs + { 0, 1, 1, 1, 1, 1, 1, 1, tWiFiNet, MAX_WIFI_NETWORKS, & settings.wifiNetworks, "wifiNetwork_", }, // Add new settings to appropriate group above or create new group // Then also add to the same group in settings above -// F -// a -// c -// e -// F t -// a -// c M -// e o T -// G S C t s o -// N e m E a r -// S t d v V i c -// S t s k 2 c h Type Qual Variable Name +// F +// a +// u i i c +// p n n u e +// d S C s F t +// a e o e a +// t t m S c M +// e t m u e o T +// G i a f t s o +// N n n f E a r +// S g d i v V i c +// S t s x k 2 c h Type Qual Variable Name /* - { 0, 1, 1, 1, 1, 1, 1, , 0, & settings., ""}, + { 0, 1, 1, 0, 1, 1, 1, 1, , 0, & settings., ""}, */ }; From 97b03379c9640eb6a8e07cd31f6a8f2e410d25bd Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sun, 19 May 2024 11:28:32 -1000 Subject: [PATCH 069/358] Add routines to lookup and split a setting name --- Firmware/RTK_Everywhere/menuCommands.ino | 86 ++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 23d26b1b1..2c238894f 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -267,6 +267,92 @@ bool commandValid(char *commandString) return (true); } +// Split a settingName into a truncatedName and a suffix +void commandSplitName(const char * settingName, + char * truncatedName, + int truncatedNameLen, + char * suffix, + int suffixLen) +{ + // The settingName contains an underscore at the split point, search + // for the underscore, the truncatedName is on the left including + // the underscore and the suffix is on the right. + const char *underscore = strstr(settingName, "_"); + if (underscore != nullptr) + { + // Underscore found, so truncate + int length = (underscore - settingName) / sizeof(char); + length++; // Include the underscore + if (length >= truncatedNameLen) + length = truncatedNameLen - 1; + strncpy(truncatedName, settingName, length); + truncatedName[length] = 0; // Manually NULL-terminate because length < strlen(settingName) + strncpy(suffix, &settingName[length], suffixLen - 1); + suffix[suffixLen - 1] = 0; + } + else + { + strncpy(truncatedName, settingName, truncatedNameLen - 1); + suffix[0] = 0; + } +} + +// Lookup up setting name +int commandLookupSettingName(const char * settingName, + char * truncatedName, + int truncatedNameLen, + char * suffix, + int suffixLen) +{ + const char * command; + + // Loop through the valid command entries + for (int i = 0; i < commandCount; i++) + { + // Verify that this command does not get split + if ((commandIndex[i] >= 0) + && (!rtkSettingsEntries[commandIndex[i]].useSuffix)) + { + command = commandGetName(0, commandIndex[i]); + + // For speed, compare the first letter, then the whole string + if ((command[0] == settingName[0]) + && (strcmp(command, settingName) == 0)) + { + return commandIndex[i]; + } + } + } + + // Split a settingName into a truncatedName and a suffix + commandSplitName(settingName, truncatedName, truncatedNameLen, + suffix, suffixLen); + + // Loop through the settings entries + // TODO: make this faster + // E.g. by storing the previous value of i and starting there. + // Most of the time, the match will be i+1. + for (int i = 0; i < commandCount; i++) + { + // Verify that this command gets split + if ((commandIndex[i] >= 0) + && rtkSettingsEntries[commandIndex[i]].useSuffix) + { + command = commandGetName(0, commandIndex[i]); + + // For speed, compare the first letter, then the whole string + if ((command[0] == truncatedName[0]) + && (strcmp(command, truncatedName) == 0)) + { + return commandIndex[i]; + } + } + } + + // Command not found + return COMMAND_UNKNOWN; +} + // Check for unknown variables bool commandCheckForUnknownVariable(const char * settingName, const char ** entry, From 058009a274b4a7564da9bb04b6b61211bb3a4162 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sun, 19 May 2024 11:43:54 -1000 Subject: [PATCH 070/358] Use new routines to only get and save valid platform commands --- Firmware/RTK_Everywhere/menuCommands.ino | 1797 +++++++++++----------- 1 file changed, 884 insertions(+), 913 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 2c238894f..0d2cd4f49 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -374,9 +374,17 @@ bool commandCheckForUnknownVariable(const char * settingName, // Given a settingName, and string value, update a given setting bool updateSettingWithValue(const char *settingName, const char *settingValueStr) { + int i; char *ptr; - double settingValue = strtod(settingValueStr, &ptr); + int qualifier; + double settingValue; + char suffix[51]; + char truncatedName[51]; + RTK_Settings_Types type; + void *var; + // Convert the value from a string into a number + settingValue = strtod(settingValueStr, &ptr); if (strcmp(settingValueStr, "true") == 0) settingValue = 1; if (strcmp(settingValueStr, "false") == 0) @@ -384,646 +392,625 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr bool knownSetting = false; - char truncatedName[51]; - char suffix[51]; - - // The settings name will only include an underscore if it is part of a settings array like "ubxMessageRate_" - // So, here, search for an underscore first and truncate to the underscore if needed - const char *underscore = strstr(settingName, "_"); - if (underscore != nullptr) - { - // Underscore found, so truncate - int length = (underscore - settingName) / sizeof(char); - length++; // Include the underscore - if (length >= sizeof(truncatedName)) - length = sizeof(truncatedName) - 1; - strncpy(truncatedName, settingName, length); - truncatedName[length] = 0; // Manually NULL-terminate because length < strlen(settingName) - strncpy(suffix, &settingName[length], sizeof(suffix) - 1); - } - else - { - strncpy(truncatedName, settingName, sizeof(truncatedName) - 1); - suffix[0] = 0; - } + // Loop through the valid command entries + i = commandLookupSettingName(settingName, truncatedName, sizeof(truncatedName), + suffix, sizeof(suffix)); - // Loop through the settings entries - // TODO: make this faster - // E.g. by storing the previous value of i and starting there. - // Most of the time, the match will be i+1. - for (int i = 0; i < numRtkSettingsEntries; i++) + // Determine if settingName is in the command table + if (i >= 0) { - // For speed, compare the first letter, then the whole string - if ((rtkSettingsEntries[i].name[0] == truncatedName[0]) && - (strcmp(rtkSettingsEntries[i].name, truncatedName) == 0)) + qualifier = rtkSettingsEntries[i].qualifier; + type = rtkSettingsEntries[i].type; + var = rtkSettingsEntries[i].var; + switch (type) { - switch (rtkSettingsEntries[i].type) - { - default: - break; - case _bool: { - bool *ptr = (bool *)rtkSettingsEntries[i].var; - *ptr = (bool)settingValue; - knownSetting = true; - } - break; - case _int: { - int *ptr = (int *)rtkSettingsEntries[i].var; - *ptr = (int)settingValue; - knownSetting = true; - } - break; - case _float: { - float *ptr = (float *)rtkSettingsEntries[i].var; - *ptr = (float)settingValue; - knownSetting = true; - } - break; - case _double: { - double *ptr = (double *)rtkSettingsEntries[i].var; - *ptr = settingValue; - knownSetting = true; - } - break; - case _uint8_t: { - uint8_t *ptr = (uint8_t *)rtkSettingsEntries[i].var; - *ptr = (uint8_t)settingValue; - knownSetting = true; - } - break; - case _uint16_t: { - uint16_t *ptr = (uint16_t *)rtkSettingsEntries[i].var; - *ptr = (uint16_t)settingValue; - knownSetting = true; - } - break; - case _uint32_t: { - uint32_t *ptr = (uint32_t *)rtkSettingsEntries[i].var; - *ptr = (uint32_t)settingValue; - knownSetting = true; - } - break; - case _uint64_t: { - uint64_t *ptr = (uint64_t *)rtkSettingsEntries[i].var; - *ptr = (uint64_t)settingValue; - knownSetting = true; - } - break; - case _int8_t: { - int8_t *ptr = (int8_t *)rtkSettingsEntries[i].var; - *ptr = (int8_t)settingValue; - knownSetting = true; - } - break; - case _int16_t: { - int16_t *ptr = (int16_t *)rtkSettingsEntries[i].var; - *ptr = (int16_t)settingValue; - knownSetting = true; - } - break; - case tMuxConn: { - muxConnectionType_e *ptr = (muxConnectionType_e *)rtkSettingsEntries[i].var; - *ptr = (muxConnectionType_e)settingValue; - knownSetting = true; - } - break; - case tSysState: { - SystemState *ptr = (SystemState *)rtkSettingsEntries[i].var; - *ptr = (SystemState)settingValue; - knownSetting = true; - } + default: break; - case tPulseEdg: { - pulseEdgeType_e *ptr = (pulseEdgeType_e *)rtkSettingsEntries[i].var; - *ptr = (pulseEdgeType_e)settingValue; - knownSetting = true; - } - break; - case tBtRadio: { - BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)rtkSettingsEntries[i].var; - *ptr = (BluetoothRadioType_e)settingValue; - knownSetting = true; - } - break; - case tPerDisp: { - PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)rtkSettingsEntries[i].var; - *ptr = (PeriodicDisplay_t)settingValue; - knownSetting = true; - } - break; - case tCoordInp: { - CoordinateInputType *ptr = (CoordinateInputType *)rtkSettingsEntries[i].var; - *ptr = (CoordinateInputType)settingValue; - knownSetting = true; - } - break; - case tCharArry: { - char *ptr = (char *)rtkSettingsEntries[i].var; - strncpy(ptr, settingValueStr, rtkSettingsEntries[i].qualifier); - // strncpy pads with zeros. No need to add them here for ntpReferenceId - knownSetting = true; - } - break; - case _IPString: { - String tempString = String(settingValueStr); - IPAddress *ptr = (IPAddress *)rtkSettingsEntries[i].var; - ptr->fromString(tempString); - knownSetting = true; - } - break; - case tUbxMsgRt: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == ubxMessages[x].msgTextName[0]) && - (strcmp(suffix, ubxMessages[x].msgTextName) == 0)) - { - settings.ubxMessageRates[x] = (uint8_t)settingValue; - knownSetting = true; - break; - } - } - } - break; - case tUbxConst: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == settings.ubxConstellations[x].textName[0]) && - (strcmp(suffix, settings.ubxConstellations[x].textName) == 0)) - { - settings.ubxConstellations[x].enabled = settingValue; - knownSetting = true; - break; - } - } - } - break; - case tEspNowPr: { - int suffixNum; - if (sscanf(suffix, "%d", &suffixNum) == 1) - { - int mac[6]; - if (sscanf(settingValueStr, "%X:%X:%X:%X:%X:%X", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], - &mac[5]) == 6) - { - for (int i = 0; i < 6; i++) - settings.espnowPeers[suffixNum][i] = mac[i]; - knownSetting = true; - } - } - } - break; - case tUbMsgRtb: { - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + case _bool: { + bool *ptr = (bool *)var; + *ptr = (bool)settingValue; + knownSetting = true; + } + break; + case _int: { + int *ptr = (int *)var; + *ptr = (int)settingValue; + knownSetting = true; + } + break; + case _float: { + float *ptr = (float *)var; + *ptr = (float)settingValue; + knownSetting = true; + } + break; + case _double: { + double *ptr = (double *)var; + *ptr = settingValue; + knownSetting = true; + } + break; + case _uint8_t: { + uint8_t *ptr = (uint8_t *)var; + *ptr = (uint8_t)settingValue; + knownSetting = true; + } + break; + case _uint16_t: { + uint16_t *ptr = (uint16_t *)var; + *ptr = (uint16_t)settingValue; + knownSetting = true; + } + break; + case _uint32_t: { + uint32_t *ptr = (uint32_t *)var; + *ptr = (uint32_t)settingValue; + knownSetting = true; + } + break; + case _uint64_t: { + uint64_t *ptr = (uint64_t *)var; + *ptr = (uint64_t)settingValue; + knownSetting = true; + } + break; + case _int8_t: { + int8_t *ptr = (int8_t *)var; + *ptr = (int8_t)settingValue; + knownSetting = true; + } + break; + case _int16_t: { + int16_t *ptr = (int16_t *)var; + *ptr = (int16_t)settingValue; + knownSetting = true; + } + break; + case tMuxConn: { + muxConnectionType_e *ptr = (muxConnectionType_e *)var; + *ptr = (muxConnectionType_e)settingValue; + knownSetting = true; + } + break; + case tSysState: { + SystemState *ptr = (SystemState *)var; + knownSetting = true; - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == ubxMessages[firstRTCMRecord + x].msgTextName[0]) && - (strcmp(suffix, ubxMessages[firstRTCMRecord + x].msgTextName) == 0)) - { - settings.ubxMessageRatesBase[x] = (uint8_t)settingValue; - knownSetting = true; - break; - } - } + // 0 = Rover, 1 = Base, 2 = NTP + if (settingValue == 2) + { + if (productVariant == RTK_EVK) + settings.lastState = STATE_NTPSERVER_NOT_STARTED; + else + knownSetting = false; } - break; - case tWiFiNet: { - int network; + if (settingValue == 1) + settings.lastState = STATE_BASE_NOT_STARTED; + else + settings.lastState = STATE_ROVER_NOT_STARTED; // Default + } + break; + case tPulseEdg: { + pulseEdgeType_e *ptr = (pulseEdgeType_e *)var; + *ptr = (pulseEdgeType_e)settingValue; + knownSetting = true; + } + break; + case tBtRadio: { + BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)var; + *ptr = (BluetoothRadioType_e)settingValue; + knownSetting = true; + } + break; + case tPerDisp: { + PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)var; + *ptr = (PeriodicDisplay_t)settingValue; + knownSetting = true; + } + break; + case tCoordInp: { + CoordinateInputType *ptr = (CoordinateInputType *)var; + *ptr = (CoordinateInputType)settingValue; + knownSetting = true; + } + break; + case tCharArry: { + char *ptr = (char *)var; + strncpy(ptr, settingValueStr, qualifier); + // strncpy pads with zeros. No need to add them here for ntpReferenceId + knownSetting = true; - if (strstr(suffix, "SSID") != nullptr) - { - if (sscanf(suffix, "%dSSID", &network) == 1) - { - strncpy(settings.wifiNetworks[network].ssid, settingValueStr, - sizeof(settings.wifiNetworks[0].ssid)); - knownSetting = true; - } - } - else if (strstr(suffix, "Password") != nullptr) - { - if (sscanf(suffix, "%dPassword", &network) == 1) - { - strncpy(settings.wifiNetworks[network].password, settingValueStr, - sizeof(settings.wifiNetworks[0].password)); - knownSetting = true; - } - } - } - break; - case tNSCHost: { - int server; - if (sscanf(suffix, "%d", &server) == 1) + // Update the profile name in the file system if necessary + if (strcmp(settingName, "profileName") == 0) + setProfileName(profileNumber); // Copy the current settings.profileName into the array of profile names at + // location profileNumber + } + break; + case _IPString: { + String tempString = String(settingValueStr); + IPAddress *ptr = (IPAddress *)var; + ptr->fromString(tempString); + knownSetting = true; + } + break; + case tUbxMsgRt: { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == ubxMessages[x].msgTextName[0]) && + (strcmp(suffix, ubxMessages[x].msgTextName) == 0)) { - strncpy(&settings.ntripServer_CasterHost[server][0], settingValueStr, - sizeof(settings.ntripServer_CasterHost[server])); + settings.ubxMessageRates[x] = (uint8_t)settingValue; knownSetting = true; + break; } } - break; - case tNSCPort: { - int server; - if (sscanf(suffix, "%d", &server) == 1) + } + break; + case tUbxConst: { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == settings.ubxConstellations[x].textName[0]) && + (strcmp(suffix, settings.ubxConstellations[x].textName) == 0)) { - settings.ntripServer_CasterPort[server] = settingValue; + settings.ubxConstellations[x].enabled = settingValue; knownSetting = true; + break; } } - break; - case tNSCUser: { - int server; - if (sscanf(suffix, "%d", &server) == 1) + } + break; + case tEspNowPr: { + int suffixNum; + if (sscanf(suffix, "%d", &suffixNum) == 1) + { + int mac[6]; + if (sscanf(settingValueStr, "%X:%X:%X:%X:%X:%X", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], + &mac[5]) == 6) { - strncpy(&settings.ntripServer_CasterUser[server][0], settingValueStr, - sizeof(settings.ntripServer_CasterUser[server])); + for (int i = 0; i < 6; i++) + settings.espnowPeers[suffixNum][i] = mac[i]; knownSetting = true; } } - break; - case tNSCUsrPw: { - int server; - if (sscanf(suffix, "%d", &server) == 1) + } + break; + case tUbMsgRtb: { + int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == ubxMessages[firstRTCMRecord + x].msgTextName[0]) && + (strcmp(suffix, ubxMessages[firstRTCMRecord + x].msgTextName) == 0)) { - strncpy(&settings.ntripServer_CasterUserPW[server][0], settingValueStr, - sizeof(settings.ntripServer_CasterUserPW[server])); + settings.ubxMessageRatesBase[x] = (uint8_t)settingValue; knownSetting = true; + break; } } - break; - case tNSMtPt: { - int server; - if (sscanf(suffix, "%d", &server) == 1) + } + break; + case tWiFiNet: { + int network; + + if (strstr(suffix, "SSID") != nullptr) + { + if (sscanf(suffix, "%dSSID", &network) == 1) { - strncpy(&settings.ntripServer_MountPoint[server][0], settingValueStr, - sizeof(settings.ntripServer_MountPoint[server])); + strncpy(settings.wifiNetworks[network].ssid, settingValueStr, + sizeof(settings.wifiNetworks[0].ssid)); knownSetting = true; } } - break; - case tNSMtPtPw: { - int server; - if (sscanf(suffix, "%d", &server) == 1) + else if (strstr(suffix, "Password") != nullptr) + { + if (sscanf(suffix, "%dPassword", &network) == 1) { - strncpy(&settings.ntripServer_MountPointPW[server][0], settingValueStr, - sizeof(settings.ntripServer_MountPointPW[server])); + strncpy(settings.wifiNetworks[network].password, settingValueStr, + sizeof(settings.wifiNetworks[0].password)); knownSetting = true; } } - break; - case tUmMRNmea: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == umMessagesNMEA[x].msgTextName[0]) && - (strcmp(suffix, umMessagesNMEA[x].msgTextName) == 0)) - { - settings.um980MessageRatesNMEA[x] = settingValue; - knownSetting = true; - break; - } - } + } + break; + case tNSCHost: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + strncpy(&settings.ntripServer_CasterHost[server][0], settingValueStr, + sizeof(settings.ntripServer_CasterHost[server])); + knownSetting = true; } - break; - case tUmMRRvRT: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + } + break; + case tNSCPort: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + settings.ntripServer_CasterPort[server] = settingValue; + knownSetting = true; + } + } + break; + case tNSCUser: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + strncpy(&settings.ntripServer_CasterUser[server][0], settingValueStr, + sizeof(settings.ntripServer_CasterUser[server])); + knownSetting = true; + } + } + break; + case tNSCUsrPw: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + strncpy(&settings.ntripServer_CasterUserPW[server][0], settingValueStr, + sizeof(settings.ntripServer_CasterUserPW[server])); + knownSetting = true; + } + } + break; + case tNSMtPt: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + strncpy(&settings.ntripServer_MountPoint[server][0], settingValueStr, + sizeof(settings.ntripServer_MountPoint[server])); + knownSetting = true; + } + } + break; + case tNSMtPtPw: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + strncpy(&settings.ntripServer_MountPointPW[server][0], settingValueStr, + sizeof(settings.ntripServer_MountPointPW[server])); + knownSetting = true; + } + } + break; + case tUmMRNmea: { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == umMessagesNMEA[x].msgTextName[0]) && + (strcmp(suffix, umMessagesNMEA[x].msgTextName) == 0)) { - if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && - (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) - { - settings.um980MessageRatesRTCMRover[x] = settingValue; - knownSetting = true; - break; - } + settings.um980MessageRatesNMEA[x] = settingValue; + knownSetting = true; + break; } } - break; - case tUmMRBaRT: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + } + break; + case tUmMRRvRT: { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && + (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) { - if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && - (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) - { - settings.um980MessageRatesRTCMBase[x] = settingValue; - knownSetting = true; - break; - } + settings.um980MessageRatesRTCMRover[x] = settingValue; + knownSetting = true; + break; } } - break; - case tUmConst: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + } + break; + case tUmMRBaRT: { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && + (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) { - if ((suffix[0] == um980ConstellationCommands[x].textName[0]) && - (strcmp(suffix, um980ConstellationCommands[x].textName) == 0)) - { - settings.um980Constellations[x] = settingValue; - knownSetting = true; - break; - } + settings.um980MessageRatesRTCMBase[x] = settingValue; + knownSetting = true; + break; } } - break; - case tCorrSPri: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + } + break; + case tUmConst: { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == um980ConstellationCommands[x].textName[0]) && + (strcmp(suffix, um980ConstellationCommands[x].textName) == 0)) { - if ((suffix[0] == correctionsSourceNames[x][0]) && (strcmp(suffix, correctionsSourceNames[x]) == 0)) - { - settings.correctionsSourcesPriority[x] = settingValue; - knownSetting = true; - break; - } + settings.um980Constellations[x] = settingValue; + knownSetting = true; + break; } } - break; - case tRegCorTp: { - int region; - if (sscanf(suffix, "%d", ®ion) == 1) + } + break; + case tCorrSPri: { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == correctionsSourceNames[x][0]) && (strcmp(suffix, correctionsSourceNames[x]) == 0)) { - strncpy(&settings.regionalCorrectionTopics[region][0], settingValueStr, - sizeof(settings.regionalCorrectionTopics[0])); + settings.correctionsSourcesPriority[x] = settingValue; knownSetting = true; + break; } } - break; + } + break; + case tRegCorTp: { + int region; + if (sscanf(suffix, "%d", ®ion) == 1) + { + strncpy(&settings.regionalCorrectionTopics[region][0], settingValueStr, + sizeof(settings.regionalCorrectionTopics[0])); + knownSetting = true; } } + break; + } } - if (strcmp(settingName, "profileName") == 0) + // Done when the setting is found + if (knownSetting) + return true; + + if (strcmp(settingName, "fixedLatText") == 0) { - // strcpy(settings.profileName, settingValueStr); - this will have been done by the for loop - setProfileName(profileNumber); // Copy the current settings.profileName into the array of profile names at - // location profileNumber + double newCoordinate = 0.0; + CoordinateInputType newCoordinateInputType = + coordinateIdentifyInputType((char *)settingValueStr, &newCoordinate); + if (newCoordinateInputType == COORDINATE_INPUT_TYPE_INVALID_UNKNOWN) + settings.fixedLat = 0.0; + else + { + settings.fixedLat = newCoordinate; + settings.coordinateInputType = newCoordinateInputType; + } + knownSetting = true; } - else if (strcmp(settingName, "lastState") == 0) + else if (strcmp(settingName, "fixedLongText") == 0) { - // 0 = Rover, 1 = Base, 2 = NTP - settings.lastState = STATE_ROVER_NOT_STARTED; // Default - if (settingValue == 1) - settings.lastState = STATE_BASE_NOT_STARTED; - if (settingValue == 2) - settings.lastState = STATE_NTPSERVER_NOT_STARTED; + double newCoordinate = 0.0; + if (coordinateIdentifyInputType((char *)settingValueStr, &newCoordinate) == + COORDINATE_INPUT_TYPE_INVALID_UNKNOWN) + settings.fixedLong = 0.0; + else + settings.fixedLong = newCoordinate; + knownSetting = true; } - if (knownSetting == false) // Special cases / exceptions + else if (strcmp(settingName, "measurementRateHz") == 0) { - if (strcmp(settingName, "fixedLatText") == 0) - { - double newCoordinate = 0.0; - CoordinateInputType newCoordinateInputType = - coordinateIdentifyInputType((char *)settingValueStr, &newCoordinate); - if (newCoordinateInputType == COORDINATE_INPUT_TYPE_INVALID_UNKNOWN) - settings.fixedLat = 0.0; - else - { - settings.fixedLat = newCoordinate; - settings.coordinateInputType = newCoordinateInputType; - } - knownSetting = true; - } - else if (strcmp(settingName, "fixedLongText") == 0) - { - double newCoordinate = 0.0; - if (coordinateIdentifyInputType((char *)settingValueStr, &newCoordinate) == - COORDINATE_INPUT_TYPE_INVALID_UNKNOWN) - settings.fixedLong = 0.0; - else - settings.fixedLong = newCoordinate; - knownSetting = true; - } - - else if (strcmp(settingName, "measurementRateHz") == 0) - { - gnssSetRate(1.0 / settingValue); + gnssSetRate(1.0 / settingValue); - // This is one of the first settings to be received. If seen, remove the station files. - removeFile(stationCoordinateECEFFileName); - removeFile(stationCoordinateGeodeticFileName); - if (settings.debugWiFiConfig == true) - systemPrintln("Station coordinate files removed"); - knownSetting = true; - } + // This is one of the first settings to be received. If seen, remove the station files. + removeFile(stationCoordinateECEFFileName); + removeFile(stationCoordinateGeodeticFileName); + if (settings.debugWiFiConfig == true) + systemPrintln("Station coordinate files removed"); + knownSetting = true; + } - // navigationRate is calculated using measurementRateHz + // navigationRate is calculated using measurementRateHz - else if (strstr(settingName, "stationECEF") != nullptr) - { - replaceCharacter((char *)settingValueStr, ' ', ','); // Replace all ' ' with ',' before recording to file - recordLineToSD(stationCoordinateECEFFileName, settingValueStr); - recordLineToLFS(stationCoordinateECEFFileName, settingValueStr); - if (settings.debugWiFiConfig == true) - systemPrintf("%s recorded\r\n", settingValueStr); - knownSetting = true; - } - else if (strstr(settingName, "stationGeodetic") != nullptr) - { - replaceCharacter((char *)settingValueStr, ' ', ','); // Replace all ' ' with ',' before recording to file - recordLineToSD(stationCoordinateGeodeticFileName, settingValueStr); - recordLineToLFS(stationCoordinateGeodeticFileName, settingValueStr); - if (settings.debugWiFiConfig == true) - systemPrintf("%s recorded\r\n", settingValueStr); - knownSetting = true; - } - else if (strcmp(settingName, "minCNO") == 0) - { - // Note: this sends the Min CNO to the GNSS, as well as saving it in settings... Is this what we want? TODO - gnssSetMinCno(settingValue); - knownSetting = true; - } - else if (strcmp(settingName, "fixedHAEAPC") == 0) - { - // TODO: check this!! - knownSetting = true; - } - else if (strcmp(settingName, "baseTypeFixed") == 0) - { - settings.fixedBase = ((settingValue == 1) ? true : false); - knownSetting = true; - } - else if (strcmp(settingName, "fixedBaseCoordinateTypeECEF") == 0) - { - settings.fixedBaseCoordinateType = ((settingValue == 1) ? COORD_TYPE_ECEF : COORD_TYPE_GEODETIC); - knownSetting = true; - } + else if (strstr(settingName, "stationECEF") != nullptr) + { + replaceCharacter((char *)settingValueStr, ' ', ','); // Replace all ' ' with ',' before recording to file + recordLineToSD(stationCoordinateECEFFileName, settingValueStr); + recordLineToLFS(stationCoordinateECEFFileName, settingValueStr); + if (settings.debugWiFiConfig == true) + systemPrintf("%s recorded\r\n", settingValueStr); + knownSetting = true; + } + else if (strstr(settingName, "stationGeodetic") != nullptr) + { + replaceCharacter((char *)settingValueStr, ' ', ','); // Replace all ' ' with ',' before recording to file + recordLineToSD(stationCoordinateGeodeticFileName, settingValueStr); + recordLineToLFS(stationCoordinateGeodeticFileName, settingValueStr); + if (settings.debugWiFiConfig == true) + systemPrintf("%s recorded\r\n", settingValueStr); + knownSetting = true; + } + else if (strcmp(settingName, "minCNO") == 0) + { + // Note: this sends the Min CNO to the GNSS, as well as saving it in settings... Is this what we want? TODO + gnssSetMinCno(settingValue); + knownSetting = true; + } + else if (strcmp(settingName, "fixedHAEAPC") == 0) + { + // TODO: check this!! + knownSetting = true; + } + else if (strcmp(settingName, "baseTypeFixed") == 0) + { + settings.fixedBase = ((settingValue == 1) ? true : false); + knownSetting = true; + } + else if (strcmp(settingName, "fixedBaseCoordinateTypeECEF") == 0) + { + settings.fixedBaseCoordinateType = ((settingValue == 1) ? COORD_TYPE_ECEF : COORD_TYPE_GEODETIC); + knownSetting = true; + } - // Special actions - else if (strcmp(settingName, "enableRCFirmware") == 0) - { - enableRCFirmware = settingValue; - knownSetting = true; - } - else if (strcmp(settingName, "firmwareFileName") == 0) - { - mountSDThenUpdate(settingValueStr); + // Special actions + else if (strcmp(settingName, "enableRCFirmware") == 0) + { + enableRCFirmware = settingValue; + knownSetting = true; + } + else if (strcmp(settingName, "firmwareFileName") == 0) + { + mountSDThenUpdate(settingValueStr); - // If update is successful, it will force system reset and not get here. + // If update is successful, it will force system reset and not get here. - if (productVariant == RTK_EVK) - requestChangeState(STATE_BASE_NOT_STARTED); // If update failed, return to Base mode. - else - requestChangeState(STATE_ROVER_NOT_STARTED); // If update failed, return to Rover mode. - knownSetting = true; - } - else if (strcmp(settingName, "factoryDefaultReset") == 0) - { - factoryReset(false); // We do not have the sdSemaphore - knownSetting = true; - } - else if (strcmp(settingName, "exitAndReset") == 0) - { - // Confirm receipt - if (settings.debugWiFiConfig == true) - systemPrintln("Sending reset confirmation"); + if (productVariant == RTK_EVK) + requestChangeState(STATE_BASE_NOT_STARTED); // If update failed, return to Base mode. + else + requestChangeState(STATE_ROVER_NOT_STARTED); // If update failed, return to Rover mode. + knownSetting = true; + } + else if (strcmp(settingName, "factoryDefaultReset") == 0) + { + factoryReset(false); // We do not have the sdSemaphore + knownSetting = true; + } + else if (strcmp(settingName, "exitAndReset") == 0) + { + // Confirm receipt + if (settings.debugWiFiConfig == true) + systemPrintln("Sending reset confirmation"); - sendStringToWebsocket((char *)"confirmReset,1,"); - delay(500); // Allow for delivery + sendStringToWebsocket((char *)"confirmReset,1,"); + delay(500); // Allow for delivery - if (configureViaEthernet) - systemPrintln("Reset after Configure-Via-Ethernet"); - else - systemPrintln("Reset after AP Config"); + if (configureViaEthernet) + systemPrintln("Reset after Configure-Via-Ethernet"); + else + systemPrintln("Reset after AP Config"); - if (configureViaEthernet) - { - ethernetWebServerStopESP32W5500(); + if (configureViaEthernet) + { + ethernetWebServerStopESP32W5500(); - // We need to exit configure-via-ethernet mode. - // But if the settings have not been saved then lastState will still be STATE_CONFIG_VIA_ETH_STARTED. - // If that is true, then force exit to Base mode. I think it is the best we can do. - //(If the settings have been saved, then the code will restart in NTP, Base or Rover mode as desired.) - if (settings.lastState == STATE_CONFIG_VIA_ETH_STARTED) - { - systemPrintln("Settings were not saved. Resetting into Base mode."); - settings.lastState = STATE_BASE_NOT_STARTED; - recordSystemSettings(); - } + // We need to exit configure-via-ethernet mode. + // But if the settings have not been saved then lastState will still be STATE_CONFIG_VIA_ETH_STARTED. + // If that is true, then force exit to Base mode. I think it is the best we can do. + //(If the settings have been saved, then the code will restart in NTP, Base or Rover mode as desired.) + if (settings.lastState == STATE_CONFIG_VIA_ETH_STARTED) + { + systemPrintln("Settings were not saved. Resetting into Base mode."); + settings.lastState = STATE_BASE_NOT_STARTED; + recordSystemSettings(); } - - ESP.restart(); } - else if (strcmp(settingName, "setProfile") == 0) - { - // Change to new profile - if (settings.debugWiFiConfig == true) - systemPrintf("Changing to profile number %d\r\n", settingValue); - changeProfileNumber(settingValue); - // Load new profile into system - loadSettings(); + ESP.restart(); + } + else if (strcmp(settingName, "setProfile") == 0) + { + // Change to new profile + if (settings.debugWiFiConfig == true) + systemPrintf("Changing to profile number %d\r\n", settingValue); + changeProfileNumber(settingValue); - // Send new settings to browser. Re-use settingsCSV to avoid stack. - memset(settingsCSV, 0, AP_CONFIG_SETTING_SIZE); // Clear any garbage from settings array + // Load new profile into system + loadSettings(); - createSettingsString(settingsCSV); + // Send new settings to browser. Re-use settingsCSV to avoid stack. + memset(settingsCSV, 0, AP_CONFIG_SETTING_SIZE); // Clear any garbage from settings array - if (settings.debugWiFiConfig == true) - { - systemPrintf("Sending profile %d\r\n", settingValue); - systemPrintf("Profile contents: %s\r\n", settingsCSV); - } + createSettingsString(settingsCSV); - sendStringToWebsocket(settingsCSV); - knownSetting = true; - } - else if (strcmp(settingName, "resetProfile") == 0) + if (settings.debugWiFiConfig == true) { - settingsToDefaults(); // Overwrite our current settings with defaults + systemPrintf("Sending profile %d\r\n", settingValue); + systemPrintf("Profile contents: %s\r\n", settingsCSV); + } - recordSystemSettings(); // Overwrite profile file and NVM with these settings + sendStringToWebsocket(settingsCSV); + knownSetting = true; + } + else if (strcmp(settingName, "resetProfile") == 0) + { + settingsToDefaults(); // Overwrite our current settings with defaults - // Get bitmask of active profiles - activeProfiles = loadProfileNames(); + recordSystemSettings(); // Overwrite profile file and NVM with these settings - // Send new settings to browser. Re-use settingsCSV to avoid stack. - memset(settingsCSV, 0, AP_CONFIG_SETTING_SIZE); // Clear any garbage from settings array + // Get bitmask of active profiles + activeProfiles = loadProfileNames(); - createSettingsString(settingsCSV); + // Send new settings to browser. Re-use settingsCSV to avoid stack. + memset(settingsCSV, 0, AP_CONFIG_SETTING_SIZE); // Clear any garbage from settings array - if (settings.debugWiFiConfig == true) - { - systemPrintf("Sending reset profile %d\r\n", settingValue); - systemPrintf("Profile contents: %s\r\n", settingsCSV); - } + createSettingsString(settingsCSV); - sendStringToWebsocket(settingsCSV); - knownSetting = true; - } - else if (strcmp(settingName, "forgetEspNowPeers") == 0) + if (settings.debugWiFiConfig == true) { - // Forget all ESP-Now Peers - for (int x = 0; x < settings.espnowPeerCount; x++) - espnowRemovePeer(settings.espnowPeers[x]); - settings.espnowPeerCount = 0; - knownSetting = true; + systemPrintf("Sending reset profile %d\r\n", settingValue); + systemPrintf("Profile contents: %s\r\n", settingsCSV); } - else if (strcmp(settingName, "startNewLog") == 0) + + sendStringToWebsocket(settingsCSV); + knownSetting = true; + } + else if (strcmp(settingName, "forgetEspNowPeers") == 0) + { + // Forget all ESP-Now Peers + for (int x = 0; x < settings.espnowPeerCount; x++) + espnowRemovePeer(settings.espnowPeers[x]); + settings.espnowPeerCount = 0; + knownSetting = true; + } + else if (strcmp(settingName, "startNewLog") == 0) + { + if (settings.enableLogging == true && online.logging == true) { - if (settings.enableLogging == true && online.logging == true) - { - endLogging(false, true); //(gotSemaphore, releaseSemaphore) Close file. Reset parser stats. - beginLogging(); // Create new file based on current RTC. - setLoggingType(); // Determine if we are standard, PPP, or custom. Changes logging icon accordingly. + endLogging(false, true); //(gotSemaphore, releaseSemaphore) Close file. Reset parser stats. + beginLogging(); // Create new file based on current RTC. + setLoggingType(); // Determine if we are standard, PPP, or custom. Changes logging icon accordingly. - char newFileNameCSV[sizeof("logFileName,") + sizeof(logFileName) + 1]; - snprintf(newFileNameCSV, sizeof(newFileNameCSV), "logFileName,%s,", logFileName); + char newFileNameCSV[sizeof("logFileName,") + sizeof(logFileName) + 1]; + snprintf(newFileNameCSV, sizeof(newFileNameCSV), "logFileName,%s,", logFileName); - sendStringToWebsocket(newFileNameCSV); // Tell the config page the name of the file we just created - } - knownSetting = true; + sendStringToWebsocket(newFileNameCSV); // Tell the config page the name of the file we just created } - else if (strcmp(settingName, "checkNewFirmware") == 0) - { - if (settings.debugWiFiConfig == true) - systemPrintln("Checking for new OTA Pull firmware"); + knownSetting = true; + } + else if (strcmp(settingName, "checkNewFirmware") == 0) + { + if (settings.debugWiFiConfig == true) + systemPrintln("Checking for new OTA Pull firmware"); - sendStringToWebsocket((char *)"checkingNewFirmware,1,"); // Tell the config page we received their request + sendStringToWebsocket((char *)"checkingNewFirmware,1,"); // Tell the config page we received their request - char reportedVersion[20]; - char newVersionCSV[100]; + char reportedVersion[20]; + char newVersionCSV[100]; - // Get firmware version from server - // otaCheckVersion will call wifiConnect if needed - if (otaCheckVersion(reportedVersion, sizeof(reportedVersion))) + // Get firmware version from server + // otaCheckVersion will call wifiConnect if needed + if (otaCheckVersion(reportedVersion, sizeof(reportedVersion))) + { + // We got a version number, now determine if it's newer or not + char currentVersion[21]; + getFirmwareVersion(currentVersion, sizeof(currentVersion), enableRCFirmware); + if (isReportedVersionNewer(reportedVersion, currentVersion) == true) { - // We got a version number, now determine if it's newer or not - char currentVersion[21]; - getFirmwareVersion(currentVersion, sizeof(currentVersion), enableRCFirmware); - if (isReportedVersionNewer(reportedVersion, currentVersion) == true) - { - if (settings.debugWiFiConfig == true) - systemPrintln("New version detected"); - snprintf(newVersionCSV, sizeof(newVersionCSV), "newFirmwareVersion,%s,", reportedVersion); - } - else - { - if (settings.debugWiFiConfig == true) - systemPrintln("No new firmware available"); - snprintf(newVersionCSV, sizeof(newVersionCSV), "newFirmwareVersion,CURRENT,"); - } + if (settings.debugWiFiConfig == true) + systemPrintln("New version detected"); + snprintf(newVersionCSV, sizeof(newVersionCSV), "newFirmwareVersion,%s,", reportedVersion); } else { - // Failed to get version number if (settings.debugWiFiConfig == true) - systemPrintln("Sending error to AP config page"); - snprintf(newVersionCSV, sizeof(newVersionCSV), "newFirmwareVersion,ERROR,"); + systemPrintln("No new firmware available"); + snprintf(newVersionCSV, sizeof(newVersionCSV), "newFirmwareVersion,CURRENT,"); } - - sendStringToWebsocket(newVersionCSV); - knownSetting = true; } - else if (strcmp(settingName, "getNewFirmware") == 0) + else { + // Failed to get version number if (settings.debugWiFiConfig == true) - systemPrintln("Getting new OTA Pull firmware"); + systemPrintln("Sending error to AP config page"); + snprintf(newVersionCSV, sizeof(newVersionCSV), "newFirmwareVersion,ERROR,"); + } + + sendStringToWebsocket(newVersionCSV); + knownSetting = true; + } + else if (strcmp(settingName, "getNewFirmware") == 0) + { + if (settings.debugWiFiConfig == true) + systemPrintln("Getting new OTA Pull firmware"); - sendStringToWebsocket((char *)"gettingNewFirmware,1,"); + sendStringToWebsocket((char *)"gettingNewFirmware,1,"); - apConfigFirmwareUpdateInProcess = true; - otaUpdate(); // otaUpdate will call wifiConnect if needed. Also does previouslyConnected check + apConfigFirmwareUpdateInProcess = true; + otaUpdate(); // otaUpdate will call wifiConnect if needed. Also does previouslyConnected check - // We get here if WiFi failed to connect - sendStringToWebsocket((char *)"gettingNewFirmware,ERROR,"); - knownSetting = true; - } + // We get here if WiFi failed to connect + sendStringToWebsocket((char *)"gettingNewFirmware,ERROR,"); + knownSetting = true; + } // Unused variables - read to avoid errors else @@ -1048,7 +1035,6 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr table, tableEntries); } - } // Last catch if (knownSetting == false) @@ -1705,428 +1691,414 @@ void stringRecordN(char *settingsCSV, const char *id, int n, int settingValue) char record[100]; snprintf(record, sizeof(record), "%s_%d,%d,", id, n, settingValue); strcat(settingsCSV, record); -} - -// Add record with string -void stringRecordN(char *settingsCSV, const char *id, int n, char *settingValue) -{ - char record[100]; - snprintf(record, sizeof(record), "%s_%d,%s,", id, n, settingValue); - strcat(settingsCSV, record); -} - -void writeToString(char *settingValueStr, bool value) -{ - sprintf(settingValueStr, "%s", value ? "true" : "false"); -} - -void writeToString(char *settingValueStr, int value) -{ - sprintf(settingValueStr, "%d", value); -} -void writeToString(char *settingValueStr, uint64_t value) -{ - sprintf(settingValueStr, "%" PRIu64, value); -} - -void writeToString(char *settingValueStr, uint32_t value) -{ - sprintf(settingValueStr, "%" PRIu32, value); -} - -void writeToString(char *settingValueStr, double value) -{ - sprintf(settingValueStr, "%f", value); -} -void writeToString(char *settingValueStr, double value, int decimalPoints) -{ - sprintf(settingValueStr, "%0.*f", decimalPoints, value); -} - -void writeToString(char *settingValueStr, char *value) -{ - strcpy(settingValueStr, value); -} - -// Lookup table for a settingName -// Given a settingName, create a string with setting value -// Used in conjunction with the command line interface -// The order of variables matches the order found in settings.h -bool getSettingValue(const char *settingName, char *settingValueStr) -{ - bool knownSetting = false; - - char truncatedName[51]; - char suffix[51]; - - // The settings name will only include an underscore if it is part of a settings array like "ubxMessageRate_" - // So, here, search for an underscore first and truncate to the underscore if needed - const char *underscore = strstr(settingName, "_"); - if (underscore != nullptr) - { - // Underscore found, so truncate - int length = (underscore - settingName) / sizeof(char); - length++; // Include the underscore - if (length >= sizeof(truncatedName)) - length = sizeof(truncatedName) - 1; - strncpy(truncatedName, settingName, length); - truncatedName[length] = 0; // Manually NULL-terminate because length < strlen(settingName) - strncpy(suffix, &settingName[length], sizeof(suffix) - 1); - } - else - { - strncpy(truncatedName, settingName, sizeof(truncatedName) - 1); - suffix[0] = 0; - } - - // Loop through the settings entries - // TODO: make this faster - // E.g. by storing the previous value of i and starting there. - // Most of the time, the match will be i+1. - for (int i = 0; i < numRtkSettingsEntries; i++) - { - // For speed, compare the first letter, then the whole string - if ((rtkSettingsEntries[i].name[0] == truncatedName[0]) && - (strcmp(rtkSettingsEntries[i].name, truncatedName) == 0)) - { - switch (rtkSettingsEntries[i].type) - { - default: - break; - case _bool: { - bool *ptr = (bool *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, *ptr); - knownSetting = true; - } - break; - case _int: { - int *ptr = (int *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, *ptr); - knownSetting = true; - } - break; - case _float: { - float *ptr = (float *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (double)*ptr, rtkSettingsEntries[i].qualifier); - knownSetting = true; - } - break; - case _double: { - double *ptr = (double *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, *ptr, rtkSettingsEntries[i].qualifier); - knownSetting = true; - } - break; - case _uint8_t: { - uint8_t *ptr = (uint8_t *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); - knownSetting = true; - } - break; - case _uint16_t: { - uint16_t *ptr = (uint16_t *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); - knownSetting = true; - } - break; - case _uint32_t: { - uint32_t *ptr = (uint32_t *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, *ptr); - knownSetting = true; - } - break; - case _uint64_t: { - uint64_t *ptr = (uint64_t *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, *ptr); - knownSetting = true; - } - break; - case _int8_t: { - int8_t *ptr = (int8_t *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); - knownSetting = true; - } - break; - case _int16_t: { - int16_t *ptr = (int16_t *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); - knownSetting = true; - } - break; - case tMuxConn: { - muxConnectionType_e *ptr = (muxConnectionType_e *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); - knownSetting = true; - } - break; - case tSysState: { - SystemState *ptr = (SystemState *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); - knownSetting = true; - } - break; - case tPulseEdg: { - pulseEdgeType_e *ptr = (pulseEdgeType_e *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); - knownSetting = true; - } - break; - case tBtRadio: { - BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); - knownSetting = true; - } - break; - case tPerDisp: { - PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); - knownSetting = true; - } - break; - case tCoordInp: { - CoordinateInputType *ptr = (CoordinateInputType *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (int)*ptr); - knownSetting = true; - } - break; - case tCharArry: { - char *ptr = (char *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, ptr); - knownSetting = true; - } - break; - case _IPString: { - IPAddress *ptr = (IPAddress *)rtkSettingsEntries[i].var; - writeToString(settingValueStr, (char *)ptr->toString().c_str()); - knownSetting = true; - } - break; - case tUbxMsgRt: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == ubxMessages[x].msgTextName[0]) && - (strcmp(suffix, ubxMessages[x].msgTextName) == 0)) - { - writeToString(settingValueStr, settings.ubxMessageRates[x]); - knownSetting = true; - break; - } - } - } +} + +// Add record with string +void stringRecordN(char *settingsCSV, const char *id, int n, char *settingValue) +{ + char record[100]; + snprintf(record, sizeof(record), "%s_%d,%s,", id, n, settingValue); + strcat(settingsCSV, record); +} + +void writeToString(char *settingValueStr, bool value) +{ + sprintf(settingValueStr, "%s", value ? "true" : "false"); +} + +void writeToString(char *settingValueStr, int value) +{ + sprintf(settingValueStr, "%d", value); +} +void writeToString(char *settingValueStr, uint64_t value) +{ + sprintf(settingValueStr, "%" PRIu64, value); +} + +void writeToString(char *settingValueStr, uint32_t value) +{ + sprintf(settingValueStr, "%" PRIu32, value); +} + +void writeToString(char *settingValueStr, double value) +{ + sprintf(settingValueStr, "%f", value); +} +void writeToString(char *settingValueStr, double value, int decimalPoints) +{ + sprintf(settingValueStr, "%0.*f", decimalPoints, value); +} + +void writeToString(char *settingValueStr, char *value) +{ + strcpy(settingValueStr, value); +} + +// Lookup table for a settingName +// Given a settingName, create a string with setting value +// Used in conjunction with the command line interface +// The order of variables matches the order found in settings.h +bool getSettingValue(const char *settingName, char *settingValueStr) +{ + int i; + int qualifier; + char suffix[51]; + char truncatedName[51]; + RTK_Settings_Types type; + void *var; + + bool knownSetting = false; + + // Loop through the valid command entries + i = commandLookupSettingName(settingName, truncatedName, sizeof(truncatedName), + suffix, sizeof(suffix)); + + // Determine if settingName is in the command table + if (i >= 0) + { + qualifier = rtkSettingsEntries[i].qualifier; + type = rtkSettingsEntries[i].type; + var = rtkSettingsEntries[i].var; + switch (type) + { + default: break; - case tUbxConst: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + case _bool: { + bool *ptr = (bool *)var; + writeToString(settingValueStr, *ptr); + knownSetting = true; + } + break; + case _int: { + int *ptr = (int *)var; + writeToString(settingValueStr, *ptr); + knownSetting = true; + } + break; + case _float: { + float *ptr = (float *)var; + writeToString(settingValueStr, (double)*ptr, qualifier); + knownSetting = true; + } + break; + case _double: { + double *ptr = (double *)var; + writeToString(settingValueStr, *ptr, qualifier); + knownSetting = true; + } + break; + case _uint8_t: { + uint8_t *ptr = (uint8_t *)var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case _uint16_t: { + uint16_t *ptr = (uint16_t *)var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case _uint32_t: { + uint32_t *ptr = (uint32_t *)var; + writeToString(settingValueStr, *ptr); + knownSetting = true; + } + break; + case _uint64_t: { + uint64_t *ptr = (uint64_t *)var; + writeToString(settingValueStr, *ptr); + knownSetting = true; + } + break; + case _int8_t: { + int8_t *ptr = (int8_t *)var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case _int16_t: { + int16_t *ptr = (int16_t *)var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case tMuxConn: { + muxConnectionType_e *ptr = (muxConnectionType_e *)var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case tSysState: { + SystemState *ptr = (SystemState *)var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case tPulseEdg: { + pulseEdgeType_e *ptr = (pulseEdgeType_e *)var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case tBtRadio: { + BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case tPerDisp: { + PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case tCoordInp: { + CoordinateInputType *ptr = (CoordinateInputType *)var; + writeToString(settingValueStr, (int)*ptr); + knownSetting = true; + } + break; + case tCharArry: { + char *ptr = (char *)var; + writeToString(settingValueStr, ptr); + knownSetting = true; + } + break; + case _IPString: { + IPAddress *ptr = (IPAddress *)var; + writeToString(settingValueStr, (char *)ptr->toString().c_str()); + knownSetting = true; + } + break; + case tUbxMsgRt: { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == ubxMessages[x].msgTextName[0]) && + (strcmp(suffix, ubxMessages[x].msgTextName) == 0)) { - if ((suffix[0] == settings.ubxConstellations[x].textName[0]) && - (strcmp(suffix, settings.ubxConstellations[x].textName) == 0)) - { - writeToString(settingValueStr, settings.ubxConstellations[x].enabled); - knownSetting = true; - break; - } + writeToString(settingValueStr, settings.ubxMessageRates[x]); + knownSetting = true; + break; } } - break; - case tEspNowPr: { - int suffixNum; - if (sscanf(suffix, "%d", &suffixNum) == 1) + } + break; + case tUbxConst: { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == settings.ubxConstellations[x].textName[0]) && + (strcmp(suffix, settings.ubxConstellations[x].textName) == 0)) { - char peer[18]; - snprintf(peer, sizeof(peer), "%X:%X:%X:%X:%X:%X", settings.espnowPeers[suffixNum][0], - settings.espnowPeers[suffixNum][1], settings.espnowPeers[suffixNum][2], - settings.espnowPeers[suffixNum][3], settings.espnowPeers[suffixNum][4], - settings.espnowPeers[suffixNum][5]); - writeToString(settingValueStr, peer); + writeToString(settingValueStr, settings.ubxConstellations[x].enabled); knownSetting = true; + break; } } - break; - case tUbMsgRtb: { - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); - - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == ubxMessages[firstRTCMRecord + x].msgTextName[0]) && - (strcmp(suffix, ubxMessages[firstRTCMRecord + x].msgTextName) == 0)) - { - writeToString(settingValueStr, settings.ubxMessageRatesBase[x]); - knownSetting = true; - break; - } - } + } + break; + case tEspNowPr: { + int suffixNum; + if (sscanf(suffix, "%d", &suffixNum) == 1) + { + char peer[18]; + snprintf(peer, sizeof(peer), "%X:%X:%X:%X:%X:%X", settings.espnowPeers[suffixNum][0], + settings.espnowPeers[suffixNum][1], settings.espnowPeers[suffixNum][2], + settings.espnowPeers[suffixNum][3], settings.espnowPeers[suffixNum][4], + settings.espnowPeers[suffixNum][5]); + writeToString(settingValueStr, peer); + knownSetting = true; } - break; - case tWiFiNet: { - int network; + } + break; + case tUbMsgRtb: { + int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); - if (strstr(suffix, "SSID") != nullptr) - { - if (sscanf(suffix, "%dSSID", &network) == 1) - { - writeToString(settingValueStr, settings.wifiNetworks[network].ssid); - knownSetting = true; - } - } - else if (strstr(suffix, "Password") != nullptr) - { - if (sscanf(suffix, "%dPassword", &network) == 1) - { - writeToString(settingValueStr, settings.wifiNetworks[network].password); - knownSetting = true; - } - } - } - break; - case tNSCHost: { - int server; - if (sscanf(suffix, "%d", &server) == 1) + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == ubxMessages[firstRTCMRecord + x].msgTextName[0]) && + (strcmp(suffix, ubxMessages[firstRTCMRecord + x].msgTextName) == 0)) { - writeToString(settingValueStr, settings.ntripServer_CasterHost[server]); + writeToString(settingValueStr, settings.ubxMessageRatesBase[x]); knownSetting = true; + break; } } - break; - case tNSCPort: { - int server; - if (sscanf(suffix, "%d", &server) == 1) + } + break; + case tWiFiNet: { + int network; + + if (strstr(suffix, "SSID") != nullptr) + { + if (sscanf(suffix, "%dSSID", &network) == 1) { - writeToString(settingValueStr, settings.ntripServer_CasterPort[server]); + writeToString(settingValueStr, settings.wifiNetworks[network].ssid); knownSetting = true; } } - break; - case tNSCUser: { - int server; - if (sscanf(suffix, "%d", &server) == 1) + else if (strstr(suffix, "Password") != nullptr) + { + if (sscanf(suffix, "%dPassword", &network) == 1) { - writeToString(settingValueStr, settings.ntripServer_CasterUser[server]); + writeToString(settingValueStr, settings.wifiNetworks[network].password); knownSetting = true; } } - break; - case tNSCUsrPw: { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - writeToString(settingValueStr, settings.ntripServer_CasterUserPW[server]); - knownSetting = true; - } + } + break; + case tNSCHost: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + writeToString(settingValueStr, settings.ntripServer_CasterHost[server]); + knownSetting = true; } - break; - case tNSMtPt: { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - writeToString(settingValueStr, settings.ntripServer_MountPoint[server]); - knownSetting = true; - } + } + break; + case tNSCPort: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + writeToString(settingValueStr, settings.ntripServer_CasterPort[server]); + knownSetting = true; } - break; - case tNSMtPtPw: { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - writeToString(settingValueStr, settings.ntripServer_MountPointPW[server]); - knownSetting = true; - } + } + break; + case tNSCUser: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + writeToString(settingValueStr, settings.ntripServer_CasterUser[server]); + knownSetting = true; } - break; - case tUmMRNmea: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == umMessagesNMEA[x].msgTextName[0]) && - (strcmp(suffix, umMessagesNMEA[x].msgTextName) == 0)) - { - writeToString(settingValueStr, settings.um980MessageRatesNMEA[x]); - knownSetting = true; - break; - } - } + } + break; + case tNSCUsrPw: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + writeToString(settingValueStr, settings.ntripServer_CasterUserPW[server]); + knownSetting = true; } - break; - case tUmMRRvRT: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + } + break; + case tNSMtPt: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + writeToString(settingValueStr, settings.ntripServer_MountPoint[server]); + knownSetting = true; + } + } + break; + case tNSMtPtPw: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + writeToString(settingValueStr, settings.ntripServer_MountPointPW[server]); + knownSetting = true; + } + } + break; + case tUmMRNmea: { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == umMessagesNMEA[x].msgTextName[0]) && + (strcmp(suffix, umMessagesNMEA[x].msgTextName) == 0)) { - if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && - (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) - { - writeToString(settingValueStr, settings.um980MessageRatesRTCMRover[x]); - knownSetting = true; - break; - } + writeToString(settingValueStr, settings.um980MessageRatesNMEA[x]); + knownSetting = true; + break; } } - break; - case tUmMRBaRT: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + } + break; + case tUmMRRvRT: { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && + (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) { - if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && - (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) - { - writeToString(settingValueStr, settings.um980MessageRatesRTCMBase[x]); - knownSetting = true; - break; - } + writeToString(settingValueStr, settings.um980MessageRatesRTCMRover[x]); + knownSetting = true; + break; } } - break; - case tUmConst: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + } + break; + case tUmMRBaRT: { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && + (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) { - if ((suffix[0] == um980ConstellationCommands[x].textName[0]) && - (strcmp(suffix, um980ConstellationCommands[x].textName) == 0)) - { - writeToString(settingValueStr, settings.um980Constellations[x]); - knownSetting = true; - break; - } + writeToString(settingValueStr, settings.um980MessageRatesRTCMBase[x]); + knownSetting = true; + break; } } - break; - case tCorrSPri: { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + } + break; + case tUmConst: { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == um980ConstellationCommands[x].textName[0]) && + (strcmp(suffix, um980ConstellationCommands[x].textName) == 0)) { - if ((suffix[0] == correctionsSourceNames[x][0]) && (strcmp(suffix, correctionsSourceNames[x]) == 0)) - { - writeToString(settingValueStr, settings.correctionsSourcesPriority[x]); - knownSetting = true; - break; - } + writeToString(settingValueStr, settings.um980Constellations[x]); + knownSetting = true; + break; } } - break; - case tRegCorTp: { - int region; - if (sscanf(suffix, "%d", ®ion) == 1) + } + break; + case tCorrSPri: { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == correctionsSourceNames[x][0]) && (strcmp(suffix, correctionsSourceNames[x]) == 0)) { - writeToString(settingValueStr, settings.regionalCorrectionTopics[region]); + writeToString(settingValueStr, settings.correctionsSourcesPriority[x]); knownSetting = true; + break; } } - break; + } + break; + case tRegCorTp: { + int region; + if (sscanf(suffix, "%d", ®ion) == 1) + { + writeToString(settingValueStr, settings.regionalCorrectionTopics[region]); + knownSetting = true; } } + break; + } } - if (knownSetting == false) + // Done if the settingName was found + if (knownSetting) + return true; + + // Report deviceID over CLI - Useful for label generation + if (strcmp(settingName, "deviceId") == 0) { - // Report deviceID over CLI - Useful for label generation - if (strcmp(settingName, "deviceId") == 0) - { - char hardwareID[15]; - snprintf(hardwareID, sizeof(hardwareID), "%02X%02X%02X%02X%02X%02X%02X", btMACAddress[0], btMACAddress[1], - btMACAddress[2], btMACAddress[3], btMACAddress[4], btMACAddress[5], productVariant); + char hardwareID[15]; + snprintf(hardwareID, sizeof(hardwareID), "%02X%02X%02X%02X%02X%02X%02X", btMACAddress[0], btMACAddress[1], + btMACAddress[2], btMACAddress[3], btMACAddress[4], btMACAddress[5], productVariant); - writeToString(settingValueStr, hardwareID); - knownSetting = true; - } + writeToString(settingValueStr, hardwareID); + knownSetting = true; + } + + // Special actions + else if (strcmp(settingName, "enableRCFirmware") == 0) + { + writeToString(settingValueStr, enableRCFirmware); + knownSetting = true; + } - // Special actions - else if (strcmp(settingName, "enableRCFirmware") == 0) - { - writeToString(settingValueStr, enableRCFirmware); - knownSetting = true; - } // Unused variables - read to avoid errors // TODO: check this! Is this really what we want? else @@ -2167,7 +2139,6 @@ bool getSettingValue(const char *settingName, char *settingValueStr) table, tableEntries); } - } if (knownSetting == false) { From a2a2ba67a498ec1ab6693f5eafbadce6b976833f Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sun, 19 May 2024 12:46:10 -1000 Subject: [PATCH 071/358] Only load valid commands from the file in the NVM --- Firmware/RTK_Everywhere/NVM.ino | 667 ++++++++++++++++---------------- 1 file changed, 327 insertions(+), 340 deletions(-) diff --git a/Firmware/RTK_Everywhere/NVM.ino b/Firmware/RTK_Everywhere/NVM.ino index c143b6885..8a069ad42 100644 --- a/Firmware/RTK_Everywhere/NVM.ino +++ b/Firmware/RTK_Everywhere/NVM.ino @@ -909,390 +909,377 @@ bool parseLine(char *str) if (knownSetting == false) { - char truncatedName[51]; + int i; + char *ptr; + int qualifier; char suffix[51]; + char truncatedName[51]; + RTK_Settings_Types type; + void *var; - // The settings name will only include an underscore if it is part of a settings array like "ubxMessageRate_" - // So, here, search for an underscore first and truncate to the underscore if needed - const char *underscore = strstr(settingName, "_"); - if (underscore != nullptr) - { - // Underscore found, so truncate - int length = (underscore - settingName) / sizeof(char); - length++; // Include the underscore - if (length >= sizeof(truncatedName)) - length = sizeof(truncatedName) - 1; - strncpy(truncatedName, settingName, length); - truncatedName[length] = 0; // Manually NULL-terminate because length < strlen(settingName) - strncpy(suffix, &settingName[length], sizeof(suffix) - 1); - } - else - { - strncpy(truncatedName, settingName, sizeof(truncatedName) - 1); - suffix[0] = 0; - } + double settingValue; + + // Loop through the valid command entries + i = commandLookupSettingName(settingName, + truncatedName, sizeof(truncatedName), + suffix, sizeof(suffix)); - // Loop through the settings entries - // TODO: make this faster - // E.g. by storing the previous value of i and starting there. - // Most of the time, the match will be i+1. - for (int i = 0; i < numRtkSettingsEntries; i++) + // Determine if settingName is in the command table + if (i >= 0) { - // For speed, compare the first letter, then the whole string - if ((rtkSettingsEntries[i].name[0] == truncatedName[0]) && (strcmp(rtkSettingsEntries[i].name, truncatedName) == 0)) + qualifier = rtkSettingsEntries[i].qualifier; + type = rtkSettingsEntries[i].type; + updateGNSS |= rtkSettingsEntries[i].updateGNSSOnChange; // Does this setting require a GNSS update? + var = rtkSettingsEntries[i].var; + switch (type) { - updateGNSS |= rtkSettingsEntries[i].updateGNSSOnChange; // Does this setting require a GNSS update? - switch (rtkSettingsEntries[i].type) + default: + break; + case _bool: { - default: - break; - case _bool: - { - bool *ptr = (bool *)rtkSettingsEntries[i].var; - *ptr = (bool)d; - knownSetting = true; - } - break; - case _int: - { - int *ptr = (int *)rtkSettingsEntries[i].var; - *ptr = (int)d; - knownSetting = true; - } - break; - case _float: - { - float *ptr = (float *)rtkSettingsEntries[i].var; - *ptr = (float)d; - knownSetting = true; - } - break; - case _double: - { - double *ptr = (double *)rtkSettingsEntries[i].var; - *ptr = d; - knownSetting = true; - } - break; - case _uint8_t: - { - uint8_t *ptr = (uint8_t *)rtkSettingsEntries[i].var; - *ptr = (uint8_t)d; - knownSetting = true; - } - break; - case _uint16_t: - { - uint16_t *ptr = (uint16_t *)rtkSettingsEntries[i].var; - *ptr = (uint16_t)d; - knownSetting = true; - } - break; - case _uint32_t: - { - uint32_t *ptr = (uint32_t *)rtkSettingsEntries[i].var; - *ptr = (uint32_t)d; - knownSetting = true; - } - break; - case _uint64_t: + bool *ptr = (bool *)var; + *ptr = (bool)d; + knownSetting = true; + } + break; + case _int: + { + int *ptr = (int *)var; + *ptr = (int)d; + knownSetting = true; + } + break; + case _float: + { + float *ptr = (float *)var; + *ptr = (float)d; + knownSetting = true; + } + break; + case _double: + { + double *ptr = (double *)var; + *ptr = d; + knownSetting = true; + } + break; + case _uint8_t: + { + uint8_t *ptr = (uint8_t *)var; + *ptr = (uint8_t)d; + knownSetting = true; + } + break; + case _uint16_t: + { + uint16_t *ptr = (uint16_t *)var; + *ptr = (uint16_t)d; + knownSetting = true; + } + break; + case _uint32_t: + { + uint32_t *ptr = (uint32_t *)var; + *ptr = (uint32_t)d; + knownSetting = true; + } + break; + case _uint64_t: + { + uint64_t *ptr = (uint64_t *)var; + *ptr = (uint64_t)d; + knownSetting = true; + } + break; + case _int8_t: + { + int8_t *ptr = (int8_t *)var; + *ptr = (int8_t)d; + knownSetting = true; + } + break; + case _int16_t: + { + int16_t *ptr = (int16_t *)var; + *ptr = (int16_t)d; + knownSetting = true; + } + break; + case tMuxConn: + { + muxConnectionType_e *ptr = (muxConnectionType_e *)var; + *ptr = (muxConnectionType_e)d; + knownSetting = true; + } + break; + case tSysState: + { + SystemState *ptr = (SystemState *)var; + *ptr = (SystemState)d; + knownSetting = true; + } + break; + case tPulseEdg: + { + pulseEdgeType_e *ptr = (pulseEdgeType_e *)var; + *ptr = (pulseEdgeType_e)d; + knownSetting = true; + } + break; + case tBtRadio: + { + BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)var; + *ptr = (BluetoothRadioType_e)d; + knownSetting = true; + } + break; + case tPerDisp: + { + PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)var; + *ptr = (PeriodicDisplay_t)d; + knownSetting = true; + } + break; + case tCoordInp: + { + CoordinateInputType *ptr = (CoordinateInputType *)var; + *ptr = (CoordinateInputType)d; + knownSetting = true; + } + break; + case tCharArry: + { + char *ptr = (char *)var; + strncpy(ptr, settingString, qualifier); + // strncpy pads with zeros. No need to add them here for ntpReferenceId + knownSetting = true; + } + break; + case _IPString: + { + String tempString = String(settingString); + IPAddress *ptr = (IPAddress *)var; + ptr->fromString(tempString); + knownSetting = true; + } + break; + case tUbxMsgRt: + { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == ubxMessages[x].msgTextName[0]) && (strcmp(suffix, ubxMessages[x].msgTextName) == 0)) { - uint64_t *ptr = (uint64_t *)rtkSettingsEntries[i].var; - *ptr = (uint64_t)d; + settings.ubxMessageRates[x] = (uint8_t)d; knownSetting = true; + break; } - break; - case _int8_t: + } + } + break; + case tUbxConst: + { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == settings.ubxConstellations[x].textName[0]) && (strcmp(suffix, settings.ubxConstellations[x].textName) == 0)) { - int8_t *ptr = (int8_t *)rtkSettingsEntries[i].var; - *ptr = (int8_t)d; + settings.ubxConstellations[x].enabled = d; knownSetting = true; + break; } - break; - case _int16_t: + } + } + break; + case tEspNowPr: + { + int suffixNum; + if (sscanf(suffix, "%d", &suffixNum) == 1) + { + int mac[6]; + if (sscanf(settingString, "%X:%X:%X:%X:%X:%X", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6) { - int16_t *ptr = (int16_t *)rtkSettingsEntries[i].var; - *ptr = (int16_t)d; + for (int i = 0; i < 6; i++) + settings.espnowPeers[suffixNum][i] = mac[i]; knownSetting = true; } - break; - case tMuxConn: + } + } + break; + case tUbMsgRtb: + { + int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == ubxMessages[firstRTCMRecord + x].msgTextName[0]) && (strcmp(suffix, ubxMessages[firstRTCMRecord + x].msgTextName) == 0)) { - muxConnectionType_e *ptr = (muxConnectionType_e *)rtkSettingsEntries[i].var; - *ptr = (muxConnectionType_e)d; + settings.ubxMessageRatesBase[x] = (uint8_t)d; knownSetting = true; + break; } - break; - case tSysState: + } + } + break; + case tWiFiNet: + { + int network; + + if (strstr(suffix, "SSID") != nullptr) + { + if (sscanf(suffix, "%dSSID", &network) == 1) { - SystemState *ptr = (SystemState *)rtkSettingsEntries[i].var; - *ptr = (SystemState)d; + strncpy(settings.wifiNetworks[network].ssid, settingString, sizeof(settings.wifiNetworks[0].ssid)); knownSetting = true; } - break; - case tPulseEdg: + } + else if (strstr(suffix, "Password") != nullptr) + { + if (sscanf(suffix, "%dPassword", &network) == 1) { - pulseEdgeType_e *ptr = (pulseEdgeType_e *)rtkSettingsEntries[i].var; - *ptr = (pulseEdgeType_e)d; + strncpy(settings.wifiNetworks[network].password, settingString, sizeof(settings.wifiNetworks[0].password)); knownSetting = true; } - break; - case tBtRadio: + } + } + break; + case tNSCHost: + { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + strncpy(&settings.ntripServer_CasterHost[server][0], settingString, sizeof(settings.ntripServer_CasterHost[server])); + knownSetting = true; + } + } + break; + case tNSCPort: + { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + settings.ntripServer_CasterPort[server] = d; + knownSetting = true; + } + } + break; + case tNSCUser: + { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + strncpy(&settings.ntripServer_CasterUser[server][0], settingString, sizeof(settings.ntripServer_CasterUser[server])); + knownSetting = true; + } + } + break; + case tNSCUsrPw: + { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + strncpy(&settings.ntripServer_CasterUserPW[server][0], settingString, sizeof(settings.ntripServer_CasterUserPW[server])); + knownSetting = true; + } + } + break; + case tNSMtPt: + { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + strncpy(&settings.ntripServer_MountPoint[server][0], settingString, sizeof(settings.ntripServer_MountPoint[server])); + knownSetting = true; + } + } + break; + case tNSMtPtPw: + { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + strncpy(&settings.ntripServer_MountPointPW[server][0], settingString, sizeof(settings.ntripServer_MountPointPW[server])); + knownSetting = true; + } + } + break; + case tUmMRNmea: + { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == umMessagesNMEA[x].msgTextName[0]) && (strcmp(suffix, umMessagesNMEA[x].msgTextName) == 0)) { - BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)rtkSettingsEntries[i].var; - *ptr = (BluetoothRadioType_e)d; + settings.um980MessageRatesNMEA[x] = d; knownSetting = true; + break; } - break; - case tPerDisp: + } + } + break; + case tUmMRRvRT: + { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) { - PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)rtkSettingsEntries[i].var; - *ptr = (PeriodicDisplay_t)d; + settings.um980MessageRatesRTCMRover[x] = d; knownSetting = true; + break; } - break; - case tCoordInp: + } + } + break; + case tUmMRBaRT: + { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) { - CoordinateInputType *ptr = (CoordinateInputType *)rtkSettingsEntries[i].var; - *ptr = (CoordinateInputType)d; + settings.um980MessageRatesRTCMBase[x] = d; knownSetting = true; + break; } - break; - case tCharArry: + } + } + break; + case tUmConst: + { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == um980ConstellationCommands[x].textName[0]) && (strcmp(suffix, um980ConstellationCommands[x].textName) == 0)) { - char *ptr = (char *)rtkSettingsEntries[i].var; - strncpy(ptr, settingString, rtkSettingsEntries[i].qualifier); - // strncpy pads with zeros. No need to add them here for ntpReferenceId + settings.um980Constellations[x] = d; knownSetting = true; + break; } - break; - case _IPString: + } + } + break; + case tCorrSPri: + { + for (int x = 0; x < qualifier; x++) + { + if ((suffix[0] == correctionsSourceNames[x][0]) && (strcmp(suffix, correctionsSourceNames[x]) == 0)) { - String tempString = String(settingString); - IPAddress *ptr = (IPAddress *)rtkSettingsEntries[i].var; - ptr->fromString(tempString); + settings.correctionsSourcesPriority[x] = d; knownSetting = true; + break; } - break; - case tUbxMsgRt: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == ubxMessages[x].msgTextName[0]) && (strcmp(suffix, ubxMessages[x].msgTextName) == 0)) - { - settings.ubxMessageRates[x] = (uint8_t)d; - knownSetting = true; - break; - } - } - } - break; - case tUbxConst: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == settings.ubxConstellations[x].textName[0]) && (strcmp(suffix, settings.ubxConstellations[x].textName) == 0)) - { - settings.ubxConstellations[x].enabled = d; - knownSetting = true; - break; - } - } - } - break; - case tEspNowPr: - { - int suffixNum; - if (sscanf(suffix, "%d", &suffixNum) == 1) - { - int mac[6]; - if (sscanf(settingString, "%X:%X:%X:%X:%X:%X", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6) - { - for (int i = 0; i < 6; i++) - settings.espnowPeers[suffixNum][i] = mac[i]; - knownSetting = true; - } - } - } - break; - case tUbMsgRtb: - { - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); - - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == ubxMessages[firstRTCMRecord + x].msgTextName[0]) && (strcmp(suffix, ubxMessages[firstRTCMRecord + x].msgTextName) == 0)) - { - settings.ubxMessageRatesBase[x] = (uint8_t)d; - knownSetting = true; - break; - } - } - } - break; - case tWiFiNet: - { - int network; - - if (strstr(suffix, "SSID") != nullptr) - { - if (sscanf(suffix, "%dSSID", &network) == 1) - { - strncpy(settings.wifiNetworks[network].ssid, settingString, sizeof(settings.wifiNetworks[0].ssid)); - knownSetting = true; - } - } - else if (strstr(suffix, "Password") != nullptr) - { - if (sscanf(suffix, "%dPassword", &network) == 1) - { - strncpy(settings.wifiNetworks[network].password, settingString, sizeof(settings.wifiNetworks[0].password)); - knownSetting = true; - } - } - } - break; - case tNSCHost: - { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - strncpy(&settings.ntripServer_CasterHost[server][0], settingString, sizeof(settings.ntripServer_CasterHost[server])); - knownSetting = true; - } - } - break; - case tNSCPort: - { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - settings.ntripServer_CasterPort[server] = d; - knownSetting = true; - } - } - break; - case tNSCUser: - { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - strncpy(&settings.ntripServer_CasterUser[server][0], settingString, sizeof(settings.ntripServer_CasterUser[server])); - knownSetting = true; - } - } - break; - case tNSCUsrPw: - { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - strncpy(&settings.ntripServer_CasterUserPW[server][0], settingString, sizeof(settings.ntripServer_CasterUserPW[server])); - knownSetting = true; - } - } - break; - case tNSMtPt: - { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - strncpy(&settings.ntripServer_MountPoint[server][0], settingString, sizeof(settings.ntripServer_MountPoint[server])); - knownSetting = true; - } - } - break; - case tNSMtPtPw: - { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - strncpy(&settings.ntripServer_MountPointPW[server][0], settingString, sizeof(settings.ntripServer_MountPointPW[server])); - knownSetting = true; - } - } - break; - case tUmMRNmea: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == umMessagesNMEA[x].msgTextName[0]) && (strcmp(suffix, umMessagesNMEA[x].msgTextName) == 0)) - { - settings.um980MessageRatesNMEA[x] = d; - knownSetting = true; - break; - } - } - } - break; - case tUmMRRvRT: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) - { - settings.um980MessageRatesRTCMRover[x] = d; - knownSetting = true; - break; - } - } - } - break; - case tUmMRBaRT: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) - { - settings.um980MessageRatesRTCMBase[x] = d; - knownSetting = true; - break; - } - } - } - break; - case tUmConst: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == um980ConstellationCommands[x].textName[0]) && (strcmp(suffix, um980ConstellationCommands[x].textName) == 0)) - { - settings.um980Constellations[x] = d; - knownSetting = true; - break; - } - } - } - break; - case tCorrSPri: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - if ((suffix[0] == correctionsSourceNames[x][0]) && (strcmp(suffix, correctionsSourceNames[x]) == 0)) - { - settings.correctionsSourcesPriority[x] = d; - knownSetting = true; - break; - } - } - } - break; - case tRegCorTp: - { - int region; - if (sscanf(suffix, "%d", ®ion) == 1) - { - strncpy(&settings.regionalCorrectionTopics[region][0], settingString, sizeof(settings.regionalCorrectionTopics[0])); - knownSetting = true; - } - } - break; + } + } + break; + case tRegCorTp: + { + int region; + if (sscanf(suffix, "%d", ®ion) == 1) + { + strncpy(&settings.regionalCorrectionTopics[region][0], settingString, sizeof(settings.regionalCorrectionTopics[0])); + knownSetting = true; + } } + break; } } } - // Settings not part of settings.h/Settings struct if (strcmp(settingName, "otaRcFirmwareJsonUrl") == 0) { From b6e107d82989e5d675d71203177f1cbe0024e994 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sun, 19 May 2024 07:40:30 -1000 Subject: [PATCH 072/358] Remove underscore (_) limititation in rtkSettingsEntries --- Firmware/RTK_Everywhere/settings.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 7b65620c3..460cdc8c3 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1405,8 +1405,6 @@ typedef struct const RTK_Settings_Entry rtkSettingsEntries[] = { - // Note: don't use "_" in the name - "_" is reserved for settings arrays like "ubxMessageRate_" - // F // a // u i i c From 871b6e637fe1659359f77778b24f9d50134261d9 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Mon, 20 May 2024 11:35:10 -1000 Subject: [PATCH 073/358] Restrict commands to settings available for the platform --- Firmware/RTK_Everywhere/menuCommands.ino | 25 ++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 0d2cd4f49..f5e732a61 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -2487,6 +2487,29 @@ const char * commandGetName(int stringIndex, int rtkIndex) return "deviceId"; } +// Determine if the command is available on this platform +bool commandAvailableOnPlatform(int i) +{ + do + { + // Determine if this command is supported by the command processor + if (rtkSettingsEntries[i].inCommands) + { + // Verify that the command is available on the platform + if ((productVariant == RTK_EVK) && rtkSettingsEntries[i].platEvk) + break; + if ((productVariant == RTK_FACET_V2) && rtkSettingsEntries[i].platFacetV2) + break; + if ((productVariant == RTK_FACET_MOSAIC) && rtkSettingsEntries[i].platFacetMosaic) + break; + if ((productVariant == RTK_TORCH) && rtkSettingsEntries[i].platTorch) + break; + } + return false; + } while (0); + return true; +} + // Allocate and fill the commandIndex table bool commandIndexFill() { @@ -2501,6 +2524,7 @@ bool commandIndexFill() commandCount = 0; for (i = 0; i < numRtkSettingsEntries; i++) { + if (commandAvailableOnPlatform(i)) commandCount += 1; } commandCount += COMMAND_UNKNOWN - 1; @@ -2518,6 +2542,7 @@ bool commandIndexFill() // Initialize commandIndex with index values into rtkSettingsEntries commandCount = 0; for (i = 0; i < numRtkSettingsEntries; i++) + if (commandAvailableOnPlatform(i)) commandIndex[commandCount++] = i; // Add the man-machine interface commands to the list From 545ef8d2f9cb5e538f50f13cce741bb9766d3d61 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Fri, 17 May 2024 07:15:14 -1000 Subject: [PATCH 074/358] Place the UBX messages in alphabetical order --- Firmware/RTK_Everywhere/settings.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 460cdc8c3..0860af3b0 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1288,14 +1288,14 @@ struct Settings // UBX (SX1276) bool enableUART2UBXIn = false; // UBX Protocol In on UART2 ubxConstellation ubxConstellations[MAX_CONSTELLATIONS] = { // Constellations monitored/used for fix - {UBLOX_CFG_SIGNAL_GPS_ENA, SFE_UBLOX_GNSS_ID_GPS, true, "GPS"}, - {UBLOX_CFG_SIGNAL_SBAS_ENA, SFE_UBLOX_GNSS_ID_SBAS, true, "SBAS"}, - {UBLOX_CFG_SIGNAL_GAL_ENA, SFE_UBLOX_GNSS_ID_GALILEO, true, "Galileo"}, {UBLOX_CFG_SIGNAL_BDS_ENA, SFE_UBLOX_GNSS_ID_BEIDOU, true, "BeiDou"}, + {UBLOX_CFG_SIGNAL_GAL_ENA, SFE_UBLOX_GNSS_ID_GALILEO, true, "Galileo"}, + {UBLOX_CFG_SIGNAL_GLO_ENA, SFE_UBLOX_GNSS_ID_GLONASS, true, "GLONASS"}, + {UBLOX_CFG_SIGNAL_GPS_ENA, SFE_UBLOX_GNSS_ID_GPS, true, "GPS"}, //{UBLOX_CFG_SIGNAL_QZSS_ENA, SFE_UBLOX_GNSS_ID_IMES, false, "IMES"}, //Not yet supported? Config key does not // exist? {UBLOX_CFG_SIGNAL_QZSS_ENA, SFE_UBLOX_GNSS_ID_QZSS, true, "QZSS"}, - {UBLOX_CFG_SIGNAL_GLO_ENA, SFE_UBLOX_GNSS_ID_GLONASS, true, "GLONASS"}, + {UBLOX_CFG_SIGNAL_SBAS_ENA, SFE_UBLOX_GNSS_ID_SBAS, true, "SBAS"}, }; uint8_t ubxMessageRates[MAX_UBX_MSG] = {254}; // Mark first record with key so defaults will be applied. uint8_t ubxMessageRatesBase[MAX_UBX_MSG_RTCM] = { From a07930039391f77a99f473516a787efe92a503b5 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Fri, 17 May 2024 07:19:03 -1000 Subject: [PATCH 075/358] Place the UM980 constellations in alphabetical order --- Firmware/RTK_Everywhere/UM980.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/UM980.h b/Firmware/RTK_Everywhere/UM980.h index 50f26db44..54b375ca1 100644 --- a/Firmware/RTK_Everywhere/UM980.h +++ b/Firmware/RTK_Everywhere/UM980.h @@ -22,7 +22,11 @@ typedef struct // Available constellations: GPS, BDS, GLO, GAL, QZSS // SBAS and IRNSS don't seem to be supported const um980ConstellationCommand um980ConstellationCommands[] = { - {"GPS", "GPS"}, {"GLONASS", "GLO"}, {"Galileo", "GAL"}, {"BeiDou", "BDS"}, {"QZSS", "QZSS"}, + {"BeiDou", "BDS"}, + {"Galileo", "GAL"}, + {"GLONASS", "GLO"}, + {"GPS", "GPS"}, + {"QZSS", "QZSS"}, }; #define MAX_UM980_CONSTELLATIONS (sizeof(um980ConstellationCommands) / sizeof(um980ConstellationCommand)) @@ -87,4 +91,4 @@ enum um980_Models UM980_DYN_MODEL_AUTOMOTIVE, }; -#endif \ No newline at end of file +#endif From 39b8982c6e11062f459f1d7224073d030df62aa4 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Fri, 17 May 2024 07:15:14 -1000 Subject: [PATCH 076/358] Place the UBX messages in alphabetical order --- Firmware/RTK_Everywhere/settings.h | 224 +++++++++++++++-------------- 1 file changed, 114 insertions(+), 110 deletions(-) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 0860af3b0..3e4b89413 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -627,93 +627,6 @@ typedef struct // Static array containing all the compatible messages const ubxMsg ubxMessages[] = { - // NMEA - {UBLOX_CFG_MSGOUT_NMEA_ID_DTM_UART1, UBX_NMEA_DTM, UBX_CLASS_NMEA, 0, "UBX_NMEA_DTM", SFE_UBLOX_FILTER_NMEA_DTM, - 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_GBS_UART1, UBX_NMEA_GBS, UBX_CLASS_NMEA, 0, "UBX_NMEA_GBS", SFE_UBLOX_FILTER_NMEA_GBS, - 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_GGA_UART1, UBX_NMEA_GGA, UBX_CLASS_NMEA, 1, "UBX_NMEA_GGA", SFE_UBLOX_FILTER_NMEA_GGA, - 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_GLL_UART1, UBX_NMEA_GLL, UBX_CLASS_NMEA, 0, "UBX_NMEA_GLL", SFE_UBLOX_FILTER_NMEA_GLL, - 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_GNS_UART1, UBX_NMEA_GNS, UBX_CLASS_NMEA, 0, "UBX_NMEA_GNS", SFE_UBLOX_FILTER_NMEA_GNS, - 112, 120}, - - {UBLOX_CFG_MSGOUT_NMEA_ID_GRS_UART1, UBX_NMEA_GRS, UBX_CLASS_NMEA, 0, "UBX_NMEA_GRS", SFE_UBLOX_FILTER_NMEA_GRS, - 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_GSA_UART1, UBX_NMEA_GSA, UBX_CLASS_NMEA, 1, "UBX_NMEA_GSA", SFE_UBLOX_FILTER_NMEA_GSA, - 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_GST_UART1, UBX_NMEA_GST, UBX_CLASS_NMEA, 1, "UBX_NMEA_GST", SFE_UBLOX_FILTER_NMEA_GST, - 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_GSV_UART1, UBX_NMEA_GSV, UBX_CLASS_NMEA, 4, "UBX_NMEA_GSV", SFE_UBLOX_FILTER_NMEA_GSV, - 112, 120}, // Default to 1 update every 4 fixes - {UBLOX_CFG_MSGOUT_NMEA_ID_RLM_UART1, UBX_NMEA_RLM, UBX_CLASS_NMEA, 0, "UBX_NMEA_RLM", SFE_UBLOX_FILTER_NMEA_RLM, - 113, 120}, // No F9P 112 support - - {UBLOX_CFG_MSGOUT_NMEA_ID_RMC_UART1, UBX_NMEA_RMC, UBX_CLASS_NMEA, 1, "UBX_NMEA_RMC", SFE_UBLOX_FILTER_NMEA_RMC, - 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_THS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NMEA, 0, "UBX_NMEA_THS", - SFE_UBLOX_FILTER_NMEA_THS, 9999, 120}, // Not supported F9P 112, 113, 120, 130, 132 - {UBLOX_CFG_MSGOUT_NMEA_ID_VLW_UART1, UBX_NMEA_VLW, UBX_CLASS_NMEA, 0, "UBX_NMEA_VLW", SFE_UBLOX_FILTER_NMEA_VLW, - 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_VTG_UART1, UBX_NMEA_VTG, UBX_CLASS_NMEA, 0, "UBX_NMEA_VTG", SFE_UBLOX_FILTER_NMEA_VTG, - 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_ZDA_UART1, UBX_NMEA_ZDA, UBX_CLASS_NMEA, 0, "UBX_NMEA_ZDA", SFE_UBLOX_FILTER_NMEA_ZDA, - 112, 120}, - - // NMEA NAV2 - // F9P not supported 112, 113, 120. Supported starting 130. - // F9R not supported 120. Supported starting 130. - {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_GGA_UART1, UBX_NMEA_GGA, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_GGA", - SFE_UBLOX_FILTER_NMEA_GGA, 130, 130}, - {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_GLL_UART1, UBX_NMEA_GLL, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_GLL", - SFE_UBLOX_FILTER_NMEA_GLL, 130, 130}, - {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_GNS_UART1, UBX_NMEA_GNS, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_GNS", - SFE_UBLOX_FILTER_NMEA_GNS, 130, 130}, - {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_GSA_UART1, UBX_NMEA_GSA, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_GSA", - SFE_UBLOX_FILTER_NMEA_GSA, 130, 130}, - {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_RMC_UART1, UBX_NMEA_RMC, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_RMC", - SFE_UBLOX_FILTER_NMEA_RMC, 130, 130}, - - {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_VTG_UART1, UBX_NMEA_VTG, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_VTG", - SFE_UBLOX_FILTER_NMEA_VTG, 130, 130}, - {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_ZDA_UART1, UBX_NMEA_ZDA, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_ZDA", - SFE_UBLOX_FILTER_NMEA_ZDA, 130, 130}, - - // PUBX - // F9P support 130 - {UBLOX_CFG_MSGOUT_PUBX_ID_POLYP_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_PUBX, 0, "UBX_PUBX_POLYP", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_PUBX_ID_POLYS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_PUBX, 0, "UBX_PUBX_POLYS", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_PUBX_ID_POLYT_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_PUBX, 0, "UBX_PUBX_POLYT", 0, 112, 120}, - - // RTCM - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1005_UART1, UBX_RTCM_1005, UBX_RTCM_MSB, 1, "UBX_RTCM_1005", - SFE_UBLOX_FILTER_RTCM_TYPE1005, 112, 9999}, // Not supported on F9R - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1074_UART1, UBX_RTCM_1074, UBX_RTCM_MSB, 1, "UBX_RTCM_1074", - SFE_UBLOX_FILTER_RTCM_TYPE1074, 112, 9999}, - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1077_UART1, UBX_RTCM_1077, UBX_RTCM_MSB, 0, "UBX_RTCM_1077", - SFE_UBLOX_FILTER_RTCM_TYPE1077, 112, 9999}, - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1084_UART1, UBX_RTCM_1084, UBX_RTCM_MSB, 1, "UBX_RTCM_1084", - SFE_UBLOX_FILTER_RTCM_TYPE1084, 112, 9999}, - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1087_UART1, UBX_RTCM_1087, UBX_RTCM_MSB, 0, "UBX_RTCM_1087", - SFE_UBLOX_FILTER_RTCM_TYPE1087, 112, 9999}, - - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1094_UART1, UBX_RTCM_1094, UBX_RTCM_MSB, 1, "UBX_RTCM_1094", - SFE_UBLOX_FILTER_RTCM_TYPE1094, 112, 9999}, - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1097_UART1, UBX_RTCM_1097, UBX_RTCM_MSB, 0, "UBX_RTCM_1097", - SFE_UBLOX_FILTER_RTCM_TYPE1097, 112, 9999}, - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1124_UART1, UBX_RTCM_1124, UBX_RTCM_MSB, 1, "UBX_RTCM_1124", - SFE_UBLOX_FILTER_RTCM_TYPE1124, 112, 9999}, - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1127_UART1, UBX_RTCM_1127, UBX_RTCM_MSB, 0, "UBX_RTCM_1127", - SFE_UBLOX_FILTER_RTCM_TYPE1127, 112, 9999}, - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1230_UART1, UBX_RTCM_1230, UBX_RTCM_MSB, 10, "UBX_RTCM_1230", - SFE_UBLOX_FILTER_RTCM_TYPE1230, 112, 9999}, - - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_0_UART1, UBX_RTCM_4072_0, UBX_RTCM_MSB, 0, "UBX_RTCM_4072_0", - SFE_UBLOX_FILTER_RTCM_TYPE4072_0, 112, 9999}, - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_1_UART1, UBX_RTCM_4072_1, UBX_RTCM_MSB, 0, "UBX_RTCM_4072_1", - SFE_UBLOX_FILTER_RTCM_TYPE4072_1, 112, 9999}, - // AID // ESF @@ -731,9 +644,9 @@ const ubxMsg ubxMessages[] = { // MON {UBLOX_CFG_MSGOUT_UBX_MON_COMMS_UART1, UBX_MON_COMMS, UBX_CLASS_MON, 0, "UBX_MON_COMMS", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_MON_HW_UART1, UBX_MON_HW, UBX_CLASS_MON, 0, "UBX_MON_HW", 0, 112, 120}, {UBLOX_CFG_MSGOUT_UBX_MON_HW2_UART1, UBX_MON_HW2, UBX_CLASS_MON, 0, "UBX_MON_HW2", 0, 112, 120}, {UBLOX_CFG_MSGOUT_UBX_MON_HW3_UART1, UBX_MON_HW3, UBX_CLASS_MON, 0, "UBX_MON_HW3", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_MON_HW_UART1, UBX_MON_HW, UBX_CLASS_MON, 0, "UBX_MON_HW", 0, 112, 120}, {UBLOX_CFG_MSGOUT_UBX_MON_IO_UART1, UBX_MON_IO, UBX_CLASS_MON, 0, "UBX_MON_IO", 0, 112, 120}, {UBLOX_CFG_MSGOUT_UBX_MON_MSGPP_UART1, UBX_MON_MSGPP, UBX_CLASS_MON, 0, "UBX_MON_MSGPP", 0, 112, 120}, @@ -817,6 +730,8 @@ const ubxMsg ubxMessages[] = { {UBLOX_CFG_MSGOUT_UBX_NAV_PVAT_UART1, UBX_NAV_PVAT, UBX_CLASS_NAV, 0, "UBX_NAV_PVAT", 0, 9999, 121}, // Not supported on F9P 112, 113, 120, 130, F9R 120 {UBLOX_CFG_MSGOUT_UBX_NAV_PVT_UART1, UBX_NAV_PVT, UBX_CLASS_NAV, 0, "UBX_NAV_PVT", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_TIMEQZSS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV_QZSS", 0, 113, + 130}, // Not supported F9R 121 or F9P 112 {UBLOX_CFG_MSGOUT_UBX_NAV_RELPOSNED_UART1, UBX_NAV_RELPOSNED, UBX_CLASS_NAV, 0, "UBX_NAV_RELPOSNED", 0, 112, 120}, {UBLOX_CFG_MSGOUT_UBX_NAV_SAT_UART1, UBX_NAV_SAT, UBX_CLASS_NAV, 0, "UBX_NAV_SAT", 0, 112, 120}, @@ -828,10 +743,10 @@ const ubxMsg ubxMessages[] = { //{UBLOX_CFG_MSGOUT_UBX_NAV_SOL_UART1, UBX_NAV_SOL, UBX_CLASS_NAV, 0, "UBX_NAV_SOL", 0, 9999, 9999}, //Not // supported F9R 121 or F9P 112, 113, 120, 130, 132 {UBLOX_CFG_MSGOUT_UBX_NAV_STATUS_UART1, UBX_NAV_STATUS, UBX_CLASS_NAV, 0, "UBX_NAV_STATUS", 0, 112, 120}, - //{UBLOX_CFG_MSGOUT_UBX_NAV_SVINFO_UART1, UBX_NAV_SVINFO, UBX_CLASS_NAV, 0, "UBX_NAV_SVINFO", 0, 9999, 9999}, //Not - // supported F9R 120 or F9P 112, 113, 120, 130, 132 {UBLOX_CFG_MSGOUT_UBX_NAV_SVIN_UART1, UBX_NAV_SVIN, UBX_CLASS_NAV, 0, "UBX_NAV_SVIN", 0, 112, 9999}, // Not supported on F9R 120, 121, 130 + //{UBLOX_CFG_MSGOUT_UBX_NAV_SVINFO_UART1, UBX_NAV_SVINFO, UBX_CLASS_NAV, 0, "UBX_NAV_SVINFO", 0, 9999, 9999}, //Not + // supported F9R 120 or F9P 112, 113, 120, 130, 132 {UBLOX_CFG_MSGOUT_UBX_NAV_TIMEBDS_UART1, UBX_NAV_TIMEBDS, UBX_CLASS_NAV, 0, "UBX_NAV_TIMEBDS", 0, 112, 120}, {UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGAL_UART1, UBX_NAV_TIMEGAL, UBX_CLASS_NAV, 0, "UBX_NAV_TIMEGAL", 0, 112, 120}, {UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGLO_UART1, UBX_NAV_TIMEGLO, UBX_CLASS_NAV, 0, "UBX_NAV_TIMEGLO", 0, 112, 120}, @@ -840,40 +755,129 @@ const ubxMsg ubxMessages[] = { {UBLOX_CFG_MSGOUT_UBX_NAV_TIMELS_UART1, UBX_NAV_TIMELS, UBX_CLASS_NAV, 0, "UBX_NAV_TIMELS", 0, 112, 120}, //{UBLOX_CFG_MSGOUT_UBX_NAV_TIMENAVIC_UART1, UBX_NAV_TIMENAVIC, UBX_CLASS_NAV, 0, "UBX_NAV_TIMENAVIC", 0, 9999, // 9999}, //Not supported F9R 121 or F9P 132 - {UBLOX_CFG_MSGOUT_UBX_NAV_TIMEQZSS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV_QZSS", 0, 113, - 130}, // Not supported F9R 121 or F9P 112 {UBLOX_CFG_MSGOUT_UBX_NAV_TIMEUTC_UART1, UBX_NAV_TIMEUTC, UBX_CLASS_NAV, 0, "UBX_NAV_TIMEUTC", 0, 112, 120}, {UBLOX_CFG_MSGOUT_UBX_NAV_VELECEF_UART1, UBX_NAV_VELECEF, UBX_CLASS_NAV, 0, "UBX_NAV_VELECEF", 0, 112, 120}, {UBLOX_CFG_MSGOUT_UBX_NAV_VELNED_UART1, UBX_NAV_VELNED, UBX_CLASS_NAV, 0, "UBX_NAV_VELNED", 0, 112, 120}, + // NMEA NAV2 + // F9P not supported 112, 113, 120. Supported starting 130. + // F9R not supported 120. Supported starting 130. + {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_GGA_UART1, UBX_NMEA_GGA, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_GGA", + SFE_UBLOX_FILTER_NMEA_GGA, 130, 130}, + {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_GLL_UART1, UBX_NMEA_GLL, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_GLL", + SFE_UBLOX_FILTER_NMEA_GLL, 130, 130}, + {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_GNS_UART1, UBX_NMEA_GNS, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_GNS", + SFE_UBLOX_FILTER_NMEA_GNS, 130, 130}, + {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_GSA_UART1, UBX_NMEA_GSA, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_GSA", + SFE_UBLOX_FILTER_NMEA_GSA, 130, 130}, + {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_RMC_UART1, UBX_NMEA_RMC, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_RMC", + SFE_UBLOX_FILTER_NMEA_RMC, 130, 130}, + + {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_VTG_UART1, UBX_NMEA_VTG, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_VTG", + SFE_UBLOX_FILTER_NMEA_VTG, 130, 130}, + {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_ZDA_UART1, UBX_NMEA_ZDA, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_ZDA", + SFE_UBLOX_FILTER_NMEA_ZDA, 130, 130}, + + // NMEA + {UBLOX_CFG_MSGOUT_NMEA_ID_DTM_UART1, UBX_NMEA_DTM, UBX_CLASS_NMEA, 0, "UBX_NMEA_DTM", SFE_UBLOX_FILTER_NMEA_DTM, + 112, 120}, + {UBLOX_CFG_MSGOUT_NMEA_ID_GBS_UART1, UBX_NMEA_GBS, UBX_CLASS_NMEA, 0, "UBX_NMEA_GBS", SFE_UBLOX_FILTER_NMEA_GBS, + 112, 120}, + {UBLOX_CFG_MSGOUT_NMEA_ID_GGA_UART1, UBX_NMEA_GGA, UBX_CLASS_NMEA, 1, "UBX_NMEA_GGA", SFE_UBLOX_FILTER_NMEA_GGA, + 112, 120}, + {UBLOX_CFG_MSGOUT_NMEA_ID_GLL_UART1, UBX_NMEA_GLL, UBX_CLASS_NMEA, 0, "UBX_NMEA_GLL", SFE_UBLOX_FILTER_NMEA_GLL, + 112, 120}, + {UBLOX_CFG_MSGOUT_NMEA_ID_GNS_UART1, UBX_NMEA_GNS, UBX_CLASS_NMEA, 0, "UBX_NMEA_GNS", SFE_UBLOX_FILTER_NMEA_GNS, + 112, 120}, + + {UBLOX_CFG_MSGOUT_NMEA_ID_GRS_UART1, UBX_NMEA_GRS, UBX_CLASS_NMEA, 0, "UBX_NMEA_GRS", SFE_UBLOX_FILTER_NMEA_GRS, + 112, 120}, + {UBLOX_CFG_MSGOUT_NMEA_ID_GSA_UART1, UBX_NMEA_GSA, UBX_CLASS_NMEA, 1, "UBX_NMEA_GSA", SFE_UBLOX_FILTER_NMEA_GSA, + 112, 120}, + {UBLOX_CFG_MSGOUT_NMEA_ID_GST_UART1, UBX_NMEA_GST, UBX_CLASS_NMEA, 1, "UBX_NMEA_GST", SFE_UBLOX_FILTER_NMEA_GST, + 112, 120}, + {UBLOX_CFG_MSGOUT_NMEA_ID_GSV_UART1, UBX_NMEA_GSV, UBX_CLASS_NMEA, 4, "UBX_NMEA_GSV", SFE_UBLOX_FILTER_NMEA_GSV, + 112, 120}, // Default to 1 update every 4 fixes + {UBLOX_CFG_MSGOUT_NMEA_ID_RLM_UART1, UBX_NMEA_RLM, UBX_CLASS_NMEA, 0, "UBX_NMEA_RLM", SFE_UBLOX_FILTER_NMEA_RLM, + 113, 120}, // No F9P 112 support + + {UBLOX_CFG_MSGOUT_NMEA_ID_RMC_UART1, UBX_NMEA_RMC, UBX_CLASS_NMEA, 1, "UBX_NMEA_RMC", SFE_UBLOX_FILTER_NMEA_RMC, + 112, 120}, + {UBLOX_CFG_MSGOUT_NMEA_ID_THS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NMEA, 0, "UBX_NMEA_THS", + SFE_UBLOX_FILTER_NMEA_THS, 9999, 120}, // Not supported F9P 112, 113, 120, 130, 132 + {UBLOX_CFG_MSGOUT_NMEA_ID_VLW_UART1, UBX_NMEA_VLW, UBX_CLASS_NMEA, 0, "UBX_NMEA_VLW", SFE_UBLOX_FILTER_NMEA_VLW, + 112, 120}, + {UBLOX_CFG_MSGOUT_NMEA_ID_VTG_UART1, UBX_NMEA_VTG, UBX_CLASS_NMEA, 0, "UBX_NMEA_VTG", SFE_UBLOX_FILTER_NMEA_VTG, + 112, 120}, + {UBLOX_CFG_MSGOUT_NMEA_ID_ZDA_UART1, UBX_NMEA_ZDA, UBX_CLASS_NMEA, 0, "UBX_NMEA_ZDA", SFE_UBLOX_FILTER_NMEA_ZDA, + 112, 120}, + + // PUBX + // F9P support 130 + {UBLOX_CFG_MSGOUT_PUBX_ID_POLYP_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_PUBX, 0, "UBX_PUBX_POLYP", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_PUBX_ID_POLYS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_PUBX, 0, "UBX_PUBX_POLYS", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_PUBX_ID_POLYT_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_PUBX, 0, "UBX_PUBX_POLYT", 0, 112, 120}, + + // RTCM + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1005_UART1, UBX_RTCM_1005, UBX_RTCM_MSB, 1, "UBX_RTCM_1005", + SFE_UBLOX_FILTER_RTCM_TYPE1005, 112, 9999}, // Not supported on F9R + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1074_UART1, UBX_RTCM_1074, UBX_RTCM_MSB, 1, "UBX_RTCM_1074", + SFE_UBLOX_FILTER_RTCM_TYPE1074, 112, 9999}, + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1077_UART1, UBX_RTCM_1077, UBX_RTCM_MSB, 0, "UBX_RTCM_1077", + SFE_UBLOX_FILTER_RTCM_TYPE1077, 112, 9999}, + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1084_UART1, UBX_RTCM_1084, UBX_RTCM_MSB, 1, "UBX_RTCM_1084", + SFE_UBLOX_FILTER_RTCM_TYPE1084, 112, 9999}, + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1087_UART1, UBX_RTCM_1087, UBX_RTCM_MSB, 0, "UBX_RTCM_1087", + SFE_UBLOX_FILTER_RTCM_TYPE1087, 112, 9999}, + + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1094_UART1, UBX_RTCM_1094, UBX_RTCM_MSB, 1, "UBX_RTCM_1094", + SFE_UBLOX_FILTER_RTCM_TYPE1094, 112, 9999}, + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1097_UART1, UBX_RTCM_1097, UBX_RTCM_MSB, 0, "UBX_RTCM_1097", + SFE_UBLOX_FILTER_RTCM_TYPE1097, 112, 9999}, + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1124_UART1, UBX_RTCM_1124, UBX_RTCM_MSB, 1, "UBX_RTCM_1124", + SFE_UBLOX_FILTER_RTCM_TYPE1124, 112, 9999}, + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1127_UART1, UBX_RTCM_1127, UBX_RTCM_MSB, 0, "UBX_RTCM_1127", + SFE_UBLOX_FILTER_RTCM_TYPE1127, 112, 9999}, + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1230_UART1, UBX_RTCM_1230, UBX_RTCM_MSB, 10, "UBX_RTCM_1230", + SFE_UBLOX_FILTER_RTCM_TYPE1230, 112, 9999}, + + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_0_UART1, UBX_RTCM_4072_0, UBX_RTCM_MSB, 0, "UBX_RTCM_4072_0", + SFE_UBLOX_FILTER_RTCM_TYPE4072_0, 112, 9999}, + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_1_UART1, UBX_RTCM_4072_1, UBX_RTCM_MSB, 0, "UBX_RTCM_4072_1", + SFE_UBLOX_FILTER_RTCM_TYPE4072_1, 112, 9999}, + // RXM - //{UBLOX_CFG_MSGOUT_UBX_RXM_ALM_UART1, UBX_RXM_ALM, UBX_CLASS_RXM, 0, "UBX_RXM_ALM", 0, 9999, 9999}, //Not supported - // F9R 121 or F9P 112, 113, 120, 130, 132 + //{UBLOX_CFG_MSGOUT_UBX_RXM_ALM_UART1, UBX_RXM_ALM, UBX_CLASS_RXM, 0, "UBX_RXM_ALM", 0, 9999, 9999}, //Not supported + // F9R 121 or F9P 112, 113, 120, 130, 132 {UBLOX_CFG_MSGOUT_UBX_RXM_COR_UART1, UBX_RXM_COR, UBX_CLASS_RXM, 0, "UBX_RXM_COR", 0, 9999, 130}, // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 - //{UBLOX_CFG_MSGOUT_UBX_RXM_EPH_UART1, UBX_RXM_EPH, UBX_CLASS_RXM, 0, "UBX_RXM_EPH", 0, 9999, 9999}, //Not - // supported F9R 121 or F9P 112, 113, 120, 130, 132 {UBLOX_CFG_MSGOUT_UBX_RXM_IMES_UART1, UBX_RXM_IMES, - // UBX_CLASS_RXM, 0, "UBX_RXM_IMES", 0, 9999, 9999}, //Not supported F9R 121 or F9P 112, 113, 120, 130, 132 - //{UBLOX_CFG_MSGOUT_UBX_RXM_MEAS20_UART1, UBX_RXM_MEAS20, UBX_CLASS_RXM, 0, "UBX_RXM_MEAS20", 0, 9999, 9999}, - ////Not supported F9R 121 or F9P 112, 113, 120, 130, 132 {UBLOX_CFG_MSGOUT_UBX_RXM_MEAS50_UART1, - // UBX_RXM_MEAS50, UBX_CLASS_RXM, 0, "UBX_RXM_MEAS50", 0, 9999, 9999}, //Not supported F9R 121 or F9P 112, - // 113, 120, 130, 132 {UBLOX_CFG_MSGOUT_UBX_RXM_MEASC12_UART1, UBX_RXM_MEASC12, UBX_CLASS_RXM, 0, - //"UBX_RXM_MEASC12", 0, 9999, 9999}, //Not supported F9R 121 or F9P 112, 113, 120, 130, 132 - //{UBLOX_CFG_MSGOUT_UBX_RXM_MEASD12_UART1, UBX_RXM_MEASD12, UBX_CLASS_RXM, 0, "UBX_RXM_MEASD12", 0, 9999, - // 9999}, //Not supported F9R 121 or F9P 112, 113, 120, 130, 132 + //{UBLOX_CFG_MSGOUT_UBX_RXM_EPH_UART1, UBX_RXM_EPH, UBX_CLASS_RXM, 0, "UBX_RXM_EPH", 0, 9999, 9999}, + // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 + //{UBLOX_CFG_MSGOUT_UBX_RXM_IMES_UART1, UBX_RXM_IMES, UBX_CLASS_RXM, 0, "UBX_RXM_IMES", 0, 9999, 9999}, + // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 + //{UBLOX_CFG_MSGOUT_UBX_RXM_MEAS20_UART1, UBX_RXM_MEAS20, UBX_CLASS_RXM, 0, "UBX_RXM_MEAS20", 0, 9999, 9999}, + // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 + //{UBLOX_CFG_MSGOUT_UBX_RXM_MEAS50_UART1, UBX_RXM_MEAS50, UBX_CLASS_RXM, 0, "UBX_RXM_MEAS50", 0, 9999, 9999}, + // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 + //{UBLOX_CFG_MSGOUT_UBX_RXM_MEASC12_UART1, UBX_RXM_MEASC12, UBX_CLASS_RXM, 0, "UBX_RXM_MEASC12", 0, 9999, 9999}, + // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 + //{UBLOX_CFG_MSGOUT_UBX_RXM_MEASD12_UART1, UBX_RXM_MEASD12, UBX_CLASS_RXM, 0, "UBX_RXM_MEASD12", 0, 9999, 9999}, + // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 {UBLOX_CFG_MSGOUT_UBX_RXM_MEASX_UART1, UBX_RXM_MEASX, UBX_CLASS_RXM, 0, "UBX_RXM_MEASX", 0, 112, 120}, - //{UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART1, UBX_RXM_PMP, UBX_CLASS_RXM, 0, "UBX_RXM_PMP", 0, 9999, 9999}, //Not supported - // F9R 121 or F9P 112, 113, 120, 130, 132 {UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_UART1, UBX_RXM_QZSSL6, UBX_CLASS_RXM, 0, - //"UBX_RXM_QZSSL6", 0, 9999, 9999}, //Not supported F9R 121, F9P 112, 113, 120, 130 + //{UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART1, UBX_RXM_PMP, UBX_CLASS_RXM, 0, "UBX_RXM_PMP", 0, 9999, 9999}, + // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 + //{UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_UART1, UBX_RXM_QZSSL6, UBX_CLASS_RXM, 0, "UBX_RXM_QZSSL6", 0, 9999, 9999}, + // Not supported F9R 121, F9P 112, 113, 120, 130 {UBLOX_CFG_MSGOUT_UBX_RXM_RAWX_UART1, UBX_RXM_RAWX, UBX_CLASS_RXM, 0, "UBX_RXM_RAWX", 0, 112, 120}, {UBLOX_CFG_MSGOUT_UBX_RXM_RLM_UART1, UBX_RXM_RLM, UBX_CLASS_RXM, 0, "UBX_RXM_RLM", 0, 112, 120}, {UBLOX_CFG_MSGOUT_UBX_RXM_RTCM_UART1, UBX_RXM_RTCM, UBX_CLASS_RXM, 0, "UBX_RXM_RTCM", 0, 112, 120}, {UBLOX_CFG_MSGOUT_UBX_RXM_SFRBX_UART1, UBX_RXM_SFRBX, UBX_CLASS_RXM, 0, "UBX_RXM_SFRBX", 0, 112, 120}, {UBLOX_CFG_MSGOUT_UBX_RXM_SPARTN_UART1, UBX_RXM_SPARTN, UBX_CLASS_RXM, 0, "UBX_RXM_SPARTN", 0, 9999, 121}, // Not supported F9R 120 or F9P 112, 113, 120, 130 - //{UBLOX_CFG_MSGOUT_UBX_RXM_SVSI_UART1, UBX_RXM_SVSI, UBX_CLASS_RXM, 0, "UBX_RXM_SVSI", 0, 9999, 9999}, //Not - // supported F9R 121 or F9P 112, 113, 120, 130, 132 {UBLOX_CFG_MSGOUT_UBX_RXM_TM_UART1, UBX_RXM_TM, - // UBX_CLASS_RXM, 0, "UBX_RXM_TM", 0, 9999, 9999}, //Not supported F9R 121 or F9P 112, 113, 120, 130, 132 + //{UBLOX_CFG_MSGOUT_UBX_RXM_SVSI_UART1, UBX_RXM_SVSI, UBX_CLASS_RXM, 0, "UBX_RXM_SVSI", 0, 9999, 9999}, + // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 + //{UBLOX_CFG_MSGOUT_UBX_RXM_TM_UART1, UBX_RXM_TM, UBX_CLASS_RXM, 0, "UBX_RXM_TM", 0, 9999, 9999}, + // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 // SEC // No support F9P 112. From e4f5a53d63ceb6169fc014907ccc55bcb51a355e Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Mon, 20 May 2024 12:34:45 -1000 Subject: [PATCH 077/358] Remove UBX and UM980 in command names --- Firmware/RTK_Everywhere/settings.h | 292 ++++++++++++++--------------- 1 file changed, 146 insertions(+), 146 deletions(-) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 3e4b89413..668cbd518 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -630,12 +630,12 @@ const ubxMsg ubxMessages[] = { // AID // ESF - {UBLOX_CFG_MSGOUT_UBX_ESF_ALG_UART1, UBX_ESF_ALG, UBX_CLASS_ESF, 0, "UBX_ESF_ALG", 0, 9999, + {UBLOX_CFG_MSGOUT_UBX_ESF_ALG_UART1, UBX_ESF_ALG, UBX_CLASS_ESF, 0, "ESF_ALG", 0, 9999, 120}, // Not supported on F9P - {UBLOX_CFG_MSGOUT_UBX_ESF_INS_UART1, UBX_ESF_INS, UBX_CLASS_ESF, 0, "UBX_ESF_INS", 0, 9999, 120}, - {UBLOX_CFG_MSGOUT_UBX_ESF_MEAS_UART1, UBX_ESF_MEAS, UBX_CLASS_ESF, 0, "UBX_ESF_MEAS", 0, 9999, 120}, - {UBLOX_CFG_MSGOUT_UBX_ESF_RAW_UART1, UBX_ESF_RAW, UBX_CLASS_ESF, 0, "UBX_ESF_RAW", 0, 9999, 120}, - {UBLOX_CFG_MSGOUT_UBX_ESF_STATUS_UART1, UBX_ESF_STATUS, UBX_CLASS_ESF, 0, "UBX_ESF_STATUS", 0, 9999, 120}, + {UBLOX_CFG_MSGOUT_UBX_ESF_INS_UART1, UBX_ESF_INS, UBX_CLASS_ESF, 0, "ESF_INS", 0, 9999, 120}, + {UBLOX_CFG_MSGOUT_UBX_ESF_MEAS_UART1, UBX_ESF_MEAS, UBX_CLASS_ESF, 0, "ESF_MEAS", 0, 9999, 120}, + {UBLOX_CFG_MSGOUT_UBX_ESF_RAW_UART1, UBX_ESF_RAW, UBX_CLASS_ESF, 0, "ESF_RAW", 0, 9999, 120}, + {UBLOX_CFG_MSGOUT_UBX_ESF_STATUS_UART1, UBX_ESF_STATUS, UBX_CLASS_ESF, 0, "ESF_STATUS", 0, 9999, 120}, // HNR @@ -643,251 +643,251 @@ const ubxMsg ubxMessages[] = { // F9P supports LOG_INFO at 112 // MON - {UBLOX_CFG_MSGOUT_UBX_MON_COMMS_UART1, UBX_MON_COMMS, UBX_CLASS_MON, 0, "UBX_MON_COMMS", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_MON_HW_UART1, UBX_MON_HW, UBX_CLASS_MON, 0, "UBX_MON_HW", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_MON_HW2_UART1, UBX_MON_HW2, UBX_CLASS_MON, 0, "UBX_MON_HW2", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_MON_HW3_UART1, UBX_MON_HW3, UBX_CLASS_MON, 0, "UBX_MON_HW3", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_MON_IO_UART1, UBX_MON_IO, UBX_CLASS_MON, 0, "UBX_MON_IO", 0, 112, 120}, - - {UBLOX_CFG_MSGOUT_UBX_MON_MSGPP_UART1, UBX_MON_MSGPP, UBX_CLASS_MON, 0, "UBX_MON_MSGPP", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_MON_RF_UART1, UBX_MON_RF, UBX_CLASS_MON, 0, "UBX_MON_RF", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_MON_RXBUF_UART1, UBX_MON_RXBUF, UBX_CLASS_MON, 0, "UBX_MON_RXBUF", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_MON_RXR_UART1, UBX_MON_RXR, UBX_CLASS_MON, 0, "UBX_MON_RXR", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_MON_SPAN_UART1, UBX_MON_SPAN, UBX_CLASS_MON, 0, "UBX_MON_SPAN", 0, 113, + {UBLOX_CFG_MSGOUT_UBX_MON_COMMS_UART1, UBX_MON_COMMS, UBX_CLASS_MON, 0, "MON_COMMS", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_MON_HW_UART1, UBX_MON_HW, UBX_CLASS_MON, 0, "MON_HW", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_MON_HW2_UART1, UBX_MON_HW2, UBX_CLASS_MON, 0, "MON_HW2", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_MON_HW3_UART1, UBX_MON_HW3, UBX_CLASS_MON, 0, "MON_HW3", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_MON_IO_UART1, UBX_MON_IO, UBX_CLASS_MON, 0, "MON_IO", 0, 112, 120}, + + {UBLOX_CFG_MSGOUT_UBX_MON_MSGPP_UART1, UBX_MON_MSGPP, UBX_CLASS_MON, 0, "MON_MSGPP", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_MON_RF_UART1, UBX_MON_RF, UBX_CLASS_MON, 0, "MON_RF", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_MON_RXBUF_UART1, UBX_MON_RXBUF, UBX_CLASS_MON, 0, "MON_RXBUF", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_MON_RXR_UART1, UBX_MON_RXR, UBX_CLASS_MON, 0, "MON_RXR", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_MON_SPAN_UART1, UBX_MON_SPAN, UBX_CLASS_MON, 0, "MON_SPAN", 0, 113, 120}, // Not supported F9P 112 - {UBLOX_CFG_MSGOUT_UBX_MON_SYS_UART1, UBX_MON_SYS, UBX_CLASS_MON, 0, "UBX_MON_SYS", 0, 9999, + {UBLOX_CFG_MSGOUT_UBX_MON_SYS_UART1, UBX_MON_SYS, UBX_CLASS_MON, 0, "MON_SYS", 0, 9999, 130}, // Not supported F9R 121, F9P 112, 113, 120, 130, 132 - {UBLOX_CFG_MSGOUT_UBX_MON_TXBUF_UART1, UBX_MON_TXBUF, UBX_CLASS_MON, 0, "UBX_MON_TXBUF", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_MON_TXBUF_UART1, UBX_MON_TXBUF, UBX_CLASS_MON, 0, "MON_TXBUF", 0, 112, 120}, // NAV2 // F9P not supported 112, 113, 120. Supported starting 130. F9P 130, 132 supports all but not EELL, PVAT, TIMENAVIC // F9R not supported 120. Supported starting 130. F9R 130 supports EELL, PVAT but not SVIN, TIMENAVIC. - {UBLOX_CFG_MSGOUT_UBX_NAV2_CLOCK_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_CLOCK", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_COV_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_COV", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_DOP_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_DOP", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_EELL_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_EELL", 0, 9999, + {UBLOX_CFG_MSGOUT_UBX_NAV2_CLOCK_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_CLOCK", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_COV_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_COV", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_DOP_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_DOP", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_EELL_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_EELL", 0, 9999, 130}, // Not supported F9P - {UBLOX_CFG_MSGOUT_UBX_NAV2_EOE_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_EOE", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_EOE_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_EOE", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_ODO_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_ODO", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_POSECEF_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_POSECEF", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_POSLLH_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_POSLLH", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_PVAT_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_PVAT", 0, 9999, + {UBLOX_CFG_MSGOUT_UBX_NAV2_ODO_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_ODO", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_POSECEF_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_POSECEF", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_POSLLH_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_POSLLH", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_PVAT_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_PVAT", 0, 9999, 130}, // Not supported F9P - {UBLOX_CFG_MSGOUT_UBX_NAV2_PVT_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_PVT", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_PVT_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_PVT", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_SAT_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_SAT", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_SBAS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_SBAS", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_SIG_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_SIG", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_SLAS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_SLAS", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_STATUS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_STATUS", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_SAT_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_SAT", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_SBAS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_SBAS", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_SIG_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_SIG", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_SLAS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_SLAS", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_STATUS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_STATUS", 0, 130, 130}, - //{UBLOX_CFG_MSGOUT_UBX_NAV2_SVIN_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_SVIN", 0, 9999, 9999}, + //{UBLOX_CFG_MSGOUT_UBX_NAV2_SVIN_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_SVIN", 0, 9999, 9999}, ////No support yet - {UBLOX_CFG_MSGOUT_UBX_NAV2_TIMEBDS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_TIMEBDS", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_TIMEGAL_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_TIMEGAL", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_TIMEGLO_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_TIMEGLO", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_TIMEGPS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_TIMEGPS", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_TIMEBDS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_TIMEBDS", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_TIMEGAL_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_TIMEGAL", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_TIMEGLO_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_TIMEGLO", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_TIMEGPS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_TIMEGPS", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_TIMELS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_TIMELS", 0, 130, 130}, - //{UBLOX_CFG_MSGOUT_UBX_NAV2_TIMENAVIC_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_TIMENAVIC", 0, 9999, + {UBLOX_CFG_MSGOUT_UBX_NAV2_TIMELS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_TIMELS", 0, 130, 130}, + //{UBLOX_CFG_MSGOUT_UBX_NAV2_TIMENAVIC_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_TIMENAVIC", 0, 9999, // 9999}, //No support yet - {UBLOX_CFG_MSGOUT_UBX_NAV2_TIMEQZSS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_TIMEQZSS", 0, 130, + {UBLOX_CFG_MSGOUT_UBX_NAV2_TIMEQZSS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_TIMEQZSS", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_TIMEUTC_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_TIMEUTC", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_VELECEF_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_VELECEF", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_TIMEUTC_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_TIMEUTC", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_VELECEF_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_VELECEF", 0, 130, 130}, - {UBLOX_CFG_MSGOUT_UBX_NAV2_VELNED_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV2_VELNED", 0, 130, 130}, + {UBLOX_CFG_MSGOUT_UBX_NAV2_VELNED_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV2_VELNED", 0, 130, 130}, // NAV - //{UBLOX_CFG_MSGOUT_UBX_NAV_AOPSTATUS_UART1, UBX_NAV_AOPSTATUS, UBX_CLASS_NAV, 0, "UBX_NAV_AOPSTATUS", 0, 9999, + //{UBLOX_CFG_MSGOUT_UBX_NAV_AOPSTATUS_UART1, UBX_NAV_AOPSTATUS, UBX_CLASS_NAV, 0, "NAV_AOPSTATUS", 0, 9999, // 9999}, //Not supported on F9R 121 or F9P 112, 113, 120, 130, 132 - {UBLOX_CFG_MSGOUT_UBX_NAV_ATT_UART1, UBX_NAV_ATT, UBX_CLASS_NAV, 0, "UBX_NAV_ATT", 0, 9999, + {UBLOX_CFG_MSGOUT_UBX_NAV_ATT_UART1, UBX_NAV_ATT, UBX_CLASS_NAV, 0, "NAV_ATT", 0, 9999, 120}, // Not supported on F9P 112, 113, 120, 130, 132 - {UBLOX_CFG_MSGOUT_UBX_NAV_CLOCK_UART1, UBX_NAV_CLOCK, UBX_CLASS_NAV, 0, "UBX_NAV_CLOCK", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_COV_UART1, UBX_NAV_COV, UBX_CLASS_NAV, 0, "UBX_NAV_COV", 0, 112, 120}, - //{UBLOX_CFG_MSGOUT_UBX_NAV_DGPS_UART1, UBX_NAV_DGPS, UBX_CLASS_NAV, 0, "UBX_NAV_DGPS", 0, 9999, 9999}, //Not + {UBLOX_CFG_MSGOUT_UBX_NAV_CLOCK_UART1, UBX_NAV_CLOCK, UBX_CLASS_NAV, 0, "NAV_CLOCK", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_COV_UART1, UBX_NAV_COV, UBX_CLASS_NAV, 0, "NAV_COV", 0, 112, 120}, + //{UBLOX_CFG_MSGOUT_UBX_NAV_DGPS_UART1, UBX_NAV_DGPS, UBX_CLASS_NAV, 0, "NAV_DGPS", 0, 9999, 9999}, //Not // supported on F9R 121 or F9P 112, 113, 120, 130, 132 - {UBLOX_CFG_MSGOUT_UBX_NAV_DOP_UART1, UBX_NAV_DOP, UBX_CLASS_NAV, 0, "UBX_NAV_DOP", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_DOP_UART1, UBX_NAV_DOP, UBX_CLASS_NAV, 0, "NAV_DOP", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_EELL_UART1, UBX_NAV_EELL, UBX_CLASS_NAV, 0, "UBX_NAV_EELL", 0, 9999, + {UBLOX_CFG_MSGOUT_UBX_NAV_EELL_UART1, UBX_NAV_EELL, UBX_CLASS_NAV, 0, "NAV_EELL", 0, 9999, 120}, // Not supported on F9P - {UBLOX_CFG_MSGOUT_UBX_NAV_EOE_UART1, UBX_NAV_EOE, UBX_CLASS_NAV, 0, "UBX_NAV_EOE", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_GEOFENCE_UART1, UBX_NAV_GEOFENCE, UBX_CLASS_NAV, 0, "UBX_NAV_GEOFENCE", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSECEF_UART1, UBX_NAV_HPPOSECEF, UBX_CLASS_NAV, 0, "UBX_NAV_HPPOSECEF", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSLLH_UART1, UBX_NAV_HPPOSLLH, UBX_CLASS_NAV, 0, "UBX_NAV_HPPOSLLH", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_EOE_UART1, UBX_NAV_EOE, UBX_CLASS_NAV, 0, "NAV_EOE", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_GEOFENCE_UART1, UBX_NAV_GEOFENCE, UBX_CLASS_NAV, 0, "NAV_GEOFENCE", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSECEF_UART1, UBX_NAV_HPPOSECEF, UBX_CLASS_NAV, 0, "NAV_HPPOSECEF", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSLLH_UART1, UBX_NAV_HPPOSLLH, UBX_CLASS_NAV, 0, "NAV_HPPOSLLH", 0, 112, 120}, - //{UBLOX_CFG_MSGOUT_UBX_NAV_NMI_UART1, UBX_NAV_NMI, UBX_CLASS_NAV, 0, "UBX_NAV_NMI", 0, 9999, 9999}, //Not supported + //{UBLOX_CFG_MSGOUT_UBX_NAV_NMI_UART1, UBX_NAV_NMI, UBX_CLASS_NAV, 0, "NAV_NMI", 0, 9999, 9999}, //Not supported // on F9R 121 or F9P 112, 113, 120, 130, 132 - {UBLOX_CFG_MSGOUT_UBX_NAV_ODO_UART1, UBX_NAV_ODO, UBX_CLASS_NAV, 0, "UBX_NAV_ODO", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_ORB_UART1, UBX_NAV_ORB, UBX_CLASS_NAV, 0, "UBX_NAV_ORB", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_PL_UART1, UBX_NAV_PL, UBX_CLASS_NAV, 0, "UBX_NAV_PL", 0, 9999, + {UBLOX_CFG_MSGOUT_UBX_NAV_ODO_UART1, UBX_NAV_ODO, UBX_CLASS_NAV, 0, "NAV_ODO", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_ORB_UART1, UBX_NAV_ORB, UBX_CLASS_NAV, 0, "NAV_ORB", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_PL_UART1, UBX_NAV_PL, UBX_CLASS_NAV, 0, "NAV_PL", 0, 9999, 130}, // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 - {UBLOX_CFG_MSGOUT_UBX_NAV_POSECEF_UART1, UBX_NAV_POSECEF, UBX_CLASS_NAV, 0, "UBX_NAV_POSECEF", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_POSECEF_UART1, UBX_NAV_POSECEF, UBX_CLASS_NAV, 0, "NAV_POSECEF", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_POSLLH_UART1, UBX_NAV_POSLLH, UBX_CLASS_NAV, 0, "UBX_NAV_POSLLH", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_PVAT_UART1, UBX_NAV_PVAT, UBX_CLASS_NAV, 0, "UBX_NAV_PVAT", 0, 9999, + {UBLOX_CFG_MSGOUT_UBX_NAV_POSLLH_UART1, UBX_NAV_POSLLH, UBX_CLASS_NAV, 0, "NAV_POSLLH", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_PVAT_UART1, UBX_NAV_PVAT, UBX_CLASS_NAV, 0, "NAV_PVAT", 0, 9999, 121}, // Not supported on F9P 112, 113, 120, 130, F9R 120 - {UBLOX_CFG_MSGOUT_UBX_NAV_PVT_UART1, UBX_NAV_PVT, UBX_CLASS_NAV, 0, "UBX_NAV_PVT", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_TIMEQZSS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "UBX_NAV_QZSS", 0, 113, + {UBLOX_CFG_MSGOUT_UBX_NAV_PVT_UART1, UBX_NAV_PVT, UBX_CLASS_NAV, 0, "NAV_PVT", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_TIMEQZSS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NAV, 0, "NAV_QZSS", 0, 113, 130}, // Not supported F9R 121 or F9P 112 - {UBLOX_CFG_MSGOUT_UBX_NAV_RELPOSNED_UART1, UBX_NAV_RELPOSNED, UBX_CLASS_NAV, 0, "UBX_NAV_RELPOSNED", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_SAT_UART1, UBX_NAV_SAT, UBX_CLASS_NAV, 0, "UBX_NAV_SAT", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_RELPOSNED_UART1, UBX_NAV_RELPOSNED, UBX_CLASS_NAV, 0, "NAV_RELPOSNED", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_SAT_UART1, UBX_NAV_SAT, UBX_CLASS_NAV, 0, "NAV_SAT", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_SBAS_UART1, UBX_NAV_SBAS, UBX_CLASS_NAV, 0, "UBX_NAV_SBAS", 0, 113, + {UBLOX_CFG_MSGOUT_UBX_NAV_SBAS_UART1, UBX_NAV_SBAS, UBX_CLASS_NAV, 0, "NAV_SBAS", 0, 113, 120}, // Not supported F9P 112 - {UBLOX_CFG_MSGOUT_UBX_NAV_SIG_UART1, UBX_NAV_SIG, UBX_CLASS_NAV, 0, "UBX_NAV_SIG", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_SLAS_UART1, UBX_NAV_SLAS, UBX_CLASS_NAV, 0, "UBX_NAV_SLAS", 0, 113, + {UBLOX_CFG_MSGOUT_UBX_NAV_SIG_UART1, UBX_NAV_SIG, UBX_CLASS_NAV, 0, "NAV_SIG", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_SLAS_UART1, UBX_NAV_SLAS, UBX_CLASS_NAV, 0, "NAV_SLAS", 0, 113, 130}, // Not supported F9R 121 or F9P 112 - //{UBLOX_CFG_MSGOUT_UBX_NAV_SOL_UART1, UBX_NAV_SOL, UBX_CLASS_NAV, 0, "UBX_NAV_SOL", 0, 9999, 9999}, //Not + //{UBLOX_CFG_MSGOUT_UBX_NAV_SOL_UART1, UBX_NAV_SOL, UBX_CLASS_NAV, 0, "NAV_SOL", 0, 9999, 9999}, //Not // supported F9R 121 or F9P 112, 113, 120, 130, 132 - {UBLOX_CFG_MSGOUT_UBX_NAV_STATUS_UART1, UBX_NAV_STATUS, UBX_CLASS_NAV, 0, "UBX_NAV_STATUS", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_SVIN_UART1, UBX_NAV_SVIN, UBX_CLASS_NAV, 0, "UBX_NAV_SVIN", 0, 112, + {UBLOX_CFG_MSGOUT_UBX_NAV_STATUS_UART1, UBX_NAV_STATUS, UBX_CLASS_NAV, 0, "NAV_STATUS", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_SVIN_UART1, UBX_NAV_SVIN, UBX_CLASS_NAV, 0, "NAV_SVIN", 0, 112, 9999}, // Not supported on F9R 120, 121, 130 - //{UBLOX_CFG_MSGOUT_UBX_NAV_SVINFO_UART1, UBX_NAV_SVINFO, UBX_CLASS_NAV, 0, "UBX_NAV_SVINFO", 0, 9999, 9999}, //Not + //{UBLOX_CFG_MSGOUT_UBX_NAV_SVINFO_UART1, UBX_NAV_SVINFO, UBX_CLASS_NAV, 0, "NAV_SVINFO", 0, 9999, 9999}, //Not // supported F9R 120 or F9P 112, 113, 120, 130, 132 - {UBLOX_CFG_MSGOUT_UBX_NAV_TIMEBDS_UART1, UBX_NAV_TIMEBDS, UBX_CLASS_NAV, 0, "UBX_NAV_TIMEBDS", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGAL_UART1, UBX_NAV_TIMEGAL, UBX_CLASS_NAV, 0, "UBX_NAV_TIMEGAL", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGLO_UART1, UBX_NAV_TIMEGLO, UBX_CLASS_NAV, 0, "UBX_NAV_TIMEGLO", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_TIMEBDS_UART1, UBX_NAV_TIMEBDS, UBX_CLASS_NAV, 0, "NAV_TIMEBDS", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGAL_UART1, UBX_NAV_TIMEGAL, UBX_CLASS_NAV, 0, "NAV_TIMEGAL", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGLO_UART1, UBX_NAV_TIMEGLO, UBX_CLASS_NAV, 0, "NAV_TIMEGLO", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGPS_UART1, UBX_NAV_TIMEGPS, UBX_CLASS_NAV, 0, "UBX_NAV_TIMEGPS", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_TIMELS_UART1, UBX_NAV_TIMELS, UBX_CLASS_NAV, 0, "UBX_NAV_TIMELS", 0, 112, 120}, - //{UBLOX_CFG_MSGOUT_UBX_NAV_TIMENAVIC_UART1, UBX_NAV_TIMENAVIC, UBX_CLASS_NAV, 0, "UBX_NAV_TIMENAVIC", 0, 9999, + {UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGPS_UART1, UBX_NAV_TIMEGPS, UBX_CLASS_NAV, 0, "NAV_TIMEGPS", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_TIMELS_UART1, UBX_NAV_TIMELS, UBX_CLASS_NAV, 0, "NAV_TIMELS", 0, 112, 120}, + //{UBLOX_CFG_MSGOUT_UBX_NAV_TIMENAVIC_UART1, UBX_NAV_TIMENAVIC, UBX_CLASS_NAV, 0, "NAV_TIMENAVIC", 0, 9999, // 9999}, //Not supported F9R 121 or F9P 132 - {UBLOX_CFG_MSGOUT_UBX_NAV_TIMEUTC_UART1, UBX_NAV_TIMEUTC, UBX_CLASS_NAV, 0, "UBX_NAV_TIMEUTC", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_VELECEF_UART1, UBX_NAV_VELECEF, UBX_CLASS_NAV, 0, "UBX_NAV_VELECEF", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_NAV_VELNED_UART1, UBX_NAV_VELNED, UBX_CLASS_NAV, 0, "UBX_NAV_VELNED", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_TIMEUTC_UART1, UBX_NAV_TIMEUTC, UBX_CLASS_NAV, 0, "NAV_TIMEUTC", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_VELECEF_UART1, UBX_NAV_VELECEF, UBX_CLASS_NAV, 0, "NAV_VELECEF", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_NAV_VELNED_UART1, UBX_NAV_VELNED, UBX_CLASS_NAV, 0, "NAV_VELNED", 0, 112, 120}, // NMEA NAV2 // F9P not supported 112, 113, 120. Supported starting 130. // F9R not supported 120. Supported starting 130. - {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_GGA_UART1, UBX_NMEA_GGA, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_GGA", + {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_GGA_UART1, UBX_NMEA_GGA, UBX_CLASS_NMEA, 0, "NMEANAV2_GGA", SFE_UBLOX_FILTER_NMEA_GGA, 130, 130}, - {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_GLL_UART1, UBX_NMEA_GLL, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_GLL", + {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_GLL_UART1, UBX_NMEA_GLL, UBX_CLASS_NMEA, 0, "NMEANAV2_GLL", SFE_UBLOX_FILTER_NMEA_GLL, 130, 130}, - {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_GNS_UART1, UBX_NMEA_GNS, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_GNS", + {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_GNS_UART1, UBX_NMEA_GNS, UBX_CLASS_NMEA, 0, "NMEANAV2_GNS", SFE_UBLOX_FILTER_NMEA_GNS, 130, 130}, - {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_GSA_UART1, UBX_NMEA_GSA, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_GSA", + {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_GSA_UART1, UBX_NMEA_GSA, UBX_CLASS_NMEA, 0, "NMEANAV2_GSA", SFE_UBLOX_FILTER_NMEA_GSA, 130, 130}, - {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_RMC_UART1, UBX_NMEA_RMC, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_RMC", + {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_RMC_UART1, UBX_NMEA_RMC, UBX_CLASS_NMEA, 0, "NMEANAV2_RMC", SFE_UBLOX_FILTER_NMEA_RMC, 130, 130}, - {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_VTG_UART1, UBX_NMEA_VTG, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_VTG", + {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_VTG_UART1, UBX_NMEA_VTG, UBX_CLASS_NMEA, 0, "NMEANAV2_VTG", SFE_UBLOX_FILTER_NMEA_VTG, 130, 130}, - {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_ZDA_UART1, UBX_NMEA_ZDA, UBX_CLASS_NMEA, 0, "UBX_NMEANAV2_ZDA", + {UBLOX_CFG_MSGOUT_NMEA_NAV2_ID_ZDA_UART1, UBX_NMEA_ZDA, UBX_CLASS_NMEA, 0, "NMEANAV2_ZDA", SFE_UBLOX_FILTER_NMEA_ZDA, 130, 130}, // NMEA - {UBLOX_CFG_MSGOUT_NMEA_ID_DTM_UART1, UBX_NMEA_DTM, UBX_CLASS_NMEA, 0, "UBX_NMEA_DTM", SFE_UBLOX_FILTER_NMEA_DTM, + {UBLOX_CFG_MSGOUT_NMEA_ID_DTM_UART1, UBX_NMEA_DTM, UBX_CLASS_NMEA, 0, "NMEA_DTM", SFE_UBLOX_FILTER_NMEA_DTM, 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_GBS_UART1, UBX_NMEA_GBS, UBX_CLASS_NMEA, 0, "UBX_NMEA_GBS", SFE_UBLOX_FILTER_NMEA_GBS, + {UBLOX_CFG_MSGOUT_NMEA_ID_GBS_UART1, UBX_NMEA_GBS, UBX_CLASS_NMEA, 0, "NMEA_GBS", SFE_UBLOX_FILTER_NMEA_GBS, 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_GGA_UART1, UBX_NMEA_GGA, UBX_CLASS_NMEA, 1, "UBX_NMEA_GGA", SFE_UBLOX_FILTER_NMEA_GGA, + {UBLOX_CFG_MSGOUT_NMEA_ID_GGA_UART1, UBX_NMEA_GGA, UBX_CLASS_NMEA, 1, "NMEA_GGA", SFE_UBLOX_FILTER_NMEA_GGA, 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_GLL_UART1, UBX_NMEA_GLL, UBX_CLASS_NMEA, 0, "UBX_NMEA_GLL", SFE_UBLOX_FILTER_NMEA_GLL, + {UBLOX_CFG_MSGOUT_NMEA_ID_GLL_UART1, UBX_NMEA_GLL, UBX_CLASS_NMEA, 0, "NMEA_GLL", SFE_UBLOX_FILTER_NMEA_GLL, 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_GNS_UART1, UBX_NMEA_GNS, UBX_CLASS_NMEA, 0, "UBX_NMEA_GNS", SFE_UBLOX_FILTER_NMEA_GNS, + {UBLOX_CFG_MSGOUT_NMEA_ID_GNS_UART1, UBX_NMEA_GNS, UBX_CLASS_NMEA, 0, "NMEA_GNS", SFE_UBLOX_FILTER_NMEA_GNS, 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_GRS_UART1, UBX_NMEA_GRS, UBX_CLASS_NMEA, 0, "UBX_NMEA_GRS", SFE_UBLOX_FILTER_NMEA_GRS, + {UBLOX_CFG_MSGOUT_NMEA_ID_GRS_UART1, UBX_NMEA_GRS, UBX_CLASS_NMEA, 0, "NMEA_GRS", SFE_UBLOX_FILTER_NMEA_GRS, 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_GSA_UART1, UBX_NMEA_GSA, UBX_CLASS_NMEA, 1, "UBX_NMEA_GSA", SFE_UBLOX_FILTER_NMEA_GSA, + {UBLOX_CFG_MSGOUT_NMEA_ID_GSA_UART1, UBX_NMEA_GSA, UBX_CLASS_NMEA, 1, "NMEA_GSA", SFE_UBLOX_FILTER_NMEA_GSA, 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_GST_UART1, UBX_NMEA_GST, UBX_CLASS_NMEA, 1, "UBX_NMEA_GST", SFE_UBLOX_FILTER_NMEA_GST, + {UBLOX_CFG_MSGOUT_NMEA_ID_GST_UART1, UBX_NMEA_GST, UBX_CLASS_NMEA, 1, "NMEA_GST", SFE_UBLOX_FILTER_NMEA_GST, 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_GSV_UART1, UBX_NMEA_GSV, UBX_CLASS_NMEA, 4, "UBX_NMEA_GSV", SFE_UBLOX_FILTER_NMEA_GSV, + {UBLOX_CFG_MSGOUT_NMEA_ID_GSV_UART1, UBX_NMEA_GSV, UBX_CLASS_NMEA, 4, "NMEA_GSV", SFE_UBLOX_FILTER_NMEA_GSV, 112, 120}, // Default to 1 update every 4 fixes - {UBLOX_CFG_MSGOUT_NMEA_ID_RLM_UART1, UBX_NMEA_RLM, UBX_CLASS_NMEA, 0, "UBX_NMEA_RLM", SFE_UBLOX_FILTER_NMEA_RLM, + {UBLOX_CFG_MSGOUT_NMEA_ID_RLM_UART1, UBX_NMEA_RLM, UBX_CLASS_NMEA, 0, "NMEA_RLM", SFE_UBLOX_FILTER_NMEA_RLM, 113, 120}, // No F9P 112 support - {UBLOX_CFG_MSGOUT_NMEA_ID_RMC_UART1, UBX_NMEA_RMC, UBX_CLASS_NMEA, 1, "UBX_NMEA_RMC", SFE_UBLOX_FILTER_NMEA_RMC, + {UBLOX_CFG_MSGOUT_NMEA_ID_RMC_UART1, UBX_NMEA_RMC, UBX_CLASS_NMEA, 1, "NMEA_RMC", SFE_UBLOX_FILTER_NMEA_RMC, 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_THS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NMEA, 0, "UBX_NMEA_THS", + {UBLOX_CFG_MSGOUT_NMEA_ID_THS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_NMEA, 0, "NMEA_THS", SFE_UBLOX_FILTER_NMEA_THS, 9999, 120}, // Not supported F9P 112, 113, 120, 130, 132 - {UBLOX_CFG_MSGOUT_NMEA_ID_VLW_UART1, UBX_NMEA_VLW, UBX_CLASS_NMEA, 0, "UBX_NMEA_VLW", SFE_UBLOX_FILTER_NMEA_VLW, + {UBLOX_CFG_MSGOUT_NMEA_ID_VLW_UART1, UBX_NMEA_VLW, UBX_CLASS_NMEA, 0, "NMEA_VLW", SFE_UBLOX_FILTER_NMEA_VLW, 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_VTG_UART1, UBX_NMEA_VTG, UBX_CLASS_NMEA, 0, "UBX_NMEA_VTG", SFE_UBLOX_FILTER_NMEA_VTG, + {UBLOX_CFG_MSGOUT_NMEA_ID_VTG_UART1, UBX_NMEA_VTG, UBX_CLASS_NMEA, 0, "NMEA_VTG", SFE_UBLOX_FILTER_NMEA_VTG, 112, 120}, - {UBLOX_CFG_MSGOUT_NMEA_ID_ZDA_UART1, UBX_NMEA_ZDA, UBX_CLASS_NMEA, 0, "UBX_NMEA_ZDA", SFE_UBLOX_FILTER_NMEA_ZDA, + {UBLOX_CFG_MSGOUT_NMEA_ID_ZDA_UART1, UBX_NMEA_ZDA, UBX_CLASS_NMEA, 0, "NMEA_ZDA", SFE_UBLOX_FILTER_NMEA_ZDA, 112, 120}, // PUBX // F9P support 130 - {UBLOX_CFG_MSGOUT_PUBX_ID_POLYP_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_PUBX, 0, "UBX_PUBX_POLYP", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_PUBX_ID_POLYS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_PUBX, 0, "UBX_PUBX_POLYS", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_PUBX_ID_POLYT_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_PUBX, 0, "UBX_PUBX_POLYT", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_PUBX_ID_POLYP_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_PUBX, 0, "PUBX_POLYP", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_PUBX_ID_POLYS_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_PUBX, 0, "PUBX_POLYS", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_PUBX_ID_POLYT_UART1, UBX_ID_NOT_AVAILABLE, UBX_CLASS_PUBX, 0, "PUBX_POLYT", 0, 112, 120}, // RTCM - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1005_UART1, UBX_RTCM_1005, UBX_RTCM_MSB, 1, "UBX_RTCM_1005", + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1005_UART1, UBX_RTCM_1005, UBX_RTCM_MSB, 1, "RTCM_1005", SFE_UBLOX_FILTER_RTCM_TYPE1005, 112, 9999}, // Not supported on F9R - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1074_UART1, UBX_RTCM_1074, UBX_RTCM_MSB, 1, "UBX_RTCM_1074", + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1074_UART1, UBX_RTCM_1074, UBX_RTCM_MSB, 1, "RTCM_1074", SFE_UBLOX_FILTER_RTCM_TYPE1074, 112, 9999}, - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1077_UART1, UBX_RTCM_1077, UBX_RTCM_MSB, 0, "UBX_RTCM_1077", + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1077_UART1, UBX_RTCM_1077, UBX_RTCM_MSB, 0, "RTCM_1077", SFE_UBLOX_FILTER_RTCM_TYPE1077, 112, 9999}, - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1084_UART1, UBX_RTCM_1084, UBX_RTCM_MSB, 1, "UBX_RTCM_1084", + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1084_UART1, UBX_RTCM_1084, UBX_RTCM_MSB, 1, "RTCM_1084", SFE_UBLOX_FILTER_RTCM_TYPE1084, 112, 9999}, - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1087_UART1, UBX_RTCM_1087, UBX_RTCM_MSB, 0, "UBX_RTCM_1087", + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1087_UART1, UBX_RTCM_1087, UBX_RTCM_MSB, 0, "RTCM_1087", SFE_UBLOX_FILTER_RTCM_TYPE1087, 112, 9999}, - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1094_UART1, UBX_RTCM_1094, UBX_RTCM_MSB, 1, "UBX_RTCM_1094", + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1094_UART1, UBX_RTCM_1094, UBX_RTCM_MSB, 1, "RTCM_1094", SFE_UBLOX_FILTER_RTCM_TYPE1094, 112, 9999}, - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1097_UART1, UBX_RTCM_1097, UBX_RTCM_MSB, 0, "UBX_RTCM_1097", + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1097_UART1, UBX_RTCM_1097, UBX_RTCM_MSB, 0, "RTCM_1097", SFE_UBLOX_FILTER_RTCM_TYPE1097, 112, 9999}, - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1124_UART1, UBX_RTCM_1124, UBX_RTCM_MSB, 1, "UBX_RTCM_1124", + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1124_UART1, UBX_RTCM_1124, UBX_RTCM_MSB, 1, "RTCM_1124", SFE_UBLOX_FILTER_RTCM_TYPE1124, 112, 9999}, - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1127_UART1, UBX_RTCM_1127, UBX_RTCM_MSB, 0, "UBX_RTCM_1127", + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1127_UART1, UBX_RTCM_1127, UBX_RTCM_MSB, 0, "RTCM_1127", SFE_UBLOX_FILTER_RTCM_TYPE1127, 112, 9999}, - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1230_UART1, UBX_RTCM_1230, UBX_RTCM_MSB, 10, "UBX_RTCM_1230", + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1230_UART1, UBX_RTCM_1230, UBX_RTCM_MSB, 10, "RTCM_1230", SFE_UBLOX_FILTER_RTCM_TYPE1230, 112, 9999}, - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_0_UART1, UBX_RTCM_4072_0, UBX_RTCM_MSB, 0, "UBX_RTCM_4072_0", + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_0_UART1, UBX_RTCM_4072_0, UBX_RTCM_MSB, 0, "RTCM_4072_0", SFE_UBLOX_FILTER_RTCM_TYPE4072_0, 112, 9999}, - {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_1_UART1, UBX_RTCM_4072_1, UBX_RTCM_MSB, 0, "UBX_RTCM_4072_1", + {UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_1_UART1, UBX_RTCM_4072_1, UBX_RTCM_MSB, 0, "RTCM_4072_1", SFE_UBLOX_FILTER_RTCM_TYPE4072_1, 112, 9999}, // RXM - //{UBLOX_CFG_MSGOUT_UBX_RXM_ALM_UART1, UBX_RXM_ALM, UBX_CLASS_RXM, 0, "UBX_RXM_ALM", 0, 9999, 9999}, //Not supported + //{UBLOX_CFG_MSGOUT_UBX_RXM_ALM_UART1, UBX_RXM_ALM, UBX_CLASS_RXM, 0, "RXM_ALM", 0, 9999, 9999}, //Not supported // F9R 121 or F9P 112, 113, 120, 130, 132 - {UBLOX_CFG_MSGOUT_UBX_RXM_COR_UART1, UBX_RXM_COR, UBX_CLASS_RXM, 0, "UBX_RXM_COR", 0, 9999, + {UBLOX_CFG_MSGOUT_UBX_RXM_COR_UART1, UBX_RXM_COR, UBX_CLASS_RXM, 0, "RXM_COR", 0, 9999, 130}, // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 - //{UBLOX_CFG_MSGOUT_UBX_RXM_EPH_UART1, UBX_RXM_EPH, UBX_CLASS_RXM, 0, "UBX_RXM_EPH", 0, 9999, 9999}, + //{UBLOX_CFG_MSGOUT_UBX_RXM_EPH_UART1, UBX_RXM_EPH, UBX_CLASS_RXM, 0, "RXM_EPH", 0, 9999, 9999}, // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 - //{UBLOX_CFG_MSGOUT_UBX_RXM_IMES_UART1, UBX_RXM_IMES, UBX_CLASS_RXM, 0, "UBX_RXM_IMES", 0, 9999, 9999}, + //{UBLOX_CFG_MSGOUT_UBX_RXM_IMES_UART1, UBX_RXM_IMES, UBX_CLASS_RXM, 0, "RXM_IMES", 0, 9999, 9999}, // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 - //{UBLOX_CFG_MSGOUT_UBX_RXM_MEAS20_UART1, UBX_RXM_MEAS20, UBX_CLASS_RXM, 0, "UBX_RXM_MEAS20", 0, 9999, 9999}, + //{UBLOX_CFG_MSGOUT_UBX_RXM_MEAS20_UART1, UBX_RXM_MEAS20, UBX_CLASS_RXM, 0, "RXM_MEAS20", 0, 9999, 9999}, // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 - //{UBLOX_CFG_MSGOUT_UBX_RXM_MEAS50_UART1, UBX_RXM_MEAS50, UBX_CLASS_RXM, 0, "UBX_RXM_MEAS50", 0, 9999, 9999}, + //{UBLOX_CFG_MSGOUT_UBX_RXM_MEAS50_UART1, UBX_RXM_MEAS50, UBX_CLASS_RXM, 0, "RXM_MEAS50", 0, 9999, 9999}, // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 - //{UBLOX_CFG_MSGOUT_UBX_RXM_MEASC12_UART1, UBX_RXM_MEASC12, UBX_CLASS_RXM, 0, "UBX_RXM_MEASC12", 0, 9999, 9999}, + //{UBLOX_CFG_MSGOUT_UBX_RXM_MEASC12_UART1, UBX_RXM_MEASC12, UBX_CLASS_RXM, 0, "RXM_MEASC12", 0, 9999, 9999}, // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 - //{UBLOX_CFG_MSGOUT_UBX_RXM_MEASD12_UART1, UBX_RXM_MEASD12, UBX_CLASS_RXM, 0, "UBX_RXM_MEASD12", 0, 9999, 9999}, + //{UBLOX_CFG_MSGOUT_UBX_RXM_MEASD12_UART1, UBX_RXM_MEASD12, UBX_CLASS_RXM, 0, "RXM_MEASD12", 0, 9999, 9999}, // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 - {UBLOX_CFG_MSGOUT_UBX_RXM_MEASX_UART1, UBX_RXM_MEASX, UBX_CLASS_RXM, 0, "UBX_RXM_MEASX", 0, 112, 120}, - //{UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART1, UBX_RXM_PMP, UBX_CLASS_RXM, 0, "UBX_RXM_PMP", 0, 9999, 9999}, + {UBLOX_CFG_MSGOUT_UBX_RXM_MEASX_UART1, UBX_RXM_MEASX, UBX_CLASS_RXM, 0, "RXM_MEASX", 0, 112, 120}, + //{UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART1, UBX_RXM_PMP, UBX_CLASS_RXM, 0, "RXM_PMP", 0, 9999, 9999}, // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 - //{UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_UART1, UBX_RXM_QZSSL6, UBX_CLASS_RXM, 0, "UBX_RXM_QZSSL6", 0, 9999, 9999}, + //{UBLOX_CFG_MSGOUT_UBX_RXM_QZSSL6_UART1, UBX_RXM_QZSSL6, UBX_CLASS_RXM, 0, "RXM_QZSSL6", 0, 9999, 9999}, // Not supported F9R 121, F9P 112, 113, 120, 130 - {UBLOX_CFG_MSGOUT_UBX_RXM_RAWX_UART1, UBX_RXM_RAWX, UBX_CLASS_RXM, 0, "UBX_RXM_RAWX", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_RXM_RLM_UART1, UBX_RXM_RLM, UBX_CLASS_RXM, 0, "UBX_RXM_RLM", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_RXM_RTCM_UART1, UBX_RXM_RTCM, UBX_CLASS_RXM, 0, "UBX_RXM_RTCM", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_RXM_SFRBX_UART1, UBX_RXM_SFRBX, UBX_CLASS_RXM, 0, "UBX_RXM_SFRBX", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_RXM_SPARTN_UART1, UBX_RXM_SPARTN, UBX_CLASS_RXM, 0, "UBX_RXM_SPARTN", 0, 9999, + {UBLOX_CFG_MSGOUT_UBX_RXM_RAWX_UART1, UBX_RXM_RAWX, UBX_CLASS_RXM, 0, "RXM_RAWX", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_RXM_RLM_UART1, UBX_RXM_RLM, UBX_CLASS_RXM, 0, "RXM_RLM", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_RXM_RTCM_UART1, UBX_RXM_RTCM, UBX_CLASS_RXM, 0, "RXM_RTCM", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_RXM_SFRBX_UART1, UBX_RXM_SFRBX, UBX_CLASS_RXM, 0, "RXM_SFRBX", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_RXM_SPARTN_UART1, UBX_RXM_SPARTN, UBX_CLASS_RXM, 0, "RXM_SPARTN", 0, 9999, 121}, // Not supported F9R 120 or F9P 112, 113, 120, 130 - //{UBLOX_CFG_MSGOUT_UBX_RXM_SVSI_UART1, UBX_RXM_SVSI, UBX_CLASS_RXM, 0, "UBX_RXM_SVSI", 0, 9999, 9999}, + //{UBLOX_CFG_MSGOUT_UBX_RXM_SVSI_UART1, UBX_RXM_SVSI, UBX_CLASS_RXM, 0, "RXM_SVSI", 0, 9999, 9999}, // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 - //{UBLOX_CFG_MSGOUT_UBX_RXM_TM_UART1, UBX_RXM_TM, UBX_CLASS_RXM, 0, "UBX_RXM_TM", 0, 9999, 9999}, + //{UBLOX_CFG_MSGOUT_UBX_RXM_TM_UART1, UBX_RXM_TM, UBX_CLASS_RXM, 0, "RXM_TM", 0, 9999, 9999}, // Not supported F9R 121 or F9P 112, 113, 120, 130, 132 // SEC // No support F9P 112. // TIM - //{UBLOX_CFG_MSGOUT_UBX_TIM_SVIN_UART1, UBX_TIM_SVIN, UBX_CLASS_TIM, 0, "UBX_TIM_SVIN", 0, 9999, 9999}, //Appears on + //{UBLOX_CFG_MSGOUT_UBX_TIM_SVIN_UART1, UBX_TIM_SVIN, UBX_CLASS_TIM, 0, "TIM_SVIN", 0, 9999, 9999}, //Appears on // F9P 132 but not supported - {UBLOX_CFG_MSGOUT_UBX_TIM_TM2_UART1, UBX_TIM_TM2, UBX_CLASS_TIM, 0, "UBX_TIM_TM2", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_TIM_TP_UART1, UBX_TIM_TP, UBX_CLASS_TIM, 0, "UBX_TIM_TP", 0, 112, 120}, - {UBLOX_CFG_MSGOUT_UBX_TIM_VRFY_UART1, UBX_TIM_VRFY, UBX_CLASS_TIM, 0, "UBX_TIM_VRFY", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_TIM_TM2_UART1, UBX_TIM_TM2, UBX_CLASS_TIM, 0, "TIM_TM2", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_TIM_TP_UART1, UBX_TIM_TP, UBX_CLASS_TIM, 0, "TIM_TP", 0, 112, 120}, + {UBLOX_CFG_MSGOUT_UBX_TIM_VRFY_UART1, UBX_TIM_VRFY, UBX_CLASS_TIM, 0, "TIM_VRFY", 0, 112, 120}, }; #define MAX_UBX_MSG (sizeof(ubxMessages) / sizeof(ubxMsg)) @@ -1777,7 +1777,7 @@ const RTK_Settings_Entry rtkSettingsEntries[] = // S t s x k 2 c h Type Qual Variable Name // UBX (SX1276) - { 0, 1, 1, 0, 1, 1, 0, 0, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, + { 0, 1, 1, 0, 1, 1, 0, 0, _bool, 0, & settings.enableUART2UBXIn, "enableUART2In", }, { 1, 1, 1, 1, 1, 1, 0, 0, tUbxConst, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "Constellation_", }, { 1, 0, 1, 1, 1, 1, 0, 0, tUbxMsgRt, MAX_UBX_MSG, & settings.ubxMessageRates[0], "MessageRate_", }, { 1, 0, 1, 1, 1, 1, 0, 0, tUbMsgRtb, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "MessageRateBase_", }, @@ -1806,10 +1806,10 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { 0, 1, 1, 0, 0, 0, 0, 1, _bool, 0, & settings.enableImuDebug, "enableImuDebug", }, { 0, 1, 1, 0, 0, 0, 0, 1, _bool, 0, & settings.enableTiltCompensation, "enableTiltCompensation", }, { 0, 1, 1, 0, 0, 0, 0, 1, _float, 3, & settings.tiltPoleLength, "tiltPoleLength", }, - { 0, 1, 1, 1, 0, 0, 0, 1, tUmConst, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "um980Constellations_", }, - { 0, 0, 1, 1, 0, 0, 0, 1, tUmMRNmea, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "um980MessageRatesNMEA_", }, - { 0, 0, 1, 1, 0, 0, 0, 1, tUmMRBaRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "um980MessageRatesRTCMBase_", }, - { 0, 0, 1, 1, 0, 0, 0, 1, tUmMRRvRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "um980MessageRatesRTCMRover_", }, + { 0, 1, 1, 1, 0, 0, 0, 1, tUmConst, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "Constellations_", }, + { 0, 0, 1, 1, 0, 0, 0, 1, tUmMRNmea, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "MessageRatesNMEA_", }, + { 0, 0, 1, 1, 0, 0, 0, 1, tUmMRBaRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "MessageRatesRTCMBase_", }, + { 0, 0, 1, 1, 0, 0, 0, 1, tUmMRRvRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "MessageRatesRTCMRover_", }, // Web Server { 0, 1, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.httpPort, "httpPort", }, From 64264aaa2d6ac9bd55487a7cdfb889660ced5380 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Tue, 21 May 2024 14:34:20 -0600 Subject: [PATCH 078/358] Update settings for various platforms Torch doesn't have logging. EVK doesn't have battery. Facet doesn't have beeper. Torch doesn't have external event trigger input. Facet and Facet mosaic has PPS output. The Torch button can be disabled. Fix SX1276 typo. --- Firmware/RTK_Everywhere/settings.h | 46 ++++++++++++++++-------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 3e4b89413..a164191ad 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1425,8 +1425,8 @@ const RTK_Settings_Entry rtkSettingsEntries[] = // Antenna { 0, 1, 1, 0, 1, 1, 1, 1, _int16_t, 0, & settings.antennaHeight, "antennaHeight", }, { 0, 1, 1, 0, 1, 1, 1, 1, _float, 2, & settings.antennaReferencePoint, "antennaReferencePoint" }, - { 0, 1, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", }, - { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enableARPLogging, "enableARPLogging", }, + { 0, 1, 1, 0, 1, 1, 1, 0, _uint16_t, 0, & settings.ARPLoggingInterval_s, "ARPLoggingInterval", }, + { 0, 1, 1, 0, 1, 1, 1, 0, _bool, 0, & settings.enableARPLogging, "enableARPLogging", }, // Base operation { 0, 1, 1, 0, 1, 1, 1, 1, tCoordInp, 0, & settings.coordinateInputType, "coordinateInputType", }, @@ -1443,8 +1443,8 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { 1, 1, 1, 0, 1, 1, 1, 1, _float, 1, & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", }, // Battery - { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", }, - { 0, 1, 1, 0, 1, 1, 1, 1, _uint32_t, 0, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", }, + { 0, 1, 1, 0, 0, 1, 1, 1, _bool, 0, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", }, + { 0, 1, 1, 0, 0, 1, 1, 1, _uint32_t, 0, & settings.shutdownNoChargeTimeout_s, "shutdownNoChargeTimeout", }, // F // a @@ -1460,7 +1460,7 @@ const RTK_Settings_Entry rtkSettingsEntries[] = // S t s x k 2 c h Type Qual Variable Name // Beeper - { 0, 1, 1, 0, 0, 0, 1, 1, _bool, 0, & settings.enableBeeper, "enableBeeper", }, + { 0, 1, 1, 0, 0, 0, 0, 1, _bool, 0, & settings.enableBeeper, "enableBeeper", }, // Bluetooth { 0, 1, 1, 0, 1, 1, 1, 1, tBtRadio, 0, & settings.bluetoothRadioType, "bluetoothRadioType", }, @@ -1485,6 +1485,9 @@ const RTK_Settings_Entry rtkSettingsEntries[] = // S g d i v V i c // S t s x k 2 c h Type Qual Variable Name + // Data Port Multiplexer + { 0, 1, 1, 0, 0, 1, 1, 0, tMuxConn, 0, & settings.dataPortChannel, "dataPortChannel", }, + // Display { 0, 1, 1, 0, 1, 1, 1, 0, _bool, 0, & settings.enableResetDisplay, "enableResetDisplay", }, @@ -1525,8 +1528,15 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { 0, 1, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.serialGNSSRxFullThreshold, "serialGNSSRxFullThreshold", }, { 0, 1, 1, 0, 1, 1, 1, 1, _int, 0, & settings.uartReceiveBufferSize, "uartReceiveBufferSize", }, + // GNSS Receiver + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugGnss, "debugGnss", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintPosition, "enablePrintPosition", }, + { 1, 0, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.measurementRateMs, "measurementRateMs", }, + { 1, 0, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.navigationRate, "navigationRate", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.updateGNSSSettings, "updateGNSSSettings", }, + // Hardware - { 1, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", }, + { 1, 1, 1, 0, 1, 1, 1, 0, _bool, 0, & settings.enableExternalHardwareEventLogging, "enableExternalHardwareEventLogging", }, { 0, 1, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.spiFrequency, "spiFrequency", }, // F @@ -1672,19 +1682,11 @@ const RTK_Settings_Entry rtkSettingsEntries[] = // S g d i v V i c // S t s x k 2 c h Type Qual Variable Name - // Pulse - { 1, 1, 1, 0, 1, 0, 0, 0, _bool, 0, & settings.enableExternalPulse, "enableExternalPulse", }, - { 1, 1, 1, 0, 1, 0, 0, 0, _uint64_t, 0, & settings.externalPulseLength_us, "externalPulseLength", }, - { 1, 1, 1, 0, 1, 0, 0, 0, tPulseEdg, 0, & settings.externalPulsePolarity, "externalPulsePolarity", }, - { 1, 1, 1, 0, 1, 0, 0, 0, _uint64_t, 0, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", }, - - // Radio - { 0, 1, 1, 0, 1, 1, 1, 1, tMuxConn, 0, & settings.dataPortChannel, "dataPortChannel", }, - { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugGnss, "debugGnss", }, - { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintPosition, "enablePrintPosition", }, - { 1, 0, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.measurementRateMs, "measurementRateMs", }, - { 1, 0, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.navigationRate, "navigationRate", }, - { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.updateGNSSSettings, "updateGNSSSettings", }, + // Pulse Per Second + { 1, 1, 1, 0, 1, 1, 1, 0, _bool, 0, & settings.enableExternalPulse, "enableExternalPulse", }, + { 1, 1, 1, 0, 1, 1, 1, 0, _uint64_t, 0, & settings.externalPulseLength_us, "externalPulseLength", }, + { 1, 1, 1, 0, 1, 1, 1, 0, tPulseEdg, 0, & settings.externalPulsePolarity, "externalPulsePolarity", }, + { 1, 1, 1, 0, 1, 1, 1, 0, _uint64_t, 0, & settings.externalPulseTimeBetweenPulse_us, "externalPulseTimeBetweenPulse", }, // Ring Buffer { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintRingBufferOffsets, "enablePrintRingBufferOffsets", }, @@ -1739,7 +1741,7 @@ const RTK_Settings_Entry rtkSettingsEntries[] = // S t s x k 2 c h Type Qual Variable Name // Setup Button - { 0, 1, 1, 0, 1, 1, 1, 0, _bool, 0, & settings.disableSetupButton, "disableSetupButton", }, + { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.disableSetupButton, "disableSetupButton", }, // State { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.enablePrintDuplicateStates, "enablePrintDuplicateStates", }, @@ -1776,7 +1778,7 @@ const RTK_Settings_Entry rtkSettingsEntries[] = // S g d i v V i c // S t s x k 2 c h Type Qual Variable Name - // UBX (SX1276) + // ublox GNSS Receiver { 0, 1, 1, 0, 1, 1, 0, 0, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, { 1, 1, 1, 1, 1, 1, 0, 0, tUbxConst, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "Constellation_", }, { 1, 0, 1, 1, 1, 1, 0, 0, tUbxMsgRt, MAX_UBX_MSG, & settings.ubxMessageRates[0], "MessageRate_", }, @@ -1800,7 +1802,7 @@ const RTK_Settings_Entry rtkSettingsEntries[] = // S g d i v V i c // S t s x k 2 c h Type Qual Variable Name - // UM980 + // UM980 GNSS Receiver { 0, 1, 1, 0, 0, 0, 0, 1, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", }, { 0, 1, 1, 0, 0, 0, 0, 1, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", }, { 0, 1, 1, 0, 0, 0, 0, 1, _bool, 0, & settings.enableImuDebug, "enableImuDebug", }, From 48ceeb95fa093c7de5fb6e27321cf265535f87e0 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Tue, 21 May 2024 16:32:38 -0600 Subject: [PATCH 079/358] CLI: Add quote and escape character checking --- .../CommandLineStructure.ino | 239 +++++++++++------- .../CommandLineStructure/Other.ino | 33 ++- 2 files changed, 173 insertions(+), 99 deletions(-) diff --git a/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino b/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino index e59379cd8..4d354f68a 100644 --- a/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino +++ b/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino @@ -2,126 +2,192 @@ Demonstration of the command line interface as specified by Avinan Malla */ -int pin_UART1_TX = 4; -int pin_UART1_RX = 13; - -const uint16_t bufferLen = 1024; -char cmdBuffer[bufferLen]; +typedef enum +{ + GET_SETTING_UNKNOWN = 0, + GET_SETTING_KNOWN, + GET_SETTING_KNOWN_STRING, +} GetSettingValueResponse; void setup() { Serial.begin(115200); + while (!Serial); delay(250); Serial.println(); Serial.println("SparkFun Command Line Interface Tests"); + const uint16_t bufferLen = 1024; + char cmdBuffer[bufferLen]; + sprintf(cmdBuffer, "$CMD*4A"); //Bad command - Serial.printf("command: %s (BAD) - ", cmdBuffer); - commandParser(); + Serial.printf("command: %s (Unknown command) - ", cmdBuffer); + commandParser(cmdBuffer); sprintf(cmdBuffer, "$SPCMD*AA"); //Bad checksum - Serial.printf("command: %s (BAD) - ", cmdBuffer); - commandParser(); + Serial.printf("command: %s (Bad checksum) - ", cmdBuffer); + commandParser(cmdBuffer); sprintf(cmdBuffer, "$SPCMD*49"); //Valid command - Serial.printf("command: %s (GOOD) - ", cmdBuffer); - commandParser(); + Serial.printf("command: %s (Valid) - ", cmdBuffer); + commandParser(cmdBuffer); Serial.println(); - sprintf(cmdBuffer, "$SPGET,elvMask,15*1A"); //Bad command - Serial.printf("command: %s (BAD) - ", cmdBuffer); - commandParser(); + sprintf(cmdBuffer, "$SPGET,elvMask,15*1A"); //Too many arguments + Serial.printf("command: %s (Too many arguments) - ", cmdBuffer); + commandParser(cmdBuffer); sprintf(cmdBuffer, "$SPGET*55"); //Bad command - Serial.printf("command: %s (BAD) - ", cmdBuffer); - commandParser(); + Serial.printf("command: %s (Missing command) - ", cmdBuffer); + commandParser(cmdBuffer); - sprintf(cmdBuffer, "$SPGET,maxHeight*0F"); //Unknown setting - Serial.printf("command: %s (BAD) - ", cmdBuffer); - commandParser(); + sprintf(cmdBuffer, "$SPGET,maxHeight*32"); //Unknown setting + Serial.printf("command: %s (Unknown setting) - ", cmdBuffer); + commandParser(cmdBuffer); sprintf(cmdBuffer, "$SPGET,elvMask*32"); //Valid command - Serial.printf("command: %s (GOOD) - ", cmdBuffer); - commandParser(); + Serial.printf("command: %s (Valid) - ", cmdBuffer); + commandParser(cmdBuffer); Serial.println(); sprintf(cmdBuffer, "$SPSET,elvMask*26"); //Incorrect number of arguments - Serial.printf("command: %s (BAD) - ", cmdBuffer); - commandParser(); + Serial.printf("command: %s (Wrong number of arguments) - ", cmdBuffer); + commandParser(cmdBuffer); + + sprintf(cmdBuffer, "$SPSET,maxHeight,15*0E"); //Unknown setting + Serial.printf("command: %s (Unknown setting) - ", cmdBuffer); + commandParser(cmdBuffer); - sprintf(cmdBuffer, "$SPSET,maxHeight,15*33"); //Unknown setting - Serial.printf("command: %s (BAD) - ", cmdBuffer); - commandParser(); + sprintf(cmdBuffer, "$SPSET,ntripClientCasterUserPW,\"casterPW*3A"); //Missing closing quote + Serial.printf("command: %s (Missing quote) - ", cmdBuffer); + commandParser(cmdBuffer); sprintf(cmdBuffer, "$SPSET,elvMask,0.77*14"); //Valid - Serial.printf("command: %s (GOOD) - ", cmdBuffer); - commandParser(); + Serial.printf("command: %s (Valid) - ", cmdBuffer); + commandParser(cmdBuffer); + + sprintf(cmdBuffer, "$SPSET,ntripClientCasterUserPW,\"my,long wifi password with a comma to push 50 char\"*07"); //Valid, with internal commas + Serial.printf("command: %s (Valid) - ", cmdBuffer); + commandParser(cmdBuffer); + + sprintf(cmdBuffer, "$SPSET,ntripClientCasterUserPW,\"my password with a \\\" in it\"*01"); //Valid, with quotes + Serial.printf("command: %s (Valid) - ", cmdBuffer); + commandParser(cmdBuffer); Serial.println(); sprintf(cmdBuffer, "$SPEXE*5B"); //Incorrect number of arguments - Serial.printf("command: %s (BAD) - ", cmdBuffer); - commandParser(); + Serial.printf("command: %s (Wrong number of arguments) - ", cmdBuffer); + commandParser(cmdBuffer); - sprintf(cmdBuffer, "$SPEXE,maxHeight*01"); //Unknown command - Serial.printf("command: %s (BAD) - ", cmdBuffer); - commandParser(); + sprintf(cmdBuffer, "$SPEXE,maxHeight*3C"); //Unknown command + Serial.printf("command: %s (Unknown command) - ", cmdBuffer); + commandParser(cmdBuffer); sprintf(cmdBuffer, "$SPEXE,EXIT*77"); //Valid - Serial.printf("command: %s (GOOD) - ", cmdBuffer); - commandParser(); + Serial.printf("command: %s (Valid) - ", cmdBuffer); + commandParser(cmdBuffer); sprintf(cmdBuffer, "$SPEXE,APPLY*23"); //Valid - Serial.printf("command: %s (GOOD) - ", cmdBuffer); - commandParser(); + Serial.printf("command: %s (Valid) - ", cmdBuffer); + commandParser(cmdBuffer); sprintf(cmdBuffer, "$SPEXE,SAVE*76"); //Valid - Serial.printf("command: %s (GOOD) - ", cmdBuffer); - commandParser(); + Serial.printf("command: %s (Valid) - ", cmdBuffer); + commandParser(cmdBuffer); sprintf(cmdBuffer, "$SPEXE,REBOOT*76"); //Valid - Serial.printf("command: %s (GOOD) - ", cmdBuffer); - commandParser(); - + Serial.printf("command: %s (Valid) - ", cmdBuffer); + commandParser(cmdBuffer); + sprintf(cmdBuffer, "$SPEXE,LIST*75"); //Valid - Serial.printf("command: %s (GOOD) - ", cmdBuffer); - commandParser(); + Serial.printf("command: %s (Valid) - ", cmdBuffer); + commandParser(cmdBuffer); } -void commandParser() +void commandParser(char *cmdBuffer) { //Verify command structure if (commandValid(cmdBuffer) == false) { - commandSendErrorResponse("SP", "Bad command structure"); + commandSendErrorResponse((char*)"SP", (char*)"Bad command structure or checksum"); return; } //Remove $ - char *command = cmdBuffer + 1; + cmdBuffer = &cmdBuffer[1]; - //Remove * and CRC - command[strlen(command) - 3] = '\0'; + //Change * to , and null terminate on the first CRC character + cmdBuffer[strlen(cmdBuffer) - 3] = ','; + cmdBuffer[strlen(cmdBuffer) - 2] = '\0'; - const uint16_t bufferLen = 1024; const int MAX_TOKENS = 10; char valueBuffer[100]; - char responseBuffer[200]; char *tokens[MAX_TOKENS]; - const char *delimiter = ","; int tokenCount = 0; - tokens[tokenCount] = strtok(command, delimiter); + int originalLength = strlen(cmdBuffer); - while (tokens[tokenCount] != nullptr && tokenCount < MAX_TOKENS) + //We can't use strtok because there may be ',' inside of settings (ie, wifi password: "hello,world") + + tokens[tokenCount++] = &cmdBuffer[0]; //Point at first token + + bool inQuote = false; + bool inEscape = false; + for (int spot = 0; spot < originalLength ; spot++) { - tokenCount++; - tokens[tokenCount] = strtok(nullptr, delimiter); + if (cmdBuffer[spot] == ',' && inQuote == false) + { + if (spot < (originalLength - 1)) + { + cmdBuffer[spot++] = '\0'; + tokens[tokenCount++] = &cmdBuffer[spot]; + } + else + cmdBuffer[spot] = '\0'; + + if (inEscape == true) + inEscape = false; + } + + //Handle escape chacters and quotes + if (cmdBuffer[spot] == '\\' && inEscape == false) + { + //Ignore next character from quote checks + inEscape = true; + } + else if (cmdBuffer[spot] == '\"' && inEscape == true) + inEscape = false; + else if (cmdBuffer[spot] == '\"' && inQuote == false && inEscape == false) + inQuote = true; + else if (cmdBuffer[spot] == '\"' && inQuote == true) + inQuote = false; + } + + if (inQuote == true) + { + commandSendErrorResponse((char*)"SP", (char*)"Unclosed quote"); + return; } - // if (tokenCount == 0) - // continue; + + //Trim surrounding quotes from any token + for (int x = 0 ; x < tokenCount ; x++) + { + //Remove leading " + if (tokens[x][0] == '"') + tokens[x] = &tokens[x][1]; + + //Remove trailing " + if (tokens[x][strlen(tokens[x]) - 1] == '"') + tokens[x][strlen(tokens[x]) - 1] = '\0'; + } + + // Serial.printf("Token count: %d\r\n", tokenCount); + // Serial.printf("Token[0]: %s\r\n", tokens[0]); + // Serial.printf("Token[1]: %s\r\n", tokens[1]); + // Serial.println(); //Valid commands: CMD, GET, SET, EXE, @@ -132,34 +198,38 @@ void commandParser() else if (strcmp(tokens[0], "SPGET") == 0) { if (tokenCount != 2) - commandSendErrorResponse(tokens[0], "Incorrect number of arguments"); + commandSendErrorResponse(tokens[0], (char*)"Incorrect number of arguments"); else { auto field = tokens[1]; if (getSettingValue(field, valueBuffer) == true) commandSendValueResponse(tokens[0], field, valueBuffer); //Send structured response else - commandSendErrorResponse(tokens[0], field, "Unknown setting"); + commandSendErrorResponse(tokens[0], (char*)"Unknown setting"); } } else if (strcmp(tokens[0], "SPSET") == 0) { if (tokenCount != 3) - commandSendErrorResponse(tokens[0], "Incorrect number of arguments"); //Incorrect number of arguments + commandSendErrorResponse(tokens[0], (char*)"Incorrect number of arguments"); //Incorrect number of arguments else { auto field = tokens[1]; auto value = tokens[2]; - if (updateSettingWithValue(field, value) == true) - commandSendValueOkResponse(tokens[0], field, value); + + GetSettingValueResponse response = updateSettingWithValue(field, value); + if (response == GET_SETTING_KNOWN) + commandSendValueOkResponse(tokens[0], field, value); //Just respond with the setting (not quotes needed) + else if (response == GET_SETTING_KNOWN_STRING) + commandSendStringOkResponse(tokens[0], field, value); //Wrap the string setting in quotes in the response else - commandSendErrorResponse(tokens[0], field, "Unknown setting"); + commandSendErrorResponse(tokens[0], (char*)"Unknown setting"); } } else if (strcmp(tokens[0], "SPEXE") == 0) { if (tokenCount != 2) - commandSendErrorResponse(tokens[0], "Incorrect number of arguments"); //Incorrect number of arguments + commandSendErrorResponse(tokens[0], (char*)"Incorrect number of arguments"); //Incorrect number of arguments else { if (strcmp(tokens[1], "EXIT") == 0) @@ -187,18 +257,18 @@ void commandParser() Serial.println(); //TODO remove, just needed for pretty printing //Respond with list of variables - commandSendExecuteListResponse("observationSeconds", "int", "10"); - commandSendExecuteListResponse("observationPositionAccuracy", "float", "0.5"); + commandSendExecuteListResponse((char*)"observationSeconds", (char*)"int", (char*)"10"); + commandSendExecuteListResponse((char*)"observationPositionAccuracy", (char*)"float", (char*)"0.5"); commandSendExecuteOkResponse(tokens[0], tokens[1]); } else - commandSendErrorResponse(tokens[0], tokens[1], "Unknown command"); + commandSendErrorResponse(tokens[0], (char*)"Unknown command"); } } else { - commandSendErrorResponse(tokens[0], "Unknown command"); + commandSendErrorResponse(tokens[0], (char*)"Unknown command"); } } @@ -262,29 +332,28 @@ void commandSendValueOkResponse(char *command, char *settingName, char *valueBuf commandSendResponse(innerBuffer); } -// Given a command, send structured ERROR response -// Response format: $SPxET,[setting name],,ERROR,[Verbose error description]*FF -// Ex: SPGET,maxHeight,'Unknown setting' = "$SPGET,maxHeight,,ERROR,Unknown setting*58" -void commandSendErrorResponse(char *command, char *settingName, char *errorVerbose) +//Given a command, and a value, send response sentence with OK and checksum and +//Ex: SPSET,ntripClientCasterUserPW,thePassword = $SPSET,ntripClientCasterUserPW,"thePassword",OK*2F +void commandSendStringOkResponse(char *command, char *settingName, char *valueBuffer) { - // Create string between $ and * for checksum calculation - char innerBuffer[200]; - snprintf(innerBuffer, sizeof(innerBuffer), "%s,%s,,ERROR,%s", command, settingName, errorVerbose); - commandSendResponse(innerBuffer); + //Create string between $ and * for checksum calculation + char innerBuffer[200]; + sprintf(innerBuffer, "%s,%s,\"%s\",OK", command, settingName, valueBuffer); + commandSendResponse(innerBuffer); } -// Given a command, send structured ERROR response -// Response format: $SPxET,,,ERROR,[Verbose error description]*FF -// Ex: SPGET, 'Incorrect number of arguments' = "$SPGET,ERROR,Incorrect number of arguments*1E" + +//Given a command, send structured ERROR response +//Ex: SPGET, 'Incorrect number of arguments' = "$SPGET,ERROR,Incorrect number of arguments*1E" void commandSendErrorResponse(char *command, char *errorVerbose) { - // Create string between $ and * for checksum calculation - char innerBuffer[200]; - snprintf(innerBuffer, sizeof(innerBuffer), "%s,,,ERROR,%s", command, errorVerbose); - commandSendResponse(innerBuffer); + //Create string between $ and * for checksum calculation + char innerBuffer[200]; + snprintf(innerBuffer, sizeof(innerBuffer), "%s,ERROR,%s", command, errorVerbose); + commandSendResponse(innerBuffer); } //Given an inner buffer, send response sentence with checksum and -//Ex: SPGET,elvMask,0.25 = $SPGET,elvMask,0.25*07 +//Ex: "SPGET,0.25" = "$SPGET,0.25*33" void commandSendResponse(char *innerBuffer) { char responseBuffer[200]; diff --git a/Firmware/Test Sketches/CommandLineStructure/Other.ino b/Firmware/Test Sketches/CommandLineStructure/Other.ino index fdafff02e..cd89e4482 100644 --- a/Firmware/Test Sketches/CommandLineStructure/Other.ino +++ b/Firmware/Test Sketches/CommandLineStructure/Other.ino @@ -1,38 +1,43 @@ // Given a settingName, and string value, update a given setting -bool updateSettingWithValue(const char *settingName, const char *settingValueStr) +GetSettingValueResponse updateSettingWithValue(const char *settingName, const char *settingValueStr) { - char *ptr; - double settingValue = strtod(settingValueStr, &ptr); - bool knownSetting = false; - - if (strcmp(settingValueStr, "true") == 0) - settingValue = 1; - if (strcmp(settingValueStr, "false") == 0) - settingValue = 0; + bool settingIsString = false; if (strcmp(settingName, "elvMask") == 0) { //settings.elvMask = value knownSetting = true; } + else if (strcmp(settingName, "ntripClientCasterUserPW") == 0) + { + //Serial.printf("New password: '%s'\r\n", settingValueStr); + settingIsString = true; + knownSetting = true; + } - return (knownSetting); + if (knownSetting == true && settingIsString == true) + return (GET_SETTING_KNOWN_STRING); + else if (knownSetting == true) + return (GET_SETTING_KNOWN); + + return (GET_SETTING_UNKNOWN); } bool getSettingValue(const char *settingName, char *settingValueStr) { bool knownSetting = false; - char truncatedName[51]; - char suffix[51]; - if (strcmp(settingName, "elvMask") == 0) { sprintf(settingValueStr, "%0.2f", 0.25); knownSetting = true; } + else if (strcmp(settingName, "ntripClientCasterUserPW") == 0) + { + sprintf(settingValueStr, "%s", (char*)"\"my,long wifi password with a comma to push 50 char\""); + knownSetting = true; + } return (knownSetting); - } From 25c561639e2886d2468ec927cfd3cf23378fb284 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Wed, 22 May 2024 12:14:59 +0100 Subject: [PATCH 080/358] ETH.begin needs SPI.begin --- Firmware/RTK_Everywhere/Begin.ino | 33 +++++++++++----------- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 2 -- Firmware/RTK_Everywhere/SD.ino | 14 ++++----- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/Firmware/RTK_Everywhere/Begin.ino b/Firmware/RTK_Everywhere/Begin.ino index ce7b31597..3c15b6d93 100644 --- a/Firmware/RTK_Everywhere/Begin.ino +++ b/Firmware/RTK_Everywhere/Begin.ino @@ -553,12 +553,12 @@ void beginSD() return; // Skip if going into configure-via-ethernet mode - if (configureViaEthernet) - { - if (settings.debugNetworkLayer) - systemPrintln("configureViaEthernet: skipping beginSD"); - return; - } + // if (configureViaEthernet) + // { + // if (settings.debugNetworkLayer) + // systemPrintln("configureViaEthernet: skipping beginSD"); + // return; + // } bool gotSemaphore; @@ -696,7 +696,7 @@ void resetSPI() sdDeselectCard(); // Flush SPI interface - SPI.begin(); + SPI.begin(pin_SCK, pin_POCI, pin_PICO); SPI.beginTransaction(SPISettings(400000, MSBFIRST, SPI_MODE0)); for (int x = 0; x < 10; x++) SPI.transfer(0XFF); @@ -706,7 +706,7 @@ void resetSPI() sdSelectCard(); // Flush SD interface - SPI.begin(); + SPI.begin(pin_SCK, pin_POCI, pin_PICO); SPI.beginTransaction(SPISettings(400000, MSBFIRST, SPI_MODE0)); for (int x = 0; x < 10; x++) SPI.transfer(0XFF); @@ -875,12 +875,12 @@ bool forceConfigureViaEthernet() void beginInterrupts() { // Skip if going into configure-via-ethernet mode - if (configureViaEthernet) - { - if (settings.debugNetworkLayer) - systemPrintln("configureViaEthernet: skipping beginInterrupts"); - return; - } + // if (configureViaEthernet) + // { + // if (settings.debugNetworkLayer) + // systemPrintln("configureViaEthernet: skipping beginInterrupts"); + // return; + // } if (present.timePulseInterrupt == true) // If the GNSS Time Pulse is connected, use it as an interrupt to set the clock accurately @@ -894,8 +894,9 @@ void beginInterrupts() if (present.ethernet_ws5500 == true) { DMW_if systemPrintf("pin_Ethernet_Interrupt: %d\r\n", pin_Ethernet_Interrupt); - pinMode(pin_Ethernet_Interrupt, INPUT_PULLUP); // Prepare the interrupt pin - attachInterrupt(pin_Ethernet_Interrupt, ethernetISR, FALLING); // Attach the interrupt + pinMode(pin_Ethernet_Interrupt, INPUT); // Prepare the interrupt pin + //pinMode(pin_Ethernet_Interrupt, INPUT_PULLUP); // Prepare the interrupt pin + //attachInterrupt(pin_Ethernet_Interrupt, ethernetISR, FALLING); // Attach the interrupt } #endif // COMPILE_ETHERNET } diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index c96efa00b..aad458607 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -19,8 +19,6 @@ Settings are loaded from microSD if available, otherwise settings are pulled from ESP32's file system LittleFS. */ -#define IPv6Address IPAddress // Temporary fix to let SparkFun_WebServer_ESP32_W5500 compile on arduino-esp32 v3.0.0 - TODO delete this - // To reduce compile times, various parts of the firmware can be disabled/removed if they are not // needed during development #define COMPILE_BT // Comment out to remove Bluetooth functionality diff --git a/Firmware/RTK_Everywhere/SD.ino b/Firmware/RTK_Everywhere/SD.ino index cdf2d13d6..2db514d34 100644 --- a/Firmware/RTK_Everywhere/SD.ino +++ b/Firmware/RTK_Everywhere/SD.ino @@ -7,12 +7,12 @@ void sdUpdate() return; // Skip if going into / in configure-via-ethernet mode - if (configureViaEthernet) - { - //if (settings.debugNetworkLayer) - // systemPrintln("configureViaEthernet: skipping sdUpdate"); - return; - } + // if (configureViaEthernet) + // { + // //if (settings.debugNetworkLayer) + // // systemPrintln("configureViaEthernet: skipping sdUpdate"); + // return; + // } if (settings.enableSD == false) { @@ -146,7 +146,7 @@ bool sdCardPresent(void) bool sdCardPresentSoftwareTest() { - SPI.begin(); + SPI.begin(pin_SCK, pin_POCI, pin_PICO); SPI.setClockDivider(SPI_CLOCK_DIV2); SPI.setDataMode(SPI_MODE0); SPI.setBitOrder(MSBFIRST); From 0f9d0098b2f323706525d6b80a23c0c4f8b8633e Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Wed, 22 May 2024 14:40:45 -0600 Subject: [PATCH 081/358] Add support for escaped quotes --- .../CommandLineStructure.ino | 92 ++++++++++++++++--- .../CommandLineStructure/Other.ino | 21 +++-- 2 files changed, 93 insertions(+), 20 deletions(-) diff --git a/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino b/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino index 4d354f68a..c77230f29 100644 --- a/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino +++ b/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino @@ -4,10 +4,10 @@ typedef enum { - GET_SETTING_UNKNOWN = 0, - GET_SETTING_KNOWN, - GET_SETTING_KNOWN_STRING, -} GetSettingValueResponse; + SETTING_UNKNOWN = 0, + SETTING_KNOWN, + SETTING_KNOWN_STRING, +} SettingValueResponse; void setup() { @@ -50,6 +50,11 @@ void setup() Serial.printf("command: %s (Valid) - ", cmdBuffer); commandParser(cmdBuffer); + sprintf(cmdBuffer, "$SPGET,ntripClientCasterUserPW*35"); //Valid command, response with escaped quote + Serial.printf("command: %s (Valid) - ", cmdBuffer); + commandParser(cmdBuffer); + + Serial.println(); sprintf(cmdBuffer, "$SPSET,elvMask*26"); //Incorrect number of arguments @@ -68,11 +73,19 @@ void setup() Serial.printf("command: %s (Valid) - ", cmdBuffer); commandParser(cmdBuffer); - sprintf(cmdBuffer, "$SPSET,ntripClientCasterUserPW,\"my,long wifi password with a comma to push 50 char\"*07"); //Valid, with internal commas + sprintf(cmdBuffer, "$SPSET,ntripClientCasterUserPW,\"MyPass\"*08"); //Valid string Serial.printf("command: %s (Valid) - ", cmdBuffer); commandParser(cmdBuffer); - sprintf(cmdBuffer, "$SPSET,ntripClientCasterUserPW,\"my password with a \\\" in it\"*01"); //Valid, with quotes + sprintf(cmdBuffer, "$SPSET,ntripClientCasterUserPW,\"complex,password\"*5E"); //Valid string with an internal comma + Serial.printf("command: %s (Valid) - ", cmdBuffer); + commandParser(cmdBuffer); + + sprintf(cmdBuffer, "$SPSET,ntripClientCasterUserPW,\"pwWith\\\"quote\"*2C"); //Valid string with an escaped quote + Serial.printf("command: %s (Valid) - ", cmdBuffer); + commandParser(cmdBuffer); + + sprintf(cmdBuffer, "$SPSET,ntripClientCasterUserPW,\"a55G\\\"e,e#\"*5A"); //Valid string with an internal escaped quote, and internal comma Serial.printf("command: %s (Valid) - ", cmdBuffer); commandParser(cmdBuffer); @@ -146,13 +159,16 @@ void commandParser(char *cmdBuffer) tokens[tokenCount++] = &cmdBuffer[spot]; } else + { + //We are at the end of the string, just terminate the last token cmdBuffer[spot] = '\0'; + } if (inEscape == true) inEscape = false; } - //Handle escape chacters and quotes + //Handle escaped quotes if (cmdBuffer[spot] == '\\' && inEscape == false) { //Ignore next character from quote checks @@ -184,6 +200,17 @@ void commandParser(char *cmdBuffer) tokens[x][strlen(tokens[x]) - 1] = '\0'; } + //Remove escape characters from within tokens + //https://stackoverflow.com/questions/53134028/remove-all-from-a-string-in-c + for (int x = 0 ; x < tokenCount ; x++) + { + int k = 0; + for (int i = 0; tokens[x][i] != '\0'; ++i) + if (tokens[x][i] != '\\') + tokens[x][k++] = tokens[x][i]; + tokens[x][k] = '\0'; + } + // Serial.printf("Token count: %d\r\n", tokenCount); // Serial.printf("Token[0]: %s\r\n", tokens[0]); // Serial.printf("Token[1]: %s\r\n", tokens[1]); @@ -202,8 +229,13 @@ void commandParser(char *cmdBuffer) else { auto field = tokens[1]; - if (getSettingValue(field, valueBuffer) == true) + + SettingValueResponse response = getSettingValue(field, valueBuffer); + + if (response == SETTING_KNOWN) commandSendValueResponse(tokens[0], field, valueBuffer); //Send structured response + else if (response == SETTING_KNOWN_STRING) + commandSendStringResponse(tokens[0], field, valueBuffer); //Wrap the string setting in quotes in the response, no OK else commandSendErrorResponse(tokens[0], (char*)"Unknown setting"); } @@ -217,11 +249,11 @@ void commandParser(char *cmdBuffer) auto field = tokens[1]; auto value = tokens[2]; - GetSettingValueResponse response = updateSettingWithValue(field, value); - if (response == GET_SETTING_KNOWN) + SettingValueResponse response = updateSettingWithValue(field, value); + if (response == SETTING_KNOWN) commandSendValueOkResponse(tokens[0], field, value); //Just respond with the setting (not quotes needed) - else if (response == GET_SETTING_KNOWN_STRING) - commandSendStringOkResponse(tokens[0], field, value); //Wrap the string setting in quotes in the response + else if (response == SETTING_KNOWN_STRING) + commandSendStringOkResponse(tokens[0], field, value); //Wrap the string setting in quotes in the response, add OK else commandSendErrorResponse(tokens[0], (char*)"Unknown setting"); } @@ -336,9 +368,43 @@ void commandSendValueOkResponse(char *command, char *settingName, char *valueBuf //Ex: SPSET,ntripClientCasterUserPW,thePassword = $SPSET,ntripClientCasterUserPW,"thePassword",OK*2F void commandSendStringOkResponse(char *command, char *settingName, char *valueBuffer) { + //Add escapes for any quotes in valueBuffer + //https://stackoverflow.com/a/26114476 + const char *escapeChar = "\""; + char escapedValueBuffer[100]; + size_t bp = 0; + + for (size_t sp = 0; valueBuffer[sp]; sp++) { + if (strchr(escapeChar, valueBuffer[sp])) escapedValueBuffer[bp++] = '\\'; + escapedValueBuffer[bp++] = valueBuffer[sp]; + } + escapedValueBuffer[bp] = 0; + + //Create string between $ and * for checksum calculation + char innerBuffer[200]; + sprintf(innerBuffer, "%s,%s,\"%s\",OK", command, settingName, escapedValueBuffer); + commandSendResponse(innerBuffer); +} + +//Given a command, and a value, send response sentence with checksum and +//Ex: $SPGET,ntripClientCasterUserPW*35 = $SPSET,ntripClientCasterUserPW,"thePassword",OK*2F +void commandSendStringResponse(char *command, char *settingName, char *valueBuffer) +{ + //Add escapes for any quotes in valueBuffer + //https://stackoverflow.com/a/26114476 + const char *escapeChar = "\""; + char escapedValueBuffer[100]; + size_t bp = 0; + + for (size_t sp = 0; valueBuffer[sp]; sp++) { + if (strchr(escapeChar, valueBuffer[sp])) escapedValueBuffer[bp++] = '\\'; + escapedValueBuffer[bp++] = valueBuffer[sp]; + } + escapedValueBuffer[bp] = 0; + //Create string between $ and * for checksum calculation char innerBuffer[200]; - sprintf(innerBuffer, "%s,%s,\"%s\",OK", command, settingName, valueBuffer); + sprintf(innerBuffer, "%s,%s,\"%s\"", command, settingName, escapedValueBuffer); commandSendResponse(innerBuffer); } diff --git a/Firmware/Test Sketches/CommandLineStructure/Other.ino b/Firmware/Test Sketches/CommandLineStructure/Other.ino index cd89e4482..f8cd6aa10 100644 --- a/Firmware/Test Sketches/CommandLineStructure/Other.ino +++ b/Firmware/Test Sketches/CommandLineStructure/Other.ino @@ -1,5 +1,5 @@ // Given a settingName, and string value, update a given setting -GetSettingValueResponse updateSettingWithValue(const char *settingName, const char *settingValueStr) +SettingValueResponse updateSettingWithValue(const char *settingName, const char *settingValueStr) { bool knownSetting = false; bool settingIsString = false; @@ -17,16 +17,17 @@ GetSettingValueResponse updateSettingWithValue(const char *settingName, const ch } if (knownSetting == true && settingIsString == true) - return (GET_SETTING_KNOWN_STRING); + return (SETTING_KNOWN_STRING); else if (knownSetting == true) - return (GET_SETTING_KNOWN); + return (SETTING_KNOWN); - return (GET_SETTING_UNKNOWN); + return (SETTING_UNKNOWN); } -bool getSettingValue(const char *settingName, char *settingValueStr) +SettingValueResponse getSettingValue(const char *settingName, char *settingValueStr) { bool knownSetting = false; + bool settingIsString = false; if (strcmp(settingName, "elvMask") == 0) { @@ -35,9 +36,15 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } else if (strcmp(settingName, "ntripClientCasterUserPW") == 0) { - sprintf(settingValueStr, "%s", (char*)"\"my,long wifi password with a comma to push 50 char\""); + sprintf(settingValueStr, "%s", (char*)"pwWith\"quote"); + settingIsString = true; knownSetting = true; } - return (knownSetting); + if (knownSetting == true && settingIsString == true) + return (SETTING_KNOWN_STRING); + else if (knownSetting == true) + return (SETTING_KNOWN); + + return (SETTING_UNKNOWN); } From ce9f56944213cd2ba7a29799b6302b6e659dd995 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Wed, 22 May 2024 16:16:37 -0600 Subject: [PATCH 082/358] Add quotes, commas, and escaped quotes to CLI --- Firmware/RTK_Everywhere/menuCommands.ino | 337 ++++++++++++++++------- Firmware/RTK_Everywhere/settings.h | 8 + 2 files changed, 251 insertions(+), 94 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index f5e732a61..89d9c47be 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -1,7 +1,7 @@ void menuCommands() { char cmdBuffer[200]; - char * command; + char *command; char responseBuffer[200]; char valueBuffer[100]; const int MAX_TOKENS = 10; @@ -37,7 +37,7 @@ void menuCommands() { if (commandValid(cmdBuffer) == false) { - commandSendErrorResponse("SP", "Bad command structure"); + commandSendErrorResponse("SP", "Bad command structure or checksum"); continue; } @@ -48,19 +48,83 @@ void menuCommands() command[strlen(command) - 3] = '\0'; } + // Change * to , and null terminate on the first CRC character + cmdBuffer[strlen(cmdBuffer) - 3] = ','; + cmdBuffer[strlen(cmdBuffer) - 2] = '\0'; + + const int MAX_TOKENS = 10; + char valueBuffer[100]; + + char *tokens[MAX_TOKENS]; int tokenCount = 0; - tokens[tokenCount] = strtok(command, delimiter); + int originalLength = strlen(cmdBuffer); + + // We can't use strtok because there may be ',' inside of settings (ie, wifi password: "hello,world") - while (tokens[tokenCount] != nullptr && tokenCount < MAX_TOKENS) + tokens[tokenCount++] = &cmdBuffer[0]; // Point at first token + + bool inQuote = false; + bool inEscape = false; + for (int spot = 0; spot < originalLength; spot++) { - tokenCount++; - tokens[tokenCount] = strtok(nullptr, delimiter); + if (cmdBuffer[spot] == ',' && inQuote == false) + { + if (spot < (originalLength - 1)) + { + cmdBuffer[spot++] = '\0'; + tokens[tokenCount++] = &cmdBuffer[spot]; + } + else + { + // We are at the end of the string, just terminate the last token + cmdBuffer[spot] = '\0'; + } + + if (inEscape == true) + inEscape = false; + } + + // Handle escaped quotes + if (cmdBuffer[spot] == '\\' && inEscape == false) + { + // Ignore next character from quote checks + inEscape = true; + } + else if (cmdBuffer[spot] == '\"' && inEscape == true) + inEscape = false; + else if (cmdBuffer[spot] == '\"' && inQuote == false && inEscape == false) + inQuote = true; + else if (cmdBuffer[spot] == '\"' && inQuote == true) + inQuote = false; } - if (tokenCount == 0) + if (inQuote == true) { - commandSendErrorResponse(tokens[0], "Incorrect number of arguments"); - continue; + commandSendErrorResponse((char *)"SP", (char *)"Unclosed quote"); + return; + } + + // Trim surrounding quotes from any token + for (int x = 0; x < tokenCount; x++) + { + // Remove leading " + if (tokens[x][0] == '"') + tokens[x] = &tokens[x][1]; + + // Remove trailing " + if (tokens[x][strlen(tokens[x]) - 1] == '"') + tokens[x][strlen(tokens[x]) - 1] = '\0'; + } + + // Remove escape characters from within tokens + // https://stackoverflow.com/questions/53134028/remove-all-from-a-string-in-c + for (int x = 0; x < tokenCount; x++) + { + int k = 0; + for (int i = 0; tokens[x][i] != '\0'; ++i) + if (tokens[x][i] != '\\') + tokens[x][k++] = tokens[x][i]; + tokens[x][k] = '\0'; } // Valid commands: CMD, GET, SET, EXE, @@ -75,10 +139,16 @@ void menuCommands() else { auto field = tokens[1]; - if (getSettingValue(field, valueBuffer) == true) + + SettingValueResponse response = getSettingValue(field, valueBuffer); + + if (response == SETTING_KNOWN) commandSendValueResponse(tokens[0], field, valueBuffer); // Send structured response + else if (response == SETTING_KNOWN_STRING) + commandSendStringResponse(tokens[0], field, + valueBuffer); // Wrap the string setting in quotes in the response, no OK else - commandSendErrorResponse(tokens[0], field, "Unknown setting"); + commandSendErrorResponse(tokens[0], (char *)"Unknown setting"); } } else if (strcmp(tokens[0], "SPSET") == 0) @@ -90,10 +160,16 @@ void menuCommands() { auto field = tokens[1]; auto value = tokens[2]; - if (updateSettingWithValue(field, value) == true) - commandSendValueOkResponse(tokens[0], field, value); + + SettingValueResponse response = updateSettingWithValue(field, value); + if (response == SETTING_KNOWN) + commandSendValueOkResponse(tokens[0], field, + value); // Just respond with the setting (not quotes needed) + else if (response == SETTING_KNOWN_STRING) + commandSendStringOkResponse(tokens[0], field, + value); // Wrap the string setting in quotes in the response, add OK else - commandSendErrorResponse(tokens[0], field, "Unknown setting"); + commandSendErrorResponse(tokens[0], (char *)"Unknown setting"); } } else if (strcmp(tokens[0], "SPEXE") == 0) @@ -164,13 +240,83 @@ void commandSendExecuteOkResponse(char *command, char *settingName) commandSendResponse(innerBuffer); } +// Given a command, and a value, send response sentence with OK and checksum and +// Ex: SPSET,ntripClientCasterUserPW,thePassword = $SPSET,ntripClientCasterUserPW,"thePassword",OK*2F +void commandSendStringOkResponse(char *command, char *settingName, char *valueBuffer) +{ + // Add escapes for any quotes in valueBuffer + // https://stackoverflow.com/a/26114476 + const char *escapeChar = "\""; + char escapedValueBuffer[100]; + size_t bp = 0; + + for (size_t sp = 0; valueBuffer[sp]; sp++) + { + if (strchr(escapeChar, valueBuffer[sp])) + escapedValueBuffer[bp++] = '\\'; + escapedValueBuffer[bp++] = valueBuffer[sp]; + } + escapedValueBuffer[bp] = 0; + + // Create string between $ and * for checksum calculation + char innerBuffer[200]; + sprintf(innerBuffer, "%s,%s,\"%s\",OK", command, settingName, escapedValueBuffer); + commandSendResponse(innerBuffer); +} + +// Given a command, and a value, send response sentence with checksum and +// Ex: $SPGET,ntripClientCasterUserPW*35 = $SPSET,ntripClientCasterUserPW,"thePassword",OK*2F +void commandSendStringResponse(char *command, char *settingName, char *valueBuffer) +{ + // Add escapes for any quotes in valueBuffer + // https://stackoverflow.com/a/26114476 + const char *escapeChar = "\""; + char escapedValueBuffer[100]; + size_t bp = 0; + + for (size_t sp = 0; valueBuffer[sp]; sp++) + { + if (strchr(escapeChar, valueBuffer[sp])) + escapedValueBuffer[bp++] = '\\'; + escapedValueBuffer[bp++] = valueBuffer[sp]; + } + escapedValueBuffer[bp] = 0; + + // Create string between $ and * for checksum calculation + char innerBuffer[200]; + sprintf(innerBuffer, "%s,%s,\"%s\"", command, settingName, escapedValueBuffer); + commandSendResponse(innerBuffer); +} + // Given a command, send response sentence with OK and checksum and // Ex: observationPositionAccuracy,float,0.5 = void commandSendExecuteListResponse(const char *settingName, char *settingType, char *settingValue) { // Create string between $ and * for checksum calculation char innerBuffer[200]; - sprintf(innerBuffer, "SPLST,%s,%s,%s", settingName, settingType, settingValue); + + // Put quotes around char settings + if (strstr(settingType, "char")) + { + // Add escapes for any quotes in settingValue + // https://stackoverflow.com/a/26114476 + const char *escapeChar = "\""; + char escapedSettingValue[100]; + size_t bp = 0; + + for (size_t sp = 0; settingValue[sp]; sp++) + { + if (strchr(escapeChar, settingValue[sp])) + escapedSettingValue[bp++] = '\\'; + escapedSettingValue[bp++] = settingValue[sp]; + } + escapedSettingValue[bp] = 0; + + sprintf(innerBuffer, "SPLST,%s,%s,\"%s\"", settingName, settingType, settingValue); + } + else + sprintf(innerBuffer, "SPLST,%s,%s,%s", settingName, settingType, settingValue); + commandSendResponse(innerBuffer); } @@ -268,11 +414,7 @@ bool commandValid(char *commandString) } // Split a settingName into a truncatedName and a suffix -void commandSplitName(const char * settingName, - char * truncatedName, - int truncatedNameLen, - char * suffix, - int suffixLen) +void commandSplitName(const char *settingName, char *truncatedName, int truncatedNameLen, char *suffix, int suffixLen) { // The settingName contains an underscore at the split point, search // for the underscore, the truncatedName is on the left including @@ -298,26 +440,21 @@ void commandSplitName(const char * settingName, } // Lookup up setting name -int commandLookupSettingName(const char * settingName, - char * truncatedName, - int truncatedNameLen, - char * suffix, +int commandLookupSettingName(const char *settingName, char *truncatedName, int truncatedNameLen, char *suffix, int suffixLen) { - const char * command; + const char *command; // Loop through the valid command entries for (int i = 0; i < commandCount; i++) { // Verify that this command does not get split - if ((commandIndex[i] >= 0) - && (!rtkSettingsEntries[commandIndex[i]].useSuffix)) + if ((commandIndex[i] >= 0) && (!rtkSettingsEntries[commandIndex[i]].useSuffix)) { command = commandGetName(0, commandIndex[i]); // For speed, compare the first letter, then the whole string - if ((command[0] == settingName[0]) - && (strcmp(command, settingName) == 0)) + if ((command[0] == settingName[0]) && (strcmp(command, settingName) == 0)) { return commandIndex[i]; } @@ -325,8 +462,7 @@ int commandLookupSettingName(const char * settingName, } // Split a settingName into a truncatedName and a suffix - commandSplitName(settingName, truncatedName, truncatedNameLen, - suffix, suffixLen); + commandSplitName(settingName, truncatedName, truncatedNameLen, suffix, suffixLen); // Loop through the settings entries // TODO: make this faster @@ -335,14 +471,12 @@ int commandLookupSettingName(const char * settingName, for (int i = 0; i < commandCount; i++) { // Verify that this command gets split - if ((commandIndex[i] >= 0) - && rtkSettingsEntries[commandIndex[i]].useSuffix) + if ((commandIndex[i] >= 0) && rtkSettingsEntries[commandIndex[i]].useSuffix) { command = commandGetName(0, commandIndex[i]); // For speed, compare the first letter, then the whole string - if ((command[0] == truncatedName[0]) - && (strcmp(command, truncatedName) == 0)) + if ((command[0] == truncatedName[0]) && (strcmp(command, truncatedName) == 0)) { return commandIndex[i]; } @@ -354,11 +488,9 @@ int commandLookupSettingName(const char * settingName, } // Check for unknown variables -bool commandCheckForUnknownVariable(const char * settingName, - const char ** entry, - int tableEntries) +bool commandCheckForUnknownVariable(const char *settingName, const char **entry, int tableEntries) { - const char ** tableEnd; + const char **tableEnd; // Walk table of unused variables - read to avoid errors tableEnd = &entry[tableEntries]; @@ -372,7 +504,7 @@ bool commandCheckForUnknownVariable(const char * settingName, } // Given a settingName, and string value, update a given setting -bool updateSettingWithValue(const char *settingName, const char *settingValueStr) +SettingValueResponse updateSettingWithValue(const char *settingName, const char *settingValueStr) { int i; char *ptr; @@ -391,10 +523,11 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr settingValue = 0; bool knownSetting = false; + bool settingIsString = false; // Goes true when setting needs to be surrounded by quotes during command response. + // Generally char arrays but some others. // Loop through the valid command entries - i = commandLookupSettingName(settingName, truncatedName, sizeof(truncatedName), - suffix, sizeof(suffix)); + i = commandLookupSettingName(settingName, truncatedName, sizeof(truncatedName), suffix, sizeof(suffix)); // Determine if settingName is in the command table if (i >= 0) @@ -522,8 +655,9 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr // Update the profile name in the file system if necessary if (strcmp(settingName, "profileName") == 0) - setProfileName(profileNumber); // Copy the current settings.profileName into the array of profile names at - // location profileNumber + setProfileName(profileNumber); // Copy the current settings.profileName into the array of profile names + // at location profileNumber + settingIsString = true; } break; case _IPString: { @@ -531,13 +665,13 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr IPAddress *ptr = (IPAddress *)var; ptr->fromString(tempString); knownSetting = true; + settingIsString = true; } break; case tUbxMsgRt: { for (int x = 0; x < qualifier; x++) { - if ((suffix[0] == ubxMessages[x].msgTextName[0]) && - (strcmp(suffix, ubxMessages[x].msgTextName) == 0)) + if ((suffix[0] == ubxMessages[x].msgTextName[0]) && (strcmp(suffix, ubxMessages[x].msgTextName) == 0)) { settings.ubxMessageRates[x] = (uint8_t)settingValue; knownSetting = true; @@ -570,6 +704,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr for (int i = 0; i < 6; i++) settings.espnowPeers[suffixNum][i] = mac[i]; knownSetting = true; + settingIsString = true; } } } @@ -599,6 +734,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr strncpy(settings.wifiNetworks[network].ssid, settingValueStr, sizeof(settings.wifiNetworks[0].ssid)); knownSetting = true; + settingIsString = true; } } else if (strstr(suffix, "Password") != nullptr) @@ -608,6 +744,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr strncpy(settings.wifiNetworks[network].password, settingValueStr, sizeof(settings.wifiNetworks[0].password)); knownSetting = true; + settingIsString = true; } } } @@ -619,6 +756,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr strncpy(&settings.ntripServer_CasterHost[server][0], settingValueStr, sizeof(settings.ntripServer_CasterHost[server])); knownSetting = true; + settingIsString = true; } } break; @@ -638,6 +776,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr strncpy(&settings.ntripServer_CasterUser[server][0], settingValueStr, sizeof(settings.ntripServer_CasterUser[server])); knownSetting = true; + settingIsString = true; } } break; @@ -648,6 +787,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr strncpy(&settings.ntripServer_CasterUserPW[server][0], settingValueStr, sizeof(settings.ntripServer_CasterUserPW[server])); knownSetting = true; + settingIsString = true; } } break; @@ -658,6 +798,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr strncpy(&settings.ntripServer_MountPoint[server][0], settingValueStr, sizeof(settings.ntripServer_MountPoint[server])); knownSetting = true; + settingIsString = true; } } break; @@ -668,6 +809,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr strncpy(&settings.ntripServer_MountPointPW[server][0], settingValueStr, sizeof(settings.ntripServer_MountPointPW[server])); knownSetting = true; + settingIsString = true; } } break; @@ -749,8 +891,10 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } // Done when the setting is found - if (knownSetting) - return true; + if (knownSetting == true && settingIsString == true) + return (SETTING_KNOWN_STRING); + else if (knownSetting == true) + return (SETTING_KNOWN); if (strcmp(settingName, "fixedLatText") == 0) { @@ -947,7 +1091,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr { endLogging(false, true); //(gotSemaphore, releaseSemaphore) Close file. Reset parser stats. beginLogging(); // Create new file based on current RTC. - setLoggingType(); // Determine if we are standard, PPP, or custom. Changes logging icon accordingly. + setLoggingType(); // Determine if we are standard, PPP, or custom. Changes logging icon accordingly. char newFileNameCSV[sizeof("logFileName,") + sizeof(logFileName) + 1]; snprintf(newFileNameCSV, sizeof(newFileNameCSV), "logFileName,%s,", logFileName); @@ -1015,25 +1159,14 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr // Unused variables - read to avoid errors else { - const char * table[] = - { - "baseTypeSurveyIn", - "enableFactoryDefaults", - "enableFirmwareUpdate", - "enableForgetRadios", - "fileSelectAll", - "fixedBaseCoordinateTypeGeo", - "fixedHAEAPC", - "measurementRateSec", - "nicknameECEF", - "nicknameGeodetic", - "saveToArduino", + const char *table[] = { + "baseTypeSurveyIn", "enableFactoryDefaults", "enableFirmwareUpdate", "enableForgetRadios", + "fileSelectAll", "fixedBaseCoordinateTypeGeo", "fixedHAEAPC", "measurementRateSec", + "nicknameECEF", "nicknameGeodetic", "saveToArduino", }; const int tableEntries = sizeof(table) / sizeof(table[0]); - knownSetting = commandCheckForUnknownVariable(settingName, - table, - tableEntries); + knownSetting = commandCheckForUnknownVariable(settingName, table, tableEntries); } // Last catch @@ -1042,7 +1175,12 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr systemPrintf("Unknown '%s': %0.3lf\r\n", settingName, settingValue); } - return (knownSetting); + if (knownSetting == true && settingIsString == true) + return (SETTING_KNOWN_STRING); + else if (knownSetting == true) + return (SETTING_KNOWN); + + return (SETTING_UNKNOWN); } // Create a csv string with current settings @@ -1738,7 +1876,7 @@ void writeToString(char *settingValueStr, char *value) // Given a settingName, create a string with setting value // Used in conjunction with the command line interface // The order of variables matches the order found in settings.h -bool getSettingValue(const char *settingName, char *settingValueStr) +SettingValueResponse getSettingValue(const char *settingName, char *settingValueStr) { int i; int qualifier; @@ -1748,10 +1886,11 @@ bool getSettingValue(const char *settingName, char *settingValueStr) void *var; bool knownSetting = false; + bool settingIsString = false; // Goes true when setting needs to be surrounded by quotes during command response. + // Generally char arrays but some others. // Loop through the valid command entries - i = commandLookupSettingName(settingName, truncatedName, sizeof(truncatedName), - suffix, sizeof(suffix)); + i = commandLookupSettingName(settingName, truncatedName, sizeof(truncatedName), suffix, sizeof(suffix)); // Determine if settingName is in the command table if (i >= 0) @@ -1863,19 +2002,20 @@ bool getSettingValue(const char *settingName, char *settingValueStr) char *ptr = (char *)var; writeToString(settingValueStr, ptr); knownSetting = true; + settingIsString = true; } break; case _IPString: { IPAddress *ptr = (IPAddress *)var; writeToString(settingValueStr, (char *)ptr->toString().c_str()); knownSetting = true; + settingIsString = true; } break; case tUbxMsgRt: { for (int x = 0; x < qualifier; x++) { - if ((suffix[0] == ubxMessages[x].msgTextName[0]) && - (strcmp(suffix, ubxMessages[x].msgTextName) == 0)) + if ((suffix[0] == ubxMessages[x].msgTextName[0]) && (strcmp(suffix, ubxMessages[x].msgTextName) == 0)) { writeToString(settingValueStr, settings.ubxMessageRates[x]); knownSetting = true; @@ -1908,6 +2048,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) settings.espnowPeers[suffixNum][5]); writeToString(settingValueStr, peer); knownSetting = true; + settingIsString = true; } } break; @@ -1935,6 +2076,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) { writeToString(settingValueStr, settings.wifiNetworks[network].ssid); knownSetting = true; + settingIsString = true; } } else if (strstr(suffix, "Password") != nullptr) @@ -1943,6 +2085,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) { writeToString(settingValueStr, settings.wifiNetworks[network].password); knownSetting = true; + settingIsString = true; } } } @@ -1953,6 +2096,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) { writeToString(settingValueStr, settings.ntripServer_CasterHost[server]); knownSetting = true; + settingIsString = true; } } break; @@ -1971,6 +2115,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) { writeToString(settingValueStr, settings.ntripServer_CasterUser[server]); knownSetting = true; + settingIsString = true; } } break; @@ -1980,6 +2125,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) { writeToString(settingValueStr, settings.ntripServer_CasterUserPW[server]); knownSetting = true; + settingIsString = true; } } break; @@ -1989,6 +2135,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) { writeToString(settingValueStr, settings.ntripServer_MountPoint[server]); knownSetting = true; + settingIsString = true; } } break; @@ -1998,6 +2145,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) { writeToString(settingValueStr, settings.ntripServer_MountPointPW[server]); knownSetting = true; + settingIsString = true; } } break; @@ -2071,6 +2219,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) { writeToString(settingValueStr, settings.regionalCorrectionTopics[region]); knownSetting = true; + settingIsString = true; } } break; @@ -2078,8 +2227,10 @@ bool getSettingValue(const char *settingName, char *settingValueStr) } // Done if the settingName was found - if (knownSetting) - return true; + if (knownSetting == true && settingIsString == true) + return (SETTING_KNOWN_STRING); + else if (knownSetting == true) + return (SETTING_KNOWN); // Report deviceID over CLI - Useful for label generation if (strcmp(settingName, "deviceId") == 0) @@ -2090,6 +2241,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) writeToString(settingValueStr, hardwareID); knownSetting = true; + settingIsString = true; } // Special actions @@ -2103,8 +2255,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) // TODO: check this! Is this really what we want? else { - const char * table[] = - { + const char *table[] = { "baseTypeFixed", "baseTypeSurveyIn", "checkNewFirmware", @@ -2135,9 +2286,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) }; const int tableEntries = sizeof(table) / sizeof(table[0]); - knownSetting = commandCheckForUnknownVariable(settingName, - table, - tableEntries); + knownSetting = commandCheckForUnknownVariable(settingName, table, tableEntries); } if (knownSetting == false) @@ -2146,7 +2295,12 @@ bool getSettingValue(const char *settingName, char *settingValueStr) systemPrintf("getSettingValue() Unknown setting: %s\r\n", settingName); } - return (knownSetting); + if (knownSetting == true && settingIsString == true) + return (SETTING_KNOWN_STRING); + else if (knownSetting == true) + return (SETTING_KNOWN); + + return (SETTING_UNKNOWN); } // List available settings, their type in CSV, and value @@ -2256,8 +2410,7 @@ void commandList(int i) // Record message settings for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, - ubxMessages[x].msgTextName); + snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, ubxMessages[x].msgTextName); getSettingValue(settingName, settingValue); commandSendExecuteListResponse(settingName, "uint8_t", settingValue); @@ -2355,8 +2508,7 @@ void commandList(int i) case tNSCUsrPw: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - snprintf(settingType, sizeof(settingType), "char[%d]", - sizeof(settings.ntripServer_CasterUserPW[x])); + snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.ntripServer_CasterUserPW[x])); snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); getSettingValue(settingName, settingValue); @@ -2378,8 +2530,7 @@ void commandList(int i) case tNSMtPtPw: { for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - snprintf(settingType, sizeof(settingType), "char[%d]", - sizeof(settings.ntripServer_MountPointPW[x])); + snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.ntripServer_MountPointPW[x])); snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, x); getSettingValue(settingName, settingValue); @@ -2439,8 +2590,7 @@ void commandList(int i) // Record corrections priorities for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { - snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, - correctionsSourceNames[x]); + snprintf(settingName, sizeof(settingName), "%s%s", rtkSettingsEntries[i].name, correctionsSourceNames[x]); getSettingValue(settingName, settingValue); commandSendExecuteListResponse(settingName, "int", settingValue); @@ -2450,8 +2600,7 @@ void commandList(int i) case tRegCorTp: { for (int r = 0; r < rtkSettingsEntries[i].qualifier; r++) { - snprintf(settingType, sizeof(settingType), "char[%d]", - sizeof(settings.regionalCorrectionTopics[0])); + snprintf(settingType, sizeof(settingType), "char[%d]", sizeof(settings.regionalCorrectionTopics[0])); snprintf(settingName, sizeof(settingName), "%s%d", rtkSettingsEntries[i].name, r); getSettingValue(settingName, settingValue); @@ -2462,7 +2611,7 @@ void commandList(int i) } } -const char * commandGetName(int stringIndex, int rtkIndex) +const char *commandGetName(int stringIndex, int rtkIndex) { int number; static char temp[2][16]; @@ -2514,9 +2663,9 @@ bool commandAvailableOnPlatform(int i) bool commandIndexFill() { int i; - const char * iCommandName; + const char *iCommandName; int j; - const char * jCommandName; + const char *jCommandName; int length; int16_t temp; @@ -2557,7 +2706,7 @@ bool commandIndexFill() { jCommandName = commandGetName(1, commandIndex[j]); - //Determine if the commands are out of order + // Determine if the commands are out of order if (strncasecmp(iCommandName, jCommandName, strlen(iCommandName) + 1) > 0) { // Out of order, switch the two entries @@ -2589,7 +2738,7 @@ void printAvailableSettings() else if (commandIndex[i] >= -MAX_PROFILE_COUNT) { int index; - const char * settingName; + const char *settingName; char settingType[100]; settingName = commandGetName(0, commandIndex[i]); diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index a164191ad..ec54f8748 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -519,6 +519,14 @@ typedef enum COORDINATE_INPUT_TYPE_INVALID_UNKNOWN, } CoordinateInputType; +// Responses for updateSettingWithValue() and getSettingValue() used in the CLI +typedef enum +{ + SETTING_UNKNOWN = 0, + SETTING_KNOWN, + SETTING_KNOWN_STRING, +} SettingValueResponse; + #define UBX_ID_NOT_AVAILABLE 0xFF // Define the periodic display values From 0c2a8b1f12c1f57ce65a8229596805c0aa5f0b3e Mon Sep 17 00:00:00 2001 From: PaulZC Date: Thu, 23 May 2024 18:09:25 +0100 Subject: [PATCH 083/358] Add websocket server based on - on Port 81 (not 80) --- Firmware/RTK_Everywhere/AP-Config/src/main.js | 2 +- Firmware/RTK_Everywhere/Form.ino | 207 +- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 5 + Firmware/RTK_Everywhere/form.h | 1701 +++++++++-------- 4 files changed, 1046 insertions(+), 869 deletions(-) diff --git a/Firmware/RTK_Everywhere/AP-Config/src/main.js b/Firmware/RTK_Everywhere/AP-Config/src/main.js index 46f677aad..9c27a13d9 100644 --- a/Firmware/RTK_Everywhere/AP-Config/src/main.js +++ b/Firmware/RTK_Everywhere/AP-Config/src/main.js @@ -1,4 +1,4 @@ -var gateway = `ws://${window.location.hostname}/ws`; +var gateway = `ws://${window.location.hostname}:81/ws`; var websocket; window.addEventListener('load', onLoad); diff --git a/Firmware/RTK_Everywhere/Form.ino b/Firmware/RTK_Everywhere/Form.ino index 413560c62..17993cbd3 100644 --- a/Firmware/RTK_Everywhere/Form.ino +++ b/Firmware/RTK_Everywhere/Form.ino @@ -11,6 +11,178 @@ Form.ino bool websocketConnected = false; +// Inspired by: +// https://github.com/espressif/arduino-esp32/blob/master/libraries/WebServer/examples/MultiHomedServers/MultiHomedServers.ino +// https://esp32.com/viewtopic.php?t=37384 +// https://github.com/espressif/esp-idf/blob/master/examples/protocols/http_server/ws_echo_server/main/ws_echo_server.c +// https://github.com/espressif/arduino-esp32/blob/master/libraries/ESP32/examples/Camera/CameraWebServer/CameraWebServer.ino +// https://esp32.com/viewtopic.php?t=24445 + +// These are useful: +// https://github.com/mo-thunderz/Esp32WifiPart2/blob/main/Arduino/ESP32WebserverWebsocket/ESP32WebserverWebsocket.ino +// https://www.youtube.com/watch?v=15X0WvGaVg8 + +void sendStringToWebsocket(const char *stringToSend) +{ + if (!websocketConnected) + { + systemPrintf("sendStringToWebsocket: not connected - could not send: %s\r\n", stringToSend); + return; + } + + // To send content to the webserver, we would call: webserver->sendContent(stringToSend); + // + // But here we want to send content to the websocket (wsserver)... + + httpd_ws_frame_t ws_pkt; + memset(&ws_pkt, 0, sizeof(httpd_ws_frame_t)); + ws_pkt.payload = (uint8_t*)stringToSend; + ws_pkt.len = strlen(stringToSend); + ws_pkt.type = HTTPD_WS_TYPE_TEXT; + + // If we use httpd_ws_send_frame, it requires a req. + //esp_err_t ret = httpd_ws_send_frame(last_ws_req, &ws_pkt); + //if (ret != ESP_OK) { + // ESP_LOGE(TAG, "httpd_ws_send_frame failed with %d", ret); + //} + + // If we use httpd_ws_send_frame_async, it requires a fd. + esp_err_t ret = httpd_ws_send_frame_async(*wsserver, last_ws_fd, &ws_pkt); + if (ret != ESP_OK) { + systemPrintf("httpd_ws_send_frame failed with %d\r\n", ret); + } + else + { + systemPrintf("sendStringToWebsocket: %s\r\n", stringToSend); + } + +} + +/* + * This handler echos back the received ws data + * and triggers an async send if certain message received + */ +static esp_err_t ws_handler(httpd_req_t *req) +{ + // Log the req, so we can reuse it for httpd_ws_send_frame + // TODO: do we need to be cleverer about this? + //last_ws_req = req; + + if (req->method == HTTP_GET) { + // Log the fd, so we can reuse it for httpd_ws_send_frame + // TODO: do we need to be cleverer about this? + last_ws_fd = httpd_req_to_sockfd(req); + systemPrintln("Handshake done, the new ws connection was opened"); + + websocketConnected = true; + lastDynamicDataUpdate = millis(); + sendStringToWebsocket(settingsCSV); + + return ESP_OK; + } + httpd_ws_frame_t ws_pkt; + uint8_t *buf = NULL; + memset(&ws_pkt, 0, sizeof(httpd_ws_frame_t)); + ws_pkt.type = HTTPD_WS_TYPE_TEXT; + /* Set max_len = 0 to get the frame len */ + esp_err_t ret = httpd_ws_recv_frame(req, &ws_pkt, 0); + if (ret != ESP_OK) { + systemPrintf("httpd_ws_recv_frame failed to get frame len with %d\r\n", ret); + return ret; + } + systemPrintf("frame len is %d\r\n", ws_pkt.len); + if (ws_pkt.len) { + /* ws_pkt.len + 1 is for NULL termination as we are expecting a string */ + buf = (uint8_t *)calloc(1, ws_pkt.len + 1); + if (buf == NULL) { + systemPrintln("Failed to calloc memory for buf"); + return ESP_ERR_NO_MEM; + } + ws_pkt.payload = buf; + /* Set max_len = ws_pkt.len to get the frame payload */ + ret = httpd_ws_recv_frame(req, &ws_pkt, ws_pkt.len); + if (ret != ESP_OK) { + systemPrintf("httpd_ws_recv_frame failed with %d\r\n", ret); + free(buf); + return ret; + } + systemPrintf("Got packet with message: %s\r\n", ws_pkt.payload); + } + systemPrintf("Packet type: %d\r\n", ws_pkt.type); + // HTTPD_WS_TYPE_CONTINUE = 0x0, + // HTTPD_WS_TYPE_TEXT = 0x1, + // HTTPD_WS_TYPE_BINARY = 0x2, + // HTTPD_WS_TYPE_CLOSE = 0x8, + // HTTPD_WS_TYPE_PING = 0x9, + // HTTPD_WS_TYPE_PONG = 0xA + + + if (ws_pkt.type == HTTPD_WS_TYPE_TEXT) + { + if (currentlyParsingData == false) + { + for (int i = 0; i < ws_pkt.len; i++) + { + incomingSettings[incomingSettingsSpot++] = ws_pkt.payload[i]; + incomingSettingsSpot %= AP_CONFIG_SETTING_SIZE; + } + timeSinceLastIncomingSetting = millis(); + } + } + + free(buf); + return ret; +} + +static const httpd_uri_t ws = { + .uri = "/ws", + .method = HTTP_GET, + .handler = ws_handler, + .user_ctx = NULL, + .is_websocket = true, + .handle_ws_control_frames = true, + .supported_subprotocol = NULL +}; + +static void start_wsserver(void) +{ + httpd_config_t config = HTTPD_DEFAULT_CONFIG(); + + // Use different ports for websocket and webserver - use port 81 for the websocket - also defined in main.js + config.server_port = 81; + + // Increase the stack size from 4K to ~15K + config.stack_size = AP_CONFIG_SETTING_SIZE; + + // Start the httpd server + systemPrintf("Starting wsserver on port: %d\r\n", config.server_port); + + if (wsserver == nullptr) + wsserver = new httpd_handle_t; + + if (httpd_start(wsserver, &config) == ESP_OK) { + // Registering the ws handler + systemPrintln("Registering URI handlers"); + httpd_register_uri_handler(*wsserver, &ws); + return; + } + + systemPrintln("Error starting wsserver!"); +} + +void stop_wsserver() +{ + createSettingsString(settingsCSV); + websocketConnected = false; + + if (*wsserver) + { + // Stop the httpd server + esp_err_t ret = httpd_stop(*wsserver); + //*wsserver = nullptr; + } +} + // ===== Request Handler class used to answer more complex requests ===== // https://github.com/espressif/arduino-esp32/blob/master/libraries/WebServer/examples/WebServer/WebServer.ino class CaptiveRequestHandler : public RequestHandler @@ -122,9 +294,9 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) if (settings.enableCaptivePortal == true) { webserver->addHandler(new CaptiveRequestHandler()); - } - webserver->on("/ws", onWsEvent); // websocket + // TODO: add a handler for /connecttest.txt + } // * index.html (not gz'd) // * favicon.ico @@ -143,7 +315,6 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) // * /src/fonts/icomoon.woof // * /listfiles responds with a CSV of files and sizes in root - // * /listCorrections responds with a CSV of correction sources and their priorities // * /listMessages responds with a CSV of messages supported by this platform // * /listMessagesBase responds with a CSV of RTCM Base messages supported by this platform // * /file allows the download or deletion of a file @@ -298,7 +469,7 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) webserver->begin(); - // Starts task for feeding NMEA+RTCM to PPL + // Starts task for updating webserver with handleClient if (online.updatePplTaskRunning == false) xTaskCreate(updateWebServerTask, "UpdateWebServer", // Just for humans @@ -310,10 +481,19 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) if (settings.debugWiFiConfig == true) systemPrintln("Web Server Started"); reportHeapNow(false); + + // Start the web socket server on port 81 using + start_wsserver(); + + if (settings.debugWiFiConfig == true) + systemPrintln("Web Socket Server Started"); + reportHeapNow(false); + return true; } while (0); // Release the resources + stop_wsserver(); stopWebServer(); return false; } @@ -378,7 +558,7 @@ void stopWebServer() void notFound() { - String logmessage = "Client:" + webserver->client().remoteIP().toString() + " " + webserver->uri(); + String logmessage = "notFound: Client:" + webserver->client().remoteIP().toString() + " " + webserver->uri(); systemPrintln(logmessage); webserver->send(404, "text/plain", "Not found"); } @@ -387,7 +567,7 @@ void notFound() static void handleFileManager() { // This section does not tolerate semaphore transactions - String logmessage = "Client:" + webserver->client().remoteIP().toString() + " " + webserver->uri(); + String logmessage = "handleFileManager: Client:" + webserver->client().remoteIP().toString() + " " + webserver->uri(); if (webserver->hasArg("name") && webserver->hasArg("action")) { @@ -488,14 +668,14 @@ static void handleFirmwareFileUpload() } else { - systemPrintf("Unknown: %s\r\n", fname); + systemPrintf("handleFirmwareFileUpload: Unknown: %s\r\n", fname); webserver->send(400, "text/html", "Error: Unknown file type"); return; } } else { - systemPrintf("Unknown: %s\r\n", fname); + systemPrintf("handleFirmwareFileUpload: Unknown: %s\r\n", fname); webserver->send(400, "text/html", "Error: Unknown file type"); return; } @@ -551,12 +731,8 @@ static void handleFirmwareFileUpload() } } -void onWsEvent() -{ - -} - /* +// TODO: delete this. This is the old method - using AsyncWebSocketClient // Events triggered by web sockets void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) @@ -930,9 +1106,4 @@ void handleUpload() } } -void sendStringToWebsocket(const char *stringToSend) -{ - webserver->sendContent(stringToSend); -} - #endif // COMPILE_AP diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index aad458607..98a101acd 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -560,12 +560,17 @@ unsigned long lastRockerSwitchChange; // If quick toggle is detected (less than #include #include +#include #include "form.h" // https://github.com/espressif/arduino-esp32/blob/master/libraries/DNSServer/examples/CaptivePortal/CaptivePortal.ino DNSServer *dnsserver; WebServer *webserver; +httpd_handle_t *wsserver = nullptr; +//httpd_req_t *last_ws_req; +int last_ws_fd; + TaskHandle_t webserverTaskHandle; const uint8_t updateWebServerTaskPriority = 0; // 3 being the highest, and 0 being the lowest const int updateWebServerTaskStackSize = 3000; diff --git a/Firmware/RTK_Everywhere/form.h b/Firmware/RTK_Everywhere/form.h index 2a5490ead..7970f86b2 100644 --- a/Firmware/RTK_Everywhere/form.h +++ b/Firmware/RTK_Everywhere/form.h @@ -26,7 +26,7 @@ // python main_js_zipper.py static const uint8_t main_js[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0xCF, 0xE4, 0x45, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, + 0x1F, 0x8B, 0x08, 0x08, 0xF0, 0x72, 0x4F, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x3A, 0x92, 0xE0, 0xFF, 0xFE, 0xBE, 0x7E, 0x07, 0xB4, 0xB6, 0xB7, 0x25, 0xB5, 0x65, 0x99, 0x92, 0x2F, 0xB1, 0xE3, 0xD8, 0xB3, 0xBE, 0x26, 0xDE, 0xE3, 0x8B, 0xD6, 0xB2, 0x93, 0x93, 0x9C, 0xCE, 0x78, 0x68, 0x11, 0x96, @@ -34,854 +34,855 @@ static const uint8_t main_js[] PROGMEM = { 0x20, 0x09, 0x80, 0xE0, 0x55, 0x92, 0xE3, 0x3E, 0x13, 0x7F, 0xDD, 0x39, 0x36, 0x01, 0x54, 0x15, 0x0A, 0x85, 0x02, 0x50, 0xA8, 0x2A, 0x3C, 0x98, 0x1E, 0x1A, 0x9A, 0x01, 0x7E, 0x34, 0x9F, 0xD1, 0x0E, 0xFA, 0xB7, 0x47, 0xFF, 0xED, 0xCA, 0xCA, 0x9F, 0xFF, 0xF1, 0x68, 0x3B, 0x96, 0xFB, 0xD8, - 0x1E, 0xB9, 0x03, 0x33, 0xB0, 0x5D, 0xA7, 0x7D, 0xEF, 0xFA, 0x81, 0x63, 0x8E, 0xF1, 0xF7, 0x95, - 0x47, 0xFF, 0xDF, 0xB6, 0xFF, 0xF8, 0x87, 0x07, 0xD2, 0xEA, 0x11, 0xDF, 0xFA, 0xEE, 0xE0, 0x1B, - 0x0E, 0xC8, 0xDF, 0x7F, 0xFC, 0x03, 0x6F, 0x61, 0x5A, 0xD6, 0xD1, 0x03, 0x76, 0x82, 0x53, 0xDB, - 0x0F, 0xB0, 0x83, 0xBD, 0x46, 0x7D, 0xE4, 0x9A, 0x56, 0xBD, 0x85, 0x5C, 0xE7, 0x94, 0xFC, 0xD2, - 0xA4, 0x75, 0xEF, 0xA6, 0xCE, 0x00, 0xC0, 0xF2, 0x8F, 0x0D, 0x0C, 0x2D, 0x9A, 0xE8, 0x1F, 0x7F, - 0xFC, 0x03, 0x22, 0x3F, 0xB6, 0x63, 0x07, 0x9F, 0xF0, 0x6D, 0x9F, 0xC2, 0x6E, 0x40, 0x8B, 0xEF, - 0x52, 0x23, 0xA5, 0x3C, 0x6C, 0x16, 0x91, 0x43, 0xBA, 0xE1, 0xE0, 0x47, 0x14, 0x57, 0xE1, 0xDD, - 0x03, 0x48, 0x52, 0xC5, 0xB6, 0xEB, 0x8C, 0xB1, 0xEF, 0x9B, 0x43, 0x4C, 0x9A, 0x44, 0xE0, 0x1B, - 0x63, 0x7F, 0x18, 0x01, 0x85, 0x9F, 0x89, 0xE9, 0xF9, 0xF8, 0xC4, 0x19, 0xB8, 0x63, 0xDB, 0x19, - 0x42, 0x69, 0xDB, 0x32, 0x03, 0x33, 0x84, 0xF6, 0x3D, 0x41, 0xDF, 0x10, 0x37, 0x70, 0x04, 0xC0, - 0xC3, 0xC1, 0xD4, 0x73, 0x90, 0xE5, 0x0E, 0xA6, 0x63, 0xD2, 0xC9, 0xF6, 0x10, 0x07, 0x47, 0x23, - 0x0C, 0xBF, 0xEE, 0x3F, 0x9F, 0x90, 0x9E, 0x47, 0xDD, 0x03, 0x8E, 0xDE, 0xD9, 0x4F, 0xD8, 0x3A, - 0x35, 0xA1, 0x07, 0xC6, 0xB6, 0xF8, 0xC9, 0x75, 0x86, 0xC2, 0xB7, 0xC9, 0xC8, 0x0C, 0xEE, 0x5C, - 0x6F, 0xDC, 0xF3, 0x30, 0x29, 0x26, 0x05, 0xB5, 0x1A, 0x2F, 0x19, 0x62, 0xD7, 0xC2, 0x81, 0x3D, - 0x60, 0x30, 0xD6, 0x8C, 0xB6, 0xD1, 0x51, 0x4B, 0x08, 0x81, 0x3B, 0x68, 0xB9, 0x63, 0xAC, 0xB7, - 0x3B, 0x5B, 0x4A, 0xD9, 0xDE, 0x08, 0x5A, 0x75, 0xD6, 0x0D, 0xA3, 0x1D, 0x36, 0xC3, 0x03, 0x7C, - 0xF7, 0x2B, 0x6D, 0xD0, 0xDD, 0x34, 0xBA, 0xC6, 0x46, 0x7B, 0x7D, 0x63, 0x53, 0x28, 0xFA, 0x0C, - 0x45, 0x6B, 0x6F, 0x3A, 0x1B, 0x9B, 0xC6, 0x5A, 0x7B, 0xCD, 0x58, 0x15, 0x8A, 0xBE, 0x50, 0x02, - 0x36, 0x37, 0x36, 0x36, 0xD6, 0xDB, 0x6B, 0x9B, 0x6B, 0xBC, 0x64, 0x64, 0xFA, 0xC1, 0xB1, 0x3D, - 0xC2, 0xE7, 0x44, 0x96, 0x44, 0xC2, 0xEF, 0xE0, 0xDB, 0x74, 0x7C, 0x8B, 0x3D, 0xA1, 0x9F, 0x0E, - 0xFD, 0x70, 0x71, 0x07, 0x0D, 0xFC, 0x3E, 0x1E, 0xE1, 0x41, 0x80, 0x2D, 0xA1, 0xDC, 0xE7, 0x9F, - 0x68, 0xB9, 0x08, 0xCD, 0xBF, 0x77, 0x89, 0x38, 0x0E, 0xE1, 0x3B, 0xC8, 0x21, 0x8C, 0xAE, 0x39, - 0xF2, 0x31, 0x2F, 0x75, 0x6F, 0x03, 0xD3, 0x76, 0xB0, 0x75, 0xC6, 0xC6, 0xBE, 0x58, 0x8D, 0x7D, - 0xD3, 0xC7, 0x4A, 0x2D, 0x8E, 0x85, 0x57, 0xBA, 0xBC, 0x3A, 0x38, 0xD3, 0x80, 0x82, 0x8E, 0x5D, - 0x99, 0xB7, 0xE4, 0x1F, 0xFC, 0x14, 0x88, 0x34, 0x0E, 0x5C, 0xCF, 0xC3, 0x54, 0x60, 0xD4, 0x12, - 0x2E, 0x93, 0xEA, 0x67, 0x60, 0x1D, 0xC7, 0x75, 0xF5, 0x3C, 0xC1, 0x19, 0x45, 0x9C, 0x56, 0x5A, - 0xCC, 0x2A, 0x10, 0x4C, 0xAE, 0x67, 0xF9, 0x47, 0x07, 0x47, 0xC7, 0xA4, 0xE0, 0xB7, 0xAF, 0xDB, - 0xD2, 0xE7, 0xF7, 0x7C, 0xFC, 0xC5, 0xA2, 0xBB, 0xE9, 0x68, 0xD4, 0x23, 0xF0, 0xAE, 0x27, 0x44, - 0xD8, 0xC5, 0x9E, 0x87, 0x2D, 0x7D, 0x1C, 0x5C, 0xD9, 0x63, 0xEC, 0x4E, 0x83, 0x68, 0x34, 0x1C, - 0xEB, 0x90, 0x4C, 0x0C, 0xF9, 0xEB, 0xE0, 0x1E, 0x0F, 0xBE, 0x9D, 0xE3, 0xC7, 0x63, 0xDB, 0x1B, - 0x3F, 0x9A, 0x1E, 0x96, 0x4B, 0xC9, 0x6C, 0xD0, 0x96, 0xFD, 0xF1, 0x0F, 0x03, 0xD7, 0x21, 0xBC, - 0x24, 0x12, 0x70, 0x10, 0xF1, 0xC9, 0xEF, 0xBB, 0x53, 0x6F, 0x40, 0x47, 0xFA, 0x4D, 0x82, 0x89, - 0xBC, 0x10, 0xE4, 0xCA, 0x17, 0xFB, 0x91, 0xA8, 0xD1, 0xF3, 0x6C, 0xD7, 0xB3, 0x03, 0x3B, 0xAE, - 0x16, 0x22, 0x3B, 0x70, 0x09, 0x33, 0x6C, 0x87, 0x74, 0x17, 0x98, 0x08, 0xC5, 0x7C, 0x0E, 0x1F, - 0x5C, 0x5C, 0x5C, 0x1E, 0x9E, 0x9C, 0xEF, 0x5D, 0x1D, 0xDD, 0x9C, 0x9C, 0xF7, 0xAE, 0xAF, 0x6E, - 0xAE, 0x3E, 0xF7, 0x8E, 0x6E, 0x0E, 0x0F, 0xDF, 0x22, 0xA3, 0x85, 0x56, 0x56, 0x0E, 0xF1, 0x9D, - 0x39, 0x25, 0x53, 0xE7, 0xF0, 0xB0, 0x6D, 0x85, 0x3F, 0xD9, 0x0D, 0xCF, 0xCE, 0xDE, 0xA2, 0x0E, - 0x6D, 0x4A, 0x7E, 0x6D, 0x8F, 0xE1, 0x27, 0xBB, 0xC1, 0x0D, 0xB4, 0xE8, 0xB2, 0x16, 0xA8, 0x70, - 0x93, 0x9B, 0xC3, 0xBD, 0xFE, 0x87, 0xB7, 0x68, 0x95, 0xB5, 0x5B, 0x2E, 0xDE, 0xAE, 0xFF, 0xF9, - 0x6C, 0xFF, 0xE2, 0xF4, 0x2D, 0x5A, 0x63, 0x2D, 0xFF, 0xFB, 0xBF, 0xC2, 0xA6, 0xE3, 0x71, 0x3D, - 0xAF, 0x67, 0xFD, 0xFE, 0x5B, 0xB4, 0x1E, 0x51, 0x8A, 0xFA, 0xFD, 0xB6, 0x4F, 0x7F, 0x0A, 0x60, - 0x25, 0x2D, 0x37, 0x2A, 0xB6, 0xE4, 0x5D, 0x7D, 0x13, 0x75, 0x75, 0xB9, 0x5C, 0xF3, 0xB0, 0xC7, - 0x9B, 0x71, 0x8F, 0xEB, 0x11, 0x84, 0x5A, 0x7E, 0x9F, 0x6F, 0xCE, 0x2F, 0x6E, 0x0E, 0x8F, 0x0E, - 0x4E, 0xCE, 0xF6, 0x08, 0x90, 0xAD, 0x70, 0x68, 0xFB, 0x7D, 0xB4, 0x8C, 0xCE, 0x5D, 0x64, 0xE1, - 0x81, 0x3D, 0x36, 0x47, 0x85, 0x28, 0x11, 0x01, 0x75, 0x0C, 0x91, 0x1D, 0xE5, 0x61, 0x01, 0x53, - 0x64, 0x80, 0x1D, 0x91, 0x41, 0x85, 0x01, 0x9E, 0x9C, 0x7F, 0xDC, 0x3B, 0x3D, 0x39, 0xBC, 0xB9, - 0x3E, 0xFF, 0xE5, 0xFC, 0xE2, 0xD3, 0x39, 0x81, 0xD3, 0x6D, 0x09, 0xCB, 0x16, 0x99, 0x3E, 0x0F, - 0xD8, 0x23, 0x8A, 0x38, 0x9E, 0x41, 0xA0, 0xA5, 0xDB, 0x46, 0x34, 0x07, 0xC3, 0xCF, 0x27, 0xCE, - 0x64, 0x1A, 0x70, 0xED, 0xA5, 0x4C, 0xB7, 0x76, 0x5A, 0x5F, 0xE4, 0x1D, 0x43, 0x62, 0x31, 0x8E, - 0x56, 0xDA, 0x95, 0x15, 0x98, 0xC6, 0xEE, 0x08, 0x93, 0x5D, 0xCB, 0xB0, 0x51, 0x0B, 0xEB, 0x84, - 0xEA, 0xF4, 0x2D, 0xAA, 0xA1, 0x25, 0x04, 0x0D, 0x28, 0x40, 0x68, 0x01, 0xB4, 0xC1, 0x52, 0x4E, - 0x88, 0x81, 0x55, 0xDD, 0x9F, 0x8C, 0xEC, 0xA0, 0x51, 0x6F, 0xD5, 0xC3, 0xA5, 0x9D, 0xAC, 0xB1, - 0xA8, 0x31, 0x22, 0x1B, 0x8A, 0x27, 0xBA, 0xE8, 0x90, 0xFF, 0xBC, 0xA3, 0xF5, 0xDB, 0x23, 0xEC, - 0x0C, 0x83, 0x7B, 0xC2, 0xBE, 0x0E, 0x7C, 0x5C, 0xDA, 0x41, 0x5D, 0x69, 0xC3, 0x00, 0x70, 0x6D, - 0x58, 0xA8, 0xA0, 0xF2, 0x6F, 0x4F, 0x5F, 0xB7, 0xE5, 0xA2, 0x07, 0x73, 0x14, 0x95, 0x11, 0x92, - 0x3A, 0x62, 0xB9, 0xD2, 0x09, 0xDB, 0x62, 0x64, 0x13, 0x68, 0x4B, 0xA8, 0xD6, 0x82, 0xA6, 0xEC, - 0x03, 0xF9, 0x25, 0xEE, 0x07, 0x6B, 0xD8, 0x9F, 0x90, 0x81, 0x24, 0xA0, 0x49, 0xB7, 0xC7, 0xA6, - 0x63, 0xF9, 0x71, 0x99, 0x7D, 0x87, 0x1A, 0xB6, 0xD5, 0xB6, 0x9D, 0xC1, 0x68, 0x6A, 0x61, 0xBF, - 0x51, 0xF3, 0xAD, 0x33, 0x77, 0xEA, 0x90, 0x01, 0xAB, 0x35, 0x25, 0xC2, 0x19, 0xA0, 0x2B, 0xD8, - 0xB0, 0xB8, 0xCE, 0x8A, 0x7B, 0x77, 0x87, 0xFA, 0x87, 0x88, 0x28, 0x66, 0x53, 0xAE, 0x02, 0xF0, - 0x68, 0x27, 0xC8, 0x1A, 0x43, 0x97, 0x85, 0x5A, 0x02, 0x0A, 0xFC, 0xDC, 0xDB, 0x16, 0x6E, 0xD4, - 0x60, 0x01, 0x3C, 0x33, 0x1D, 0x32, 0x02, 0x5E, 0xAD, 0xB9, 0x2D, 0xD7, 0xFA, 0x2E, 0xFF, 0x89, - 0x09, 0x28, 0x09, 0x78, 0xE0, 0x4D, 0x53, 0x60, 0xC3, 0xDA, 0x5B, 0x18, 0xB6, 0xF0, 0x6B, 0x84, - 0x02, 0xC6, 0x87, 0x60, 0x90, 0xB7, 0x52, 0x49, 0x5C, 0x89, 0xAD, 0x16, 0x21, 0x4D, 0x41, 0x14, - 0x6D, 0xED, 0x02, 0x3B, 0x18, 0xD1, 0x75, 0xF7, 0xF2, 0xEA, 0x17, 0x3A, 0x48, 0x4A, 0x63, 0x32, - 0x82, 0xA8, 0x4F, 0xB6, 0x83, 0x93, 0x9A, 0x02, 0x21, 0xB1, 0xD6, 0x42, 0xBF, 0x95, 0x3A, 0xFA, - 0xED, 0x42, 0x72, 0x5C, 0x54, 0x82, 0x49, 0xC5, 0xA3, 0x8F, 0xBF, 0x64, 0x31, 0xF1, 0x96, 0xEC, - 0x16, 0x0E, 0x5C, 0xE7, 0xCE, 0x1E, 0x26, 0x78, 0x18, 0x57, 0x9A, 0x4C, 0x72, 0xAB, 0xE0, 0xE0, - 0x1E, 0x7B, 0x0E, 0x0E, 0x72, 0x2B, 0x3A, 0x41, 0x16, 0x30, 0x26, 0x35, 0x81, 0x3D, 0x22, 0x80, - 0xC6, 0x13, 0xEC, 0xF8, 0xF4, 0x00, 0x42, 0xF8, 0x16, 0x90, 0xC9, 0xEC, 0x67, 0x34, 0x99, 0xB8, - 0x5E, 0xE0, 0xE7, 0x22, 0x27, 0xD3, 0xEA, 0xCA, 0xED, 0x1F, 0x1E, 0x98, 0x9E, 0x55, 0x58, 0x1C, - 0x35, 0x3C, 0x3D, 0x36, 0x07, 0x44, 0x2F, 0x3C, 0x74, 0x17, 0xCB, 0x58, 0xD6, 0xB1, 0x02, 0x8C, - 0x65, 0x15, 0xE7, 0xCE, 0x58, 0x4E, 0xE2, 0xCB, 0x33, 0x76, 0xEC, 0xFA, 0xA6, 0x3D, 0xF8, 0xC9, - 0xDC, 0x39, 0x33, 0xF7, 0xCA, 0xF5, 0x06, 0xF7, 0xFF, 0x44, 0x5C, 0x65, 0xF8, 0x16, 0xA0, 0x0B, - 0x58, 0x2D, 0x95, 0xAB, 0x1A, 0x02, 0xE8, 0x09, 0x93, 0x68, 0x5B, 0x72, 0xA6, 0xAF, 0x59, 0xCF, - 0x8E, 0x39, 0xB6, 0x07, 0x67, 0xE4, 0xB0, 0x34, 0xD2, 0x42, 0x85, 0xAD, 0x82, 0x83, 0x1F, 0x2F, - 0x26, 0x74, 0xA7, 0xC2, 0xAC, 0x10, 0xEC, 0x8F, 0x46, 0xBD, 0x3F, 0xF5, 0x1E, 0xF0, 0x73, 0xBD, - 0x85, 0xEA, 0x46, 0x5D, 0xDB, 0x55, 0x8A, 0x09, 0xCC, 0x27, 0x8D, 0x08, 0x44, 0x0B, 0x4D, 0x1D, - 0x8B, 0x0C, 0x1E, 0x39, 0x89, 0xEA, 0x9A, 0xA4, 0xA1, 0xBA, 0xDE, 0xFB, 0x08, 0x78, 0x3A, 0x8B, - 0xC6, 0xB3, 0x37, 0x0D, 0xDC, 0xB1, 0x1B, 0xD8, 0x0F, 0x18, 0xD0, 0x75, 0xAB, 0xA2, 0x4B, 0x36, - 0xE2, 0x7B, 0x4A, 0x3F, 0xC0, 0xA3, 0x11, 0x1D, 0xF1, 0x03, 0x38, 0x44, 0xD2, 0x13, 0xFE, 0x3B, - 0xCB, 0x7E, 0x40, 0x03, 0x72, 0xDE, 0xF5, 0x77, 0xEA, 0x20, 0xDC, 0xCB, 0xF4, 0x7C, 0x89, 0xC6, - 0xC1, 0x72, 0xA7, 0xBE, 0x5B, 0xD3, 0x10, 0xA0, 0x83, 0xB3, 0x04, 0x80, 0x46, 0xE6, 0x2D, 0x1E, - 0x25, 0x41, 0x2D, 0xD3, 0xEF, 0x75, 0xD8, 0xFB, 0xED, 0xD4, 0xA7, 0xE3, 0xAD, 0x4D, 0xE3, 0x40, - 0x84, 0xE0, 0xDF, 0xBC, 0xEF, 0xF5, 0xEB, 0xBB, 0xE4, 0x1F, 0xF4, 0x6E, 0x85, 0x56, 0x2D, 0x87, - 0xD5, 0x86, 0x0D, 0xB0, 0x06, 0x2B, 0xFD, 0x5E, 0x47, 0x01, 0xD9, 0x09, 0xEF, 0xD4, 0xE9, 0xA7, - 0x5B, 0xF7, 0xA9, 0x0E, 0xBB, 0x8D, 0x29, 0xF9, 0x50, 0x27, 0x1B, 0xC0, 0x0C, 0x6A, 0x4A, 0x51, - 0xB0, 0x42, 0x38, 0x58, 0xAE, 0xC5, 0x8F, 0x67, 0xF9, 0xE9, 0xC5, 0xF9, 0x5E, 0x1F, 0xD8, 0xCE, - 0x7E, 0x79, 0x25, 0xAC, 0x0F, 0xA9, 0xFA, 0xDD, 0xB3, 0xDF, 0x1C, 0x91, 0x7D, 0xB6, 0x4B, 0xD8, - 0xCF, 0x7E, 0x79, 0x25, 0xEC, 0x0F, 0xA9, 0xFA, 0xBD, 0xB3, 0x7F, 0x1F, 0xDB, 0x87, 0xEE, 0xB4, - 0xBE, 0xCB, 0xFE, 0xFB, 0x3A, 0x98, 0x1F, 0xD2, 0xF4, 0x7B, 0xE7, 0xFD, 0xFF, 0xFB, 0x02, 0x13, - 0x1C, 0xFE, 0x7D, 0x1D, 0x7C, 0x67, 0xF4, 0xCC, 0x87, 0xEB, 0xB0, 0xA5, 0x19, 0x3A, 0xBE, 0x2F, - 0xA3, 0xA8, 0x35, 0xDB, 0xB6, 0xE3, 0x60, 0xEF, 0xC3, 0xD5, 0xD9, 0x29, 0x59, 0x70, 0x35, 0x60, - 0x93, 0xDB, 0xCF, 0xE4, 0x29, 0x34, 0xFD, 0x18, 0xFA, 0x9F, 0xFF, 0x99, 0x73, 0x9E, 0xD2, 0xEE, - 0x4E, 0x5F, 0xCF, 0x8E, 0xE0, 0xF6, 0x49, 0xE2, 0x57, 0xB4, 0x1D, 0x58, 0xF9, 0x41, 0x42, 0xA2, - 0xA5, 0xE7, 0x77, 0x35, 0x2D, 0xD5, 0x1E, 0xF6, 0xF7, 0xF7, 0x48, 0x17, 0xE1, 0xDF, 0x57, 0xC0, - 0x6E, 0x46, 0xCC, 0xEF, 0x9A, 0xDF, 0xAF, 0x60, 0xF9, 0x4F, 0x25, 0xE9, 0x77, 0xCD, 0xF8, 0x1F, - 0xBE, 0xF0, 0xA7, 0x11, 0xF4, 0xFB, 0x16, 0xF7, 0x1F, 0x7F, 0xD8, 0x48, 0x25, 0xE9, 0xF5, 0x2E, - 0xFC, 0x7A, 0x13, 0xBB, 0x70, 0xE5, 0x00, 0x08, 0xC3, 0x7B, 0xDE, 0x8F, 0xD8, 0xF3, 0x09, 0xD4, - 0x13, 0x27, 0xD0, 0xDE, 0x3F, 0x9C, 0xB9, 0x96, 0x7D, 0xF7, 0x8C, 0x7C, 0x6E, 0xE6, 0x41, 0xD6, - 0x14, 0xA3, 0xC0, 0x45, 0x77, 0xBC, 0x35, 0x1A, 0xD9, 0x63, 0x3B, 0x60, 0x44, 0x2F, 0x7E, 0xE7, - 0x31, 0x3F, 0x0B, 0x50, 0xCF, 0xF5, 0x02, 0x70, 0x04, 0x78, 0x11, 0x1B, 0x50, 0x9F, 0x31, 0xC8, - 0xF4, 0x9E, 0x67, 0xB2, 0xCD, 0x14, 0x45, 0xD7, 0xC3, 0x64, 0x90, 0x03, 0xCF, 0x36, 0x1D, 0x40, - 0xB7, 0xFA, 0xB2, 0x96, 0xA7, 0xB5, 0x85, 0x33, 0x13, 0x9B, 0x80, 0x67, 0x7D, 0xE1, 0xDD, 0xB2, - 0xBD, 0x5B, 0xD7, 0x73, 0x30, 0xEA, 0x0C, 0x01, 0xDF, 0xC6, 0x8B, 0xE1, 0xEB, 0x52, 0x7C, 0x6F, - 0x5E, 0x0C, 0xDF, 0x1A, 0xC5, 0xB7, 0xB9, 0x68, 0x7C, 0x9F, 0x3C, 0xDB, 0x0F, 0x00, 0xD3, 0xD6, - 0xA2, 0x31, 0xED, 0xDB, 0xDF, 0xA8, 0x28, 0x76, 0xE6, 0x36, 0xB1, 0xC3, 0x6B, 0xD0, 0xDD, 0x1D, - 0xD4, 0xE9, 0x76, 0xB4, 0xAA, 0xA9, 0xBC, 0x7A, 0xCA, 0x53, 0x51, 0x67, 0xEE, 0x23, 0xF6, 0x68, - 0x3F, 0xF4, 0xC6, 0xE3, 0x8A, 0x7D, 0xC9, 0xE2, 0xDC, 0xD1, 0x72, 0x7F, 0xE0, 0xBA, 0x01, 0x47, - 0xDB, 0x9D, 0x27, 0xDA, 0xEF, 0x45, 0x2E, 0x84, 0x57, 0x56, 0xFA, 0x44, 0x6F, 0xC1, 0x32, 0x33, - 0x04, 0x77, 0x45, 0x13, 0x3C, 0xCC, 0x6E, 0x9F, 0x11, 0x5C, 0xE1, 0x4E, 0x1D, 0x3B, 0xC8, 0x5B, - 0xD6, 0x7C, 0xEB, 0xD8, 0xC3, 0xB8, 0x3F, 0x21, 0x8B, 0x48, 0xAD, 0x29, 0xE3, 0x23, 0xEB, 0x8D, - 0x52, 0xB5, 0x6F, 0xFF, 0x3D, 0xB7, 0xD6, 0xBD, 0xE9, 0x59, 0xB0, 0xCA, 0x9D, 0x1C, 0xE6, 0xD5, - 0xD4, 0xAC, 0xA8, 0x79, 0x4D, 0x2C, 0xF3, 0xD9, 0xBF, 0xC4, 0x63, 0xD3, 0x76, 0x48, 0x8F, 0xF3, - 0x2A, 0x4F, 0x3C, 0x17, 0xEE, 0xD7, 0x0D, 0x70, 0xA9, 0x2A, 0x58, 0xB7, 0x53, 0xA2, 0x6E, 0xB7, - 0x44, 0xDD, 0xD5, 0x12, 0x75, 0xD7, 0x4A, 0xD4, 0x5D, 0x2F, 0x51, 0x77, 0xA3, 0x44, 0xDD, 0x37, - 0x45, 0xEA, 0x7A, 0xA6, 0x65, 0xBB, 0x67, 0x7B, 0x07, 0xB9, 0x83, 0x86, 0x1F, 0xEC, 0x01, 0xDE, - 0xBF, 0xCA, 0x97, 0x88, 0x91, 0x3B, 0x0C, 0x7D, 0x2B, 0xF3, 0xAA, 0xDE, 0x9A, 0x01, 0x99, 0x73, - 0xCF, 0x3D, 0xEC, 0x0D, 0x30, 0x6C, 0xC3, 0xE2, 0xDA, 0x09, 0x55, 0x43, 0x34, 0x8B, 0x6D, 0xC9, - 0x9B, 0x43, 0xD9, 0x09, 0x22, 0x77, 0xEF, 0xE7, 0x05, 0xDF, 0x12, 0x82, 0xAA, 0x43, 0xA3, 0xAD, - 0x98, 0x81, 0x38, 0xBD, 0xD9, 0xF5, 0x64, 0x48, 0xD8, 0x8B, 0x6B, 0x33, 0x91, 0x3D, 0x80, 0xFB, - 0x43, 0x6F, 0x7C, 0x09, 0xAE, 0x8E, 0x1A, 0x82, 0xA9, 0x0B, 0x24, 0xDC, 0x4B, 0x12, 0x8D, 0x8A, - 0x1B, 0xCD, 0x0A, 0x90, 0xC1, 0x5B, 0xF2, 0x12, 0x0F, 0xB0, 0x3D, 0xD1, 0xC1, 0x4F, 0x56, 0x52, - 0x91, 0xE4, 0xA1, 0xE1, 0xD2, 0xC8, 0xFC, 0x6A, 0x75, 0x18, 0xA6, 0x9E, 0x47, 0x46, 0xBF, 0x27, - 0x56, 0xD3, 0x32, 0xF9, 0xCF, 0x8D, 0x1A, 0x3D, 0xB8, 0xFC, 0x06, 0x2E, 0xE0, 0x3B, 0x1C, 0xEC, - 0x25, 0xC8, 0xEF, 0xD7, 0xDF, 0xD8, 0xD1, 0x05, 0xDC, 0x5D, 0xB4, 0xE0, 0x96, 0x50, 0xED, 0x2B, - 0x19, 0x06, 0xD2, 0x66, 0xD2, 0x60, 0x07, 0x1E, 0x0C, 0xDE, 0xE0, 0xE0, 0xE1, 0x52, 0x8A, 0x65, - 0xE1, 0xEE, 0xFF, 0x7A, 0x02, 0xFE, 0xE4, 0x21, 0xDB, 0x35, 0x9D, 0xD2, 0x57, 0x6C, 0xCC, 0x80, - 0x0C, 0xF6, 0xD2, 0x53, 0x3F, 0x17, 0x15, 0xAB, 0xD6, 0xE0, 0x9E, 0x59, 0xC5, 0x0F, 0x46, 0xB1, - 0xCB, 0xB6, 0x76, 0x56, 0x88, 0x0E, 0xDD, 0x5A, 0xF1, 0x9F, 0x71, 0x72, 0x0A, 0x8E, 0xE1, 0x59, - 0xF8, 0xE9, 0xC2, 0xBD, 0x48, 0xFC, 0x7B, 0xA3, 0xAC, 0xFE, 0x33, 0xD7, 0xF4, 0x45, 0xE0, 0xA7, - 0x1E, 0xEE, 0x1A, 0xCC, 0xA1, 0xE7, 0xFB, 0xA2, 0x70, 0x7E, 0x4E, 0xC1, 0xF9, 0x79, 0x81, 0x38, - 0xBF, 0xA4, 0xE0, 0xFC, 0xB2, 0x28, 0x9C, 0xFE, 0xC4, 0x71, 0x1F, 0x7B, 0x18, 0x7B, 0x07, 0xE0, - 0x6F, 0xA8, 0xC1, 0x1E, 0x6D, 0x73, 0x91, 0xD1, 0xD4, 0x5B, 0x2A, 0x26, 0xA4, 0x35, 0x59, 0x25, - 0x55, 0xFB, 0x44, 0xAD, 0x56, 0x86, 0x10, 0x0E, 0x24, 0x65, 0xD9, 0xD1, 0xA2, 0x58, 0xA2, 0xBD, - 0x05, 0xFD, 0xF5, 0xEE, 0xD6, 0xDB, 0x2D, 0x85, 0xCD, 0x67, 0x87, 0x6F, 0xF0, 0xB6, 0xD7, 0xAE, - 0x1B, 0x91, 0x2F, 0x7E, 0x7B, 0x32, 0xF5, 0xEF, 0x4B, 0x6B, 0x0C, 0x0E, 0x3E, 0xF4, 0xDA, 0x4F, - 0x47, 0x11, 0xD6, 0xA8, 0x86, 0xE6, 0x6E, 0xCC, 0x36, 0x12, 0x09, 0xE8, 0x4A, 0x0C, 0x47, 0x49, - 0x99, 0xB8, 0x1B, 0xB3, 0x6D, 0xB0, 0x46, 0x9B, 0x8A, 0x91, 0x12, 0xD4, 0x84, 0x15, 0x78, 0xC8, - 0x1C, 0xD9, 0x43, 0x67, 0xA7, 0x3E, 0xC2, 0x77, 0x41, 0xD2, 0xFE, 0xA5, 0x6B, 0x62, 0xED, 0xC2, - 0x5A, 0x24, 0xD1, 0x08, 0x63, 0xB8, 0x02, 0x05, 0x85, 0x9B, 0x87, 0x23, 0x5F, 0xBC, 0x15, 0xB7, - 0xF8, 0xA9, 0x86, 0x3D, 0xB0, 0xE7, 0xE9, 0xE8, 0xA9, 0x23, 0xBA, 0x94, 0xD6, 0x01, 0xD8, 0xC9, - 0x61, 0x3D, 0xCD, 0x52, 0x88, 0x04, 0x0F, 0x57, 0x6A, 0x84, 0xAB, 0xEF, 0x16, 0xA5, 0x69, 0x25, - 0x28, 0x29, 0xB5, 0x64, 0xBC, 0x49, 0x63, 0xCD, 0xC0, 0x40, 0x60, 0x07, 0xD0, 0x5E, 0x6E, 0x0D, - 0x9D, 0xDE, 0x3E, 0x85, 0x91, 0x31, 0x26, 0x5F, 0xA8, 0xC9, 0x61, 0x0B, 0xC9, 0x9F, 0x6F, 0xAE, - 0xF7, 0x7F, 0xBD, 0x39, 0x3F, 0x3B, 0xDA, 0xBB, 0x39, 0xBC, 0x3A, 0x53, 0xCA, 0x20, 0x8A, 0x85, - 0x96, 0x43, 0x64, 0xCD, 0x4D, 0xC7, 0x30, 0xD6, 0x65, 0xB2, 0x84, 0x50, 0x19, 0x2E, 0x89, 0xB6, - 0xB5, 0x9D, 0x5A, 0xE5, 0x92, 0x79, 0xD6, 0x26, 0xB5, 0x9C, 0x02, 0xE6, 0x94, 0xDA, 0x8C, 0xB5, - 0xEE, 0xB5, 0x42, 0xCD, 0x43, 0xEE, 0x35, 0x1E, 0xB7, 0x0B, 0xBD, 0xC7, 0x6F, 0x12, 0x27, 0x58, - 0xE0, 0x8C, 0xD0, 0x2C, 0x74, 0x1E, 0x27, 0x07, 0xFB, 0xB5, 0xD4, 0xBB, 0xCE, 0xB1, 0x14, 0xE7, - 0x23, 0xB4, 0xFE, 0xAD, 0xFB, 0x75, 0x3B, 0x8F, 0x8D, 0x3B, 0x08, 0x7E, 0xD5, 0x9B, 0x14, 0xD4, - 0x20, 0xA2, 0x3F, 0xED, 0x88, 0xB8, 0x52, 0xCD, 0x0C, 0xC9, 0xD8, 0x23, 0xA1, 0x55, 0xCA, 0x89, - 0x5D, 0x0C, 0x63, 0xA2, 0x12, 0x79, 0xEF, 0x69, 0xCD, 0xD1, 0xDF, 0x75, 0x2E, 0x60, 0x9A, 0x11, - 0x91, 0xB9, 0x00, 0x93, 0xE8, 0x86, 0x7A, 0xF4, 0x0B, 0x9F, 0x57, 0x53, 0x99, 0x43, 0x65, 0x68, - 0xCD, 0x78, 0xD3, 0xBD, 0x31, 0x08, 0xA8, 0xE8, 0x2F, 0x3D, 0x93, 0x34, 0xA3, 0xB5, 0xB3, 0x83, - 0xD6, 0x53, 0xB9, 0x53, 0x95, 0x58, 0xED, 0xE7, 0xB5, 0xB2, 0x7D, 0xB8, 0x31, 0x8A, 0x98, 0x3E, - 0xE4, 0x0F, 0x89, 0xB1, 0x51, 0xEF, 0x5C, 0x86, 0x9E, 0x3B, 0x9D, 0x20, 0xCF, 0x7D, 0x64, 0x2A, - 0x6C, 0xEC, 0x0F, 0x05, 0x3A, 0x23, 0x25, 0x96, 0x18, 0xCF, 0x04, 0x5C, 0x76, 0x05, 0x43, 0x6F, - 0x5A, 0x74, 0x00, 0x42, 0x9C, 0x03, 0x77, 0xB4, 0xEC, 0x8F, 0x97, 0xD7, 0x10, 0xFC, 0xB2, 0x41, - 0xFF, 0xA5, 0x64, 0xB0, 0x9B, 0x9A, 0x5D, 0xA5, 0x29, 0x63, 0x32, 0x69, 0xFF, 0x36, 0xED, 0x6E, - 0x26, 0xAB, 0x7F, 0x12, 0xAE, 0xB5, 0xBA, 0xAC, 0xB9, 0x59, 0xC8, 0xA1, 0xA2, 0x8F, 0x5D, 0x27, - 0xF0, 0xDC, 0x51, 0x3D, 0x0F, 0x49, 0xA4, 0xEC, 0x13, 0xBD, 0xE4, 0xD7, 0x3B, 0x42, 0x19, 0x55, - 0x47, 0xC5, 0x58, 0x38, 0x49, 0x83, 0x7B, 0xE4, 0x79, 0x6E, 0x4C, 0xAA, 0xED, 0x8C, 0x6C, 0x07, - 0xB3, 0x6F, 0x64, 0x91, 0x98, 0xE4, 0x03, 0xA6, 0x17, 0x44, 0xC9, 0x6B, 0xA2, 0x7C, 0xCD, 0x0E, - 0x8E, 0x29, 0x82, 0x70, 0xFA, 0xDA, 0x5B, 0x1C, 0x94, 0xA8, 0x46, 0x15, 0xD4, 0xFB, 0x1E, 0x51, - 0x51, 0xF9, 0x75, 0x41, 0xBA, 0x2F, 0xDD, 0x07, 0xEC, 0x51, 0xA9, 0x27, 0xCA, 0xBF, 0x53, 0xAC, - 0x0D, 0x5D, 0x34, 0xF4, 0x4D, 0x2A, 0xAD, 0x17, 0x34, 0xDC, 0xE8, 0x98, 0x1C, 0xEF, 0x02, 0x75, - 0xFF, 0xF4, 0x22, 0x6B, 0x47, 0x8E, 0x66, 0xE9, 0x7C, 0xDD, 0xFE, 0x39, 0xB3, 0x7F, 0xCE, 0xEC, - 0xB9, 0xCD, 0x6C, 0x21, 0x58, 0x96, 0x87, 0xC9, 0x3E, 0x6B, 0xE6, 0xB6, 0x1C, 0x56, 0x9B, 0x35, - 0x97, 0xE2, 0x5A, 0x21, 0xB8, 0x70, 0x4A, 0x9D, 0x38, 0xA9, 0x13, 0x2A, 0x6E, 0xC4, 0x67, 0x8A, - 0x8C, 0x2B, 0x7D, 0xB2, 0x24, 0xE9, 0x0A, 0xE7, 0x8C, 0x0C, 0x52, 0x37, 0x6D, 0x80, 0x15, 0xFA, - 0x60, 0xE2, 0x70, 0x07, 0xF0, 0x4E, 0x1F, 0x8C, 0xAC, 0xDD, 0x14, 0xA4, 0x40, 0xA2, 0xC7, 0x30, - 0x0D, 0x85, 0xCD, 0xED, 0x02, 0x20, 0xE2, 0xB8, 0x65, 0x15, 0x4E, 0xC8, 0xDB, 0x02, 0x81, 0x21, - 0x7A, 0xF7, 0x81, 0x28, 0xDC, 0xF0, 0xCA, 0x75, 0xD1, 0xD8, 0x74, 0x9E, 0x45, 0xEC, 0xC8, 0x67, - 0x1D, 0xAD, 0x95, 0xB3, 0x70, 0xC2, 0x61, 0xC5, 0x76, 0x86, 0x42, 0x74, 0xB7, 0xCE, 0x00, 0x99, - 0xAC, 0x55, 0xEE, 0x90, 0xE1, 0xC4, 0x0D, 0xD3, 0x2D, 0xCB, 0xC9, 0x4A, 0x15, 0x8C, 0x74, 0xD4, - 0x17, 0x21, 0xBB, 0x37, 0xC9, 0x4A, 0xE5, 0x3A, 0xE3, 0x06, 0x66, 0xD8, 0x30, 0xD5, 0xE4, 0x98, - 0xA8, 0x53, 0xBA, 0x2B, 0xDC, 0xF2, 0x7F, 0x42, 0x06, 0x3E, 0xBE, 0x2C, 0xD0, 0x9A, 0x45, 0xB4, - 0x35, 0xDB, 0xBE, 0x37, 0xA8, 0x62, 0x4A, 0x4F, 0x44, 0x00, 0x6B, 0x2D, 0xDE, 0xBA, 0x38, 0xE1, - 0xB2, 0xF6, 0x05, 0x9E, 0x43, 0x43, 0x6B, 0x61, 0x88, 0xD2, 0x6B, 0x54, 0x02, 0xEA, 0xC2, 0xA5, - 0x59, 0x0A, 0x54, 0x96, 0xA1, 0x23, 0x01, 0x56, 0xBC, 0x68, 0xA4, 0x07, 0x78, 0x74, 0xEB, 0x3E, - 0x61, 0x1F, 0xAD, 0x20, 0x7A, 0xFD, 0x83, 0x6E, 0xA7, 0x41, 0x20, 0xF9, 0xB1, 0x14, 0x8C, 0x81, - 0x0D, 0xBC, 0x67, 0x9D, 0xE2, 0xE1, 0x26, 0x3B, 0x6E, 0x67, 0xD7, 0x47, 0x92, 0x7E, 0x47, 0x03, - 0x33, 0x18, 0xDC, 0xA3, 0x06, 0x86, 0x15, 0x25, 0x45, 0x7F, 0x89, 0x81, 0xD4, 0xBE, 0x3F, 0xC5, - 0xE8, 0xD1, 0x26, 0x3A, 0xF0, 0xE4, 0x30, 0x0C, 0x47, 0x2E, 0x19, 0x6D, 0x9B, 0x13, 0x2D, 0x5C, - 0xB4, 0x37, 0x61, 0x0E, 0x8A, 0x17, 0xEE, 0x8E, 0x38, 0x88, 0x7B, 0xA3, 0x11, 0xF2, 0xF0, 0x70, - 0x3A, 0x82, 0x18, 0x6F, 0xBA, 0xBD, 0x60, 0x03, 0x6A, 0x3A, 0x16, 0xDB, 0x0C, 0xA8, 0x63, 0x59, - 0xAA, 0xAB, 0x14, 0x82, 0xD6, 0x4C, 0xF1, 0x42, 0xA3, 0xF6, 0x5D, 0x1B, 0x4B, 0x1F, 0x46, 0xDC, - 0x21, 0xB8, 0xE7, 0xC0, 0x62, 0xB0, 0x1C, 0x35, 0x9F, 0xB2, 0x0B, 0x9F, 0x83, 0x7B, 0xD3, 0x19, - 0x62, 0xBE, 0x21, 0x57, 0xAC, 0xB5, 0xF5, 0xFA, 0x76, 0x5C, 0x9F, 0x5E, 0x9C, 0xF1, 0x5B, 0xA2, - 0x33, 0xB2, 0xFD, 0xD4, 0x54, 0x0D, 0xA9, 0x38, 0x74, 0x9D, 0x7A, 0x80, 0xA6, 0x2C, 0x2E, 0x9A, - 0x08, 0x92, 0x49, 0xB8, 0xFF, 0x88, 0xC1, 0xBE, 0x89, 0xED, 0x07, 0x22, 0x12, 0x8F, 0xA6, 0x2F, - 0x68, 0x0D, 0x32, 0x20, 0x77, 0x2E, 0xCF, 0x21, 0x44, 0x84, 0x4E, 0x0D, 0xAB, 0x66, 0xB3, 0x41, - 0x62, 0x5D, 0x46, 0x96, 0x93, 0x78, 0xC8, 0x8F, 0x5D, 0xB2, 0xFE, 0x91, 0xC1, 0xA4, 0x59, 0x7B, - 0x38, 0x31, 0xC2, 0x28, 0x43, 0x97, 0xC6, 0xD8, 0xF4, 0xA7, 0x1E, 0xAD, 0x00, 0xFB, 0xBF, 0x0F, - 0x7F, 0x27, 0x9D, 0xB2, 0x6C, 0x7F, 0x02, 0x43, 0x46, 0xD3, 0x21, 0x81, 0xD3, 0x02, 0x3A, 0x98, - 0xFA, 0x81, 0x3B, 0x66, 0x7F, 0xD7, 0x07, 0x94, 0x5D, 0xF5, 0xA6, 0x38, 0x26, 0x1A, 0x50, 0x7D, - 0x3C, 0xA8, 0x0E, 0x0B, 0xC2, 0x39, 0x41, 0x8B, 0xB2, 0xE0, 0xC3, 0x13, 0x67, 0x76, 0x48, 0xC7, - 0xA0, 0xEC, 0xAA, 0x83, 0xA1, 0xBA, 0x72, 0x9F, 0x06, 0x99, 0x8A, 0xC9, 0x1F, 0x98, 0xA5, 0x7C, - 0xCE, 0x40, 0xDF, 0x63, 0xB7, 0x3A, 0x4C, 0xEC, 0x80, 0x35, 0xF5, 0x3C, 0xF0, 0xEC, 0x49, 0x1F, - 0x13, 0xE6, 0x79, 0x73, 0x01, 0x75, 0x30, 0xB2, 0xE9, 0x6D, 0x7B, 0x55, 0x50, 0x90, 0x33, 0x02, - 0xDC, 0x08, 0x61, 0xAA, 0x39, 0xE0, 0xE3, 0x33, 0x1B, 0x4D, 0x3D, 0xD7, 0x76, 0x82, 0x1E, 0xF6, - 0xEE, 0xC8, 0x56, 0x4F, 0xD8, 0xD9, 0xCE, 0x0A, 0xF6, 0xE8, 0x89, 0x6C, 0x1B, 0x1C, 0x73, 0xD4, - 0x9B, 0x52, 0x65, 0x3F, 0x23, 0x30, 0x7F, 0x72, 0xEE, 0x3E, 0x56, 0x87, 0x62, 0x3A, 0x01, 0x76, - 0x1C, 0xF3, 0x12, 0xDF, 0x61, 0x0F, 0x3B, 0x03, 0xD6, 0xE7, 0x59, 0x89, 0x3A, 0x75, 0x87, 0x43, - 0xEA, 0x41, 0x33, 0x1B, 0x98, 0xBD, 0xCB, 0x5E, 0x25, 0x48, 0x31, 0x2C, 0xA6, 0x8C, 0x60, 0xFA, - 0x40, 0xEA, 0x29, 0x69, 0xBB, 0xC9, 0x8A, 0xC2, 0x2B, 0xA0, 0x44, 0x71, 0x30, 0xE0, 0xD2, 0xB8, - 0x0F, 0xCB, 0x97, 0x5A, 0xC4, 0x64, 0x3E, 0x59, 0x34, 0xB5, 0x26, 0xC9, 0x8F, 0xD6, 0xFD, 0x60, - 0x72, 0xC4, 0x03, 0xBE, 0x35, 0x24, 0x90, 0x0D, 0x17, 0xEC, 0x8E, 0x34, 0x25, 0x07, 0x89, 0xE3, - 0xA6, 0xAD, 0x92, 0xA2, 0x84, 0x7E, 0x87, 0xC8, 0x49, 0x51, 0xB4, 0x5E, 0xC9, 0xC9, 0xD7, 0x68, - 0x64, 0x37, 0x59, 0xE9, 0x42, 0x2D, 0xCF, 0x17, 0x56, 0x3F, 0x78, 0x26, 0x8B, 0x19, 0xF0, 0x78, - 0x44, 0xF3, 0xDC, 0xD5, 0x1C, 0xD7, 0xC1, 0xB5, 0x44, 0xEA, 0x36, 0x1A, 0x70, 0x5E, 0xA0, 0xF5, - 0xED, 0xC8, 0x1D, 0x7C, 0x8B, 0x9A, 0x93, 0xAD, 0x9D, 0x87, 0x61, 0xFD, 0x38, 0xE8, 0x7F, 0x44, - 0x2E, 0x5B, 0xA5, 0xB8, 0xF7, 0x32, 0x4D, 0xF3, 0x22, 0x22, 0xE0, 0x49, 0xB2, 0xE2, 0xB4, 0x75, - 0x2C, 0x75, 0x16, 0xAD, 0x0C, 0xCD, 0x25, 0xEB, 0xD1, 0xCA, 0xCA, 0x49, 0xBC, 0xC5, 0x88, 0xAB, - 0x0F, 0x46, 0x3E, 0xCF, 0x21, 0x07, 0x11, 0x50, 0x51, 0xFE, 0x91, 0xFF, 0x98, 0x92, 0xDD, 0x3A, - 0x4B, 0x93, 0xE6, 0x7A, 0x64, 0x9F, 0xD2, 0xA8, 0xB5, 0x45, 0x2B, 0x47, 0x0B, 0xB1, 0x3F, 0x2D, - 0xCF, 0x9D, 0x58, 0xEE, 0xA3, 0x53, 0xCB, 0x4A, 0x73, 0x23, 0xA0, 0xE0, 0x07, 0x60, 0xF2, 0x7D, - 0x69, 0x49, 0x5A, 0x3C, 0x05, 0xAA, 0x97, 0x76, 0xC4, 0x16, 0xBF, 0x3D, 0x7D, 0x6D, 0xF3, 0x8C, - 0x35, 0xD4, 0x2F, 0x44, 0x2E, 0x61, 0x7B, 0x1C, 0x5A, 0xB8, 0x1D, 0x0D, 0x62, 0xD8, 0x5F, 0x61, - 0x8F, 0xDC, 0xD2, 0x6D, 0x91, 0x57, 0x56, 0x2E, 0xF1, 0xD8, 0x7D, 0xC0, 0xF4, 0xC6, 0x0B, 0xCE, - 0xAA, 0x70, 0x33, 0x46, 0xFF, 0xE0, 0x15, 0xCA, 0xF2, 0x26, 0xBE, 0x6B, 0x7B, 0xEB, 0xB8, 0x41, - 0xA3, 0xAD, 0x5E, 0xB8, 0x35, 0x43, 0xB6, 0x51, 0x62, 0x7E, 0x14, 0xCF, 0xC2, 0x2D, 0xB0, 0x96, - 0x6B, 0x3A, 0x5A, 0xC4, 0x4B, 0xE6, 0x62, 0xB4, 0x48, 0xB7, 0xD6, 0x04, 0x11, 0xE4, 0xAB, 0xA9, - 0xB7, 0xEA, 0xE4, 0x5F, 0x01, 0x16, 0xA1, 0xA5, 0x34, 0x0D, 0xD1, 0x2D, 0x74, 0x39, 0x3A, 0xA2, - 0xEB, 0x6D, 0x1D, 0x2D, 0x61, 0x61, 0x29, 0x7A, 0x32, 0xED, 0x3B, 0xB9, 0x64, 0x69, 0x6C, 0x63, - 0xF4, 0xEE, 0x46, 0x0F, 0x95, 0x11, 0xC6, 0x68, 0xCE, 0x30, 0xE5, 0xA4, 0xD2, 0xAF, 0x6C, 0xBF, - 0x1D, 0xB2, 0xAD, 0x19, 0xB2, 0x5D, 0x7C, 0x4C, 0x56, 0x32, 0x9F, 0x25, 0x68, 0x97, 0x86, 0x5C, - 0x81, 0x55, 0x51, 0x72, 0xF3, 0x11, 0x9E, 0xC4, 0xE9, 0xFB, 0x1A, 0x61, 0x61, 0x0B, 0x75, 0x0D, - 0xC3, 0x68, 0x6A, 0x95, 0x22, 0xB5, 0x3E, 0x12, 0x5D, 0xD8, 0x42, 0xF4, 0xFC, 0x01, 0xA6, 0x46, - 0x59, 0x49, 0x42, 0x6F, 0x99, 0x89, 0x52, 0xD9, 0xCE, 0x83, 0xF7, 0x04, 0x2D, 0x78, 0x8B, 0x80, - 0x19, 0x51, 0x73, 0x86, 0x26, 0x42, 0x32, 0x18, 0x61, 0xD3, 0x0B, 0xB1, 0x14, 0x04, 0x5D, 0xD7, - 0x92, 0xDA, 0x9F, 0x0E, 0x06, 0xE4, 0x10, 0x42, 0x89, 0x15, 0xF3, 0x83, 0x45, 0xB0, 0x78, 0x05, - 0x1D, 0xA1, 0x75, 0x96, 0x22, 0x4C, 0x47, 0x5B, 0x0C, 0xB6, 0x30, 0x44, 0x3D, 0x7D, 0xE4, 0xC8, - 0x13, 0xD2, 0xC6, 0xB9, 0x19, 0x9E, 0x3B, 0xE2, 0x0C, 0xA8, 0x77, 0xFC, 0x9C, 0xA7, 0x3D, 0xB4, - 0x68, 0x8E, 0x90, 0xE1, 0x49, 0x19, 0x0C, 0xC6, 0xB0, 0xD4, 0xB7, 0x3D, 0xAA, 0x25, 0x1B, 0xDC, - 0x76, 0x1C, 0xD1, 0xB7, 0x9D, 0xD3, 0x0C, 0xDC, 0xAB, 0x25, 0x7B, 0x73, 0x8A, 0x69, 0x89, 0x9D, - 0x45, 0xFF, 0xA1, 0x9C, 0x1A, 0xD5, 0xF3, 0x6E, 0x79, 0x42, 0x93, 0x48, 0xF3, 0xC8, 0xD4, 0x75, - 0x2D, 0x97, 0x50, 0x8D, 0x67, 0x53, 0xC6, 0xF0, 0xF3, 0x41, 0x8B, 0xA7, 0x80, 0x28, 0x55, 0xE2, - 0x88, 0xD6, 0xB8, 0x9C, 0xF3, 0x44, 0x73, 0xB1, 0x97, 0x63, 0x42, 0x98, 0x04, 0x19, 0x50, 0xF7, - 0x1A, 0x7A, 0x09, 0xA2, 0x59, 0x55, 0x01, 0x3A, 0x75, 0xA4, 0xE2, 0x39, 0x50, 0x45, 0xA8, 0xB0, - 0x40, 0xF0, 0xB3, 0xF7, 0x47, 0x58, 0x60, 0x45, 0x39, 0xA5, 0x85, 0x7C, 0x39, 0x09, 0x0B, 0x5B, - 0x90, 0xBB, 0xB2, 0xBB, 0xBE, 0x4E, 0xA8, 0x3E, 0x23, 0xFB, 0x4C, 0x74, 0x8B, 0xC9, 0xFF, 0x82, - 0x47, 0x8C, 0x1D, 0x64, 0x50, 0x63, 0x06, 0x29, 0xAB, 0xB5, 0x40, 0xED, 0x8D, 0x46, 0xE6, 0xC4, - 0xC7, 0xEF, 0xCF, 0xFB, 0x7D, 0x96, 0x50, 0x87, 0x1E, 0xD9, 0x13, 0x92, 0x9D, 0x20, 0x00, 0x0E, - 0x64, 0x0B, 0x25, 0x02, 0x10, 0x14, 0x21, 0xE4, 0xFA, 0x6C, 0x6B, 0xD3, 0x28, 0x44, 0xC9, 0x46, - 0x3A, 0x21, 0x1B, 0xB3, 0x31, 0x83, 0xD2, 0x50, 0x98, 0x23, 0xD5, 0xE8, 0x48, 0xE3, 0x07, 0xAF, - 0xDB, 0x67, 0x4B, 0x10, 0xD1, 0xF6, 0x03, 0x16, 0x3B, 0x31, 0x30, 0x3D, 0x2C, 0x29, 0x71, 0x5E, - 0xA2, 0x9B, 0x9D, 0x20, 0xE5, 0xD1, 0x14, 0x23, 0x55, 0x59, 0x5B, 0xDD, 0x34, 0x26, 0x0B, 0xD7, - 0x32, 0x2D, 0x5D, 0x86, 0x3D, 0x66, 0xD9, 0x36, 0xD3, 0x49, 0x66, 0x0B, 0x36, 0xEF, 0x35, 0x28, - 0xE4, 0x2E, 0x93, 0x1D, 0xA6, 0x0D, 0xE7, 0x8B, 0x63, 0x1B, 0x8F, 0x2C, 0xBF, 0x21, 0x64, 0x88, - 0x3C, 0xE0, 0xCC, 0xE0, 0x5B, 0xF4, 0x81, 0x10, 0x44, 0xA8, 0xF2, 0x29, 0x62, 0x32, 0xB7, 0x54, - 0xF1, 0x6C, 0x52, 0x84, 0xFB, 0xA1, 0xBD, 0x0B, 0x48, 0x88, 0x36, 0x84, 0xA9, 0xCD, 0xE3, 0x31, - 0x82, 0xB6, 0x34, 0xEE, 0xB2, 0x6C, 0x43, 0x10, 0x32, 0xDE, 0x96, 0xFC, 0x5A, 0xB0, 0xF9, 0x7E, - 0x9C, 0xCA, 0x8B, 0xB4, 0xA5, 0x89, 0xBD, 0x2A, 0xE0, 0xA5, 0x42, 0xC5, 0xDB, 0x17, 0xC7, 0xDD, - 0xEB, 0x09, 0xDC, 0x12, 0x8D, 0x0C, 0x05, 0x9B, 0x0B, 0xD9, 0xBB, 0x28, 0x04, 0xF8, 0xB3, 0x58, - 0xD3, 0x4F, 0xF6, 0xB1, 0x1D, 0xB7, 0x7C, 0xB4, 0xEF, 0xEC, 0x82, 0x0D, 0xAF, 0x0E, 0x7A, 0xD7, - 0x87, 0x02, 0xD9, 0xE4, 0x10, 0x7C, 0x6D, 0x4D, 0x0A, 0x36, 0xA6, 0xAE, 0xF0, 0x71, 0x5B, 0x7A, - 0x54, 0x28, 0xD8, 0x34, 0x79, 0x06, 0x7E, 0x8E, 0x01, 0x09, 0x3B, 0xC7, 0x82, 0xE0, 0xFA, 0xCF, - 0x7E, 0x80, 0xC7, 0x31, 0x04, 0x9F, 0xFD, 0x5D, 0xAC, 0xF1, 0x91, 0x9C, 0xB5, 0x8D, 0x34, 0x8F, - 0xF2, 0xB8, 0x15, 0x03, 0x70, 0x7E, 0x25, 0x70, 0x10, 0x52, 0xBB, 0x15, 0x6B, 0x76, 0x2C, 0xA4, - 0xF1, 0x24, 0x0D, 0xC5, 0x23, 0x58, 0x04, 0x80, 0xEF, 0x30, 0x92, 0x4B, 0x20, 0x9B, 0xD8, 0x7C, - 0x92, 0x22, 0x86, 0x3E, 0xA9, 0x5F, 0x59, 0x90, 0x57, 0x1C, 0x12, 0x01, 0x77, 0x59, 0x2D, 0xC8, - 0xC1, 0xBC, 0xB6, 0x25, 0xE8, 0xDA, 0x0E, 0xC4, 0x19, 0xAF, 0x6D, 0x91, 0x96, 0xA6, 0x67, 0x0E, - 0x02, 0xEC, 0xF9, 0xA2, 0xB6, 0x95, 0x15, 0x41, 0x53, 0xC0, 0x0E, 0x53, 0x26, 0x15, 0x35, 0x53, - 0xED, 0x1A, 0x13, 0x71, 0x0B, 0x52, 0xE4, 0x1A, 0x46, 0xA7, 0xDB, 0xA2, 0x89, 0x7E, 0x93, 0x1A, - 0x9F, 0x95, 0x52, 0xBD, 0xDF, 0x31, 0x68, 0x03, 0x9D, 0x56, 0x89, 0xD8, 0x0B, 0x38, 0xE5, 0x98, - 0xEE, 0x46, 0x4C, 0xA4, 0x8E, 0x22, 0xDB, 0x21, 0x1F, 0x1E, 0x6A, 0x74, 0xCD, 0xD9, 0x32, 0x52, - 0xD7, 0x9C, 0x2D, 0xA3, 0x08, 0xE6, 0x04, 0xEC, 0x83, 0xF3, 0x8B, 0xD9, 0x40, 0xC7, 0x7B, 0xE1, - 0x34, 0x33, 0x6A, 0x74, 0x33, 0xA4, 0xD9, 0x25, 0xEB, 0x46, 0xDF, 0x89, 0x5B, 0x1F, 0x98, 0x84, - 0x4F, 0xDE, 0x07, 0xD7, 0x0F, 0xB8, 0x1C, 0xAC, 0x27, 0xE4, 0x60, 0x3D, 0x45, 0x0E, 0x34, 0x1C, - 0x48, 0xE1, 0x42, 0x02, 0x1F, 0x68, 0x36, 0x86, 0x6F, 0x0B, 0x7E, 0x54, 0x94, 0xF4, 0x63, 0x49, - 0x54, 0x9A, 0xBE, 0xD1, 0xE4, 0xBE, 0xCC, 0xD0, 0x49, 0x71, 0xAD, 0x1A, 0x2A, 0xA2, 0x55, 0xA3, - 0x7A, 0xDF, 0x58, 0x4F, 0xAE, 0x7D, 0xEC, 0x69, 0x3A, 0x08, 0x9F, 0xA9, 0x0A, 0x0C, 0xBE, 0x75, - 0x87, 0x6E, 0x7B, 0xE0, 0x8E, 0xE1, 0x2F, 0xF8, 0x8A, 0xC6, 0x40, 0xC0, 0x94, 0xAC, 0xBD, 0x44, - 0xA7, 0xD8, 0x64, 0x37, 0x3B, 0x36, 0xED, 0x11, 0x22, 0x2B, 0xBA, 0x47, 0xF6, 0x49, 0x8B, 0x20, - 0xE1, 0xF1, 0xF1, 0xB1, 0x3D, 0x5F, 0x32, 0x52, 0x8E, 0x39, 0xEC, 0xE8, 0xCA, 0x28, 0x4B, 0x97, - 0x31, 0x91, 0x25, 0x52, 0xBF, 0xB2, 0x5B, 0x73, 0x89, 0xE9, 0x76, 0x8C, 0x4E, 0xA1, 0x56, 0xD2, - 0xD8, 0xD7, 0x6E, 0x47, 0x96, 0x77, 0xD3, 0x9F, 0x98, 0xDE, 0xB7, 0xE3, 0xA9, 0xD3, 0xA9, 0x95, - 0x84, 0xD0, 0xFB, 0x54, 0x86, 0xD2, 0x90, 0xEF, 0x01, 0xF6, 0x83, 0xFF, 0x03, 0xFF, 0x94, 0xED, - 0x2A, 0x00, 0x20, 0x28, 0x09, 0x88, 0x9A, 0x6A, 0x2F, 0x17, 0xEA, 0x5E, 0x79, 0xA6, 0xE3, 0x8F, - 0xED, 0xE0, 0xFD, 0xFB, 0xBD, 0x5A, 0xCA, 0x4D, 0x77, 0xC2, 0x9E, 0x08, 0xBB, 0xBD, 0xEB, 0xFD, - 0x5F, 0x43, 0x47, 0x29, 0xD1, 0x9E, 0xBA, 0xB2, 0x32, 0xA6, 0x47, 0x44, 0xA8, 0x62, 0x5B, 0x3E, - 0xF2, 0x03, 0xD3, 0xA3, 0x86, 0x5B, 0x7A, 0x75, 0xAA, 0x78, 0xE1, 0xC6, 0x26, 0xD8, 0xB8, 0x20, - 0xDB, 0xCC, 0x58, 0x67, 0x71, 0x73, 0xB6, 0xF5, 0xAF, 0x3B, 0x0A, 0xAC, 0xAF, 0x99, 0x69, 0xC6, - 0x05, 0xF8, 0xA9, 0x06, 0xAA, 0xA4, 0x43, 0xA3, 0xD0, 0x8A, 0xD9, 0x13, 0xD5, 0xF9, 0x23, 0x9D, - 0x10, 0x85, 0xB6, 0x8A, 0x84, 0x97, 0x61, 0x0A, 0xF5, 0xB8, 0x9C, 0x23, 0x63, 0x28, 0xBC, 0x1F, - 0xCE, 0x1C, 0x7A, 0x56, 0xD3, 0x33, 0x48, 0x23, 0x5A, 0x70, 0xBA, 0xD3, 0x09, 0x57, 0x55, 0x86, - 0x68, 0x3D, 0x67, 0x7F, 0x38, 0x4F, 0xD8, 0x41, 0x3A, 0x5D, 0x6A, 0xE6, 0xD5, 0xDB, 0xD8, 0xF7, - 0xF7, 0x7F, 0x54, 0x97, 0x5F, 0x87, 0xE0, 0xC7, 0x96, 0x8A, 0x6C, 0xE9, 0xA7, 0x6F, 0xCC, 0x88, - 0x5B, 0xDE, 0x70, 0x9F, 0xA6, 0xF1, 0x39, 0x28, 0xBA, 0x4D, 0xE3, 0xBB, 0x26, 0xF7, 0x96, 0x2C, - 0x04, 0x0F, 0x3C, 0xD5, 0x33, 0x39, 0xEC, 0x5B, 0xB0, 0x2E, 0x6F, 0x80, 0x5D, 0xC4, 0xD0, 0xED, - 0x24, 0x37, 0x0C, 0xD8, 0xD1, 0x90, 0x32, 0x71, 0xF5, 0xDE, 0xD7, 0x27, 0xB2, 0xCE, 0xC6, 0xD6, - 0x73, 0x7D, 0x1B, 0xFE, 0xBB, 0x37, 0x18, 0x4C, 0xC9, 0xDE, 0xE8, 0x99, 0xED, 0x9E, 0xD6, 0xDB, - 0x1D, 0x0D, 0xD6, 0x4E, 0x9B, 0xA2, 0x5D, 0x6F, 0x67, 0xA1, 0x4D, 0x5B, 0xFA, 0xA8, 0xC7, 0xC2, - 0x11, 0x0D, 0x3C, 0x6D, 0x49, 0x4F, 0x2B, 0xA5, 0xAF, 0x96, 0x51, 0x93, 0xCF, 0xD0, 0x44, 0x78, - 0x72, 0xA9, 0x40, 0x93, 0x2F, 0xA4, 0x89, 0xF0, 0x14, 0x53, 0x4E, 0x8B, 0x53, 0x33, 0x00, 0xFB, - 0x3C, 0x6D, 0xD3, 0x36, 0xB6, 0x8C, 0xEE, 0xD6, 0xDA, 0x9B, 0xAD, 0xBC, 0x36, 0xAE, 0x33, 0xE4, - 0x8D, 0xD8, 0xD3, 0x52, 0x9B, 0xEB, 0xC6, 0xFA, 0x9B, 0x8D, 0x4E, 0x4E, 0xB3, 0xBD, 0x51, 0x60, - 0x07, 0x53, 0x8B, 0x1E, 0xC5, 0xD6, 0x37, 0x08, 0xB6, 0xCD, 0x0C, 0x44, 0xFC, 0x26, 0xFF, 0x03, - 0xB6, 0x87, 0xF7, 0x80, 0xC8, 0xC8, 0xAD, 0xAA, 0x5C, 0xFA, 0x0B, 0x4D, 0x0A, 0xED, 0xE4, 0x52, - 0xE4, 0x30, 0x1D, 0x6D, 0xB6, 0x28, 0x11, 0x51, 0x91, 0x65, 0x22, 0x9C, 0x31, 0xD9, 0x4E, 0x31, - 0x59, 0x93, 0xA7, 0xEA, 0x08, 0xCE, 0x30, 0x8A, 0xD5, 0x46, 0xB2, 0xE4, 0x68, 0x96, 0x1C, 0x51, - 0x8D, 0x53, 0xB1, 0x3C, 0xC7, 0xE5, 0xF9, 0xF6, 0xC6, 0xA0, 0x3F, 0x2D, 0x14, 0xFD, 0x12, 0xCD, - 0xEE, 0xB0, 0x0C, 0xA6, 0x36, 0xFF, 0xB5, 0x80, 0x56, 0xC9, 0xC3, 0xFA, 0xF9, 0x87, 0x60, 0xFD, - 0xB2, 0x10, 0xAC, 0xDF, 0xB3, 0xDD, 0x1B, 0x2B, 0xE8, 0xB9, 0x8A, 0xBA, 0xAE, 0x9C, 0xBE, 0xD3, - 0xB0, 0x2D, 0xF6, 0x4B, 0x21, 0xCB, 0xD9, 0x47, 0xEC, 0x41, 0xCE, 0x39, 0xF2, 0x6D, 0x85, 0xBA, - 0xF2, 0xC6, 0x91, 0x23, 0xC5, 0x18, 0x2E, 0xC8, 0xFF, 0x72, 0xA7, 0x63, 0xAC, 0xAE, 0xB5, 0xD0, - 0xE6, 0xA6, 0x64, 0x5B, 0x62, 0x9F, 0x81, 0xD9, 0x50, 0x50, 0x68, 0xD1, 0x48, 0x41, 0xA8, 0x4E, - 0x9D, 0x65, 0x78, 0xB1, 0xCF, 0x68, 0x21, 0xFE, 0x1F, 0x01, 0xE3, 0x3A, 0x1F, 0x5E, 0xFA, 0x4B, - 0x75, 0x91, 0x4A, 0x9B, 0x7C, 0xCB, 0x5D, 0x83, 0xCC, 0x74, 0x7A, 0x6D, 0xDC, 0x96, 0x10, 0xD3, - 0x0F, 0x80, 0x98, 0xFE, 0x52, 0x5C, 0xAA, 0xBE, 0x67, 0x18, 0x7D, 0x22, 0x37, 0xBC, 0x4A, 0x46, - 0x1F, 0xD6, 0x3A, 0x3E, 0x90, 0xDF, 0x18, 0xA5, 0xCD, 0x7F, 0x31, 0xE9, 0xE7, 0x57, 0x97, 0x27, - 0xBD, 0x42, 0xB6, 0x1F, 0x11, 0x2D, 0x9C, 0xE4, 0x43, 0xB4, 0xC5, 0xAC, 0x3F, 0x45, 0x31, 0x6A, - 0x7A, 0x1A, 0x1F, 0xE2, 0x17, 0xD8, 0xD3, 0x4C, 0xBC, 0xBD, 0x4F, 0x73, 0xC4, 0x5C, 0xDC, 0xF2, - 0xA2, 0x1D, 0xE8, 0x12, 0xB6, 0x17, 0xED, 0x88, 0x15, 0xB0, 0xBE, 0x88, 0xED, 0xC0, 0x90, 0xC1, - 0xF0, 0x96, 0xB2, 0x85, 0xA8, 0x20, 0x38, 0x07, 0x6B, 0xC5, 0xDA, 0x29, 0x23, 0xCE, 0x4C, 0x3F, - 0xD6, 0xA3, 0x13, 0x3C, 0x3A, 0xDD, 0xB2, 0x10, 0x42, 0xCC, 0x9F, 0x2E, 0xD7, 0x1F, 0x2F, 0xDD, - 0xB5, 0x0F, 0x65, 0x28, 0xA7, 0x4C, 0xEF, 0x14, 0xA7, 0x5B, 0x60, 0x75, 0x27, 0x7B, 0x57, 0xA7, - 0xE7, 0x73, 0x69, 0x54, 0x9C, 0xB5, 0x9D, 0x4A, 0xAC, 0xAD, 0xD4, 0xAA, 0x1C, 0x36, 0x81, 0x8D, - 0xDD, 0x4A, 0x6C, 0xEC, 0x56, 0x61, 0x63, 0xB7, 0x22, 0x1B, 0xBB, 0x95, 0xD8, 0xD8, 0xAD, 0xC8, - 0xC6, 0x6E, 0x25, 0x36, 0xAE, 0x56, 0x62, 0xE3, 0x6A, 0x15, 0x36, 0xAE, 0x56, 0x64, 0xE3, 0x6A, - 0x25, 0x36, 0xAE, 0x56, 0x64, 0xA3, 0xDC, 0x4E, 0x38, 0xD5, 0x8B, 0x1E, 0xE1, 0xDA, 0xD3, 0x7D, - 0x9E, 0xE3, 0x78, 0xD6, 0xE2, 0x1C, 0x06, 0xB7, 0xD0, 0x98, 0x11, 0x01, 0xC2, 0x21, 0x4D, 0x70, - 0xC7, 0x6F, 0xD7, 0xAE, 0xDC, 0x6F, 0x18, 0x6C, 0x06, 0xB4, 0xF2, 0xB6, 0x7C, 0x58, 0xA2, 0xDF, - 0xA2, 0xFC, 0x19, 0x89, 0x8C, 0x41, 0xDA, 0xFB, 0xBE, 0x6C, 0x3C, 0x2D, 0xB4, 0xBA, 0xC1, 0xFE, - 0x1F, 0x2D, 0x50, 0xAB, 0x1B, 0x69, 0xD7, 0x7F, 0xBD, 0x2A, 0xD7, 0x01, 0xB9, 0x04, 0x24, 0x8D, - 0xDD, 0xE6, 0x34, 0x70, 0x7F, 0xC1, 0xCF, 0x97, 0xD8, 0xC1, 0x8F, 0xE6, 0xA8, 0x80, 0x91, 0x1B, - 0x2E, 0xBD, 0x73, 0x6F, 0x3E, 0xE1, 0x2E, 0xFC, 0x1C, 0x07, 0x8F, 0xAE, 0xF7, 0xED, 0xC6, 0xE8, - 0xF7, 0x4F, 0x0E, 0xD9, 0xE5, 0x9C, 0xB4, 0x38, 0x1B, 0x99, 0x8B, 0xB3, 0x70, 0xB7, 0xAE, 0xBB, - 0xF9, 0xD3, 0x22, 0xEA, 0x99, 0xBE, 0x4F, 0x7E, 0xB3, 0x5E, 0x02, 0x59, 0xE7, 0xA5, 0x7A, 0xD5, - 0x79, 0xC9, 0x5E, 0x75, 0x5F, 0xAA, 0x57, 0xDD, 0x97, 0xEC, 0xD5, 0xEA, 0x4B, 0xF5, 0x6A, 0x75, - 0x9E, 0xBD, 0x92, 0xB5, 0xE0, 0xD5, 0x20, 0x79, 0x13, 0x5D, 0xF8, 0x54, 0x12, 0xC5, 0x5F, 0xC4, - 0x57, 0xC2, 0x1B, 0xEB, 0xEB, 0xAB, 0x89, 0x5B, 0x68, 0xFA, 0x31, 0x87, 0xAC, 0xEF, 0x29, 0xD4, - 0x55, 0x3E, 0x32, 0x45, 0x11, 0x20, 0x8B, 0x22, 0xEE, 0xDA, 0xAA, 0x4E, 0xDC, 0xD4, 0x9A, 0x3B, - 0x71, 0x2B, 0x2B, 0x17, 0x0E, 0x0A, 0xBD, 0x5F, 0x5A, 0xE8, 0xEA, 0xA0, 0x87, 0xD8, 0xE0, 0x50, - 0x27, 0x05, 0x86, 0x0D, 0x0D, 0x4C, 0x07, 0x39, 0x2E, 0x85, 0xCF, 0x3A, 0x61, 0x21, 0x33, 0x80, - 0x5B, 0x64, 0xE4, 0x83, 0x9D, 0x3D, 0xB0, 0xC7, 0x38, 0x32, 0x8E, 0x4F, 0x09, 0x14, 0xD7, 0x41, - 0x80, 0xB1, 0x05, 0x55, 0x9E, 0x69, 0xEB, 0x5B, 0xDC, 0x6E, 0xB7, 0xA3, 0x00, 0x4B, 0xEA, 0xAE, - 0xC1, 0x13, 0x85, 0x9D, 0x4D, 0x03, 0xFC, 0x94, 0x94, 0x2B, 0xF0, 0xC0, 0x51, 0x06, 0x93, 0x7C, - 0xAA, 0x4C, 0x5E, 0x06, 0x33, 0x42, 0xAA, 0x98, 0xFF, 0x50, 0xC6, 0xD2, 0x1F, 0x07, 0x2C, 0x95, - 0xB4, 0xEA, 0x8F, 0xCD, 0x27, 0xD2, 0xF6, 0xCA, 0x0E, 0x1D, 0x6F, 0x3A, 0xC6, 0x7A, 0xA7, 0x6B, - 0x24, 0x3C, 0x13, 0x3A, 0x2D, 0xF2, 0xBD, 0xD5, 0x95, 0xCD, 0x15, 0x92, 0x57, 0x53, 0xCE, 0xB9, - 0x9B, 0xE1, 0x39, 0xA5, 0x9B, 0x84, 0x39, 0x61, 0x2A, 0xB4, 0xD0, 0x4B, 0xFD, 0xDB, 0x30, 0xD0, - 0x5F, 0x51, 0x37, 0xC3, 0xD2, 0xAE, 0x50, 0xA9, 0xD4, 0x4F, 0xB1, 0x83, 0x48, 0xF1, 0x62, 0x25, - 0xD9, 0x1F, 0xB7, 0x3D, 0x71, 0x02, 0xB0, 0x52, 0x8F, 0xF8, 0xD4, 0x49, 0x32, 0x66, 0x63, 0x5E, - 0x2C, 0xD1, 0xE3, 0x34, 0x34, 0xFB, 0xCE, 0x70, 0xEE, 0xC5, 0xBD, 0x2E, 0xF2, 0x8E, 0xB1, 0xD8, - 0xCD, 0x93, 0xDE, 0x1E, 0xF3, 0xE1, 0x88, 0x1F, 0x1F, 0x3D, 0xE9, 0xD5, 0x84, 0xAE, 0x39, 0x8E, - 0xD3, 0x16, 0xFE, 0x2F, 0xF6, 0xF0, 0x28, 0xFD, 0xB5, 0xD2, 0x1C, 0x14, 0x87, 0xE7, 0xFD, 0x85, - 0xE3, 0x78, 0x6F, 0x06, 0x64, 0x1F, 0xF8, 0xBC, 0x70, 0x3C, 0xFD, 0xE9, 0x2D, 0xF9, 0x77, 0xBE, - 0x68, 0xB8, 0xF0, 0x85, 0x28, 0xCE, 0x83, 0x09, 0x57, 0xDA, 0x46, 0x52, 0x69, 0x1B, 0x5A, 0xA5, - 0x9D, 0x82, 0x48, 0x90, 0x9D, 0xF3, 0xAB, 0x5E, 0x75, 0xB1, 0x89, 0x8C, 0x75, 0x84, 0xB0, 0xD1, - 0xE8, 0xE8, 0x69, 0xE2, 0x3A, 0x4C, 0xF1, 0xAE, 0x12, 0x49, 0x7D, 0x23, 0x1E, 0x0B, 0xA8, 0xCA, - 0x78, 0x23, 0x92, 0x16, 0x7B, 0x3B, 0xE6, 0x9A, 0x02, 0x27, 0x84, 0x9E, 0x81, 0x4D, 0xF3, 0x93, - 0xB4, 0xD0, 0x32, 0xF8, 0x63, 0x49, 0xF6, 0xD2, 0x55, 0xDA, 0x77, 0xA3, 0x2A, 0xF0, 0x4B, 0xD7, - 0x25, 0x67, 0x8B, 0x11, 0x95, 0x11, 0xB0, 0x03, 0x1B, 0x09, 0x5B, 0x3F, 0xB3, 0x02, 0x1B, 0x2D, - 0xF8, 0xAA, 0x98, 0x82, 0x4B, 0x23, 0xB2, 0xFD, 0x09, 0x4F, 0xB5, 0xB2, 0x10, 0x6C, 0xB1, 0x51, - 0x71, 0x12, 0x19, 0x9C, 0x4F, 0x2C, 0x6E, 0x49, 0x4C, 0x18, 0x12, 0xE9, 0xDE, 0xCD, 0xCF, 0xC6, - 0x20, 0x9D, 0x6F, 0xBD, 0xAC, 0x73, 0xAD, 0x1A, 0xB9, 0x5C, 0x52, 0xC7, 0x62, 0xB1, 0x39, 0xAC, - 0x04, 0xFB, 0xEC, 0xB2, 0x98, 0x81, 0x0B, 0xD5, 0xAD, 0xCA, 0x2D, 0xAE, 0x73, 0x75, 0xDC, 0xEA, - 0xA5, 0x3C, 0x63, 0x9C, 0x87, 0x5B, 0x5C, 0xFD, 0x66, 0xC7, 0x28, 0xFA, 0xBC, 0x08, 0x79, 0x81, - 0xE2, 0x28, 0xB6, 0x54, 0x2F, 0xD0, 0x44, 0xE4, 0x9B, 0x7F, 0x6A, 0xDF, 0x61, 0xBE, 0x15, 0x21, - 0x73, 0x9F, 0x2C, 0xCB, 0x02, 0x59, 0xEB, 0x54, 0x6C, 0xBA, 0x12, 0x3D, 0xE9, 0xEE, 0xD1, 0x4D, - 0x31, 0x34, 0x26, 0x25, 0x93, 0x79, 0x22, 0x48, 0x06, 0x62, 0xA8, 0x79, 0x25, 0x31, 0x02, 0x57, - 0x0E, 0x17, 0x90, 0x5C, 0x4F, 0x45, 0x8F, 0xE3, 0x1D, 0x24, 0x3F, 0xC4, 0x11, 0x07, 0xC6, 0xD5, - 0x7D, 0xF3, 0x01, 0xEF, 0x07, 0xF0, 0xFA, 0x4D, 0xAD, 0x47, 0xD6, 0x40, 0xB2, 0x2A, 0xD2, 0xA5, - 0x90, 0x86, 0x02, 0x09, 0x20, 0x96, 0xC8, 0x07, 0xFA, 0x67, 0xD2, 0x68, 0x13, 0xC6, 0x97, 0x45, - 0xA0, 0xC4, 0x1A, 0x8B, 0x4D, 0xC0, 0x2E, 0x2E, 0xE6, 0x4A, 0x9F, 0x77, 0xE7, 0xD7, 0x65, 0xFF, - 0xD5, 0xF6, 0xF9, 0x1F, 0xB2, 0xFD, 0xA5, 0x48, 0x3E, 0x93, 0x53, 0xD7, 0x84, 0x90, 0xCC, 0x36, - 0xE2, 0x5D, 0x7F, 0x34, 0xED, 0x80, 0x6C, 0xEE, 0xEB, 0xB2, 0xD3, 0x87, 0x5E, 0x2A, 0xF5, 0x2E, - 0x42, 0xA1, 0x7F, 0x50, 0xB2, 0xB7, 0x6F, 0xC3, 0x1E, 0xC4, 0x56, 0x31, 0x31, 0x4A, 0x35, 0x0C, - 0x28, 0x4F, 0xEC, 0x35, 0xE5, 0x61, 0x12, 0xCB, 0xC5, 0x30, 0x49, 0x71, 0x1C, 0xFB, 0xE6, 0x03, - 0x74, 0xAA, 0xDD, 0x56, 0x2E, 0x22, 0x95, 0x08, 0xD3, 0x5A, 0x9C, 0xBF, 0xA5, 0x95, 0x35, 0x06, - 0x2D, 0x05, 0xCC, 0x10, 0xA7, 0x45, 0xD5, 0x24, 0x82, 0x7C, 0xA4, 0x80, 0xA3, 0x99, 0xE2, 0x6B, - 0xE6, 0x10, 0x63, 0x33, 0x53, 0x9C, 0xCD, 0x9C, 0x62, 0x6D, 0xE6, 0x10, 0x6F, 0x33, 0x63, 0xCC, - 0xCD, 0x4C, 0x71, 0x37, 0x33, 0xC7, 0xDE, 0x2C, 0x20, 0x88, 0x66, 0xE6, 0x40, 0x9A, 0xB9, 0x04, - 0xD3, 0xCC, 0x10, 0x50, 0x33, 0x73, 0x50, 0x8D, 0x36, 0x83, 0x06, 0xE8, 0x03, 0x86, 0xF4, 0x9F, - 0x66, 0x89, 0x7C, 0x7D, 0x0B, 0x58, 0xCA, 0xF2, 0xB2, 0x40, 0x6D, 0x1D, 0xED, 0xD4, 0x34, 0xA1, - 0xA8, 0x6A, 0x54, 0x90, 0x18, 0x67, 0x3E, 0xAF, 0x07, 0x13, 0x29, 0x2C, 0xD0, 0xF0, 0xBA, 0x27, - 0x89, 0xE5, 0xBD, 0x34, 0x0B, 0x76, 0x8F, 0x9B, 0xFE, 0xE5, 0x2F, 0x28, 0xA5, 0x25, 0x7B, 0xE7, - 0xB5, 0x62, 0x6B, 0xF6, 0x5C, 0x69, 0x55, 0xD4, 0xEC, 0xCD, 0x4D, 0x5D, 0x6B, 0x6D, 0xB2, 0x44, - 0x5D, 0xD8, 0x48, 0xEE, 0xA2, 0xA6, 0x08, 0x64, 0xF2, 0x51, 0x4E, 0x51, 0x36, 0xEF, 0x5D, 0x97, - 0xFC, 0x87, 0x9C, 0x4F, 0xE5, 0xB7, 0x39, 0x13, 0x0E, 0x3C, 0xB1, 0xE8, 0x2E, 0x2D, 0xA5, 0x3B, - 0x6E, 0xE9, 0x1C, 0xA9, 0x28, 0x15, 0xDA, 0xA7, 0x41, 0x93, 0xB6, 0x5C, 0x8D, 0x60, 0x5C, 0xB9, - 0xDE, 0xE0, 0xBE, 0x96, 0x22, 0x14, 0x9A, 0xC7, 0xCC, 0x8B, 0xCB, 0x85, 0xAE, 0x71, 0x29, 0xD1, - 0x48, 0x7D, 0xC2, 0x7E, 0x06, 0x02, 0x7E, 0x0A, 0x88, 0x56, 0x40, 0x34, 0xEA, 0x67, 0xDF, 0x0E, - 0xCE, 0xCC, 0x49, 0x1C, 0xE2, 0x3E, 0xB6, 0x1D, 0xF2, 0x8F, 0xF9, 0xD4, 0x42, 0xB7, 0xB4, 0x44, - 0x48, 0x2A, 0xD2, 0x8A, 0x16, 0xB4, 0x93, 0x43, 0x71, 0xF5, 0x09, 0x2F, 0x8E, 0xA3, 0x24, 0x89, - 0x1C, 0xE1, 0xD8, 0xF4, 0xBF, 0xB1, 0x12, 0x06, 0x4A, 0x2E, 0xA5, 0xE2, 0xC7, 0x5A, 0xBF, 0x03, - 0xAC, 0x4C, 0xA7, 0xB1, 0x0F, 0xBB, 0x40, 0x01, 0xFB, 0xD0, 0xA0, 0x50, 0xC8, 0x58, 0x77, 0xD0, - 0xBB, 0x77, 0x0C, 0x1B, 0x19, 0x43, 0x32, 0x9C, 0x86, 0x3C, 0x94, 0xD9, 0xD9, 0x48, 0x52, 0x92, - 0x9C, 0x08, 0x8D, 0x85, 0xAE, 0xE5, 0x8E, 0xBC, 0x66, 0x90, 0x32, 0x6D, 0xAE, 0x61, 0xE6, 0x14, - 0x65, 0x20, 0xC2, 0x30, 0x15, 0xC2, 0x09, 0x8D, 0x6F, 0xA3, 0x8F, 0xE0, 0x3D, 0x5D, 0x0B, 0x0F, - 0xEC, 0x09, 0xD9, 0x9A, 0x80, 0x05, 0x44, 0x1D, 0xBA, 0xC8, 0x49, 0x52, 0x4C, 0x57, 0x65, 0xC3, - 0x55, 0xB4, 0xEC, 0x6A, 0xBC, 0x2D, 0x64, 0xA7, 0x8A, 0x7A, 0x89, 0x76, 0xB4, 0x8E, 0x7F, 0x42, - 0x2A, 0x48, 0x0B, 0x07, 0x64, 0xDF, 0x82, 0xAD, 0x63, 0xA2, 0x49, 0x38, 0xA4, 0x38, 0x09, 0xA6, - 0x90, 0x08, 0xEB, 0x21, 0xCC, 0xB6, 0x09, 0x8E, 0xD1, 0x2C, 0x83, 0xAB, 0x6D, 0x91, 0x23, 0x87, - 0x7D, 0xF7, 0x1C, 0xA5, 0x8A, 0x6D, 0x88, 0xE2, 0xD1, 0x8C, 0x05, 0x40, 0x6E, 0xB7, 0x83, 0x64, - 0x2F, 0x6B, 0xBF, 0x7D, 0x70, 0x71, 0x71, 0x79, 0x78, 0x72, 0xBE, 0x77, 0x75, 0x74, 0x73, 0x72, - 0xDE, 0xBB, 0xBE, 0xBA, 0xB9, 0xFA, 0xDC, 0x83, 0x5F, 0x3F, 0xEE, 0x9D, 0x9E, 0x1C, 0xDE, 0x5C, - 0x9F, 0xFF, 0x72, 0x7E, 0xF1, 0xE9, 0x3C, 0x11, 0x62, 0x11, 0x0D, 0x31, 0x10, 0x1A, 0x83, 0x84, - 0xB0, 0x0D, 0xD2, 0x13, 0x34, 0x75, 0xBE, 0x39, 0x90, 0x63, 0x6B, 0xFB, 0x55, 0x4A, 0x0F, 0x9D, - 0x17, 0x44, 0x49, 0x3C, 0x60, 0x8F, 0x30, 0x5F, 0xA0, 0xFE, 0x1D, 0x5A, 0xEE, 0x6C, 0x1A, 0x6C, - 0x56, 0xE8, 0xCA, 0xC9, 0x6E, 0x6A, 0x53, 0x99, 0x14, 0x09, 0x66, 0xC4, 0xEE, 0xA7, 0x9B, 0xCC, - 0x10, 0xB8, 0x69, 0xBC, 0x4E, 0x36, 0x64, 0x4C, 0x21, 0x2E, 0x3D, 0x82, 0x9C, 0x87, 0xAE, 0xF1, - 0xDB, 0x3A, 0x81, 0x64, 0xC9, 0x7F, 0x2B, 0x48, 0x24, 0x6D, 0xF8, 0x53, 0x24, 0x7F, 0x8A, 0x64, - 0x61, 0x91, 0x4C, 0x88, 0xCF, 0x9F, 0x76, 0x24, 0xCD, 0x98, 0xCD, 0x08, 0xA6, 0x67, 0x7D, 0x16, - 0x04, 0x4D, 0x63, 0x3C, 0x5F, 0x11, 0x1F, 0x32, 0x17, 0x05, 0x91, 0x94, 0x89, 0x67, 0x3B, 0xF4, - 0x29, 0xF5, 0x78, 0xA6, 0x55, 0x9B, 0x41, 0x59, 0x03, 0x50, 0x95, 0x12, 0x69, 0x30, 0xE2, 0x0C, - 0x91, 0xB0, 0xFE, 0x59, 0xE0, 0x13, 0x00, 0x37, 0xF2, 0x9A, 0x44, 0xE7, 0xAD, 0x70, 0x9A, 0x42, - 0x39, 0xD9, 0x56, 0xAD, 0x8C, 0x60, 0x70, 0x03, 0x18, 0x37, 0x1E, 0x50, 0x1A, 0x2D, 0xCC, 0x4A, - 0x5A, 0x4D, 0x21, 0x83, 0x8F, 0xBC, 0x26, 0xC7, 0x2B, 0x29, 0x9F, 0x37, 0x14, 0x59, 0x23, 0xAC, - 0xD3, 0xD2, 0x91, 0x21, 0x64, 0xDF, 0x51, 0x14, 0x5F, 0x26, 0x34, 0x52, 0x29, 0x13, 0x5C, 0x32, - 0xE0, 0x82, 0x65, 0x5C, 0xF6, 0x69, 0x77, 0x43, 0x36, 0x73, 0x16, 0x68, 0xF7, 0x90, 0x89, 0x3C, - 0x49, 0xF1, 0x26, 0xB2, 0xF2, 0xE6, 0xB1, 0xE0, 0xF6, 0x90, 0x43, 0x80, 0x0D, 0xC9, 0x8F, 0xDB, - 0x0F, 0xB2, 0x07, 0x2A, 0xE2, 0x9D, 0xD5, 0x4E, 0x6A, 0x36, 0xAA, 0xB9, 0x1D, 0x3E, 0xBE, 0x97, - 0xC7, 0xCE, 0x72, 0x50, 0x65, 0x51, 0x20, 0x06, 0x80, 0x94, 0xA1, 0xA0, 0xB2, 0xDE, 0x4C, 0x97, - 0x25, 0x7E, 0xD3, 0x38, 0x77, 0x61, 0x8A, 0x5F, 0x0C, 0x91, 0x65, 0x2A, 0xF6, 0x5C, 0x05, 0xD1, - 0x9A, 0x9F, 0x24, 0x65, 0x0C, 0x4E, 0x22, 0x9E, 0x62, 0x6E, 0x43, 0x23, 0x65, 0x66, 0xE0, 0x0E, - 0xCD, 0x33, 0xB7, 0x35, 0x4A, 0xCA, 0x44, 0xE2, 0x98, 0xFA, 0x52, 0x8B, 0x71, 0xBA, 0x50, 0xC5, - 0x8E, 0x15, 0x52, 0xB2, 0xCC, 0xB2, 0xD2, 0x04, 0x2B, 0xB7, 0xC5, 0x9E, 0xBF, 0x61, 0xB2, 0xC3, - 0x5F, 0xBD, 0x69, 0xD7, 0x45, 0x5F, 0xC4, 0x86, 0x25, 0x3C, 0x51, 0xF7, 0x27, 0x78, 0x50, 0x30, - 0xA6, 0x99, 0x1E, 0x6C, 0xA1, 0xFC, 0x37, 0xE3, 0x2B, 0x57, 0x5E, 0xF4, 0x9B, 0xED, 0x9F, 0x9B, - 0xE7, 0x0D, 0x76, 0x49, 0x13, 0x96, 0x37, 0x9B, 0xAC, 0x2C, 0xAC, 0xFE, 0x0E, 0x19, 0xF2, 0x87, - 0x5D, 0xC8, 0xC4, 0xD7, 0xD4, 0x42, 0xEF, 0xE4, 0x40, 0xEF, 0xC8, 0xD0, 0x3B, 0x2A, 0xF4, 0x4E, - 0x26, 0xF4, 0x6E, 0x0E, 0xF4, 0xAE, 0x0C, 0xBD, 0xAB, 0x42, 0xEF, 0x66, 0x42, 0x5F, 0xCD, 0x81, - 0xBE, 0x2A, 0x43, 0x5F, 0x55, 0xA1, 0xAF, 0x46, 0xD0, 0x5F, 0xA9, 0x9D, 0xA0, 0x92, 0x08, 0x0B, - 0xD9, 0x75, 0x40, 0x86, 0x6F, 0x4D, 0x0B, 0x7E, 0x87, 0x3C, 0x00, 0x79, 0x02, 0x1D, 0x7A, 0x53, - 0xE8, 0x73, 0xE0, 0x70, 0x09, 0x6F, 0x07, 0xEE, 0xA9, 0xFB, 0x48, 0xE3, 0x1F, 0xE0, 0x12, 0x1E, - 0x06, 0x40, 0x0C, 0xCF, 0xCA, 0x71, 0xFF, 0x04, 0x8A, 0x78, 0x4C, 0x99, 0x9E, 0x96, 0x59, 0x99, - 0x20, 0xBB, 0x64, 0xDA, 0x16, 0x41, 0x66, 0x5B, 0xDD, 0x22, 0x3D, 0x67, 0xC7, 0xBD, 0x8E, 0xC6, - 0x6D, 0x84, 0xDB, 0x11, 0x09, 0x9C, 0x64, 0x61, 0x52, 0x72, 0x3A, 0x33, 0x88, 0x0E, 0x41, 0xF1, - 0xBA, 0x0D, 0x54, 0x9D, 0x94, 0x9B, 0x0F, 0xE0, 0x4D, 0xAA, 0x11, 0x51, 0xF4, 0x2A, 0x04, 0x01, - 0x60, 0x07, 0x6A, 0x25, 0x71, 0xAA, 0xF0, 0x76, 0x4A, 0xA4, 0x46, 0x73, 0x06, 0x9C, 0xBE, 0x44, - 0x72, 0xE5, 0x1E, 0x9B, 0x70, 0x01, 0xFF, 0x7C, 0x88, 0xEF, 0xCC, 0xE9, 0x28, 0xF0, 0x95, 0x2D, - 0xB5, 0x5C, 0x98, 0x7C, 0xB0, 0xA4, 0x16, 0x16, 0xA1, 0xBD, 0x09, 0x51, 0xD2, 0xD8, 0x92, 0x9C, - 0x02, 0x68, 0x1E, 0x0F, 0x8B, 0x06, 0x7E, 0x30, 0x74, 0x70, 0x5F, 0xA3, 0x4F, 0xDC, 0xAC, 0xA0, - 0xBA, 0x84, 0xDA, 0xAD, 0x4E, 0xAB, 0x96, 0x4A, 0xB7, 0xE6, 0xDA, 0x33, 0xD9, 0x87, 0x42, 0x99, - 0xB0, 0x85, 0xC7, 0xC5, 0xD2, 0xF2, 0x8A, 0xE4, 0x64, 0xB1, 0xDE, 0x41, 0x4F, 0xAA, 0xBB, 0x50, - 0x5E, 0x92, 0x7F, 0xB9, 0x4F, 0x7F, 0xC7, 0x9E, 0x1B, 0xA6, 0x29, 0x11, 0x53, 0x76, 0x96, 0x48, - 0xCF, 0x84, 0x1A, 0xE0, 0x00, 0xAD, 0x49, 0x27, 0xD4, 0xFC, 0x67, 0x4E, 0xDC, 0x34, 0x94, 0x53, - 0xB1, 0x44, 0x72, 0x6E, 0xE8, 0x73, 0x36, 0xE9, 0x93, 0x07, 0xF1, 0x11, 0xF9, 0x67, 0xCD, 0x45, - 0x94, 0xCA, 0x83, 0xB6, 0x51, 0x94, 0x0D, 0x71, 0x56, 0xA1, 0xF9, 0xF1, 0xE2, 0xC7, 0x65, 0x2A, - 0x2A, 0xC6, 0x90, 0xE4, 0x0C, 0x83, 0xE9, 0x30, 0xDB, 0x2C, 0xA3, 0x13, 0x4A, 0x37, 0xD3, 0xE6, - 0x3A, 0xCB, 0x7E, 0x48, 0x32, 0xA4, 0x59, 0x67, 0x5A, 0x94, 0xC5, 0xE9, 0x77, 0x92, 0x1C, 0xAA, - 0x8A, 0x90, 0xF1, 0xA5, 0x89, 0x65, 0x7F, 0x22, 0x22, 0x94, 0x5C, 0x90, 0x64, 0x45, 0xBF, 0x3D, - 0x7F, 0x4F, 0x04, 0x7E, 0x9F, 0xAF, 0x7D, 0x1F, 0x9D, 0x65, 0x0D, 0x0C, 0x3B, 0xD2, 0xD9, 0x2E, - 0xD8, 0xAA, 0x5F, 0xAD, 0xD5, 0x55, 0xA5, 0x56, 0x1F, 0x85, 0x56, 0x6B, 0x05, 0x5B, 0x5D, 0x9E, - 0x1D, 0x68, 0x70, 0xA9, 0x06, 0xF6, 0x62, 0x97, 0xF6, 0xD1, 0x8D, 0xB7, 0xE6, 0xF1, 0x66, 0x99, - 0x7F, 0x46, 0x7B, 0x7D, 0xBB, 0x60, 0xBB, 0x7E, 0xD5, 0x76, 0x57, 0x15, 0xDB, 0x89, 0x5C, 0xEC, - 0xB4, 0x8D, 0x82, 0xED, 0x64, 0x3E, 0xC6, 0xF8, 0xBE, 0xCB, 0x49, 0xFC, 0xB9, 0x94, 0xF3, 0xE8, - 0x96, 0x9F, 0x32, 0xFE, 0x83, 0x64, 0x3C, 0xB7, 0xDD, 0xE5, 0xAF, 0x67, 0x37, 0x97, 0x7B, 0x9F, - 0x7E, 0x2D, 0x47, 0x23, 0xB4, 0xEA, 0x1F, 0x5F, 0xEE, 0xFF, 0xFA, 0x73, 0x4A, 0x2D, 0x68, 0x4A, - 0xE5, 0xB4, 0x54, 0x5F, 0x7F, 0xEF, 0x6C, 0x95, 0xC3, 0xAC, 0xB6, 0xEF, 0x1A, 0xB3, 0xB5, 0x5F, - 0xEB, 0xCE, 0xD8, 0x7E, 0x43, 0xDB, 0x3E, 0x6D, 0xF1, 0x84, 0x46, 0x7A, 0x9D, 0x22, 0x6F, 0xDF, - 0x5E, 0x44, 0xAF, 0xD0, 0x9D, 0x07, 0x9D, 0x15, 0x84, 0xAA, 0x9B, 0x8E, 0x61, 0xAC, 0x17, 0x9E, - 0x4C, 0x6A, 0xD3, 0x37, 0x6B, 0xD5, 0x9B, 0xBE, 0xA9, 0x25, 0xF7, 0x63, 0xC5, 0x9A, 0x6E, 0x56, - 0xC7, 0xBA, 0xA9, 0x62, 0x2D, 0xD3, 0x78, 0xAB, 0x3A, 0xDE, 0xAD, 0xCA, 0xBD, 0xED, 0x74, 0x2B, - 0x63, 0xED, 0x74, 0x2B, 0x63, 0xED, 0xAE, 0x4A, 0x13, 0xAC, 0x1C, 0xA7, 0xD6, 0x8C, 0x37, 0xDD, - 0x1B, 0xA3, 0x22, 0x6A, 0xDA, 0xB8, 0x53, 0x4B, 0xDD, 0xAB, 0xCF, 0x43, 0x4F, 0x47, 0xFB, 0x6F, - 0x36, 0x99, 0xE5, 0x09, 0x50, 0x4C, 0x19, 0x08, 0xCD, 0x57, 0x57, 0x25, 0x56, 0x95, 0x6E, 0x2F, - 0x4F, 0xA2, 0xD2, 0xCD, 0x37, 0x67, 0x6B, 0xBE, 0x35, 0x53, 0x73, 0x45, 0x3A, 0x0B, 0x29, 0xC2, - 0x53, 0xF7, 0x71, 0xDF, 0x74, 0xAC, 0x47, 0xDB, 0x0A, 0xEE, 0x5F, 0xB9, 0x32, 0x34, 0xAA, 0x6B, - 0xC3, 0xEE, 0x0F, 0xD1, 0x86, 0xDD, 0x1F, 0xA4, 0x0D, 0xBB, 0x3F, 0x44, 0x1B, 0x76, 0x7F, 0x6A, - 0xC3, 0x05, 0x6B, 0xC3, 0xEE, 0x8F, 0xD5, 0x86, 0xDD, 0xD9, 0xB4, 0x61, 0x77, 0x36, 0x6D, 0xD8, - 0x9D, 0x4D, 0x1B, 0x76, 0xD3, 0xB5, 0xE1, 0xD4, 0xA7, 0xC9, 0x80, 0x63, 0x1F, 0x27, 0x5F, 0xE3, - 0xF5, 0xC3, 0xD2, 0xAC, 0xC6, 0xF0, 0x30, 0xFC, 0xBD, 0xAD, 0xA9, 0xF4, 0x59, 0xA9, 0xF4, 0x59, - 0x57, 0xE9, 0x8B, 0x52, 0xE9, 0x8B, 0xF2, 0x8A, 0x1D, 0x21, 0x29, 0x7C, 0x83, 0x33, 0x9B, 0xAC, - 0xA4, 0x33, 0xD2, 0x30, 0x7C, 0x92, 0xD8, 0x0C, 0x0A, 0x38, 0x1B, 0x45, 0xB5, 0x5D, 0x47, 0xAD, - 0xFD, 0x61, 0xEF, 0x68, 0xAF, 0x77, 0xA0, 0xA9, 0xBB, 0x37, 0x0A, 0xA2, 0x39, 0x27, 0x47, 0x91, - 0x8E, 0x4D, 0xEF, 0x9B, 0x14, 0x42, 0xDA, 0xC9, 0x8B, 0x13, 0xCD, 0x69, 0xDF, 0xD5, 0xB5, 0x67, - 0x51, 0x00, 0x11, 0x09, 0xA6, 0xF5, 0xEF, 0x53, 0x3F, 0x20, 0xD4, 0x6A, 0x6E, 0x3D, 0xA8, 0xA5, - 0xF5, 0x1C, 0x3F, 0x9E, 0xBA, 0x82, 0x27, 0x57, 0x22, 0xDC, 0x32, 0xAE, 0xA4, 0xBF, 0x0F, 0xC2, - 0x4F, 0x76, 0xA0, 0x86, 0x6C, 0xD1, 0x87, 0x90, 0x6B, 0x63, 0xD3, 0x76, 0x7A, 0x34, 0x7E, 0x75, - 0x3B, 0x7E, 0xAF, 0xB0, 0x51, 0xA3, 0xEB, 0xEB, 0x89, 0xD3, 0xF3, 0x5C, 0x88, 0x2A, 0x12, 0xC2, - 0x34, 0x55, 0xD4, 0x00, 0x79, 0xCF, 0xB1, 0xA4, 0xBB, 0x28, 0xA8, 0xC7, 0x16, 0x68, 0xDD, 0x6B, - 0xA2, 0x31, 0x2D, 0x69, 0xEF, 0x89, 0xD2, 0xB6, 0xF0, 0xAA, 0xF3, 0x08, 0x07, 0x42, 0x18, 0x36, - 0xBD, 0xAB, 0x0B, 0xA1, 0x88, 0xF0, 0x43, 0x9C, 0x29, 0x3D, 0x62, 0x9F, 0x35, 0x3D, 0x52, 0xBA, - 0x1B, 0x62, 0xAC, 0x09, 0x5E, 0x79, 0x07, 0xE6, 0x08, 0x12, 0xE5, 0x3C, 0xDE, 0x63, 0xE6, 0x98, - 0x77, 0xD4, 0xEF, 0xAD, 0x76, 0xD1, 0xBD, 0xE9, 0x83, 0x93, 0xDB, 0x9D, 0xED, 0x8D, 0x49, 0xA1, - 0x47, 0xE4, 0xDF, 0x9E, 0x04, 0xF0, 0xB0, 0x33, 0xF5, 0xC8, 0x80, 0x73, 0x5D, 0xCC, 0x27, 0x74, - 0xE7, 0xB9, 0x63, 0xB4, 0xD7, 0x63, 0x0D, 0x86, 0x68, 0x42, 0x48, 0x93, 0x5E, 0xDF, 0xA3, 0x60, - 0x20, 0xE6, 0xEB, 0x92, 0xC1, 0x11, 0xAD, 0xEE, 0x87, 0x84, 0x1C, 0x6F, 0x6C, 0x3B, 0x98, 0x50, - 0x60, 0x0F, 0xEE, 0x91, 0xF8, 0x4C, 0x34, 0xF3, 0x04, 0x74, 0x3D, 0x7B, 0x48, 0xE6, 0xD6, 0x88, - 0xBF, 0x23, 0x1D, 0xEE, 0x70, 0xD4, 0xF7, 0x5C, 0xFF, 0xB4, 0x83, 0x9C, 0xE9, 0x68, 0xD4, 0x4C, - 0x5C, 0xBB, 0xAA, 0x6F, 0xBC, 0x2A, 0x2C, 0xCD, 0x0C, 0x2F, 0x63, 0xDF, 0xDE, 0xA2, 0xBD, 0xD1, - 0x08, 0xF5, 0xC9, 0x77, 0x2B, 0x37, 0xFB, 0x8B, 0xF8, 0x68, 0xED, 0x35, 0x73, 0x37, 0x46, 0xE4, - 0xFF, 0x84, 0x5F, 0x84, 0x79, 0x49, 0x56, 0xA4, 0x87, 0x8D, 0x40, 0xC5, 0x47, 0xD3, 0xC3, 0xD7, - 0x93, 0x91, 0x6B, 0x5A, 0x9F, 0x4C, 0x3B, 0x90, 0x23, 0x10, 0xE8, 0x5B, 0x5F, 0x2C, 0x93, 0xA0, - 0x3F, 0xBD, 0x1D, 0xDB, 0xC1, 0x31, 0x6F, 0x00, 0x51, 0x8F, 0x64, 0x46, 0xD2, 0x07, 0xA1, 0x7F, - 0x33, 0xBE, 0x0A, 0xDE, 0x34, 0xB0, 0xDC, 0x71, 0x8F, 0x1A, 0x78, 0x5C, 0x1D, 0x5C, 0x3A, 0xA5, - 0x48, 0xBC, 0xB0, 0xBC, 0x6D, 0x4E, 0x26, 0x6C, 0xD6, 0x25, 0x01, 0xB7, 0x28, 0xE2, 0xA6, 0x00, - 0xD5, 0xFC, 0x77, 0xF3, 0x89, 0x43, 0xFC, 0xF5, 0xEC, 0xF4, 0x43, 0x00, 0x49, 0x2B, 0xFE, 0x63, - 0x8A, 0x85, 0xC7, 0xD6, 0xA1, 0x46, 0xDB, 0x25, 0x20, 0x1B, 0xB5, 0xDE, 0x45, 0xFF, 0x0A, 0x62, - 0x31, 0x57, 0xA6, 0xB4, 0x5B, 0x35, 0xA9, 0x0A, 0x9D, 0x6F, 0x21, 0x11, 0xF1, 0x84, 0x64, 0xDA, - 0x4E, 0xE4, 0x86, 0xE6, 0x06, 0x1A, 0xDE, 0x2E, 0x65, 0x85, 0x36, 0x38, 0x62, 0x4E, 0xA4, 0x98, - 0xF4, 0xE4, 0x2B, 0xE7, 0x32, 0xBC, 0x7E, 0x60, 0x06, 0x53, 0x1F, 0x5C, 0xD4, 0x14, 0xED, 0x9D, - 0x8D, 0x94, 0xD4, 0xCF, 0x01, 0x9C, 0x9C, 0xE2, 0x6C, 0x36, 0xEA, 0x6B, 0xD5, 0x32, 0xA6, 0xB9, - 0x82, 0xC5, 0xF5, 0x86, 0x38, 0xE8, 0x99, 0xB6, 0x87, 0x2D, 0xAA, 0x8C, 0x95, 0x75, 0xE7, 0x36, - 0x70, 0x8E, 0x69, 0x15, 0x56, 0xA8, 0xE1, 0x17, 0x48, 0x34, 0x7D, 0xA4, 0xCF, 0xA7, 0xC0, 0xDC, - 0x20, 0xC0, 0x4E, 0x5B, 0x8C, 0x4B, 0x99, 0x60, 0xEC, 0x9D, 0xED, 0x1D, 0xF8, 0x6A, 0xC3, 0x73, - 0xFE, 0x6A, 0xBC, 0xF6, 0xF6, 0x9E, 0xE2, 0x3C, 0xF2, 0x27, 0xE7, 0xEE, 0x63, 0x8F, 0xB4, 0xF7, - 0xF5, 0xBA, 0x9A, 0x50, 0x47, 0xB5, 0x69, 0x22, 0x0D, 0xC5, 0x30, 0xD4, 0x62, 0xBC, 0x44, 0x43, - 0x37, 0x6D, 0x48, 0x2F, 0xE6, 0x78, 0x82, 0x80, 0x54, 0x57, 0x02, 0x11, 0x90, 0x44, 0x47, 0x74, - 0x05, 0x65, 0x5A, 0xD6, 0xD1, 0x03, 0xF9, 0x05, 0x5C, 0x3C, 0xB0, 0x03, 0x2F, 0x69, 0x1D, 0x5E, - 0x9C, 0x11, 0xC5, 0x1D, 0xC0, 0x37, 0x32, 0x2E, 0x18, 0x72, 0xAE, 0x34, 0x30, 0x54, 0x69, 0xA2, - 0x9D, 0x5D, 0xA0, 0x32, 0x16, 0x7B, 0xCE, 0xBC, 0x02, 0x37, 0x5A, 0xC9, 0x74, 0x06, 0xF2, 0x25, - 0x16, 0x0D, 0xA4, 0x80, 0x9D, 0x2A, 0xF5, 0xBF, 0x24, 0xBF, 0x30, 0xD0, 0xD1, 0x0D, 0x96, 0x0D, - 0x6E, 0x94, 0xE6, 0x13, 0xF9, 0x45, 0xB9, 0xCA, 0x62, 0xF5, 0x7E, 0xB3, 0xBF, 0xB6, 0x5D, 0x67, - 0x30, 0xB2, 0x07, 0x10, 0x06, 0x16, 0x31, 0xB9, 0x91, 0x7C, 0x26, 0x41, 0xCE, 0xFD, 0x91, 0x91, - 0x7B, 0x7C, 0xA8, 0x7D, 0xAC, 0xAF, 0xA9, 0x61, 0x18, 0x83, 0x09, 0x5A, 0x41, 0x8F, 0x57, 0x03, - 0xA9, 0x8F, 0x07, 0xF2, 0x09, 0x18, 0xAD, 0xA4, 0x22, 0x14, 0x1D, 0x59, 0xBE, 0xCB, 0x1A, 0x41, - 0x0B, 0x75, 0x2E, 0x04, 0xC6, 0x98, 0xB3, 0xE8, 0x13, 0xBA, 0xA1, 0x27, 0x50, 0xF3, 0x0A, 0x4C, - 0x79, 0xF2, 0x2A, 0x3E, 0x29, 0x13, 0x6B, 0x1A, 0x9F, 0x37, 0x48, 0x49, 0x75, 0xCF, 0x34, 0x0D, - 0xDD, 0x4B, 0x66, 0xE4, 0xA4, 0xD7, 0x77, 0xEC, 0x18, 0x5A, 0xCD, 0xA5, 0x57, 0x21, 0xA4, 0x62, - 0x5D, 0x4A, 0xA3, 0x36, 0xEE, 0x4F, 0x46, 0xA7, 0xF5, 0x5D, 0xCA, 0x7E, 0x7F, 0xA4, 0x7A, 0x07, - 0x67, 0x7B, 0xD7, 0x84, 0x75, 0x17, 0xCE, 0x1E, 0x99, 0xBD, 0x1D, 0x46, 0xA7, 0x90, 0xD9, 0x7A, - 0xFB, 0x9E, 0xC6, 0x12, 0xCF, 0xBD, 0xB3, 0xEF, 0xD5, 0x10, 0x65, 0x6D, 0x5F, 0x59, 0x57, 0x32, - 0xFA, 0xCA, 0x98, 0xA1, 0xE9, 0xAB, 0x5C, 0x2D, 0xCD, 0xF8, 0xC5, 0xEC, 0x5B, 0x63, 0xD7, 0x37, - 0xED, 0x41, 0x69, 0x2B, 0x98, 0x94, 0x9A, 0x58, 0xFB, 0x12, 0x44, 0xAC, 0x30, 0x36, 0x3A, 0xED, - 0x35, 0x85, 0xF4, 0xEF, 0x4A, 0xF0, 0x71, 0x39, 0x13, 0x44, 0x19, 0xE4, 0x1D, 0x43, 0x3E, 0x82, - 0xA7, 0x61, 0xAF, 0x08, 0xDE, 0xC8, 0x02, 0xAE, 0x97, 0x35, 0xDD, 0xF3, 0x15, 0xD5, 0x45, 0xAC, - 0xEC, 0x63, 0x18, 0xB1, 0xE0, 0x68, 0x9C, 0xF4, 0x8B, 0x3F, 0xE9, 0xC2, 0x84, 0xB3, 0x10, 0x88, - 0xF4, 0xEE, 0x47, 0x89, 0x72, 0xE7, 0xD2, 0xFD, 0x42, 0x0F, 0xC0, 0x2A, 0xDD, 0xE7, 0xEE, 0xC8, - 0xB3, 0x74, 0x3F, 0x0F, 0x84, 0xB6, 0xFB, 0x8A, 0x73, 0xE9, 0x1C, 0x58, 0x90, 0x84, 0x98, 0xC7, - 0x06, 0x8D, 0x1F, 0x2B, 0x69, 0x65, 0xD9, 0x3E, 0xCB, 0x13, 0xCB, 0xF3, 0x16, 0x14, 0xE7, 0x49, - 0x2E, 0x3C, 0x21, 0x4F, 0x79, 0x3A, 0x7F, 0xE0, 0xA0, 0x03, 0x69, 0x87, 0x20, 0xD1, 0x96, 0x83, - 0x47, 0x33, 0x71, 0x26, 0x09, 0x2B, 0x8A, 0xDA, 0x32, 0x52, 0xA4, 0x22, 0x6C, 0xB2, 0x6F, 0x4E, - 0xAD, 0x43, 0xCF, 0x9D, 0xC0, 0x63, 0xF2, 0x29, 0x8B, 0x8C, 0x94, 0x5C, 0xAF, 0x80, 0x08, 0x15, - 0xA0, 0xAA, 0x93, 0xB2, 0x08, 0x14, 0xA2, 0x8A, 0xAF, 0x8D, 0x25, 0xA9, 0xAA, 0x8E, 0xAF, 0x14, - 0x17, 0xB4, 0xB3, 0x20, 0xFD, 0xC5, 0x80, 0x59, 0x67, 0x43, 0xEE, 0x5B, 0x04, 0x29, 0xC3, 0x3F, - 0x21, 0xDA, 0x8C, 0x9E, 0xA5, 0xFC, 0xAA, 0xAC, 0x2B, 0x02, 0x41, 0xCB, 0x0C, 0x35, 0xCD, 0xE4, - 0xAC, 0x2C, 0x28, 0x93, 0xB6, 0x32, 0x53, 0x7C, 0x0E, 0x71, 0x60, 0xDA, 0x23, 0xBF, 0x3C, 0x2B, - 0xCA, 0xC1, 0xD2, 0x33, 0x85, 0x1E, 0x9C, 0xE7, 0xC1, 0x8D, 0x10, 0x50, 0x31, 0x36, 0xD0, 0x73, - 0x64, 0xE5, 0x8E, 0xE7, 0xB5, 0xD6, 0x2F, 0x09, 0x82, 0x75, 0x62, 0x1E, 0xEB, 0x81, 0x0C, 0x2E, - 0x4D, 0xEC, 0x35, 0xA6, 0x91, 0x99, 0x17, 0x81, 0x4C, 0x78, 0x85, 0x16, 0x01, 0x35, 0xAB, 0xF8, - 0xAC, 0xCC, 0x48, 0x24, 0xC8, 0x4E, 0x93, 0x7E, 0xB1, 0x76, 0x75, 0xB9, 0x2F, 0x08, 0x45, 0xDB, - 0x69, 0x29, 0x9D, 0xF7, 0xAC, 0xFD, 0x2E, 0x9C, 0x1B, 0x5C, 0x65, 0x41, 0xDC, 0x70, 0x46, 0x2E, - 0x14, 0x02, 0xA4, 0x3B, 0x8C, 0x45, 0x6F, 0xE7, 0x55, 0xE1, 0x82, 0x7C, 0xB9, 0xA2, 0x41, 0x21, - 0xBF, 0x96, 0xB7, 0x48, 0x14, 0x89, 0x93, 0xC3, 0x02, 0x50, 0xC9, 0x17, 0x5F, 0x73, 0x46, 0x10, - 0x79, 0x95, 0x3F, 0x33, 0xAF, 0xF2, 0x67, 0xF4, 0x0E, 0x39, 0xD3, 0xF1, 0x41, 0x22, 0x8B, 0x2F, - 0x29, 0xD2, 0x38, 0x96, 0xDF, 0x4E, 0x83, 0xC0, 0x75, 0xB8, 0x5F, 0x39, 0x4D, 0xBB, 0x08, 0x01, - 0x3F, 0xFB, 0xF4, 0x2B, 0xE4, 0xD4, 0x7B, 0x96, 0xAF, 0x47, 0xE3, 0xEA, 0xDA, 0x8E, 0x80, 0x49, - 0x2F, 0xBD, 0x1F, 0x61, 0x44, 0x52, 0x8C, 0xE1, 0x00, 0x1A, 0x34, 0x9E, 0x25, 0x99, 0x93, 0xF3, - 0xE2, 0x35, 0xE5, 0x4B, 0xD5, 0xAC, 0xE8, 0xA4, 0xAC, 0xE0, 0xA9, 0x14, 0x8E, 0xA8, 0xAE, 0xF6, - 0x33, 0x30, 0x33, 0x0E, 0xEA, 0x4E, 0x0F, 0xB9, 0x7A, 0xA6, 0xA1, 0xAB, 0x4F, 0xDA, 0xC3, 0x72, - 0x91, 0xC1, 0x78, 0xDA, 0xD6, 0x9E, 0x82, 0xC5, 0x41, 0x81, 0xE4, 0x13, 0xDC, 0x20, 0x4C, 0xB3, - 0x3E, 0x28, 0xC4, 0x40, 0x25, 0xA0, 0x23, 0xFF, 0x50, 0x9C, 0x88, 0xE7, 0xD3, 0x0C, 0x1C, 0x7C, - 0x63, 0x7F, 0x0B, 0xF7, 0x63, 0xE8, 0xC4, 0x19, 0x78, 0xF4, 0x2E, 0x63, 0xC2, 0xE3, 0xDB, 0xD0, - 0x32, 0xF2, 0x1F, 0xCD, 0x09, 0x7B, 0xD7, 0x82, 0x5A, 0x9B, 0x89, 0x9A, 0x8B, 0x49, 0x43, 0x3E, - 0x25, 0x8D, 0xC5, 0xAD, 0x40, 0x1D, 0x07, 0x12, 0x68, 0xDC, 0x93, 0xA9, 0x8F, 0x7D, 0xE1, 0x71, - 0x81, 0x18, 0x19, 0x7D, 0x46, 0x2A, 0x11, 0x21, 0x61, 0x7E, 0xC3, 0x67, 0xF8, 0x03, 0xB4, 0xF2, - 0xB6, 0x75, 0x45, 0x34, 0x7E, 0x75, 0x5B, 0x33, 0xD6, 0xE5, 0xC5, 0xA4, 0xC8, 0x58, 0x3F, 0xD1, - 0xB1, 0xD6, 0x70, 0x48, 0xFC, 0x11, 0x89, 0x16, 0xA2, 0xF1, 0x52, 0x0C, 0x21, 0xC5, 0x50, 0x8A, - 0x8C, 0x5A, 0x26, 0x47, 0x96, 0x0C, 0xC4, 0x94, 0x25, 0xD9, 0x78, 0xBF, 0xCF, 0x95, 0x61, 0xD4, - 0x64, 0x24, 0x76, 0x5A, 0x4B, 0x5C, 0x4E, 0x1F, 0x97, 0xC1, 0x47, 0x52, 0x14, 0xB4, 0x5C, 0xA6, - 0x09, 0x68, 0x69, 0x97, 0xB5, 0x58, 0x09, 0xC0, 0x73, 0x37, 0xC0, 0x6F, 0x51, 0x2D, 0x07, 0xFF, - 0x12, 0xC1, 0x5F, 0x43, 0xAE, 0x33, 0x7A, 0x46, 0xF0, 0x5A, 0x91, 0x1F, 0xD2, 0x4B, 0xFE, 0xB6, - 0xEF, 0xB4, 0x70, 0x33, 0x00, 0xD2, 0x64, 0x6E, 0x64, 0xE5, 0x69, 0xD1, 0x77, 0x60, 0x7C, 0x1A, - 0x2F, 0xDD, 0x46, 0xD7, 0x30, 0x7B, 0x4C, 0xCF, 0xC7, 0x27, 0x64, 0x1A, 0x93, 0xD9, 0x83, 0x31, - 0x32, 0x6F, 0xDD, 0x07, 0x5C, 0x9A, 0x57, 0x4B, 0x21, 0xAF, 0x0E, 0x71, 0x0E, 0xAF, 0xBE, 0x2B, - 0xE1, 0x52, 0xE8, 0xE4, 0x0E, 0x99, 0x23, 0xD2, 0xC6, 0x7A, 0xA6, 0x93, 0x92, 0xCF, 0xC7, 0x68, - 0x52, 0xB7, 0x28, 0x43, 0x91, 0x1D, 0xA0, 0x11, 0x61, 0x69, 0x38, 0x51, 0xD5, 0xFD, 0x06, 0xBD, - 0x29, 0xDA, 0x1B, 0x7F, 0x60, 0x8D, 0x5F, 0x7A, 0xF6, 0x81, 0x96, 0x80, 0xAE, 0x18, 0xC8, 0xF6, - 0xD1, 0x07, 0x51, 0xA1, 0x48, 0xB0, 0x22, 0xFA, 0x34, 0x53, 0x01, 0x7E, 0x6E, 0x09, 0x17, 0xBE, - 0xBD, 0xDC, 0x14, 0x81, 0xE4, 0x50, 0x11, 0x49, 0x8B, 0x9F, 0x20, 0x69, 0xE6, 0xD5, 0xDC, 0xD8, - 0x61, 0x6D, 0xC7, 0x40, 0xE5, 0x50, 0xDC, 0xA7, 0x82, 0x54, 0x64, 0x8A, 0x5B, 0x95, 0xB8, 0x63, - 0xD8, 0x7A, 0x1C, 0x1C, 0x1D, 0xC7, 0x6B, 0xBE, 0x98, 0xCE, 0x58, 0x70, 0x73, 0x74, 0xC8, 0x2A, - 0x05, 0x97, 0x99, 0x50, 0x39, 0xB2, 0x09, 0x7B, 0x78, 0x4C, 0xA6, 0xD2, 0xBE, 0x69, 0x1D, 0xC0, - 0x33, 0x14, 0x8D, 0x64, 0x9D, 0x78, 0x73, 0xA5, 0x7D, 0xE3, 0x42, 0xA8, 0x3F, 0xC3, 0x5B, 0xB9, - 0xDA, 0xC7, 0xD0, 0x16, 0xFF, 0xF4, 0xF9, 0xCB, 0x3E, 0x79, 0xFE, 0x72, 0x4F, 0x9D, 0xA7, 0x65, - 0xB6, 0x96, 0x37, 0x0A, 0x61, 0x66, 0x4D, 0x18, 0x3F, 0x64, 0x0E, 0x4D, 0xDB, 0xF1, 0x79, 0xF2, - 0x2E, 0x5B, 0x94, 0x55, 0x96, 0x28, 0xD0, 0xC2, 0x4F, 0x8A, 0x2B, 0x27, 0x9D, 0xDE, 0xDB, 0xBC, - 0xE8, 0x1D, 0x38, 0x19, 0xB9, 0x9E, 0xE5, 0x53, 0xC1, 0x09, 0xAF, 0xBE, 0x97, 0x96, 0x68, 0x69, - 0x62, 0xDA, 0x02, 0x48, 0xA2, 0xD1, 0x03, 0x9F, 0x0A, 0x60, 0xD4, 0xEE, 0x37, 0x5A, 0xFB, 0x6B, - 0x98, 0x29, 0x06, 0x25, 0x52, 0xEE, 0x44, 0xD9, 0x39, 0x44, 0xA9, 0x13, 0x4C, 0x92, 0x14, 0x26, - 0x64, 0x83, 0xD1, 0x4D, 0xE1, 0x24, 0x22, 0x98, 0xB6, 0xC9, 0x39, 0xB1, 0x84, 0xEA, 0x34, 0xC3, - 0x44, 0x2C, 0x77, 0x69, 0x05, 0x9F, 0xD3, 0x0A, 0xBE, 0x24, 0x1E, 0xFF, 0x2C, 0xAF, 0x3D, 0x59, - 0x9E, 0x3C, 0xCA, 0xF6, 0x1D, 0x0D, 0x73, 0x95, 0x97, 0x43, 0xC5, 0x0A, 0x93, 0xA9, 0x7F, 0xDF, - 0x58, 0x68, 0xC7, 0x9A, 0xFA, 0x44, 0x09, 0x80, 0x0B, 0xCE, 0x3F, 0x1A, 0x1D, 0x65, 0x61, 0xF0, - 0x90, 0x89, 0xD5, 0x54, 0xEC, 0x88, 0x41, 0x00, 0x72, 0x3F, 0x28, 0x70, 0xE3, 0x21, 0x75, 0x05, - 0x6F, 0x4C, 0x71, 0x7C, 0x05, 0xEF, 0x78, 0x68, 0xB2, 0x4B, 0x93, 0xDE, 0x28, 0x8B, 0xAB, 0x4E, - 0xA6, 0x48, 0xE5, 0x14, 0x89, 0x82, 0x16, 0xC0, 0x26, 0x7E, 0xC4, 0x08, 0x85, 0x47, 0xBA, 0x93, - 0x64, 0x4B, 0x2B, 0x75, 0xFB, 0x6A, 0xD4, 0x0E, 0x69, 0x27, 0xC8, 0x12, 0x3F, 0xA0, 0x84, 0xD2, - 0x34, 0xEB, 0x11, 0x80, 0x25, 0x54, 0xFB, 0x97, 0x5A, 0x33, 0xD5, 0x60, 0x21, 0x0E, 0x10, 0x50, - 0x33, 0xC0, 0xD0, 0x0D, 0xA2, 0x31, 0xF5, 0x8E, 0x1C, 0x85, 0x98, 0x0A, 0xCE, 0x47, 0xB2, 0xE6, - 0xFF, 0xB1, 0x0C, 0x4D, 0xF5, 0xE4, 0x65, 0xAC, 0xED, 0x7C, 0x4D, 0xAB, 0xFB, 0x39, 0x51, 0xB7, - 0x9B, 0x5A, 0xF7, 0x4B, 0xA2, 0xEE, 0xAA, 0x5A, 0x57, 0xAF, 0x1E, 0xC4, 0x01, 0xD6, 0x25, 0x85, - 0x16, 0x29, 0xCF, 0xAB, 0xF2, 0x39, 0xBF, 0xCA, 0x97, 0xD4, 0x2A, 0x32, 0x79, 0x89, 0x74, 0xC7, - 0x51, 0x9E, 0x45, 0x81, 0xE9, 0x64, 0x63, 0xEC, 0x99, 0x64, 0x97, 0xC9, 0x44, 0x82, 0x3E, 0x9A, - 0x38, 0x76, 0x1D, 0xD7, 0x9F, 0x98, 0xE4, 0xA8, 0x48, 0x7D, 0xAB, 0x98, 0xCE, 0x56, 0x6C, 0x03, - 0xB1, 0xEC, 0x88, 0x2E, 0x5A, 0xA9, 0x62, 0xC1, 0xD3, 0x70, 0x89, 0x7B, 0x06, 0x90, 0x8E, 0xA4, - 0xF2, 0x49, 0xAE, 0x25, 0xCC, 0x8C, 0x96, 0x06, 0x59, 0x60, 0x84, 0xD8, 0x79, 0x70, 0x94, 0x56, - 0xBD, 0xD3, 0x84, 0x1C, 0x8C, 0x90, 0xC5, 0xC1, 0xF5, 0xB0, 0x55, 0xCB, 0x79, 0x91, 0x80, 0x9A, - 0x02, 0x67, 0x47, 0xCD, 0x4B, 0xDF, 0xA2, 0x5F, 0x57, 0x3E, 0xAF, 0x7C, 0xA9, 0x29, 0xE9, 0xE9, - 0x34, 0x4C, 0x78, 0x87, 0xD6, 0x9B, 0x49, 0x83, 0x72, 0x2A, 0x77, 0x7D, 0xFB, 0xEF, 0x18, 0xE9, - 0x54, 0xB9, 0xAA, 0x4C, 0xA3, 0x7D, 0x73, 0xBC, 0xEA, 0x96, 0x5E, 0x65, 0x61, 0xF2, 0xBA, 0x13, - 0x2A, 0x0A, 0x82, 0x8B, 0x1B, 0x6C, 0x80, 0x89, 0x54, 0xF0, 0x3C, 0x44, 0x75, 0x56, 0x41, 0x9A, - 0xC2, 0xEC, 0x13, 0x35, 0x9C, 0x68, 0xD7, 0xE6, 0x64, 0xD5, 0x70, 0x76, 0xD1, 0x72, 0x65, 0x22, - 0xA6, 0xF2, 0x02, 0x12, 0x32, 0xB1, 0xF6, 0x89, 0xA5, 0xE4, 0xCF, 0x8D, 0xDA, 0xFF, 0xD2, 0xB7, - 0xE3, 0x18, 0x49, 0x73, 0x6C, 0x0E, 0xEE, 0x1B, 0x29, 0x76, 0x35, 0x51, 0x6D, 0xFD, 0xB9, 0x11, - 0xDC, 0xDB, 0x3E, 0xB3, 0x03, 0x35, 0x9A, 0xD9, 0xAB, 0x80, 0x23, 0xAF, 0x02, 0x6D, 0x7F, 0x7A, - 0xCB, 0x0E, 0xA0, 0x0D, 0x78, 0x22, 0x6E, 0x5D, 0x7E, 0xD7, 0x49, 0x00, 0x1B, 0xB5, 0x25, 0x8B, - 0x25, 0x4B, 0x4D, 0x15, 0x6A, 0xBB, 0x68, 0xF9, 0x0C, 0x55, 0x9A, 0xF2, 0x61, 0xF5, 0x2B, 0x03, - 0x21, 0x9A, 0x31, 0x13, 0x3B, 0xFB, 0x30, 0x46, 0xA1, 0xF0, 0xEE, 0x3E, 0x6C, 0x90, 0xB7, 0xC3, - 0x97, 0xEB, 0x15, 0xDB, 0xE5, 0x87, 0x6D, 0xE6, 0xB6, 0xD3, 0x8F, 0x13, 0xAA, 0x66, 0x6F, 0x91, - 0x23, 0x03, 0x3B, 0xD9, 0x25, 0x77, 0x3A, 0xC6, 0xEA, 0x5A, 0x0B, 0x6D, 0x6E, 0x4A, 0xF8, 0xD9, - 0x67, 0x20, 0x02, 0x0A, 0xCA, 0xEF, 0xC4, 0x65, 0x23, 0x3B, 0xA0, 0x59, 0xA7, 0x3B, 0x70, 0xFE, - 0x1F, 0x01, 0xCF, 0x3A, 0xDF, 0x86, 0xD3, 0x5F, 0x2A, 0x23, 0x52, 0x4C, 0xED, 0x04, 0x61, 0xD7, - 0x30, 0xDA, 0x06, 0x8D, 0x38, 0x68, 0x4B, 0x08, 0xE9, 0x07, 0x40, 0x48, 0x7F, 0x79, 0x9D, 0xBB, - 0xFE, 0x48, 0x98, 0x2A, 0xEC, 0xFC, 0xC3, 0xB6, 0xA5, 0x77, 0xFF, 0x91, 0x34, 0x96, 0x3C, 0x01, - 0x28, 0x08, 0x85, 0x53, 0x80, 0x32, 0x77, 0xA4, 0xED, 0x2F, 0x0F, 0x03, 0xD2, 0x16, 0xF1, 0xA0, - 0x1F, 0x5D, 0x59, 0x28, 0xB9, 0x4A, 0x99, 0x24, 0x6E, 0xFA, 0x32, 0x59, 0x42, 0x16, 0x74, 0xA2, - 0x50, 0x06, 0x4E, 0x7F, 0xAA, 0x88, 0x2A, 0x49, 0x27, 0x8B, 0x57, 0xCF, 0xAC, 0x94, 0x53, 0x4A, - 0x48, 0x77, 0xE6, 0x49, 0x25, 0xA9, 0x76, 0xF3, 0xB6, 0xD6, 0xAA, 0x34, 0x56, 0xD8, 0x5E, 0x47, - 0x82, 0xF9, 0xBA, 0xCE, 0x2C, 0xD1, 0x40, 0x97, 0x3A, 0xB7, 0xE4, 0xB0, 0x59, 0xB8, 0xC6, 0x93, - 0xCF, 0x83, 0xF7, 0x26, 0x3E, 0xC3, 0xC1, 0xBD, 0x6B, 0x15, 0x7B, 0x67, 0x30, 0x8E, 0x67, 0xD3, - 0x3C, 0x32, 0x28, 0xC0, 0x14, 0x86, 0x43, 0xC0, 0xA0, 0x7A, 0x31, 0x25, 0x2F, 0x28, 0x33, 0xBC, - 0x0B, 0x74, 0xD7, 0xBF, 0xE9, 0xCE, 0x03, 0x04, 0x2B, 0xF9, 0xC8, 0x73, 0xB3, 0xA6, 0x44, 0x00, - 0x36, 0xD1, 0x32, 0x6A, 0x08, 0x55, 0xD4, 0x9B, 0x5F, 0x5E, 0x69, 0x85, 0x3E, 0x59, 0x4B, 0x46, - 0x2F, 0x59, 0x55, 0xEF, 0xFB, 0x19, 0x36, 0x69, 0xE6, 0x50, 0x1F, 0x6E, 0x19, 0x08, 0xAD, 0xED, - 0xC0, 0xA5, 0x6E, 0xDD, 0x8D, 0xD5, 0x02, 0xEF, 0x4D, 0xA6, 0xB2, 0x4C, 0xE1, 0x41, 0x0E, 0xC7, - 0x54, 0x06, 0xEB, 0x59, 0xA6, 0xD2, 0xDB, 0x24, 0x8C, 0x78, 0x71, 0xA6, 0x25, 0x22, 0x37, 0xD3, - 0x58, 0x96, 0x3C, 0xB1, 0xBF, 0x56, 0xD5, 0x92, 0xBD, 0xB4, 0xEA, 0x4E, 0xCF, 0x19, 0x21, 0xB2, - 0x59, 0x27, 0x7E, 0x4D, 0x8C, 0x6C, 0xCA, 0xA1, 0x5F, 0x3B, 0x94, 0x51, 0xF5, 0xB5, 0x94, 0xEA, - 0xA9, 0xFE, 0xCF, 0xAC, 0xD9, 0xFA, 0xD7, 0x44, 0x38, 0x7B, 0xDA, 0x3C, 0x10, 0xEC, 0x0B, 0x69, - 0xAF, 0xBA, 0x16, 0x8B, 0xC7, 0x8D, 0xE2, 0x69, 0x0B, 0x02, 0xE9, 0x66, 0x05, 0xF5, 0xA6, 0xF9, - 0x42, 0x64, 0x5B, 0x1B, 0xE2, 0x21, 0xCD, 0xB2, 0x5C, 0x44, 0x23, 0x99, 0x59, 0x29, 0x1A, 0xC0, - 0xAC, 0x5A, 0x31, 0x3F, 0x53, 0x6A, 0x29, 0xA3, 0x9B, 0x5D, 0x4B, 0x1D, 0xD4, 0x5C, 0xB3, 0x49, - 0xD8, 0xDF, 0x8A, 0xA6, 0x13, 0x79, 0xF9, 0xCA, 0x36, 0x9F, 0x08, 0xB3, 0x25, 0xDB, 0x84, 0xA2, - 0xEC, 0xB6, 0x8A, 0x9B, 0x51, 0xB4, 0x83, 0xA7, 0x8E, 0xEC, 0x62, 0xCD, 0x29, 0x55, 0x49, 0x88, - 0xCC, 0x2A, 0xE1, 0xEB, 0x5D, 0x2B, 0x44, 0x30, 0x52, 0xAC, 0x2B, 0x2A, 0x7F, 0x8A, 0x5A, 0x58, - 0x84, 0x01, 0x90, 0xAD, 0x2C, 0xEA, 0xB9, 0xA4, 0xBC, 0xA5, 0xA5, 0xD0, 0xC9, 0x66, 0xAE, 0xD6, - 0x16, 0xE5, 0x78, 0x32, 0xAB, 0xC5, 0x45, 0xE0, 0x4D, 0x69, 0xAB, 0x4B, 0x34, 0x87, 0x7E, 0xB4, - 0xE5, 0x45, 0x96, 0x16, 0x5A, 0x33, 0x7A, 0x8B, 0x62, 0x07, 0xBD, 0x49, 0xEC, 0x5C, 0xE7, 0x66, - 0xA1, 0x49, 0x9E, 0xB7, 0xE4, 0x1A, 0x6B, 0x6A, 0x93, 0x75, 0xF5, 0xC3, 0x46, 0x2E, 0x8C, 0x37, - 0xB2, 0x1D, 0xA8, 0x80, 0xD3, 0xE2, 0x62, 0x0C, 0x50, 0x92, 0x40, 0x7C, 0xD7, 0x65, 0x3D, 0x90, - 0x0C, 0x49, 0x62, 0xB8, 0x35, 0xDB, 0xBD, 0x90, 0x7F, 0x85, 0x91, 0x6E, 0xFF, 0x3B, 0xD1, 0xD4, - 0x8D, 0x7A, 0x3D, 0x0E, 0x36, 0x57, 0xEA, 0xB4, 0x0A, 0xD4, 0xF9, 0xDB, 0xDF, 0x92, 0x95, 0x3C, - 0x1C, 0x4C, 0x3D, 0x87, 0xEE, 0x7D, 0x92, 0x44, 0x0E, 0x71, 0x00, 0x81, 0xEE, 0xB2, 0xDA, 0xA6, - 0x09, 0x07, 0x88, 0x5E, 0x23, 0x32, 0x15, 0x16, 0xC6, 0x6F, 0x5D, 0xAA, 0xCA, 0x4F, 0xAA, 0x14, - 0xEE, 0x60, 0x45, 0xFB, 0xC9, 0xC9, 0x1D, 0xB5, 0x97, 0x04, 0xE6, 0x2D, 0x7A, 0x34, 0x7D, 0x04, - 0x4B, 0x30, 0x82, 0xF0, 0x78, 0x6C, 0xB5, 0x10, 0x9B, 0xF3, 0x88, 0xBE, 0xA8, 0xC4, 0x12, 0x2B, - 0xF8, 0x03, 0x0F, 0x72, 0xED, 0xAA, 0x1B, 0x8E, 0xE8, 0x2D, 0xE3, 0x2B, 0xA8, 0x9A, 0x08, 0x87, - 0xA7, 0x00, 0x76, 0xDF, 0x05, 0x1E, 0x32, 0x47, 0xF6, 0xD0, 0xD9, 0xA9, 0x8F, 0xF0, 0x5D, 0x50, - 0x27, 0x1F, 0xEE, 0x77, 0xE1, 0xE4, 0xF6, 0x6E, 0x85, 0xFC, 0x02, 0x7F, 0xF4, 0x89, 0xBA, 0xE3, - 0x7F, 0x58, 0xBB, 0xEF, 0xE2, 0x77, 0x11, 0x77, 0xD8, 0xBE, 0xE1, 0xD6, 0x7D, 0xAA, 0x23, 0xDB, - 0xDA, 0xA9, 0x03, 0x42, 0x76, 0x7E, 0xDA, 0x1B, 0x8D, 0xEA, 0x88, 0xA6, 0xC6, 0x27, 0x5F, 0x5D, - 0x6F, 0xBC, 0x4C, 0x2B, 0x2E, 0xB3, 0xA6, 0xE2, 0x1B, 0xCB, 0xF0, 0xB9, 0x8E, 0xB8, 0x77, 0x1B, - 0x83, 0x10, 0x92, 0xEC, 0x0E, 0x87, 0x10, 0x82, 0x4C, 0xE8, 0x59, 0x01, 0xB4, 0x2B, 0x81, 0x17, - 0xFD, 0x43, 0xE9, 0x16, 0xD5, 0x3B, 0xB4, 0xA3, 0x7D, 0x0C, 0x5F, 0xF0, 0xAA, 0x49, 0xEC, 0x7C, - 0x1A, 0x8F, 0xEE, 0x83, 0x60, 0x92, 0x9D, 0x81, 0x40, 0xA8, 0xC8, 0x13, 0x11, 0xBC, 0x3F, 0x62, - 0x79, 0x08, 0x60, 0xED, 0xA6, 0xA9, 0x12, 0x6A, 0x9A, 0x4D, 0x56, 0xD8, 0x84, 0x06, 0x94, 0xCB, - 0x6A, 0x84, 0xFB, 0x13, 0x0D, 0xDC, 0x31, 0xE8, 0x99, 0xB0, 0xA2, 0x87, 0xFD, 0x89, 0xEB, 0xF8, - 0x94, 0x54, 0xFA, 0xC6, 0x13, 0x4F, 0xC6, 0x81, 0x0E, 0xFA, 0x1F, 0x59, 0xEA, 0x0C, 0xB2, 0xF7, - 0x70, 0xE9, 0xAE, 0x21, 0xB9, 0x85, 0xCC, 0x18, 0xD1, 0xA5, 0x1D, 0x99, 0x0D, 0xF9, 0x2B, 0xB0, - 0x2C, 0x84, 0xE2, 0xC1, 0xE8, 0xBB, 0x46, 0xE2, 0x79, 0x86, 0x9E, 0xA4, 0xD0, 0xBB, 0xB7, 0x81, - 0x69, 0x13, 0xC1, 0x14, 0x2A, 0xE8, 0x05, 0x5F, 0x5B, 0x31, 0x29, 0xFC, 0x2C, 0x90, 0x3A, 0xAA, - 0xA2, 0x8A, 0xAD, 0x38, 0xEE, 0xBC, 0xDA, 0xC2, 0x46, 0x3D, 0xCC, 0x9B, 0xF6, 0xA3, 0x07, 0x3E, - 0x8D, 0x1D, 0x64, 0xCC, 0x05, 0x16, 0x14, 0x1B, 0xBC, 0x7D, 0xF6, 0xA0, 0x48, 0xF6, 0x00, 0x42, - 0xA5, 0xC2, 0x83, 0xC8, 0x2A, 0xE7, 0x0E, 0x24, 0x7B, 0xF5, 0xEA, 0xC7, 0x0F, 0x26, 0xA5, 0xE3, - 0xF5, 0x0C, 0x68, 0x82, 0x2D, 0xC5, 0x06, 0x55, 0xD0, 0x05, 0x87, 0xEE, 0xA3, 0x03, 0x87, 0x7E, - 0x21, 0x83, 0x08, 0xF7, 0xF9, 0x85, 0xE9, 0x5D, 0x3C, 0xFF, 0x04, 0x80, 0x3C, 0x39, 0x14, 0x6C, - 0x5C, 0x1C, 0xB7, 0x43, 0x8D, 0x19, 0x17, 0x77, 0x14, 0x5A, 0x3F, 0x74, 0x27, 0xAE, 0x0C, 0x55, - 0xDE, 0x27, 0x43, 0x31, 0xB3, 0x96, 0x08, 0x97, 0x00, 0x30, 0x04, 0xC7, 0x2C, 0x03, 0x05, 0x61, - 0x6B, 0x1F, 0x12, 0x3B, 0x41, 0xD6, 0x14, 0xA2, 0x2F, 0xA0, 0x24, 0x91, 0x1D, 0x2A, 0xAA, 0x2D, - 0x4A, 0xB5, 0x08, 0x78, 0x47, 0xDF, 0x87, 0x26, 0x5F, 0xE6, 0x05, 0x2B, 0xDE, 0xD4, 0x1B, 0x05, - 0xEE, 0x00, 0x32, 0xFC, 0x13, 0x11, 0x5C, 0x01, 0x18, 0xFF, 0x42, 0x7B, 0x01, 0x26, 0x4D, 0x89, - 0xAB, 0xBF, 0xC5, 0xF0, 0x21, 0x1F, 0x3C, 0x98, 0x39, 0xFF, 0x62, 0x52, 0x7A, 0x76, 0x2C, 0x3E, - 0x1E, 0xA1, 0x70, 0x8B, 0x09, 0x7F, 0x22, 0xF8, 0x21, 0x73, 0x89, 0x16, 0x26, 0xF5, 0xDB, 0xA1, - 0xED, 0xB4, 0x7D, 0xEF, 0xE1, 0x3B, 0x48, 0x38, 0x1F, 0xD6, 0x8B, 0xC3, 0x0E, 0x22, 0x7C, 0xF4, - 0x25, 0x99, 0x54, 0x69, 0x08, 0x17, 0x4E, 0xD1, 0xF0, 0x13, 0xAE, 0xD3, 0xE5, 0x85, 0x21, 0x35, - 0x0D, 0x09, 0x9C, 0x42, 0x62, 0xB0, 0x52, 0x22, 0x12, 0x27, 0x99, 0x86, 0x24, 0xAE, 0x09, 0xA9, - 0x48, 0xA2, 0xC0, 0x9B, 0x68, 0x55, 0x8B, 0xB6, 0x0D, 0x71, 0x58, 0x4E, 0x11, 0xC1, 0xC7, 0x4A, - 0xE2, 0x9C, 0xB9, 0x89, 0xBD, 0xE8, 0x04, 0x2F, 0x1B, 0xB9, 0x13, 0x82, 0x10, 0x9E, 0x11, 0x88, - 0x00, 0x50, 0xDA, 0x7C, 0x6E, 0xED, 0x4E, 0xAA, 0x4E, 0x49, 0xD8, 0x92, 0xE7, 0x43, 0xC1, 0x83, - 0x55, 0x87, 0x40, 0xFF, 0x4C, 0x41, 0x71, 0x79, 0x7D, 0x4A, 0x88, 0x29, 0xED, 0x50, 0x6D, 0xBB, - 0x84, 0x92, 0xCD, 0x56, 0xB3, 0x11, 0x2D, 0x45, 0x94, 0xAB, 0xC4, 0x83, 0x95, 0x95, 0x4B, 0x7C, - 0x47, 0xD4, 0xE9, 0x3D, 0x4B, 0x59, 0x15, 0xDF, 0x12, 0x66, 0x6F, 0x53, 0xA4, 0x7D, 0x78, 0x62, - 0x4E, 0xB0, 0xF4, 0x51, 0xB2, 0x62, 0x50, 0xB2, 0x62, 0xC1, 0xAF, 0x9D, 0x39, 0x25, 0xC2, 0x62, - 0xB0, 0x2A, 0xE7, 0xBE, 0x62, 0xD4, 0x6A, 0x42, 0x7C, 0x26, 0x9E, 0x3B, 0x84, 0x97, 0xF2, 0x08, - 0xE8, 0xF0, 0xD7, 0x0F, 0xA6, 0x63, 0x8D, 0xB0, 0xA7, 0xB0, 0x99, 0x82, 0x49, 0xB6, 0xA7, 0x9A, - 0x08, 0x5E, 0xE3, 0x62, 0x09, 0xA4, 0x4A, 0xB5, 0xA5, 0x77, 0xBC, 0x35, 0xFE, 0xAA, 0x57, 0xA9, - 0x96, 0xE6, 0xAD, 0xEB, 0xC1, 0x8D, 0x33, 0xFD, 0x6F, 0x46, 0x4B, 0x25, 0xE5, 0x57, 0x4E, 0xB2, - 0x2F, 0x31, 0xB7, 0xA2, 0xC2, 0x8C, 0x30, 0x07, 0x93, 0x30, 0xD0, 0x13, 0xEC, 0x0D, 0x58, 0x54, - 0x0E, 0x2B, 0x6C, 0x8F, 0x68, 0xC2, 0x26, 0xB4, 0x82, 0xD8, 0x9F, 0x81, 0x1B, 0xC0, 0xF1, 0xF2, - 0xAF, 0x60, 0x81, 0x17, 0xB3, 0x5A, 0x71, 0xC0, 0xFB, 0xA6, 0x27, 0x98, 0x69, 0xCF, 0xCC, 0xE0, - 0xBE, 0xED, 0xB9, 0x53, 0x42, 0x11, 0x87, 0x2B, 0x3E, 0x02, 0x3B, 0x15, 0x72, 0x84, 0x29, 0x7B, - 0x1C, 0x4D, 0x43, 0x98, 0x85, 0xFF, 0x9B, 0xCB, 0x27, 0xB6, 0x84, 0xA7, 0xAE, 0xA8, 0xE1, 0x81, - 0x53, 0xBD, 0x0B, 0xA9, 0x3A, 0x8C, 0x64, 0xA6, 0xD1, 0x74, 0x4C, 0x35, 0xE1, 0x41, 0xAD, 0x16, - 0x7A, 0x04, 0x5F, 0x6E, 0x67, 0xC8, 0xC4, 0x9D, 0x6C, 0x43, 0xA8, 0x8C, 0x3F, 0x93, 0xF1, 0x19, - 0xD7, 0xF4, 0xAF, 0x35, 0x28, 0x12, 0xA2, 0x30, 0x34, 0x0F, 0x37, 0x4B, 0x53, 0x86, 0xA2, 0x3C, - 0x65, 0xB9, 0x0C, 0x8D, 0x8D, 0x97, 0x73, 0x9A, 0xFD, 0xEC, 0x6B, 0xA4, 0xF3, 0x21, 0xCB, 0x18, - 0x33, 0x8B, 0xED, 0x3F, 0x9F, 0x58, 0xA5, 0x89, 0x17, 0x39, 0x23, 0x8A, 0x7F, 0x35, 0xB6, 0x1C, - 0x9B, 0x84, 0x52, 0x4B, 0x85, 0x2B, 0x4E, 0x8E, 0x6A, 0x70, 0xF7, 0x00, 0x42, 0x04, 0x58, 0x00, - 0x1D, 0x0C, 0x78, 0x1E, 0x8E, 0x7D, 0x58, 0x74, 0x1B, 0x89, 0xB7, 0x07, 0x59, 0x30, 0xEA, 0xD5, - 0xA0, 0x58, 0x92, 0x10, 0x66, 0xAF, 0x8D, 0x60, 0x2A, 0x0E, 0x28, 0x29, 0x47, 0x4C, 0x66, 0x67, - 0x4E, 0x6B, 0x14, 0x76, 0x32, 0x2A, 0x87, 0xF4, 0x0A, 0x62, 0xA2, 0xD7, 0xAD, 0xB5, 0xCD, 0xB4, - 0x2D, 0x00, 0x69, 0xC3, 0x72, 0xAC, 0xE4, 0x75, 0xAE, 0x50, 0x02, 0x98, 0xA8, 0x73, 0xDA, 0xBC, - 0x2D, 0x79, 0x9D, 0x4B, 0x4D, 0xF6, 0x32, 0x14, 0xCB, 0x4B, 0x74, 0x6E, 0x6A, 0x4D, 0x32, 0xBB, - 0x75, 0x6D, 0x95, 0xE9, 0xD6, 0xD4, 0x4A, 0x4B, 0xBF, 0x90, 0xD9, 0xB1, 0xF4, 0x66, 0x91, 0x70, - 0x5A, 0xFA, 0xAE, 0x75, 0x8C, 0x4E, 0x27, 0x35, 0x45, 0x6F, 0x60, 0x8F, 0x68, 0x82, 0x51, 0xEC, - 0xF8, 0x74, 0xB7, 0x9B, 0x3D, 0x7E, 0x4A, 0xE5, 0x42, 0xFD, 0x9D, 0x90, 0x8D, 0xF6, 0x29, 0xDD, - 0x2F, 0x95, 0xE9, 0x6E, 0x56, 0x2B, 0xC5, 0x73, 0xE3, 0x7E, 0x30, 0x39, 0x0A, 0xEE, 0xB1, 0xE7, - 0xE0, 0x40, 0x43, 0x38, 0x2F, 0x39, 0xFC, 0x70, 0xD0, 0xCB, 0x21, 0x57, 0xC8, 0xAA, 0x76, 0xD2, - 0x93, 0x79, 0x1D, 0xC2, 0xCF, 0xA3, 0x5D, 0x48, 0x75, 0x56, 0x04, 0x84, 0xDC, 0x11, 0x52, 0x08, - 0xB1, 0x74, 0xD4, 0x81, 0x4B, 0x39, 0x2C, 0x24, 0xDC, 0xFE, 0xE0, 0xEB, 0xA3, 0x7D, 0x67, 0x9F, - 0xB3, 0x36, 0x85, 0xDF, 0xE8, 0x12, 0xDA, 0x7C, 0xAD, 0xC3, 0xF3, 0x9E, 0x51, 0xD9, 0x9F, 0x77, - 0xFA, 0xFD, 0xC4, 0xE9, 0x42, 0xD9, 0x04, 0x8B, 0x18, 0x53, 0xF7, 0xC0, 0xC0, 0x79, 0xB1, 0x22, - 0x6C, 0x73, 0x95, 0x67, 0xA4, 0x8D, 0xA6, 0x1A, 0x10, 0xAD, 0xBC, 0xC6, 0x29, 0x5B, 0x7C, 0x69, - 0x71, 0xCA, 0xAB, 0xA7, 0xE7, 0xF8, 0x31, 0xCC, 0x74, 0x2A, 0x0F, 0xBE, 0xC2, 0xCD, 0xC4, 0x9D, - 0x1B, 0x0C, 0xD5, 0x99, 0x3F, 0x64, 0xD7, 0x8D, 0xF5, 0x30, 0xB5, 0xE7, 0x01, 0x87, 0x49, 0x4A, - 0x20, 0x95, 0xEC, 0x27, 0xFB, 0xD8, 0xA6, 0xAB, 0x1F, 0x04, 0xCF, 0xE1, 0xF1, 0x24, 0x78, 0x96, - 0x66, 0x9D, 0xFE, 0xF8, 0xC0, 0xF3, 0x4B, 0x1C, 0x28, 0xE4, 0xA5, 0xBA, 0x48, 0x70, 0x4A, 0x52, - 0x89, 0x20, 0xF2, 0xE3, 0x40, 0x40, 0x18, 0xD9, 0x39, 0x90, 0x4D, 0x03, 0x90, 0x54, 0x4B, 0xA4, - 0x6A, 0x06, 0x79, 0xE0, 0x29, 0x36, 0xC1, 0xD4, 0x21, 0x19, 0x6B, 0xC8, 0x71, 0x9D, 0xEC, 0xDA, - 0xD0, 0x60, 0xEA, 0x79, 0xB0, 0x8B, 0xA1, 0x7D, 0x82, 0xB1, 0xA6, 0x97, 0xA2, 0xBD, 0x4F, 0xBE, - 0x20, 0x67, 0x23, 0x9F, 0x2F, 0xD0, 0xD5, 0x04, 0x2A, 0x4B, 0x76, 0x04, 0xD8, 0xA9, 0xA2, 0x23, - 0xF4, 0x60, 0x69, 0x47, 0x6C, 0x11, 0x1F, 0x95, 0x5A, 0x70, 0x8C, 0x52, 0x4A, 0x42, 0xD7, 0x30, - 0x52, 0xA8, 0x8E, 0x85, 0xAC, 0xBF, 0x2E, 0x0F, 0x84, 0xC1, 0x50, 0x55, 0x41, 0x1A, 0x19, 0x89, - 0xB6, 0x2D, 0xA8, 0x1E, 0xA1, 0x92, 0x1F, 0xEA, 0xCD, 0x6B, 0x4A, 0x87, 0xAD, 0x15, 0x8F, 0x8D, - 0x52, 0x5F, 0x15, 0x69, 0xC8, 0x80, 0x1A, 0xBB, 0xE8, 0x8A, 0x59, 0x8A, 0xC3, 0x1A, 0xD4, 0xD4, - 0x42, 0x20, 0xBC, 0xE5, 0xC7, 0xE0, 0x10, 0x5C, 0x53, 0x9F, 0x5F, 0x55, 0xAE, 0x20, 0x78, 0xAB, - 0x0A, 0x48, 0xB5, 0xD9, 0xB1, 0x13, 0x94, 0xA5, 0xE4, 0xC8, 0xA6, 0xF5, 0x08, 0x06, 0xED, 0xBC, - 0x94, 0x32, 0x3B, 0xA7, 0xA0, 0x6D, 0x6A, 0x4C, 0x34, 0xB5, 0x03, 0x68, 0x48, 0x27, 0x00, 0xA7, - 0x0D, 0x24, 0x2C, 0x05, 0x80, 0xE0, 0x14, 0x9B, 0x3B, 0xB3, 0x38, 0xB1, 0x51, 0xFE, 0x5F, 0x44, - 0x56, 0x4F, 0x9F, 0x2E, 0x6C, 0xDB, 0x49, 0xED, 0x1C, 0x21, 0xFA, 0xC8, 0x2A, 0x35, 0xEE, 0xE4, - 0xBF, 0xE5, 0x6E, 0xA6, 0xE2, 0x15, 0x1F, 0xFC, 0x50, 0x20, 0xB0, 0x07, 0x3F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x6B, 0x15, 0x75, 0x15, 0x61, 0x0B, 0xDB, 0x03, 0xD0, 0x50, 0x6A, 0xF3, 0x81, 0x6C, 0x72, - 0xD9, 0xB5, 0xC4, 0xB6, 0xBA, 0xCE, 0x59, 0xF6, 0xC3, 0x7B, 0x1C, 0x48, 0xFA, 0x49, 0xD9, 0x4F, - 0xE4, 0xEA, 0x30, 0xD5, 0x71, 0x4B, 0x55, 0x87, 0x52, 0x5A, 0x31, 0x5D, 0x57, 0x0F, 0xAE, 0x2F, - 0x2F, 0x8F, 0xCE, 0xAF, 0xB4, 0x9D, 0x4D, 0xED, 0x67, 0x24, 0xF9, 0x44, 0x25, 0x4F, 0x27, 0xA0, - 0x12, 0xC1, 0x71, 0xE3, 0xC7, 0xF4, 0x50, 0x52, 0xF8, 0x2A, 0x32, 0xF5, 0x78, 0x40, 0x1D, 0x51, - 0x08, 0xB9, 0x0F, 0x35, 0xEA, 0xF8, 0x2A, 0xB1, 0x63, 0x3B, 0x1B, 0x52, 0x0A, 0x49, 0x72, 0xBA, - 0x6B, 0x80, 0xDF, 0x4B, 0x3D, 0xD8, 0xE9, 0x05, 0x53, 0x6E, 0x25, 0x8A, 0x27, 0xCF, 0x35, 0xA7, - 0xE5, 0x61, 0xE2, 0x32, 0x23, 0x31, 0xDB, 0x5F, 0x76, 0x1D, 0x7E, 0x25, 0xE3, 0xAD, 0x5F, 0xDE, - 0x8B, 0x69, 0x83, 0x84, 0xD4, 0x27, 0x47, 0x86, 0xF0, 0xE1, 0x3D, 0xCF, 0xA2, 0x0D, 0xA6, 0xAB, - 0x3B, 0xB1, 0x97, 0x3F, 0x77, 0x01, 0xFA, 0x5D, 0x80, 0x66, 0x8D, 0x95, 0xC5, 0xF5, 0x45, 0x56, - 0x58, 0x19, 0xA5, 0x76, 0x7D, 0x55, 0xA8, 0x4A, 0x59, 0x5D, 0x87, 0x0C, 0xB8, 0x38, 0xDD, 0x44, - 0x7F, 0x8C, 0xD0, 0x35, 0x14, 0x74, 0x6B, 0xA7, 0x96, 0xFE, 0xA8, 0x82, 0x96, 0x9E, 0x66, 0x8A, - 0xE2, 0x0E, 0x01, 0x6A, 0xD6, 0xA5, 0x85, 0xCD, 0xBB, 0xBC, 0x35, 0x80, 0x6A, 0x8B, 0x90, 0x1B, - 0xF2, 0x6C, 0x90, 0x5F, 0x41, 0x49, 0x1C, 0xB2, 0xDC, 0xC0, 0x0C, 0x49, 0xE0, 0xEF, 0x07, 0x70, - 0xEB, 0x5E, 0x68, 0x69, 0xD2, 0x6F, 0x56, 0x52, 0x39, 0x56, 0x62, 0xF6, 0x2A, 0x88, 0x98, 0xC9, - 0x31, 0xF1, 0x8A, 0x40, 0x51, 0x9D, 0xAE, 0x40, 0x93, 0x6E, 0x48, 0x54, 0x4C, 0x3B, 0x49, 0xC3, - 0xA5, 0xF2, 0x96, 0x49, 0xC2, 0xAF, 0xF2, 0xBD, 0xFD, 0x80, 0x1D, 0x64, 0xC2, 0x7B, 0x39, 0x5E, - 0xDD, 0xE7, 0x49, 0x59, 0x80, 0xB7, 0xCF, 0xB0, 0x84, 0x91, 0x71, 0x77, 0x02, 0xFB, 0x8E, 0x65, - 0x45, 0x01, 0xC7, 0x13, 0xAA, 0x45, 0xF8, 0x79, 0x0D, 0xBE, 0xC5, 0xFE, 0x87, 0xC8, 0x76, 0xD0, - 0xE1, 0x61, 0xDB, 0x0A, 0x7F, 0xA8, 0x99, 0xDE, 0x14, 0x3D, 0x2F, 0x43, 0x60, 0x27, 0xA0, 0x4E, - 0x20, 0xF7, 0x74, 0x03, 0x90, 0x1E, 0x39, 0x04, 0x97, 0x72, 0x0A, 0x0E, 0x61, 0x46, 0x35, 0x09, - 0x1F, 0xE4, 0xB4, 0xD5, 0x7E, 0xFB, 0xE0, 0xE2, 0xE2, 0xF2, 0xF0, 0xE4, 0x7C, 0xEF, 0xEA, 0xE8, - 0xE6, 0xE4, 0xBC, 0x77, 0x7D, 0x75, 0x73, 0xF5, 0xB9, 0x07, 0xBF, 0x7E, 0xDC, 0x3B, 0x3D, 0x39, - 0xBC, 0xB9, 0x3E, 0xFF, 0xE5, 0xFC, 0xE2, 0xD3, 0xB9, 0x70, 0x19, 0x60, 0x99, 0xFE, 0xBD, 0x18, - 0x56, 0x17, 0xE9, 0x51, 0xF0, 0x14, 0xD5, 0x15, 0x58, 0x78, 0x60, 0x8F, 0xCD, 0x91, 0xAE, 0x88, - 0x69, 0xB4, 0x8B, 0xBB, 0x53, 0x4C, 0x1F, 0xB4, 0x48, 0x5C, 0xA2, 0x12, 0xFD, 0x42, 0xB6, 0x66, - 0x01, 0xE4, 0x41, 0x8F, 0xD8, 0xC3, 0xF2, 0x33, 0x43, 0x7C, 0x16, 0xC8, 0x1B, 0x7A, 0xBC, 0x37, - 0xE9, 0x22, 0x37, 0xA4, 0xFC, 0x27, 0xAC, 0x9E, 0xFA, 0x82, 0x06, 0x1F, 0x98, 0x0E, 0xC2, 0xC0, - 0x18, 0xAA, 0x5C, 0x6D, 0x87, 0x08, 0x03, 0x51, 0x88, 0x10, 0x7C, 0xE7, 0x87, 0x75, 0xF6, 0x10, - 0xFB, 0xC8, 0xAA, 0xC1, 0x8B, 0x30, 0x34, 0x4B, 0x0F, 0xBB, 0x6D, 0xF5, 0x5B, 0x68, 0xB9, 0x05, - 0xCE, 0x60, 0x2D, 0x3A, 0x60, 0x6D, 0xE5, 0x22, 0x51, 0x7C, 0x94, 0x3B, 0x1C, 0x82, 0x84, 0x9A, - 0x56, 0x22, 0x8B, 0x7C, 0xCB, 0x1E, 0xDA, 0x41, 0x3C, 0x64, 0x44, 0x15, 0xA7, 0x87, 0x96, 0x40, - 0x0B, 0x99, 0x7F, 0x74, 0x3B, 0xA0, 0xE5, 0xDB, 0xD2, 0x52, 0x76, 0x9E, 0x5A, 0x11, 0x23, 0xC0, - 0xA9, 0x2F, 0xD7, 0x9B, 0xF1, 0x68, 0x2E, 0x2D, 0x01, 0x4F, 0xE1, 0xBD, 0x8C, 0xA1, 0xEB, 0x5A, - 0x45, 0x9A, 0x23, 0xD2, 0x3C, 0x1E, 0xF4, 0xF2, 0xED, 0xDB, 0x80, 0x5E, 0xE8, 0x5B, 0x26, 0x84, - 0xD0, 0xB4, 0x51, 0x49, 0x7A, 0xF9, 0x15, 0x3C, 0x3D, 0x10, 0x11, 0x91, 0x02, 0xEF, 0x0F, 0x5F, - 0x12, 0x06, 0x1A, 0x89, 0x99, 0xB8, 0xD0, 0x23, 0x27, 0x03, 0x90, 0xA9, 0x89, 0xEB, 0xFB, 0x36, - 0xF8, 0xA9, 0x31, 0x09, 0x81, 0xD9, 0x1B, 0x09, 0x4F, 0x3C, 0x53, 0x85, 0x2F, 0x67, 0x67, 0xED, - 0x31, 0xFB, 0x11, 0x3E, 0x22, 0xED, 0xD7, 0x65, 0xED, 0xD7, 0xB3, 0xB3, 0x7E, 0xBF, 0xED, 0xD3, - 0x1F, 0x19, 0x02, 0xD2, 0x7D, 0x27, 0x30, 0x96, 0x85, 0xEF, 0xB1, 0x56, 0x93, 0x04, 0x67, 0x17, - 0x42, 0x78, 0x66, 0xE7, 0xE2, 0xFF, 0x05, 0x2F, 0x3E, 0xC7, 0x6D, 0xA3, 0x35, 0x32, 0x0B, 0xB7, - 0x8C, 0xD5, 0xD5, 0xB5, 0x37, 0x34, 0x51, 0x12, 0xE5, 0x65, 0x5B, 0x70, 0x23, 0x8C, 0xB5, 0xC1, - 0x2E, 0xEA, 0xCE, 0x03, 0xF3, 0x05, 0xCC, 0x4A, 0x83, 0x46, 0xD4, 0x92, 0xE9, 0xD7, 0x45, 0xE6, - 0x08, 0x72, 0x48, 0x59, 0x40, 0x09, 0x32, 0xD6, 0x51, 0x77, 0xBD, 0xDD, 0x35, 0xD6, 0xB6, 0x74, - 0xB4, 0xC4, 0x1A, 0x6B, 0x17, 0xAD, 0xCE, 0x99, 0x94, 0x2E, 0xA5, 0x66, 0x35, 0xA6, 0x66, 0xB9, - 0x63, 0xAC, 0x2F, 0x77, 0x3A, 0xCB, 0xC6, 0x7A, 0xBB, 0xB3, 0xD1, 0xD5, 0xD2, 0xA3, 0xD7, 0x7A, - 0xBB, 0xE0, 0x9F, 0x3B, 0x27, 0xDA, 0xDE, 0x00, 0x51, 0x77, 0xF8, 0x11, 0x7B, 0x8C, 0xA0, 0x4E, - 0x07, 0xC8, 0xD9, 0xDC, 0xDC, 0xDA, 0xEA, 0xA2, 0xC6, 0x21, 0x13, 0x30, 0xA8, 0xC2, 0x7E, 0x6B, - 0x46, 0x44, 0x8A, 0xFB, 0x62, 0x07, 0x0F, 0xCD, 0x80, 0x28, 0xD5, 0xBE, 0x3D, 0x74, 0x94, 0x1D, - 0x87, 0x3C, 0x9D, 0x8D, 0x58, 0x9B, 0x08, 0xDA, 0x2B, 0x2A, 0x67, 0xDB, 0x36, 0xF0, 0x85, 0xDD, - 0x13, 0xB4, 0x5E, 0x0B, 0xF8, 0x07, 0xBE, 0xAA, 0xF4, 0xEA, 0x0C, 0x1C, 0x66, 0x89, 0x52, 0xA3, - 0xEC, 0x60, 0x3A, 0x45, 0xF0, 0x9D, 0x97, 0xE9, 0x50, 0x42, 0xA5, 0xA2, 0xB1, 0x5D, 0x5E, 0x06, - 0x50, 0x90, 0x03, 0x2D, 0x1E, 0x6E, 0xA2, 0xCB, 0x61, 0x6D, 0xB5, 0x1D, 0x96, 0xB3, 0x98, 0x96, - 0x60, 0xA6, 0xDF, 0x59, 0xEA, 0x34, 0x1A, 0xCF, 0xCB, 0xD1, 0x86, 0x78, 0x90, 0x4F, 0x10, 0x69, - 0xAC, 0x62, 0xA2, 0x48, 0x33, 0x2D, 0xFC, 0x97, 0xBF, 0x88, 0xB2, 0x15, 0x7F, 0x4B, 0x19, 0xE0, - 0x1D, 0xEA, 0x81, 0x0D, 0x4F, 0x32, 0xA4, 0x96, 0x6F, 0x34, 0x9B, 0x4D, 0x78, 0x2D, 0x2C, 0xA9, - 0x01, 0xA4, 0xC7, 0xB7, 0xAA, 0x2F, 0xEB, 0x0C, 0xB2, 0xE4, 0x06, 0xC1, 0x22, 0x98, 0xE9, 0xDD, - 0x15, 0x73, 0xCC, 0xA7, 0xB7, 0xBD, 0x84, 0xCD, 0xCE, 0x20, 0x0C, 0x17, 0x8B, 0xB7, 0x17, 0x74, - 0xBC, 0xC8, 0xE6, 0x15, 0x71, 0x21, 0x92, 0xC1, 0x70, 0x85, 0x23, 0xC3, 0x10, 0x60, 0xB3, 0x40, - 0x31, 0x43, 0x04, 0x22, 0x2C, 0x8E, 0x71, 0xBD, 0xE5, 0x9D, 0x48, 0x79, 0xB1, 0xAB, 0x6D, 0x39, - 0xBA, 0x8C, 0xA6, 0x67, 0xB4, 0x9D, 0x69, 0x40, 0x3D, 0x64, 0x32, 0x50, 0x45, 0x88, 0xCE, 0xCE, - 0x64, 0xD7, 0xE4, 0x63, 0x9B, 0x2C, 0xE6, 0x64, 0x01, 0x92, 0x97, 0xE6, 0x78, 0x09, 0xA7, 0x21, - 0x03, 0x17, 0x77, 0x0D, 0xBA, 0x46, 0x91, 0x71, 0x59, 0xEE, 0x24, 0x0C, 0xF0, 0xB3, 0x8E, 0xC1, - 0xCD, 0xF9, 0xC5, 0xCD, 0xE1, 0xD1, 0xC1, 0xC9, 0xD9, 0xDE, 0x69, 0x62, 0x38, 0x7C, 0x4C, 0x56, - 0x29, 0x0B, 0x3A, 0x17, 0x91, 0xA4, 0xF0, 0x5D, 0x92, 0x0D, 0x76, 0x66, 0x63, 0x4D, 0xB4, 0xAC, - 0x8B, 0xE7, 0x98, 0xC4, 0x71, 0xB1, 0x4D, 0xC8, 0xCF, 0xBF, 0x46, 0x7C, 0xE3, 0x2D, 0x80, 0x75, - 0xC2, 0xB3, 0x6F, 0x9A, 0xED, 0x58, 0x88, 0x6E, 0x29, 0x86, 0xB2, 0x82, 0x36, 0xC8, 0xF2, 0x40, - 0x23, 0x0E, 0x43, 0x24, 0x2B, 0x68, 0x75, 0x03, 0x02, 0xF3, 0x9B, 0x4A, 0x48, 0x8B, 0x3C, 0xBD, - 0x53, 0xB6, 0x41, 0x3A, 0xC4, 0x7F, 0x85, 0x61, 0x49, 0x0D, 0xAE, 0x8D, 0xB6, 0x1D, 0xCA, 0xAC, - 0x85, 0x09, 0x2A, 0xCF, 0x59, 0x3A, 0x65, 0x53, 0x67, 0xE4, 0x3A, 0x4C, 0xD8, 0xD4, 0xD2, 0xB5, - 0x68, 0xBA, 0xCA, 0xAB, 0xF8, 0x1C, 0x67, 0x6B, 0xE1, 0xB9, 0x1A, 0x4F, 0x52, 0x49, 0x56, 0xD2, - 0x66, 0xA8, 0x3A, 0x57, 0x4A, 0xCF, 0xC9, 0xF4, 0x19, 0xA9, 0x17, 0x5A, 0x99, 0x43, 0xD4, 0x5B, - 0x96, 0xB7, 0xD0, 0x80, 0x4E, 0x91, 0xD8, 0xB2, 0x02, 0xB8, 0x78, 0x59, 0x53, 0xA4, 0x4D, 0x12, - 0xAD, 0x0E, 0x13, 0x8E, 0xE5, 0x85, 0x49, 0xC7, 0xCD, 0xD9, 0xD9, 0xCD, 0xE1, 0x5E, 0xFF, 0x43, - 0x42, 0x46, 0xB8, 0xD7, 0x57, 0xAC, 0xD0, 0x78, 0x98, 0xC8, 0x72, 0x22, 0xB0, 0x28, 0x16, 0x08, - 0xAE, 0xEB, 0xA1, 0x29, 0x24, 0x86, 0x88, 0xC7, 0x2E, 0x6D, 0x98, 0xC5, 0x06, 0x9D, 0xAF, 0x82, - 0xAE, 0x4D, 0x8E, 0xF4, 0xEB, 0x1B, 0xB7, 0xF4, 0x51, 0xEB, 0x46, 0xA3, 0x16, 0xEE, 0xAA, 0x17, - 0x30, 0x6A, 0x44, 0xFF, 0xBF, 0xC2, 0x81, 0x7B, 0x55, 0x8B, 0xA4, 0xC0, 0xA6, 0x62, 0x6B, 0xA5, - 0xD8, 0xAD, 0x6E, 0xDC, 0x2D, 0xCD, 0x62, 0xF9, 0x3B, 0x58, 0xC7, 0x98, 0x90, 0xC6, 0x56, 0xA2, - 0x39, 0xCB, 0xE8, 0x76, 0x1E, 0xB3, 0x62, 0x1D, 0xFF, 0x23, 0xD9, 0xC0, 0x35, 0x2C, 0x5A, 0xA4, - 0x86, 0x2D, 0x3C, 0x47, 0xD1, 0x4F, 0xE5, 0x9A, 0x3F, 0x62, 0xDD, 0x68, 0xC4, 0xD0, 0xA2, 0x4E, - 0x38, 0x4C, 0x71, 0xBC, 0xB2, 0x61, 0x7B, 0x8D, 0xAA, 0xF5, 0x7F, 0xA6, 0x56, 0x0D, 0x2D, 0x67, - 0xD2, 0xDD, 0x95, 0x06, 0x04, 0xBB, 0xBE, 0xD2, 0x14, 0x44, 0xF9, 0x4B, 0xB6, 0x9A, 0x6A, 0xA8, - 0xAD, 0x66, 0x58, 0x84, 0x37, 0xC8, 0xC3, 0x2B, 0x02, 0xC1, 0xD6, 0x0F, 0x46, 0xE5, 0x38, 0x1A, - 0xB5, 0x85, 0xDC, 0x69, 0x00, 0x7F, 0x98, 0xFC, 0xFE, 0x00, 0x5A, 0xF5, 0x5D, 0xF9, 0x3A, 0x00, - 0x4C, 0xDA, 0xB7, 0x84, 0x6D, 0x63, 0x8C, 0xEA, 0xCA, 0x44, 0xAA, 0xB7, 0x10, 0x0E, 0x06, 0xF2, - 0xA3, 0xE4, 0x40, 0x3D, 0x25, 0x46, 0x20, 0xAE, 0xA5, 0x93, 0x9F, 0x94, 0xAB, 0x03, 0x6E, 0x36, - 0x95, 0xAE, 0x46, 0x59, 0x50, 0x89, 0x46, 0x02, 0x8B, 0x8B, 0x60, 0x53, 0x3F, 0xDF, 0x63, 0x81, - 0x8B, 0xBF, 0x35, 0x05, 0x86, 0x27, 0xAE, 0x9A, 0x45, 0x42, 0xD2, 0x2E, 0xE4, 0x66, 0x24, 0xF5, - 0x46, 0x3C, 0x44, 0x91, 0xD3, 0xE0, 0x8C, 0xE0, 0xE6, 0x0B, 0x2D, 0x3C, 0x02, 0xCC, 0x1B, 0x66, - 0xFF, 0xF3, 0xD9, 0xFE, 0xC5, 0x29, 0x83, 0x9A, 0x88, 0xD8, 0x19, 0xB9, 0xCE, 0x90, 0xE6, 0x2C, - 0x39, 0xC4, 0x43, 0x0F, 0xAB, 0x56, 0x98, 0xE4, 0x80, 0x28, 0x63, 0x4C, 0xCE, 0x7B, 0x2A, 0x04, - 0x7D, 0x45, 0x32, 0x89, 0x37, 0x8C, 0x6D, 0x35, 0x63, 0x57, 0x54, 0xFC, 0x0E, 0xA5, 0xAB, 0xC5, - 0x48, 0x01, 0xA4, 0x48, 0xD9, 0x20, 0x39, 0x9D, 0xDF, 0x34, 0x35, 0xE9, 0xC1, 0x66, 0x1C, 0xEA, - 0x54, 0xFA, 0xA2, 0x69, 0x95, 0xE0, 0xE5, 0x12, 0x99, 0x69, 0x54, 0xF1, 0x84, 0x55, 0xB7, 0x35, - 0x97, 0x29, 0x73, 0x92, 0x9A, 0x6A, 0xE4, 0x2D, 0xBF, 0x08, 0x7D, 0x4C, 0x02, 0xAB, 0x51, 0xF8, - 0xDF, 0xFF, 0x25, 0x93, 0x08, 0xDF, 0xEA, 0x35, 0x85, 0xD0, 0x4A, 0x90, 0x91, 0xB6, 0xEF, 0xAA, - 0xC6, 0x99, 0x4B, 0xFF, 0xFB, 0x4D, 0x69, 0x52, 0xCF, 0x2E, 0x8C, 0xF3, 0x86, 0x28, 0x9C, 0xD0, - 0x16, 0x02, 0x38, 0x21, 0x01, 0x73, 0xE2, 0x82, 0xB0, 0xF1, 0x59, 0x08, 0xDD, 0x0B, 0x06, 0xAF, - 0x9C, 0x88, 0x9B, 0xBF, 0x13, 0xF5, 0x2C, 0x51, 0x7E, 0xA6, 0x33, 0xEF, 0x97, 0xA2, 0x9C, 0x43, - 0xC8, 0xA6, 0xBC, 0xF8, 0xE2, 0xB0, 0xB1, 0x80, 0xC5, 0x41, 0x9A, 0x8F, 0x25, 0x97, 0x87, 0x04, - 0xA7, 0x5E, 0x6A, 0xD9, 0x48, 0x4E, 0xF8, 0xB2, 0x2B, 0x87, 0x8E, 0xF4, 0xE5, 0x97, 0xA2, 0x7D, - 0xF6, 0x55, 0x45, 0x47, 0x7E, 0x3D, 0xB9, 0xDC, 0xFC, 0xAD, 0x56, 0x5B, 0x58, 0x2F, 0x9A, 0xD5, - 0x97, 0x2E, 0x1D, 0xF5, 0x68, 0xE1, 0xCC, 0x4F, 0xD7, 0xBA, 0x73, 0x12, 0x7B, 0x21, 0x42, 0x55, - 0xAF, 0x25, 0xE6, 0x2C, 0x46, 0xB3, 0xF6, 0x25, 0x7B, 0x2C, 0x5E, 0xBA, 0x37, 0xEA, 0x8A, 0xB2, - 0x80, 0xB9, 0x9D, 0xD9, 0x25, 0x4D, 0x00, 0x93, 0x8C, 0x32, 0xE9, 0xD8, 0x19, 0xBA, 0x51, 0x0D, - 0xE0, 0xB5, 0x2E, 0xDE, 0x6C, 0xE5, 0x6F, 0xD6, 0x4A, 0x3B, 0x80, 0xB0, 0xF4, 0x41, 0x73, 0x1B, - 0xA9, 0x09, 0x36, 0x42, 0x17, 0x04, 0x72, 0xB2, 0x6E, 0xB1, 0x9C, 0x70, 0xE4, 0x18, 0x7C, 0xEF, - 0x49, 0xBE, 0xA0, 0x2C, 0xA9, 0xDD, 0x2E, 0x9C, 0xBE, 0xC3, 0xE0, 0xAB, 0x65, 0xC1, 0x6F, 0x86, - 0x7C, 0x96, 0x0F, 0xFC, 0x50, 0x4F, 0x4A, 0xC3, 0xC6, 0x73, 0xDE, 0x2D, 0x01, 0x64, 0x70, 0x7E, - 0x95, 0xCA, 0x19, 0xF4, 0x25, 0x96, 0x13, 0x58, 0xB6, 0x09, 0x38, 0x92, 0x15, 0x80, 0x43, 0x37, - 0xE1, 0xDD, 0x34, 0x87, 0xE5, 0xC8, 0x0A, 0xED, 0x01, 0x42, 0xEC, 0x38, 0x2F, 0x8A, 0xBD, 0x00, - 0xB3, 0x0E, 0xF5, 0xFE, 0xA3, 0x1D, 0x0C, 0xEE, 0x51, 0x66, 0x1D, 0xEA, 0x4F, 0xC1, 0x5E, 0x79, - 0x7F, 0xAB, 0x66, 0x38, 0x66, 0xE3, 0x52, 0xBB, 0x76, 0xBE, 0x39, 0xBA, 0x77, 0xC3, 0xD5, 0xEC, - 0xDA, 0x03, 0x08, 0xE2, 0x6E, 0x14, 0x36, 0x06, 0xA4, 0xA1, 0x13, 0x0D, 0x1F, 0x73, 0xC6, 0x49, - 0xCE, 0x66, 0xE9, 0x58, 0x63, 0x33, 0xEB, 0x9C, 0xB1, 0xDE, 0x64, 0xA2, 0x45, 0x8B, 0xC4, 0xCB, - 0x96, 0xED, 0x74, 0xE4, 0xCB, 0x0B, 0x43, 0x4E, 0x77, 0x3A, 0x59, 0xCC, 0x8E, 0x0C, 0x58, 0x0B, - 0xE8, 0x75, 0x26, 0x6A, 0xC9, 0x7A, 0xB6, 0x80, 0x5E, 0x8B, 0x4A, 0x35, 0x9B, 0x01, 0x0B, 0xE9, - 0x79, 0x31, 0xF4, 0x8C, 0x09, 0x8B, 0x21, 0x40, 0x5D, 0x59, 0x32, 0xC5, 0x6F, 0x39, 0x87, 0x8A, - 0xEF, 0xF2, 0x22, 0x21, 0x29, 0xA3, 0xEF, 0xFF, 0x1F, 0x87, 0x37, 0x3A, 0x5E, 0xDE, 0x5A, 0x00 + 0x1E, 0xB9, 0x03, 0x33, 0xB0, 0x5D, 0xA7, 0x7D, 0xEF, 0xFA, 0x81, 0x63, 0x8E, 0xF1, 0xF7, 0xB7, + 0x9B, 0x9D, 0x95, 0x47, 0xFF, 0xDF, 0xB6, 0xFF, 0xF8, 0x87, 0x07, 0xD2, 0xF0, 0x11, 0xDF, 0xFA, + 0xEE, 0xE0, 0x1B, 0x0E, 0xC8, 0xDF, 0x7F, 0xFC, 0x03, 0x6F, 0x64, 0x5A, 0xD6, 0xD1, 0x03, 0x76, + 0x82, 0x53, 0xDB, 0x0F, 0xB0, 0x83, 0xBD, 0x46, 0x7D, 0xE4, 0x9A, 0x56, 0xBD, 0x85, 0x5C, 0xE7, + 0x94, 0xFC, 0xD2, 0xA4, 0x75, 0xEF, 0xA6, 0xCE, 0x00, 0x20, 0xF3, 0x8F, 0x0D, 0x0C, 0x2D, 0x9A, + 0xE8, 0x1F, 0x7F, 0xFC, 0x03, 0x22, 0x3F, 0xB6, 0x63, 0x07, 0x9F, 0xF0, 0x6D, 0x9F, 0xC2, 0x6E, + 0x40, 0x8B, 0xEF, 0x52, 0x23, 0xA5, 0x3C, 0x6C, 0x16, 0x91, 0x43, 0x7A, 0xE2, 0xE0, 0x47, 0x14, + 0x57, 0xE1, 0x3D, 0x04, 0x48, 0x52, 0xC5, 0xB6, 0xEB, 0x8C, 0xB1, 0xEF, 0x9B, 0x43, 0x4C, 0x9A, + 0x44, 0xE0, 0x1B, 0x63, 0x7F, 0x18, 0x01, 0x85, 0x9F, 0x89, 0xE9, 0xF9, 0xF8, 0xC4, 0x19, 0xB8, + 0x63, 0xDB, 0x19, 0x42, 0x69, 0xDB, 0x32, 0x03, 0x33, 0x84, 0xF6, 0x3D, 0x41, 0xDF, 0x10, 0x37, + 0x70, 0x04, 0xC0, 0xC3, 0xC1, 0xD4, 0x73, 0x90, 0xE5, 0x0E, 0xA6, 0x63, 0xD2, 0xC9, 0xF6, 0x10, + 0x07, 0x47, 0x23, 0x0C, 0xBF, 0xEE, 0x3F, 0x9F, 0x90, 0x9E, 0x47, 0xDD, 0x03, 0x8E, 0xDE, 0xD9, + 0x4F, 0xD8, 0x3A, 0x35, 0xA1, 0x07, 0xC6, 0xB6, 0xF8, 0xC9, 0x75, 0x86, 0xC2, 0xB7, 0xC9, 0xC8, + 0x0C, 0xEE, 0x5C, 0x6F, 0xDC, 0xF3, 0x30, 0x29, 0x26, 0x05, 0xB5, 0x1A, 0x2F, 0x19, 0x62, 0xD7, + 0xC2, 0x81, 0x3D, 0x60, 0x30, 0xD6, 0x8C, 0xB6, 0xD1, 0x51, 0x4B, 0x08, 0x81, 0x3B, 0x68, 0xB9, + 0x63, 0xAC, 0xB7, 0x3B, 0x5B, 0x4A, 0xD9, 0xDE, 0x08, 0x5A, 0x75, 0xD6, 0x0D, 0xA3, 0x1D, 0x36, + 0xC3, 0x03, 0x7C, 0xF7, 0x2B, 0x6D, 0xD0, 0xDD, 0x34, 0xBA, 0xC6, 0x46, 0x7B, 0x7D, 0x63, 0x53, + 0x28, 0xFA, 0x0C, 0x45, 0x6B, 0x6F, 0x3A, 0x1B, 0x9B, 0xC6, 0x5A, 0x7B, 0xCD, 0x58, 0x15, 0x8A, + 0xBE, 0x50, 0x02, 0x36, 0x37, 0x36, 0x36, 0xD6, 0xDB, 0x6B, 0x9B, 0x6B, 0xBC, 0x64, 0x64, 0xFA, + 0xC1, 0xB1, 0x3D, 0xC2, 0xE7, 0x44, 0x9C, 0x44, 0xC2, 0xEF, 0xE0, 0xDB, 0x74, 0x7C, 0x8B, 0x3D, + 0xA1, 0x9F, 0x0E, 0xFD, 0x70, 0x71, 0x07, 0x0D, 0xFC, 0x3E, 0x1E, 0xE1, 0x41, 0x80, 0x2D, 0xA1, + 0xDC, 0xE7, 0x9F, 0x68, 0xB9, 0x08, 0xCD, 0xBF, 0x77, 0x89, 0x38, 0x0E, 0xE1, 0x3B, 0xC8, 0x21, + 0x8C, 0xAE, 0x39, 0xF2, 0x31, 0x2F, 0x75, 0x6F, 0x03, 0xD3, 0x76, 0xB0, 0x75, 0xC6, 0xC6, 0xBE, + 0x58, 0x8D, 0x7D, 0xD3, 0xC7, 0x4A, 0x2D, 0x8E, 0x85, 0x57, 0xBA, 0xBC, 0x3A, 0x38, 0xD3, 0x80, + 0x82, 0x8E, 0x5D, 0x99, 0xB7, 0xE4, 0x1F, 0xFC, 0x14, 0x88, 0x34, 0x0E, 0x5C, 0xCF, 0xC3, 0x54, + 0x60, 0xD4, 0x12, 0x2E, 0x93, 0xEA, 0x67, 0x60, 0x1D, 0xC7, 0x75, 0xF5, 0x3C, 0xC1, 0x19, 0x45, + 0x9C, 0x56, 0x5A, 0xCC, 0x2A, 0x10, 0x4C, 0xAE, 0x67, 0xF9, 0x47, 0x07, 0x47, 0xC7, 0xA4, 0xE0, + 0xB7, 0xAF, 0xDB, 0xD2, 0xE7, 0xF7, 0x7C, 0xFC, 0xC5, 0xA2, 0xBB, 0xE9, 0x68, 0xD4, 0x23, 0xF0, + 0xAE, 0x27, 0x44, 0xD8, 0xC5, 0x9E, 0x87, 0x2D, 0x7D, 0x1C, 0x5C, 0xD9, 0x63, 0xEC, 0x4E, 0x83, + 0x68, 0x34, 0x1C, 0xEB, 0x90, 0x4C, 0x0C, 0xF9, 0xEB, 0xE0, 0x1E, 0x0F, 0xBE, 0x9D, 0xE3, 0xC7, + 0x63, 0xDB, 0x1B, 0x3F, 0x9A, 0x1E, 0x96, 0x4B, 0xC9, 0x6C, 0xD0, 0x96, 0xFD, 0xF1, 0x0F, 0x03, + 0xD7, 0x21, 0xBC, 0x24, 0x12, 0x70, 0x10, 0xF1, 0xC9, 0xEF, 0xBB, 0x53, 0x6F, 0x40, 0x47, 0xFA, + 0x4D, 0x82, 0x89, 0xBC, 0x10, 0xE4, 0xCA, 0x17, 0xFB, 0x91, 0xA8, 0xD1, 0xF3, 0x6C, 0xD7, 0xB3, + 0x03, 0x3B, 0xAE, 0x16, 0x22, 0x3B, 0x70, 0x09, 0x33, 0x6C, 0x87, 0x74, 0x17, 0x98, 0x08, 0xC5, + 0x7C, 0x0E, 0x1F, 0x5C, 0x5C, 0x5C, 0x1E, 0x9E, 0x9C, 0xEF, 0x5D, 0x1D, 0xDD, 0x9C, 0x9C, 0xF7, + 0xAE, 0xAF, 0x6E, 0xAE, 0x3E, 0xF7, 0x8E, 0x6E, 0x0E, 0x0F, 0xDF, 0x22, 0xA3, 0x85, 0x56, 0x56, + 0x0E, 0xF1, 0x9D, 0x39, 0x25, 0x53, 0xE7, 0xF0, 0xB0, 0x6D, 0x85, 0x3F, 0xD9, 0x0D, 0xCF, 0xCE, + 0xDE, 0xA2, 0x0E, 0x6D, 0x4A, 0x7E, 0x6D, 0x8F, 0xE1, 0x27, 0xBB, 0xC1, 0x0D, 0xB4, 0xE8, 0xB2, + 0x16, 0xA8, 0x70, 0x93, 0x9B, 0xC3, 0xBD, 0xFE, 0x87, 0xB7, 0x68, 0x95, 0xB5, 0x5B, 0x2E, 0xDE, + 0xAE, 0xFF, 0xF9, 0x6C, 0xFF, 0xE2, 0xF4, 0x2D, 0x5A, 0x63, 0x2D, 0xFF, 0xFB, 0xBF, 0xC2, 0xA6, + 0xE3, 0x71, 0x3D, 0xAF, 0x67, 0xFD, 0xFE, 0x5B, 0xB4, 0x1E, 0x51, 0x8A, 0xFA, 0xFD, 0xB6, 0x4F, + 0x7F, 0x0A, 0x60, 0x25, 0x2D, 0x37, 0x2A, 0xB6, 0xE4, 0x5D, 0x7D, 0x13, 0x75, 0x75, 0xB9, 0x5C, + 0xF3, 0xB0, 0xC7, 0x9B, 0x71, 0x8F, 0xEB, 0x11, 0x84, 0x5A, 0x7E, 0x9F, 0x6F, 0xCE, 0x2F, 0x6E, + 0x0E, 0x8F, 0x0E, 0x4E, 0xCE, 0xF6, 0x08, 0x90, 0xAD, 0x70, 0x68, 0xFB, 0x7D, 0xB4, 0x8C, 0xCE, + 0x5D, 0x64, 0xE1, 0x81, 0x3D, 0x36, 0x47, 0x85, 0x28, 0x11, 0x01, 0x75, 0x0C, 0x91, 0x1D, 0xE5, + 0x61, 0x01, 0x53, 0x64, 0x80, 0x1D, 0x91, 0x41, 0x85, 0x01, 0x9E, 0x9C, 0x7F, 0xDC, 0x3B, 0x3D, + 0x39, 0xBC, 0xB9, 0x3E, 0xFF, 0xE5, 0xFC, 0xE2, 0xD3, 0x39, 0x81, 0xD3, 0x6D, 0x09, 0xCB, 0x16, + 0x99, 0x3E, 0x0F, 0xD8, 0x23, 0x8A, 0x38, 0x9E, 0x41, 0xA0, 0xA5, 0xDB, 0x46, 0x34, 0x07, 0xC3, + 0xCF, 0x27, 0xCE, 0x64, 0x1A, 0x70, 0xED, 0xA5, 0x4C, 0xB7, 0x76, 0x5A, 0x5F, 0xE4, 0x1D, 0x43, + 0x62, 0x31, 0x8E, 0x56, 0xDA, 0x95, 0x15, 0x98, 0xC6, 0xEE, 0x08, 0x93, 0x8D, 0xCB, 0xB0, 0x51, + 0x0B, 0xEB, 0x84, 0xEA, 0xF4, 0x2D, 0xAA, 0xA1, 0x25, 0x04, 0x0D, 0x28, 0x40, 0x68, 0x01, 0xB4, + 0xC1, 0x52, 0x4E, 0x88, 0x81, 0x55, 0xDD, 0x9F, 0x8C, 0xEC, 0xA0, 0x51, 0x6F, 0xD5, 0xC3, 0xA5, + 0x9D, 0xAC, 0xB1, 0xA8, 0x31, 0x22, 0x1B, 0x8A, 0x27, 0xBA, 0xE8, 0x90, 0xFF, 0xBC, 0xA3, 0xF5, + 0xDB, 0x23, 0xEC, 0x0C, 0x83, 0x7B, 0xC2, 0xBE, 0x0E, 0x7C, 0x5C, 0xDA, 0x41, 0x5D, 0x69, 0xC3, + 0x00, 0x70, 0x6D, 0x58, 0xA8, 0xA0, 0xF2, 0x6F, 0x4F, 0x5F, 0xB7, 0xE5, 0xA2, 0x07, 0x73, 0x14, + 0x95, 0x11, 0x92, 0x3A, 0x62, 0xB9, 0xD2, 0x09, 0xDB, 0x62, 0x64, 0x13, 0x68, 0x4B, 0xA8, 0xD6, + 0x82, 0xA6, 0xEC, 0x03, 0xF9, 0x25, 0xEE, 0x07, 0x6B, 0xD8, 0x9F, 0x90, 0x81, 0x24, 0xA0, 0x49, + 0xB7, 0xC7, 0xA6, 0x63, 0xF9, 0x71, 0x99, 0x7D, 0x87, 0x1A, 0xB6, 0xD5, 0xB6, 0x9D, 0xC1, 0x68, + 0x6A, 0x61, 0xBF, 0x51, 0xF3, 0xAD, 0x33, 0x77, 0xEA, 0x90, 0x01, 0xAB, 0x35, 0x25, 0xC2, 0x19, + 0xA0, 0x2B, 0xD8, 0xB0, 0xB8, 0xCE, 0x8A, 0x7B, 0x77, 0x87, 0xFA, 0x87, 0x88, 0x28, 0x66, 0x53, + 0xAE, 0x02, 0xF0, 0x68, 0x27, 0xC8, 0x1A, 0x43, 0x97, 0x85, 0x5A, 0x02, 0x0A, 0xFC, 0xDC, 0xDB, + 0x16, 0x6E, 0xD4, 0x60, 0x01, 0x3C, 0x33, 0x1D, 0x32, 0x02, 0x5E, 0xAD, 0xB9, 0x2D, 0xD7, 0xFA, + 0x2E, 0xFF, 0x89, 0x09, 0x28, 0x09, 0x78, 0xE0, 0x4D, 0x53, 0x60, 0xC3, 0xDA, 0x5B, 0x18, 0xB6, + 0xF0, 0x6B, 0x84, 0x02, 0xC6, 0x87, 0x60, 0x90, 0xB7, 0x52, 0x49, 0x5C, 0x89, 0xAD, 0x16, 0x21, + 0x4D, 0x41, 0x14, 0x6D, 0xED, 0x02, 0x3B, 0x18, 0xD1, 0x75, 0xF7, 0xF2, 0xEA, 0x17, 0x3A, 0x48, + 0x4A, 0x63, 0x32, 0x82, 0xA8, 0x4F, 0xB6, 0x83, 0x93, 0x9A, 0x02, 0x21, 0xB1, 0xD6, 0x42, 0xBF, + 0x95, 0x3A, 0xFA, 0xED, 0x42, 0x72, 0x5C, 0x54, 0x82, 0x49, 0xC5, 0xA3, 0x8F, 0xBF, 0x64, 0x31, + 0xF1, 0x96, 0xEC, 0x16, 0x0E, 0x5C, 0xE7, 0xCE, 0x1E, 0x26, 0x78, 0x18, 0x57, 0x9A, 0x4C, 0x72, + 0xAB, 0xE0, 0xE0, 0x1E, 0x7B, 0x0E, 0x0E, 0x72, 0x2B, 0x3A, 0x41, 0x16, 0x30, 0x26, 0x35, 0x81, + 0x3D, 0x22, 0x80, 0xC6, 0x13, 0xEC, 0xF8, 0xF4, 0x0C, 0x42, 0xF8, 0x16, 0x90, 0xC9, 0xEC, 0x67, + 0x34, 0x99, 0xB8, 0x5E, 0xE0, 0xE7, 0x22, 0x27, 0xD3, 0xEA, 0xCA, 0xED, 0x1F, 0x1E, 0x98, 0x9E, + 0x55, 0x58, 0x1C, 0x35, 0x3C, 0x3D, 0x36, 0x07, 0x44, 0x2F, 0x3C, 0x74, 0x17, 0xCB, 0x58, 0xD6, + 0xB1, 0x02, 0x8C, 0x65, 0x15, 0xE7, 0xCE, 0x58, 0x4E, 0xE2, 0xCB, 0x33, 0x76, 0xEC, 0xFA, 0xA6, + 0x3D, 0xF8, 0xC9, 0xDC, 0x39, 0x33, 0xF7, 0xCA, 0xF5, 0x06, 0xF7, 0xFF, 0x44, 0x5C, 0x65, 0xF8, + 0x16, 0xA0, 0x0B, 0x58, 0x2D, 0x95, 0xAB, 0x1A, 0x02, 0xE8, 0x09, 0x93, 0x68, 0x5B, 0x72, 0xA6, + 0xAF, 0x59, 0xCF, 0x8E, 0x39, 0xB6, 0x07, 0x67, 0xE4, 0xB0, 0x34, 0xD2, 0x42, 0x85, 0xAD, 0x82, + 0x83, 0x1F, 0x2F, 0x26, 0x74, 0xA7, 0xC2, 0xAC, 0x10, 0xEC, 0x8F, 0x46, 0xBD, 0x3F, 0xF5, 0x1E, + 0xF0, 0x73, 0xBD, 0x85, 0xEA, 0x46, 0x5D, 0xDB, 0x55, 0x8A, 0x09, 0xCC, 0x27, 0x8D, 0x08, 0x44, + 0x0B, 0x4D, 0x1D, 0x8B, 0x0C, 0x1E, 0x39, 0x89, 0xEA, 0x9A, 0xA4, 0xA1, 0xBA, 0xDE, 0xFB, 0x08, + 0x78, 0x3A, 0x8B, 0xC6, 0xB3, 0x37, 0x0D, 0xDC, 0xB1, 0x1B, 0xD8, 0x0F, 0x18, 0xD0, 0x75, 0xAB, + 0xA2, 0x4B, 0x36, 0xE2, 0x7B, 0x4A, 0x3F, 0xC0, 0xA3, 0x11, 0x1D, 0xF1, 0x03, 0x38, 0x44, 0xD2, + 0x13, 0xFE, 0x3B, 0xCB, 0x7E, 0x40, 0x03, 0x72, 0xDE, 0xF5, 0x77, 0xEA, 0x20, 0xDC, 0xCB, 0xF4, + 0x7C, 0x89, 0xC6, 0xC1, 0x72, 0xA7, 0xBE, 0x5B, 0xD3, 0x10, 0xA0, 0x83, 0xB3, 0x04, 0x80, 0x46, + 0xE6, 0x2D, 0x1E, 0x25, 0x41, 0x2D, 0xD3, 0xEF, 0x75, 0xD8, 0xFB, 0xED, 0xD4, 0xA7, 0xE3, 0xAD, + 0x4D, 0xE3, 0x40, 0x84, 0xE0, 0xDF, 0xBC, 0xEF, 0xF5, 0xEB, 0xBB, 0xE4, 0x1F, 0xF4, 0x6E, 0x85, + 0x56, 0x2D, 0x87, 0xD5, 0x86, 0x0D, 0xB0, 0x06, 0x2B, 0xFD, 0x5E, 0x47, 0x01, 0xD9, 0x09, 0xEF, + 0xD4, 0xE9, 0xA7, 0x5B, 0xF7, 0xA9, 0x0E, 0xBB, 0x8D, 0x29, 0xF9, 0x50, 0x27, 0x1B, 0xC0, 0x0C, + 0x6A, 0x4A, 0x51, 0xB0, 0x42, 0x38, 0x58, 0xAE, 0xC5, 0x8F, 0x67, 0xF9, 0xE9, 0xC5, 0xF9, 0x5E, + 0x1F, 0xD8, 0xCE, 0x7E, 0x79, 0x25, 0xAC, 0x0F, 0xA9, 0xFA, 0xDD, 0xB3, 0xDF, 0x1C, 0x91, 0x7D, + 0xB6, 0x4B, 0xD8, 0xCF, 0x7E, 0x79, 0x25, 0xEC, 0x0F, 0xA9, 0xFA, 0xBD, 0xB3, 0x7F, 0x1F, 0xDB, + 0x87, 0xEE, 0xB4, 0xBE, 0xCB, 0xFE, 0xFB, 0x3A, 0x98, 0x1F, 0xD2, 0xF4, 0x7B, 0xE7, 0xFD, 0xFF, + 0xFB, 0x02, 0x13, 0x1C, 0xFE, 0x7D, 0x1D, 0x7C, 0x67, 0xF4, 0xCC, 0x87, 0xEB, 0xB0, 0xA5, 0x19, + 0x3A, 0xBE, 0x2F, 0xA3, 0xA8, 0x35, 0xDB, 0xB6, 0xE3, 0x60, 0xEF, 0xC3, 0xD5, 0xD9, 0x29, 0x59, + 0x70, 0x35, 0x60, 0x93, 0xDB, 0xCF, 0xE4, 0x29, 0x34, 0xFD, 0x18, 0xFA, 0x9F, 0xFF, 0x99, 0x73, + 0x9E, 0xD2, 0xEE, 0x4E, 0x5F, 0xCF, 0x8E, 0xE0, 0xF6, 0x49, 0xE2, 0x57, 0xB4, 0x1D, 0x58, 0xF9, + 0x41, 0x42, 0xA2, 0xA5, 0xE7, 0x77, 0x35, 0x2D, 0xD5, 0x1E, 0xF6, 0xF7, 0xF7, 0x48, 0x17, 0xE1, + 0xDF, 0x57, 0xC0, 0x6E, 0x46, 0xCC, 0xEF, 0x9A, 0xDF, 0xAF, 0x60, 0xF9, 0x4F, 0x25, 0xE9, 0x77, + 0xCD, 0xF8, 0x1F, 0xBE, 0xF0, 0xA7, 0x11, 0xF4, 0xFB, 0x16, 0xF7, 0x1F, 0x7F, 0xD8, 0x48, 0x25, + 0xE9, 0xF5, 0x2E, 0xFC, 0x7A, 0x13, 0xBB, 0x70, 0xE5, 0x00, 0x08, 0xC3, 0x7B, 0xDE, 0x8F, 0xD8, + 0xF3, 0x09, 0xD4, 0x13, 0x27, 0xD0, 0xDE, 0x3F, 0x9C, 0xB9, 0x96, 0x7D, 0xF7, 0x8C, 0x7C, 0x6E, + 0xE6, 0x41, 0xD6, 0x14, 0xA3, 0xC0, 0x45, 0x77, 0xBC, 0x35, 0x1A, 0xD9, 0x63, 0x3B, 0x60, 0x44, + 0x2F, 0x7E, 0xE7, 0x31, 0x3F, 0x0B, 0x50, 0xCF, 0xF5, 0x02, 0x70, 0x04, 0x78, 0x11, 0x1B, 0x50, + 0x9F, 0x31, 0xC8, 0xF4, 0x9E, 0x67, 0xB2, 0xCD, 0x14, 0x45, 0xD7, 0xC3, 0x64, 0x90, 0x03, 0xCF, + 0x36, 0x1D, 0x40, 0xB7, 0xFA, 0xB2, 0x96, 0xA7, 0xB5, 0x85, 0x33, 0x13, 0x9B, 0x80, 0x67, 0x7D, + 0xE1, 0xDD, 0xB2, 0xBD, 0x5B, 0xD7, 0x73, 0x30, 0xEA, 0x0C, 0x01, 0xDF, 0xC6, 0x8B, 0xE1, 0xEB, + 0x52, 0x7C, 0x6F, 0x5E, 0x0C, 0xDF, 0x1A, 0xC5, 0xB7, 0xB9, 0x68, 0x7C, 0x9F, 0x3C, 0xDB, 0x0F, + 0x00, 0xD3, 0xD6, 0xA2, 0x31, 0xED, 0xDB, 0xDF, 0xA8, 0x28, 0x76, 0xE6, 0x36, 0xB1, 0xC3, 0x6B, + 0xD0, 0xDD, 0x1D, 0xD4, 0xE9, 0x76, 0xB4, 0xAA, 0xA9, 0xBC, 0x7A, 0xCA, 0x53, 0x51, 0x67, 0xEE, + 0x23, 0xF6, 0x68, 0x3F, 0xF4, 0xC6, 0xE3, 0x8A, 0x7D, 0xC9, 0xE2, 0xDC, 0xD1, 0x72, 0x7F, 0xE0, + 0xBA, 0x01, 0x47, 0xDB, 0x9D, 0x27, 0xDA, 0xEF, 0x45, 0x2E, 0x84, 0x57, 0x56, 0xFA, 0x44, 0x6F, + 0xC1, 0x32, 0x33, 0x04, 0x77, 0x45, 0x13, 0x3C, 0xCC, 0x6E, 0x9F, 0x11, 0x5C, 0xE1, 0x4E, 0x1D, + 0x3B, 0xC8, 0x5B, 0xD6, 0x7C, 0xEB, 0xD8, 0xC3, 0xB8, 0x3F, 0x21, 0x8B, 0x48, 0xAD, 0x29, 0xE3, + 0x23, 0xEB, 0x8D, 0x52, 0xB5, 0x6F, 0xFF, 0x3D, 0xB7, 0xD6, 0xBD, 0xE9, 0x59, 0xB0, 0xCA, 0x9D, + 0x1C, 0xE6, 0xD5, 0xD4, 0xAC, 0xA8, 0x79, 0x4D, 0x2C, 0xF3, 0xD9, 0xBF, 0xC4, 0x63, 0xD3, 0x76, + 0x48, 0x8F, 0xF3, 0x2A, 0x4F, 0x3C, 0x17, 0xEE, 0xD7, 0x0D, 0x70, 0xA9, 0x2A, 0x58, 0xB7, 0x53, + 0xA2, 0x6E, 0xB7, 0x44, 0xDD, 0xD5, 0x12, 0x75, 0xD7, 0x4A, 0xD4, 0x5D, 0x2F, 0x51, 0x77, 0xA3, + 0x44, 0xDD, 0x37, 0x45, 0xEA, 0x7A, 0xA6, 0x65, 0xBB, 0x67, 0x7B, 0x07, 0xB9, 0x83, 0x86, 0x1F, + 0xEC, 0x01, 0xDE, 0xBF, 0xCA, 0x97, 0x88, 0x91, 0x3B, 0x0C, 0x7D, 0x2B, 0xF3, 0xAA, 0xDE, 0x9A, + 0x01, 0x99, 0x73, 0xCF, 0x3D, 0xEC, 0x0D, 0x30, 0x6C, 0xC3, 0xE2, 0xDA, 0x09, 0x55, 0x43, 0x34, + 0x8B, 0x6D, 0xC9, 0x9B, 0x43, 0xD9, 0x09, 0x22, 0x77, 0xEF, 0xE7, 0x05, 0xDF, 0x12, 0x82, 0xAA, + 0x43, 0xA3, 0xAD, 0x98, 0x81, 0x38, 0xBD, 0xD9, 0xF5, 0x64, 0x48, 0xD8, 0x8B, 0x6B, 0x33, 0x91, + 0x3D, 0x80, 0xFB, 0x43, 0x6F, 0x7C, 0x09, 0xAE, 0x8E, 0x1A, 0x82, 0xA9, 0x0B, 0x24, 0xDC, 0x4B, + 0x12, 0x8D, 0x8A, 0x1B, 0xCD, 0x0A, 0x90, 0xC1, 0x5B, 0xF2, 0x12, 0x0F, 0xB0, 0x3D, 0xD1, 0xC1, + 0x4F, 0x56, 0x52, 0x91, 0xE4, 0xA1, 0xE1, 0xD2, 0xC8, 0xFC, 0x6A, 0x75, 0x18, 0xA6, 0x9E, 0x47, + 0x46, 0xBF, 0x27, 0x56, 0xD3, 0x32, 0xF9, 0xCF, 0x8D, 0x1A, 0x3D, 0xB8, 0xFC, 0x06, 0x5E, 0xE0, + 0x3B, 0x1C, 0xEC, 0x25, 0xC8, 0xEF, 0xD7, 0xDF, 0xD8, 0xD1, 0x05, 0xDC, 0x5D, 0xB4, 0xE0, 0x96, + 0x50, 0xED, 0x2B, 0x19, 0x06, 0xD2, 0x66, 0xD2, 0x60, 0x07, 0x1E, 0x0C, 0xDE, 0xE0, 0xE0, 0xE1, + 0x52, 0x8A, 0x65, 0xE1, 0xEE, 0xFF, 0x7A, 0x02, 0xFE, 0xE4, 0x21, 0xDB, 0x35, 0x9D, 0xD2, 0x57, + 0x6C, 0xCC, 0x80, 0x0C, 0xF6, 0xD2, 0x53, 0x3F, 0x17, 0x15, 0xAB, 0xD6, 0xE0, 0x9E, 0x59, 0xC5, + 0x0F, 0x46, 0xB1, 0xCB, 0xB6, 0x76, 0x56, 0x88, 0x0E, 0xDD, 0x5A, 0xF1, 0x9F, 0x71, 0x72, 0x0A, + 0x8E, 0xE1, 0x59, 0xF8, 0xE9, 0xC2, 0xBD, 0x48, 0xFC, 0x7B, 0xA3, 0xAC, 0xFE, 0x33, 0xD7, 0xF4, + 0x45, 0xE0, 0xA7, 0x1E, 0xEE, 0x1A, 0xCC, 0xA1, 0xE7, 0xFB, 0xA2, 0x70, 0x7E, 0x4E, 0xC1, 0xF9, + 0x79, 0x81, 0x38, 0xBF, 0xA4, 0xE0, 0xFC, 0xB2, 0x28, 0x9C, 0xFE, 0xC4, 0x71, 0x1F, 0x7B, 0x18, + 0x7B, 0x07, 0xE0, 0x6F, 0xA8, 0xC1, 0x1E, 0x6D, 0x73, 0x91, 0xD1, 0xD4, 0x5B, 0x2A, 0x26, 0xA4, + 0x35, 0x59, 0x25, 0x55, 0xFB, 0x44, 0xAD, 0x56, 0x86, 0x10, 0x0E, 0x24, 0x65, 0xD9, 0xD1, 0xA2, + 0x58, 0xA2, 0xBD, 0x05, 0xFD, 0xF5, 0xEE, 0xD6, 0xDB, 0x2D, 0x85, 0xCD, 0x67, 0x87, 0x6F, 0xF0, + 0xB6, 0xD7, 0xAE, 0x1B, 0x91, 0x2F, 0x7E, 0x7B, 0x32, 0xF5, 0xEF, 0x4B, 0x6B, 0x0C, 0x0E, 0x3E, + 0xF4, 0xDA, 0x4F, 0x47, 0x11, 0xD6, 0xA8, 0x86, 0xE6, 0x6E, 0xCC, 0x36, 0x12, 0x09, 0xE8, 0x4A, + 0x0C, 0x47, 0x49, 0x99, 0xB8, 0x1B, 0xB3, 0x6D, 0xB0, 0x46, 0x9B, 0x8A, 0x91, 0x12, 0xD4, 0x84, + 0x15, 0x78, 0xC8, 0x1C, 0xD9, 0x43, 0x67, 0xA7, 0x3E, 0xC2, 0x77, 0x41, 0xD2, 0xFE, 0xA5, 0x6B, + 0x62, 0xED, 0xC2, 0x5A, 0x24, 0xD1, 0x08, 0x63, 0xB8, 0x02, 0x05, 0x85, 0x9B, 0x87, 0x23, 0x5F, + 0xBC, 0x15, 0xB7, 0xF8, 0xA9, 0x86, 0x3D, 0xB0, 0xE7, 0xE9, 0xE8, 0xA9, 0x23, 0xBA, 0x94, 0xD6, + 0x01, 0xD8, 0xC9, 0x61, 0x3D, 0xCD, 0x52, 0x88, 0x04, 0x0F, 0x57, 0x6A, 0x84, 0xAB, 0xEF, 0x16, + 0xA5, 0x69, 0x25, 0x28, 0x29, 0xB5, 0x64, 0xBC, 0x49, 0x63, 0xCD, 0xC0, 0x40, 0x60, 0x07, 0xD0, + 0x5E, 0x6E, 0x0D, 0x9D, 0xDE, 0x3E, 0x85, 0x91, 0x31, 0x26, 0x5F, 0xA8, 0xC9, 0x61, 0x0B, 0xC9, + 0x9F, 0x6F, 0xAE, 0xF7, 0x7F, 0xBD, 0x39, 0x3F, 0x3B, 0xDA, 0xBB, 0x39, 0xBC, 0x3A, 0x53, 0xCA, + 0x20, 0x8A, 0x85, 0x96, 0x43, 0x64, 0xCD, 0x4D, 0xC7, 0x30, 0xD6, 0x65, 0xB2, 0x84, 0x50, 0x19, + 0x2E, 0x89, 0xB6, 0xB5, 0x9D, 0x5A, 0xE5, 0x92, 0x79, 0xD6, 0x26, 0xB5, 0x9C, 0x02, 0xE6, 0x94, + 0xDA, 0x8C, 0xB5, 0xEE, 0xB5, 0x42, 0xCD, 0x43, 0xEE, 0x35, 0x1E, 0xB7, 0x0B, 0xBD, 0xC7, 0x6F, + 0x12, 0x27, 0x58, 0xE0, 0x8C, 0xD0, 0x2C, 0x74, 0x1E, 0x27, 0x07, 0xFB, 0xB5, 0xD4, 0xBB, 0xCE, + 0xB1, 0x14, 0xE7, 0x23, 0xB4, 0xFE, 0xAD, 0xFB, 0x75, 0x3B, 0x8F, 0x8D, 0x3B, 0x08, 0x7E, 0xD5, + 0x9B, 0x14, 0xD4, 0x20, 0xA2, 0x3F, 0xED, 0x88, 0xB8, 0x52, 0xCD, 0x0C, 0xC9, 0xD8, 0x23, 0xA1, + 0x55, 0xCA, 0x89, 0x5D, 0x0C, 0x63, 0xA2, 0x12, 0x79, 0xEF, 0x69, 0xCD, 0xD1, 0xDF, 0x75, 0x2E, + 0x60, 0x9A, 0x11, 0x91, 0xB9, 0x00, 0x93, 0xE8, 0x86, 0x7A, 0xF4, 0x0B, 0x9F, 0x57, 0x53, 0x99, + 0x43, 0x65, 0x68, 0xCD, 0x78, 0xD3, 0xBD, 0x31, 0x08, 0xA8, 0xE8, 0x2F, 0x3D, 0x93, 0x34, 0xA3, + 0xB5, 0xB3, 0x83, 0xD6, 0x53, 0xB9, 0x53, 0x95, 0x58, 0xED, 0xE7, 0xB5, 0xB2, 0x7D, 0xB8, 0x31, + 0x8A, 0x98, 0x3E, 0xE4, 0x0F, 0x89, 0xB1, 0x51, 0xEF, 0x5C, 0x86, 0x9E, 0x3B, 0x9D, 0x20, 0xCF, + 0x7D, 0x64, 0x2A, 0x6C, 0xEC, 0x0F, 0x05, 0x3A, 0x23, 0x25, 0x96, 0x18, 0xCF, 0x04, 0x5C, 0x76, + 0x05, 0x43, 0x6F, 0x5A, 0x74, 0x00, 0x42, 0x9C, 0x03, 0x77, 0xB4, 0xEC, 0x8F, 0x97, 0xD7, 0x10, + 0xFC, 0xB2, 0x41, 0xFF, 0xA5, 0x64, 0xB0, 0x9B, 0x9A, 0x5D, 0xA5, 0x29, 0x63, 0x32, 0x69, 0xFF, + 0x36, 0xED, 0x6E, 0x26, 0xAB, 0x7F, 0x12, 0xAE, 0xB5, 0xBA, 0xAC, 0xB9, 0x59, 0xC8, 0xA1, 0xA2, + 0x8F, 0x5D, 0x27, 0xF0, 0xDC, 0x51, 0x3D, 0x0F, 0x49, 0xA4, 0xEC, 0x13, 0xBD, 0xE4, 0xD7, 0x3B, + 0x42, 0x19, 0x55, 0x47, 0xC5, 0x58, 0x38, 0x49, 0x83, 0x7B, 0xE4, 0x79, 0x6E, 0x4C, 0xAA, 0xED, + 0x8C, 0x6C, 0x07, 0xB3, 0x6F, 0x64, 0x91, 0x98, 0xE4, 0x03, 0xA6, 0x17, 0x44, 0xC9, 0x6B, 0xA2, + 0x7C, 0xCD, 0x0E, 0x8E, 0x29, 0x82, 0x70, 0xFA, 0xDA, 0x5B, 0x1C, 0x94, 0xA8, 0x46, 0x15, 0xD4, + 0xFB, 0x1E, 0x51, 0x51, 0xF9, 0x75, 0x41, 0xBA, 0x2F, 0xDD, 0x07, 0xEC, 0x51, 0xA9, 0x27, 0xCA, + 0xBF, 0x53, 0xAC, 0x0D, 0x5D, 0x34, 0xF4, 0x4D, 0x2A, 0xAD, 0x17, 0x34, 0xDC, 0xE8, 0x98, 0x1C, + 0xEF, 0x02, 0x75, 0xFF, 0xF4, 0x22, 0x6B, 0x47, 0x8E, 0x66, 0xE9, 0x7C, 0xDD, 0xFE, 0x39, 0xB3, + 0x7F, 0xCE, 0xEC, 0xB9, 0xCD, 0x6C, 0x21, 0x58, 0x96, 0x87, 0xC9, 0x3E, 0x6B, 0xE6, 0xB6, 0x1C, + 0x56, 0x9B, 0x35, 0x97, 0xE2, 0x5A, 0x21, 0xB8, 0x70, 0x4A, 0x9D, 0x38, 0xA9, 0x13, 0x2A, 0x6E, + 0xC4, 0x67, 0x8A, 0x8C, 0x2B, 0x7D, 0xB2, 0x24, 0xE9, 0x0A, 0xE7, 0x8C, 0x0C, 0x52, 0x37, 0x6D, + 0x80, 0x15, 0xFA, 0x60, 0xE2, 0x70, 0x07, 0xF0, 0x4E, 0x1F, 0x8C, 0xAC, 0xDD, 0x14, 0xA4, 0x40, + 0xA2, 0xC7, 0x30, 0x0D, 0x85, 0xCD, 0xED, 0x02, 0x20, 0xE2, 0xB8, 0x65, 0x15, 0x4E, 0xC8, 0xDB, + 0x02, 0x81, 0x21, 0x7A, 0xF7, 0x81, 0x28, 0xDC, 0xF0, 0xCA, 0x75, 0xD1, 0xD8, 0x74, 0x9E, 0x45, + 0xEC, 0xC8, 0x67, 0x1D, 0xAD, 0x95, 0xB3, 0x70, 0xC2, 0x61, 0xC5, 0x76, 0x86, 0x42, 0x74, 0xB7, + 0xCE, 0x00, 0x99, 0xAC, 0x55, 0xEE, 0x90, 0xE1, 0xC4, 0x0D, 0xD3, 0x2D, 0xCB, 0xC9, 0x4A, 0x15, + 0x8C, 0x74, 0xD4, 0x17, 0x21, 0xBB, 0x37, 0xC9, 0x4A, 0xE5, 0x3A, 0xE3, 0x06, 0x66, 0xD8, 0x30, + 0xD5, 0xE4, 0x98, 0xA8, 0x53, 0xBA, 0x2B, 0xDC, 0xF2, 0x7F, 0x42, 0x06, 0x3E, 0xBE, 0x2C, 0xD0, + 0x9A, 0x45, 0xB4, 0x35, 0xDB, 0xBE, 0x37, 0xA8, 0x62, 0x4A, 0x4F, 0x44, 0x00, 0x6B, 0x2D, 0xDE, + 0xBA, 0x38, 0xE1, 0xB2, 0xF6, 0x05, 0x9E, 0x43, 0x43, 0x6B, 0x61, 0x88, 0xD2, 0x6B, 0x54, 0x02, + 0xEA, 0xC2, 0xA5, 0x59, 0x0A, 0x54, 0x96, 0xA1, 0x23, 0x01, 0x56, 0xBC, 0x68, 0xA4, 0x07, 0x78, + 0x74, 0xEB, 0x3E, 0x61, 0x1F, 0xAD, 0x20, 0x7A, 0xFD, 0x83, 0x6E, 0xA7, 0x41, 0x20, 0xF9, 0xB1, + 0x14, 0x8C, 0x81, 0x0D, 0xBC, 0x67, 0x9D, 0xE2, 0xE1, 0x26, 0x3B, 0x6E, 0x67, 0xD7, 0x47, 0x92, + 0x7E, 0x47, 0x03, 0x33, 0x18, 0xDC, 0xA3, 0x06, 0x86, 0x15, 0x25, 0x45, 0x7F, 0x89, 0x81, 0xD4, + 0xBE, 0x3F, 0xC5, 0xE8, 0xD1, 0x26, 0x3A, 0xF0, 0xE4, 0x30, 0x0C, 0x47, 0x2E, 0x19, 0x6D, 0x9B, + 0x13, 0x2D, 0x5C, 0xB4, 0x37, 0x61, 0x0E, 0x8A, 0x17, 0xEE, 0x8E, 0x38, 0x88, 0x7B, 0xA3, 0x11, + 0xF2, 0xF0, 0x70, 0x3A, 0x82, 0x18, 0x6F, 0xBA, 0xBD, 0x60, 0x03, 0x6A, 0x3A, 0x16, 0xDB, 0x0C, + 0xA8, 0x63, 0x59, 0xAA, 0xAB, 0x14, 0x82, 0xD6, 0x4C, 0xF1, 0x42, 0xA3, 0xF6, 0x5D, 0x1B, 0x4B, + 0x1F, 0x46, 0xDC, 0x21, 0xB8, 0xE7, 0xC0, 0x62, 0xB0, 0x1C, 0x35, 0x9F, 0xB2, 0x0B, 0x9F, 0x83, + 0x7B, 0xD3, 0x19, 0x62, 0xBE, 0x21, 0x57, 0xAC, 0xB5, 0xF5, 0xFA, 0x76, 0x5C, 0x9F, 0x5E, 0x9C, + 0xF1, 0x5B, 0xA2, 0x33, 0xB2, 0xFD, 0xD4, 0x54, 0x0D, 0xA9, 0x38, 0x74, 0x9D, 0x7A, 0x80, 0xA6, + 0x2C, 0x2E, 0x9A, 0x08, 0x92, 0x49, 0xB8, 0xFF, 0x88, 0xC1, 0xBE, 0x89, 0xED, 0x07, 0x22, 0x12, + 0x8F, 0xA6, 0x2F, 0x68, 0x0D, 0x32, 0x20, 0x77, 0x2E, 0xCF, 0x21, 0x44, 0x84, 0x4E, 0x0D, 0xAB, + 0x66, 0xB3, 0x41, 0x62, 0x5D, 0x46, 0x96, 0x93, 0x78, 0xC8, 0x8F, 0x5D, 0xB2, 0xFE, 0x91, 0xC1, + 0xA4, 0x59, 0x7B, 0x38, 0x31, 0xC2, 0x28, 0x43, 0x97, 0xC6, 0xD8, 0xF4, 0xA7, 0x1E, 0xAD, 0x00, + 0xFB, 0xBF, 0x0F, 0x7F, 0x27, 0x9D, 0xB2, 0x6C, 0x7F, 0x02, 0x43, 0x46, 0xD3, 0x21, 0x81, 0xD3, + 0x02, 0x3A, 0x98, 0xFA, 0x81, 0x3B, 0x66, 0x7F, 0xD7, 0x07, 0x94, 0x5D, 0xF5, 0xA6, 0x38, 0x26, + 0x1A, 0x50, 0x7D, 0x3C, 0xA8, 0x0E, 0x0B, 0xC2, 0x39, 0x41, 0x8B, 0xB2, 0xE0, 0xC3, 0x13, 0x67, + 0x76, 0x48, 0xC7, 0xA0, 0xEC, 0xAA, 0x83, 0xA1, 0xBA, 0x72, 0x9F, 0x06, 0x99, 0x8A, 0xC9, 0x1F, + 0x98, 0xA5, 0x7C, 0xCE, 0x40, 0xDF, 0x63, 0xB7, 0x3A, 0x4C, 0xEC, 0x80, 0x35, 0xF5, 0x3C, 0xF0, + 0xEC, 0x49, 0x1F, 0x13, 0xE6, 0x79, 0x73, 0x01, 0x75, 0x30, 0xB2, 0xE9, 0x6D, 0x7B, 0x55, 0x50, + 0x90, 0x33, 0x02, 0xDC, 0x08, 0x61, 0xAA, 0x39, 0xE0, 0xE3, 0x33, 0x1B, 0x4D, 0x3D, 0xD7, 0x76, + 0x82, 0x1E, 0xF6, 0xEE, 0xC8, 0x56, 0x4F, 0xD8, 0xD9, 0xCE, 0x0A, 0xF6, 0xE8, 0x89, 0x6C, 0x1B, + 0x1C, 0x73, 0xD4, 0x9B, 0x52, 0x65, 0x3F, 0x23, 0x30, 0x7F, 0x72, 0xEE, 0x3E, 0x56, 0x87, 0x62, + 0x3A, 0x01, 0x76, 0x1C, 0xF3, 0x12, 0xDF, 0x61, 0x0F, 0x3B, 0x03, 0xD6, 0xE7, 0x59, 0x89, 0x3A, + 0x75, 0x87, 0x43, 0xEA, 0x41, 0x33, 0x1B, 0x98, 0xBD, 0xCB, 0x5E, 0x25, 0x48, 0x31, 0x2C, 0xA6, + 0x8C, 0x60, 0xFA, 0x40, 0xEA, 0x29, 0x69, 0xBB, 0xC9, 0x8A, 0xC2, 0x2B, 0xA0, 0x44, 0x71, 0x30, + 0xE0, 0xD2, 0xB8, 0x0F, 0xCB, 0x97, 0x5A, 0xC4, 0x64, 0x3E, 0x59, 0x34, 0xB5, 0x26, 0xC9, 0x8F, + 0xD6, 0xFD, 0x60, 0x72, 0xC4, 0x03, 0xBE, 0x35, 0x24, 0x90, 0x0D, 0x17, 0xEC, 0x8E, 0x34, 0x25, + 0x07, 0x89, 0xE3, 0xA6, 0xAD, 0x92, 0xA2, 0x84, 0x7E, 0x87, 0xC8, 0x49, 0x51, 0xB4, 0x5E, 0xC9, + 0xC9, 0xD7, 0x68, 0x64, 0x37, 0x59, 0xE9, 0x42, 0x2D, 0xCF, 0x17, 0x56, 0x3F, 0x78, 0x26, 0x8B, + 0x19, 0xF0, 0x78, 0x44, 0x53, 0xDD, 0xD5, 0x1C, 0xD7, 0xC1, 0xB5, 0x44, 0xEA, 0x36, 0x1A, 0x70, + 0x5E, 0xA0, 0xF5, 0xED, 0xC8, 0x1D, 0x7C, 0x8B, 0x9A, 0x93, 0xAD, 0x9D, 0x87, 0x61, 0xFD, 0x38, + 0xE8, 0x7F, 0x44, 0x2E, 0x5B, 0xA5, 0xB8, 0xF7, 0x32, 0x4D, 0xF3, 0x22, 0x22, 0xE0, 0x49, 0xB2, + 0xE2, 0xB4, 0x75, 0x2C, 0x75, 0x16, 0xAD, 0x0C, 0xCD, 0x25, 0xEB, 0xD1, 0xCA, 0xCA, 0x49, 0xBC, + 0xC5, 0x88, 0xAB, 0x0F, 0x46, 0x3E, 0xCF, 0x21, 0x07, 0x11, 0x50, 0x51, 0xFE, 0x91, 0xFF, 0x98, + 0x92, 0xDD, 0x3A, 0x4B, 0x93, 0xE6, 0x7A, 0x64, 0x9F, 0xD2, 0xA8, 0xB5, 0x45, 0x2B, 0x47, 0x0B, + 0xB1, 0x3F, 0x2D, 0xCF, 0x9D, 0x58, 0xEE, 0xA3, 0x53, 0xCB, 0x4A, 0x73, 0x23, 0xA0, 0xE0, 0x07, + 0x60, 0xF2, 0x7D, 0x69, 0x49, 0x5A, 0x3C, 0x05, 0xAA, 0x97, 0x76, 0xC4, 0x16, 0xBF, 0x3D, 0x7D, + 0x6D, 0xF3, 0x8C, 0x35, 0xD4, 0x2F, 0x44, 0x2E, 0x61, 0x7B, 0x1C, 0x5A, 0xB8, 0x1D, 0x0D, 0x62, + 0xD8, 0x5F, 0x61, 0x8F, 0xDC, 0xD2, 0x6D, 0x91, 0x57, 0x56, 0x2E, 0xF1, 0xD8, 0x7D, 0xC0, 0xF4, + 0xC6, 0x0B, 0xCE, 0xAA, 0x70, 0x33, 0x46, 0xFF, 0xE0, 0x15, 0xCA, 0xF2, 0x26, 0xBE, 0x6B, 0x7B, + 0xEB, 0xB8, 0x41, 0xA3, 0xAD, 0x5E, 0xB8, 0x35, 0x43, 0xB6, 0x51, 0x62, 0x7E, 0x14, 0xCF, 0xC2, + 0x2D, 0xB0, 0x96, 0x6B, 0x3A, 0x5A, 0xC4, 0x4B, 0xE6, 0x62, 0xB4, 0x48, 0xB7, 0xD6, 0x04, 0x11, + 0xE4, 0xAB, 0xA9, 0xB7, 0xEA, 0xE4, 0x5F, 0x01, 0x16, 0xA1, 0xA5, 0x34, 0x0D, 0xD1, 0x2D, 0x74, + 0x39, 0x3A, 0xA2, 0xEB, 0x6D, 0x1D, 0x2D, 0x61, 0x61, 0x29, 0x7A, 0x32, 0xED, 0x3B, 0xB9, 0x64, + 0x69, 0x6C, 0x63, 0xF4, 0xEE, 0x46, 0x0F, 0x95, 0x11, 0xC6, 0x68, 0xCE, 0x30, 0xE5, 0xA4, 0xD2, + 0xAF, 0x6C, 0xBF, 0x1D, 0xB2, 0xAD, 0x19, 0xB2, 0x5D, 0x7C, 0x4C, 0x56, 0x32, 0x9F, 0x25, 0x68, + 0x97, 0x86, 0x5C, 0x81, 0x55, 0x51, 0x72, 0xF3, 0x11, 0x9E, 0xC4, 0xE9, 0xFB, 0x1A, 0x61, 0x61, + 0x0B, 0x75, 0x0D, 0xC3, 0x68, 0x6A, 0x95, 0x22, 0xB5, 0x3E, 0x12, 0x5D, 0xD8, 0x42, 0xF4, 0xFC, + 0x01, 0xA6, 0x46, 0x59, 0x49, 0x42, 0x6F, 0x99, 0x89, 0x52, 0xD9, 0xCE, 0x83, 0xF7, 0x04, 0x2D, + 0x78, 0x8B, 0x80, 0x19, 0x51, 0x73, 0x86, 0x26, 0x42, 0x32, 0x18, 0x61, 0xD3, 0x0B, 0xB1, 0x14, + 0x04, 0x5D, 0xD7, 0x92, 0xDA, 0x9F, 0x0E, 0x06, 0xE4, 0x10, 0x42, 0x89, 0x15, 0xF3, 0x83, 0x45, + 0xB0, 0x78, 0x05, 0x1D, 0xA1, 0x75, 0x96, 0x22, 0x4C, 0x47, 0x5B, 0x0C, 0xB6, 0x30, 0x44, 0x3D, + 0x7D, 0xE4, 0xC8, 0x13, 0xD2, 0xC6, 0xB9, 0x19, 0x9E, 0x3B, 0xE2, 0x0C, 0xA8, 0x77, 0xFC, 0x9C, + 0xA7, 0x3D, 0xB4, 0x68, 0x8E, 0x90, 0xE1, 0x49, 0x19, 0x0C, 0xC6, 0xB0, 0xD4, 0xB7, 0x3D, 0xAA, + 0x25, 0x1B, 0xDC, 0x76, 0x1C, 0xD1, 0xB7, 0x9D, 0xD3, 0x0C, 0xDC, 0xAB, 0x25, 0x7B, 0x73, 0x8A, + 0x69, 0x89, 0x9D, 0x45, 0xFF, 0xA1, 0x9C, 0x1A, 0xD5, 0xF3, 0x6E, 0x79, 0x42, 0x93, 0x48, 0xF3, + 0xC8, 0xD4, 0x75, 0x2D, 0x97, 0x50, 0x8D, 0x67, 0x53, 0xC6, 0xF0, 0xF3, 0x41, 0x8B, 0xA7, 0x80, + 0x28, 0x55, 0xE2, 0x88, 0xD6, 0xB8, 0x9C, 0xF3, 0x44, 0x73, 0xB1, 0x97, 0x63, 0x42, 0x98, 0x04, + 0x19, 0x50, 0xF7, 0x1A, 0x7A, 0x09, 0xA2, 0x59, 0x55, 0x01, 0x3A, 0x75, 0xA4, 0xE2, 0x39, 0x50, + 0x45, 0xA8, 0xB0, 0x40, 0xF0, 0xB3, 0xF7, 0x47, 0x58, 0x60, 0x45, 0x39, 0xA5, 0x85, 0x7C, 0x39, + 0x09, 0x0B, 0x5B, 0x90, 0xBB, 0xB2, 0xBB, 0xBE, 0x4E, 0xA8, 0x3E, 0x23, 0xFB, 0x4C, 0x74, 0x8B, + 0xC9, 0xFF, 0x82, 0x47, 0x8C, 0x1D, 0x64, 0x50, 0x63, 0x06, 0x29, 0xAB, 0xB5, 0x40, 0xED, 0x8D, + 0x46, 0xE6, 0xC4, 0xC7, 0xEF, 0xCF, 0xFB, 0x7D, 0x96, 0x50, 0x87, 0x1E, 0xD9, 0x13, 0x92, 0x9D, + 0x20, 0x00, 0x0E, 0x64, 0x0B, 0x25, 0x02, 0x10, 0x14, 0x21, 0xE4, 0xFA, 0x6C, 0x6B, 0xD3, 0x28, + 0x44, 0xC9, 0x46, 0x3A, 0x21, 0x1B, 0xB3, 0x31, 0x83, 0xD2, 0x50, 0x98, 0x23, 0xD5, 0xE8, 0x48, + 0xE3, 0x07, 0xAF, 0xDB, 0x67, 0x4B, 0x10, 0xD1, 0xF6, 0x03, 0x16, 0x3B, 0x31, 0x30, 0x3D, 0x2C, + 0x29, 0x71, 0x5E, 0xA2, 0x9B, 0x9D, 0x20, 0xE5, 0xD1, 0x14, 0x23, 0x55, 0x59, 0x5B, 0xDD, 0x34, + 0x26, 0x0B, 0xD7, 0x32, 0x2D, 0x5D, 0x86, 0x3D, 0x66, 0xD9, 0x36, 0xD3, 0x49, 0x66, 0x0B, 0x36, + 0xEF, 0x35, 0x28, 0xE4, 0x2E, 0x93, 0x1D, 0xA6, 0x0D, 0xE7, 0x8B, 0x63, 0x1B, 0x8F, 0x2C, 0xBF, + 0x21, 0x64, 0x88, 0x3C, 0xE0, 0xCC, 0xE0, 0x5B, 0xF4, 0x81, 0x10, 0x44, 0xA8, 0xF2, 0x29, 0x62, + 0x32, 0xB7, 0x54, 0xF1, 0x6C, 0x52, 0x84, 0xFB, 0xA1, 0xBD, 0x0B, 0x48, 0x88, 0x36, 0x84, 0xA9, + 0xCD, 0xE3, 0x31, 0x82, 0xB6, 0x34, 0xEE, 0xB2, 0x6C, 0x43, 0x10, 0x32, 0xDE, 0x96, 0xFC, 0x5A, + 0xB0, 0xF9, 0x7E, 0x9C, 0xCA, 0x8B, 0xB4, 0xA5, 0x89, 0xBD, 0x2A, 0xE0, 0xA5, 0x42, 0xC5, 0xDB, + 0x17, 0xC7, 0xDD, 0xEB, 0x09, 0xDC, 0x12, 0x8D, 0x0C, 0x05, 0x9B, 0x0B, 0xD9, 0xBB, 0x28, 0x04, + 0xF8, 0xB3, 0x58, 0xD3, 0x4F, 0xF6, 0xB1, 0x1D, 0xB7, 0x7C, 0xB4, 0xEF, 0xEC, 0x82, 0x0D, 0xAF, + 0x0E, 0x7A, 0xD7, 0x87, 0x02, 0xD9, 0xE4, 0x10, 0x7C, 0x6D, 0x4D, 0x0A, 0x36, 0xA6, 0xAE, 0xF0, + 0x71, 0x5B, 0x7A, 0x54, 0x28, 0xD8, 0x34, 0x79, 0x06, 0x7E, 0x8E, 0x01, 0x09, 0x3B, 0xC7, 0x82, + 0xE0, 0xFA, 0xCF, 0x7E, 0x80, 0xC7, 0x31, 0x04, 0x9F, 0xFD, 0x5D, 0xAC, 0xF1, 0x91, 0x9C, 0xB5, + 0x8D, 0x34, 0x8F, 0xF2, 0xB8, 0x15, 0x03, 0x70, 0x7E, 0x25, 0x70, 0x10, 0x52, 0xBB, 0x15, 0x6B, + 0x76, 0x2C, 0xA4, 0xF1, 0x24, 0x0D, 0xC5, 0x23, 0x58, 0x04, 0x80, 0xEF, 0x30, 0x92, 0x4B, 0x20, + 0x9B, 0xD8, 0x7C, 0x92, 0x22, 0x86, 0x3E, 0xA9, 0x5F, 0x59, 0x90, 0x57, 0x1C, 0x12, 0x01, 0x77, + 0x59, 0x2D, 0xC8, 0xC1, 0xBC, 0xB6, 0x25, 0xE8, 0xDA, 0x0E, 0xC4, 0x19, 0xAF, 0x6D, 0x91, 0x96, + 0xA6, 0x67, 0x0E, 0x02, 0xEC, 0xF9, 0xA2, 0xB6, 0x95, 0x15, 0x41, 0x53, 0xC0, 0x0E, 0x53, 0x26, + 0x15, 0x35, 0x53, 0xED, 0x1A, 0x13, 0x71, 0x0B, 0x52, 0xE4, 0x1A, 0x46, 0xA7, 0xDB, 0xA2, 0x89, + 0x7E, 0x93, 0x1A, 0x9F, 0x95, 0x52, 0xBD, 0xDF, 0x31, 0x68, 0x03, 0x9D, 0x56, 0x89, 0xD8, 0x0B, + 0x38, 0xE5, 0x98, 0xEE, 0x46, 0x4C, 0xA4, 0x8E, 0x22, 0xDB, 0x21, 0x1F, 0x1E, 0x6A, 0x74, 0xCD, + 0xD9, 0x32, 0x52, 0xD7, 0x9C, 0x2D, 0xA3, 0x08, 0xE6, 0x04, 0xEC, 0x83, 0xF3, 0x8B, 0xD9, 0x40, + 0xC7, 0x7B, 0xE1, 0x34, 0x33, 0x6A, 0x74, 0x33, 0xA4, 0xD9, 0x25, 0xEB, 0x46, 0xDF, 0x89, 0x5B, + 0x1F, 0x98, 0x84, 0x4F, 0xDE, 0x07, 0xD7, 0x0F, 0xB8, 0x1C, 0xAC, 0x27, 0xE4, 0x60, 0x3D, 0x45, + 0x0E, 0x34, 0x1C, 0x48, 0xE1, 0x42, 0x02, 0x1F, 0x68, 0x36, 0x86, 0x6F, 0x0B, 0x7E, 0x54, 0x94, + 0xF4, 0x63, 0x49, 0x54, 0x9A, 0xBE, 0xD1, 0xE4, 0xBE, 0xCC, 0xD0, 0x49, 0x71, 0xAD, 0x1A, 0x2A, + 0xA2, 0x55, 0xA3, 0x7A, 0xDF, 0x58, 0x4F, 0xAE, 0x7D, 0xEC, 0x69, 0x3A, 0x08, 0x9F, 0xA9, 0x0A, + 0x0C, 0xBE, 0x75, 0x87, 0x6E, 0x7B, 0xE0, 0x8E, 0xE1, 0x2F, 0xF8, 0x8A, 0xC6, 0x40, 0xC0, 0x94, + 0xAC, 0xBD, 0x44, 0xA7, 0xD8, 0x64, 0x37, 0x3B, 0x36, 0xED, 0x11, 0x22, 0x2B, 0xBA, 0x47, 0xF6, + 0x49, 0x8B, 0x20, 0xE1, 0xF1, 0xF1, 0xB1, 0x3D, 0x5F, 0x32, 0x52, 0x8E, 0x39, 0xEC, 0xE8, 0xCA, + 0x28, 0x4B, 0x97, 0x31, 0x91, 0x25, 0x52, 0xBF, 0xB2, 0x5B, 0x73, 0x89, 0xE9, 0x76, 0x8C, 0x4E, + 0xA1, 0x56, 0xD2, 0xD8, 0xD7, 0x6E, 0x47, 0x96, 0x77, 0xD3, 0x9F, 0x98, 0xDE, 0xB7, 0xE3, 0xA9, + 0xD3, 0xA9, 0x95, 0x84, 0xD0, 0xFB, 0x54, 0x86, 0xD2, 0x90, 0xEF, 0x01, 0xF6, 0x83, 0xFF, 0x03, + 0xFF, 0x94, 0xED, 0x2A, 0x00, 0x20, 0x28, 0x09, 0x88, 0x9A, 0x6A, 0x2F, 0x17, 0xEA, 0x5E, 0x79, + 0xA6, 0xE3, 0x8F, 0xED, 0xE0, 0xFD, 0xFB, 0xBD, 0x5A, 0xCA, 0x4D, 0x77, 0xC2, 0x9E, 0x08, 0xBB, + 0xBD, 0xEB, 0xFD, 0x5F, 0x43, 0x47, 0x29, 0xD1, 0x9E, 0xBA, 0xB2, 0x32, 0xA6, 0x47, 0x44, 0xA8, + 0x62, 0x5B, 0x3E, 0xF2, 0x03, 0xD3, 0xA3, 0x86, 0x5B, 0x7A, 0x75, 0xAA, 0x78, 0xE1, 0xC6, 0x26, + 0xD8, 0xB8, 0x20, 0xDB, 0xCC, 0x58, 0x67, 0x71, 0x73, 0xB6, 0xF5, 0xAF, 0x3B, 0x0A, 0xAC, 0xAF, + 0x99, 0x69, 0xC6, 0x05, 0xF8, 0xA9, 0x06, 0xAA, 0xA4, 0x43, 0xA3, 0xD0, 0x8A, 0xD9, 0x13, 0xD5, + 0xF9, 0x23, 0x9D, 0x10, 0x85, 0xB6, 0x8A, 0x84, 0x97, 0x61, 0x0A, 0xF5, 0xB8, 0x9C, 0x23, 0x63, + 0x28, 0xBC, 0x1F, 0xCE, 0x1C, 0x7A, 0x56, 0xD3, 0x33, 0x48, 0x23, 0x5A, 0x70, 0xBA, 0xD3, 0x09, + 0x57, 0x55, 0x86, 0x68, 0x3D, 0x67, 0x7F, 0x38, 0x4F, 0xD8, 0x41, 0x3A, 0x5D, 0x6A, 0xE6, 0xD5, + 0xDB, 0xD8, 0xF7, 0xF7, 0x7F, 0x54, 0x97, 0x5F, 0x87, 0xE0, 0xC7, 0x96, 0x8A, 0x6C, 0xE9, 0xA7, + 0x6F, 0xCC, 0x88, 0x5B, 0xDE, 0x70, 0x9F, 0xA6, 0xF1, 0x39, 0x28, 0xBA, 0x4D, 0xE3, 0xBB, 0x26, + 0xF7, 0x96, 0x2C, 0x04, 0x0F, 0x3C, 0xD5, 0x33, 0x39, 0xEC, 0x5B, 0xB0, 0x2E, 0x6F, 0x80, 0x5D, + 0xC4, 0xD0, 0xED, 0x24, 0x37, 0x0C, 0xD8, 0xD1, 0x90, 0x32, 0x71, 0xF5, 0xDE, 0xD7, 0x27, 0xB2, + 0xCE, 0xC6, 0xD6, 0x73, 0x7D, 0x1B, 0xFE, 0xBB, 0x37, 0x18, 0x4C, 0xC9, 0xDE, 0xE8, 0x99, 0xED, + 0x9E, 0xD6, 0xDB, 0x1D, 0x0D, 0xD6, 0x4E, 0x9B, 0xA2, 0x5D, 0x6F, 0x67, 0xA1, 0x4D, 0x5B, 0xFA, + 0xA8, 0xC7, 0xC2, 0x11, 0x0D, 0x3C, 0x6D, 0x49, 0x4F, 0x2B, 0xA5, 0xAF, 0x96, 0x51, 0x93, 0xCF, + 0xD0, 0x44, 0x78, 0x72, 0xA9, 0x40, 0x93, 0x2F, 0xA4, 0x89, 0xF0, 0x14, 0x53, 0x4E, 0x8B, 0x53, + 0x33, 0x00, 0xFB, 0x3C, 0x6D, 0xD3, 0x36, 0xB6, 0x8C, 0xEE, 0xD6, 0xDA, 0x9B, 0xAD, 0xBC, 0x36, + 0xAE, 0x33, 0xE4, 0x8D, 0xD8, 0xD3, 0x52, 0x9B, 0xEB, 0xC6, 0xFA, 0x9B, 0x8D, 0x4E, 0x4E, 0xB3, + 0xBD, 0x51, 0x60, 0x07, 0x53, 0x8B, 0x1E, 0xC5, 0xD6, 0x37, 0x08, 0xB6, 0xCD, 0x0C, 0x44, 0xFC, + 0x26, 0xFF, 0x03, 0xB6, 0x87, 0xF7, 0x80, 0xC8, 0xC8, 0xAD, 0xAA, 0x5C, 0xFA, 0x0B, 0x4D, 0x0A, + 0xED, 0xE4, 0x52, 0xE4, 0x30, 0x1D, 0x6D, 0xB6, 0x28, 0x11, 0x51, 0x91, 0x65, 0x22, 0x9C, 0x31, + 0xD9, 0x4E, 0x31, 0x59, 0x93, 0xA7, 0xEA, 0x08, 0xCE, 0x30, 0x8A, 0xD5, 0x46, 0xB2, 0xE4, 0x68, + 0x96, 0x1C, 0x51, 0x8D, 0x53, 0xB1, 0x3C, 0xC7, 0xE5, 0xF9, 0xF6, 0xC6, 0xA0, 0x3F, 0x2D, 0x14, + 0xFD, 0x12, 0xCD, 0xEE, 0xB0, 0x0C, 0xA6, 0x36, 0xFF, 0xB5, 0x80, 0x56, 0xC9, 0xC3, 0xFA, 0xF9, + 0x87, 0x60, 0xFD, 0xB2, 0x10, 0xAC, 0xDF, 0xB3, 0xDD, 0x1B, 0x2B, 0xE8, 0xB9, 0x8A, 0xBA, 0xAE, + 0x9C, 0xBE, 0xD3, 0xB0, 0x2D, 0xF6, 0x4B, 0x21, 0xCB, 0xD9, 0x47, 0xEC, 0x41, 0xCE, 0x39, 0xF2, + 0x6D, 0x85, 0xBA, 0xF2, 0xC6, 0x91, 0x23, 0xC5, 0x18, 0x2E, 0xC8, 0xFF, 0x72, 0xA7, 0x63, 0xAC, + 0xAE, 0xB5, 0xD0, 0xE6, 0xA6, 0x64, 0x5B, 0x62, 0x9F, 0x81, 0xD9, 0x50, 0x50, 0x68, 0xD1, 0x48, + 0x41, 0xA8, 0x4E, 0x9D, 0x65, 0x78, 0xB1, 0xCF, 0x68, 0x21, 0xFE, 0x1F, 0x01, 0xE3, 0x3A, 0x1F, + 0x5E, 0xFA, 0x4B, 0x75, 0x91, 0x4A, 0x9B, 0x7C, 0xCB, 0x5D, 0x83, 0xCC, 0x74, 0x7A, 0x6D, 0xDC, + 0x96, 0x10, 0xD3, 0x0F, 0x80, 0x98, 0xFE, 0x52, 0x5C, 0xAA, 0xBE, 0x67, 0x18, 0x7D, 0x22, 0x37, + 0xBC, 0x4A, 0x46, 0x1F, 0xD6, 0x3A, 0x3E, 0x90, 0xDF, 0x18, 0xA5, 0xCD, 0x7F, 0x31, 0xE9, 0xE7, + 0x57, 0x97, 0x27, 0xBD, 0x42, 0xB6, 0x1F, 0x11, 0x2D, 0x9C, 0xE4, 0x43, 0xB4, 0xC5, 0xAC, 0x3F, + 0x45, 0x31, 0x6A, 0x7A, 0x1A, 0x1F, 0xE2, 0x17, 0xD8, 0xD3, 0x4C, 0xBC, 0xBD, 0x4F, 0x73, 0xC4, + 0x5C, 0xDC, 0xF2, 0xA2, 0x1D, 0xE8, 0x12, 0xB6, 0x17, 0xED, 0x88, 0x15, 0xB0, 0xBE, 0x88, 0xED, + 0xC0, 0x90, 0xC1, 0xF0, 0x96, 0xB2, 0x85, 0xA8, 0x20, 0x38, 0x07, 0x6B, 0xC5, 0xDA, 0x29, 0x23, + 0xCE, 0x4C, 0x3F, 0xD6, 0xA3, 0x13, 0x3C, 0x3A, 0xDD, 0xB2, 0x10, 0x42, 0xCC, 0x9F, 0x2E, 0xD7, + 0x1F, 0x2F, 0xDD, 0xB5, 0x0F, 0x65, 0x28, 0xA7, 0x4C, 0xEF, 0x14, 0xA7, 0x5B, 0x60, 0x75, 0x27, + 0x7B, 0x57, 0xA7, 0xE7, 0x73, 0x69, 0x54, 0x9C, 0xB5, 0x9D, 0x4A, 0xAC, 0xAD, 0xD4, 0xAA, 0x1C, + 0x36, 0x81, 0x8D, 0xDD, 0x4A, 0x6C, 0xEC, 0x56, 0x61, 0x63, 0xB7, 0x22, 0x1B, 0xBB, 0x95, 0xD8, + 0xD8, 0xAD, 0xC8, 0xC6, 0x6E, 0x25, 0x36, 0xAE, 0x56, 0x62, 0xE3, 0x6A, 0x15, 0x36, 0xAE, 0x56, + 0x64, 0xE3, 0x6A, 0x25, 0x36, 0xAE, 0x56, 0x64, 0xA3, 0xDC, 0x4E, 0x38, 0xD5, 0x8B, 0x1E, 0xE1, + 0xDA, 0xD3, 0x7D, 0x9E, 0xE3, 0x78, 0xD6, 0xE2, 0x1C, 0x06, 0xB7, 0xD0, 0x98, 0x11, 0x01, 0xC2, + 0x21, 0x4D, 0x70, 0xC7, 0x6F, 0xD7, 0xAE, 0xDC, 0x6F, 0x18, 0x6C, 0x06, 0xB4, 0xF2, 0xB6, 0x7C, + 0x58, 0xA2, 0xDF, 0xA2, 0xFC, 0x19, 0x89, 0x8C, 0x41, 0xDA, 0xFB, 0xBE, 0x6C, 0x3C, 0x2D, 0xB4, + 0xBA, 0xC1, 0xFE, 0x1F, 0x2D, 0x50, 0xAB, 0x1B, 0x69, 0xD7, 0x7F, 0xBD, 0x2A, 0xD7, 0x01, 0xB9, + 0x04, 0x24, 0x8D, 0xDD, 0xE6, 0x34, 0x70, 0x7F, 0xC1, 0xCF, 0x97, 0xD8, 0xC1, 0x8F, 0xE6, 0xA8, + 0x80, 0x91, 0x1B, 0x2E, 0xBD, 0x73, 0x6F, 0x3E, 0xE1, 0x2E, 0xFC, 0x1C, 0x07, 0x8F, 0xAE, 0xF7, + 0xED, 0xC6, 0xE8, 0xF7, 0x4F, 0x0E, 0xD9, 0xE5, 0x9C, 0xB4, 0x38, 0x1B, 0x99, 0x8B, 0xB3, 0x70, + 0xB7, 0xAE, 0xBB, 0xF9, 0xD3, 0x22, 0xEA, 0x99, 0xBE, 0x4F, 0x7E, 0xB3, 0x5E, 0x02, 0x59, 0xE7, + 0xA5, 0x7A, 0xD5, 0x79, 0xC9, 0x5E, 0x75, 0x5F, 0xAA, 0x57, 0xDD, 0x97, 0xEC, 0xD5, 0xEA, 0x4B, + 0xF5, 0x6A, 0x75, 0x9E, 0xBD, 0x92, 0xB5, 0xE0, 0xD5, 0x20, 0x79, 0x13, 0x5D, 0xF8, 0x54, 0x12, + 0xC5, 0x5F, 0xC4, 0x57, 0xC2, 0x1B, 0xEB, 0xEB, 0xAB, 0x89, 0x5B, 0x68, 0xFA, 0x31, 0x87, 0xAC, + 0xEF, 0x29, 0xD4, 0x55, 0x3E, 0x32, 0x45, 0x11, 0x20, 0x8B, 0x22, 0xEE, 0xDA, 0xAA, 0x4E, 0xDC, + 0xD4, 0x9A, 0x3B, 0x71, 0x2B, 0x2B, 0x17, 0x0E, 0x0A, 0xBD, 0x5F, 0x5A, 0xE8, 0xEA, 0xA0, 0x87, + 0xD8, 0xE0, 0x50, 0x27, 0x05, 0x86, 0x0D, 0x0D, 0x4C, 0x07, 0x39, 0x2E, 0x85, 0xCF, 0x3A, 0x61, + 0x21, 0x33, 0x80, 0x5B, 0x64, 0xE4, 0x83, 0x9D, 0x3D, 0xB0, 0xC7, 0x38, 0x32, 0x8E, 0x4F, 0x09, + 0x14, 0xD7, 0x41, 0x80, 0xB1, 0x05, 0x55, 0x9E, 0x69, 0xEB, 0x5B, 0xDC, 0x6E, 0xB7, 0xA3, 0x00, + 0x4B, 0xEA, 0xAE, 0xC1, 0x13, 0x85, 0x9D, 0x4D, 0x03, 0xFC, 0x94, 0x94, 0x2B, 0xF0, 0xC0, 0x51, + 0x06, 0x93, 0x7C, 0xAA, 0x4C, 0x5E, 0x06, 0x33, 0x42, 0xAA, 0x98, 0xFF, 0x50, 0xC6, 0xD2, 0x1F, + 0x07, 0x2C, 0x95, 0xB4, 0xEA, 0x8F, 0xCD, 0x27, 0xD2, 0xF6, 0xCA, 0x0E, 0x1D, 0x6F, 0x3A, 0xC6, + 0x7A, 0xA7, 0x6B, 0x24, 0x3C, 0x13, 0x3A, 0x2D, 0xF2, 0xBD, 0xD5, 0x95, 0xCD, 0x15, 0x92, 0x57, + 0x53, 0xCE, 0xB9, 0x9B, 0xE1, 0x39, 0xA5, 0x9B, 0x84, 0x39, 0x61, 0x2A, 0xB4, 0xD0, 0x4B, 0xFD, + 0xDB, 0x30, 0xD0, 0x5F, 0x51, 0x37, 0xC3, 0xD2, 0xAE, 0x50, 0xA9, 0xD4, 0x4F, 0xB1, 0x83, 0x48, + 0xF1, 0x62, 0x25, 0xD9, 0x1F, 0xB7, 0x3D, 0x71, 0x02, 0xB0, 0x52, 0x8F, 0xF8, 0xD4, 0x49, 0x32, + 0x66, 0x63, 0x5E, 0x2C, 0xD1, 0xE3, 0x34, 0x34, 0xFB, 0xCE, 0x70, 0xEE, 0xC5, 0xBD, 0x2E, 0xF2, + 0x8E, 0xB1, 0xD8, 0xCD, 0x93, 0xDE, 0x1E, 0xF3, 0xE1, 0x88, 0x1F, 0x1F, 0x3D, 0xE9, 0xD5, 0x84, + 0xAE, 0x39, 0x8E, 0xD3, 0x16, 0xFE, 0x2F, 0xF6, 0xF0, 0x28, 0xFD, 0xB5, 0xD2, 0x1C, 0x14, 0x87, + 0xE7, 0xFD, 0x85, 0xE3, 0x78, 0x6F, 0x06, 0x64, 0x1F, 0xF8, 0xBC, 0x70, 0x3C, 0xFD, 0xE9, 0x2D, + 0xF9, 0x77, 0xBE, 0x68, 0xB8, 0xF0, 0x85, 0x28, 0xCE, 0x83, 0x09, 0x57, 0xDA, 0x46, 0x52, 0x69, + 0x1B, 0x5A, 0xA5, 0x9D, 0x82, 0x48, 0x90, 0x9D, 0xF3, 0xAB, 0x5E, 0x75, 0xB1, 0x89, 0x8C, 0x75, + 0x84, 0xB0, 0xD1, 0xE8, 0xE8, 0x69, 0xE2, 0x3A, 0x4C, 0xF1, 0xAE, 0x12, 0x49, 0x7D, 0x23, 0x1E, + 0x0B, 0xA8, 0xCA, 0x78, 0x23, 0x92, 0x16, 0x7B, 0x3B, 0xE6, 0x9A, 0x02, 0x27, 0x84, 0x9E, 0x81, + 0x4D, 0xF3, 0x93, 0xB4, 0xD0, 0x32, 0xF8, 0x63, 0x49, 0xF6, 0xD2, 0x55, 0xDA, 0x77, 0xA3, 0x2A, + 0xF0, 0x4B, 0xD7, 0x25, 0x67, 0x8B, 0x11, 0x95, 0x11, 0xB0, 0x03, 0x1B, 0x09, 0x5B, 0x3F, 0xB3, + 0x02, 0x1B, 0x2D, 0xF8, 0xAA, 0x98, 0x82, 0x4B, 0x23, 0xB2, 0xFD, 0x09, 0x4F, 0xB5, 0xB2, 0x10, + 0x6C, 0xB1, 0x51, 0x71, 0x12, 0x19, 0x9C, 0x4F, 0x2C, 0x6E, 0x49, 0x4C, 0x18, 0x12, 0xE9, 0xDE, + 0xCD, 0xCF, 0xC6, 0x20, 0x9D, 0x6F, 0xBD, 0xAC, 0x73, 0xAD, 0x1A, 0xB9, 0x5C, 0x52, 0xC7, 0x62, + 0xB1, 0x39, 0xAC, 0x04, 0xFB, 0xEC, 0xB2, 0x98, 0x81, 0x0B, 0xD5, 0xAD, 0xCA, 0x2D, 0xAE, 0x73, + 0x75, 0xDC, 0xEA, 0xA5, 0x3C, 0x63, 0x9C, 0x87, 0x5B, 0x5C, 0xFD, 0x66, 0xC7, 0x28, 0xFA, 0xBC, + 0x08, 0x79, 0x81, 0xE2, 0x28, 0xB6, 0x54, 0x2F, 0xD0, 0x44, 0xE4, 0x9B, 0x7F, 0x6A, 0xDF, 0x61, + 0xBE, 0x15, 0x21, 0x73, 0x9F, 0x2C, 0xCB, 0x02, 0x59, 0xEB, 0x54, 0x6C, 0xBA, 0x12, 0x3D, 0xE9, + 0xEE, 0xD1, 0x4D, 0x31, 0x34, 0x26, 0x25, 0x93, 0x79, 0x22, 0x48, 0x06, 0x62, 0xA8, 0x79, 0x25, + 0x31, 0x02, 0x57, 0x0E, 0x17, 0x90, 0x5C, 0x4F, 0x45, 0x8F, 0xE3, 0x1D, 0x24, 0x3F, 0xC4, 0x11, + 0x07, 0xC6, 0xD5, 0x7D, 0xF3, 0x01, 0xEF, 0x07, 0xF0, 0xFA, 0x4D, 0xAD, 0x47, 0xD6, 0x40, 0xB2, + 0x2A, 0xD2, 0xA5, 0x90, 0x86, 0x02, 0x09, 0x20, 0x96, 0xC8, 0x07, 0xFA, 0x67, 0xD2, 0x68, 0x13, + 0xC6, 0x97, 0x45, 0xA0, 0xC4, 0x1A, 0x8B, 0x4D, 0xC0, 0x2E, 0x2E, 0xE6, 0x4A, 0x9F, 0x77, 0xE7, + 0xD7, 0x65, 0xFF, 0xD5, 0xF6, 0xF9, 0x1F, 0xB2, 0xFD, 0xA5, 0x48, 0x3E, 0x93, 0x53, 0xD7, 0x84, + 0x90, 0xCC, 0x36, 0xE2, 0x5D, 0x7F, 0x34, 0xED, 0x80, 0x6C, 0xEE, 0xEB, 0xB2, 0xD3, 0x87, 0x5E, + 0x2A, 0xF5, 0x2E, 0x42, 0xA1, 0x7F, 0x50, 0xB2, 0xB7, 0x6F, 0xC3, 0x1E, 0xC4, 0x56, 0x31, 0x31, + 0x4A, 0x35, 0x0C, 0x28, 0x4F, 0xEC, 0x35, 0xE5, 0x61, 0x12, 0xCB, 0xC5, 0x30, 0x49, 0x71, 0x1C, + 0xFB, 0xE6, 0x03, 0x74, 0xAA, 0xDD, 0x56, 0x2E, 0x22, 0x95, 0x08, 0xD3, 0x5A, 0x9C, 0xBF, 0xA5, + 0x95, 0x35, 0x06, 0x2D, 0x05, 0xCC, 0x10, 0xA7, 0x45, 0xD5, 0x24, 0x82, 0x7C, 0xA4, 0x80, 0xA3, + 0x99, 0xE2, 0x6B, 0xE6, 0x10, 0x63, 0x33, 0x53, 0x9C, 0xCD, 0x9C, 0x62, 0x6D, 0xE6, 0x10, 0x6F, + 0x33, 0x63, 0xCC, 0xCD, 0x4C, 0x71, 0x37, 0x33, 0xC7, 0xDE, 0x2C, 0x20, 0x88, 0x66, 0xE6, 0x40, + 0x9A, 0xB9, 0x04, 0xD3, 0xCC, 0x10, 0x50, 0x33, 0x73, 0x50, 0x8D, 0x36, 0x83, 0x06, 0xE8, 0x03, + 0x86, 0xF4, 0x9F, 0x66, 0x89, 0x7C, 0x7D, 0x0B, 0x58, 0xCA, 0xF2, 0xB2, 0x40, 0x6D, 0x1D, 0xED, + 0xD4, 0x34, 0xA1, 0xA8, 0x6A, 0x54, 0x90, 0x18, 0x67, 0x3E, 0xAF, 0x07, 0x13, 0x29, 0x2C, 0xD0, + 0xF0, 0xBA, 0x27, 0x89, 0xE5, 0xBD, 0x34, 0x0B, 0x76, 0x8F, 0x9B, 0xFE, 0xE5, 0x2F, 0x28, 0xA5, + 0x25, 0x7B, 0xE7, 0xB5, 0x62, 0x6B, 0xF6, 0x5C, 0x69, 0x55, 0xD4, 0xEC, 0xCD, 0x4D, 0x5D, 0x6B, + 0x6D, 0xB2, 0x44, 0x5D, 0xD8, 0x48, 0xEE, 0xA2, 0xA6, 0x08, 0x64, 0xF2, 0x51, 0x4E, 0x51, 0x36, + 0xEF, 0x5D, 0x97, 0xFC, 0x87, 0x9C, 0x4F, 0xE5, 0xB7, 0x39, 0x13, 0x0E, 0x3C, 0xB1, 0xE8, 0x2E, + 0x2D, 0xA5, 0x3B, 0x6E, 0xE9, 0x1C, 0xA9, 0x28, 0x15, 0xDA, 0xA7, 0x41, 0x93, 0xB6, 0x5C, 0x8D, + 0x60, 0x5C, 0xB9, 0xDE, 0xE0, 0xBE, 0x96, 0x22, 0x14, 0x9A, 0xC7, 0xCC, 0x8B, 0xCB, 0x85, 0xAE, + 0x71, 0x29, 0xD1, 0x48, 0x7D, 0xC2, 0x7E, 0x06, 0x02, 0x7E, 0x0A, 0x88, 0x56, 0x40, 0x34, 0xEA, + 0x67, 0xDF, 0x0E, 0xCE, 0xCC, 0x49, 0x1C, 0xE2, 0x3E, 0xB6, 0x1D, 0xF2, 0x8F, 0xF9, 0xD4, 0x42, + 0xB7, 0xB4, 0x44, 0x48, 0x2A, 0xD2, 0x8A, 0x16, 0xB4, 0x93, 0x43, 0x71, 0xF5, 0x09, 0x2F, 0x8E, + 0xA3, 0x24, 0x89, 0x1C, 0xE1, 0xD8, 0xF4, 0xBF, 0xB1, 0x12, 0x06, 0x4A, 0x2E, 0xA5, 0xE2, 0xC7, + 0x5A, 0xBF, 0x03, 0xAC, 0x4C, 0xA7, 0xB1, 0x0F, 0xBB, 0x40, 0x01, 0xFB, 0xD0, 0xA0, 0x50, 0xC8, + 0x58, 0x77, 0xD0, 0xBB, 0x77, 0x0C, 0x1B, 0x19, 0x43, 0x32, 0x9C, 0x86, 0x3C, 0x94, 0xD9, 0xD9, + 0x48, 0x52, 0x92, 0x9C, 0x08, 0x8D, 0x85, 0xAE, 0xE5, 0x8E, 0xBC, 0x66, 0x90, 0x32, 0x6D, 0xAE, + 0x61, 0xE6, 0x14, 0x65, 0x20, 0xC2, 0x30, 0x15, 0xC2, 0x09, 0x8D, 0x6F, 0xA3, 0x8F, 0xE0, 0x3D, + 0x5D, 0x0B, 0x0F, 0xEC, 0x09, 0xD9, 0x9A, 0x80, 0x05, 0x44, 0x1D, 0xBA, 0xC8, 0x49, 0x52, 0x4C, + 0x57, 0x65, 0xC3, 0x55, 0xB4, 0xEC, 0x6A, 0xBC, 0x2D, 0x64, 0xA7, 0x8A, 0x7A, 0x89, 0x76, 0xB4, + 0x8E, 0x7F, 0x42, 0x2A, 0x48, 0x0B, 0x07, 0x64, 0xDF, 0x82, 0xAD, 0x63, 0xA2, 0x49, 0x38, 0xA4, + 0x38, 0x09, 0xA6, 0x90, 0x08, 0xEB, 0x21, 0xCC, 0xB6, 0x09, 0x8E, 0xD1, 0x2C, 0x83, 0xAB, 0x6D, + 0x91, 0x23, 0x87, 0x7D, 0xF7, 0x1C, 0xA5, 0x8A, 0x6D, 0x88, 0xE2, 0xD1, 0x8C, 0x05, 0x40, 0x6E, + 0xB7, 0x83, 0x64, 0x2F, 0x6B, 0xBF, 0x7D, 0x70, 0x71, 0x71, 0x79, 0x78, 0x72, 0xBE, 0x77, 0x75, + 0x74, 0x73, 0x72, 0xDE, 0xBB, 0xBE, 0xBA, 0xB9, 0xFA, 0xDC, 0x83, 0x5F, 0x3F, 0xEE, 0x9D, 0x9E, + 0x1C, 0xDE, 0x5C, 0x9F, 0xFF, 0x72, 0x7E, 0xF1, 0xE9, 0x3C, 0x11, 0x62, 0x11, 0x0D, 0x31, 0x10, + 0x1A, 0x83, 0x84, 0xB0, 0x0D, 0xD2, 0x13, 0x34, 0x75, 0xBE, 0x39, 0x90, 0x63, 0x6B, 0xFB, 0x55, + 0x4A, 0x0F, 0x9D, 0x17, 0x44, 0x49, 0x3C, 0x60, 0x8F, 0x30, 0x5F, 0xA0, 0xFE, 0x1D, 0x5A, 0xEE, + 0x6C, 0x1A, 0x6C, 0x56, 0xE8, 0xCA, 0xC9, 0x6E, 0x6A, 0x53, 0x99, 0x14, 0x09, 0x66, 0xC4, 0xEE, + 0xA7, 0x9B, 0xCC, 0x10, 0xB8, 0x69, 0xBC, 0x4E, 0x36, 0x64, 0x4C, 0x21, 0x2E, 0x3D, 0x82, 0x9C, + 0x87, 0xAE, 0xF1, 0xDB, 0x3A, 0x81, 0x64, 0xC9, 0x7F, 0x2B, 0x48, 0x24, 0x6D, 0xF8, 0x53, 0x24, + 0x7F, 0x8A, 0x64, 0x61, 0x91, 0x4C, 0x88, 0xCF, 0x9F, 0x76, 0x24, 0xCD, 0x98, 0xCD, 0x08, 0xA6, + 0x67, 0x7D, 0x16, 0x04, 0x4D, 0x63, 0x3C, 0x5F, 0x11, 0x1F, 0x32, 0x17, 0x05, 0x91, 0x94, 0x89, + 0x67, 0x3B, 0xF4, 0x29, 0xF5, 0x78, 0xA6, 0x55, 0x9B, 0x41, 0x59, 0x03, 0x50, 0x95, 0x12, 0x69, + 0x30, 0xE2, 0x0C, 0x91, 0xB0, 0xFE, 0x59, 0xE0, 0x13, 0x00, 0x37, 0xF2, 0x9A, 0x44, 0xE7, 0xAD, + 0x70, 0x9A, 0x42, 0x39, 0xD9, 0x56, 0xAD, 0x8C, 0x60, 0x70, 0x03, 0x18, 0x37, 0x1E, 0x50, 0x1A, + 0x2D, 0xCC, 0x4A, 0x5A, 0x4D, 0x21, 0x83, 0x8F, 0xBC, 0x26, 0xC7, 0x2B, 0x29, 0x9F, 0x37, 0x14, + 0x59, 0x23, 0xAC, 0xD3, 0xD2, 0x91, 0x21, 0x64, 0xDF, 0x51, 0x14, 0x5F, 0x26, 0x34, 0x52, 0x29, + 0x13, 0x5C, 0x32, 0xE0, 0x82, 0x65, 0x5C, 0xF6, 0x69, 0x77, 0x43, 0x36, 0x73, 0x16, 0x68, 0xF7, + 0x90, 0x89, 0x3C, 0x49, 0xF1, 0x26, 0xB2, 0xF2, 0xE6, 0xB1, 0xE0, 0xF6, 0x90, 0x43, 0x80, 0x0D, + 0xC9, 0x8F, 0xDB, 0x0F, 0xB2, 0x07, 0x2A, 0xE2, 0x9D, 0xD5, 0x4E, 0x6A, 0x36, 0xAA, 0xB9, 0x1D, + 0x3E, 0xBE, 0x97, 0xC7, 0xCE, 0x72, 0x50, 0x65, 0x51, 0x20, 0x06, 0x80, 0x94, 0xA1, 0xA0, 0xB2, + 0xDE, 0x4C, 0x97, 0x25, 0x7E, 0xD3, 0x38, 0x77, 0x61, 0x8A, 0x5F, 0x0C, 0x91, 0x65, 0x2A, 0xF6, + 0x5C, 0x05, 0xD1, 0x9A, 0x9F, 0x24, 0x65, 0x0C, 0x4E, 0x22, 0x9E, 0x62, 0x6E, 0x43, 0x23, 0x65, + 0x66, 0xE0, 0x0E, 0xCD, 0x33, 0xB7, 0x35, 0x4A, 0xCA, 0x44, 0xE2, 0x98, 0xFA, 0x52, 0x8B, 0x71, + 0xBA, 0x50, 0xC5, 0x8E, 0x15, 0x52, 0xB2, 0xCC, 0xB2, 0xD2, 0x04, 0x2B, 0xB7, 0xC5, 0x9E, 0xBF, + 0x61, 0xB2, 0xC3, 0x5F, 0xBD, 0x69, 0xD7, 0x45, 0x5F, 0xC4, 0x86, 0x25, 0x3C, 0x51, 0xF7, 0x27, + 0x78, 0x50, 0x30, 0xA6, 0x99, 0x1E, 0x6C, 0xA1, 0xFC, 0x37, 0xE3, 0x2B, 0x57, 0x5E, 0xF4, 0x9B, + 0xED, 0x9F, 0x9B, 0xE7, 0x0D, 0x76, 0x49, 0x13, 0x96, 0x37, 0x9B, 0xAC, 0x2C, 0xAC, 0xFE, 0x0E, + 0x19, 0xF2, 0x87, 0x5D, 0xC8, 0xC4, 0xD7, 0xD4, 0x42, 0xEF, 0xE4, 0x40, 0xEF, 0xC8, 0xD0, 0x3B, + 0x2A, 0xF4, 0x4E, 0x26, 0xF4, 0x6E, 0x0E, 0xF4, 0xAE, 0x0C, 0xBD, 0xAB, 0x42, 0xEF, 0x66, 0x42, + 0x5F, 0xCD, 0x81, 0xBE, 0x2A, 0x43, 0x5F, 0x55, 0xA1, 0xAF, 0x46, 0xD0, 0x5F, 0xA9, 0x9D, 0xA0, + 0x92, 0x08, 0x0B, 0xD9, 0x75, 0x40, 0x86, 0x6F, 0x4D, 0x0B, 0x7E, 0x87, 0x3C, 0x00, 0x79, 0x02, + 0x1D, 0x7A, 0x53, 0xE8, 0x73, 0xE0, 0x70, 0x09, 0x6F, 0x07, 0xEE, 0xA9, 0xFB, 0x48, 0xE3, 0x1F, + 0xE0, 0x12, 0x1E, 0x06, 0x40, 0x0C, 0xCF, 0xCA, 0x71, 0xFF, 0x04, 0x8A, 0x78, 0x4C, 0x99, 0x9E, + 0x96, 0x59, 0x99, 0x20, 0xBB, 0x64, 0xDA, 0x16, 0x41, 0x66, 0x5B, 0xDD, 0x22, 0x3D, 0x67, 0xC7, + 0xBD, 0x8E, 0xC6, 0x6D, 0x84, 0xDB, 0x11, 0x09, 0x9C, 0x64, 0x61, 0x52, 0x72, 0x3A, 0x33, 0x88, + 0x0E, 0x41, 0xF1, 0xBA, 0x0D, 0x54, 0x9D, 0x94, 0x9B, 0x0F, 0xE0, 0x4D, 0xAA, 0x11, 0x51, 0xF4, + 0x2A, 0x04, 0x01, 0x60, 0x07, 0x6A, 0x25, 0x71, 0xAA, 0xF0, 0x76, 0x4A, 0xA4, 0x46, 0x73, 0x06, + 0x9C, 0xBE, 0x44, 0x72, 0xE5, 0x1E, 0x9B, 0x70, 0x01, 0xFF, 0x7C, 0x88, 0xEF, 0xCC, 0xE9, 0x28, + 0xF0, 0x95, 0x2D, 0xB5, 0x5C, 0x98, 0x7C, 0xB0, 0xA4, 0x16, 0x16, 0xA1, 0xBD, 0x09, 0x51, 0xD2, + 0xD8, 0x92, 0x9C, 0x02, 0x68, 0x1E, 0x0F, 0x8B, 0x06, 0x7E, 0x30, 0x74, 0x70, 0x5F, 0xA3, 0x4F, + 0xDC, 0xAC, 0xA0, 0xBA, 0x84, 0xDA, 0xAD, 0x4E, 0xAB, 0x96, 0x4A, 0xB7, 0xE6, 0xDA, 0x33, 0xD9, + 0x87, 0x42, 0x99, 0xB0, 0x85, 0xC7, 0xC5, 0xD2, 0xF2, 0x8A, 0xE4, 0x64, 0xB1, 0xDE, 0x41, 0x4F, + 0xAA, 0xBB, 0x50, 0x5E, 0x92, 0x7F, 0xB9, 0x4F, 0x7F, 0xC7, 0x9E, 0x1B, 0xA6, 0x29, 0x11, 0x53, + 0x76, 0x96, 0x48, 0xCF, 0x84, 0x1A, 0xE0, 0x00, 0xAD, 0x49, 0x27, 0xD4, 0xFC, 0x67, 0x4E, 0xDC, + 0x34, 0x94, 0x53, 0xB1, 0x44, 0x72, 0x6E, 0xE8, 0x73, 0x36, 0xE9, 0x93, 0x07, 0xF1, 0x11, 0xF9, + 0x67, 0xCD, 0x45, 0x94, 0xCA, 0x83, 0xB6, 0x51, 0x94, 0x0D, 0x71, 0x56, 0xA1, 0xF9, 0xF1, 0xE2, + 0xC7, 0x65, 0x2A, 0x2A, 0xC6, 0x90, 0xE4, 0x0C, 0x83, 0xE9, 0x30, 0xDB, 0x2C, 0xA3, 0x13, 0x4A, + 0x37, 0xD3, 0xE6, 0x3A, 0xCB, 0x7E, 0x48, 0x32, 0xA4, 0x59, 0x67, 0x5A, 0x94, 0xC5, 0xE9, 0x77, + 0x92, 0x1C, 0xAA, 0x8A, 0x90, 0xF1, 0xA5, 0x89, 0x65, 0x7F, 0x22, 0x22, 0x94, 0x5C, 0x90, 0x64, + 0x45, 0xBF, 0x3D, 0x7F, 0x4F, 0x04, 0x7E, 0x9F, 0xAF, 0x7D, 0x1F, 0x9D, 0x65, 0x0D, 0x0C, 0x3B, + 0xD2, 0xD9, 0x2E, 0xD8, 0xAA, 0x5F, 0xAD, 0xD5, 0x55, 0xA5, 0x56, 0x1F, 0x85, 0x56, 0x6B, 0x05, + 0x5B, 0x5D, 0x9E, 0x1D, 0x68, 0x70, 0xA9, 0x06, 0xF6, 0x62, 0x97, 0xF6, 0xD1, 0x8D, 0xB7, 0xE6, + 0xF1, 0x66, 0x99, 0x7F, 0x46, 0x7B, 0x7D, 0xBB, 0x60, 0xBB, 0x7E, 0xD5, 0x76, 0x57, 0x15, 0xDB, + 0x89, 0x5C, 0xEC, 0xB4, 0x8D, 0x82, 0xED, 0x64, 0x3E, 0xC6, 0xF8, 0xBE, 0xCB, 0x49, 0xFC, 0xB9, + 0x94, 0xF3, 0xE8, 0x96, 0x9F, 0x32, 0xFE, 0x83, 0x64, 0x3C, 0xB7, 0xDD, 0xE5, 0xAF, 0x67, 0x37, + 0x97, 0x7B, 0x9F, 0x7E, 0x2D, 0x47, 0x23, 0xB4, 0xEA, 0x1F, 0x5F, 0xEE, 0xFF, 0xFA, 0x73, 0x4A, + 0x2D, 0x68, 0x4A, 0xE5, 0xB4, 0x54, 0x5F, 0x7F, 0xEF, 0x6C, 0x95, 0xC3, 0xAC, 0xB6, 0xEF, 0x1A, + 0xB3, 0xB5, 0x5F, 0xEB, 0xCE, 0xD8, 0x7E, 0x43, 0xDB, 0x3E, 0x6D, 0xF1, 0x84, 0x46, 0x7A, 0x9D, + 0x22, 0x6F, 0xDF, 0x5E, 0x44, 0xAF, 0xD0, 0x9D, 0x07, 0x9D, 0x15, 0x84, 0xAA, 0x9B, 0x8E, 0x61, + 0xAC, 0x17, 0x9E, 0x4C, 0x6A, 0xD3, 0x37, 0x6B, 0xD5, 0x9B, 0xBE, 0xA9, 0x25, 0xF7, 0x63, 0xC5, + 0x9A, 0x6E, 0x56, 0xC7, 0xBA, 0xA9, 0x62, 0x2D, 0xD3, 0x78, 0xAB, 0x3A, 0xDE, 0xAD, 0xCA, 0xBD, + 0xED, 0x74, 0x2B, 0x63, 0xED, 0x74, 0x2B, 0x63, 0xED, 0xAE, 0x4A, 0x13, 0xAC, 0x1C, 0xA7, 0xD6, + 0x8C, 0x37, 0xDD, 0x1B, 0xA3, 0x22, 0x6A, 0xDA, 0xB8, 0x53, 0x4B, 0xDD, 0xAB, 0xCF, 0x43, 0x4F, + 0x47, 0xFB, 0x6F, 0x36, 0x99, 0xE5, 0x09, 0x50, 0x4C, 0x19, 0x08, 0xCD, 0x57, 0x57, 0x25, 0x56, + 0x95, 0x6E, 0x2F, 0x4F, 0xA2, 0xD2, 0xCD, 0x37, 0x67, 0x6B, 0xBE, 0x35, 0x53, 0x73, 0x45, 0x3A, + 0x0B, 0x29, 0xC2, 0x53, 0xF7, 0x71, 0xDF, 0x74, 0xAC, 0x47, 0xDB, 0x0A, 0xEE, 0x5F, 0xB9, 0x32, + 0x34, 0xAA, 0x6B, 0xC3, 0xEE, 0x0F, 0xD1, 0x86, 0xDD, 0x1F, 0xA4, 0x0D, 0xBB, 0x3F, 0x44, 0x1B, + 0x76, 0x7F, 0x6A, 0xC3, 0x05, 0x6B, 0xC3, 0xEE, 0x8F, 0xD5, 0x86, 0xDD, 0xD9, 0xB4, 0x61, 0x77, + 0x36, 0x6D, 0xD8, 0x9D, 0x4D, 0x1B, 0x76, 0xD3, 0xB5, 0xE1, 0xD4, 0xA7, 0xC9, 0x80, 0x63, 0x1F, + 0x27, 0x5F, 0xE3, 0xF5, 0xC3, 0xD2, 0xAC, 0xC6, 0xF0, 0x30, 0xFC, 0xBD, 0xAD, 0xA9, 0xF4, 0x59, + 0xA9, 0xF4, 0x59, 0x57, 0xE9, 0x8B, 0x52, 0xE9, 0x8B, 0xF2, 0x8A, 0x1D, 0x21, 0x29, 0x7C, 0x83, + 0x33, 0x9B, 0xAC, 0xA4, 0x33, 0xD2, 0x30, 0x7C, 0x92, 0xD8, 0x0C, 0x0A, 0x38, 0x1B, 0x45, 0xB5, + 0x5D, 0x47, 0xAD, 0xFD, 0x61, 0xEF, 0x68, 0xAF, 0x77, 0xA0, 0xA9, 0xBB, 0x37, 0x0A, 0xA2, 0x39, + 0x27, 0x47, 0x91, 0x8E, 0x4D, 0xEF, 0x9B, 0x14, 0x42, 0xDA, 0xC9, 0x8B, 0x13, 0xCD, 0x69, 0xDF, + 0xD5, 0xB5, 0x67, 0x51, 0x00, 0x11, 0x09, 0xA6, 0xF5, 0xEF, 0x53, 0x3F, 0x20, 0xD4, 0x6A, 0x6E, + 0x3D, 0xA8, 0xA5, 0xF5, 0x1C, 0x3F, 0x9E, 0xBA, 0x82, 0x27, 0x57, 0x22, 0xDC, 0x32, 0xAE, 0xA4, + 0xBF, 0x0F, 0xC2, 0x4F, 0x76, 0xA0, 0x86, 0x6C, 0xD1, 0x87, 0x90, 0x6B, 0x63, 0xD3, 0x76, 0x7A, + 0x34, 0x7E, 0x75, 0x3B, 0x7E, 0xAF, 0xB0, 0x51, 0xA3, 0xEB, 0xEB, 0x89, 0xD3, 0xF3, 0x5C, 0x88, + 0x2A, 0x12, 0xC2, 0x34, 0x55, 0xD4, 0x00, 0x79, 0xCF, 0xB1, 0xA4, 0xBB, 0x28, 0xA8, 0xC7, 0x16, + 0x68, 0xDD, 0x6B, 0xA2, 0x31, 0x2D, 0x69, 0xEF, 0x89, 0xD2, 0xB6, 0xF0, 0xAA, 0xF3, 0x08, 0x07, + 0x42, 0x18, 0x36, 0xBD, 0xAB, 0x0B, 0xA1, 0x88, 0xF0, 0x43, 0x9C, 0x29, 0x3D, 0x62, 0x9F, 0x35, + 0x3D, 0x52, 0xBA, 0x1B, 0x62, 0xAC, 0x09, 0x5E, 0x79, 0x07, 0xE6, 0x08, 0x12, 0xE5, 0x3C, 0xDE, + 0x63, 0xE6, 0x98, 0x77, 0xD4, 0xEF, 0xAD, 0x76, 0xD1, 0xBD, 0xE9, 0x83, 0x93, 0xDB, 0x9D, 0xED, + 0x8D, 0x49, 0xA1, 0x47, 0xE4, 0xDF, 0x9E, 0x04, 0xF0, 0xB0, 0x33, 0xF5, 0xC8, 0x80, 0x73, 0x5D, + 0xCC, 0x27, 0x74, 0xE7, 0xB9, 0x63, 0xB4, 0xD7, 0x63, 0x0D, 0x86, 0x68, 0x42, 0x48, 0x93, 0x5E, + 0xDF, 0xA3, 0x60, 0x20, 0xE6, 0xEB, 0x92, 0xC1, 0x11, 0xAD, 0xEE, 0x87, 0x84, 0x1C, 0x6F, 0x6C, + 0x3B, 0x98, 0x50, 0x60, 0x0F, 0xEE, 0x91, 0xF8, 0x4C, 0x34, 0xF3, 0x04, 0x74, 0x3D, 0x7B, 0x48, + 0xE6, 0xD6, 0x88, 0xBF, 0x23, 0x1D, 0xEE, 0x70, 0xD4, 0xF7, 0x5C, 0xFF, 0xB4, 0x83, 0x9C, 0xE9, + 0x68, 0xD4, 0x4C, 0x5C, 0xBB, 0xAA, 0x6F, 0xBC, 0x2A, 0x2C, 0xCD, 0x0C, 0x2F, 0x63, 0xDF, 0xDE, + 0xA2, 0xBD, 0xD1, 0x08, 0xF5, 0xC9, 0x77, 0x2B, 0x37, 0xFB, 0x8B, 0xF8, 0x68, 0xED, 0x35, 0x73, + 0x37, 0x46, 0xE4, 0xFF, 0x84, 0x5F, 0x84, 0x79, 0x49, 0x56, 0xA4, 0x87, 0x8D, 0x40, 0xC5, 0x47, + 0xD3, 0xC3, 0xD7, 0x93, 0x91, 0x6B, 0x5A, 0x9F, 0x4C, 0x3B, 0x90, 0x23, 0x10, 0xE8, 0x5B, 0x5F, + 0x2C, 0x93, 0xA0, 0x3F, 0xBD, 0x1D, 0xDB, 0xC1, 0x31, 0x6F, 0x00, 0x51, 0x8F, 0x64, 0x46, 0xD2, + 0x07, 0xA1, 0x7F, 0x33, 0xBE, 0x0A, 0xDE, 0x34, 0xB0, 0xDC, 0x71, 0x8F, 0x1A, 0x78, 0x5C, 0x1D, + 0x5C, 0x3A, 0xA5, 0x48, 0xBC, 0xB0, 0xBC, 0x6D, 0x4E, 0x26, 0x6C, 0xD6, 0x25, 0x01, 0xB7, 0x28, + 0xE2, 0xA6, 0x00, 0xD5, 0xFC, 0x77, 0xF3, 0x89, 0x43, 0xFC, 0xF5, 0xEC, 0xF4, 0x43, 0x00, 0x49, + 0x2B, 0xFE, 0x63, 0x8A, 0x85, 0xC7, 0xD6, 0xA1, 0x46, 0xDB, 0x25, 0x20, 0x1B, 0xB5, 0xDE, 0x45, + 0xFF, 0x0A, 0x62, 0x31, 0x57, 0xA6, 0xB4, 0x5B, 0x35, 0xA9, 0x0A, 0x9D, 0x6F, 0x21, 0x11, 0xF1, + 0x84, 0x64, 0xDA, 0x4E, 0xE4, 0x86, 0xE6, 0x06, 0x1A, 0xDE, 0x2E, 0x65, 0x85, 0x36, 0x38, 0x62, + 0x4E, 0xA4, 0x98, 0xF4, 0xE4, 0x2B, 0xE7, 0x32, 0xBC, 0x7E, 0x60, 0x06, 0x53, 0x1F, 0x5C, 0xD4, + 0x14, 0xED, 0x9D, 0x8D, 0x94, 0xD4, 0xCF, 0x01, 0x9C, 0x9C, 0xE2, 0x6C, 0x36, 0xEA, 0x6B, 0xD5, + 0x32, 0xA6, 0xB9, 0x82, 0xC5, 0xF5, 0x86, 0x38, 0xE8, 0x99, 0xB6, 0x87, 0x2D, 0xAA, 0x8C, 0x95, + 0x75, 0xE7, 0x36, 0x70, 0x8E, 0x69, 0x15, 0x56, 0xA8, 0xE1, 0x17, 0x48, 0x34, 0x7D, 0xA4, 0xCF, + 0xA7, 0xC0, 0xDC, 0x20, 0xC0, 0x4E, 0x5B, 0x8C, 0x4B, 0x99, 0x60, 0xEC, 0x9D, 0xED, 0x1D, 0xF8, + 0x6A, 0xC3, 0x73, 0xFE, 0x6A, 0xBC, 0xF6, 0xF6, 0x9E, 0xE2, 0x3C, 0xF2, 0x27, 0xE7, 0xEE, 0x63, + 0x8F, 0xB4, 0xF7, 0xF5, 0xBA, 0x9A, 0x50, 0x47, 0xB5, 0x69, 0x22, 0x0D, 0xC5, 0x30, 0xD4, 0x62, + 0xBC, 0x44, 0x43, 0x37, 0x6D, 0x48, 0x2F, 0xE6, 0x78, 0x82, 0x80, 0x54, 0x57, 0x02, 0x11, 0x90, + 0x44, 0x47, 0x74, 0x05, 0x65, 0x5A, 0xD6, 0xD1, 0x03, 0xF9, 0x05, 0x5C, 0x3C, 0xB0, 0x03, 0x2F, + 0x69, 0x1D, 0x5E, 0x9C, 0x11, 0xC5, 0x1D, 0xC0, 0x37, 0x32, 0x2E, 0x18, 0x72, 0xAE, 0x34, 0x30, + 0x54, 0x69, 0xA2, 0x9D, 0x5D, 0xA0, 0x32, 0x16, 0x7B, 0xCE, 0xBC, 0x02, 0x37, 0x5A, 0xC9, 0x74, + 0x06, 0xF2, 0x25, 0x16, 0x0D, 0xA4, 0x80, 0x9D, 0x2A, 0xF5, 0xBF, 0x24, 0xBF, 0x30, 0xD0, 0xD1, + 0x0D, 0x96, 0x0D, 0x6E, 0x94, 0xE6, 0x13, 0xF9, 0x45, 0xB9, 0xCA, 0x62, 0xF5, 0x7E, 0xB3, 0xBF, + 0xB6, 0x5D, 0x67, 0x30, 0xB2, 0x07, 0x10, 0x06, 0x16, 0x31, 0xB9, 0x91, 0x7C, 0x26, 0x41, 0xCE, + 0xFD, 0x91, 0x91, 0x7B, 0x7C, 0xA8, 0x7D, 0xAC, 0xAF, 0xA9, 0x61, 0x18, 0x83, 0x09, 0x5A, 0x41, + 0x8F, 0x57, 0x03, 0xA9, 0x8F, 0x07, 0xF2, 0x09, 0x18, 0xAD, 0xA4, 0x22, 0x14, 0x1D, 0x59, 0xBE, + 0xCB, 0x1A, 0x41, 0x0B, 0x75, 0x2E, 0x04, 0xC6, 0x98, 0xB3, 0xE8, 0x13, 0xBA, 0xA1, 0x27, 0x50, + 0xF3, 0x0A, 0x4C, 0x79, 0xF2, 0x2A, 0x3E, 0x29, 0x13, 0x6B, 0x1A, 0x9F, 0x37, 0x48, 0x49, 0x75, + 0xCF, 0x34, 0x0D, 0xDD, 0x4B, 0x66, 0xE4, 0xA4, 0xD7, 0x77, 0xEC, 0x18, 0x5A, 0xCD, 0xA5, 0x57, + 0x21, 0xA4, 0x62, 0x5D, 0x4A, 0xA3, 0x36, 0xEE, 0x4F, 0x46, 0xA7, 0xF5, 0x5D, 0xCA, 0x7E, 0x7F, + 0xA4, 0x7A, 0x07, 0x67, 0x7B, 0xD7, 0x84, 0x75, 0x17, 0xCE, 0x1E, 0x99, 0xBD, 0x1D, 0x46, 0xA7, + 0x90, 0xD9, 0x7A, 0xFB, 0x9E, 0xC6, 0x12, 0xCF, 0xBD, 0xB3, 0xEF, 0xD5, 0x10, 0x65, 0x6D, 0x5F, + 0x59, 0x57, 0x32, 0xFA, 0xCA, 0x98, 0xA1, 0xE9, 0xAB, 0x5C, 0x2D, 0xCD, 0xF8, 0xC5, 0xEC, 0x5B, + 0x63, 0xD7, 0x37, 0xED, 0x41, 0x69, 0x2B, 0x98, 0x94, 0x9A, 0x58, 0xFB, 0x12, 0x44, 0xAC, 0x30, + 0x36, 0x3A, 0xED, 0x35, 0x85, 0xF4, 0xEF, 0x4A, 0xF0, 0x71, 0x39, 0x13, 0x44, 0x19, 0xE4, 0x1D, + 0x43, 0x3E, 0x82, 0xA7, 0x61, 0xAF, 0x08, 0xDE, 0xC8, 0x02, 0xAE, 0x97, 0x35, 0xDD, 0xF3, 0x15, + 0xD5, 0x45, 0xAC, 0xEC, 0x63, 0x18, 0xB1, 0xE0, 0x68, 0x9C, 0xF4, 0x8B, 0x3F, 0xE9, 0xC2, 0x84, + 0xB3, 0x10, 0x88, 0xF4, 0xEE, 0x47, 0x89, 0x72, 0xE7, 0xD2, 0xFD, 0x42, 0x0F, 0xC0, 0x2A, 0xDD, + 0xE7, 0xEE, 0xC8, 0xB3, 0x74, 0x3F, 0x0F, 0x84, 0xB6, 0xFB, 0x8A, 0x73, 0xE9, 0x1C, 0x58, 0x90, + 0x84, 0x98, 0xC7, 0x06, 0x8D, 0x1F, 0x2B, 0x69, 0x65, 0xD9, 0x3E, 0xCB, 0x13, 0xCB, 0xF3, 0x16, + 0x14, 0xE7, 0x49, 0x2E, 0x3C, 0x21, 0x4F, 0x79, 0x3A, 0x7F, 0xE0, 0xA0, 0x03, 0x69, 0x87, 0x20, + 0xD1, 0x96, 0x83, 0x47, 0x33, 0x71, 0x26, 0x09, 0x2B, 0x8A, 0xDA, 0x32, 0x52, 0xA4, 0x22, 0x6C, + 0xB2, 0x6F, 0x4E, 0xAD, 0x43, 0xCF, 0x9D, 0xC0, 0x63, 0xF2, 0x29, 0x8B, 0x8C, 0x94, 0x5C, 0xAF, + 0x80, 0x08, 0x15, 0xA0, 0xAA, 0x93, 0xB2, 0x08, 0x14, 0xA2, 0x8A, 0xAF, 0x8D, 0x25, 0xA9, 0xAA, + 0x8E, 0xAF, 0x14, 0x17, 0xB4, 0xB3, 0x20, 0xFD, 0xC5, 0x80, 0x59, 0x67, 0x43, 0xEE, 0x5B, 0x04, + 0x29, 0xC3, 0x3F, 0x21, 0xDA, 0x8C, 0x9E, 0xA5, 0xFC, 0xAA, 0xAC, 0x2B, 0x02, 0x41, 0xCB, 0x0C, + 0x35, 0xCD, 0xE4, 0xAC, 0x2C, 0x28, 0x93, 0xB6, 0x32, 0x53, 0x7C, 0x0E, 0x71, 0x60, 0xDA, 0x23, + 0xBF, 0x3C, 0x2B, 0xCA, 0xC1, 0xD2, 0x33, 0x85, 0x1E, 0x9C, 0xE7, 0xC1, 0x8D, 0x10, 0x50, 0x31, + 0x36, 0xD0, 0x73, 0x64, 0xE5, 0x8E, 0xE7, 0xB5, 0xD6, 0x2F, 0x09, 0x82, 0x75, 0x62, 0x1E, 0xEB, + 0x81, 0x0C, 0x2E, 0x4D, 0xEC, 0x35, 0xA6, 0x91, 0x99, 0x17, 0x81, 0x4C, 0x78, 0x85, 0x16, 0x01, + 0x35, 0xAB, 0xF8, 0xAC, 0xCC, 0x48, 0x24, 0xC8, 0x4E, 0x93, 0x7E, 0xB1, 0x76, 0x75, 0xB9, 0x2F, + 0x08, 0x45, 0xDB, 0x69, 0x29, 0x9D, 0xF7, 0xAC, 0xFD, 0x2E, 0x9C, 0x1B, 0x5C, 0x65, 0x41, 0xDC, + 0x70, 0x46, 0x2E, 0x14, 0x02, 0xA4, 0x3B, 0x8C, 0x45, 0x6F, 0xE7, 0x55, 0xE1, 0x82, 0x7C, 0xB9, + 0xA2, 0x41, 0x21, 0xBF, 0x96, 0xB7, 0x48, 0x14, 0x89, 0x93, 0xC3, 0x02, 0x50, 0xC9, 0x17, 0x5F, + 0x73, 0x46, 0x10, 0x79, 0x95, 0x3F, 0x33, 0xAF, 0xF2, 0x67, 0xF4, 0x0E, 0x39, 0xD3, 0xF1, 0x41, + 0x22, 0x8B, 0x2F, 0x29, 0xD2, 0x38, 0x96, 0xDF, 0x4E, 0x83, 0xC0, 0x75, 0xB8, 0x5F, 0x39, 0x4D, + 0xBB, 0x08, 0x01, 0x3F, 0xFB, 0xF4, 0x2B, 0xE4, 0xD4, 0x7B, 0x96, 0xAF, 0x47, 0xE3, 0xEA, 0xDA, + 0x8E, 0x80, 0x49, 0x2F, 0xBD, 0x1F, 0x61, 0x44, 0x52, 0x8C, 0xE1, 0x00, 0x1A, 0x34, 0x9E, 0x25, + 0x99, 0x93, 0xF3, 0xE2, 0x35, 0xE5, 0x4B, 0xD5, 0xAC, 0xE8, 0xA4, 0xAC, 0xE0, 0xA9, 0x14, 0x8E, + 0xA8, 0xAE, 0xF6, 0x33, 0x30, 0x33, 0x0E, 0xEA, 0x4E, 0x0F, 0xB9, 0x7A, 0xA6, 0xA1, 0xAB, 0x4F, + 0xDA, 0xC3, 0x72, 0x91, 0xC1, 0x78, 0xDA, 0xD6, 0x9E, 0x82, 0xC5, 0x41, 0x81, 0xE4, 0x13, 0xDC, + 0x20, 0x4C, 0xB3, 0x3E, 0x28, 0xC4, 0x40, 0x25, 0xA0, 0x23, 0xFF, 0x50, 0x9C, 0x88, 0xE7, 0xD3, + 0x0C, 0x1C, 0x7C, 0x63, 0x7F, 0x0B, 0xF7, 0x63, 0xE8, 0xC4, 0x19, 0x78, 0xF4, 0x2E, 0x63, 0xC2, + 0xE3, 0xDB, 0xD0, 0x32, 0xF2, 0x1F, 0xCD, 0x09, 0x7B, 0xD7, 0x82, 0x5A, 0x9B, 0x89, 0x9A, 0x8B, + 0x49, 0x43, 0x3E, 0x25, 0x8D, 0xC5, 0xAD, 0x40, 0x1D, 0x07, 0x12, 0x68, 0xDC, 0x93, 0xA9, 0x8F, + 0x7D, 0xE1, 0x71, 0x81, 0x18, 0x19, 0x7D, 0x46, 0x2A, 0x11, 0x21, 0x61, 0x7E, 0xC3, 0x67, 0xF8, + 0x03, 0xB4, 0xF2, 0xB6, 0x75, 0x45, 0x34, 0x7E, 0x75, 0x5B, 0x33, 0xD6, 0xE5, 0xC5, 0xA4, 0xC8, + 0x58, 0x3F, 0xD1, 0xB1, 0xD6, 0x70, 0x48, 0xFC, 0x11, 0x89, 0x16, 0xA2, 0xF1, 0x52, 0x0C, 0x21, + 0xC5, 0x50, 0x8A, 0x8C, 0x5A, 0x26, 0x47, 0x96, 0x0C, 0xC4, 0x94, 0x25, 0xD9, 0x78, 0xBF, 0xCF, + 0x95, 0x61, 0xD4, 0x64, 0x24, 0x76, 0x5A, 0x4B, 0x5C, 0x4E, 0x1F, 0x97, 0xC1, 0x47, 0x52, 0x14, + 0xB4, 0x5C, 0xA6, 0x09, 0x68, 0x69, 0x97, 0xB5, 0x58, 0x09, 0xC0, 0x73, 0x37, 0xC0, 0x6F, 0x51, + 0x2D, 0x07, 0xFF, 0x12, 0xC1, 0x5F, 0x43, 0xAE, 0x33, 0x7A, 0x46, 0xF0, 0x5A, 0x91, 0x1F, 0xD2, + 0x4B, 0xFE, 0xB6, 0xEF, 0xB4, 0x70, 0x33, 0x00, 0xD2, 0x64, 0x6E, 0x64, 0xE5, 0x69, 0xD1, 0x77, + 0x60, 0x7C, 0x1A, 0x2F, 0xDD, 0x46, 0xD7, 0x30, 0x7B, 0x4C, 0xCF, 0xC7, 0x27, 0x64, 0x1A, 0x93, + 0xD9, 0x83, 0x31, 0x32, 0x6F, 0xDD, 0x07, 0x5C, 0x9A, 0x57, 0x4B, 0x21, 0xAF, 0x0E, 0x71, 0x0E, + 0xAF, 0xBE, 0x2B, 0xE1, 0x52, 0xE8, 0xE4, 0x0E, 0x99, 0x23, 0xD2, 0xC6, 0x7A, 0xA6, 0x93, 0x92, + 0xCF, 0xC7, 0x68, 0x52, 0xB7, 0x28, 0x43, 0x91, 0x1D, 0xA0, 0x11, 0x61, 0x69, 0x38, 0x51, 0xD5, + 0xFD, 0x06, 0xBD, 0x29, 0xDA, 0x1B, 0x7F, 0x60, 0x8D, 0x5F, 0x7A, 0xF6, 0x81, 0x96, 0x80, 0xAE, + 0x18, 0xC8, 0xF6, 0xD1, 0x07, 0x51, 0xA1, 0x48, 0xB0, 0x22, 0xFA, 0x34, 0x53, 0x01, 0x7E, 0x6E, + 0x09, 0x17, 0xBE, 0xBD, 0xDC, 0x14, 0x81, 0xE4, 0x50, 0x11, 0x49, 0x8B, 0x9F, 0x20, 0x69, 0xE6, + 0xD5, 0xDC, 0xD8, 0x61, 0x6D, 0xC7, 0x40, 0xE5, 0x50, 0xDC, 0xA7, 0x82, 0x54, 0x64, 0x8A, 0x5B, + 0x95, 0xB8, 0x63, 0xD8, 0x7A, 0x1C, 0x1C, 0x1D, 0xC7, 0x6B, 0xBE, 0x98, 0xCE, 0x58, 0x70, 0x73, + 0x74, 0xC8, 0x2A, 0x05, 0x97, 0x99, 0x50, 0x39, 0xB2, 0x09, 0x7B, 0x78, 0x4C, 0xA6, 0xD2, 0xBE, + 0x69, 0x1D, 0xC0, 0x33, 0x14, 0x8D, 0x64, 0x9D, 0x78, 0x73, 0xA5, 0x7D, 0xE3, 0x42, 0xA8, 0x3F, + 0xC3, 0x5B, 0xB9, 0xDA, 0xC7, 0xD0, 0x16, 0xFF, 0xF4, 0xF9, 0xCB, 0x3E, 0x79, 0xFE, 0x72, 0x4F, + 0x9D, 0xA7, 0x65, 0xB6, 0x96, 0x37, 0x0A, 0x61, 0x66, 0x4D, 0x18, 0x3F, 0x64, 0x0E, 0x4D, 0xDB, + 0xF1, 0x79, 0xF2, 0x2E, 0x5B, 0x94, 0x55, 0x96, 0x28, 0xD0, 0xC2, 0x4F, 0x8A, 0x2B, 0x27, 0x9D, + 0xDE, 0xDB, 0xBC, 0xE8, 0x1D, 0x38, 0x19, 0xB9, 0x9E, 0xE5, 0x53, 0xC1, 0x09, 0xAF, 0xBE, 0x97, + 0x96, 0x68, 0x69, 0x62, 0xDA, 0x02, 0x48, 0xA2, 0xD1, 0x03, 0x9F, 0x0A, 0x60, 0xD4, 0xEE, 0x37, + 0x5A, 0xFB, 0x6B, 0x98, 0x29, 0x06, 0x25, 0x52, 0xEE, 0x44, 0xD9, 0x39, 0x44, 0xA9, 0x13, 0x4C, + 0x92, 0x14, 0x26, 0x64, 0x83, 0xD1, 0x4D, 0xE1, 0x24, 0x22, 0x98, 0xB6, 0xC9, 0x39, 0xB1, 0x84, + 0xEA, 0x34, 0xC3, 0x44, 0x2C, 0x77, 0x69, 0x05, 0x9F, 0xD3, 0x0A, 0xBE, 0x24, 0x1E, 0xFF, 0x2C, + 0xAF, 0x3D, 0x59, 0x9E, 0x3C, 0xCA, 0xF6, 0x1D, 0x0D, 0x73, 0x95, 0x97, 0x43, 0xC5, 0x0A, 0x93, + 0xA9, 0x7F, 0xDF, 0x58, 0x68, 0xC7, 0x9A, 0xFA, 0x44, 0x09, 0x80, 0x0B, 0xCE, 0x3F, 0x1A, 0x1D, + 0x65, 0x61, 0xF0, 0x90, 0x89, 0xD5, 0x54, 0xEC, 0x88, 0x41, 0x00, 0x72, 0x3F, 0x28, 0x70, 0xE3, + 0x21, 0x75, 0x05, 0x6F, 0x4C, 0x71, 0x7C, 0x05, 0xEF, 0x78, 0x68, 0xB2, 0x4B, 0x93, 0xDE, 0x28, + 0x8B, 0xAB, 0x4E, 0xA6, 0x48, 0xE5, 0x14, 0x89, 0x82, 0x16, 0xC0, 0x26, 0x7E, 0xC4, 0x08, 0x85, + 0x47, 0xBA, 0x93, 0x64, 0x4B, 0x2B, 0x75, 0xFB, 0x6A, 0xD4, 0x0E, 0x69, 0x27, 0xC8, 0x12, 0x3F, + 0xA0, 0x84, 0xD2, 0x34, 0xEB, 0x11, 0x80, 0x25, 0x54, 0xFB, 0x97, 0x5A, 0x33, 0xD5, 0x60, 0x21, + 0x0E, 0x10, 0x50, 0x33, 0xC0, 0xD0, 0x0D, 0xA2, 0x31, 0xF5, 0x8E, 0x1C, 0x85, 0x98, 0x0A, 0xCE, + 0x47, 0xB2, 0xE6, 0xFF, 0xB1, 0x0C, 0x4D, 0xF5, 0xE4, 0x65, 0xAC, 0xED, 0x7C, 0x4D, 0xAB, 0xFB, + 0x39, 0x51, 0xB7, 0x9B, 0x5A, 0xF7, 0x4B, 0xA2, 0xEE, 0xAA, 0x5A, 0x57, 0xAF, 0x1E, 0xC4, 0x01, + 0xD6, 0x25, 0x85, 0x16, 0x29, 0xCF, 0xAB, 0xF2, 0x39, 0xBF, 0xCA, 0x97, 0xD4, 0x2A, 0x32, 0x79, + 0x89, 0x74, 0xC7, 0x51, 0x9E, 0x45, 0x81, 0xE9, 0x64, 0x63, 0xEC, 0x99, 0x64, 0x97, 0xC9, 0x44, + 0x82, 0x3E, 0x9A, 0x38, 0x76, 0x1D, 0xD7, 0x9F, 0x98, 0xE4, 0xA8, 0x48, 0x7D, 0xAB, 0x98, 0xCE, + 0x56, 0x6C, 0x03, 0xB1, 0xEC, 0x88, 0x2E, 0x5A, 0xA9, 0x62, 0xC1, 0xD3, 0x70, 0x89, 0x7B, 0x06, + 0x90, 0x8E, 0xA4, 0xF2, 0x49, 0xAE, 0x25, 0xCC, 0x8C, 0x96, 0x06, 0x59, 0x60, 0x84, 0xD8, 0x79, + 0x70, 0x94, 0x56, 0xBD, 0xD3, 0x84, 0x1C, 0x8C, 0x90, 0xC5, 0xC1, 0xF5, 0xB0, 0x55, 0xCB, 0x79, + 0x91, 0x80, 0x9A, 0x02, 0x67, 0x47, 0xCD, 0x4B, 0xDF, 0xA2, 0x5F, 0x57, 0x3E, 0xAF, 0x7C, 0xA9, + 0x29, 0xE9, 0xE9, 0x34, 0x4C, 0x78, 0x87, 0xD6, 0x9B, 0x49, 0x83, 0x72, 0x2A, 0x77, 0x7D, 0xFB, + 0xEF, 0x18, 0xE9, 0x54, 0xB9, 0xAA, 0x4C, 0xA3, 0x7D, 0x73, 0xBC, 0xEA, 0x96, 0x5E, 0x65, 0x61, + 0xF2, 0xBA, 0x13, 0x2A, 0x0A, 0x82, 0x8B, 0x1B, 0x6C, 0x80, 0x89, 0x54, 0xF0, 0x3C, 0x44, 0x75, + 0x56, 0x41, 0x9A, 0xC2, 0xEC, 0x13, 0x35, 0x9C, 0x68, 0xD7, 0xE6, 0x64, 0xD5, 0x70, 0x76, 0xD1, + 0x72, 0x65, 0x22, 0xA6, 0xF2, 0x02, 0x12, 0x32, 0xB1, 0xF6, 0x89, 0xA5, 0xE4, 0xCF, 0x8D, 0xDA, + 0xFF, 0xD2, 0xB7, 0xE3, 0x18, 0x49, 0x73, 0x6C, 0x0E, 0xEE, 0x1B, 0x29, 0x76, 0x35, 0x51, 0x6D, + 0xFD, 0xB9, 0x11, 0xDC, 0xDB, 0x3E, 0xB3, 0x03, 0x35, 0x9A, 0xD9, 0xAB, 0x80, 0x23, 0xAF, 0x02, + 0x6D, 0x7F, 0x7A, 0xCB, 0x0E, 0xA0, 0x0D, 0x78, 0x22, 0x6E, 0x5D, 0x7E, 0xD7, 0x49, 0x00, 0x1B, + 0xB5, 0x25, 0x8B, 0x25, 0x4B, 0x4D, 0x15, 0x6A, 0xBB, 0x68, 0xF9, 0x0C, 0x55, 0x9A, 0xF2, 0x61, + 0xF5, 0x2B, 0x03, 0x21, 0x9A, 0x31, 0x13, 0x3B, 0xFB, 0x30, 0x46, 0xA1, 0xF0, 0xEE, 0x3E, 0x6C, + 0x90, 0xB7, 0xC3, 0x97, 0xEB, 0x15, 0xDB, 0xE5, 0x87, 0x6D, 0xE6, 0xB6, 0xD3, 0x8F, 0x13, 0xAA, + 0x66, 0x6F, 0x91, 0x23, 0x03, 0x3B, 0xD9, 0x25, 0x77, 0x3A, 0xC6, 0xEA, 0x5A, 0x0B, 0x6D, 0x6E, + 0x4A, 0xF8, 0xD9, 0x67, 0x20, 0x02, 0x0A, 0xCA, 0xEF, 0xC4, 0x65, 0x23, 0x3B, 0xA0, 0x59, 0xA7, + 0x3B, 0x70, 0xFE, 0x1F, 0x01, 0xCF, 0x3A, 0xDF, 0x86, 0xD3, 0x5F, 0x2A, 0x23, 0x52, 0x4C, 0xED, + 0x04, 0x61, 0xD7, 0x30, 0xDA, 0x06, 0x8D, 0x38, 0x68, 0x4B, 0x08, 0xE9, 0x07, 0x40, 0x48, 0x7F, + 0x79, 0x9D, 0xBB, 0xFE, 0x48, 0x98, 0x2A, 0xEC, 0xFC, 0xC3, 0xB6, 0xA5, 0x77, 0xFF, 0x91, 0x34, + 0x96, 0x3C, 0x01, 0x28, 0x08, 0x85, 0x53, 0x80, 0x32, 0x77, 0xA4, 0xED, 0x2F, 0x0F, 0x03, 0xD2, + 0x16, 0xF1, 0xA0, 0x1F, 0x5D, 0x59, 0x28, 0xB9, 0x4A, 0x99, 0x24, 0x6E, 0xFA, 0x32, 0x59, 0x42, + 0x16, 0x74, 0xA2, 0x50, 0x06, 0x4E, 0x7F, 0xAA, 0x88, 0x2A, 0x49, 0x27, 0x8B, 0x57, 0xCF, 0xAC, + 0x94, 0x53, 0x4A, 0x48, 0x77, 0xE6, 0x49, 0x25, 0xA9, 0x76, 0xF3, 0xB6, 0xD6, 0xAA, 0x34, 0x56, + 0xD8, 0x5E, 0x47, 0x82, 0xF9, 0xBA, 0xCE, 0x2C, 0xD1, 0x40, 0x97, 0x3A, 0xB7, 0xE4, 0xB0, 0x59, + 0xB8, 0xC6, 0x93, 0xCF, 0x83, 0xF7, 0x26, 0x3E, 0xC3, 0xC1, 0xBD, 0x6B, 0x15, 0x7B, 0x67, 0x30, + 0x8E, 0x67, 0xD3, 0x3C, 0x32, 0x28, 0xC0, 0x14, 0x86, 0x43, 0xC0, 0xA0, 0x7A, 0x31, 0x25, 0x2F, + 0x28, 0x33, 0xBC, 0x0B, 0x74, 0xD7, 0xBF, 0xE9, 0xCE, 0x03, 0x04, 0x2B, 0xF9, 0xC8, 0x73, 0xB3, + 0xA6, 0x44, 0x00, 0x36, 0xD1, 0x32, 0x6A, 0x08, 0x55, 0xD4, 0x9B, 0x5F, 0x5E, 0x69, 0x85, 0x3E, + 0x59, 0x4B, 0x46, 0x2F, 0x59, 0x55, 0xEF, 0xFB, 0x19, 0x36, 0x69, 0xE6, 0x50, 0x1F, 0x6E, 0x19, + 0x08, 0xAD, 0xED, 0xC0, 0xA5, 0x6E, 0xDD, 0x8D, 0xD5, 0x02, 0xEF, 0x4D, 0xA6, 0xB2, 0x4C, 0xE1, + 0x41, 0x0E, 0xC7, 0x54, 0x06, 0xEB, 0x59, 0xA6, 0xD2, 0xDB, 0x24, 0x8C, 0x78, 0x71, 0xA6, 0x25, + 0x22, 0x37, 0xD3, 0x58, 0x96, 0x3C, 0xB1, 0xBF, 0x56, 0xD5, 0x92, 0xBD, 0xB4, 0xEA, 0x4E, 0xCF, + 0x19, 0x21, 0xB2, 0x59, 0x27, 0x7E, 0x4D, 0x8C, 0x6C, 0xCA, 0xA1, 0x5F, 0x3B, 0x94, 0x51, 0xF5, + 0xB5, 0x94, 0xEA, 0xA9, 0xFE, 0xCF, 0xAC, 0xD9, 0xFA, 0xD7, 0x44, 0x38, 0x7B, 0xDA, 0x3C, 0x10, + 0xEC, 0x0B, 0x69, 0xAF, 0xBA, 0x16, 0x8B, 0xC7, 0x8D, 0xE2, 0x69, 0x0B, 0x02, 0xE9, 0x66, 0x05, + 0xF5, 0xA6, 0xF9, 0x42, 0x64, 0x5B, 0x1B, 0xE2, 0x21, 0xCD, 0xB2, 0x5C, 0x44, 0x23, 0x99, 0x59, + 0x29, 0x1A, 0xC0, 0xAC, 0x5A, 0x31, 0x3F, 0x53, 0x6A, 0x29, 0xA3, 0x9B, 0x5D, 0x4B, 0x1D, 0xD4, + 0x5C, 0xB3, 0x49, 0xD8, 0xDF, 0x8A, 0xA6, 0x13, 0x79, 0xF9, 0xCA, 0x36, 0x9F, 0x08, 0xB3, 0x25, + 0xDB, 0x84, 0xA2, 0xEC, 0xB6, 0x8A, 0x9B, 0x51, 0xB4, 0x83, 0xA7, 0x8E, 0xEC, 0x62, 0xCD, 0x29, + 0x55, 0x49, 0x88, 0xCC, 0x2A, 0xE1, 0xEB, 0x5D, 0x2B, 0x44, 0x30, 0x52, 0xAC, 0x2B, 0x2A, 0x7F, + 0x8A, 0x5A, 0x58, 0x84, 0x01, 0x90, 0xAD, 0x2C, 0xEA, 0xB9, 0xA4, 0xBC, 0xA5, 0xA5, 0xD0, 0xC9, + 0x66, 0xAE, 0xD6, 0x16, 0xE5, 0x78, 0x32, 0xAB, 0xC5, 0x45, 0xE0, 0x4D, 0x69, 0xAB, 0x4B, 0x34, + 0x87, 0x7E, 0xB4, 0xE5, 0x45, 0x96, 0x16, 0x5A, 0x33, 0x7A, 0x8B, 0x62, 0x07, 0xBD, 0x49, 0xEC, + 0x5C, 0xE7, 0x66, 0xA1, 0x49, 0x9E, 0xB7, 0xE4, 0x1A, 0x6B, 0x6A, 0x93, 0x75, 0xF5, 0xC3, 0x46, + 0x2E, 0x8C, 0x37, 0xB2, 0x1D, 0xA8, 0x80, 0xD3, 0xE2, 0x62, 0x0C, 0x50, 0x92, 0x40, 0x7C, 0xD7, + 0x65, 0x3D, 0x90, 0x0C, 0x49, 0x62, 0xB8, 0x35, 0xDB, 0xBD, 0x90, 0x7F, 0x85, 0x91, 0x6E, 0xFF, + 0x3B, 0xD1, 0xD4, 0x8D, 0x7A, 0x3D, 0x0E, 0x36, 0x57, 0xEA, 0xB4, 0x0A, 0xD4, 0xF9, 0xDB, 0xDF, + 0x92, 0x95, 0x3C, 0x1C, 0x4C, 0x3D, 0x87, 0xEE, 0x7D, 0x92, 0x44, 0x0E, 0x71, 0x00, 0x81, 0xEE, + 0xB2, 0xDA, 0xA6, 0x09, 0x07, 0x88, 0x5E, 0x23, 0x32, 0x15, 0x16, 0xC6, 0x6F, 0x5D, 0xAA, 0xCA, + 0x4F, 0xAA, 0x14, 0xEE, 0x60, 0x45, 0xFB, 0xC9, 0xC9, 0x1D, 0xB5, 0x97, 0x04, 0xE6, 0x2D, 0x7A, + 0x34, 0x7D, 0x04, 0x4B, 0x30, 0x82, 0xF0, 0x78, 0x6C, 0xB5, 0x10, 0x9B, 0xF3, 0x88, 0xBE, 0xA8, + 0xC4, 0x12, 0x2B, 0xF8, 0x03, 0x0F, 0x72, 0xED, 0xAA, 0x1B, 0x8E, 0xE8, 0x2D, 0xE3, 0x2B, 0xA8, + 0x9A, 0x08, 0x87, 0xA7, 0x00, 0x76, 0xDF, 0x05, 0x1E, 0x32, 0x47, 0xF6, 0xD0, 0xD9, 0xA9, 0x8F, + 0xF0, 0x5D, 0x50, 0x27, 0x1F, 0xEE, 0x77, 0xE1, 0xE4, 0xF6, 0x6E, 0x85, 0xFC, 0x02, 0x7F, 0xF4, + 0x89, 0xBA, 0xE3, 0x7F, 0x58, 0xBB, 0xEF, 0xE2, 0x77, 0x11, 0x77, 0xD8, 0xBE, 0xE1, 0xD6, 0x7D, + 0xAA, 0x23, 0xDB, 0xDA, 0xA9, 0x03, 0x42, 0x76, 0x7E, 0xDA, 0x1B, 0x8D, 0xEA, 0x88, 0xA6, 0xC6, + 0x27, 0x5F, 0x5D, 0x6F, 0xBC, 0x4C, 0x2B, 0x2E, 0xB3, 0xA6, 0xE2, 0x1B, 0xCB, 0xF0, 0xB9, 0x8E, + 0xB8, 0x77, 0x1B, 0x83, 0x10, 0x92, 0xEC, 0x0E, 0x87, 0x10, 0x82, 0x4C, 0xE8, 0x59, 0x01, 0xB4, + 0x2B, 0x81, 0x17, 0xFD, 0x43, 0xE9, 0x16, 0xD5, 0x3B, 0xB4, 0xA3, 0x7D, 0x0C, 0x5F, 0xF0, 0xAA, + 0x49, 0xEC, 0x7C, 0x1A, 0x8F, 0xEE, 0x83, 0x60, 0x92, 0x9D, 0x81, 0x40, 0xA8, 0xC8, 0x13, 0x11, + 0xBC, 0x3F, 0x62, 0x79, 0x08, 0x60, 0xED, 0xA6, 0xA9, 0x12, 0x6A, 0x9A, 0x4D, 0x56, 0xD8, 0x84, + 0x06, 0x94, 0xCB, 0x6A, 0x84, 0xFB, 0x13, 0x0D, 0xDC, 0x31, 0xE8, 0x99, 0xB0, 0xA2, 0x87, 0xFD, + 0x89, 0xEB, 0xF8, 0x94, 0x54, 0xFA, 0xC6, 0x13, 0x4F, 0xC6, 0x81, 0x0E, 0xFA, 0x1F, 0x59, 0xEA, + 0x0C, 0xB2, 0xF7, 0x70, 0xE9, 0xAE, 0x21, 0xB9, 0x85, 0xCC, 0x18, 0xD1, 0xA5, 0x1D, 0x99, 0x0D, + 0xF9, 0x2B, 0xB0, 0x2C, 0x84, 0xE2, 0xC1, 0xE8, 0xBB, 0x46, 0xE2, 0x79, 0x86, 0x9E, 0xA4, 0xD0, + 0xBB, 0xB7, 0x81, 0x69, 0x13, 0xC1, 0x14, 0x2A, 0xE8, 0x05, 0x5F, 0x5B, 0x31, 0x29, 0xFC, 0x2C, + 0x90, 0x3A, 0xAA, 0xA2, 0x8A, 0xAD, 0x38, 0xEE, 0xBC, 0xDA, 0xC2, 0x46, 0x3D, 0xCC, 0x9B, 0xF6, + 0xA3, 0x07, 0x3E, 0x8D, 0x1D, 0x64, 0xCC, 0x05, 0x16, 0x14, 0x1B, 0xBC, 0x7D, 0xF6, 0xA0, 0x48, + 0xF6, 0x00, 0x42, 0xA5, 0xC2, 0x83, 0xC8, 0x2A, 0xE7, 0x0E, 0x24, 0x7B, 0xF5, 0xEA, 0xC7, 0x0F, + 0x26, 0xA5, 0xE3, 0xF5, 0x0C, 0x68, 0x82, 0x2D, 0xC5, 0x06, 0x55, 0xD0, 0x05, 0x87, 0xEE, 0xA3, + 0x03, 0x87, 0x7E, 0x21, 0x83, 0x08, 0xF7, 0xF9, 0x85, 0xE9, 0x5D, 0x3C, 0xFF, 0x04, 0x80, 0x3C, + 0x39, 0x14, 0x6C, 0x5C, 0x1C, 0xB7, 0x43, 0x8D, 0x19, 0x17, 0x77, 0x14, 0x5A, 0x3F, 0x74, 0x27, + 0xAE, 0x0C, 0x55, 0xDE, 0x27, 0x43, 0x31, 0xB3, 0x96, 0x08, 0x97, 0x00, 0x30, 0x04, 0xC7, 0x2C, + 0x03, 0x05, 0x61, 0x6B, 0x1F, 0x12, 0x3B, 0x41, 0xD6, 0x14, 0xA2, 0x2F, 0xA0, 0x24, 0x91, 0x1D, + 0x2A, 0xAA, 0x2D, 0x4A, 0xB5, 0x08, 0x78, 0x47, 0xDF, 0x87, 0x26, 0x5F, 0xE6, 0x05, 0x2B, 0xDE, + 0xD4, 0x1B, 0x05, 0xEE, 0x00, 0x32, 0xFC, 0x13, 0x11, 0x5C, 0x01, 0x18, 0xFF, 0x42, 0x7B, 0x01, + 0x26, 0x4D, 0x89, 0xAB, 0xBF, 0xC5, 0xF0, 0x21, 0x1F, 0x3C, 0x98, 0x39, 0xFF, 0x62, 0x52, 0x7A, + 0x76, 0x2C, 0x3E, 0x1E, 0xA1, 0x70, 0x8B, 0x09, 0x7F, 0x22, 0xF8, 0x21, 0x73, 0x89, 0x16, 0x26, + 0xF5, 0xDB, 0xA1, 0xED, 0xB4, 0x7D, 0xEF, 0xE1, 0x3B, 0x48, 0x38, 0x1F, 0xD6, 0x8B, 0xC3, 0x0E, + 0x22, 0x7C, 0xF4, 0x25, 0x99, 0x54, 0x69, 0x08, 0x17, 0x4E, 0xD1, 0xF0, 0x13, 0xAE, 0xD3, 0xE5, + 0x85, 0x21, 0x35, 0x0D, 0x09, 0x9C, 0x42, 0x62, 0xB0, 0x52, 0x22, 0x12, 0x27, 0x99, 0x86, 0x24, + 0xAE, 0x09, 0xA9, 0x48, 0xA2, 0xC0, 0x9B, 0x68, 0x55, 0x8B, 0xB6, 0x0D, 0x71, 0x58, 0x4E, 0x11, + 0xC1, 0xC7, 0x4A, 0xE2, 0x9C, 0xB9, 0x89, 0xBD, 0xE8, 0x04, 0x2F, 0x1B, 0xB9, 0x13, 0x82, 0x10, + 0x9E, 0x11, 0x88, 0x00, 0x50, 0xDA, 0x7C, 0x6E, 0xED, 0x4E, 0xAA, 0x4E, 0x49, 0xD8, 0x92, 0xE7, + 0x43, 0xC1, 0x83, 0x55, 0x87, 0x40, 0xFF, 0x4C, 0x41, 0x71, 0x79, 0x7D, 0x4A, 0x88, 0x29, 0xED, + 0x50, 0x6D, 0xBB, 0x84, 0x92, 0xCD, 0x56, 0xB3, 0x11, 0x2D, 0x45, 0x94, 0xAB, 0xC4, 0x83, 0x95, + 0x95, 0x4B, 0x7C, 0x47, 0xD4, 0xE9, 0x3D, 0x4B, 0x59, 0x15, 0xDF, 0x12, 0x66, 0x6F, 0x53, 0xA4, + 0x7D, 0x78, 0x62, 0x4E, 0xB0, 0xF4, 0x51, 0xB2, 0x62, 0x50, 0xB2, 0x62, 0xC1, 0xAF, 0x9D, 0x39, + 0x25, 0xC2, 0x62, 0xB0, 0x2A, 0xE7, 0xBE, 0x62, 0xD4, 0x6A, 0x42, 0x7C, 0x26, 0x9E, 0x3B, 0x84, + 0x97, 0xF2, 0x08, 0xE8, 0xF0, 0xD7, 0x0F, 0xA6, 0x63, 0x8D, 0xB0, 0xA7, 0xB0, 0x99, 0x82, 0x49, + 0xB6, 0xA7, 0x9A, 0x08, 0x5E, 0xE3, 0x62, 0x09, 0xA4, 0x4A, 0xB5, 0xA5, 0x77, 0xBC, 0x35, 0xFE, + 0xAA, 0x57, 0xA9, 0x96, 0xE6, 0xAD, 0xEB, 0xC1, 0x8D, 0x33, 0xFD, 0x6F, 0x46, 0x4B, 0x25, 0xE5, + 0x57, 0x4E, 0xB2, 0x2F, 0x31, 0xB7, 0xA2, 0xC2, 0x8C, 0x30, 0x07, 0x93, 0x30, 0xD0, 0x13, 0xEC, + 0x0D, 0x58, 0x54, 0x0E, 0x2B, 0x6C, 0x8F, 0x68, 0xC2, 0x26, 0xB4, 0x82, 0xD8, 0x9F, 0x81, 0x1B, + 0xC0, 0xF1, 0xF2, 0xAF, 0x60, 0x81, 0x17, 0xB3, 0x5A, 0x71, 0xC0, 0xFB, 0xA6, 0x27, 0x98, 0x69, + 0xCF, 0xCC, 0xE0, 0xBE, 0xED, 0xB9, 0x53, 0x42, 0x11, 0x87, 0x2B, 0x3E, 0x02, 0x3B, 0x15, 0x72, + 0x84, 0x29, 0x7B, 0x1C, 0x4D, 0x43, 0x98, 0x85, 0xFF, 0x9B, 0xCB, 0x27, 0xB6, 0x84, 0xA7, 0xAE, + 0xA8, 0xE1, 0x81, 0x53, 0xBD, 0x0B, 0xA9, 0x3A, 0x8C, 0x64, 0xA6, 0xD1, 0x74, 0x4C, 0x35, 0xE1, + 0x41, 0xAD, 0x16, 0x7A, 0x04, 0x5F, 0x6E, 0x67, 0xC8, 0xC4, 0x9D, 0x6C, 0x43, 0xA8, 0x8C, 0x3F, + 0x93, 0xF1, 0x19, 0xD7, 0xF4, 0xAF, 0x35, 0x28, 0x12, 0xA2, 0x30, 0x34, 0x0F, 0x37, 0x4B, 0x53, + 0x86, 0xA2, 0x3C, 0x65, 0xB9, 0x0C, 0x8D, 0x8D, 0x97, 0x73, 0x9A, 0xFD, 0xEC, 0x6B, 0xA4, 0xF3, + 0x21, 0xCB, 0x18, 0x33, 0x8B, 0xED, 0x3F, 0x9F, 0x58, 0xA5, 0x89, 0x17, 0x39, 0x23, 0x8A, 0x7F, + 0x35, 0xB6, 0x1C, 0x9B, 0x84, 0x52, 0x4B, 0x85, 0x2B, 0x4E, 0x8E, 0x6A, 0x70, 0xF7, 0x00, 0x42, + 0x04, 0x58, 0x00, 0x1D, 0x0C, 0x78, 0x1E, 0x8E, 0x7D, 0x58, 0x74, 0x1B, 0x89, 0xB7, 0x07, 0x59, + 0x30, 0xEA, 0xD5, 0xA0, 0x58, 0x92, 0x10, 0x66, 0xAF, 0x8D, 0x60, 0x2A, 0x0E, 0x28, 0x29, 0x47, + 0x4C, 0x66, 0x67, 0x4E, 0x6B, 0x14, 0x76, 0x32, 0x2A, 0x87, 0xF4, 0x0A, 0x62, 0xA2, 0xD7, 0xAD, + 0xB5, 0xCD, 0xB4, 0x2D, 0x00, 0x69, 0xC3, 0x72, 0xAC, 0xE4, 0x75, 0xAE, 0x50, 0x02, 0x98, 0xA8, + 0x73, 0xDA, 0xBC, 0x2D, 0x79, 0x9D, 0x4B, 0x4D, 0xF6, 0x32, 0x14, 0xCB, 0x4B, 0x74, 0x6E, 0x6A, + 0x4D, 0x32, 0xBB, 0x75, 0x6D, 0x95, 0xE9, 0xD6, 0xD4, 0x4A, 0x4B, 0xBF, 0x90, 0xD9, 0xB1, 0xF4, + 0x66, 0x91, 0x70, 0x5A, 0xFA, 0xAE, 0x75, 0x8C, 0x4E, 0x27, 0x35, 0x45, 0x6F, 0x60, 0x8F, 0x68, + 0x82, 0x51, 0xEC, 0xF8, 0x74, 0xB7, 0x9B, 0x3D, 0x7E, 0x4A, 0xE5, 0x42, 0xFD, 0x9D, 0x90, 0x8D, + 0xF6, 0x29, 0xDD, 0x2F, 0x95, 0xE9, 0x6E, 0x56, 0x2B, 0xC5, 0x73, 0xE3, 0x7E, 0x30, 0x39, 0x0A, + 0xEE, 0xB1, 0xE7, 0xE0, 0x40, 0x43, 0x38, 0x2F, 0x39, 0xFC, 0x70, 0xD0, 0xCB, 0x21, 0x57, 0xC8, + 0xAA, 0x76, 0xD2, 0x93, 0x79, 0x1D, 0xC2, 0xCF, 0xA3, 0x5D, 0x48, 0x75, 0x56, 0x04, 0x84, 0xDC, + 0x11, 0x52, 0x08, 0xB1, 0x74, 0xD4, 0x81, 0x4B, 0x39, 0x2C, 0x24, 0xDC, 0xFE, 0xE0, 0xEB, 0xA3, + 0x7D, 0x67, 0x9F, 0xB3, 0x36, 0x85, 0xDF, 0xE8, 0x12, 0xDA, 0x7C, 0xAD, 0xC3, 0xF3, 0x9E, 0x51, + 0xD9, 0x9F, 0x77, 0xFA, 0xFD, 0xC4, 0xE9, 0x42, 0xD9, 0x04, 0x8B, 0x18, 0x53, 0xF7, 0xC0, 0xC0, + 0x79, 0xB1, 0x22, 0x6C, 0x73, 0x95, 0x67, 0xA4, 0x8D, 0xA6, 0x1A, 0x10, 0xAD, 0xBC, 0xC6, 0x29, + 0x5B, 0x7C, 0x69, 0x71, 0xCA, 0xAB, 0xA7, 0xE7, 0xF8, 0x31, 0xCC, 0x74, 0x2A, 0x0F, 0xBE, 0xC2, + 0xCD, 0xC4, 0x9D, 0x1B, 0x0C, 0xD5, 0x99, 0x3F, 0x64, 0xD7, 0x8D, 0xF5, 0x30, 0xB5, 0xE7, 0x01, + 0x87, 0x49, 0x4A, 0x20, 0x95, 0xEC, 0x27, 0xFB, 0xD8, 0xA6, 0xAB, 0x1F, 0x04, 0xCF, 0xE1, 0xF1, + 0x24, 0x78, 0x96, 0x66, 0x9D, 0xFE, 0xF8, 0xC0, 0xF3, 0x4B, 0x1C, 0x28, 0xE4, 0xA5, 0xBA, 0x48, + 0x70, 0x4A, 0x52, 0x89, 0x20, 0xF2, 0xE3, 0x40, 0x40, 0x18, 0xD9, 0x39, 0x90, 0x4D, 0x03, 0x90, + 0x54, 0x4B, 0xA4, 0x6A, 0x06, 0x79, 0xE0, 0x29, 0x36, 0xC1, 0xD4, 0x21, 0x19, 0x6B, 0xC8, 0x71, + 0x9D, 0xEC, 0xDA, 0xD0, 0x60, 0xEA, 0x79, 0xB0, 0x8B, 0xA1, 0x7D, 0x82, 0xB1, 0xA6, 0x97, 0xA2, + 0xBD, 0x4F, 0xBE, 0x20, 0x67, 0x23, 0x9F, 0x2F, 0xD0, 0xD5, 0x04, 0x2A, 0x4B, 0x76, 0x04, 0xD8, + 0xA9, 0xA2, 0x23, 0xF4, 0x60, 0x69, 0x47, 0x6C, 0x11, 0x1F, 0x95, 0x5A, 0x70, 0x8C, 0x52, 0x4A, + 0x42, 0xD7, 0x30, 0x52, 0xA8, 0x8E, 0x85, 0xAC, 0xBF, 0x2E, 0x0F, 0x84, 0xC1, 0x50, 0x55, 0x41, + 0x1A, 0x19, 0x89, 0xB6, 0x2D, 0xA8, 0x1E, 0xA1, 0x92, 0x1F, 0xEA, 0xCD, 0x6B, 0x4A, 0x87, 0xAD, + 0x15, 0x8F, 0x8D, 0x52, 0x5F, 0x15, 0x69, 0xC8, 0x80, 0x1A, 0xBB, 0xE8, 0x8A, 0x59, 0x8A, 0xC3, + 0x1A, 0xD4, 0xD4, 0x42, 0x20, 0xBC, 0xE5, 0xC7, 0xE0, 0x10, 0x5C, 0x53, 0x9F, 0x5F, 0x55, 0xAE, + 0x20, 0x78, 0xAB, 0x0A, 0x48, 0xB5, 0xD9, 0xB1, 0x13, 0x94, 0xA5, 0xE4, 0xC8, 0xA6, 0xF5, 0x08, + 0x06, 0xED, 0xBC, 0x94, 0x32, 0x3B, 0xA7, 0xA0, 0x6D, 0x6A, 0x4C, 0x34, 0xB5, 0x03, 0x68, 0x48, + 0x27, 0x00, 0xA7, 0x0D, 0x24, 0x2C, 0x05, 0x80, 0xE0, 0x14, 0x9B, 0x3B, 0xB3, 0x38, 0xB1, 0x51, + 0xFE, 0x5F, 0x44, 0x56, 0x4F, 0x9F, 0x2E, 0x6C, 0xDB, 0x49, 0xED, 0x1C, 0x21, 0xFA, 0xC8, 0x2A, + 0x35, 0xEE, 0xE4, 0xBF, 0xE5, 0x6E, 0xA6, 0xE2, 0x15, 0x1F, 0xFC, 0x50, 0x20, 0xB0, 0x07, 0x3F, + 0x2E, 0x2F, 0x2F, 0x2E, 0x6B, 0x15, 0x75, 0x15, 0x61, 0x0B, 0xDB, 0x03, 0xD0, 0x50, 0x6A, 0xF3, + 0x81, 0x6C, 0x72, 0xD9, 0xB5, 0xC4, 0xB6, 0xBA, 0xCE, 0x59, 0xF6, 0xC3, 0x7B, 0x1C, 0x48, 0xFA, + 0x49, 0xD9, 0x4F, 0xE4, 0xEA, 0x30, 0xD5, 0x71, 0x4B, 0x55, 0x87, 0x52, 0x5A, 0x31, 0x5D, 0x57, + 0x0F, 0xAE, 0x2F, 0x2F, 0x8F, 0xCE, 0xAF, 0xB4, 0x9D, 0x4D, 0xED, 0x67, 0x24, 0xF9, 0x44, 0x25, + 0x4F, 0x27, 0xA0, 0x12, 0xC1, 0x71, 0xE3, 0xC7, 0xF4, 0x50, 0x52, 0xF8, 0x2A, 0x32, 0xF5, 0x78, + 0x40, 0x1D, 0x51, 0x08, 0xB9, 0x0F, 0x35, 0xEA, 0xF8, 0x2A, 0xB1, 0x63, 0x3B, 0x1B, 0x52, 0x0A, + 0x49, 0x72, 0xBA, 0x6B, 0x80, 0xDF, 0x4B, 0x3D, 0xD8, 0xE9, 0x05, 0x53, 0x6E, 0x25, 0x8A, 0x27, + 0xCF, 0x35, 0xA7, 0xE5, 0x61, 0xE2, 0x32, 0x23, 0x31, 0xDB, 0x5F, 0x76, 0x1D, 0x7E, 0x25, 0xE3, + 0xAD, 0x5F, 0xDE, 0x8B, 0x69, 0x83, 0x84, 0xD4, 0x27, 0x47, 0x86, 0xF0, 0xE1, 0x3D, 0xCF, 0xA2, + 0x0D, 0xA6, 0xAB, 0x3B, 0xB1, 0x97, 0x3F, 0x77, 0x01, 0xFA, 0x5D, 0x80, 0x66, 0x8D, 0x95, 0xC5, + 0xF5, 0x45, 0x56, 0x58, 0x19, 0xA5, 0x76, 0x7D, 0x55, 0xA8, 0x4A, 0x59, 0x5D, 0x87, 0x0C, 0xB8, + 0x38, 0xDD, 0x44, 0x7F, 0x8C, 0xD0, 0x35, 0x14, 0x74, 0x6B, 0xA7, 0x96, 0xFE, 0xA8, 0x82, 0x96, + 0x9E, 0x66, 0x8A, 0xE2, 0x0E, 0x01, 0x6A, 0xD6, 0xA5, 0x85, 0xCD, 0xBB, 0xBC, 0x35, 0x80, 0x6A, + 0x8B, 0x90, 0x1B, 0xF2, 0x6C, 0x90, 0x5F, 0x41, 0x49, 0x1C, 0xB2, 0xDC, 0xC0, 0x0C, 0x49, 0xE0, + 0xEF, 0x07, 0x70, 0xEB, 0x5E, 0x68, 0x69, 0xD2, 0x6F, 0x56, 0x52, 0x39, 0x56, 0x62, 0xF6, 0x2A, + 0x88, 0x98, 0xC9, 0x31, 0xF1, 0x8A, 0x40, 0x51, 0x9D, 0xAE, 0x40, 0x93, 0x6E, 0x48, 0x54, 0x4C, + 0x3B, 0x49, 0xC3, 0xA5, 0xF2, 0x96, 0x49, 0xC2, 0xAF, 0xF2, 0xBD, 0xFD, 0x80, 0x1D, 0x64, 0xC2, + 0x7B, 0x39, 0x5E, 0xDD, 0xE7, 0x49, 0x59, 0x80, 0xB7, 0xCF, 0xB0, 0x84, 0x91, 0x71, 0x77, 0x02, + 0xFB, 0x8E, 0x65, 0x45, 0x01, 0xC7, 0x13, 0xAA, 0x45, 0xF8, 0x79, 0x0D, 0xBE, 0xC5, 0xFE, 0x87, + 0xC8, 0x76, 0xD0, 0xE1, 0x61, 0xDB, 0x0A, 0x7F, 0xA8, 0x99, 0xDE, 0x14, 0x3D, 0x2F, 0x43, 0x60, + 0x27, 0xA0, 0x4E, 0x20, 0xF7, 0x74, 0x03, 0x90, 0x1E, 0x39, 0x04, 0x97, 0x72, 0x0A, 0x0E, 0x61, + 0x46, 0x35, 0x09, 0x1F, 0xE4, 0xB4, 0xD5, 0x7E, 0xFB, 0xE0, 0xE2, 0xE2, 0xF2, 0xF0, 0xE4, 0x7C, + 0xEF, 0xEA, 0xE8, 0xE6, 0xE4, 0xBC, 0x77, 0x7D, 0x75, 0x73, 0xF5, 0xB9, 0x07, 0xBF, 0x7E, 0xDC, + 0x3B, 0x3D, 0x39, 0xBC, 0xB9, 0x3E, 0xFF, 0xE5, 0xFC, 0xE2, 0xD3, 0xB9, 0x70, 0x19, 0x60, 0x99, + 0xFE, 0xBD, 0x18, 0x56, 0x17, 0xE9, 0x51, 0xF0, 0x14, 0xD5, 0x15, 0x58, 0x78, 0x60, 0x8F, 0xCD, + 0x91, 0xAE, 0x88, 0x69, 0xB4, 0x8B, 0xBB, 0x53, 0x4C, 0x1F, 0xB4, 0x48, 0x5C, 0xA2, 0x12, 0xFD, + 0x42, 0xB6, 0x66, 0x01, 0xE4, 0x41, 0x8F, 0xD8, 0xC3, 0xF2, 0x33, 0x43, 0x7C, 0x16, 0xC8, 0x1B, + 0x7A, 0xBC, 0x37, 0xE9, 0x22, 0x37, 0xA4, 0xFC, 0x27, 0xAC, 0x9E, 0xFA, 0x82, 0x06, 0x1F, 0x98, + 0x0E, 0xC2, 0xC0, 0x18, 0xAA, 0x5C, 0x6D, 0x87, 0x08, 0x03, 0x51, 0x88, 0x10, 0x7C, 0xE7, 0x87, + 0x75, 0xF6, 0x10, 0xFB, 0xC8, 0xAA, 0xC1, 0x8B, 0x30, 0x34, 0x4B, 0x0F, 0xBB, 0x6D, 0xF5, 0x5B, + 0x68, 0xB9, 0x05, 0xCE, 0x60, 0x2D, 0x3A, 0x60, 0x6D, 0xE5, 0x22, 0x51, 0x7C, 0x94, 0x3B, 0x1C, + 0x82, 0x84, 0x9A, 0x56, 0x22, 0x8B, 0x7C, 0xCB, 0x1E, 0xDA, 0x41, 0x3C, 0x64, 0x44, 0x15, 0xA7, + 0x87, 0x96, 0x40, 0x0B, 0x99, 0x7F, 0x74, 0x3B, 0xA0, 0xE5, 0xDB, 0xD2, 0x52, 0x76, 0x9E, 0x5A, + 0x11, 0x23, 0xC0, 0xA9, 0x2F, 0xD7, 0x9B, 0xF1, 0x68, 0x2E, 0x2D, 0x01, 0x4F, 0xE1, 0xBD, 0x8C, + 0xA1, 0xEB, 0x5A, 0x45, 0x9A, 0x23, 0xD2, 0x3C, 0x1E, 0xF4, 0xF2, 0xED, 0xDB, 0x80, 0x5E, 0xE8, + 0x5B, 0x26, 0x84, 0xD0, 0xB4, 0x51, 0x49, 0x7A, 0xF9, 0x15, 0x3C, 0x3D, 0x10, 0x11, 0x91, 0x02, + 0xEF, 0x0F, 0x5F, 0x12, 0x06, 0x1A, 0x89, 0x99, 0xB8, 0xD0, 0x23, 0x27, 0x03, 0x90, 0xA9, 0x89, + 0xEB, 0xFB, 0x36, 0xF8, 0xA9, 0x31, 0x09, 0x81, 0xD9, 0x1B, 0x09, 0x4F, 0x3C, 0x53, 0x85, 0x2F, + 0x67, 0x67, 0xED, 0x31, 0xFB, 0x11, 0x3E, 0x22, 0xED, 0xD7, 0x65, 0xED, 0xD7, 0xB3, 0xB3, 0x7E, + 0xBF, 0xED, 0xD3, 0x1F, 0x19, 0x02, 0xD2, 0x7D, 0x27, 0x30, 0x96, 0x85, 0xEF, 0xB1, 0x56, 0x93, + 0x04, 0x67, 0x17, 0x42, 0x78, 0x66, 0xE7, 0xE2, 0xFF, 0x05, 0x2F, 0x3E, 0xC7, 0x6D, 0xA3, 0x35, + 0x32, 0x0B, 0xB7, 0x8C, 0xD5, 0xD5, 0xB5, 0x37, 0x34, 0x51, 0x12, 0xE5, 0x65, 0x5B, 0x70, 0x23, + 0x8C, 0xB5, 0xC1, 0x2E, 0xEA, 0xCE, 0x03, 0xF3, 0x05, 0xCC, 0x4A, 0x83, 0x46, 0xD4, 0x92, 0xE9, + 0xD7, 0x45, 0xE6, 0x08, 0x72, 0x48, 0x59, 0x40, 0x09, 0x32, 0xD6, 0x51, 0x77, 0xBD, 0xDD, 0x35, + 0xD6, 0xB6, 0x74, 0xB4, 0xC4, 0x1A, 0x6B, 0x17, 0xAD, 0xCE, 0x99, 0x94, 0x2E, 0xA5, 0x66, 0x35, + 0xA6, 0x66, 0xB9, 0x63, 0xAC, 0x2F, 0x77, 0x3A, 0xCB, 0xC6, 0x7A, 0xBB, 0xB3, 0xD1, 0xD5, 0xD2, + 0xA3, 0xD7, 0x7A, 0xBB, 0xE0, 0x9F, 0x3B, 0x27, 0xDA, 0xDE, 0x00, 0x51, 0x77, 0xF8, 0x11, 0x7B, + 0x8C, 0xA0, 0x4E, 0x07, 0xC8, 0xD9, 0xDC, 0xDC, 0xDA, 0xEA, 0xA2, 0xC6, 0x21, 0x13, 0x30, 0xA8, + 0xC2, 0x7E, 0x6B, 0x46, 0x44, 0x8A, 0xFB, 0x62, 0x07, 0x0F, 0xCD, 0x80, 0x28, 0xD5, 0xBE, 0x3D, + 0x74, 0x94, 0x1D, 0x87, 0x3C, 0x9D, 0x8D, 0x58, 0x9B, 0x08, 0xDA, 0x2B, 0x2A, 0x67, 0xDB, 0x36, + 0xF0, 0x85, 0xDD, 0x13, 0xB4, 0x5E, 0x0B, 0xF8, 0x07, 0xBE, 0xAA, 0xF4, 0xEA, 0x0C, 0x1C, 0x66, + 0x89, 0x52, 0xA3, 0xEC, 0x60, 0x3A, 0x45, 0xF0, 0x9D, 0x97, 0xE9, 0x50, 0x42, 0xA5, 0xA2, 0xB1, + 0x5D, 0x5E, 0x06, 0x50, 0x90, 0x03, 0x2D, 0x1E, 0x6E, 0xA2, 0xCB, 0x61, 0x6D, 0xB5, 0x1D, 0x96, + 0xB3, 0x98, 0x96, 0x60, 0xA6, 0xDF, 0x59, 0xEA, 0x34, 0x1A, 0xCF, 0xCB, 0xD1, 0x86, 0x78, 0x90, + 0x4F, 0x10, 0x69, 0xAC, 0x62, 0xA2, 0x48, 0x33, 0x2D, 0xFC, 0x97, 0xBF, 0x88, 0xB2, 0x15, 0x7F, + 0x4B, 0x19, 0xE0, 0x1D, 0xEA, 0x81, 0x0D, 0x4F, 0x32, 0xA4, 0x96, 0x6F, 0x34, 0x9B, 0x4D, 0x78, + 0x2D, 0x2C, 0xA9, 0x01, 0xA4, 0xC7, 0xB7, 0xAA, 0x2F, 0xEB, 0x0C, 0xB2, 0xE4, 0x06, 0xC1, 0x22, + 0x98, 0xE9, 0xDD, 0x15, 0x73, 0xCC, 0xA7, 0xB7, 0xBD, 0x84, 0xCD, 0xCE, 0x20, 0x0C, 0x17, 0x8B, + 0xB7, 0x17, 0x74, 0xBC, 0xC8, 0xE6, 0x15, 0x71, 0x21, 0x92, 0xC1, 0x70, 0x85, 0x23, 0xC3, 0x10, + 0x60, 0xB3, 0x40, 0x31, 0x43, 0x04, 0x22, 0x2C, 0x8E, 0x71, 0xBD, 0xE5, 0x9D, 0x48, 0x79, 0xB1, + 0xAB, 0x6D, 0x39, 0xBA, 0x8C, 0xA6, 0x67, 0xB4, 0x9D, 0x69, 0x40, 0x3D, 0x64, 0x32, 0x50, 0x45, + 0x88, 0xCE, 0xCE, 0x64, 0xD7, 0xE4, 0x63, 0x9B, 0x2C, 0xE6, 0x64, 0x01, 0x92, 0x97, 0xE6, 0x78, + 0x09, 0xA7, 0x21, 0x03, 0x17, 0x77, 0x0D, 0xBA, 0x46, 0x91, 0x71, 0x59, 0xEE, 0x24, 0x0C, 0xF0, + 0xB3, 0x8E, 0xC1, 0xCD, 0xF9, 0xC5, 0xCD, 0xE1, 0xD1, 0xC1, 0xC9, 0xD9, 0xDE, 0x69, 0x62, 0x38, + 0x7C, 0x4C, 0x56, 0x29, 0x0B, 0x3A, 0x17, 0x91, 0xA4, 0xF0, 0x5D, 0x92, 0x0D, 0x76, 0x66, 0x63, + 0x4D, 0xB4, 0xAC, 0x8B, 0xE7, 0x98, 0xC4, 0x71, 0xB1, 0x4D, 0xC8, 0xCF, 0xBF, 0x46, 0x7C, 0xE3, + 0x2D, 0x80, 0x75, 0xC2, 0xB3, 0x6F, 0x9A, 0xED, 0x58, 0x88, 0x6E, 0x29, 0x86, 0xB2, 0x82, 0x36, + 0xC8, 0xF2, 0x40, 0x23, 0x0E, 0x43, 0x24, 0x2B, 0x68, 0x75, 0x03, 0x02, 0xF3, 0x9B, 0x4A, 0x48, + 0x8B, 0x3C, 0xBD, 0x53, 0xB6, 0x41, 0x3A, 0xC4, 0x7F, 0x85, 0x61, 0x49, 0x0D, 0xAE, 0x8D, 0xB6, + 0x1D, 0xCA, 0xAC, 0x85, 0x09, 0x2A, 0xCF, 0x59, 0x3A, 0x65, 0x53, 0x67, 0xE4, 0x3A, 0x4C, 0xD8, + 0xD4, 0xD2, 0xB5, 0x68, 0xBA, 0xCA, 0xAB, 0xF8, 0x1C, 0x67, 0x6B, 0xE1, 0xB9, 0x1A, 0x4F, 0x52, + 0x49, 0x56, 0xD2, 0x66, 0xA8, 0x3A, 0x57, 0x4A, 0xCF, 0xC9, 0xF4, 0x19, 0xA9, 0x17, 0x5A, 0x99, + 0x43, 0xD4, 0x5B, 0x96, 0xB7, 0xD0, 0x80, 0x4E, 0x91, 0xD8, 0xB2, 0x02, 0xB8, 0x78, 0x59, 0x53, + 0xA4, 0x4D, 0x12, 0xAD, 0x0E, 0x13, 0x8E, 0xE5, 0x85, 0x49, 0xC7, 0xCD, 0xD9, 0xD9, 0xCD, 0xE1, + 0x5E, 0xFF, 0x43, 0x42, 0x46, 0xB8, 0xD7, 0x57, 0xAC, 0xD0, 0x78, 0x98, 0xC8, 0x72, 0x22, 0xB0, + 0x28, 0x16, 0x08, 0xAE, 0xEB, 0xA1, 0x29, 0x24, 0x86, 0x88, 0xC7, 0x2E, 0x6D, 0x98, 0xC5, 0x06, + 0x9D, 0xAF, 0x82, 0xAE, 0x4D, 0x8E, 0xF4, 0xEB, 0x1B, 0xB7, 0xF4, 0x51, 0xEB, 0x46, 0xA3, 0x16, + 0xEE, 0xAA, 0x17, 0x30, 0x6A, 0x44, 0xFF, 0xBF, 0xC2, 0x81, 0x7B, 0x55, 0x8B, 0xA4, 0xC0, 0xA6, + 0x62, 0x6B, 0xA5, 0xD8, 0xAD, 0x6E, 0xDC, 0x2D, 0xCD, 0x62, 0xF9, 0x3B, 0x58, 0xC7, 0x98, 0x90, + 0xC6, 0x56, 0xA2, 0x39, 0xCB, 0xE8, 0x76, 0x1E, 0xB3, 0x62, 0x1D, 0xFF, 0x23, 0xD9, 0xC0, 0x35, + 0x2C, 0x5A, 0xA4, 0x86, 0x2D, 0x3C, 0x47, 0xD1, 0x4F, 0xE5, 0x9A, 0x3F, 0x62, 0xDD, 0x68, 0xC4, + 0xD0, 0xA2, 0x4E, 0x38, 0x4C, 0x71, 0xBC, 0xB2, 0x61, 0x7B, 0x8D, 0xAA, 0xF5, 0x7F, 0xA6, 0x56, + 0x0D, 0x2D, 0x67, 0xD2, 0xDD, 0x95, 0x06, 0x04, 0xBB, 0xBE, 0xD2, 0x14, 0x44, 0xF9, 0x4B, 0xB6, + 0x9A, 0x6A, 0xA8, 0xAD, 0x66, 0x58, 0x84, 0x37, 0xC8, 0xC3, 0x2B, 0x02, 0xC1, 0xD6, 0x0F, 0x46, + 0xE5, 0x38, 0x1A, 0xB5, 0x85, 0xDC, 0x69, 0x00, 0x7F, 0x98, 0xFC, 0xFE, 0x00, 0x5A, 0xF5, 0x5D, + 0xF9, 0x3A, 0x00, 0x4C, 0xDA, 0xB7, 0x84, 0x6D, 0x63, 0x8C, 0xEA, 0xCA, 0x44, 0xAA, 0xB7, 0x10, + 0x0E, 0x06, 0xF2, 0xA3, 0xE4, 0x40, 0x3D, 0x25, 0x46, 0x20, 0xAE, 0xA5, 0x93, 0x9F, 0x94, 0xAB, + 0x03, 0x6E, 0x36, 0x95, 0xAE, 0x46, 0x59, 0x50, 0x89, 0x46, 0x02, 0x8B, 0x8B, 0x60, 0x53, 0x3F, + 0xDF, 0x63, 0x81, 0x8B, 0xBF, 0x35, 0x05, 0x86, 0x27, 0xAE, 0x9A, 0x45, 0x42, 0xD2, 0x2E, 0xE4, + 0x66, 0x24, 0xF5, 0x46, 0x3C, 0x44, 0x91, 0xD3, 0xE0, 0x8C, 0xE0, 0xE6, 0x0B, 0x2D, 0x3C, 0x02, + 0xCC, 0x1B, 0x66, 0xFF, 0xF3, 0xD9, 0xFE, 0xC5, 0x29, 0x83, 0x9A, 0x88, 0xD8, 0x19, 0xB9, 0xCE, + 0x90, 0xE6, 0x2C, 0x39, 0xC4, 0x43, 0x0F, 0xAB, 0x56, 0x98, 0xE4, 0x80, 0x28, 0x63, 0x4C, 0xCE, + 0x7B, 0x2A, 0x04, 0x7D, 0x45, 0x32, 0x89, 0x37, 0x8C, 0x6D, 0x35, 0x63, 0x57, 0x54, 0xFC, 0x0E, + 0xA5, 0xAB, 0xC5, 0x48, 0x01, 0xA4, 0x48, 0xD9, 0x20, 0x39, 0x9D, 0xDF, 0x34, 0x35, 0xE9, 0xC1, + 0x66, 0x1C, 0xEA, 0x54, 0xFA, 0xA2, 0x69, 0x95, 0xE0, 0xE5, 0x12, 0x99, 0x69, 0x54, 0xF1, 0x84, + 0x55, 0xB7, 0x35, 0x97, 0x29, 0x73, 0x92, 0x9A, 0x6A, 0xE4, 0x2D, 0xBF, 0x08, 0x7D, 0x4C, 0x02, + 0xAB, 0x51, 0xF8, 0xDF, 0xFF, 0x25, 0x93, 0x08, 0xDF, 0xEA, 0x35, 0x85, 0xD0, 0x4A, 0x90, 0x91, + 0xB6, 0xEF, 0xAA, 0xC6, 0x99, 0x4B, 0xFF, 0xFB, 0x4D, 0x69, 0x52, 0xCF, 0x2E, 0x8C, 0xF3, 0x86, + 0x28, 0x9C, 0xD0, 0x16, 0x02, 0x38, 0x21, 0x01, 0x73, 0xE2, 0x82, 0xB0, 0xF1, 0x59, 0x08, 0xDD, + 0x0B, 0x06, 0xAF, 0x9C, 0x88, 0x9B, 0xBF, 0x13, 0xF5, 0x2C, 0x51, 0x7E, 0xA6, 0x33, 0xEF, 0x97, + 0xA2, 0x9C, 0x43, 0xC8, 0xA6, 0xBC, 0xF8, 0xE2, 0xB0, 0xB1, 0x80, 0xC5, 0x41, 0x9A, 0x8F, 0x25, + 0x97, 0x87, 0x04, 0xA7, 0x5E, 0x6A, 0xD9, 0x48, 0x4E, 0xF8, 0xB2, 0x2B, 0x87, 0x8E, 0xF4, 0xE5, + 0x97, 0xA2, 0x7D, 0xF6, 0x55, 0x45, 0x47, 0x7E, 0x3D, 0xB9, 0xDC, 0xFC, 0xAD, 0x56, 0x5B, 0x58, + 0x2F, 0x9A, 0xD5, 0x97, 0x2E, 0x1D, 0xF5, 0x68, 0xE1, 0xCC, 0x4F, 0xD7, 0xBA, 0x73, 0x12, 0x7B, + 0x21, 0x42, 0x55, 0xAF, 0x25, 0xE6, 0x2C, 0x46, 0xB3, 0xF6, 0x25, 0x7B, 0x2C, 0x5E, 0xBA, 0x37, + 0xEA, 0x8A, 0xB2, 0x80, 0xB9, 0x9D, 0xD9, 0x25, 0x4D, 0x00, 0x93, 0x8C, 0x32, 0xE9, 0xD8, 0x19, + 0xBA, 0x51, 0x0D, 0xE0, 0xB5, 0x2E, 0xDE, 0x6C, 0xE5, 0x6F, 0xD6, 0x4A, 0x3B, 0x80, 0xB0, 0xF4, + 0x41, 0x73, 0x1B, 0xA9, 0x09, 0x36, 0x42, 0x17, 0x04, 0x72, 0xB2, 0x6E, 0xB1, 0x9C, 0x70, 0xE4, + 0x18, 0x7C, 0xEF, 0x49, 0xBE, 0xA0, 0x2C, 0xA9, 0xDD, 0x2E, 0x9C, 0xBE, 0xC3, 0xE0, 0xAB, 0x65, + 0xC1, 0x6F, 0x86, 0x7C, 0x96, 0x0F, 0xFC, 0x50, 0x4F, 0x4A, 0xC3, 0xC6, 0x73, 0xDE, 0x2D, 0x01, + 0x64, 0x70, 0x7E, 0x95, 0xCA, 0x19, 0xF4, 0x25, 0x96, 0x13, 0x58, 0xB6, 0x09, 0x38, 0x92, 0x15, + 0x80, 0x43, 0x37, 0xE1, 0xDD, 0x34, 0x87, 0xE5, 0xC8, 0x0A, 0xED, 0x01, 0x42, 0xEC, 0x38, 0x2F, + 0x8A, 0xBD, 0x00, 0xB3, 0x0E, 0xF5, 0xFE, 0xA3, 0x1D, 0x0C, 0xEE, 0x51, 0x66, 0x1D, 0xEA, 0x4F, + 0xC1, 0x5E, 0x79, 0x7F, 0xAB, 0x66, 0x38, 0x66, 0xE3, 0x52, 0xBB, 0x76, 0xBE, 0x39, 0xBA, 0x77, + 0xC3, 0xD5, 0xEC, 0xDA, 0x03, 0x08, 0xE2, 0x6E, 0x14, 0x36, 0x06, 0xA4, 0xA1, 0x13, 0x0D, 0x1F, + 0x73, 0xC6, 0x49, 0xCE, 0x66, 0xE9, 0x58, 0x63, 0x33, 0xEB, 0x9C, 0xB1, 0xDE, 0x64, 0xA2, 0x45, + 0x8B, 0xC4, 0xCB, 0x96, 0xED, 0x74, 0xE4, 0xCB, 0x0B, 0x43, 0x4E, 0x77, 0x3A, 0x59, 0xCC, 0x8E, + 0x0C, 0x58, 0x0B, 0xE8, 0x75, 0x26, 0x6A, 0xC9, 0x7A, 0xB6, 0x80, 0x5E, 0x8B, 0x4A, 0x35, 0x9B, + 0x01, 0x0B, 0xE9, 0x79, 0x31, 0xF4, 0x8C, 0x09, 0x8B, 0x21, 0x40, 0x5D, 0x59, 0x32, 0xC5, 0x6F, + 0x39, 0x87, 0x8A, 0xEF, 0xF2, 0x22, 0x21, 0x29, 0xA3, 0xEF, 0xFF, 0x1F, 0x67, 0xE8, 0x7F, 0x23, + 0xE1, 0x5A, 0x00 }; ///main_js //To convert AP-Config\index.html to index_html[], run the Python index_html_zipper.py script in the Tools folder: @@ -889,7 +890,7 @@ static const uint8_t main_js[] PROGMEM = { // python index_html_zipper.py static const uint8_t index_html[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0xCE, 0xE4, 0x45, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x1F, 0x8B, 0x08, 0x08, 0xEF, 0x72, 0x4F, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xD9, 0x72, 0xE3, 0x48, 0x92, 0xE0, 0xFB, 0x9A, 0xED, 0x3F, 0x44, 0x73, 0x76, 0x46, 0xCA, 0x19, 0x91, 0xE2, 0x21, 0x29, 0x95, 0xEA, 0x4C, 0x99, 0xE9, 0xCC, 0xD2, 0xB6, 0x94, 0x49, 0x13, 0x95, 0x5D, 0xC7, 0xDA, 0x6E, From 797fc982b29afde161235e63bdfa92146c4ee9f8 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Thu, 23 May 2024 18:19:40 +0100 Subject: [PATCH 084/358] Change debugWiFiConfig to debugWebConfig --- Firmware/RTK_Everywhere/Form.ino | 22 +++++++-------- Firmware/RTK_Everywhere/menuCommands.ino | 34 ++++++++++++------------ Firmware/RTK_Everywhere/menuSystem.ino | 6 ++--- Firmware/RTK_Everywhere/settings.h | 4 +-- 4 files changed, 33 insertions(+), 33 deletions(-) diff --git a/Firmware/RTK_Everywhere/Form.ino b/Firmware/RTK_Everywhere/Form.ino index 17993cbd3..ef6de7ce7 100644 --- a/Firmware/RTK_Everywhere/Form.ino +++ b/Firmware/RTK_Everywhere/Form.ino @@ -478,14 +478,14 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) updateWebServerTaskPriority, &updatePplTaskHandle); // Task handle - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintln("Web Server Started"); reportHeapNow(false); // Start the web socket server on port 81 using start_wsserver(); - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintln("Web Socket Server Started"); reportHeapNow(false); @@ -551,7 +551,7 @@ void stopWebServer() incomingSettings = nullptr; } - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintln("Web Server Stopped"); reportHeapNow(false); } @@ -739,7 +739,7 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp { if (type == WS_EVT_CONNECT) { - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintln("Websocket client connected"); client->text(settingsCSV); lastDynamicDataUpdate = millis(); @@ -747,7 +747,7 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp } else if (type == WS_EVT_DISCONNECT) { - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintln("Websocket client disconnected"); // User has either refreshed the page or disconnected. Recompile the current settings. @@ -768,7 +768,7 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp } else { - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintf("onWsEvent: unrecognised AwsEventType %d\r\n", type); } } @@ -881,7 +881,7 @@ bool parseIncomingSettings() if (counter < maxAttempts) { // Confirm receipt - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintln("Sending receipt confirmation of settings"); sendStringToWebsocket("confirmDataReceipt,1,"); } @@ -944,7 +944,7 @@ void getFileList(String &returnText) systemPrintf("sdCardSemaphore failed to yield, held by %s, Form.ino line %d\r\n", semaphoreHolder, __LINE__); } - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintf("returnText (%d bytes): %s\r\n", returnText.length(), returnText.c_str()); } @@ -962,7 +962,7 @@ void createCorrectionsList(String &returnText) String(settings.correctionsSourcesPriority[s]) + ","; } - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintf("returnText (%d bytes): %s\r\n", returnText.length(), returnText.c_str()); } */ @@ -997,7 +997,7 @@ void createMessageList(String &returnText) } } - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintf("returnText (%d bytes): %s\r\n", returnText.length(), returnText.c_str()); } @@ -1028,7 +1028,7 @@ void createMessageListBase(String &returnText) } } - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintf("returnText (%d bytes): %s\r\n", returnText.length(), returnText.c_str()); } diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 1fec0130e..1efc5a9ce 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -679,7 +679,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr // This is one of the first settings to be received. If seen, remove the station files. removeFile(stationCoordinateECEFFileName); removeFile(stationCoordinateGeodeticFileName); - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintln("Station coordinate files removed"); knownSetting = true; } @@ -691,7 +691,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr replaceCharacter((char *)settingValueStr, ' ', ','); // Replace all ' ' with ',' before recording to file recordLineToSD(stationCoordinateECEFFileName, settingValueStr); recordLineToLFS(stationCoordinateECEFFileName, settingValueStr); - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintf("%s recorded\r\n", settingValueStr); knownSetting = true; } @@ -700,7 +700,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr replaceCharacter((char *)settingValueStr, ' ', ','); // Replace all ' ' with ',' before recording to file recordLineToSD(stationCoordinateGeodeticFileName, settingValueStr); recordLineToLFS(stationCoordinateGeodeticFileName, settingValueStr); - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintf("%s recorded\r\n", settingValueStr); knownSetting = true; } @@ -752,7 +752,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr else if (strcmp(settingName, "exitAndReset") == 0) { // Confirm receipt - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintln("Sending reset confirmation"); sendStringToWebsocket("confirmReset,1,"); @@ -784,7 +784,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr else if (strcmp(settingName, "setProfile") == 0) { // Change to new profile - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintf("Changing to profile number %d\r\n", settingValue); changeProfileNumber(settingValue); @@ -796,7 +796,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr createSettingsString(settingsCSV); - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) { systemPrintf("Sending profile %d\r\n", settingValue); systemPrintf("Profile contents: %s\r\n", settingsCSV); @@ -819,7 +819,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr createSettingsString(settingsCSV); - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) { systemPrintf("Sending reset profile %d\r\n", settingValue); systemPrintf("Profile contents: %s\r\n", settingsCSV); @@ -853,7 +853,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } else if (strcmp(settingName, "checkNewFirmware") == 0) { - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintln("Checking for new OTA Pull firmware"); sendStringToWebsocket("checkingNewFirmware,1,"); // Tell the config page we received their request @@ -870,13 +870,13 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr getFirmwareVersion(currentVersion, sizeof(currentVersion), enableRCFirmware); if (isReportedVersionNewer(reportedVersion, currentVersion) == true) { - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintln("New version detected"); snprintf(newVersionCSV, sizeof(newVersionCSV), "newFirmwareVersion,%s,", reportedVersion); } else { - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintln("No new firmware available"); snprintf(newVersionCSV, sizeof(newVersionCSV), "newFirmwareVersion,CURRENT,"); } @@ -884,7 +884,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr else { // Failed to get version number - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintln("Sending error to AP config page"); snprintf(newVersionCSV, sizeof(newVersionCSV), "newFirmwareVersion,ERROR,"); } @@ -894,7 +894,7 @@ bool updateSettingWithValue(const char *settingName, const char *settingValueStr } else if (strcmp(settingName, "getNewFirmware") == 0) { - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintln("Getting new OTA Pull firmware"); sendStringToWebsocket("gettingNewFirmware,1,"); @@ -1462,7 +1462,7 @@ void createSettingsString(char *newSettings) { trim(stationInfo); // Remove trailing whitespace - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintf("ECEF SD station %d - found: %s\r\n", index, stationInfo); replaceCharacter(stationInfo, ',', ' '); // Change all , to ' ' for easier parsing on the JS side @@ -1474,7 +1474,7 @@ void createSettingsString(char *newSettings) { trim(stationInfo); // Remove trailing whitespace - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintf("ECEF LFS station %d - found: %s\r\n", index, stationInfo); replaceCharacter(stationInfo, ',', ' '); // Change all , to ' ' for easier parsing on the JS side @@ -1500,7 +1500,7 @@ void createSettingsString(char *newSettings) { trim(stationInfo); // Remove trailing whitespace - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintf("Geo SD station %d - found: %s\r\n", index, stationInfo); replaceCharacter(stationInfo, ',', ' '); // Change all , to ' ' for easier parsing on the JS side @@ -1512,7 +1512,7 @@ void createSettingsString(char *newSettings) { trim(stationInfo); // Remove trailing whitespace - if (settings.debugWiFiConfig == true) + if (settings.debugWebConfig == true) systemPrintf("Geo LFS station %d - found: %s\r\n", index, stationInfo); replaceCharacter(stationInfo, ',', ' '); // Change all , to ' ' for easier parsing on the JS side @@ -2145,7 +2145,7 @@ bool getSettingValue(const char *settingName, char *settingValueStr) if (knownSetting == false) { - if (settings.debugWiFiConfig) + if (settings.debugWebConfig) systemPrintf("getSettingValue() Unknown setting: %s\r\n", settingName); } diff --git a/Firmware/RTK_Everywhere/menuSystem.ino b/Firmware/RTK_Everywhere/menuSystem.ino index bc73c47e8..0ea62601a 100644 --- a/Firmware/RTK_Everywhere/menuSystem.ino +++ b/Firmware/RTK_Everywhere/menuSystem.ino @@ -615,8 +615,8 @@ void menuDebugNetwork() systemPrintf("%s\r\n", settings.debugWifiState ? "Enabled" : "Disabled"); // WiFi Config - systemPrint("4) Debug WiFi Config: "); - systemPrintf("%s\r\n", settings.debugWiFiConfig ? "Enabled" : "Disabled"); + systemPrint("4) Debug Web Config: "); + systemPrintf("%s\r\n", settings.debugWebConfig ? "Enabled" : "Disabled"); // Network systemPrint("10) Debug network layer: "); @@ -674,7 +674,7 @@ void menuDebugNetwork() else if (incoming == 3) settings.debugWifiState ^= 1; else if (incoming == 4) - settings.debugWiFiConfig ^= 1; + settings.debugWebConfig ^= 1; else if (incoming == 10) settings.debugNetworkLayer ^= 1; else if (incoming == 11) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 6484323dd..952744755 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1289,7 +1289,7 @@ struct Settings // Measurement scale uint8_t measurementScale = MEASUREMENTS_IN_METERS; - bool debugWiFiConfig = false; + bool debugWebConfig = false; bool enablePsram = true; // Control the use on onboard PSRAM. Used for testing behavior when PSRAM is not available. bool printTaskStartStop = false; uint16_t psramMallocLevel = 40; // By default, push as much as possible to PSRAM. Needed to do secure WiFi (MQTT) + BT + PPL @@ -1601,7 +1601,7 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { { & settings.measurementScale, "measurementScale", _uint8_t, 0, false, true, true }, - { & settings.debugWiFiConfig, "debugWiFiConfig", _bool, 0, false, true, true }, + { & settings.debugWebConfig, "debugWebConfig", _bool, 0, false, true, true }, { & settings.enablePsram, "enablePsram", _bool, 0, false, true, true }, { & settings.printTaskStartStop, "printTaskStartStop", _bool, 0, false, true, true }, { & settings.psramMallocLevel, "psramMallocLevel", _uint16_t, 0, false, true, true }, From 11fc653dd4d8ab9033e9ce22ba91976da7477041 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Thu, 23 May 2024 18:33:59 +0100 Subject: [PATCH 085/358] Add more debugWebConfig systemPrint guards --- Firmware/RTK_Everywhere/Form.ino | 49 +++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/Firmware/RTK_Everywhere/Form.ino b/Firmware/RTK_Everywhere/Form.ino index ef6de7ce7..874554c05 100644 --- a/Firmware/RTK_Everywhere/Form.ino +++ b/Firmware/RTK_Everywhere/Form.ino @@ -53,7 +53,8 @@ void sendStringToWebsocket(const char *stringToSend) } else { - systemPrintf("sendStringToWebsocket: %s\r\n", stringToSend); + if (settings.debugWebConfig == true) + systemPrintf("sendStringToWebsocket: %s\r\n", stringToSend); } } @@ -72,7 +73,8 @@ static esp_err_t ws_handler(httpd_req_t *req) // Log the fd, so we can reuse it for httpd_ws_send_frame // TODO: do we need to be cleverer about this? last_ws_fd = httpd_req_to_sockfd(req); - systemPrintln("Handshake done, the new ws connection was opened"); + if (settings.debugWebConfig == true) + systemPrintln("Handshake done, the new ws connection was opened"); websocketConnected = true; lastDynamicDataUpdate = millis(); @@ -90,7 +92,8 @@ static esp_err_t ws_handler(httpd_req_t *req) systemPrintf("httpd_ws_recv_frame failed to get frame len with %d\r\n", ret); return ret; } - systemPrintf("frame len is %d\r\n", ws_pkt.len); + if (settings.debugWebConfig == true) + systemPrintf("frame len is %d\r\n", ws_pkt.len); if (ws_pkt.len) { /* ws_pkt.len + 1 is for NULL termination as we are expecting a string */ buf = (uint8_t *)calloc(1, ws_pkt.len + 1); @@ -106,9 +109,11 @@ static esp_err_t ws_handler(httpd_req_t *req) free(buf); return ret; } - systemPrintf("Got packet with message: %s\r\n", ws_pkt.payload); + if (settings.debugWebConfig == true) + systemPrintf("Got packet with message: %s\r\n", ws_pkt.payload); } - systemPrintf("Packet type: %d\r\n", ws_pkt.type); + if (settings.debugWebConfig == true) + systemPrintf("Packet type: %d\r\n", ws_pkt.type); // HTTPD_WS_TYPE_CONTINUE = 0x0, // HTTPD_WS_TYPE_TEXT = 0x1, // HTTPD_WS_TYPE_BINARY = 0x2, @@ -155,14 +160,16 @@ static void start_wsserver(void) config.stack_size = AP_CONFIG_SETTING_SIZE; // Start the httpd server - systemPrintf("Starting wsserver on port: %d\r\n", config.server_port); + if (settings.debugWebConfig == true) + systemPrintf("Starting wsserver on port: %d\r\n", config.server_port); if (wsserver == nullptr) wsserver = new httpd_handle_t; if (httpd_start(wsserver, &config) == ESP_OK) { // Registering the ws handler - systemPrintln("Registering URI handlers"); + if (settings.debugWebConfig == true) + systemPrintln("Registering URI handlers"); httpd_register_uri_handler(*wsserver, &ws); return; } @@ -193,7 +200,8 @@ class CaptiveRequestHandler : public RequestHandler "/check_network_status.txt"}; CaptiveRequestHandler() { - systemPrintln("CaptiveRequestHandler is registered"); + if (settings.debugWebConfig == true) + systemPrintln("CaptiveRequestHandler is registered"); } virtual ~CaptiveRequestHandler() { @@ -211,7 +219,8 @@ class CaptiveRequestHandler : public RequestHandler bool handle(WebServer &server, HTTPMethod requestMethod, String requestUri) override { String logmessage = "Captive Portal Client:" + server.client().remoteIP().toString() + " " + requestUri; - systemPrintln(logmessage); + if (settings.debugWebConfig == true) + systemPrintln(logmessage); String response = "RTK Config"; response += "
"; response += "
on("/listfiles", HTTP_GET, []() { String logmessage = "Client:" + webserver->client().remoteIP().toString() + " " + webserver->uri(); - systemPrintln(logmessage); + if (settings.debugWebConfig == true) + systemPrintln(logmessage); String files; getFileList(files); webserver->send(200, "text/plain", files); @@ -447,20 +459,24 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) // Handler for supported messages list webserver->on("/listMessages", HTTP_GET, []() { String logmessage = "Client:" + webserver->client().remoteIP().toString() + " " + webserver->uri(); - systemPrintln(logmessage); + if (settings.debugWebConfig == true) + systemPrintln(logmessage); String messages; createMessageList(messages); - systemPrintln(messages); + if (settings.debugWebConfig == true) + systemPrintln(messages); webserver->send(200, "text/plain", messages); }); // Handler for supported RTCM/Base messages list webserver->on("/listMessagesBase", HTTP_GET, []() { String logmessage = "Client:" + webserver->client().remoteIP().toString() + " " + webserver->uri(); - systemPrintln(logmessage); + if (settings.debugWebConfig == true) + systemPrintln(logmessage); String messageList; createMessageListBase(messageList); - systemPrintln(messageList); + if (settings.debugWebConfig == true) + systemPrintln(messageList); webserver->send(200, "text/plain", messageList); }); @@ -590,7 +606,8 @@ static void handleFileManager() } else { - systemPrintln(logmessage + " file exists"); + if (settings.debugWebConfig == true) + systemPrintln(logmessage + " file exists"); if (fileAction == "download") { @@ -701,8 +718,6 @@ static void handleFirmwareFileUpload() char bytesSentMsg[100]; snprintf(bytesSentMsg, sizeof(bytesSentMsg), "%'d bytes sent", binBytesSent); - systemPrintf("bytesSentMsg: %s\r\n", bytesSentMsg); - char statusMsg[200] = {'\0'}; stringRecord(statusMsg, "firmwareUploadStatus", bytesSentMsg); // Convert to "firmwareUploadMsg,11214 bytes sent," From b2231b87dbf2770f7823c223d021a5c27f4b2146 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 23 May 2024 13:35:23 -0600 Subject: [PATCH 086/358] Avoid saving settings that are not supported by a given platform. --- Firmware/RTK_Everywhere/NVM.ino | 4 ++++ Firmware/RTK_Everywhere/menuCommands.ino | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/Firmware/RTK_Everywhere/NVM.ino b/Firmware/RTK_Everywhere/NVM.ino index 8a069ad42..8c77c9120 100644 --- a/Firmware/RTK_Everywhere/NVM.ino +++ b/Firmware/RTK_Everywhere/NVM.ino @@ -229,6 +229,10 @@ void recordSystemSettingsToFile(File *settingsFile) for (int i = 0; i < numRtkSettingsEntries; i++) { + // Skip this setting if it is not supported by the current platform + if (settingAvailableOnPlatform(i) == false) + continue; + // Exceptions: // runLogTest not stored in NVM if (strcmp(rtkSettingsEntries[i].name, "runLogTest") == 0) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 89d9c47be..bf5dadefa 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -2659,6 +2659,20 @@ bool commandAvailableOnPlatform(int i) return true; } +// Determine if the setting is available on this platform +bool settingAvailableOnPlatform(int i) +{ + if ((productVariant == RTK_EVK) && rtkSettingsEntries[i].platEvk) + return (true); + if ((productVariant == RTK_FACET_V2) && rtkSettingsEntries[i].platFacetV2) + return (true); + if ((productVariant == RTK_FACET_MOSAIC) && rtkSettingsEntries[i].platFacetMosaic) + return (true); + if ((productVariant == RTK_TORCH) && rtkSettingsEntries[i].platTorch) + return (true); + return false; +} + // Allocate and fill the commandIndex table bool commandIndexFill() { From 895f03d0ac8907ed577c1cf8d6f44727153913fb Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 23 May 2024 13:37:04 -0600 Subject: [PATCH 087/358] Whitespace format --- Firmware/RTK_Everywhere/NVM.ino | 1147 +++++++++++++++---------------- 1 file changed, 542 insertions(+), 605 deletions(-) diff --git a/Firmware/RTK_Everywhere/NVM.ino b/Firmware/RTK_Everywhere/NVM.ino index 8c77c9120..bd27cf64e 100644 --- a/Firmware/RTK_Everywhere/NVM.ino +++ b/Firmware/RTK_Everywhere/NVM.ino @@ -49,8 +49,10 @@ edited in the index.html and main.js files. */ -bool loadSystemSettingsFromFileLFS(char *fileName, const char *findMe = nullptr, char *found = nullptr, int len = 0); // Header -bool loadSystemSettingsFromFileSD(char *fileName, const char *findMe = nullptr, char *found = nullptr, int len = 0); // Header +bool loadSystemSettingsFromFileLFS(char *fileName, const char *findMe = nullptr, char *found = nullptr, + int len = 0); // Header +bool loadSystemSettingsFromFileSD(char *fileName, const char *findMe = nullptr, char *found = nullptr, + int len = 0); // Header // We use the LittleFS library to store user profiles in SPIFFs // Move selected user profile from SPIFFs into settings struct (RAM) @@ -75,9 +77,11 @@ void loadSettings() if (!((stateFromLFS >= STATE_CONFIG_VIA_ETH_NOT_STARTED) && (stateFromLFS <= STATE_CONFIG_VIA_ETH_RESTART_BASE))) { // and lastState from SD indicates the firmware was previously in configure-via-Ethernet mode - if ((settings.lastState >= STATE_CONFIG_VIA_ETH_NOT_STARTED) && (settings.lastState <= STATE_CONFIG_VIA_ETH_RESTART_BASE)) + if ((settings.lastState >= STATE_CONFIG_VIA_ETH_NOT_STARTED) && + (settings.lastState <= STATE_CONFIG_VIA_ETH_RESTART_BASE)) { - // then reload the settings from LFS since they will include any changes made during configure-via-Ethernet mode + // then reload the settings from LFS since they will include any changes made during configure-via-Ethernet + // mode systemPrintln("Restart after config-via-ethernet. Overwriting SD settings with those from LittleFS"); loadSystemSettingsFromFileLFS(settingsFileName); recordSystemSettings(); // Overwrite SD settings with those from LFS @@ -240,312 +244,273 @@ void recordSystemSettingsToFile(File *settingsFile) switch (rtkSettingsEntries[i].type) { - default: - break; - case _bool: - { - bool *ptr = (bool *)rtkSettingsEntries[i].var; - settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, *ptr); - } - break; - case _int: - { - int *ptr = (int *)rtkSettingsEntries[i].var; - settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, *ptr); - } - break; - case _float: - { - float *ptr = (float *)rtkSettingsEntries[i].var; - settingsFile->printf("%s=%0.*f\r\n", - rtkSettingsEntries[i].name, - rtkSettingsEntries[i].qualifier, - *ptr); - } - break; - case _double: - { - double *ptr = (double *)rtkSettingsEntries[i].var; - settingsFile->printf("%s=%0.*f\r\n", - rtkSettingsEntries[i].name, - rtkSettingsEntries[i].qualifier, - *ptr); - } - break; - case _uint8_t: - { - uint8_t *ptr = (uint8_t *)rtkSettingsEntries[i].var; - settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, *ptr); - } - break; - case _uint16_t: - { - uint16_t *ptr = (uint16_t *)rtkSettingsEntries[i].var; - settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, *ptr); - } - break; - case _uint32_t: - { - uint32_t *ptr = (uint32_t *)rtkSettingsEntries[i].var; - settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, *ptr); - } - break; - case _uint64_t: - { - uint64_t *ptr = (uint64_t *)rtkSettingsEntries[i].var; - settingsFile->printf("%s=%llu\r\n", rtkSettingsEntries[i].name, *ptr); - } - break; - case _int8_t: - { - int8_t *ptr = (int8_t *)rtkSettingsEntries[i].var; - settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, *ptr); - } - break; - case _int16_t: - { - int16_t *ptr = (int16_t *)rtkSettingsEntries[i].var; - settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, *ptr); - } - break; - case tMuxConn: - { - muxConnectionType_e *ptr = (muxConnectionType_e *)rtkSettingsEntries[i].var; - settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, (int)*ptr); - } - break; - case tSysState: - { - SystemState *ptr = (SystemState *)rtkSettingsEntries[i].var; - settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, (int)*ptr); - } - break; - case tPulseEdg: - { - pulseEdgeType_e *ptr = (pulseEdgeType_e *)rtkSettingsEntries[i].var; - settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, (int)*ptr); - } - break; - case tBtRadio: - { - BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)rtkSettingsEntries[i].var; - settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, (int)*ptr); - } - break; - case tPerDisp: - { - PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)rtkSettingsEntries[i].var; - settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, (int)*ptr); - } - break; - case tCoordInp: - { - CoordinateInputType *ptr = (CoordinateInputType *)rtkSettingsEntries[i].var; - settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, (int)*ptr); - } - break; - case tCharArry: - { - char *ptr = (char *)rtkSettingsEntries[i].var; - settingsFile->printf("%s=%s\r\n", rtkSettingsEntries[i].name, ptr); - } - break; - case _IPString: - { - IPAddress *ptr = (IPAddress *)rtkSettingsEntries[i].var; - settingsFile->printf("%s=%s\r\n", rtkSettingsEntries[i].name, ptr->toString().c_str()); - // Note: toString separates the four bytes with dots / periods "192.168.1.1" - } - break; - case tUbxMsgRt: - { - // Record message settings - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; // ubxMessageRate_UBX_NMEA_DTM=5 - snprintf(tempString, sizeof(tempString), "%s%s=%d", rtkSettingsEntries[i].name, ubxMessages[x].msgTextName, - settings.ubxMessageRates[x]); - settingsFile->println(tempString); - } - } - break; - case tUbxConst: - { - // Record constellation settings - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; // ubxConstellation_BeiDou=1 - snprintf(tempString, sizeof(tempString), "%s%s=%d", rtkSettingsEntries[i].name, settings.ubxConstellations[x].textName, - settings.ubxConstellations[x].enabled); - settingsFile->println(tempString); - } - } - break; - case tEspNowPr: - { - // Record ESP-Now peer MAC addresses - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; // espnowPeer_1=B4:C1:33:42:DE:01, - snprintf(tempString, sizeof(tempString), "%s%d=%02X:%02X:%02X:%02X:%02X:%02X,", rtkSettingsEntries[i].name, x, - settings.espnowPeers[x][0], settings.espnowPeers[x][1], settings.espnowPeers[x][2], - settings.espnowPeers[x][3], settings.espnowPeers[x][4], settings.espnowPeers[x][5]); - settingsFile->println(tempString); - } - } - break; - case tUbMsgRtb: - { - // Record message settings + default: + break; + case _bool: { + bool *ptr = (bool *)rtkSettingsEntries[i].var; + settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, *ptr); + } + break; + case _int: { + int *ptr = (int *)rtkSettingsEntries[i].var; + settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, *ptr); + } + break; + case _float: { + float *ptr = (float *)rtkSettingsEntries[i].var; + settingsFile->printf("%s=%0.*f\r\n", rtkSettingsEntries[i].name, rtkSettingsEntries[i].qualifier, *ptr); + } + break; + case _double: { + double *ptr = (double *)rtkSettingsEntries[i].var; + settingsFile->printf("%s=%0.*f\r\n", rtkSettingsEntries[i].name, rtkSettingsEntries[i].qualifier, *ptr); + } + break; + case _uint8_t: { + uint8_t *ptr = (uint8_t *)rtkSettingsEntries[i].var; + settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, *ptr); + } + break; + case _uint16_t: { + uint16_t *ptr = (uint16_t *)rtkSettingsEntries[i].var; + settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, *ptr); + } + break; + case _uint32_t: { + uint32_t *ptr = (uint32_t *)rtkSettingsEntries[i].var; + settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, *ptr); + } + break; + case _uint64_t: { + uint64_t *ptr = (uint64_t *)rtkSettingsEntries[i].var; + settingsFile->printf("%s=%llu\r\n", rtkSettingsEntries[i].name, *ptr); + } + break; + case _int8_t: { + int8_t *ptr = (int8_t *)rtkSettingsEntries[i].var; + settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, *ptr); + } + break; + case _int16_t: { + int16_t *ptr = (int16_t *)rtkSettingsEntries[i].var; + settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, *ptr); + } + break; + case tMuxConn: { + muxConnectionType_e *ptr = (muxConnectionType_e *)rtkSettingsEntries[i].var; + settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, (int)*ptr); + } + break; + case tSysState: { + SystemState *ptr = (SystemState *)rtkSettingsEntries[i].var; + settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, (int)*ptr); + } + break; + case tPulseEdg: { + pulseEdgeType_e *ptr = (pulseEdgeType_e *)rtkSettingsEntries[i].var; + settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, (int)*ptr); + } + break; + case tBtRadio: { + BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)rtkSettingsEntries[i].var; + settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, (int)*ptr); + } + break; + case tPerDisp: { + PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)rtkSettingsEntries[i].var; + settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, (int)*ptr); + } + break; + case tCoordInp: { + CoordinateInputType *ptr = (CoordinateInputType *)rtkSettingsEntries[i].var; + settingsFile->printf("%s=%d\r\n", rtkSettingsEntries[i].name, (int)*ptr); + } + break; + case tCharArry: { + char *ptr = (char *)rtkSettingsEntries[i].var; + settingsFile->printf("%s=%s\r\n", rtkSettingsEntries[i].name, ptr); + } + break; + case _IPString: { + IPAddress *ptr = (IPAddress *)rtkSettingsEntries[i].var; + settingsFile->printf("%s=%s\r\n", rtkSettingsEntries[i].name, ptr->toString().c_str()); + // Note: toString separates the four bytes with dots / periods "192.168.1.1" + } + break; + case tUbxMsgRt: { + // Record message settings + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; // ubxMessageRate_UBX_NMEA_DTM=5 + snprintf(tempString, sizeof(tempString), "%s%s=%d", rtkSettingsEntries[i].name, + ubxMessages[x].msgTextName, settings.ubxMessageRates[x]); + settingsFile->println(tempString); + } + } + break; + case tUbxConst: { + // Record constellation settings + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; // ubxConstellation_BeiDou=1 + snprintf(tempString, sizeof(tempString), "%s%s=%d", rtkSettingsEntries[i].name, + settings.ubxConstellations[x].textName, settings.ubxConstellations[x].enabled); + settingsFile->println(tempString); + } + } + break; + case tEspNowPr: { + // Record ESP-Now peer MAC addresses + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; // espnowPeer_1=B4:C1:33:42:DE:01, + snprintf(tempString, sizeof(tempString), "%s%d=%02X:%02X:%02X:%02X:%02X:%02X,", + rtkSettingsEntries[i].name, x, settings.espnowPeers[x][0], settings.espnowPeers[x][1], + settings.espnowPeers[x][2], settings.espnowPeers[x][3], settings.espnowPeers[x][4], + settings.espnowPeers[x][5]); + settingsFile->println(tempString); + } + } + break; + case tUbMsgRtb: { + // Record message settings - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; // ubxMessageRateBase_UBX_NMEA_DTM=5 - snprintf(tempString, sizeof(tempString), "%s%s=%d", rtkSettingsEntries[i].name, ubxMessages[firstRTCMRecord + x].msgTextName, - settings.ubxMessageRatesBase[x]); - settingsFile->println(tempString); - } - } - break; - case tWiFiNet: - { - // Record WiFi credential table - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[100]; // wifiNetwork_0Password=parachutes - - snprintf(tempString, sizeof(tempString), "%s%dSSID=%s", rtkSettingsEntries[i].name, x, settings.wifiNetworks[x].ssid); - settingsFile->println(tempString); - snprintf(tempString, sizeof(tempString), "%s%dPassword=%s", rtkSettingsEntries[i].name, x, settings.wifiNetworks[x].password); - settingsFile->println(tempString); - } - } - break; - case tNSCHost: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - settingsFile->printf("%s%d=%s\r\n", rtkSettingsEntries[i].name, x, - &settings.ntripServer_CasterHost[x][0]); - } - } - break; - case tNSCPort: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - settingsFile->printf("%s%d=%d\r\n", rtkSettingsEntries[i].name, x, - settings.ntripServer_CasterPort[x]); - } - } - break; - case tNSCUser: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - settingsFile->printf("%s%d=%s\r\n", rtkSettingsEntries[i].name, x, - &settings.ntripServer_CasterUser[x][0]); - } - } - break; - case tNSCUsrPw: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - settingsFile->printf("%s%d=%s\r\n", rtkSettingsEntries[i].name, x, - &settings.ntripServer_CasterUserPW[x][0]); - } - } - break; - case tNSMtPt: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - settingsFile->printf("%s%d=%s\r\n", rtkSettingsEntries[i].name, x, - &settings.ntripServer_MountPoint[x][0]); - } - } - break; - case tNSMtPtPw: - { - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - settingsFile->printf("%s%d=%s\r\n", rtkSettingsEntries[i].name, x, - &settings.ntripServer_MountPointPW[x][0]); - } - } - break; - case tUmMRNmea: - { - // Record UM980 NMEA rates - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; // um980MessageRatesNMEA_GPDTM=0.05 - snprintf(tempString, sizeof(tempString), "%s%s=%0.2f", rtkSettingsEntries[i].name, umMessagesNMEA[x].msgTextName, - settings.um980MessageRatesNMEA[x]); - settingsFile->println(tempString); - } - } - break; - case tUmMRRvRT: - { - // Record UM980 Rover RTCM rates - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; // um980MessageRatesRTCMRover_RTCM1001=0.2 - snprintf(tempString, sizeof(tempString), "%s%s=%0.2f", rtkSettingsEntries[i].name, umMessagesRTCM[x].msgTextName, - settings.um980MessageRatesRTCMRover[x]); - settingsFile->println(tempString); - } - } - break; - case tUmMRBaRT: - { - // Record UM980 Base RTCM rates - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; // um980MessageRatesRTCMBase_RTCM1001=0.2 - snprintf(tempString, sizeof(tempString), "%s%s=%0.2f", rtkSettingsEntries[i].name, umMessagesRTCM[x].msgTextName, - settings.um980MessageRatesRTCMBase[x]); - settingsFile->println(tempString); - } - } - break; - case tUmConst: - { - // Record UM980 Constellations - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[50]; // um980Constellations_GLONASS=1 - snprintf(tempString, sizeof(tempString), "%s%s=%0d", rtkSettingsEntries[i].name, um980ConstellationCommands[x].textName, - settings.um980Constellations[x]); - settingsFile->println(tempString); - } - } - break; - case tCorrSPri: - { - // Record corrections priorities - for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) - { - char tempString[80]; // correctionsPriority_Ethernet_IP_(PointPerfect/MQTT)=99 - snprintf(tempString, sizeof(tempString), "%s%s=%0d", rtkSettingsEntries[i].name, correctionsSourceNames[x], - settings.correctionsSourcesPriority[x]); - settingsFile->println(tempString); - } - } - break; - case tRegCorTp: - { - for (int r = 0; r < rtkSettingsEntries[i].qualifier; r++) - { - settingsFile->printf("%s%d=%s\r\n", rtkSettingsEntries[i].name, r, - &settings.regionalCorrectionTopics[r][0]); - } - } - break; + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; // ubxMessageRateBase_UBX_NMEA_DTM=5 + snprintf(tempString, sizeof(tempString), "%s%s=%d", rtkSettingsEntries[i].name, + ubxMessages[firstRTCMRecord + x].msgTextName, settings.ubxMessageRatesBase[x]); + settingsFile->println(tempString); + } + } + break; + case tWiFiNet: { + // Record WiFi credential table + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[100]; // wifiNetwork_0Password=parachutes + + snprintf(tempString, sizeof(tempString), "%s%dSSID=%s", rtkSettingsEntries[i].name, x, + settings.wifiNetworks[x].ssid); + settingsFile->println(tempString); + snprintf(tempString, sizeof(tempString), "%s%dPassword=%s", rtkSettingsEntries[i].name, x, + settings.wifiNetworks[x].password); + settingsFile->println(tempString); + } + } + break; + case tNSCHost: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + settingsFile->printf("%s%d=%s\r\n", rtkSettingsEntries[i].name, x, + &settings.ntripServer_CasterHost[x][0]); + } + } + break; + case tNSCPort: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + settingsFile->printf("%s%d=%d\r\n", rtkSettingsEntries[i].name, x, settings.ntripServer_CasterPort[x]); + } + } + break; + case tNSCUser: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + settingsFile->printf("%s%d=%s\r\n", rtkSettingsEntries[i].name, x, + &settings.ntripServer_CasterUser[x][0]); + } + } + break; + case tNSCUsrPw: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + settingsFile->printf("%s%d=%s\r\n", rtkSettingsEntries[i].name, x, + &settings.ntripServer_CasterUserPW[x][0]); + } + } + break; + case tNSMtPt: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + settingsFile->printf("%s%d=%s\r\n", rtkSettingsEntries[i].name, x, + &settings.ntripServer_MountPoint[x][0]); + } + } + break; + case tNSMtPtPw: { + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + settingsFile->printf("%s%d=%s\r\n", rtkSettingsEntries[i].name, x, + &settings.ntripServer_MountPointPW[x][0]); + } + } + break; + case tUmMRNmea: { + // Record UM980 NMEA rates + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; // um980MessageRatesNMEA_GPDTM=0.05 + snprintf(tempString, sizeof(tempString), "%s%s=%0.2f", rtkSettingsEntries[i].name, + umMessagesNMEA[x].msgTextName, settings.um980MessageRatesNMEA[x]); + settingsFile->println(tempString); + } + } + break; + case tUmMRRvRT: { + // Record UM980 Rover RTCM rates + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; // um980MessageRatesRTCMRover_RTCM1001=0.2 + snprintf(tempString, sizeof(tempString), "%s%s=%0.2f", rtkSettingsEntries[i].name, + umMessagesRTCM[x].msgTextName, settings.um980MessageRatesRTCMRover[x]); + settingsFile->println(tempString); + } + } + break; + case tUmMRBaRT: { + // Record UM980 Base RTCM rates + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; // um980MessageRatesRTCMBase_RTCM1001=0.2 + snprintf(tempString, sizeof(tempString), "%s%s=%0.2f", rtkSettingsEntries[i].name, + umMessagesRTCM[x].msgTextName, settings.um980MessageRatesRTCMBase[x]); + settingsFile->println(tempString); + } + } + break; + case tUmConst: { + // Record UM980 Constellations + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[50]; // um980Constellations_GLONASS=1 + snprintf(tempString, sizeof(tempString), "%s%s=%0d", rtkSettingsEntries[i].name, + um980ConstellationCommands[x].textName, settings.um980Constellations[x]); + settingsFile->println(tempString); + } + } + break; + case tCorrSPri: { + // Record corrections priorities + for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) + { + char tempString[80]; // correctionsPriority_Ethernet_IP_(PointPerfect/MQTT)=99 + snprintf(tempString, sizeof(tempString), "%s%s=%0d", rtkSettingsEntries[i].name, + correctionsSourceNames[x], settings.correctionsSourcesPriority[x]); + settingsFile->println(tempString); + } + } + break; + case tRegCorTp: { + for (int r = 0; r < rtkSettingsEntries[i].qualifier; r++) + { + settingsFile->printf("%s%d=%s\r\n", rtkSettingsEntries[i].name, r, + &settings.regionalCorrectionTopics[r][0]); + } + } + break; } } @@ -895,20 +860,13 @@ bool parseLine(char *str) // Do nothing. Just read it to avoid 'Unknown setting' error else { - const char * table[] = - { - "gnssFirmwareVersion", - "gnssUniqueId", - "neoFirmwareVersion", - "rtkFirmwareVersion", - "rtkIdentifier", - "runLogTest", + const char *table[] = { + "gnssFirmwareVersion", "gnssUniqueId", "neoFirmwareVersion", + "rtkFirmwareVersion", "rtkIdentifier", "runLogTest", }; const int tableEntries = sizeof(table) / sizeof(table[0]); - knownSetting = commandCheckForUnknownVariable(settingName, - table, - tableEntries); + knownSetting = commandCheckForUnknownVariable(settingName, table, tableEntries); } if (knownSetting == false) @@ -924,9 +882,7 @@ bool parseLine(char *str) double settingValue; // Loop through the valid command entries - i = commandLookupSettingName(settingName, - truncatedName, sizeof(truncatedName), - suffix, sizeof(suffix)); + i = commandLookupSettingName(settingName, truncatedName, sizeof(truncatedName), suffix, sizeof(suffix)); // Determine if settingName is in the command table if (i >= 0) @@ -939,347 +895,328 @@ bool parseLine(char *str) { default: break; - case _bool: - { - bool *ptr = (bool *)var; - *ptr = (bool)d; - knownSetting = true; - } - break; - case _int: - { - int *ptr = (int *)var; - *ptr = (int)d; - knownSetting = true; - } - break; - case _float: - { - float *ptr = (float *)var; - *ptr = (float)d; - knownSetting = true; - } - break; - case _double: - { - double *ptr = (double *)var; - *ptr = d; - knownSetting = true; - } - break; - case _uint8_t: - { - uint8_t *ptr = (uint8_t *)var; - *ptr = (uint8_t)d; - knownSetting = true; - } - break; - case _uint16_t: - { - uint16_t *ptr = (uint16_t *)var; - *ptr = (uint16_t)d; - knownSetting = true; - } - break; - case _uint32_t: - { - uint32_t *ptr = (uint32_t *)var; - *ptr = (uint32_t)d; - knownSetting = true; - } - break; - case _uint64_t: - { - uint64_t *ptr = (uint64_t *)var; - *ptr = (uint64_t)d; - knownSetting = true; - } - break; - case _int8_t: - { - int8_t *ptr = (int8_t *)var; - *ptr = (int8_t)d; - knownSetting = true; - } - break; - case _int16_t: - { - int16_t *ptr = (int16_t *)var; - *ptr = (int16_t)d; - knownSetting = true; - } - break; - case tMuxConn: - { - muxConnectionType_e *ptr = (muxConnectionType_e *)var; - *ptr = (muxConnectionType_e)d; - knownSetting = true; - } - break; - case tSysState: - { - SystemState *ptr = (SystemState *)var; - *ptr = (SystemState)d; - knownSetting = true; - } - break; - case tPulseEdg: - { - pulseEdgeType_e *ptr = (pulseEdgeType_e *)var; - *ptr = (pulseEdgeType_e)d; - knownSetting = true; - } - break; - case tBtRadio: - { - BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)var; - *ptr = (BluetoothRadioType_e)d; - knownSetting = true; - } - break; - case tPerDisp: - { - PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)var; - *ptr = (PeriodicDisplay_t)d; - knownSetting = true; - } - break; - case tCoordInp: - { - CoordinateInputType *ptr = (CoordinateInputType *)var; - *ptr = (CoordinateInputType)d; - knownSetting = true; - } - break; - case tCharArry: - { - char *ptr = (char *)var; - strncpy(ptr, settingString, qualifier); - // strncpy pads with zeros. No need to add them here for ntpReferenceId - knownSetting = true; - } - break; - case _IPString: - { - String tempString = String(settingString); - IPAddress *ptr = (IPAddress *)var; - ptr->fromString(tempString); - knownSetting = true; - } - break; - case tUbxMsgRt: + case _bool: { + bool *ptr = (bool *)var; + *ptr = (bool)d; + knownSetting = true; + } + break; + case _int: { + int *ptr = (int *)var; + *ptr = (int)d; + knownSetting = true; + } + break; + case _float: { + float *ptr = (float *)var; + *ptr = (float)d; + knownSetting = true; + } + break; + case _double: { + double *ptr = (double *)var; + *ptr = d; + knownSetting = true; + } + break; + case _uint8_t: { + uint8_t *ptr = (uint8_t *)var; + *ptr = (uint8_t)d; + knownSetting = true; + } + break; + case _uint16_t: { + uint16_t *ptr = (uint16_t *)var; + *ptr = (uint16_t)d; + knownSetting = true; + } + break; + case _uint32_t: { + uint32_t *ptr = (uint32_t *)var; + *ptr = (uint32_t)d; + knownSetting = true; + } + break; + case _uint64_t: { + uint64_t *ptr = (uint64_t *)var; + *ptr = (uint64_t)d; + knownSetting = true; + } + break; + case _int8_t: { + int8_t *ptr = (int8_t *)var; + *ptr = (int8_t)d; + knownSetting = true; + } + break; + case _int16_t: { + int16_t *ptr = (int16_t *)var; + *ptr = (int16_t)d; + knownSetting = true; + } + break; + case tMuxConn: { + muxConnectionType_e *ptr = (muxConnectionType_e *)var; + *ptr = (muxConnectionType_e)d; + knownSetting = true; + } + break; + case tSysState: { + SystemState *ptr = (SystemState *)var; + *ptr = (SystemState)d; + knownSetting = true; + } + break; + case tPulseEdg: { + pulseEdgeType_e *ptr = (pulseEdgeType_e *)var; + *ptr = (pulseEdgeType_e)d; + knownSetting = true; + } + break; + case tBtRadio: { + BluetoothRadioType_e *ptr = (BluetoothRadioType_e *)var; + *ptr = (BluetoothRadioType_e)d; + knownSetting = true; + } + break; + case tPerDisp: { + PeriodicDisplay_t *ptr = (PeriodicDisplay_t *)var; + *ptr = (PeriodicDisplay_t)d; + knownSetting = true; + } + break; + case tCoordInp: { + CoordinateInputType *ptr = (CoordinateInputType *)var; + *ptr = (CoordinateInputType)d; + knownSetting = true; + } + break; + case tCharArry: { + char *ptr = (char *)var; + strncpy(ptr, settingString, qualifier); + // strncpy pads with zeros. No need to add them here for ntpReferenceId + knownSetting = true; + } + break; + case _IPString: { + String tempString = String(settingString); + IPAddress *ptr = (IPAddress *)var; + ptr->fromString(tempString); + knownSetting = true; + } + break; + case tUbxMsgRt: { + for (int x = 0; x < qualifier; x++) { - for (int x = 0; x < qualifier; x++) + if ((suffix[0] == ubxMessages[x].msgTextName[0]) && + (strcmp(suffix, ubxMessages[x].msgTextName) == 0)) { - if ((suffix[0] == ubxMessages[x].msgTextName[0]) && (strcmp(suffix, ubxMessages[x].msgTextName) == 0)) - { - settings.ubxMessageRates[x] = (uint8_t)d; - knownSetting = true; - break; - } + settings.ubxMessageRates[x] = (uint8_t)d; + knownSetting = true; + break; } } - break; - case tUbxConst: + } + break; + case tUbxConst: { + for (int x = 0; x < qualifier; x++) { - for (int x = 0; x < qualifier; x++) + if ((suffix[0] == settings.ubxConstellations[x].textName[0]) && + (strcmp(suffix, settings.ubxConstellations[x].textName) == 0)) { - if ((suffix[0] == settings.ubxConstellations[x].textName[0]) && (strcmp(suffix, settings.ubxConstellations[x].textName) == 0)) - { - settings.ubxConstellations[x].enabled = d; - knownSetting = true; - break; - } + settings.ubxConstellations[x].enabled = d; + knownSetting = true; + break; } } - break; - case tEspNowPr: + } + break; + case tEspNowPr: { + int suffixNum; + if (sscanf(suffix, "%d", &suffixNum) == 1) { - int suffixNum; - if (sscanf(suffix, "%d", &suffixNum) == 1) + int mac[6]; + if (sscanf(settingString, "%X:%X:%X:%X:%X:%X", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], + &mac[5]) == 6) { - int mac[6]; - if (sscanf(settingString, "%X:%X:%X:%X:%X:%X", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6) - { - for (int i = 0; i < 6; i++) - settings.espnowPeers[suffixNum][i] = mac[i]; - knownSetting = true; - } + for (int i = 0; i < 6; i++) + settings.espnowPeers[suffixNum][i] = mac[i]; + knownSetting = true; } } - break; - case tUbMsgRtb: - { - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + } + break; + case tUbMsgRtb: { + int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); - for (int x = 0; x < qualifier; x++) - { - if ((suffix[0] == ubxMessages[firstRTCMRecord + x].msgTextName[0]) && (strcmp(suffix, ubxMessages[firstRTCMRecord + x].msgTextName) == 0)) - { - settings.ubxMessageRatesBase[x] = (uint8_t)d; - knownSetting = true; - break; - } - } - } - break; - case tWiFiNet: + for (int x = 0; x < qualifier; x++) { - int network; - - if (strstr(suffix, "SSID") != nullptr) + if ((suffix[0] == ubxMessages[firstRTCMRecord + x].msgTextName[0]) && + (strcmp(suffix, ubxMessages[firstRTCMRecord + x].msgTextName) == 0)) { - if (sscanf(suffix, "%dSSID", &network) == 1) - { - strncpy(settings.wifiNetworks[network].ssid, settingString, sizeof(settings.wifiNetworks[0].ssid)); - knownSetting = true; - } - } - else if (strstr(suffix, "Password") != nullptr) - { - if (sscanf(suffix, "%dPassword", &network) == 1) - { - strncpy(settings.wifiNetworks[network].password, settingString, sizeof(settings.wifiNetworks[0].password)); - knownSetting = true; - } + settings.ubxMessageRatesBase[x] = (uint8_t)d; + knownSetting = true; + break; } } - break; - case tNSCHost: + } + break; + case tWiFiNet: { + int network; + + if (strstr(suffix, "SSID") != nullptr) { - int server; - if (sscanf(suffix, "%d", &server) == 1) + if (sscanf(suffix, "%dSSID", &network) == 1) { - strncpy(&settings.ntripServer_CasterHost[server][0], settingString, sizeof(settings.ntripServer_CasterHost[server])); + strncpy(settings.wifiNetworks[network].ssid, settingString, + sizeof(settings.wifiNetworks[0].ssid)); knownSetting = true; } } - break; - case tNSCPort: + else if (strstr(suffix, "Password") != nullptr) { - int server; - if (sscanf(suffix, "%d", &server) == 1) + if (sscanf(suffix, "%dPassword", &network) == 1) { - settings.ntripServer_CasterPort[server] = d; + strncpy(settings.wifiNetworks[network].password, settingString, + sizeof(settings.wifiNetworks[0].password)); knownSetting = true; } } - break; - case tNSCUser: + } + break; + case tNSCHost: { + int server; + if (sscanf(suffix, "%d", &server) == 1) { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - strncpy(&settings.ntripServer_CasterUser[server][0], settingString, sizeof(settings.ntripServer_CasterUser[server])); - knownSetting = true; - } + strncpy(&settings.ntripServer_CasterHost[server][0], settingString, + sizeof(settings.ntripServer_CasterHost[server])); + knownSetting = true; } - break; - case tNSCUsrPw: + } + break; + case tNSCPort: { + int server; + if (sscanf(suffix, "%d", &server) == 1) { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - strncpy(&settings.ntripServer_CasterUserPW[server][0], settingString, sizeof(settings.ntripServer_CasterUserPW[server])); - knownSetting = true; - } + settings.ntripServer_CasterPort[server] = d; + knownSetting = true; } - break; - case tNSMtPt: + } + break; + case tNSCUser: { + int server; + if (sscanf(suffix, "%d", &server) == 1) { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - strncpy(&settings.ntripServer_MountPoint[server][0], settingString, sizeof(settings.ntripServer_MountPoint[server])); - knownSetting = true; - } + strncpy(&settings.ntripServer_CasterUser[server][0], settingString, + sizeof(settings.ntripServer_CasterUser[server])); + knownSetting = true; } - break; - case tNSMtPtPw: + } + break; + case tNSCUsrPw: { + int server; + if (sscanf(suffix, "%d", &server) == 1) { - int server; - if (sscanf(suffix, "%d", &server) == 1) - { - strncpy(&settings.ntripServer_MountPointPW[server][0], settingString, sizeof(settings.ntripServer_MountPointPW[server])); - knownSetting = true; - } + strncpy(&settings.ntripServer_CasterUserPW[server][0], settingString, + sizeof(settings.ntripServer_CasterUserPW[server])); + knownSetting = true; } - break; - case tUmMRNmea: + } + break; + case tNSMtPt: { + int server; + if (sscanf(suffix, "%d", &server) == 1) { - for (int x = 0; x < qualifier; x++) - { - if ((suffix[0] == umMessagesNMEA[x].msgTextName[0]) && (strcmp(suffix, umMessagesNMEA[x].msgTextName) == 0)) - { - settings.um980MessageRatesNMEA[x] = d; - knownSetting = true; - break; - } - } + strncpy(&settings.ntripServer_MountPoint[server][0], settingString, + sizeof(settings.ntripServer_MountPoint[server])); + knownSetting = true; } - break; - case tUmMRRvRT: + } + break; + case tNSMtPtPw: { + int server; + if (sscanf(suffix, "%d", &server) == 1) + { + strncpy(&settings.ntripServer_MountPointPW[server][0], settingString, + sizeof(settings.ntripServer_MountPointPW[server])); + knownSetting = true; + } + } + break; + case tUmMRNmea: { + for (int x = 0; x < qualifier; x++) { - for (int x = 0; x < qualifier; x++) + if ((suffix[0] == umMessagesNMEA[x].msgTextName[0]) && + (strcmp(suffix, umMessagesNMEA[x].msgTextName) == 0)) { - if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) - { - settings.um980MessageRatesRTCMRover[x] = d; - knownSetting = true; - break; - } + settings.um980MessageRatesNMEA[x] = d; + knownSetting = true; + break; } } - break; - case tUmMRBaRT: + } + break; + case tUmMRRvRT: { + for (int x = 0; x < qualifier; x++) { - for (int x = 0; x < qualifier; x++) + if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && + (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) { - if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) - { - settings.um980MessageRatesRTCMBase[x] = d; - knownSetting = true; - break; - } + settings.um980MessageRatesRTCMRover[x] = d; + knownSetting = true; + break; } } - break; - case tUmConst: + } + break; + case tUmMRBaRT: { + for (int x = 0; x < qualifier; x++) { - for (int x = 0; x < qualifier; x++) + if ((suffix[0] == umMessagesRTCM[x].msgTextName[0]) && + (strcmp(suffix, umMessagesRTCM[x].msgTextName) == 0)) { - if ((suffix[0] == um980ConstellationCommands[x].textName[0]) && (strcmp(suffix, um980ConstellationCommands[x].textName) == 0)) - { - settings.um980Constellations[x] = d; - knownSetting = true; - break; - } + settings.um980MessageRatesRTCMBase[x] = d; + knownSetting = true; + break; } } - break; - case tCorrSPri: + } + break; + case tUmConst: { + for (int x = 0; x < qualifier; x++) { - for (int x = 0; x < qualifier; x++) + if ((suffix[0] == um980ConstellationCommands[x].textName[0]) && + (strcmp(suffix, um980ConstellationCommands[x].textName) == 0)) { - if ((suffix[0] == correctionsSourceNames[x][0]) && (strcmp(suffix, correctionsSourceNames[x]) == 0)) - { - settings.correctionsSourcesPriority[x] = d; - knownSetting = true; - break; - } + settings.um980Constellations[x] = d; + knownSetting = true; + break; } } - break; - case tRegCorTp: + } + break; + case tCorrSPri: { + for (int x = 0; x < qualifier; x++) { - int region; - if (sscanf(suffix, "%d", ®ion) == 1) + if ((suffix[0] == correctionsSourceNames[x][0]) && (strcmp(suffix, correctionsSourceNames[x]) == 0)) { - strncpy(&settings.regionalCorrectionTopics[region][0], settingString, sizeof(settings.regionalCorrectionTopics[0])); + settings.correctionsSourcesPriority[x] = d; knownSetting = true; + break; } } - break; + } + break; + case tRegCorTp: { + int region; + if (sscanf(suffix, "%d", ®ion) == 1) + { + strncpy(&settings.regionalCorrectionTopics[region][0], settingString, + sizeof(settings.regionalCorrectionTopics[0])); + knownSetting = true; + } + } + break; } } } From a34b20cde2cde53cd67f65d93f328753ab8565af Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 23 May 2024 13:43:07 -0600 Subject: [PATCH 088/358] Rename specific functions with platform specific prefix --- Firmware/RTK_Everywhere/Form.ino | 6 +- Firmware/RTK_Everywhere/GNSS.ino | 2 +- Firmware/RTK_Everywhere/UM980.ino | 2 +- Firmware/RTK_Everywhere/ZED.ino | 225 +++++++++++++++++------ Firmware/RTK_Everywhere/menuCommands.ino | 8 +- Firmware/RTK_Everywhere/menuMessages.ino | 159 ++++------------ 6 files changed, 215 insertions(+), 187 deletions(-) diff --git a/Firmware/RTK_Everywhere/Form.ino b/Firmware/RTK_Everywhere/Form.ino index 9e9995eaa..a6f23dd37 100644 --- a/Firmware/RTK_Everywhere/Form.ino +++ b/Firmware/RTK_Everywhere/Form.ino @@ -865,12 +865,12 @@ void createMessageListBase(String &returnText) if (present.gnss_zedf9p) { - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + int firstRTCMRecord = zedGetMessageNumberByName("UBX_RTCM_1005"); for (int messageNumber = 0; messageNumber < MAX_UBX_MSG_RTCM; messageNumber++) { if (messageSupported(firstRTCMRecord + messageNumber) == true) - returnText += "ubxMessageRateBase_" + String(ubxMessages[messageNumber + firstRTCMRecord].msgTextName) + "," + + returnText += "MessageRateBase_" + String(ubxMessages[messageNumber + firstRTCMRecord].msgTextName) + "," + String(settings.ubxMessageRatesBase[messageNumber]) + ","; // UBX_RTCM_1074Base,4, } } @@ -879,7 +879,7 @@ void createMessageListBase(String &returnText) { for (int messageNumber = 0; messageNumber < MAX_UM980_RTCM_MSG; messageNumber++) { - returnText += "um980MessageRatesRTCMBase_" + String(umMessagesRTCM[messageNumber].msgTextName) + "," + + returnText += "MessageRatesRTCMBase_" + String(umMessagesRTCM[messageNumber].msgTextName) + "," + String(settings.um980MessageRatesRTCMBase[messageNumber]) + ","; } } diff --git a/Firmware/RTK_Everywhere/GNSS.ino b/Firmware/RTK_Everywhere/GNSS.ino index 9d6adad64..ad44dc19a 100644 --- a/Firmware/RTK_Everywhere/GNSS.ino +++ b/Firmware/RTK_Everywhere/GNSS.ino @@ -1198,7 +1198,7 @@ void gnssMenuMessageBaseRtcm() { if (present.gnss_zedf9p) { - menuMessagesSubtype(settings.ubxMessageRatesBase, "RTCM-Base"); + zedMenuMessagesSubtype(settings.ubxMessageRatesBase, "RTCM-Base"); } else if (present.gnss_um980) { diff --git a/Firmware/RTK_Everywhere/UM980.ino b/Firmware/RTK_Everywhere/UM980.ino index f34b304ca..466256d17 100644 --- a/Firmware/RTK_Everywhere/UM980.ino +++ b/Firmware/RTK_Everywhere/UM980.ino @@ -1091,7 +1091,7 @@ uint8_t um980GetMessageNumberByName(const char *msgName) return (x); } - systemPrintf("getMessageNumberByName: %s not found\r\n", msgName); + systemPrintf("um980GetMessageNumberByName: %s not found\r\n", msgName); return (0); } diff --git a/Firmware/RTK_Everywhere/ZED.ino b/Firmware/RTK_Everywhere/ZED.ino index db5dcdb3d..15addaf9a 100644 --- a/Firmware/RTK_Everywhere/ZED.ino +++ b/Firmware/RTK_Everywhere/ZED.ino @@ -359,7 +359,7 @@ bool zedConfigure() if (commandSupported(UBLOX_CFG_NAV2_OUT_ENABLED) == true) { // Count NAV2 messages and enable NAV2 as needed. - if (getNAV2MessageCount() > 0) + if (zedGetNAV2MessageCount() > 0) { response &= theGNSS->addCfgValset( UBLOX_CFG_NAV2_OUT_ENABLED, @@ -497,7 +497,7 @@ bool zedConfigureRover() // product - in Rover mode - we want to leave any RTCM messages enabled on SPI so they can be logged if desired. // Find first RTCM record in ubxMessage array - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + int firstRTCMRecord = zedGetMessageNumberByName("UBX_RTCM_1005"); // Set RTCM messages to user's settings for (int x = 0; x < MAX_UBX_MSG_RTCM; x++) @@ -600,7 +600,7 @@ bool zedConfigureBase() // (Tertiary) UART1 in case RTK device is sending RTCM to a phone that is then NTRIP Caster // Find first RTCM record in ubxMessage array - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + int firstRTCMRecord = zedGetMessageNumberByName("UBX_RTCM_1005"); // ubxMessageRatesBase is an array of ~12 uint8_ts // ubxMessage is an array of ~80 messages @@ -1053,7 +1053,7 @@ bool zedSetRate(double secondsBetweenSolutions) response &= theGNSS->addCfgValset(UBLOX_CFG_RATE_MEAS, measRate); response &= theGNSS->addCfgValset(UBLOX_CFG_RATE_NAV, navRate); - int gsvRecordNumber = getMessageNumberByName("UBX_NMEA_GSV"); + int gsvRecordNumber = zedGetMessageNumberByName("UBX_NMEA_GSV"); // If enabled, adjust GSV NMEA to be reported at 1Hz to avoid swamping SPP connection if (settings.ubxMessageRates[gsvRecordNumber] > 0) @@ -1064,7 +1064,7 @@ bool zedSetRate(double secondsBetweenSolutions) log_d("Adjusting GSV setting to %f", measurementFrequency); - setMessageRateByName("UBX_NMEA_GSV", measurementFrequency); // Update GSV setting in file + zedSetMessageRateByName("UBX_NMEA_GSV", measurementFrequency); // Update GSV setting in file response &= theGNSS->addCfgValset(ubxMessages[gsvRecordNumber].msgConfigKey, settings.ubxMessageRates[gsvRecordNumber]); // Update rate on module } @@ -1569,56 +1569,56 @@ void zedMenuMessages() int incoming = getUserInputNumber(); // Returns EXIT, TIMEOUT, or long if (incoming == 1) - menuMessagesSubtype(settings.ubxMessageRates, "NMEA_"); // The following _ avoids listing NMEANAV2 messages + zedMenuMessagesSubtype(settings.ubxMessageRates, "NMEA_"); // The following _ avoids listing NMEANAV2 messages else if (incoming == 2) - menuMessagesSubtype(settings.ubxMessageRates, "RTCM"); + zedMenuMessagesSubtype(settings.ubxMessageRates, "RTCM"); else if (incoming == 3) - menuMessagesSubtype(settings.ubxMessageRates, "RXM"); + zedMenuMessagesSubtype(settings.ubxMessageRates, "RXM"); else if (incoming == 4) - menuMessagesSubtype(settings.ubxMessageRates, "NAV_"); // The following _ avoids listing NAV2 messages + zedMenuMessagesSubtype(settings.ubxMessageRates, "NAV_"); // The following _ avoids listing NAV2 messages else if (incoming == 5) - menuMessagesSubtype(settings.ubxMessageRates, "NAV2"); + zedMenuMessagesSubtype(settings.ubxMessageRates, "NAV2"); else if (incoming == 6) - menuMessagesSubtype(settings.ubxMessageRates, "NMEANAV2"); + zedMenuMessagesSubtype(settings.ubxMessageRates, "NMEANAV2"); else if (incoming == 7) - menuMessagesSubtype(settings.ubxMessageRates, "MON"); + zedMenuMessagesSubtype(settings.ubxMessageRates, "MON"); else if (incoming == 8) - menuMessagesSubtype(settings.ubxMessageRates, "TIM"); + zedMenuMessagesSubtype(settings.ubxMessageRates, "TIM"); else if (incoming == 9) - menuMessagesSubtype(settings.ubxMessageRates, "PUBX"); + zedMenuMessagesSubtype(settings.ubxMessageRates, "PUBX"); else if (incoming == 10) { setGNSSMessageRates(settings.ubxMessageRates, 0); // Turn off all messages - setMessageRateByName("UBX_NMEA_GGA", 1); - setMessageRateByName("UBX_NMEA_GSA", 1); - setMessageRateByName("UBX_NMEA_GST", 1); + zedSetMessageRateByName("UBX_NMEA_GGA", 1); + zedSetMessageRateByName("UBX_NMEA_GSA", 1); + zedSetMessageRateByName("UBX_NMEA_GST", 1); // We want GSV NMEA to be reported at 1Hz to avoid swamping SPP connection float measurementFrequency = (1000.0 / settings.measurementRateMs) / settings.navigationRate; if (measurementFrequency < 1.0) measurementFrequency = 1.0; - setMessageRateByName("UBX_NMEA_GSV", measurementFrequency); // One report per second + zedSetMessageRateByName("UBX_NMEA_GSV", measurementFrequency); // One report per second - setMessageRateByName("UBX_NMEA_RMC", 1); + zedSetMessageRateByName("UBX_NMEA_RMC", 1); systemPrintln("Reset to Surveying Defaults (NMEAx5)"); } else if (incoming == 11) { setGNSSMessageRates(settings.ubxMessageRates, 0); // Turn off all messages - setMessageRateByName("UBX_NMEA_GGA", 1); - setMessageRateByName("UBX_NMEA_GSA", 1); - setMessageRateByName("UBX_NMEA_GST", 1); + zedSetMessageRateByName("UBX_NMEA_GGA", 1); + zedSetMessageRateByName("UBX_NMEA_GSA", 1); + zedSetMessageRateByName("UBX_NMEA_GST", 1); // We want GSV NMEA to be reported at 1Hz to avoid swamping SPP connection float measurementFrequency = (1000.0 / settings.measurementRateMs) / settings.navigationRate; if (measurementFrequency < 1.0) measurementFrequency = 1.0; - setMessageRateByName("UBX_NMEA_GSV", measurementFrequency); // One report per second + zedSetMessageRateByName("UBX_NMEA_GSV", measurementFrequency); // One report per second - setMessageRateByName("UBX_NMEA_RMC", 1); + zedSetMessageRateByName("UBX_NMEA_RMC", 1); - setMessageRateByName("UBX_RXM_RAWX", 1); - setMessageRateByName("UBX_RXM_SFRBX", 1); + zedSetMessageRateByName("UBX_RXM_RAWX", 1); + zedSetMessageRateByName("UBX_RXM_SFRBX", 1); systemPrintln("Reset to PPP Logging Defaults (NMEAx5 + RXMx2)"); } else if (incoming == 12) @@ -1654,41 +1654,41 @@ void zedMenuMessages() // Set RTCM for base mode to defaults (1005/1074/1084/1094/1124 1Hz & 1230 0.1Hz) void zedBaseRtcmDefault() { - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1005") - firstRTCMRecord] = 1; // 1105 - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1074") - firstRTCMRecord] = 1; // 1074 - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1077") - firstRTCMRecord] = 0; // 1077 - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1084") - firstRTCMRecord] = 1; // 1084 - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1087") - firstRTCMRecord] = 0; // 1087 + int firstRTCMRecord = zedGetMessageNumberByName("UBX_RTCM_1005"); + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1005") - firstRTCMRecord] = 1; // 1105 + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1074") - firstRTCMRecord] = 1; // 1074 + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1077") - firstRTCMRecord] = 0; // 1077 + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1084") - firstRTCMRecord] = 1; // 1084 + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1087") - firstRTCMRecord] = 0; // 1087 - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1094") - firstRTCMRecord] = 1; // 1094 - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1097") - firstRTCMRecord] = 0; // 1097 - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1124") - firstRTCMRecord] = 1; // 1124 - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1127") - firstRTCMRecord] = 0; // 1127 - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1230") - firstRTCMRecord] = 10; // 1230 + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1094") - firstRTCMRecord] = 1; // 1094 + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1097") - firstRTCMRecord] = 0; // 1097 + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1124") - firstRTCMRecord] = 1; // 1124 + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1127") - firstRTCMRecord] = 0; // 1127 + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1230") - firstRTCMRecord] = 10; // 1230 - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_4072_0") - firstRTCMRecord] = 0; // 4072_0 - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_4072_1") - firstRTCMRecord] = 0; // 4072_1 + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_4072_0") - firstRTCMRecord] = 0; // 4072_0 + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_4072_1") - firstRTCMRecord] = 0; // 4072_1 } // Reset to Low Bandwidth Link (1074/1084/1094/1124 0.5Hz & 1005/1230 0.1Hz) void zedBaseRtcmLowDataRate() { - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1005") - firstRTCMRecord] = 10; // 1105 0.1Hz - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1074") - firstRTCMRecord] = 2; // 1074 0.5Hz - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1077") - firstRTCMRecord] = 0; // 1077 - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1084") - firstRTCMRecord] = 2; // 1084 0.5Hz - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1087") - firstRTCMRecord] = 0; // 1087 + int firstRTCMRecord = zedGetMessageNumberByName("UBX_RTCM_1005"); + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1005") - firstRTCMRecord] = 10; // 1105 0.1Hz + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1074") - firstRTCMRecord] = 2; // 1074 0.5Hz + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1077") - firstRTCMRecord] = 0; // 1077 + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1084") - firstRTCMRecord] = 2; // 1084 0.5Hz + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1087") - firstRTCMRecord] = 0; // 1087 - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1094") - firstRTCMRecord] = 2; // 1094 0.5Hz - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1097") - firstRTCMRecord] = 0; // 1097 - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1124") - firstRTCMRecord] = 2; // 1124 0.5Hz - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1127") - firstRTCMRecord] = 0; // 1127 - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_1230") - firstRTCMRecord] = 10; // 1230 0.1Hz + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1094") - firstRTCMRecord] = 2; // 1094 0.5Hz + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1097") - firstRTCMRecord] = 0; // 1097 + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1124") - firstRTCMRecord] = 2; // 1124 0.5Hz + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1127") - firstRTCMRecord] = 0; // 1127 + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_1230") - firstRTCMRecord] = 10; // 1230 0.1Hz - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_4072_0") - firstRTCMRecord] = 0; // 4072_0 - settings.ubxMessageRatesBase[getMessageNumberByName("UBX_RTCM_4072_1") - firstRTCMRecord] = 0; // 4072_1 + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_4072_0") - firstRTCMRecord] = 0; // 4072_0 + settings.ubxMessageRatesBase[zedGetMessageNumberByName("UBX_RTCM_4072_1") - firstRTCMRecord] = 0; // 4072_1 } char *zedGetRtcmDefaultString() @@ -1751,3 +1751,124 @@ void zedMenuConstellations() clearBuffer(); // Empty buffer of any newline chars } + +// Given a unique string, find first and last records containing that string in message array +void zedSetMessageOffsets(const ubxMsg *localMessage, const char *messageType, int &startOfBlock, int &endOfBlock) +{ + if (present.gnss_zedf9p) + { + char messageNamePiece[40]; // UBX_RTCM + snprintf(messageNamePiece, sizeof(messageNamePiece), "UBX_%s", messageType); // Put UBX_ infront of type + + // Find the first occurrence + for (startOfBlock = 0; startOfBlock < MAX_UBX_MSG; startOfBlock++) + { + if (strstr(localMessage[startOfBlock].msgTextName, messageNamePiece) != nullptr) + break; + } + if (startOfBlock == MAX_UBX_MSG) + { + // Error out + startOfBlock = 0; + endOfBlock = 0; + return; + } + + // Find the last occurrence + for (endOfBlock = startOfBlock + 1; endOfBlock < MAX_UBX_MSG; endOfBlock++) + { + if (strstr(localMessage[endOfBlock].msgTextName, messageNamePiece) == nullptr) + break; + } + } + else + systemPrintln("zedSetMessageOffsets() Platform not supported"); +} + +// Count the number of NAV2 messages with rates more than 0. Used for determining if we need the enable +// the global NAV2 feature. +uint8_t zedGetNAV2MessageCount() +{ + if (present.gnss_zedf9p) + { + int enabledMessages = 0; + int startOfBlock = 0; + int endOfBlock = 0; + + zedSetMessageOffsets(&ubxMessages[0], "NAV2", startOfBlock, + endOfBlock); // Find start and stop of given messageType in message array + + for (int x = 0; x < (endOfBlock - startOfBlock); x++) + { + if (settings.ubxMessageRates[x + startOfBlock] > 0) + enabledMessages++; + } + + zedSetMessageOffsets(&ubxMessages[0], "NMEANAV2", startOfBlock, + endOfBlock); // Find start and stop of given messageType in message array + + for (int x = 0; x < (endOfBlock - startOfBlock); x++) + { + if (settings.ubxMessageRates[x + startOfBlock] > 0) + enabledMessages++; + } + + return (enabledMessages); + } + else + systemPrintln("zedGetNAV2MessageCount() Platform not supported"); + + return (false); +} + +// Given the name of a message, find it, and set the rate +bool zedSetMessageRateByName(const char *msgName, uint8_t msgRate) +{ + if (present.gnss_zedf9p) + { + for (int x = 0; x < MAX_UBX_MSG; x++) + { + if (strcmp(ubxMessages[x].msgTextName, msgName) == 0) + { + settings.ubxMessageRates[x] = msgRate; + return (true); + } + } + } + else + systemPrintln("zedSetMessageRateByName() Platform not supported"); + + systemPrintf("zedSetMessageRateByName: %s not found\r\n", msgName); + return (false); +} + +// Given the name of a message, find it, and return the rate +uint8_t zedGetMessageRateByName(const char *msgName) +{ + if (present.gnss_zedf9p) + { + return (settings.ubxMessageRates[zedGetMessageNumberByName(msgName)]); + } + else + systemPrintln("zedGetMessageRateByName() Platform not supported"); + + return (0); +} + +// Given the name of a message, return the array number +uint8_t zedGetMessageNumberByName(const char *msgName) +{ + if (present.gnss_zedf9p) + { + for (int x = 0; x < MAX_UBX_MSG; x++) + { + if (strcmp(ubxMessages[x].msgTextName, msgName) == 0) + return (x); + } + } + else + systemPrintln("zedGetMessageNumberByName() Platform not supported"); + + systemPrintf("zedGetMessageNumberByName: %s not found\r\n", msgName); + return (0); +} diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index bf5dadefa..0bd25202d 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -710,7 +710,7 @@ SettingValueResponse updateSettingWithValue(const char *settingName, const char } break; case tUbMsgRtb: { - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + int firstRTCMRecord = zedGetMessageNumberByName("UBX_RTCM_1005"); for (int x = 0; x < qualifier; x++) { @@ -1360,7 +1360,7 @@ void createSettingsString(char *newSettings) case tUbMsgRtb: { // Record message settings - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + int firstRTCMRecord = zedGetMessageNumberByName("UBX_RTCM_1005"); for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -2053,7 +2053,7 @@ SettingValueResponse getSettingValue(const char *settingName, char *settingValue } break; case tUbMsgRtb: { - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + int firstRTCMRecord = zedGetMessageNumberByName("UBX_RTCM_1005"); for (int x = 0; x < qualifier; x++) { @@ -2443,7 +2443,7 @@ void commandList(int i) break; case tUbMsgRtb: { // Record message settings - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + int firstRTCMRecord = zedGetMessageNumberByName("UBX_RTCM_1005"); for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { diff --git a/Firmware/RTK_Everywhere/menuMessages.ino b/Firmware/RTK_Everywhere/menuMessages.ino index 050b666c1..e2ffb4dab 100644 --- a/Firmware/RTK_Everywhere/menuMessages.ino +++ b/Firmware/RTK_Everywhere/menuMessages.ino @@ -192,7 +192,7 @@ void menuMessagesBaseRTCM() // Given a sub type (ie "RTCM", "NMEA") present menu showing messages with this subtype // Controls the messages that get broadcast over Bluetooth and logged (if enabled) -void menuMessagesSubtype(uint8_t *localMessageRate, const char *messageType) +void zedMenuMessagesSubtype(uint8_t *localMessageRate, const char *messageType) { while (1) { @@ -207,10 +207,10 @@ void menuMessagesSubtype(uint8_t *localMessageRate, const char *messageType) { startOfBlock = 0; endOfBlock = MAX_UBX_MSG_RTCM; - rtcmOffset = getMessageNumberByName("UBX_RTCM_1005"); + rtcmOffset = zedGetMessageNumberByName("UBX_RTCM_1005"); } else - setMessageOffsets(&ubxMessages[0], messageType, startOfBlock, + zedSetMessageOffsets(&ubxMessages[0], messageType, startOfBlock, endOfBlock); // Find start and stop of given messageType in message array for (int x = 0; x < (endOfBlock - startOfBlock); x++) @@ -480,7 +480,7 @@ void beginLogging(const char *customFileName) systemPrintf("Log file name: %s\r\n", logFileName); online.logging = true; } // online.sd, enable.logging, online.rtc - } // online.logging + } // online.logging } // Stop writing to the log file on the microSD card @@ -594,98 +594,6 @@ bool findLastLog(char *lastLogNamePrt, size_t lastLogNameSize) return (foundAFile); } -// Given a unique string, find first and last records containing that string in message array -void setMessageOffsets(const ubxMsg *localMessage, const char *messageType, int &startOfBlock, int &endOfBlock) -{ - char messageNamePiece[40]; // UBX_RTCM - snprintf(messageNamePiece, sizeof(messageNamePiece), "UBX_%s", messageType); // Put UBX_ infront of type - - // Find the first occurrence - for (startOfBlock = 0; startOfBlock < MAX_UBX_MSG; startOfBlock++) - { - if (strstr(localMessage[startOfBlock].msgTextName, messageNamePiece) != nullptr) - break; - } - if (startOfBlock == MAX_UBX_MSG) - { - // Error out - startOfBlock = 0; - endOfBlock = 0; - return; - } - - // Find the last occurrence - for (endOfBlock = startOfBlock + 1; endOfBlock < MAX_UBX_MSG; endOfBlock++) - { - if (strstr(localMessage[endOfBlock].msgTextName, messageNamePiece) == nullptr) - break; - } -} - -// Count the number of NAV2 messages with rates more than 0. Used for determining if we need the enable -// the global NAV2 feature. -uint8_t getNAV2MessageCount() -{ - int enabledMessages = 0; - int startOfBlock = 0; - int endOfBlock = 0; - - setMessageOffsets(&ubxMessages[0], "NAV2", startOfBlock, - endOfBlock); // Find start and stop of given messageType in message array - - for (int x = 0; x < (endOfBlock - startOfBlock); x++) - { - if (settings.ubxMessageRates[x + startOfBlock] > 0) - enabledMessages++; - } - - setMessageOffsets(&ubxMessages[0], "NMEANAV2", startOfBlock, - endOfBlock); // Find start and stop of given messageType in message array - - for (int x = 0; x < (endOfBlock - startOfBlock); x++) - { - if (settings.ubxMessageRates[x + startOfBlock] > 0) - enabledMessages++; - } - - return (enabledMessages); -} - -// Given the name of a message, find it, and set the rate -bool setMessageRateByName(const char *msgName, uint8_t msgRate) -{ - for (int x = 0; x < MAX_UBX_MSG; x++) - { - if (strcmp(ubxMessages[x].msgTextName, msgName) == 0) - { - settings.ubxMessageRates[x] = msgRate; - return (true); - } - } - - systemPrintf("setMessageRateByName: %s not found\r\n", msgName); - return (false); -} - -// Given the name of a message, find it, and return the rate -uint8_t getMessageRateByName(const char *msgName) -{ - return (settings.ubxMessageRates[getMessageNumberByName(msgName)]); -} - -// Given the name of a message, return the array number -uint8_t getMessageNumberByName(const char *msgName) -{ - for (int x = 0; x < MAX_UBX_MSG; x++) - { - if (strcmp(ubxMessages[x].msgTextName, msgName) == 0) - return (x); - } - - systemPrintf("getMessageNumberByName: %s not found\r\n", msgName); - return (0); -} - // Check various setting arrays (message rates, etc) to see if they need to be reset to defaults void checkGNSSArrayDefaults() { @@ -711,7 +619,7 @@ void checkGNSSArrayDefaults() defaultsApplied = true; // Reset Base rates to defaults - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + int firstRTCMRecord = zedGetMessageNumberByName("UBX_RTCM_1005"); for (int x = 0; x < MAX_UBX_MSG_RTCM; x++) settings.ubxMessageRatesBase[x] = ubxMessages[firstRTCMRecord + x].msgDefaultRate; } @@ -752,22 +660,21 @@ void checkGNSSArrayDefaults() settings.um980MessageRatesRTCMBase[x] = umMessagesRTCM[x].msgDefaultRate; } - //If defaults were applied, also default the non-array settings for this particular GNSS receiver - if(defaultsApplied == true) + // If defaults were applied, also default the non-array settings for this particular GNSS receiver + if (defaultsApplied == true) { - if(present.gnss_um980) + if (present.gnss_um980) { - settings.minCNO = 10; //Default 10 degrees - settings.surveyInStartingAccuracy = 2.0; //Default 2m - settings.measurementRateMs = 500; //Default 2Hz. + settings.minCNO = 10; // Default 10 degrees + settings.surveyInStartingAccuracy = 2.0; // Default 2m + settings.measurementRateMs = 500; // Default 2Hz. } - else if(present.gnss_zedf9p) + else if (present.gnss_zedf9p) { - settings.minCNO = 6; //Default 6 degrees - settings.surveyInStartingAccuracy = 1.0; //Default 1m - settings.measurementRateMs = 250; //Default 4Hz. + settings.minCNO = 6; // Default 6 degrees + settings.surveyInStartingAccuracy = 1.0; // Default 1m + settings.measurementRateMs = 250; // Default 4Hz. } - } if (defaultsApplied == true) @@ -786,13 +693,13 @@ void setLoggingType() int messageCount = gnssGetActiveMessageCount(); if (messageCount == 5 || messageCount == 7) { - if (getMessageRateByName("UBX_NMEA_GGA") > 0 && getMessageRateByName("UBX_NMEA_GSA") > 0 && - getMessageRateByName("UBX_NMEA_GST") > 0 && getMessageRateByName("UBX_NMEA_GSV") > 0 && - getMessageRateByName("UBX_NMEA_RMC") > 0) + if (zedGetMessageRateByName("UBX_NMEA_GGA") > 0 && zedGetMessageRateByName("UBX_NMEA_GSA") > 0 && + zedGetMessageRateByName("UBX_NMEA_GST") > 0 && zedGetMessageRateByName("UBX_NMEA_GSV") > 0 && + zedGetMessageRateByName("UBX_NMEA_RMC") > 0) { loggingType = LOGGING_STANDARD; - if (getMessageRateByName("UBX_RXM_RAWX") > 0 && getMessageRateByName("UBX_RXM_SFRBX") > 0) + if (zedGetMessageRateByName("UBX_RXM_RAWX") > 0 && zedGetMessageRateByName("UBX_RXM_SFRBX") > 0) loggingType = LOGGING_PPP; } } @@ -802,30 +709,30 @@ void setLoggingType() void setLogTestFrequencyMessages(int rate, int messages) { // Set measurement frequency - gnssSetRate(1.0 / (double)rate); // Convert Hz to seconds. This will set settings.measurementRateMs, settings.navigationRate, - // and GSV message + gnssSetRate(1.0 / (double)rate); // Convert Hz to seconds. This will set settings.measurementRateMs, + // settings.navigationRate, and GSV message // Set messages setGNSSMessageRates(settings.ubxMessageRates, 0); // Turn off all messages if (messages == 5) { - setMessageRateByName("UBX_NMEA_GGA", 1); - setMessageRateByName("UBX_NMEA_GSA", 1); - setMessageRateByName("UBX_NMEA_GST", 1); - setMessageRateByName("UBX_NMEA_GSV", rate); // One report per second - setMessageRateByName("UBX_NMEA_RMC", 1); + zedSetMessageRateByName("UBX_NMEA_GGA", 1); + zedSetMessageRateByName("UBX_NMEA_GSA", 1); + zedSetMessageRateByName("UBX_NMEA_GST", 1); + zedSetMessageRateByName("UBX_NMEA_GSV", rate); // One report per second + zedSetMessageRateByName("UBX_NMEA_RMC", 1); log_d("Messages: Surveying Defaults (NMEAx5)"); } else if (messages == 7) { - setMessageRateByName("UBX_NMEA_GGA", 1); - setMessageRateByName("UBX_NMEA_GSA", 1); - setMessageRateByName("UBX_NMEA_GST", 1); - setMessageRateByName("UBX_NMEA_GSV", rate); // One report per second - setMessageRateByName("UBX_NMEA_RMC", 1); - setMessageRateByName("UBX_RXM_RAWX", 1); - setMessageRateByName("UBX_RXM_SFRBX", 1); + zedSetMessageRateByName("UBX_NMEA_GGA", 1); + zedSetMessageRateByName("UBX_NMEA_GSA", 1); + zedSetMessageRateByName("UBX_NMEA_GST", 1); + zedSetMessageRateByName("UBX_NMEA_GSV", rate); // One report per second + zedSetMessageRateByName("UBX_NMEA_RMC", 1); + zedSetMessageRateByName("UBX_RXM_RAWX", 1); + zedSetMessageRateByName("UBX_RXM_SFRBX", 1); log_d("Messages: PPP NMEAx5+RXMx2"); } From 89e83cfa712c89afaa04ce579862c0b5b51eb13a Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 23 May 2024 13:44:34 -0600 Subject: [PATCH 089/358] Update NVM.ino --- Firmware/RTK_Everywhere/NVM.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/NVM.ino b/Firmware/RTK_Everywhere/NVM.ino index bd27cf64e..58e0f7e6f 100644 --- a/Firmware/RTK_Everywhere/NVM.ino +++ b/Firmware/RTK_Everywhere/NVM.ino @@ -375,7 +375,7 @@ void recordSystemSettingsToFile(File *settingsFile) case tUbMsgRtb: { // Record message settings - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + int firstRTCMRecord = zedGetMessageNumberByName("UBX_RTCM_1005"); for (int x = 0; x < rtkSettingsEntries[i].qualifier; x++) { @@ -1047,7 +1047,7 @@ bool parseLine(char *str) } break; case tUbMsgRtb: { - int firstRTCMRecord = getMessageNumberByName("UBX_RTCM_1005"); + int firstRTCMRecord = zedGetMessageNumberByName("UBX_RTCM_1005"); for (int x = 0; x < qualifier; x++) { From f977f3659d159b0617adfcea1c74f0c5bc590980 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 23 May 2024 13:51:01 -0600 Subject: [PATCH 090/358] Avoid defaulting arrays that do not apply to current platform --- Firmware/RTK_Everywhere/menuMessages.ino | 97 +++++++++++++----------- 1 file changed, 52 insertions(+), 45 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuMessages.ino b/Firmware/RTK_Everywhere/menuMessages.ino index e2ffb4dab..b8d564c84 100644 --- a/Firmware/RTK_Everywhere/menuMessages.ino +++ b/Firmware/RTK_Everywhere/menuMessages.ino @@ -211,7 +211,7 @@ void zedMenuMessagesSubtype(uint8_t *localMessageRate, const char *messageType) } else zedSetMessageOffsets(&ubxMessages[0], messageType, startOfBlock, - endOfBlock); // Find start and stop of given messageType in message array + endOfBlock); // Find start and stop of given messageType in message array for (int x = 0; x < (endOfBlock - startOfBlock); x++) { @@ -599,65 +599,72 @@ void checkGNSSArrayDefaults() { bool defaultsApplied = false; - if (settings.ubxMessageRates[0] == 254) + if (present.gnss_zedf9p) { - defaultsApplied = true; - // Reset rates to defaults - for (int x = 0; x < MAX_UBX_MSG; x++) + if (settings.ubxMessageRates[0] == 254) { - if (ubxMessages[x].msgClass == UBX_RTCM_MSB) - settings.ubxMessageRates[x] = 0; // For general rover messages, RTCM should be zero by default. - // ubxMessageRatesBase will have the proper defaults. - else - settings.ubxMessageRates[x] = ubxMessages[x].msgDefaultRate; + defaultsApplied = true; + + // Reset rates to defaults + for (int x = 0; x < MAX_UBX_MSG; x++) + { + if (ubxMessages[x].msgClass == UBX_RTCM_MSB) + settings.ubxMessageRates[x] = 0; // For general rover messages, RTCM should be zero by default. + // ubxMessageRatesBase will have the proper defaults. + else + settings.ubxMessageRates[x] = ubxMessages[x].msgDefaultRate; + } } - } - if (settings.ubxMessageRatesBase[0] == 254) - { - defaultsApplied = true; + if (settings.ubxMessageRatesBase[0] == 254) + { + defaultsApplied = true; - // Reset Base rates to defaults - int firstRTCMRecord = zedGetMessageNumberByName("UBX_RTCM_1005"); - for (int x = 0; x < MAX_UBX_MSG_RTCM; x++) - settings.ubxMessageRatesBase[x] = ubxMessages[firstRTCMRecord + x].msgDefaultRate; + // Reset Base rates to defaults + int firstRTCMRecord = zedGetMessageNumberByName("UBX_RTCM_1005"); + for (int x = 0; x < MAX_UBX_MSG_RTCM; x++) + settings.ubxMessageRatesBase[x] = ubxMessages[firstRTCMRecord + x].msgDefaultRate; + } } - - if (settings.um980Constellations[0] == 254) + else if (present.gnss_um980) { - defaultsApplied = true; - // Reset constellations to defaults - for (int x = 0; x < MAX_UM980_CONSTELLATIONS; x++) - settings.um980Constellations[x] = 1; - } + if (settings.um980Constellations[0] == 254) + { + defaultsApplied = true; - if (settings.um980MessageRatesNMEA[0] == 254) - { - defaultsApplied = true; + // Reset constellations to defaults + for (int x = 0; x < MAX_UM980_CONSTELLATIONS; x++) + settings.um980Constellations[x] = 1; + } - // Reset rates to defaults - for (int x = 0; x < MAX_UM980_NMEA_MSG; x++) - settings.um980MessageRatesNMEA[x] = umMessagesNMEA[x].msgDefaultRate; - } + if (settings.um980MessageRatesNMEA[0] == 254) + { + defaultsApplied = true; - if (settings.um980MessageRatesRTCMRover[0] == 254) - { - defaultsApplied = true; + // Reset rates to defaults + for (int x = 0; x < MAX_UM980_NMEA_MSG; x++) + settings.um980MessageRatesNMEA[x] = umMessagesNMEA[x].msgDefaultRate; + } - // For rovers, RTCM should be zero by default. - for (int x = 0; x < MAX_UM980_RTCM_MSG; x++) - settings.um980MessageRatesRTCMRover[x] = 0; - } + if (settings.um980MessageRatesRTCMRover[0] == 254) + { + defaultsApplied = true; - if (settings.um980MessageRatesRTCMBase[0] == 254) - { - defaultsApplied = true; + // For rovers, RTCM should be zero by default. + for (int x = 0; x < MAX_UM980_RTCM_MSG; x++) + settings.um980MessageRatesRTCMRover[x] = 0; + } - // Reset RTCM rates to defaults - for (int x = 0; x < MAX_UM980_RTCM_MSG; x++) - settings.um980MessageRatesRTCMBase[x] = umMessagesRTCM[x].msgDefaultRate; + if (settings.um980MessageRatesRTCMBase[0] == 254) + { + defaultsApplied = true; + + // Reset RTCM rates to defaults + for (int x = 0; x < MAX_UM980_RTCM_MSG; x++) + settings.um980MessageRatesRTCMBase[x] = umMessagesRTCM[x].msgDefaultRate; + } } // If defaults were applied, also default the non-array settings for this particular GNSS receiver From da2942f5efe670bebcbdc4cf710d2f71df7fa84a Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 23 May 2024 13:58:28 -0600 Subject: [PATCH 091/358] Whitespace changes --- Firmware/RTK_Everywhere/Begin.ino | 3 +- Firmware/RTK_Everywhere/Buttons.ino | 2 +- Firmware/RTK_Everywhere/Display.ino | 24 +- Firmware/RTK_Everywhere/Form.ino | 12 +- Firmware/RTK_Everywhere/MP2762A_Charger.ino | 22 +- Firmware/RTK_Everywhere/Network.ino | 19 +- Firmware/RTK_Everywhere/NetworkUDP.h | 46 +- Firmware/RTK_Everywhere/NtripClient.ino | 10 +- Firmware/RTK_Everywhere/NtripServer.ino | 20 +- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 13 +- Firmware/RTK_Everywhere/SD.ino | 4 +- Firmware/RTK_Everywhere/States.ino | 5 +- Firmware/RTK_Everywhere/System.ino | 6 +- Firmware/RTK_Everywhere/Tasks.ino | 6 +- Firmware/RTK_Everywhere/UM980.ino | 9 +- Firmware/RTK_Everywhere/UdpServer.ino | 3 +- .../RTK_Everywhere/X509_Certificate_Bundle.h | 2108 ++++++++--------- Firmware/RTK_Everywhere/ZED.ino | 118 +- Firmware/RTK_Everywhere/menuBase.ino | 4 +- .../menuCorrectionsPriorities.ino | 6 +- Firmware/RTK_Everywhere/menuGNSS.ino | 2 +- Firmware/RTK_Everywhere/menuMain.ino | 43 +- Firmware/RTK_Everywhere/menuMessages.ino | 2 - Firmware/RTK_Everywhere/menuPP.ino | 2 +- Firmware/RTK_Everywhere/menuPorts.ino | 9 +- Firmware/RTK_Everywhere/support.ino | 6 +- 26 files changed, 1250 insertions(+), 1254 deletions(-) diff --git a/Firmware/RTK_Everywhere/Begin.ino b/Firmware/RTK_Everywhere/Begin.ino index 45053e952..8875ee235 100644 --- a/Firmware/RTK_Everywhere/Begin.ino +++ b/Firmware/RTK_Everywhere/Begin.ino @@ -764,7 +764,8 @@ void beginGnssUart() if (task.gnssUartPinnedTaskRunning == false) { - task.gnssUartPinnedTaskRunning = true; // The xTaskCreate runs and completes nearly immediately. Mark start here and check for completion. + task.gnssUartPinnedTaskRunning = true; // The xTaskCreate runs and completes nearly immediately. Mark start + // here and check for completion. xTaskCreatePinnedToCore( pinGnssUartTask, diff --git a/Firmware/RTK_Everywhere/Buttons.ino b/Firmware/RTK_Everywhere/Buttons.ino index 60d84af52..ad9a43226 100644 --- a/Firmware/RTK_Everywhere/Buttons.ino +++ b/Firmware/RTK_Everywhere/Buttons.ino @@ -60,7 +60,7 @@ void powerDown(bool displayInfo) while (1) { - //We should never get here but good to know if we do + // We should never get here but good to know if we do systemPrintln("Device powered down"); delay(250); } diff --git a/Firmware/RTK_Everywhere/Display.ino b/Firmware/RTK_Everywhere/Display.ino index a4c37ca69..358a87e85 100644 --- a/Firmware/RTK_Everywhere/Display.ino +++ b/Firmware/RTK_Everywhere/Display.ino @@ -196,7 +196,7 @@ void displayUpdate() oled->erase(); std::vector iconPropertyList; // List of icons to be displayed - iconPropertyList.clear(); // Redundant? + iconPropertyList.clear(); // Redundant? switch (systemState) { @@ -959,8 +959,9 @@ void setESPNowIcon_TwoRadios(std::vector *iconList) prop.icon = ESPNowSymbol2Left64x48; else if (espnowRSSI >= -80) prop.icon = ESPNowSymbol1Left64x48; - else //if (espnowRSSI > -255) - prop.icon = ESPNowSymbol0Left64x48; // Always show the synbol because we've got incoming or outgoing data + else // if (espnowRSSI > -255) + prop.icon = + ESPNowSymbol0Left64x48; // Always show the synbol because we've got incoming or outgoing data iconList->push_back(prop); // Share the spot. Determine if we need to indicate Up, or Down @@ -1314,7 +1315,7 @@ void paintClock(std::vector *iconList, bool blinking) { // Animate icon to show system running. The 2* makes the blink correct static uint8_t clockIconDisplayed = (2 * CLOCK_ICON_STATES) - 1; - clockIconDisplayed++; // Goto next icon + clockIconDisplayed++; // Goto next icon clockIconDisplayed %= (2 * CLOCK_ICON_STATES); // Wrap iconPropertyBlinking prop; @@ -2274,10 +2275,12 @@ void paintProfile(uint8_t profileUnit) if (profileNumber >= 0) { - settings.updateGNSSSettings = true; // When this profile is loaded next, force system to update GNSS settings. + settings.updateGNSSSettings = + true; // When this profile is loaded next, force system to update GNSS settings. recordSystemSettings(); // Before switching, we need to record the current settings to LittleFS and SD - recordProfileNumber((uint8_t)profileNumber); // Update internal settings with user's choice, mark unit for config update + recordProfileNumber( + (uint8_t)profileNumber); // Update internal settings with user's choice, mark unit for config update log_d("Going to profile number %d from unit %d, name '%s'", profileNumber, profileUnit, profileName); @@ -2472,7 +2475,8 @@ void paintDisplaySetup() for (auto it = setupButtons.begin(); it != setupButtons.end(); it = std::next(it)) { - if (thisIsButton >= setupSelectedButton) // Should we display this button based on the global setupSelectedButton? + if (thisIsButton >= + setupSelectedButton) // Should we display this button based on the global setupSelectedButton? { if (printedButtons < maxButtons) // Do we have room to display it? { @@ -2480,7 +2484,8 @@ void paintDisplaySetup() { int nameWidth = ((present.display_type == DISPLAY_128x64) ? 17 : 9); char miniProfileName[nameWidth] = {0}; - snprintf(miniProfileName, sizeof(miniProfileName), "%d_%s", it->newProfile, it->name); // Prefix with index # + snprintf(miniProfileName, sizeof(miniProfileName), "%d_%s", it->newProfile, + it->name); // Prefix with index # printTextCenter(miniProfileName, 12 * printedButtons, QW_FONT_8X16, 1, printedButtons == 0); } else @@ -2550,7 +2555,8 @@ void printTextCenter(const char *text, uint8_t yPos, QwiicFont &fontType, uint8_ } // Given text, and location, print text to the screen -void printTextAt(const char *text, uint8_t xPos, uint8_t yPos, QwiicFont &fontType, uint8_t kerning) // text, x, y, font type, kearning, inverted +void printTextAt(const char *text, uint8_t xPos, uint8_t yPos, QwiicFont &fontType, + uint8_t kerning) // text, x, y, font type, kearning, inverted { oled->setFont(fontType); oled->setDrawMode(grROPXOR); diff --git a/Firmware/RTK_Everywhere/Form.ino b/Firmware/RTK_Everywhere/Form.ino index a6f23dd37..6f0d3225a 100644 --- a/Firmware/RTK_Everywhere/Form.ino +++ b/Firmware/RTK_Everywhere/Form.ino @@ -835,7 +835,7 @@ void createMessageList(String &returnText) { if (messageSupported(messageNumber) == true) returnText += "ubxMessageRate_" + String(ubxMessages[messageNumber].msgTextName) + "," + - String(settings.ubxMessageRates[messageNumber]) + ","; + String(settings.ubxMessageRates[messageNumber]) + ","; } } @@ -844,12 +844,12 @@ void createMessageList(String &returnText) for (int messageNumber = 0; messageNumber < MAX_UM980_NMEA_MSG; messageNumber++) { returnText += "um980MessageRatesNMEA_" + String(umMessagesNMEA[messageNumber].msgTextName) + "," + - String(settings.um980MessageRatesNMEA[messageNumber]) + ","; + String(settings.um980MessageRatesNMEA[messageNumber]) + ","; } for (int messageNumber = 0; messageNumber < MAX_UM980_RTCM_MSG; messageNumber++) { returnText += "um980MessageRatesRTCMRover_" + String(umMessagesRTCM[messageNumber].msgTextName) + "," + - String(settings.um980MessageRatesRTCMRover[messageNumber]) + ","; + String(settings.um980MessageRatesRTCMRover[messageNumber]) + ","; } } @@ -870,8 +870,8 @@ void createMessageListBase(String &returnText) for (int messageNumber = 0; messageNumber < MAX_UBX_MSG_RTCM; messageNumber++) { if (messageSupported(firstRTCMRecord + messageNumber) == true) - returnText += "MessageRateBase_" + String(ubxMessages[messageNumber + firstRTCMRecord].msgTextName) + "," + - String(settings.ubxMessageRatesBase[messageNumber]) + ","; // UBX_RTCM_1074Base,4, + returnText += "MessageRateBase_" + String(ubxMessages[messageNumber + firstRTCMRecord].msgTextName) + + "," + String(settings.ubxMessageRatesBase[messageNumber]) + ","; // UBX_RTCM_1074Base,4, } } @@ -880,7 +880,7 @@ void createMessageListBase(String &returnText) for (int messageNumber = 0; messageNumber < MAX_UM980_RTCM_MSG; messageNumber++) { returnText += "MessageRatesRTCMBase_" + String(umMessagesRTCM[messageNumber].msgTextName) + "," + - String(settings.um980MessageRatesRTCMBase[messageNumber]) + ","; + String(settings.um980MessageRatesRTCMBase[messageNumber]) + ","; } } diff --git a/Firmware/RTK_Everywhere/MP2762A_Charger.ino b/Firmware/RTK_Everywhere/MP2762A_Charger.ino index b9b52ac51..304666d01 100644 --- a/Firmware/RTK_Everywhere/MP2762A_Charger.ino +++ b/Firmware/RTK_Everywhere/MP2762A_Charger.ino @@ -149,21 +149,21 @@ void mp2762setFastChargeVoltageMv(uint16_t mVoltLevel) mp2762writeRegister(MP2762A_PRECHARGE_THRESHOLD_OPTION, status); } -//Given a bit field, and a startingBitValue -//Example: Battery voltage is bit 12.5mV per bit +// Given a bit field, and a startingBitValue +// Example: Battery voltage is bit 12.5mV per bit float convertBitsToDoubler(uint16_t bitField, float startingBitValue) { - float totalMv = 0; - for (int x = 0 ; x < 16 ; x++) - { - if (bitField & 0x0001) - totalMv += startingBitValue; + float totalMv = 0; + for (int x = 0; x < 16; x++) + { + if (bitField & 0x0001) + totalMv += startingBitValue; - bitField >>= 1; + bitField >>= 1; - startingBitValue *= 2; - } - return (totalMv); + startingBitValue *= 2; + } + return (totalMv); } // Reads from a given location diff --git a/Firmware/RTK_Everywhere/Network.ino b/Firmware/RTK_Everywhere/Network.ino index 8a30ef37e..dc0a44b37 100644 --- a/Firmware/RTK_Everywhere/Network.ino +++ b/Firmware/RTK_Everywhere/Network.ino @@ -389,7 +389,8 @@ void networkDisplayIpAddress(uint8_t networkType) { strcpy(ipAddress, networkGetIpAddress(networkType).toString().c_str()); if (network->type == NETWORK_TYPE_WIFI) - systemPrintf("%s '%s' IP address: %s, RSSI: %d\r\n", networkName[network->type], wifiGetSsid(), ipAddress, wifiGetRssi()); + systemPrintf("%s '%s' IP address: %s, RSSI: %d\r\n", networkName[network->type], wifiGetSsid(), + ipAddress, wifiGetRssi()); else systemPrintf("%s IP address: %s\r\n", networkName[network->type], ipAddress); @@ -810,7 +811,7 @@ void networkStart(uint8_t networkType) //---------------------------------------- // Translate the network state into a string //---------------------------------------- -const char * networkStateToString(uint8_t state) +const char *networkStateToString(uint8_t state) { if (state >= networkStateEntries) return "Unknown"; @@ -1025,7 +1026,7 @@ uint8_t networkTranslateNetworkType(uint8_t networkType, bool translateActive) //---------------------------------------- // Translate type into a string //---------------------------------------- -const char * networkTypeToString(uint8_t type) +const char *networkTypeToString(uint8_t type) { if (type >= networkNameEntries) return "Unknown"; @@ -1037,11 +1038,11 @@ const char * networkTypeToString(uint8_t type) //---------------------------------------- void networkTypeUpdate(uint8_t networkType) { - if(inWiFiConfigMode()) + if (inWiFiConfigMode()) { - //Avoid the full network layer while in Browser Config Mode + // Avoid the full network layer while in Browser Config Mode wifiUpdate(); - return; + return; } char errorMsg[64]; @@ -1111,8 +1112,8 @@ void networkTypeUpdate(uint8_t networkType) // Display the network type change network->type = type; if (settings.debugNetworkLayer && (network->type != network->requestedNetwork)) - systemPrintf("networkTypeUpdate, network->type: %s --> %s\r\n", networkTypeToString(network->requestedNetwork), - networkName[network->type]); + systemPrintf("networkTypeUpdate, network->type: %s --> %s\r\n", + networkTypeToString(network->requestedNetwork), networkName[network->type]); if (settings.debugNetworkLayer) systemPrintf("networkTypeUpdate, network->requestedNetwork: %s --> %s\r\n", networkName[network->requestedNetwork], networkTypeToString(network->type)); @@ -1364,7 +1365,7 @@ bool networkUserOpen(uint8_t user, uint8_t networkType) //---------------------------------------- // Translate user into a string //---------------------------------------- -const char * networkUserToString(uint8_t userNumber) +const char *networkUserToString(uint8_t userNumber) { if (userNumber >= networkUserEntries) return "Unknown"; diff --git a/Firmware/RTK_Everywhere/NetworkUDP.h b/Firmware/RTK_Everywhere/NetworkUDP.h index 3548d0c75..81cae161d 100644 --- a/Firmware/RTK_Everywhere/NetworkUDP.h +++ b/Firmware/RTK_Everywhere/NetworkUDP.h @@ -6,17 +6,15 @@ extern uint8_t networkGetType(uint8_t user); class NetworkUDP : public UDP { protected: - - UDP * _udp; // Ethernet or WiFi udp + UDP *_udp; // Ethernet or WiFi udp bool _friendClass; uint8_t _networkType; public: - //------------------------------ // Create the network client //------------------------------ - NetworkUDP(UDP * udp, uint8_t networkType) + NetworkUDP(UDP *udp, uint8_t networkType) { _friendClass = true; _networkType = networkType; @@ -34,9 +32,9 @@ class NetworkUDP : public UDP #endif // COMPILE_ETHERNET #if defined(COMPILE_WIFI) _udp = new WiFiUDP; -#else // COMPILE_WIFI - _udp = nullptr; -#endif // COMPILE_WIFI +#else // COMPILE_WIFI + _udp = nullptr; +#endif // COMPILE_WIFI }; //------------------------------ @@ -53,7 +51,6 @@ class NetworkUDP : public UDP } }; - //------------------------------ // Determine if the network client was allocated //------------------------------ @@ -110,7 +107,7 @@ class NetworkUDP : public UDP // Read available data //------------------------------ - int read(unsigned char* buf, size_t length) + int read(unsigned char *buf, size_t length) { if (_udp) return _udp->read(buf, length); @@ -121,7 +118,7 @@ class NetworkUDP : public UDP // Read available data //------------------------------ - int read(char* buf, size_t length) + int read(char *buf, size_t length) { if (_udp) return _udp->read(buf, length); @@ -186,7 +183,7 @@ class NetworkUDP : public UDP // Begin a UDP packet //------------------------------ - int beginPacket(const char* host, uint16_t port) + int beginPacket(const char *host, uint16_t port) { if (_udp) return _udp->beginPacket(host, port); @@ -228,7 +225,7 @@ class NetworkUDP : public UDP #if defined(COMPILE_WIFI) if (_networkType == NETWORK_TYPE_WIFI) return ((WiFiUDP *)_udp)->remoteIP(); -#endif // COMPILE_WIFI +#endif // COMPILE_WIFI return IPAddress((uint32_t)0); } @@ -245,12 +242,11 @@ class NetworkUDP : public UDP #if defined(COMPILE_WIFI) if (_networkType == NETWORK_TYPE_WIFI) return ((WiFiUDP *)_udp)->remotePort(); -#endif // COMPILE_WIFI +#endif // COMPILE_WIFI return 0; } protected: - //------------------------------ // Declare the friend classes //------------------------------ @@ -259,18 +255,14 @@ class NetworkUDP : public UDP friend class NetworkWiFiUdp; }; -#ifdef COMPILE_ETHERNET +#ifdef COMPILE_ETHERNET class NetworkEthernetUdp : public NetworkUDP { private: - EthernetUDP _udp; public: - - NetworkEthernetUdp(EthernetUDP& udp) : - _udp{udp}, - NetworkUDP(&_udp, NETWORK_TYPE_ETHERNET) + NetworkEthernetUdp(EthernetUDP &udp) : _udp{udp}, NetworkUDP(&_udp, NETWORK_TYPE_ETHERNET) { } @@ -279,20 +271,16 @@ class NetworkEthernetUdp : public NetworkUDP this->~NetworkUDP(); } }; -#endif // COMPILE_ETHERNET +#endif // COMPILE_ETHERNET -#ifdef COMPILE_WIFI +#ifdef COMPILE_WIFI class NetworkWiFiUdp : public NetworkUDP { private: - WiFiUDP _udp; public: - - NetworkWiFiUdp(WiFiUDP& udp) : - _udp{udp}, - NetworkUDP(&_udp, NETWORK_TYPE_WIFI) + NetworkWiFiUdp(WiFiUDP &udp) : _udp{udp}, NetworkUDP(&_udp, NETWORK_TYPE_WIFI) { } @@ -301,6 +289,6 @@ class NetworkWiFiUdp : public NetworkUDP this->~NetworkUDP(); } }; -#endif // COMPILE_WIFI +#endif // COMPILE_WIFI -#endif // __NETWORK_CLIENT_H__ +#endif // __NETWORK_CLIENT_H__ diff --git a/Firmware/RTK_Everywhere/NtripClient.ino b/Firmware/RTK_Everywhere/NtripClient.ino index 14f38052c..f711d4d37 100644 --- a/Firmware/RTK_Everywhere/NtripClient.ino +++ b/Firmware/RTK_Everywhere/NtripClient.ino @@ -833,7 +833,8 @@ void ntripClientUpdate() // Push RTCM to GNSS module over I2C / SPI gnssPushRawData(rtcmData, rtcmCount); - if ((settings.debugNtripClientRtcm || PERIODIC_DISPLAY(PD_NTRIP_CLIENT_DATA)) && (!inMainMenu)) + if ((settings.debugNtripClientRtcm || PERIODIC_DISPLAY(PD_NTRIP_CLIENT_DATA)) && + (!inMainMenu)) { PERIODIC_CLEAR(PD_NTRIP_CLIENT_DATA); systemPrintf("NTRIP Client received %d RTCM bytes, pushed to GNSS\r\n", rtcmCount); @@ -841,10 +842,13 @@ void ntripClientUpdate() } else { - if ((settings.debugNtripClientRtcm || PERIODIC_DISPLAY(PD_NTRIP_CLIENT_DATA)) && (!inMainMenu)) + if ((settings.debugNtripClientRtcm || PERIODIC_DISPLAY(PD_NTRIP_CLIENT_DATA)) && + (!inMainMenu)) { PERIODIC_CLEAR(PD_NTRIP_CLIENT_DATA); - systemPrintf("NTRIP Client received %d RTCM bytes, NOT pushed to GNSS due to priority\r\n", rtcmCount); + systemPrintf( + "NTRIP Client received %d RTCM bytes, NOT pushed to GNSS due to priority\r\n", + rtcmCount); } } } diff --git a/Firmware/RTK_Everywhere/NtripServer.ino b/Firmware/RTK_Everywhere/NtripServer.ino index 92510d3fa..be5c93727 100644 --- a/Firmware/RTK_Everywhere/NtripServer.ino +++ b/Firmware/RTK_Everywhere/NtripServer.ino @@ -690,8 +690,9 @@ void ntripServerUpdate(int serverIndex) if (millis() - ntripServer->timer > 10000) { if (ntripServerConnectLimitReached(serverIndex)) - systemPrintf("Caster %d - %s failed to respond. Do you have your caster address and port correct?\r\n", - serverIndex, settings.ntripServer_CasterHost[serverIndex]); + systemPrintf( + "Caster %d - %s failed to respond. Do you have your caster address and port correct?\r\n", + serverIndex, settings.ntripServer_CasterHost[serverIndex]); } } else @@ -701,9 +702,11 @@ void ntripServerUpdate(int serverIndex) ntripServerResponse(serverIndex, response, sizeof(response)); if (settings.debugNtripServerState) - systemPrintf("Server %d - %s Response: %s\r\n", serverIndex, settings.ntripServer_CasterHost[serverIndex], response); + systemPrintf("Server %d - %s Response: %s\r\n", serverIndex, + settings.ntripServer_CasterHost[serverIndex], response); else - log_d("Server %d - %s Response: %s", serverIndex, settings.ntripServer_CasterHost[serverIndex], response); + log_d("Server %d - %s Response: %s", serverIndex, settings.ntripServer_CasterHost[serverIndex], + response); // Look for various responses if (strstr(response, "200") != nullptr) //'200' found @@ -777,13 +780,15 @@ void ntripServerUpdate(int serverIndex) else if (!ntripServer->networkClient->connected()) { // Broken connection, retry the NTRIP connection - systemPrintf("Connection to NTRIP Caster %d - %s was lost\r\n", serverIndex, settings.ntripServer_CasterHost[serverIndex]); + systemPrintf("Connection to NTRIP Caster %d - %s was lost\r\n", serverIndex, + settings.ntripServer_CasterHost[serverIndex]); ntripServerRestart(serverIndex); } else if ((millis() - ntripServer->timer) > (10 * 1000)) { // GNSS stopped sending RTCM correction data - systemPrintf("NTRIP Server %d breaking connection to %s due to lack of RTCM data!\r\n", serverIndex, settings.ntripServer_CasterHost[serverIndex]); + systemPrintf("NTRIP Server %d breaking connection to %s due to lack of RTCM data!\r\n", serverIndex, + settings.ntripServer_CasterHost[serverIndex]); ntripServerRestart(serverIndex); } else @@ -801,7 +806,8 @@ void ntripServerUpdate(int serverIndex) ntripServer->connectionAttempts = 0; ntripServer->connectionAttemptTimeout = 0; if (settings.debugNtripServerState) - systemPrintf("NTRIP Server %d - %s resetting connection attempt counter and timeout\r\n", serverIndex, settings.ntripServer_CasterHost[serverIndex]); + systemPrintf("NTRIP Server %d - %s resetting connection attempt counter and timeout\r\n", + serverIndex, settings.ntripServer_CasterHost[serverIndex]); } } break; diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index 639fce38f..57c350548 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -466,7 +466,7 @@ volatile bool forwardGnssDataToUsbSerial; // forwardGnssDataToUsbSerial is set to false and menuMain is displayed. // If the timeout between characters occurs or an invalid character is // entered then no changes are made and the +++ sequence must be re-entered. -#define PLUS_PLUS_PLUS_TIMEOUT (2 * 1000) // Milliseconds +#define PLUS_PLUS_PLUS_TIMEOUT (2 * 1000) // Milliseconds #define platformPrefix platformPrefixTable[productVariant] // Sets the prefix for broadcast names @@ -659,7 +659,7 @@ uint8_t *pplRtcmBuffer; bool pplAttemptedStart = false; bool pplGnssOutput = false; bool pplMqttCorrections = false; -bool pplLBandCorrections = false; // Raw L-Band - e.g. from mosaic X5 +bool pplLBandCorrections = false; // Raw L-Band - e.g. from mosaic X5 unsigned long pplKeyExpirationMs = 0; // Milliseconds until the current PPL key expires //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -719,7 +719,7 @@ uint32_t triggerAccEst; // Global copy - Accuracy estimate in nanoseconds bool firstPowerOn = true; // After boot, apply new settings to GNSS if the user switches between base or rover unsigned long splashStart; // Controls how long the splash is displayed for. Currently min of 2s. bool restartBase; // If the user modifies any NTRIP Server settings, we need to restart the base -bool restartRover; // If the user modifies any NTRIP Client or PointPerfect settings, we need to restart the rover +bool restartRover; // If the user modifies any NTRIP Client or PointPerfect settings, we need to restart the rover unsigned long startTime; // Used for checking longest-running functions bool lbandCorrectionsReceived; // Used to display L-Band SIV icon when corrections are successfully decrypted @@ -748,7 +748,8 @@ uint16_t failedParserMessages_RTCM; uint16_t failedParserMessages_NMEA; // Corrections Priorities Support -std::vector registeredCorrectionsSources; // vector (linked list) of registered corrections sources for this device +std::vector + registeredCorrectionsSources; // vector (linked list) of registered corrections sources for this device correctionsSource pplCorrectionsSource = CORR_NUM; // Record which source is feeding the PPL // configureViaEthernet: @@ -778,7 +779,7 @@ unsigned long lastGnssToPpl = 0; // Command processing int commandCount; -int16_t * commandIndex; +int16_t *commandIndex; //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- // Display boot times @@ -855,7 +856,7 @@ volatile bool deadManWalking; settings.debugNtripServerState = true; \ settings.debugTcpClient = true; \ settings.debugTcpServer = true; \ - settings.debugUdpServer = true; \ + settings.debugUdpServer = true; \ settings.printBootTimes = true; \ } diff --git a/Firmware/RTK_Everywhere/SD.ino b/Firmware/RTK_Everywhere/SD.ino index cdf2d13d6..42e55d06b 100644 --- a/Firmware/RTK_Everywhere/SD.ino +++ b/Firmware/RTK_Everywhere/SD.ino @@ -9,8 +9,8 @@ void sdUpdate() // Skip if going into / in configure-via-ethernet mode if (configureViaEthernet) { - //if (settings.debugNetworkLayer) - // systemPrintln("configureViaEthernet: skipping sdUpdate"); + // if (settings.debugNetworkLayer) + // systemPrintln("configureViaEthernet: skipping sdUpdate"); return; } diff --git a/Firmware/RTK_Everywhere/States.ino b/Firmware/RTK_Everywhere/States.ino index 314daf145..3ea5cd7db 100644 --- a/Firmware/RTK_Everywhere/States.ino +++ b/Firmware/RTK_Everywhere/States.ino @@ -413,7 +413,7 @@ void stateUpdate() displayWiFiConfigNotStarted(); // Display immediately during SD cluster pause - WIFI_STOP(); //Notify the network layer that it should stop so we can take over control of WiFi + WIFI_STOP(); // Notify the network layer that it should stop so we can take over control of WiFi bluetoothStop(); espnowStop(); @@ -626,8 +626,7 @@ void stateUpdate() break; case (STATE_KEYS_WIFI_STARTED): { - wifiMaxConnectionAttempts = - wifiOriginalMaxConnectionAttempts; // Revert setting + wifiMaxConnectionAttempts = wifiOriginalMaxConnectionAttempts; // Revert setting if (wifiIsConnected()) changeState(STATE_KEYS_WIFI_CONNECTED); diff --git a/Firmware/RTK_Everywhere/System.ino b/Firmware/RTK_Everywhere/System.ino index e43a855bd..60eb145e3 100644 --- a/Firmware/RTK_Everywhere/System.ino +++ b/Firmware/RTK_Everywhere/System.ino @@ -93,9 +93,9 @@ void updateBattery() { lastBatteryChargerUpdate = millis(); - // If the power cable is attached, and charging has stopped, and we are below 7V, then re-enable trickle charge - // This is likely because the 1-hour trickle charge limit has been reached - // See issue: https://github.com/sparkfun/SparkFun_RTK_Everywhere_Firmware/issues/240 + // If the power cable is attached, and charging has stopped, and we are below 7V, then re-enable trickle + // charge This is likely because the 1-hour trickle charge limit has been reached See issue: + // https://github.com/sparkfun/SparkFun_RTK_Everywhere_Firmware/issues/240 if (isUsbAttached() == true) { diff --git a/Firmware/RTK_Everywhere/Tasks.ino b/Firmware/RTK_Everywhere/Tasks.ino index 6546690f0..deae63a26 100644 --- a/Firmware/RTK_Everywhere/Tasks.ino +++ b/Firmware/RTK_Everywhere/Tasks.ino @@ -100,8 +100,8 @@ uint16_t bluetoothOutgoingToGnssHead; unsigned long lastGnssSend; // Timestamp of the last time we sent RTCM to GNSS // Ring buffer tails -static RING_BUFFER_OFFSET btRingBufferTail; // BT Tail advances as it is sent over BT -static RING_BUFFER_OFFSET sdRingBufferTail; // SD Tail advances as it is recorded to SD +static RING_BUFFER_OFFSET btRingBufferTail; // BT Tail advances as it is sent over BT +static RING_BUFFER_OFFSET sdRingBufferTail; // SD Tail advances as it is recorded to SD static RING_BUFFER_OFFSET usbRingBufferTail; // USB Tail advances as it is sent over USB serial // Ring buffer offsets @@ -1393,7 +1393,7 @@ void buttonCheckTask(void *e) // The user button only exits tilt mode if ((singleTap || doubleTap) && (tiltIsCorrecting() == true)) { - tiltRequestStop(); //Don't force the hardware off here as it may be in use in another task + tiltRequestStop(); // Don't force the hardware off here as it may be in use in another task } else if (doubleTap) diff --git a/Firmware/RTK_Everywhere/UM980.ino b/Firmware/RTK_Everywhere/UM980.ino index 466256d17..a42314490 100644 --- a/Firmware/RTK_Everywhere/UM980.ino +++ b/Firmware/RTK_Everywhere/UM980.ino @@ -184,9 +184,10 @@ bool um980ConfigureOnce() } else { - systemPrintf("Current UM980 firmware: v%d. Galileo E6 reception requires v11833 or newer. Please update the " - "firmware on your UM980 to allow for HAS operation. Please see https://bit.ly/sfe-rtk-um980-update\r\n", - um980Version); + systemPrintf( + "Current UM980 firmware: v%d. Galileo E6 reception requires v11833 or newer. Please update the " + "firmware on your UM980 to allow for HAS operation. Please see https://bit.ly/sfe-rtk-um980-update\r\n", + um980Version); } } else @@ -196,7 +197,7 @@ bool um980ConfigureOnce() { if (um980->sendCommand("CONFIG PPP DISABLE") == true) { - //systemPrintln("Galileo E6 service disabled"); + // systemPrintln("Galileo E6 service disabled"); } else systemPrintln("Galileo E6 service config error"); diff --git a/Firmware/RTK_Everywhere/UdpServer.ino b/Firmware/RTK_Everywhere/UdpServer.ino index f6480d409..3126c8657 100644 --- a/Firmware/RTK_Everywhere/UdpServer.ino +++ b/Firmware/RTK_Everywhere/UdpServer.ino @@ -113,8 +113,7 @@ int32_t udpServerSendDataBroadcast(uint8_t *data, uint16_t length) { if ((settings.debugUdpServer || PERIODIC_DISPLAY(PD_UDP_SERVER_BROADCAST_DATA)) && (!inMainMenu)) { - systemPrintf("UDP Server wrote %d bytes as broadcast on port %d\r\n", length, - settings.udpServerPort); + systemPrintf("UDP Server wrote %d bytes as broadcast on port %d\r\n", length, settings.udpServerPort); PERIODIC_CLEAR(PD_UDP_SERVER_BROADCAST_DATA); } } diff --git a/Firmware/RTK_Everywhere/X509_Certificate_Bundle.h b/Firmware/RTK_Everywhere/X509_Certificate_Bundle.h index d64efab17..aab5d256f 100644 --- a/Firmware/RTK_Everywhere/X509_Certificate_Bundle.h +++ b/Firmware/RTK_Everywhere/X509_Certificate_Bundle.h @@ -1,1056 +1,1054 @@ -const uint8_t x509CertificateBundle[] = -{ - 0x00, 0x29, 0x00, 0x3b, 0x01, 0x26, 0x30, 0x39, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, // 16 - 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x06, // 32 - 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, // 48 - 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, // 64 - 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, // 80 - 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, // 96 - 0x01, 0x00, 0xb2, 0x78, 0x80, 0x71, 0xca, 0x78, 0xd5, 0xe3, 0x71, 0xaf, 0x47, 0x80, 0x50, 0x74, // 112 - 0x7d, 0x6e, 0xd8, 0xd7, 0x88, 0x76, 0xf4, 0x99, 0x68, 0xf7, 0x58, 0x21, 0x60, 0xf9, 0x74, 0x84, // 128 - 0x01, 0x2f, 0xac, 0x02, 0x2d, 0x86, 0xd3, 0xa0, 0x43, 0x7a, 0x4e, 0xb2, 0xa4, 0xd0, 0x36, 0xba, // 144 - 0x01, 0xbe, 0x8d, 0xdb, 0x48, 0xc8, 0x07, 0x17, 0x36, 0x4c, 0xf4, 0xee, 0x88, 0x23, 0xc7, 0x3e, // 160 - 0xeb, 0x37, 0xf5, 0xb5, 0x19, 0xf8, 0x49, 0x68, 0xb0, 0xde, 0xd7, 0xb9, 0x76, 0x38, 0x1d, 0x61, // 176 - 0x9e, 0xa4, 0xfe, 0x82, 0x36, 0xa5, 0xe5, 0x4a, 0x56, 0xe4, 0x45, 0xe1, 0xf9, 0xfd, 0xb4, 0x16, // 192 - 0xfa, 0x74, 0xda, 0x9c, 0x9b, 0x35, 0x39, 0x2f, 0xfa, 0xb0, 0x20, 0x50, 0x06, 0x6c, 0x7a, 0xd0, // 208 - 0x80, 0xb2, 0xa6, 0xf9, 0xaf, 0xec, 0x47, 0x19, 0x8f, 0x50, 0x38, 0x07, 0xdc, 0xa2, 0x87, 0x39, // 224 - 0x58, 0xf8, 0xba, 0xd5, 0xa9, 0xf9, 0x48, 0x67, 0x30, 0x96, 0xee, 0x94, 0x78, 0x5e, 0x6f, 0x89, // 240 - 0xa3, 0x51, 0xc0, 0x30, 0x86, 0x66, 0xa1, 0x45, 0x66, 0xba, 0x54, 0xeb, 0xa3, 0xc3, 0x91, 0xf9, // 256 - 0x48, 0xdc, 0xff, 0xd1, 0xe8, 0x30, 0x2d, 0x7d, 0x2d, 0x74, 0x70, 0x35, 0xd7, 0x88, 0x24, 0xf7, // 272 - 0x9e, 0xc4, 0x59, 0x6e, 0xbb, 0x73, 0x87, 0x17, 0xf2, 0x32, 0x46, 0x28, 0xb8, 0x43, 0xfa, 0xb7, // 288 - 0x1d, 0xaa, 0xca, 0xb4, 0xf2, 0x9f, 0x24, 0x0e, 0x2d, 0x4b, 0xf7, 0x71, 0x5c, 0x5e, 0x69, 0xff, // 304 - 0xea, 0x95, 0x02, 0xcb, 0x38, 0x8a, 0xae, 0x50, 0x38, 0x6f, 0xdb, 0xfb, 0x2d, 0x62, 0x1b, 0xc5, // 320 - 0xc7, 0x1e, 0x54, 0xe1, 0x77, 0xe0, 0x67, 0xc8, 0x0f, 0x9c, 0x87, 0x23, 0xd6, 0x3f, 0x40, 0x20, // 336 - 0x7f, 0x20, 0x80, 0xc4, 0x80, 0x4c, 0x3e, 0x3b, 0x24, 0x26, 0x8e, 0x04, 0xae, 0x6c, 0x9a, 0xc8, // 352 - 0xaa, 0x0d, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x3b, 0x02, 0x26, 0x30, 0x39, 0x31, 0x0b, 0x30, // 368 - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, // 384 - 0x55, 0x04, 0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, 0x06, // 400 - 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, // 416 - 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, // 432 - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, // 448 - 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xad, 0x96, 0x9f, 0x2d, 0x9c, 0x4a, 0x4c, 0x4a, 0x81, // 464 - 0x79, 0x51, 0x99, 0xec, 0x8a, 0xcb, 0x6b, 0x60, 0x51, 0x13, 0xbc, 0x4d, 0x6d, 0x06, 0xfc, 0xb0, // 480 - 0x08, 0x8d, 0xdd, 0x19, 0x10, 0x6a, 0xc7, 0x26, 0x0c, 0x35, 0xd8, 0xc0, 0x6f, 0x20, 0x84, 0xe9, // 496 - 0x94, 0xb1, 0x9b, 0x85, 0x03, 0xc3, 0x5b, 0xdb, 0x4a, 0xe8, 0xc8, 0xf8, 0x90, 0x76, 0xd9, 0x5b, // 512 - 0x4f, 0xe3, 0x4c, 0xe8, 0x06, 0x36, 0x4d, 0xcc, 0x9a, 0xac, 0x3d, 0x0c, 0x90, 0x2b, 0x92, 0xd4, // 528 - 0x06, 0x19, 0x60, 0xac, 0x37, 0x44, 0x79, 0x85, 0x81, 0x82, 0xad, 0x5a, 0x37, 0xe0, 0x0d, 0xcc, // 544 - 0x9d, 0xa6, 0x4c, 0x52, 0x76, 0xea, 0x43, 0x9d, 0xb7, 0x04, 0xd1, 0x50, 0xf6, 0x55, 0xe0, 0xd5, // 560 - 0xd2, 0xa6, 0x49, 0x85, 0xe9, 0x37, 0xe9, 0xca, 0x7e, 0xae, 0x5c, 0x95, 0x4d, 0x48, 0x9a, 0x3f, // 576 - 0xae, 0x20, 0x5a, 0x6d, 0x88, 0x95, 0xd9, 0x34, 0xb8, 0x52, 0x1a, 0x43, 0x90, 0xb0, 0xbf, 0x6c, // 592 - 0x05, 0xb9, 0xb6, 0x78, 0xb7, 0xea, 0xd0, 0xe4, 0x3a, 0x3c, 0x12, 0x53, 0x62, 0xff, 0x4a, 0xf2, // 608 - 0x7b, 0xbe, 0x35, 0x05, 0xa9, 0x12, 0x34, 0xe3, 0xf3, 0x64, 0x74, 0x62, 0x2c, 0x3d, 0x00, 0x49, // 624 - 0x5a, 0x28, 0xfe, 0x32, 0x44, 0xbb, 0x87, 0xdd, 0x65, 0x27, 0x02, 0x71, 0x3b, 0xda, 0x4a, 0xf7, // 640 - 0x1f, 0xda, 0xcd, 0xf7, 0x21, 0x55, 0x90, 0x4f, 0x0f, 0xec, 0xae, 0x82, 0xe1, 0x9f, 0x6b, 0xd9, // 656 - 0x45, 0xd3, 0xbb, 0xf0, 0x5f, 0x87, 0xed, 0x3c, 0x2c, 0x39, 0x86, 0xda, 0x3f, 0xde, 0xec, 0x72, // 672 - 0x55, 0xeb, 0x79, 0xa3, 0xad, 0xdb, 0xdd, 0x7c, 0xb0, 0xba, 0x1c, 0xce, 0xfc, 0xde, 0x4f, 0x35, // 688 - 0x76, 0xcf, 0x0f, 0xf8, 0x78, 0x1f, 0x6a, 0x36, 0x51, 0x46, 0x27, 0x61, 0x5b, 0xe9, 0x9e, 0xcf, // 704 - 0xf0, 0xa2, 0x55, 0x7d, 0x7c, 0x25, 0x8a, 0x6f, 0x2f, 0xb4, 0xc5, 0xcf, 0x84, 0x2e, 0x2b, 0xfd, // 720 - 0x0d, 0x51, 0x10, 0x6c, 0xfb, 0x5f, 0x1b, 0xbc, 0x1b, 0x7e, 0xc5, 0xae, 0x3b, 0x98, 0x01, 0x31, // 736 - 0x92, 0xff, 0x0b, 0x57, 0xf4, 0x9a, 0xb2, 0xb9, 0x57, 0xe9, 0xab, 0xef, 0x0d, 0x76, 0xd1, 0xf0, // 752 - 0xee, 0xf4, 0xce, 0x86, 0xa7, 0xe0, 0x6e, 0xe9, 0xb4, 0x69, 0xa1, 0xdf, 0x69, 0xf6, 0x33, 0xc6, // 768 - 0x69, 0x2e, 0x97, 0x13, 0x9e, 0xa5, 0x87, 0xb0, 0x57, 0x10, 0x81, 0x37, 0xc9, 0x53, 0xb3, 0xbb, // 784 - 0x7f, 0xf6, 0x92, 0xd1, 0x9c, 0xd0, 0x18, 0xf4, 0x92, 0x6e, 0xda, 0x83, 0x4f, 0xa6, 0x63, 0x99, // 800 - 0x4c, 0xa5, 0xfb, 0x5e, 0xef, 0x21, 0x64, 0x7a, 0x20, 0x5f, 0x6c, 0x64, 0x85, 0x15, 0xcb, 0x37, // 816 - 0xe9, 0x62, 0x0c, 0x0b, 0x2a, 0x16, 0xdc, 0x01, 0x2e, 0x32, 0xda, 0x3e, 0x4b, 0xf5, 0x9e, 0x3a, // 832 - 0xf6, 0x17, 0x40, 0x94, 0xef, 0x9e, 0x91, 0x08, 0x86, 0xfa, 0xbe, 0x63, 0xa8, 0x5a, 0x33, 0xec, // 848 - 0xcb, 0x74, 0x43, 0x95, 0xf9, 0x6c, 0x69, 0x52, 0x36, 0xc7, 0x29, 0x6f, 0xfc, 0x55, 0x03, 0x5c, // 864 - 0x1f, 0xfb, 0x9f, 0xbd, 0x47, 0xeb, 0xe7, 0x49, 0x47, 0x95, 0x0b, 0x4e, 0x89, 0x22, 0x09, 0x49, // 880 - 0xe0, 0xf5, 0x61, 0x1e, 0xf1, 0xbf, 0x2e, 0x8a, 0x72, 0x6e, 0x80, 0x59, 0xff, 0x57, 0x3a, 0xf9, // 896 - 0x75, 0x32, 0xa3, 0x4e, 0x5f, 0xec, 0xed, 0x28, 0x62, 0xd9, 0x4d, 0x73, 0xf2, 0xcc, 0x81, 0x17, // 912 - 0x60, 0xed, 0xcd, 0xeb, 0xdc, 0xdb, 0xa7, 0xca, 0xc5, 0x7e, 0x02, 0xbd, 0xf2, 0x54, 0x08, 0x54, // 928 - 0xfd, 0xb4, 0x2d, 0x09, 0x2c, 0x17, 0x54, 0x4a, 0x98, 0xd1, 0x54, 0xe1, 0x51, 0x67, 0x08, 0xd2, // 944 - 0xed, 0x6e, 0x7e, 0x6f, 0x3f, 0xd2, 0x2d, 0x81, 0x59, 0x29, 0x66, 0xcb, 0x90, 0x39, 0x95, 0x11, // 960 - 0x1e, 0x74, 0x27, 0xfe, 0xdd, 0xeb, 0xaf, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x3b, 0x00, 0x5b, // 976 - 0x30, 0x39, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, // 992 - 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, // 1008 - 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f, // 1024 - 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x30, 0x59, 0x30, 0x13, 0x06, // 1040 - 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, // 1056 - 0x01, 0x07, 0x03, 0x42, 0x00, 0x04, 0x29, 0x97, 0xa7, 0xc6, 0x41, 0x7f, 0xc0, 0x0d, 0x9b, 0xe8, // 1072 - 0x01, 0x1b, 0x56, 0xc6, 0xf2, 0x52, 0xa5, 0xba, 0x2d, 0xb2, 0x12, 0xe8, 0xd2, 0x2e, 0xd7, 0xfa, // 1088 - 0xc9, 0xc5, 0xd8, 0xaa, 0x6d, 0x1f, 0x73, 0x81, 0x3b, 0x3b, 0x98, 0x6b, 0x39, 0x7c, 0x33, 0xa5, // 1104 - 0xc5, 0x4e, 0x86, 0x8e, 0x80, 0x17, 0x68, 0x62, 0x45, 0x57, 0x7d, 0x44, 0x58, 0x1d, 0xb3, 0x37, // 1120 - 0xe5, 0x67, 0x08, 0xeb, 0x66, 0xde, 0x00, 0x3b, 0x00, 0x78, 0x30, 0x39, 0x31, 0x0b, 0x30, 0x09, // 1136 - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, // 1152 - 0x04, 0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, // 1168 - 0x55, 0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, // 1184 - 0x20, 0x43, 0x41, 0x20, 0x34, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, // 1200 - 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xd2, 0xab, 0x8a, // 1216 - 0x37, 0x4f, 0xa3, 0x53, 0x0d, 0xfe, 0xc1, 0x8a, 0x7b, 0x4b, 0xa8, 0x7b, 0x46, 0x4b, 0x63, 0xb0, // 1232 - 0x62, 0xf6, 0x2d, 0x1b, 0xdb, 0x08, 0x71, 0x21, 0xd2, 0x00, 0xe8, 0x63, 0xbd, 0x9a, 0x27, 0xfb, // 1248 - 0xf0, 0x39, 0x6e, 0x5d, 0xea, 0x3d, 0xa5, 0xc9, 0x81, 0xaa, 0xa3, 0x5b, 0x20, 0x98, 0x45, 0x5d, // 1264 - 0x16, 0xdb, 0xfd, 0xe8, 0x10, 0x6d, 0xe3, 0x9c, 0xe0, 0xe3, 0xbd, 0x5f, 0x84, 0x62, 0xf3, 0x70, // 1280 - 0x64, 0x33, 0xa0, 0xcb, 0x24, 0x2f, 0x70, 0xba, 0x88, 0xa1, 0x2a, 0xa0, 0x75, 0xf8, 0x81, 0xae, // 1296 - 0x62, 0x06, 0xc4, 0x81, 0xdb, 0x39, 0x6e, 0x29, 0xb0, 0x1e, 0xfa, 0x2e, 0x5c, 0x00, 0x41, 0x01, // 1312 - 0x26, 0x30, 0x3f, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1b, 0x44, 0x69, // 1328 - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, // 1344 - 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x2e, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, // 1360 - 0x04, 0x03, 0x13, 0x0e, 0x44, 0x53, 0x54, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, // 1376 - 0x58, 0x33, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, // 1392 - 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, // 1408 - 0x01, 0x01, 0x00, 0xdf, 0xaf, 0xe9, 0x97, 0x50, 0x08, 0x83, 0x57, 0xb4, 0xcc, 0x62, 0x65, 0xf6, // 1424 - 0x90, 0x82, 0xec, 0xc7, 0xd3, 0x2c, 0x6b, 0x30, 0xca, 0x5b, 0xec, 0xd9, 0xc3, 0x7d, 0xc7, 0x40, // 1440 - 0xc1, 0x18, 0x14, 0x8b, 0xe0, 0xe8, 0x33, 0x76, 0x49, 0x2a, 0xe3, 0x3f, 0x21, 0x49, 0x93, 0xac, // 1456 - 0x4e, 0x0e, 0xaf, 0x3e, 0x48, 0xcb, 0x65, 0xee, 0xfc, 0xd3, 0x21, 0x0f, 0x65, 0xd2, 0x2a, 0xd9, // 1472 - 0x32, 0x8f, 0x8c, 0xe5, 0xf7, 0x77, 0xb0, 0x12, 0x7b, 0xb5, 0x95, 0xc0, 0x89, 0xa3, 0xa9, 0xba, // 1488 - 0xed, 0x73, 0x2e, 0x7a, 0x0c, 0x06, 0x32, 0x83, 0xa2, 0x7e, 0x8a, 0x14, 0x30, 0xcd, 0x11, 0xa0, // 1504 - 0xe1, 0x2a, 0x38, 0xb9, 0x79, 0x0a, 0x31, 0xfd, 0x50, 0xbd, 0x80, 0x65, 0xdf, 0xb7, 0x51, 0x63, // 1520 - 0x83, 0xc8, 0xe2, 0x88, 0x61, 0xea, 0x4b, 0x61, 0x81, 0xec, 0x52, 0x6b, 0xb9, 0xa2, 0xe2, 0x4b, // 1536 - 0x1a, 0x28, 0x9f, 0x48, 0xa3, 0x9e, 0x0c, 0xda, 0x09, 0x8e, 0x3e, 0x17, 0x2e, 0x1e, 0xdd, 0x20, // 1552 - 0xdf, 0x5b, 0xc6, 0x2a, 0x8a, 0xab, 0x2e, 0xbd, 0x70, 0xad, 0xc5, 0x0b, 0x1a, 0x25, 0x90, 0x74, // 1568 - 0x72, 0xc5, 0x7b, 0x6a, 0xab, 0x34, 0xd6, 0x30, 0x89, 0xff, 0xe5, 0x68, 0x13, 0x7b, 0x54, 0x0b, // 1584 - 0xc8, 0xd6, 0xae, 0xec, 0x5a, 0x9c, 0x92, 0x1e, 0x3d, 0x64, 0xb3, 0x8c, 0xc6, 0xdf, 0xbf, 0xc9, // 1600 - 0x41, 0x70, 0xec, 0x16, 0x72, 0xd5, 0x26, 0xec, 0x38, 0x55, 0x39, 0x43, 0xd0, 0xfc, 0xfd, 0x18, // 1616 - 0x5c, 0x40, 0xf1, 0x97, 0xeb, 0xd5, 0x9a, 0x9b, 0x8d, 0x1d, 0xba, 0xda, 0x25, 0xb9, 0xc6, 0xd8, // 1632 - 0xdf, 0xc1, 0x15, 0x02, 0x3a, 0xab, 0xda, 0x6e, 0xf1, 0x3e, 0x2e, 0xf5, 0x5c, 0x08, 0x9c, 0x3c, // 1648 - 0xd6, 0x83, 0x69, 0xe4, 0x10, 0x9b, 0x19, 0x2a, 0xb6, 0x29, 0x57, 0xe3, 0xe5, 0x3d, 0x9b, 0x9f, // 1664 - 0xf0, 0x02, 0x5d, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x48, 0x00, 0x78, 0x30, 0x46, 0x31, 0x0b, // 1680 - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x45, 0x31, 0x19, 0x30, 0x17, 0x06, // 1696 - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, // 1712 - 0x20, 0x6e, 0x76, 0x2d, 0x73, 0x61, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, // 1728 - 0x13, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, // 1744 - 0x20, 0x45, 0x34, 0x36, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, // 1760 - 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x9c, 0x0e, 0xb1, 0xcf, // 1776 - 0xb7, 0xe8, 0x9e, 0x52, 0x77, 0x75, 0x34, 0xfa, 0xa5, 0x46, 0xa7, 0xad, 0x32, 0x19, 0x32, 0xb4, // 1792 - 0x07, 0xa9, 0x27, 0xca, 0x94, 0xbb, 0x0c, 0xd2, 0x0a, 0x10, 0xc7, 0xda, 0x89, 0xb0, 0x97, 0x0c, // 1808 - 0x70, 0x13, 0x09, 0x01, 0x8e, 0xd8, 0xea, 0x47, 0xea, 0xbe, 0xb2, 0x80, 0x2b, 0xcd, 0xfc, 0x28, // 1824 - 0x0d, 0xdb, 0xac, 0xbc, 0xa4, 0x86, 0x37, 0xed, 0x70, 0x08, 0x00, 0x75, 0xea, 0x93, 0x0b, 0x7b, // 1840 - 0x2e, 0x52, 0x9c, 0x23, 0x68, 0x23, 0x06, 0x43, 0xec, 0x92, 0x2f, 0x53, 0x84, 0xdb, 0xfb, 0x47, // 1856 - 0x14, 0x07, 0xe8, 0x5f, 0x94, 0x67, 0x5d, 0xc9, 0x7a, 0x81, 0x3c, 0x20, 0x00, 0x48, 0x02, 0x26, // 1872 - 0x30, 0x46, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x45, 0x31, // 1888 - 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, // 1904 - 0x53, 0x69, 0x67, 0x6e, 0x20, 0x6e, 0x76, 0x2d, 0x73, 0x61, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, // 1920 - 0x55, 0x04, 0x03, 0x13, 0x13, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, // 1936 - 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x52, 0x34, 0x36, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, // 1952 - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, // 1968 - 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xac, 0xac, 0x74, 0x32, 0xe8, 0xb3, 0x65, // 1984 - 0xe5, 0xba, 0xed, 0x43, 0x26, 0x1d, 0xa6, 0x89, 0x0d, 0x45, 0xba, 0x29, 0x88, 0xb2, 0xa4, 0x1d, // 2000 - 0x63, 0xdd, 0xd3, 0xc1, 0x2c, 0x09, 0x57, 0x89, 0x39, 0xa1, 0x55, 0xe9, 0x67, 0x34, 0x77, 0x0c, // 2016 - 0x6e, 0xe4, 0x55, 0x1d, 0x52, 0x25, 0xd2, 0x13, 0x6b, 0x5e, 0xe1, 0x1d, 0xa9, 0xb7, 0x7d, 0x89, // 2032 - 0x32, 0x5f, 0x0d, 0x9e, 0x9f, 0x2c, 0x7a, 0x63, 0x60, 0x40, 0x1f, 0xa6, 0xb0, 0xb6, 0x78, 0x8f, // 2048 - 0x99, 0x54, 0x96, 0x08, 0x58, 0xae, 0xe4, 0x06, 0xbc, 0x62, 0x05, 0x02, 0x16, 0xbf, 0xaf, 0xa8, // 2064 - 0x23, 0x03, 0xb6, 0x94, 0x0f, 0xbc, 0x6e, 0x6c, 0xc2, 0xcb, 0xd5, 0xa6, 0xbb, 0x0c, 0xe9, 0xf6, // 2080 - 0xc1, 0x02, 0xfb, 0x21, 0xde, 0x66, 0xdd, 0x17, 0xab, 0x74, 0x42, 0xef, 0xf0, 0x74, 0x2f, 0x25, // 2096 - 0xf4, 0xea, 0x6b, 0x55, 0x5b, 0x90, 0xdb, 0x9d, 0xdf, 0x5e, 0x87, 0x0a, 0x40, 0xfb, 0xad, 0x19, // 2112 - 0x6b, 0xfb, 0xf7, 0xca, 0x60, 0x88, 0xde, 0xda, 0xc1, 0x8f, 0xd6, 0xae, 0xd5, 0x7f, 0xd4, 0x3c, // 2128 - 0x83, 0xee, 0xd7, 0x16, 0x4c, 0x83, 0x45, 0x33, 0x6b, 0x27, 0xd0, 0x86, 0xd0, 0x1c, 0x2d, 0x6b, // 2144 - 0xf3, 0xab, 0x7d, 0xf1, 0x85, 0xa9, 0xf5, 0x28, 0xd2, 0xad, 0xef, 0xf3, 0x84, 0x4b, 0x1c, 0x87, // 2160 - 0xfc, 0x13, 0xa3, 0x3a, 0x72, 0xa2, 0x5a, 0x11, 0x2b, 0xd6, 0x27, 0x71, 0x27, 0xed, 0x81, 0x2d, // 2176 - 0x6d, 0x66, 0x81, 0x92, 0x87, 0xb4, 0x1b, 0x58, 0x7a, 0xcc, 0x3f, 0x0a, 0xfa, 0x46, 0x4f, 0x4d, // 2192 - 0x78, 0x5c, 0xf8, 0x2b, 0x48, 0xe3, 0x04, 0x84, 0xcb, 0x5d, 0xf6, 0xb4, 0x6a, 0xb3, 0x65, 0xfc, // 2208 - 0x42, 0x9e, 0x51, 0x26, 0x23, 0x20, 0xcb, 0x3d, 0x14, 0xf9, 0x81, 0xed, 0x65, 0x16, 0x00, 0x4f, // 2224 - 0x1a, 0x64, 0x97, 0x66, 0x08, 0xcf, 0x8c, 0x7b, 0xe3, 0x2b, 0xc0, 0x9d, 0xf9, 0x14, 0xf2, 0x1b, // 2240 - 0xf1, 0x56, 0x6a, 0x16, 0xbf, 0x2c, 0x85, 0x85, 0xcd, 0x78, 0x38, 0x9a, 0xeb, 0x42, 0x6a, 0x02, // 2256 - 0x34, 0x18, 0x83, 0x17, 0x4e, 0x94, 0x56, 0xf8, 0xb6, 0x82, 0xb5, 0xf3, 0x96, 0xdd, 0x3d, 0xf3, // 2272 - 0xbe, 0x7f, 0x20, 0x77, 0x3e, 0x7b, 0x19, 0x23, 0x6b, 0x2c, 0xd4, 0x72, 0x73, 0x43, 0x57, 0x7d, // 2288 - 0xe0, 0xf8, 0xd7, 0x69, 0x4f, 0x17, 0x36, 0x04, 0xf9, 0xc0, 0x90, 0x60, 0x37, 0x45, 0xde, 0xe6, // 2304 - 0x0c, 0xd8, 0x74, 0x8d, 0xae, 0x9c, 0xa2, 0x6d, 0x74, 0x5d, 0x42, 0xbe, 0x06, 0xf5, 0xd9, 0x64, // 2320 - 0x6e, 0x02, 0x10, 0xac, 0x89, 0xb0, 0x4c, 0x3b, 0x07, 0x4d, 0x40, 0x7e, 0x24, 0xc5, 0x8a, 0x98, // 2336 - 0x82, 0x79, 0x8e, 0xa4, 0xa7, 0x82, 0x20, 0x8d, 0x23, 0xfa, 0x27, 0x71, 0xc9, 0xdf, 0xc6, 0x41, // 2352 - 0x74, 0xa0, 0x4d, 0xf6, 0x91, 0x16, 0xdc, 0x46, 0x8c, 0x5f, 0x29, 0x63, 0x31, 0x59, 0x71, 0x0c, // 2368 - 0xd8, 0x6f, 0xc2, 0xb6, 0x32, 0x7d, 0xfb, 0xe6, 0x5d, 0x53, 0xa6, 0x7e, 0x15, 0xfc, 0xbb, 0x75, // 2384 - 0x7c, 0x5d, 0xec, 0xf8, 0xf6, 0x17, 0x1c, 0xec, 0xc7, 0x6b, 0x19, 0xcb, 0xf3, 0x7b, 0xf0, 0x2b, // 2400 - 0x07, 0xa5, 0xd9, 0x6c, 0x79, 0x54, 0x76, 0x6c, 0x9d, 0x1c, 0xa6, 0x6e, 0x0e, 0xe9, 0x79, 0x0c, // 2416 - 0xa8, 0x23, 0x6a, 0xa3, 0xdf, 0x1b, 0x30, 0x31, 0x9f, 0xb1, 0x54, 0x7b, 0xfe, 0x6a, 0xcb, 0x66, // 2432 - 0xaa, 0xdc, 0x65, 0xd0, 0xa2, 0x9e, 0x4a, 0x9a, 0x07, 0x21, 0x6b, 0x81, 0x8f, 0xdb, 0xc4, 0x59, // 2448 - 0xfa, 0xde, 0x22, 0xc0, 0x04, 0x9c, 0xe3, 0xaa, 0x5b, 0x36, 0x93, 0xe8, 0x3d, 0xbd, 0x7a, 0xa1, // 2464 - 0x9d, 0x0b, 0x76, 0xb1, 0x0b, 0xc7, 0x9d, 0xfd, 0xcf, 0x98, 0xa8, 0x06, 0xc2, 0xf8, 0x2a, 0xa3, // 2480 - 0xa1, 0x83, 0xa0, 0xb7, 0x25, 0x72, 0xa5, 0x02, 0xe3, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x49, // 2496 - 0x02, 0x26, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, // 2512 - 0x53, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x47, 0x6f, 0x6f, 0x67, // 2528 - 0x6c, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, // 2544 - 0x73, 0x20, 0x4c, 0x4c, 0x43, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0b, // 2560 - 0x47, 0x54, 0x53, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x52, 0x31, 0x30, 0x82, 0x02, 0x22, 0x30, // 2576 - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, // 2592 - 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xb6, 0x11, 0x02, 0x8b, // 2608 - 0x1e, 0xe3, 0xa1, 0x77, 0x9b, 0x3b, 0xdc, 0xbf, 0x94, 0x3e, 0xb7, 0x95, 0xa7, 0x40, 0x3c, 0xa1, // 2624 - 0xfd, 0x82, 0xf9, 0x7d, 0x32, 0x06, 0x82, 0x71, 0xf6, 0xf6, 0x8c, 0x7f, 0xfb, 0xe8, 0xdb, 0xbc, // 2640 - 0x6a, 0x2e, 0x97, 0x97, 0xa3, 0x8c, 0x4b, 0xf9, 0x2b, 0xf6, 0xb1, 0xf9, 0xce, 0x84, 0x1d, 0xb1, // 2656 - 0xf9, 0xc5, 0x97, 0xde, 0xef, 0xb9, 0xf2, 0xa3, 0xe9, 0xbc, 0x12, 0x89, 0x5e, 0xa7, 0xaa, 0x52, // 2672 - 0xab, 0xf8, 0x23, 0x27, 0xcb, 0xa4, 0xb1, 0x9c, 0x63, 0xdb, 0xd7, 0x99, 0x7e, 0xf0, 0x0a, 0x5e, // 2688 - 0xeb, 0x68, 0xa6, 0xf4, 0xc6, 0x5a, 0x47, 0x0d, 0x4d, 0x10, 0x33, 0xe3, 0x4e, 0xb1, 0x13, 0xa3, // 2704 - 0xc8, 0x18, 0x6c, 0x4b, 0xec, 0xfc, 0x09, 0x90, 0xdf, 0x9d, 0x64, 0x29, 0x25, 0x23, 0x07, 0xa1, // 2720 - 0xb4, 0xd2, 0x3d, 0x2e, 0x60, 0xe0, 0xcf, 0xd2, 0x09, 0x87, 0xbb, 0xcd, 0x48, 0xf0, 0x4d, 0xc2, // 2736 - 0xc2, 0x7a, 0x88, 0x8a, 0xbb, 0xba, 0xcf, 0x59, 0x19, 0xd6, 0xaf, 0x8f, 0xb0, 0x07, 0xb0, 0x9e, // 2752 - 0x31, 0xf1, 0x82, 0xc1, 0xc0, 0xdf, 0x2e, 0xa6, 0x6d, 0x6c, 0x19, 0x0e, 0xb5, 0xd8, 0x7e, 0x26, // 2768 - 0x1a, 0x45, 0x03, 0x3d, 0xb0, 0x79, 0xa4, 0x94, 0x28, 0xad, 0x0f, 0x7f, 0x26, 0xe5, 0xa8, 0x08, // 2784 - 0xfe, 0x96, 0xe8, 0x3c, 0x68, 0x94, 0x53, 0xee, 0x83, 0x3a, 0x88, 0x2b, 0x15, 0x96, 0x09, 0xb2, // 2800 - 0xe0, 0x7a, 0x8c, 0x2e, 0x75, 0xd6, 0x9c, 0xeb, 0xa7, 0x56, 0x64, 0x8f, 0x96, 0x4f, 0x68, 0xae, // 2816 - 0x3d, 0x97, 0xc2, 0x84, 0x8f, 0xc0, 0xbc, 0x40, 0xc0, 0x0b, 0x5c, 0xbd, 0xf6, 0x87, 0xb3, 0x35, // 2832 - 0x6c, 0xac, 0x18, 0x50, 0x7f, 0x84, 0xe0, 0x4c, 0xcd, 0x92, 0xd3, 0x20, 0xe9, 0x33, 0xbc, 0x52, // 2848 - 0x99, 0xaf, 0x32, 0xb5, 0x29, 0xb3, 0x25, 0x2a, 0xb4, 0x48, 0xf9, 0x72, 0xe1, 0xca, 0x64, 0xf7, // 2864 - 0xe6, 0x82, 0x10, 0x8d, 0xe8, 0x9d, 0xc2, 0x8a, 0x88, 0xfa, 0x38, 0x66, 0x8a, 0xfc, 0x63, 0xf9, // 2880 - 0x01, 0xf9, 0x78, 0xfd, 0x7b, 0x5c, 0x77, 0xfa, 0x76, 0x87, 0xfa, 0xec, 0xdf, 0xb1, 0x0e, 0x79, // 2896 - 0x95, 0x57, 0xb4, 0xbd, 0x26, 0xef, 0xd6, 0x01, 0xd1, 0xeb, 0x16, 0x0a, 0xbb, 0x8e, 0x0b, 0xb5, // 2912 - 0xc5, 0xc5, 0x8a, 0x55, 0xab, 0xd3, 0xac, 0xea, 0x91, 0x4b, 0x29, 0xcc, 0x19, 0xa4, 0x32, 0x25, // 2928 - 0x4e, 0x2a, 0xf1, 0x65, 0x44, 0xd0, 0x02, 0xce, 0xaa, 0xce, 0x49, 0xb4, 0xea, 0x9f, 0x7c, 0x83, // 2944 - 0xb0, 0x40, 0x7b, 0xe7, 0x43, 0xab, 0xa7, 0x6c, 0xa3, 0x8f, 0x7d, 0x89, 0x81, 0xfa, 0x4c, 0xa5, // 2960 - 0xff, 0xd5, 0x8e, 0xc3, 0xce, 0x4b, 0xe0, 0xb5, 0xd8, 0xb3, 0x8e, 0x45, 0xcf, 0x76, 0xc0, 0xed, // 2976 - 0x40, 0x2b, 0xfd, 0x53, 0x0f, 0xb0, 0xa7, 0xd5, 0x3b, 0x0d, 0xb1, 0x8a, 0xa2, 0x03, 0xde, 0x31, // 2992 - 0xad, 0xcc, 0x77, 0xea, 0x6f, 0x7b, 0x3e, 0xd6, 0xdf, 0x91, 0x22, 0x12, 0xe6, 0xbe, 0xfa, 0xd8, // 3008 - 0x32, 0xfc, 0x10, 0x63, 0x14, 0x51, 0x72, 0xde, 0x5d, 0xd6, 0x16, 0x93, 0xbd, 0x29, 0x68, 0x33, // 3024 - 0xef, 0x3a, 0x66, 0xec, 0x07, 0x8a, 0x26, 0xdf, 0x13, 0xd7, 0x57, 0x65, 0x78, 0x27, 0xde, 0x5e, // 3040 - 0x49, 0x14, 0x00, 0xa2, 0x00, 0x7f, 0x9a, 0xa8, 0x21, 0xb6, 0xa9, 0xb1, 0x95, 0xb0, 0xa5, 0xb9, // 3056 - 0x0d, 0x16, 0x11, 0xda, 0xc7, 0x6c, 0x48, 0x3c, 0x40, 0xe0, 0x7e, 0x0d, 0x5a, 0xcd, 0x56, 0x3c, // 3072 - 0xd1, 0x97, 0x05, 0xb9, 0xcb, 0x4b, 0xed, 0x39, 0x4b, 0x9c, 0xc4, 0x3f, 0xd2, 0x55, 0x13, 0x6e, // 3088 - 0x24, 0xb0, 0xd6, 0x71, 0xfa, 0xf4, 0xc1, 0xba, 0xcc, 0xed, 0x1b, 0xf5, 0xfe, 0x81, 0x41, 0xd8, // 3104 - 0x00, 0x98, 0x3d, 0x3a, 0xc8, 0xae, 0x7a, 0x98, 0x37, 0x18, 0x05, 0x95, 0x02, 0x03, 0x01, 0x00, // 3120 - 0x01, 0x00, 0x49, 0x02, 0x26, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, // 3136 - 0x13, 0x02, 0x55, 0x53, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x47, // 3152 - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, // 3168 - 0x69, 0x63, 0x65, 0x73, 0x20, 0x4c, 0x4c, 0x43, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, // 3184 - 0x03, 0x13, 0x0b, 0x47, 0x54, 0x53, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x52, 0x32, 0x30, 0x82, // 3200 - 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, // 3216 - 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xce, // 3232 - 0xde, 0xfd, 0xa6, 0xfb, 0xec, 0xec, 0x14, 0x34, 0x3c, 0x07, 0x06, 0x5a, 0x6c, 0x59, 0xf7, 0x19, // 3248 - 0x35, 0xdd, 0xf7, 0xc1, 0x9d, 0x55, 0xaa, 0xd3, 0xcd, 0x3b, 0xa4, 0x93, 0x72, 0xef, 0x0a, 0xfa, // 3264 - 0x6d, 0x9d, 0xf6, 0xf0, 0x85, 0x80, 0x5b, 0xa1, 0x48, 0x52, 0x9f, 0x39, 0xc5, 0xb7, 0xee, 0x28, // 3280 - 0xac, 0xef, 0xcb, 0x76, 0x68, 0x14, 0xb9, 0xdf, 0xad, 0x01, 0x6c, 0x99, 0x1f, 0xc4, 0x22, 0x1d, // 3296 - 0x9f, 0xfe, 0x72, 0x77, 0xe0, 0x2c, 0x5b, 0xaf, 0xe4, 0x04, 0xbf, 0x4f, 0x72, 0xa0, 0x1a, 0x34, // 3312 - 0x98, 0xe8, 0x39, 0x68, 0xec, 0x95, 0x25, 0x7b, 0x76, 0xa1, 0xe6, 0x69, 0xb9, 0x85, 0x19, 0xbd, // 3328 - 0x89, 0x8c, 0xfe, 0xad, 0xed, 0x36, 0xea, 0x73, 0xbc, 0xff, 0x83, 0xe2, 0xcb, 0x7d, 0xc1, 0xd2, // 3344 - 0xce, 0x4a, 0xb3, 0x8d, 0x05, 0x9e, 0x8b, 0x49, 0x93, 0xdf, 0xc1, 0x5b, 0xd0, 0x6e, 0x5e, 0xf0, // 3360 - 0x2e, 0x30, 0x2e, 0x82, 0xfc, 0xfa, 0xbc, 0xb4, 0x17, 0x0a, 0x48, 0xe5, 0x88, 0x9b, 0xc5, 0x9b, // 3376 - 0x6b, 0xde, 0xb0, 0xca, 0xb4, 0x03, 0xf0, 0xda, 0xf4, 0x90, 0xb8, 0x65, 0x64, 0xf7, 0x5c, 0x4c, // 3392 - 0xad, 0xe8, 0x7e, 0x66, 0x5e, 0x99, 0xd7, 0xb8, 0xc2, 0x3e, 0xc8, 0xd0, 0x13, 0x9d, 0xad, 0xee, // 3408 - 0xe4, 0x45, 0x7b, 0x89, 0x55, 0xf7, 0x8a, 0x1f, 0x62, 0x52, 0x84, 0x12, 0xb3, 0xc2, 0x40, 0x97, // 3424 - 0xe3, 0x8a, 0x1f, 0x47, 0x91, 0xa6, 0x74, 0x5a, 0xd2, 0xf8, 0xb1, 0x63, 0x28, 0x10, 0xb8, 0xb3, // 3440 - 0x09, 0xb8, 0x56, 0x77, 0x40, 0xa2, 0x26, 0x98, 0x79, 0xc6, 0xfe, 0xdf, 0x25, 0xee, 0x3e, 0xe5, // 3456 - 0xa0, 0x7f, 0xd4, 0x61, 0x0f, 0x51, 0x4b, 0x3c, 0x3f, 0x8c, 0xda, 0xe1, 0x70, 0x74, 0xd8, 0xc2, // 3472 - 0x68, 0xa1, 0xf9, 0xc1, 0x0c, 0xe9, 0xa1, 0xe2, 0x7f, 0xbb, 0x55, 0x3c, 0x76, 0x06, 0xee, 0x6a, // 3488 - 0x4e, 0xcc, 0x92, 0x88, 0x30, 0x4d, 0x9a, 0xbd, 0x4f, 0x0b, 0x48, 0x9a, 0x84, 0xb5, 0x98, 0xa3, // 3504 - 0xd5, 0xfb, 0x73, 0xc1, 0x57, 0x61, 0xdd, 0x28, 0x56, 0x75, 0x13, 0xae, 0x87, 0x8e, 0xe7, 0x0c, // 3520 - 0x51, 0x09, 0x10, 0x75, 0x88, 0x4c, 0xbc, 0x8d, 0xf9, 0x7b, 0x3c, 0xd4, 0x22, 0x48, 0x1f, 0x2a, // 3536 - 0xdc, 0xeb, 0x6b, 0xbb, 0x44, 0xb1, 0xcb, 0x33, 0x71, 0x32, 0x46, 0xaf, 0xad, 0x4a, 0xf1, 0x8c, // 3552 - 0xe8, 0x74, 0x3a, 0xac, 0xe7, 0x1a, 0x22, 0x73, 0x80, 0xd2, 0x30, 0xf7, 0x25, 0x42, 0xc7, 0x22, // 3568 - 0x3b, 0x3b, 0x12, 0xad, 0x96, 0x2e, 0xc6, 0xc3, 0x76, 0x07, 0xaa, 0x20, 0xb7, 0x35, 0x49, 0x57, // 3584 - 0xe9, 0x92, 0x49, 0xe8, 0x76, 0x16, 0x72, 0x31, 0x67, 0x2b, 0x96, 0x7e, 0x8a, 0xa3, 0xc7, 0x94, // 3600 - 0x56, 0x22, 0xbf, 0x6a, 0x4b, 0x7e, 0x01, 0x21, 0xb2, 0x23, 0x32, 0xdf, 0xe4, 0x9a, 0x44, 0x6d, // 3616 - 0x59, 0x5b, 0x5d, 0xf5, 0x00, 0xa0, 0x1c, 0x9b, 0xc6, 0x78, 0x97, 0x8d, 0x90, 0xff, 0x9b, 0xc8, // 3632 - 0xaa, 0xb4, 0xaf, 0x11, 0x51, 0x39, 0x5e, 0xd9, 0xfb, 0x67, 0xad, 0xd5, 0x5b, 0x11, 0x9d, 0x32, // 3648 - 0x9a, 0x1b, 0xbd, 0xd5, 0xba, 0x5b, 0xa5, 0xc9, 0xcb, 0x25, 0x69, 0x53, 0x55, 0x27, 0x5c, 0xe0, // 3664 - 0xca, 0x36, 0xcb, 0x88, 0x61, 0xfb, 0x1e, 0xb7, 0xd0, 0xcb, 0xee, 0x16, 0xfb, 0xd3, 0xa6, 0x4c, // 3680 - 0xde, 0x92, 0xa5, 0xd4, 0xe2, 0xdf, 0xf5, 0x06, 0x54, 0xde, 0x2e, 0x9d, 0x4b, 0xb4, 0x93, 0x30, // 3696 - 0xaa, 0x81, 0xce, 0xdd, 0x1a, 0xdc, 0x51, 0x73, 0x0d, 0x4f, 0x70, 0xe9, 0xe5, 0xb6, 0x16, 0x21, // 3712 - 0x19, 0x79, 0xb2, 0xe6, 0x89, 0x0b, 0x75, 0x64, 0xca, 0xd5, 0xab, 0xbc, 0x09, 0xc1, 0x18, 0xa1, // 3728 - 0xff, 0xd4, 0x54, 0xa1, 0x85, 0x3c, 0xfd, 0x14, 0x24, 0x03, 0xb2, 0x87, 0xd3, 0xa4, 0xb7, 0x02, // 3744 - 0x03, 0x01, 0x00, 0x01, 0x00, 0x49, 0x00, 0x78, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, // 3760 - 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, // 3776 - 0x13, 0x19, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53, // 3792 - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x4c, 0x4c, 0x43, 0x31, 0x14, 0x30, 0x12, 0x06, // 3808 - 0x03, 0x55, 0x04, 0x03, 0x13, 0x0b, 0x47, 0x54, 0x53, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x52, // 3824 - 0x33, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, // 3840 - 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x1f, 0x4f, 0x33, 0x87, 0x33, 0x29, 0x8a, // 3856 - 0xa1, 0x84, 0xde, 0xcb, 0xc7, 0x21, 0x58, 0x41, 0x89, 0xea, 0x56, 0x9d, 0x2b, 0x4b, 0x85, 0xc6, // 3872 - 0x1d, 0x4c, 0x27, 0xbc, 0x7f, 0x26, 0x51, 0x72, 0x6f, 0xe2, 0x9f, 0xd6, 0xa3, 0xca, 0xcc, 0x45, // 3888 - 0x14, 0x46, 0x8b, 0xad, 0xef, 0x7e, 0x86, 0x8c, 0xec, 0xb1, 0x7e, 0x2f, 0xff, 0xa9, 0x71, 0x9d, // 3904 - 0x18, 0x84, 0x45, 0x04, 0x41, 0x55, 0x6e, 0x2b, 0xea, 0x26, 0x7f, 0xbb, 0x90, 0x01, 0xe3, 0x4b, // 3920 - 0x19, 0xba, 0xe4, 0x54, 0x96, 0x45, 0x09, 0xb1, 0xd5, 0x6c, 0x91, 0x44, 0xad, 0x84, 0x13, 0x8e, // 3936 - 0x9a, 0x8c, 0x0d, 0x80, 0x0c, 0x32, 0xf6, 0xe0, 0x27, 0x00, 0x49, 0x00, 0x78, 0x30, 0x47, 0x31, // 3952 - 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x22, 0x30, 0x20, // 3968 - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x54, 0x72, // 3984 - 0x75, 0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x4c, 0x4c, 0x43, // 4000 - 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0b, 0x47, 0x54, 0x53, 0x20, 0x52, // 4016 - 0x6f, 0x6f, 0x74, 0x20, 0x52, 0x34, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, // 4032 - 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xf3, 0x74, // 4048 - 0x73, 0xa7, 0x68, 0x8b, 0x60, 0xae, 0x43, 0xb8, 0x35, 0xc5, 0x81, 0x30, 0x7b, 0x4b, 0x49, 0x9d, // 4064 - 0xfb, 0xc1, 0x61, 0xce, 0xe6, 0xde, 0x46, 0xbd, 0x6b, 0xd5, 0x61, 0x18, 0x35, 0xae, 0x40, 0xdd, // 4080 - 0x73, 0xf7, 0x89, 0x91, 0x30, 0x5a, 0xeb, 0x3c, 0xee, 0x85, 0x7c, 0xa2, 0x40, 0x76, 0x3b, 0xa9, // 4096 - 0xc6, 0xb8, 0x47, 0xd8, 0x2a, 0xe7, 0x92, 0x91, 0x6a, 0x73, 0xe9, 0xb1, 0x72, 0x39, 0x9f, 0x29, // 4112 - 0x9f, 0xa2, 0x98, 0xd3, 0x5f, 0x5e, 0x58, 0x86, 0x65, 0x0f, 0xa1, 0x84, 0x65, 0x06, 0xd1, 0xdc, // 4128 - 0x8b, 0xc9, 0xc7, 0x73, 0xc8, 0x8c, 0x6a, 0x2f, 0xe5, 0xc4, 0xab, 0xd1, 0x1d, 0x8a, 0x00, 0x4c, // 4144 - 0x02, 0x26, 0x30, 0x4a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, // 4160 - 0x53, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x09, 0x49, 0x64, 0x65, 0x6e, // 4176 - 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1e, // 4192 - 0x49, 0x64, 0x65, 0x6e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, // 4208 - 0x63, 0x69, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, 0x82, // 4224 - 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, // 4240 - 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xa7, // 4256 - 0x50, 0x19, 0xde, 0x3f, 0x99, 0x3d, 0xd4, 0x33, 0x46, 0xf1, 0x6f, 0x51, 0x61, 0x82, 0xb2, 0xa9, // 4272 - 0x4f, 0x8f, 0x67, 0x89, 0x5d, 0x84, 0xd9, 0x53, 0xdd, 0x0c, 0x28, 0xd9, 0xd7, 0xf0, 0xff, 0xae, // 4288 - 0x95, 0x43, 0x72, 0x99, 0xf9, 0xb5, 0x5d, 0x7c, 0x8a, 0xc1, 0x42, 0xe1, 0x31, 0x50, 0x74, 0xd1, // 4304 - 0x81, 0x0d, 0x7c, 0xcd, 0x9b, 0x21, 0xab, 0x43, 0xe2, 0xac, 0xad, 0x5e, 0x86, 0x6e, 0xf3, 0x09, // 4320 - 0x8a, 0x1f, 0x5a, 0x32, 0xbd, 0xa2, 0xeb, 0x94, 0xf9, 0xe8, 0x5c, 0x0a, 0xec, 0xff, 0x98, 0xd2, // 4336 - 0xaf, 0x71, 0xb3, 0xb4, 0x53, 0x9f, 0x4e, 0x87, 0xef, 0x92, 0xbc, 0xbd, 0xec, 0x4f, 0x32, 0x30, // 4352 - 0x88, 0x4b, 0x17, 0x5e, 0x57, 0xc4, 0x53, 0xc2, 0xf6, 0x02, 0x97, 0x8d, 0xd9, 0x62, 0x2b, 0xbf, // 4368 - 0x24, 0x1f, 0x62, 0x8d, 0xdf, 0xc3, 0xb8, 0x29, 0x4b, 0x49, 0x78, 0x3c, 0x93, 0x60, 0x88, 0x22, // 4384 - 0xfc, 0x99, 0xda, 0x36, 0xc8, 0xc2, 0xa2, 0xd4, 0x2c, 0x54, 0x00, 0x67, 0x35, 0x6e, 0x73, 0xbf, // 4400 - 0x02, 0x58, 0xf0, 0xa4, 0xdd, 0xe5, 0xb0, 0xa2, 0x26, 0x7a, 0xca, 0xe0, 0x36, 0xa5, 0x19, 0x16, // 4416 - 0xf5, 0xfd, 0xb7, 0xef, 0xae, 0x3f, 0x40, 0xf5, 0x6d, 0x5a, 0x04, 0xfd, 0xce, 0x34, 0xca, 0x24, // 4432 - 0xdc, 0x74, 0x23, 0x1b, 0x5d, 0x33, 0x13, 0x12, 0x5d, 0xc4, 0x01, 0x25, 0xf6, 0x30, 0xdd, 0x02, // 4448 - 0x5d, 0x9f, 0xe0, 0xd5, 0x47, 0xbd, 0xb4, 0xeb, 0x1b, 0xa1, 0xbb, 0x49, 0x49, 0xd8, 0x9f, 0x5b, // 4464 - 0x02, 0xf3, 0x8a, 0xe4, 0x24, 0x90, 0xe4, 0x62, 0x4f, 0x4f, 0xc1, 0xaf, 0x8b, 0x0e, 0x74, 0x17, // 4480 - 0xa8, 0xd1, 0x72, 0x88, 0x6a, 0x7a, 0x01, 0x49, 0xcc, 0xb4, 0x46, 0x79, 0xc6, 0x17, 0xb1, 0xda, // 4496 - 0x98, 0x1e, 0x07, 0x59, 0xfa, 0x75, 0x21, 0x85, 0x65, 0xdd, 0x90, 0x56, 0xce, 0xfb, 0xab, 0xa5, // 4512 - 0x60, 0x9d, 0xc4, 0x9d, 0xf9, 0x52, 0xb0, 0x8b, 0xbd, 0x87, 0xf9, 0x8f, 0x2b, 0x23, 0x0a, 0x23, // 4528 - 0x76, 0x3b, 0xf7, 0x33, 0xe1, 0xc9, 0x00, 0xf3, 0x69, 0xf9, 0x4b, 0xa2, 0xe0, 0x4e, 0xbc, 0x7e, // 4544 - 0x93, 0x39, 0x84, 0x07, 0xf7, 0x44, 0x70, 0x7e, 0xfe, 0x07, 0x5a, 0xe5, 0xb1, 0xac, 0xd1, 0x18, // 4560 - 0xcc, 0xf2, 0x35, 0xe5, 0x49, 0x49, 0x08, 0xca, 0x56, 0xc9, 0x3d, 0xfb, 0x0f, 0x18, 0x7d, 0x8b, // 4576 - 0x3b, 0xc1, 0x13, 0xc2, 0x4d, 0x8f, 0xc9, 0x4f, 0x0e, 0x37, 0xe9, 0x1f, 0xa1, 0x0e, 0x6a, 0xdf, // 4592 - 0x62, 0x2e, 0xcb, 0x35, 0x06, 0x51, 0x79, 0x2c, 0xc8, 0x25, 0x38, 0xf4, 0xfa, 0x4b, 0xa7, 0x89, // 4608 - 0x5c, 0x9c, 0xd2, 0xe3, 0x0d, 0x39, 0x86, 0x4a, 0x74, 0x7c, 0xd5, 0x59, 0x87, 0xc2, 0x3f, 0x4e, // 4624 - 0x0c, 0x5c, 0x52, 0xf4, 0x3d, 0xf7, 0x52, 0x82, 0xf1, 0xea, 0xa3, 0xac, 0xfd, 0x49, 0x34, 0x1a, // 4640 - 0x28, 0xf3, 0x41, 0x88, 0x3a, 0x13, 0xee, 0xe8, 0xde, 0xff, 0x99, 0x1d, 0x5f, 0xba, 0xcb, 0xe8, // 4656 - 0x1e, 0xf2, 0xb9, 0x50, 0x60, 0xc0, 0x31, 0xd3, 0x73, 0xe5, 0xef, 0xbe, 0xa0, 0xed, 0x33, 0x0b, // 4672 - 0x74, 0xbe, 0x20, 0x20, 0xc4, 0x67, 0x6c, 0xf0, 0x08, 0x03, 0x7a, 0x55, 0x80, 0x7f, 0x46, 0x4e, // 4688 - 0x96, 0xa7, 0xf4, 0x1e, 0x3e, 0xe1, 0xf6, 0xd8, 0x09, 0xe1, 0x33, 0x64, 0x2b, 0x63, 0xd7, 0x32, // 4704 - 0x5e, 0x9f, 0xf9, 0xc0, 0x7b, 0x0f, 0x78, 0x6f, 0x97, 0xbc, 0x93, 0x9a, 0xf9, 0x9c, 0x12, 0x90, // 4720 - 0x78, 0x7a, 0x80, 0x87, 0x15, 0xd7, 0x72, 0x74, 0x9c, 0x55, 0x74, 0x78, 0xb1, 0xba, 0xe1, 0x6e, // 4736 - 0x70, 0x04, 0xba, 0x4f, 0xa0, 0xba, 0x68, 0xc3, 0x7b, 0xff, 0x31, 0xf0, 0x73, 0x3d, 0x3d, 0x94, // 4752 - 0x2a, 0xb1, 0x0b, 0x41, 0x0e, 0xa0, 0xfe, 0x4d, 0x88, 0x65, 0x6b, 0x79, 0x33, 0xb4, 0xd7, 0x02, // 4768 - 0x03, 0x01, 0x00, 0x01, 0x00, 0x4e, 0x01, 0x26, 0x30, 0x4c, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, // 4784 - 0x55, 0x04, 0x0b, 0x13, 0x17, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, // 4800 - 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x52, 0x33, 0x31, 0x13, 0x30, 0x11, // 4816 - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, // 4832 - 0x6e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, // 4848 - 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, // 4864 - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, // 4880 - 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xcc, 0x25, 0x76, 0x90, 0x79, 0x06, 0x78, 0x22, 0x16, // 4896 - 0xf5, 0xc0, 0x83, 0xb6, 0x84, 0xca, 0x28, 0x9e, 0xfd, 0x05, 0x76, 0x11, 0xc5, 0xad, 0x88, 0x72, // 4912 - 0xfc, 0x46, 0x02, 0x43, 0xc7, 0xb2, 0x8a, 0x9d, 0x04, 0x5f, 0x24, 0xcb, 0x2e, 0x4b, 0xe1, 0x60, // 4928 - 0x82, 0x46, 0xe1, 0x52, 0xab, 0x0c, 0x81, 0x47, 0x70, 0x6c, 0xdd, 0x64, 0xd1, 0xeb, 0xf5, 0x2c, // 4944 - 0xa3, 0x0f, 0x82, 0x3d, 0x0c, 0x2b, 0xae, 0x97, 0xd7, 0xb6, 0x14, 0x86, 0x10, 0x79, 0xbb, 0x3b, // 4960 - 0x13, 0x80, 0x77, 0x8c, 0x08, 0xe1, 0x49, 0xd2, 0x6a, 0x62, 0x2f, 0x1f, 0x5e, 0xfa, 0x96, 0x68, // 4976 - 0xdf, 0x89, 0x27, 0x95, 0x38, 0x9f, 0x06, 0xd7, 0x3e, 0xc9, 0xcb, 0x26, 0x59, 0x0d, 0x73, 0xde, // 4992 - 0xb0, 0xc8, 0xe9, 0x26, 0x0e, 0x83, 0x15, 0xc6, 0xef, 0x5b, 0x8b, 0xd2, 0x04, 0x60, 0xca, 0x49, // 5008 - 0xa6, 0x28, 0xf6, 0x69, 0x3b, 0xf6, 0xcb, 0xc8, 0x28, 0x91, 0xe5, 0x9d, 0x8a, 0x61, 0x57, 0x37, // 5024 - 0xac, 0x74, 0x14, 0xdc, 0x74, 0xe0, 0x3a, 0xee, 0x72, 0x2f, 0x2e, 0x9c, 0xfb, 0xd0, 0xbb, 0xbf, // 5040 - 0xf5, 0x3d, 0x00, 0xe1, 0x06, 0x33, 0xe8, 0x82, 0x2b, 0xae, 0x53, 0xa6, 0x3a, 0x16, 0x73, 0x8c, // 5056 - 0xdd, 0x41, 0x0e, 0x20, 0x3a, 0xc0, 0xb4, 0xa7, 0xa1, 0xe9, 0xb2, 0x4f, 0x90, 0x2e, 0x32, 0x60, // 5072 - 0xe9, 0x57, 0xcb, 0xb9, 0x04, 0x92, 0x68, 0x68, 0xe5, 0x38, 0x26, 0x60, 0x75, 0xb2, 0x9f, 0x77, // 5088 - 0xff, 0x91, 0x14, 0xef, 0xae, 0x20, 0x49, 0xfc, 0xad, 0x40, 0x15, 0x48, 0xd1, 0x02, 0x31, 0x61, // 5104 - 0x19, 0x5e, 0xb8, 0x97, 0xef, 0xad, 0x77, 0xb7, 0x64, 0x9a, 0x7a, 0xbf, 0x5f, 0xc1, 0x13, 0xef, // 5120 - 0x9b, 0x62, 0xfb, 0x0d, 0x6c, 0xe0, 0x54, 0x69, 0x16, 0xa9, 0x03, 0xda, 0x6e, 0xe9, 0x83, 0x93, // 5136 - 0x71, 0x76, 0xc6, 0x69, 0x85, 0x82, 0x17, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x4e, 0x02, 0x26, // 5152 - 0x30, 0x4c, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x17, 0x47, 0x6c, 0x6f, // 5168 - 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, // 5184 - 0x2d, 0x20, 0x52, 0x36, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x47, // 5200 - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, // 5216 - 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x30, 0x82, // 5232 - 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, // 5248 - 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0x95, // 5264 - 0x07, 0xe8, 0x73, 0xca, 0x66, 0xf9, 0xec, 0x14, 0xca, 0x7b, 0x3c, 0xf7, 0x0d, 0x08, 0xf1, 0xb4, // 5280 - 0x45, 0x0b, 0x2c, 0x82, 0xb4, 0x48, 0xc6, 0xeb, 0x5b, 0x3c, 0xae, 0x83, 0xb8, 0x41, 0x92, 0x33, // 5296 - 0x14, 0xa4, 0x6f, 0x7f, 0xe9, 0x2a, 0xcc, 0xc6, 0xb0, 0x88, 0x6b, 0xc5, 0xb6, 0x89, 0xd1, 0xc6, // 5312 - 0xb2, 0xff, 0x14, 0xce, 0x51, 0x14, 0x21, 0xec, 0x4a, 0xdd, 0x1b, 0x5a, 0xc6, 0xd6, 0x87, 0xee, // 5328 - 0x4d, 0x3a, 0x15, 0x06, 0xed, 0x64, 0x66, 0x0b, 0x92, 0x80, 0xca, 0x44, 0xde, 0x73, 0x94, 0x4e, // 5344 - 0xf3, 0xa7, 0x89, 0x7f, 0x4f, 0x78, 0x63, 0x08, 0xc8, 0x12, 0x50, 0x6d, 0x42, 0x66, 0x2f, 0x4d, // 5360 - 0xb9, 0x79, 0x28, 0x4d, 0x52, 0x1a, 0x8a, 0x1a, 0x80, 0xb7, 0x19, 0x81, 0x0e, 0x7e, 0xc4, 0x8a, // 5376 - 0xbc, 0x64, 0x4c, 0x21, 0x1c, 0x43, 0x68, 0xd7, 0x3d, 0x3c, 0x8a, 0xc5, 0xb2, 0x66, 0xd5, 0x90, // 5392 - 0x9a, 0xb7, 0x31, 0x06, 0xc5, 0xbe, 0xe2, 0x6d, 0x32, 0x06, 0xa6, 0x1e, 0xf9, 0xb9, 0xeb, 0xaa, // 5408 - 0xa3, 0xb8, 0xbf, 0xbe, 0x82, 0x63, 0x50, 0xd0, 0xf0, 0x18, 0x89, 0xdf, 0xe4, 0x0f, 0x79, 0xf5, // 5424 - 0xea, 0xa2, 0x1f, 0x2a, 0xd2, 0x70, 0x2e, 0x7b, 0xe7, 0xbc, 0x93, 0xbb, 0x6d, 0x53, 0xe2, 0x48, // 5440 - 0x7c, 0x8c, 0x10, 0x07, 0x38, 0xff, 0x66, 0xb2, 0x77, 0x61, 0x7e, 0xe0, 0xea, 0x8c, 0x3c, 0xaa, // 5456 - 0xb4, 0xa4, 0xf6, 0xf3, 0x95, 0x4a, 0x12, 0x07, 0x6d, 0xfd, 0x8c, 0xb2, 0x89, 0xcf, 0xd0, 0xa0, // 5472 - 0x61, 0x77, 0xc8, 0x58, 0x74, 0xb0, 0xd4, 0x23, 0x3a, 0xf7, 0x5d, 0x3a, 0xca, 0xa2, 0xdb, 0x9d, // 5488 - 0x09, 0xde, 0x5d, 0x44, 0x2d, 0x90, 0xf1, 0x81, 0xcd, 0x57, 0x92, 0xfa, 0x7e, 0xbc, 0x50, 0x04, // 5504 - 0x63, 0x34, 0xdf, 0x6b, 0x93, 0x18, 0xbe, 0x6b, 0x36, 0xb2, 0x39, 0xe4, 0xac, 0x24, 0x36, 0xb7, // 5520 - 0xf0, 0xef, 0xb6, 0x1c, 0x13, 0x57, 0x93, 0xb6, 0xde, 0xb2, 0xf8, 0xe2, 0x85, 0xb7, 0x73, 0xa2, // 5536 - 0xb8, 0x35, 0xaa, 0x45, 0xf2, 0xe0, 0x9d, 0x36, 0xa1, 0x6f, 0x54, 0x8a, 0xf1, 0x72, 0x56, 0x6e, // 5552 - 0x2e, 0x88, 0xc5, 0x51, 0x42, 0x44, 0x15, 0x94, 0xee, 0xa3, 0xc5, 0x38, 0x96, 0x9b, 0x4e, 0x4e, // 5568 - 0x5a, 0x0b, 0x47, 0xf3, 0x06, 0x36, 0x49, 0x77, 0x30, 0xbc, 0x71, 0x37, 0xe5, 0xa6, 0xec, 0x21, // 5584 - 0x08, 0x75, 0xfc, 0xe6, 0x61, 0x16, 0x3f, 0x77, 0xd5, 0xd9, 0x91, 0x97, 0x84, 0x0a, 0x6c, 0xd4, // 5600 - 0x02, 0x4d, 0x74, 0xc0, 0x14, 0xed, 0xfd, 0x39, 0xfb, 0x83, 0xf2, 0x5e, 0x14, 0xa1, 0x04, 0xb0, // 5616 - 0x0b, 0xe9, 0xfe, 0xee, 0x8f, 0xe1, 0x6e, 0x0b, 0xb2, 0x08, 0xb3, 0x61, 0x66, 0x09, 0x6a, 0xb1, // 5632 - 0x06, 0x3a, 0x65, 0x96, 0x59, 0xc0, 0xf0, 0x35, 0xfd, 0xc9, 0xda, 0x28, 0x8d, 0x1a, 0x11, 0x87, // 5648 - 0x70, 0x81, 0x0a, 0xa8, 0x9a, 0x75, 0x1d, 0x9e, 0x3a, 0x86, 0x05, 0x00, 0x9e, 0xdb, 0x80, 0xd6, // 5664 - 0x25, 0xf9, 0xdc, 0x05, 0x9e, 0x27, 0x59, 0x4c, 0x76, 0x39, 0x5b, 0xea, 0xf9, 0xa5, 0xa1, 0xd8, // 5680 - 0x83, 0x0f, 0xd1, 0xff, 0xdf, 0x30, 0x11, 0xf9, 0x85, 0xcf, 0x33, 0x48, 0xf5, 0xca, 0x6d, 0x64, // 5696 - 0x14, 0x2c, 0x7a, 0x58, 0x4f, 0xd3, 0x4b, 0x08, 0x49, 0xc5, 0x95, 0x64, 0x1a, 0x63, 0x0e, 0x79, // 5712 - 0x3d, 0xf5, 0xb3, 0x8c, 0xca, 0x58, 0xad, 0x9c, 0x42, 0x45, 0x79, 0x6e, 0x0e, 0x87, 0x19, 0x5c, // 5728 - 0x54, 0xb1, 0x65, 0xb6, 0xbf, 0x8c, 0x9b, 0xdc, 0x13, 0xe9, 0x0d, 0x6f, 0xb8, 0x2e, 0xdc, 0x67, // 5744 - 0x6e, 0xc9, 0x8b, 0x11, 0xb5, 0x84, 0x14, 0x8a, 0x00, 0x19, 0x70, 0x83, 0x79, 0x91, 0x97, 0x91, // 5760 - 0xd4, 0x1a, 0x27, 0xbf, 0x37, 0x1e, 0x32, 0x07, 0xd8, 0x14, 0x63, 0x3c, 0x28, 0x4c, 0xaf, 0x02, // 5776 - 0x03, 0x01, 0x00, 0x01, 0x00, 0x4f, 0x02, 0x26, 0x30, 0x4d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, // 5792 - 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, // 5808 - 0x13, 0x09, 0x49, 0x64, 0x65, 0x6e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x2a, 0x30, 0x28, 0x06, // 5824 - 0x03, 0x55, 0x04, 0x03, 0x13, 0x21, 0x49, 0x64, 0x65, 0x6e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, // 5840 - 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x53, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x52, 0x6f, // 5856 - 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, // 5872 - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, // 5888 - 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xb6, 0x22, 0x94, 0xfc, 0xa4, 0x48, 0xaf, 0xe8, // 5904 - 0x47, 0x6b, 0x0a, 0xfb, 0x27, 0x76, 0xe4, 0xf2, 0x3f, 0x8a, 0x3b, 0x7a, 0x4a, 0x2c, 0x31, 0x2a, // 5920 - 0x8c, 0x8d, 0xb0, 0xa9, 0xc3, 0x31, 0x6b, 0xa8, 0x77, 0x76, 0x84, 0x26, 0xb6, 0xac, 0x81, 0x42, // 5936 - 0x0d, 0x08, 0xeb, 0x55, 0x58, 0xbb, 0x7a, 0xf8, 0xbc, 0x65, 0x7d, 0xf2, 0xa0, 0x6d, 0x8b, 0xa8, // 5952 - 0x47, 0xe9, 0x62, 0x76, 0x1e, 0x11, 0xee, 0x08, 0x14, 0xd1, 0xb2, 0x44, 0x16, 0xf4, 0xea, 0xd0, // 5968 - 0xfa, 0x1e, 0x2f, 0x5e, 0xdb, 0xcb, 0x73, 0x41, 0xae, 0xbc, 0x00, 0xb0, 0x4a, 0x2b, 0x40, 0xb2, // 5984 - 0xac, 0xe1, 0x3b, 0x4b, 0xc2, 0x2d, 0x9d, 0xe4, 0xa1, 0x9b, 0xec, 0x1a, 0x3a, 0x1e, 0xf0, 0x08, // 6000 - 0xb3, 0xd0, 0xe4, 0x24, 0x35, 0x07, 0x9f, 0x9c, 0xb4, 0xc9, 0x52, 0x6d, 0xdb, 0x07, 0xca, 0x8f, // 6016 - 0xb5, 0x5b, 0xf0, 0x83, 0xf3, 0x4f, 0xc7, 0x2d, 0xa5, 0xc8, 0xad, 0xcb, 0x95, 0x20, 0xa4, 0x31, // 6032 - 0x28, 0x57, 0x58, 0x5a, 0xe4, 0x8d, 0x1b, 0x9a, 0xab, 0x9e, 0x0d, 0x0c, 0xf2, 0x0a, 0x33, 0x39, // 6048 - 0x22, 0x39, 0x0a, 0x97, 0x2e, 0xf3, 0x53, 0x77, 0xb9, 0x44, 0x45, 0xfd, 0x84, 0xcb, 0x36, 0x20, // 6064 - 0x81, 0x59, 0x2d, 0x9a, 0x6f, 0x6d, 0x48, 0x48, 0x61, 0xca, 0x4c, 0xdf, 0x53, 0xd1, 0xaf, 0x52, // 6080 - 0xbc, 0x44, 0x9f, 0xab, 0x2f, 0x6b, 0x83, 0x72, 0xef, 0x75, 0x80, 0xda, 0x06, 0x33, 0x1b, 0x5d, // 6096 - 0xc8, 0xda, 0x63, 0xc6, 0x4d, 0xcd, 0xac, 0x66, 0x31, 0xcd, 0xd1, 0xde, 0x3e, 0x87, 0x10, 0x36, // 6112 - 0xe1, 0xb9, 0xa4, 0x7a, 0xef, 0x60, 0x50, 0xb2, 0xcb, 0xca, 0xa6, 0x56, 0xe0, 0x37, 0xaf, 0xab, // 6128 - 0x34, 0x13, 0x39, 0x25, 0xe8, 0x39, 0x66, 0xe4, 0x98, 0x7a, 0xaa, 0x12, 0x98, 0x9c, 0x59, 0x66, // 6144 - 0x86, 0x3e, 0xad, 0xf1, 0xb0, 0xca, 0x3e, 0x06, 0x0f, 0x7b, 0xf0, 0x11, 0x4b, 0x37, 0xa0, 0x44, // 6160 - 0x6d, 0x7b, 0xcb, 0xa8, 0x8c, 0x71, 0xf4, 0xd5, 0xb5, 0x91, 0x36, 0xcc, 0xf0, 0x15, 0xc6, 0x2b, // 6176 - 0xde, 0x51, 0x17, 0xb1, 0x97, 0x4c, 0x50, 0x3d, 0xb1, 0x95, 0x59, 0x7c, 0x05, 0x7d, 0x2d, 0x21, // 6192 - 0xd5, 0x00, 0xbf, 0x01, 0x67, 0xa2, 0x5e, 0x7b, 0xa6, 0x5c, 0xf2, 0xf7, 0x22, 0xf1, 0x90, 0x0d, // 6208 - 0x93, 0xdb, 0xaa, 0x44, 0x51, 0x66, 0xcc, 0x7d, 0x76, 0x03, 0xeb, 0x6a, 0xa8, 0x2a, 0x38, 0x19, // 6224 - 0x97, 0x76, 0x0d, 0x6b, 0x8a, 0x61, 0xf9, 0xbc, 0xf6, 0xee, 0x76, 0xfd, 0x70, 0x2b, 0xdd, 0x29, // 6240 - 0x3c, 0xf8, 0x0a, 0x1e, 0x5b, 0x42, 0x1c, 0x8b, 0x56, 0x2f, 0x55, 0x1b, 0x1c, 0xa1, 0x2e, 0xb5, // 6256 - 0xc7, 0x16, 0xe6, 0xf8, 0xaa, 0x3c, 0x92, 0x8e, 0x69, 0xb6, 0x01, 0xc1, 0xb5, 0x86, 0x9d, 0x89, // 6272 - 0x0f, 0x0b, 0x38, 0x94, 0x54, 0xe8, 0xea, 0xdc, 0x9e, 0x3d, 0x25, 0xbc, 0x53, 0x26, 0xed, 0xd5, // 6288 - 0xab, 0x39, 0xaa, 0xc5, 0x40, 0x4c, 0x54, 0xab, 0xb2, 0xb4, 0xd9, 0xd9, 0xf8, 0xd7, 0x72, 0xdb, // 6304 - 0x1c, 0xbc, 0x6d, 0xbd, 0x65, 0x5f, 0xef, 0x88, 0x35, 0x2a, 0x66, 0x2f, 0xee, 0xf6, 0xb3, 0x65, // 6320 - 0xf0, 0x33, 0x8d, 0x7c, 0x98, 0x41, 0x69, 0x46, 0x0f, 0x43, 0x1c, 0x69, 0xfa, 0x9b, 0xb5, 0xd0, // 6336 - 0x61, 0x6a, 0xcd, 0xca, 0x4b, 0xd9, 0x4c, 0x90, 0x46, 0xab, 0x15, 0x59, 0xa1, 0x47, 0x54, 0x29, // 6352 - 0x2e, 0x83, 0x28, 0x5f, 0x1c, 0xc2, 0xa2, 0xab, 0x72, 0x17, 0x00, 0x06, 0x8e, 0x45, 0xec, 0x8b, // 6368 - 0xe2, 0x33, 0x3d, 0x7f, 0xda, 0x19, 0x44, 0xe4, 0x62, 0x72, 0xc3, 0xdf, 0x22, 0xc6, 0xf2, 0x56, // 6384 - 0xd4, 0xdd, 0x5f, 0x95, 0x72, 0xed, 0x6d, 0x5f, 0xf7, 0x48, 0x03, 0x5b, 0xfd, 0xc5, 0x2a, 0xa0, // 6400 - 0xf6, 0x73, 0x23, 0x84, 0x10, 0x1b, 0x01, 0xe7, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x4f, 0x02, // 6416 - 0x26, 0x30, 0x4d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, // 6432 - 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0e, 0x44, 0x69, 0x67, 0x69, 0x43, // 6448 - 0x65, 0x72, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, // 6464 - 0x04, 0x03, 0x13, 0x1c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x54, 0x4c, 0x53, // 6480 - 0x20, 0x52, 0x53, 0x41, 0x34, 0x30, 0x39, 0x36, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x35, // 6496 - 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, // 6512 - 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, // 6528 - 0x00, 0xb3, 0xd0, 0xf4, 0xc9, 0x79, 0x11, 0x9d, 0xfd, 0xfc, 0x66, 0x81, 0xe7, 0xcc, 0xd5, 0xe4, // 6544 - 0xbc, 0xec, 0x81, 0x3e, 0x6a, 0x35, 0x8e, 0x2e, 0xb7, 0xe7, 0xde, 0xaf, 0xf9, 0x07, 0x4d, 0xcf, // 6560 - 0x30, 0x9d, 0xea, 0x09, 0x0b, 0x99, 0xbd, 0x6c, 0x57, 0xda, 0x18, 0x4a, 0xb8, 0x78, 0xac, 0x3a, // 6576 - 0x39, 0xa8, 0xa6, 0x48, 0xac, 0x2e, 0x72, 0xe5, 0xbd, 0xeb, 0xf1, 0x1a, 0xcd, 0xe7, 0xa4, 0x03, // 6592 - 0xa9, 0x3f, 0x11, 0xb4, 0xd8, 0x2f, 0x89, 0x16, 0xfb, 0x94, 0x01, 0x3d, 0xbb, 0x2f, 0xf8, 0x13, // 6608 - 0x05, 0xa1, 0x78, 0x1c, 0x8e, 0x28, 0xe0, 0x45, 0xe0, 0x83, 0xf4, 0x59, 0x1b, 0x95, 0xb3, 0xae, // 6624 - 0x7e, 0x03, 0x45, 0xe5, 0xbe, 0xc2, 0x42, 0xfe, 0xee, 0xf2, 0x3c, 0xb6, 0x85, 0x13, 0x98, 0x32, // 6640 - 0x9d, 0x16, 0xa8, 0x29, 0xc2, 0x0b, 0x1c, 0x38, 0xdc, 0x9f, 0x31, 0x77, 0x5c, 0xbf, 0x27, 0xa3, // 6656 - 0xfc, 0x27, 0xac, 0xb7, 0x2b, 0xbd, 0x74, 0x9b, 0x17, 0x2d, 0xf2, 0x81, 0xda, 0x5d, 0xb0, 0xe1, // 6672 - 0x23, 0x17, 0x3e, 0x88, 0x4a, 0x12, 0x23, 0xd0, 0xea, 0xcf, 0x9d, 0xde, 0x03, 0x17, 0xb1, 0x42, // 6688 - 0x4a, 0xa0, 0x16, 0x4c, 0xa4, 0x6d, 0x93, 0xe9, 0x3f, 0x3a, 0xee, 0x3a, 0x7c, 0x9d, 0x58, 0x9d, // 6704 - 0xf4, 0x4e, 0x8f, 0xfc, 0x3b, 0x23, 0xc8, 0x6d, 0xb8, 0xe2, 0x05, 0xda, 0xcc, 0xeb, 0xec, 0xc3, // 6720 - 0x31, 0xf4, 0xd7, 0xa7, 0x29, 0x54, 0x80, 0xcf, 0x44, 0x5b, 0x4c, 0x6f, 0x30, 0x9e, 0xf3, 0xcc, // 6736 - 0xdd, 0x1f, 0x94, 0x43, 0x9d, 0x4d, 0x7f, 0x70, 0x70, 0x0d, 0xd4, 0x3a, 0xd1, 0x37, 0xf0, 0x6c, // 6752 - 0x9d, 0x9b, 0xc0, 0x14, 0x93, 0x58, 0xef, 0xcd, 0x41, 0x38, 0x75, 0xbc, 0x13, 0x03, 0x95, 0x7c, // 6768 - 0x7f, 0xe3, 0x5c, 0xe9, 0xd5, 0x0d, 0xd5, 0xe2, 0x7c, 0x10, 0x62, 0xaa, 0x6b, 0xf0, 0x3d, 0x76, // 6784 - 0xf3, 0x3f, 0xa3, 0xe8, 0xb0, 0xc1, 0xfd, 0xef, 0xaa, 0x57, 0x4d, 0xac, 0x86, 0xa7, 0x18, 0xb4, // 6800 - 0x29, 0xc1, 0x2c, 0x0e, 0xbf, 0x64, 0xbe, 0x29, 0x8c, 0xd8, 0x02, 0x2d, 0xcd, 0x5c, 0x2f, 0xf2, // 6816 - 0x7f, 0xef, 0x15, 0xf4, 0x0c, 0x15, 0xac, 0x0a, 0xb0, 0xf1, 0xd3, 0x0d, 0x4f, 0x6a, 0x4d, 0x77, // 6832 - 0x97, 0x01, 0xa0, 0xf1, 0x66, 0xb7, 0xb7, 0xce, 0xef, 0xce, 0xec, 0xec, 0xa5, 0x75, 0xca, 0xac, // 6848 - 0xe3, 0xe1, 0x63, 0xf7, 0xb8, 0xa1, 0x04, 0xc8, 0xbc, 0x7b, 0x3f, 0x5d, 0x2d, 0x16, 0x22, 0x56, // 6864 - 0xed, 0x48, 0x49, 0xfe, 0xa7, 0x2f, 0x79, 0x30, 0x25, 0x9b, 0xba, 0x6b, 0x2d, 0x3f, 0x9d, 0x3b, // 6880 - 0xc4, 0x17, 0xe7, 0x1d, 0x2e, 0xfb, 0xf2, 0xcf, 0xa6, 0xfc, 0xe3, 0x14, 0x2c, 0x96, 0x98, 0x21, // 6896 - 0x8c, 0xb4, 0x91, 0xe9, 0x19, 0x60, 0x83, 0xf2, 0x30, 0x2b, 0x06, 0x73, 0x50, 0xd5, 0x98, 0x3b, // 6912 - 0x06, 0xe9, 0xc7, 0x8a, 0x0c, 0x60, 0x8c, 0x28, 0xf8, 0x52, 0x9b, 0x6e, 0xe1, 0xf6, 0x4d, 0xbb, // 6928 - 0x06, 0x24, 0x9b, 0xd7, 0x2b, 0x26, 0x3f, 0xfd, 0x2a, 0x2f, 0x71, 0xf5, 0xd6, 0x24, 0xbe, 0x7f, // 6944 - 0x31, 0x9e, 0x0f, 0x6d, 0xe8, 0x8f, 0x4f, 0x4d, 0xa3, 0x3f, 0xff, 0x35, 0xea, 0xdf, 0x49, 0x5e, // 6960 - 0x41, 0x8f, 0x86, 0xf9, 0xf1, 0x77, 0x79, 0x4b, 0x1b, 0xb4, 0xa3, 0x5e, 0x2f, 0xfb, 0x46, 0x02, // 6976 - 0xd0, 0x66, 0x13, 0x5e, 0x5e, 0x85, 0x4f, 0xce, 0xd8, 0x70, 0x88, 0x7b, 0xce, 0x01, 0xb5, 0x96, // 6992 - 0x97, 0xd7, 0xcd, 0x7d, 0xfd, 0x82, 0xf8, 0xc2, 0x24, 0xc1, 0xca, 0x01, 0x39, 0x4f, 0x8d, 0xa2, // 7008 - 0xc1, 0x14, 0x40, 0x1f, 0x9c, 0x66, 0xd5, 0x0c, 0x09, 0x46, 0xd6, 0xf2, 0xd0, 0xd1, 0x48, 0x76, // 7024 - 0x56, 0x3a, 0x43, 0xcb, 0xb6, 0x0a, 0x11, 0x39, 0xba, 0x8c, 0x13, 0x6c, 0x06, 0xb5, 0x9e, 0xcf, // 7040 - 0xeb, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x50, 0x00, 0x78, 0x30, 0x4e, 0x31, 0x0b, 0x30, 0x09, // 7056 - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, // 7072 - 0x04, 0x0a, 0x13, 0x0e, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x2c, 0x20, 0x49, 0x6e, // 7088 - 0x63, 0x2e, 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1d, 0x44, 0x69, 0x67, // 7104 - 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x54, 0x4c, 0x53, 0x20, 0x45, 0x43, 0x43, 0x20, 0x50, 0x33, // 7120 - 0x38, 0x34, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x35, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, // 7136 - 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, // 7152 - 0x00, 0x04, 0xc1, 0x44, 0xa1, 0xcf, 0x11, 0x97, 0x50, 0x9a, 0xde, 0x23, 0x82, 0x35, 0x07, 0xcd, // 7168 - 0xd0, 0xcb, 0x18, 0x9d, 0xd2, 0xf1, 0x7f, 0x77, 0x35, 0x4f, 0x3b, 0xdd, 0x94, 0x72, 0x52, 0xed, // 7184 - 0xc2, 0x3b, 0xf8, 0xec, 0xfa, 0x7b, 0x6b, 0x58, 0x20, 0xec, 0x99, 0xae, 0xc9, 0xfc, 0x68, 0xb3, // 7200 - 0x75, 0xb9, 0xdb, 0x09, 0xec, 0xc8, 0x13, 0xf5, 0x4e, 0xc6, 0x0a, 0x1d, 0x66, 0x30, 0x4c, 0xbb, // 7216 - 0x1f, 0x47, 0x0a, 0x3c, 0x61, 0x10, 0x42, 0x29, 0x7c, 0xa5, 0x08, 0x0e, 0xe0, 0x22, 0xe9, 0xd3, // 7232 - 0x35, 0x68, 0xce, 0x9b, 0x63, 0x9f, 0x84, 0xb5, 0x99, 0x4d, 0x58, 0xa0, 0x8e, 0xf5, 0x54, 0xe7, // 7248 - 0x95, 0xc9, 0x00, 0x51, 0x02, 0x26, 0x30, 0x4f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, // 7264 - 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x29, 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x20, // 7280 - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, // 7296 - 0x79, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, // 7312 - 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0c, 0x49, 0x53, 0x52, 0x47, 0x20, // 7328 - 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x58, 0x31, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, // 7344 - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, // 7360 - 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xad, 0xe8, 0x24, 0x73, 0xf4, 0x14, 0x37, 0xf3, // 7376 - 0x9b, 0x9e, 0x2b, 0x57, 0x28, 0x1c, 0x87, 0xbe, 0xdc, 0xb7, 0xdf, 0x38, 0x90, 0x8c, 0x6e, 0x3c, // 7392 - 0xe6, 0x57, 0xa0, 0x78, 0xf7, 0x75, 0xc2, 0xa2, 0xfe, 0xf5, 0x6a, 0x6e, 0xf6, 0x00, 0x4f, 0x28, // 7408 - 0xdb, 0xde, 0x68, 0x86, 0x6c, 0x44, 0x93, 0xb6, 0xb1, 0x63, 0xfd, 0x14, 0x12, 0x6b, 0xbf, 0x1f, // 7424 - 0xd2, 0xea, 0x31, 0x9b, 0x21, 0x7e, 0xd1, 0x33, 0x3c, 0xba, 0x48, 0xf5, 0xdd, 0x79, 0xdf, 0xb3, // 7440 - 0xb8, 0xff, 0x12, 0xf1, 0x21, 0x9a, 0x4b, 0xc1, 0x8a, 0x86, 0x71, 0x69, 0x4a, 0x66, 0x66, 0x6c, // 7456 - 0x8f, 0x7e, 0x3c, 0x70, 0xbf, 0xad, 0x29, 0x22, 0x06, 0xf3, 0xe4, 0xc0, 0xe6, 0x80, 0xae, 0xe2, // 7472 - 0x4b, 0x8f, 0xb7, 0x99, 0x7e, 0x94, 0x03, 0x9f, 0xd3, 0x47, 0x97, 0x7c, 0x99, 0x48, 0x23, 0x53, // 7488 - 0xe8, 0x38, 0xae, 0x4f, 0x0a, 0x6f, 0x83, 0x2e, 0xd1, 0x49, 0x57, 0x8c, 0x80, 0x74, 0xb6, 0xda, // 7504 - 0x2f, 0xd0, 0x38, 0x8d, 0x7b, 0x03, 0x70, 0x21, 0x1b, 0x75, 0xf2, 0x30, 0x3c, 0xfa, 0x8f, 0xae, // 7520 - 0xdd, 0xda, 0x63, 0xab, 0xeb, 0x16, 0x4f, 0xc2, 0x8e, 0x11, 0x4b, 0x7e, 0xcf, 0x0b, 0xe8, 0xff, // 7536 - 0xb5, 0x77, 0x2e, 0xf4, 0xb2, 0x7b, 0x4a, 0xe0, 0x4c, 0x12, 0x25, 0x0c, 0x70, 0x8d, 0x03, 0x29, // 7552 - 0xa0, 0xe1, 0x53, 0x24, 0xec, 0x13, 0xd9, 0xee, 0x19, 0xbf, 0x10, 0xb3, 0x4a, 0x8c, 0x3f, 0x89, // 7568 - 0xa3, 0x61, 0x51, 0xde, 0xac, 0x87, 0x07, 0x94, 0xf4, 0x63, 0x71, 0xec, 0x2e, 0xe2, 0x6f, 0x5b, // 7584 - 0x98, 0x81, 0xe1, 0x89, 0x5c, 0x34, 0x79, 0x6c, 0x76, 0xef, 0x3b, 0x90, 0x62, 0x79, 0xe6, 0xdb, // 7600 - 0xa4, 0x9a, 0x2f, 0x26, 0xc5, 0xd0, 0x10, 0xe1, 0x0e, 0xde, 0xd9, 0x10, 0x8e, 0x16, 0xfb, 0xb7, // 7616 - 0xf7, 0xa8, 0xf7, 0xc7, 0xe5, 0x02, 0x07, 0x98, 0x8f, 0x36, 0x08, 0x95, 0xe7, 0xe2, 0x37, 0x96, // 7632 - 0x0d, 0x36, 0x75, 0x9e, 0xfb, 0x0e, 0x72, 0xb1, 0x1d, 0x9b, 0xbc, 0x03, 0xf9, 0x49, 0x05, 0xd8, // 7648 - 0x81, 0xdd, 0x05, 0xb4, 0x2a, 0xd6, 0x41, 0xe9, 0xac, 0x01, 0x76, 0x95, 0x0a, 0x0f, 0xd8, 0xdf, // 7664 - 0xd5, 0xbd, 0x12, 0x1f, 0x35, 0x2f, 0x28, 0x17, 0x6c, 0xd2, 0x98, 0xc1, 0xa8, 0x09, 0x64, 0x77, // 7680 - 0x6e, 0x47, 0x37, 0xba, 0xce, 0xac, 0x59, 0x5e, 0x68, 0x9d, 0x7f, 0x72, 0xd6, 0x89, 0xc5, 0x06, // 7696 - 0x41, 0x29, 0x3e, 0x59, 0x3e, 0xdd, 0x26, 0xf5, 0x24, 0xc9, 0x11, 0xa7, 0x5a, 0xa3, 0x4c, 0x40, // 7712 - 0x1f, 0x46, 0xa1, 0x99, 0xb5, 0xa7, 0x3a, 0x51, 0x6e, 0x86, 0x3b, 0x9e, 0x7d, 0x72, 0xa7, 0x12, // 7728 - 0x05, 0x78, 0x59, 0xed, 0x3e, 0x51, 0x78, 0x15, 0x0b, 0x03, 0x8f, 0x8d, 0xd0, 0x2f, 0x05, 0xb2, // 7744 - 0x3e, 0x7b, 0x4a, 0x1c, 0x4b, 0x73, 0x05, 0x12, 0xfc, 0xc6, 0xea, 0xe0, 0x50, 0x13, 0x7c, 0x43, // 7760 - 0x93, 0x74, 0xb3, 0xca, 0x74, 0xe7, 0x8e, 0x1f, 0x01, 0x08, 0xd0, 0x30, 0xd4, 0x5b, 0x71, 0x36, // 7776 - 0xb4, 0x07, 0xba, 0xc1, 0x30, 0x30, 0x5c, 0x48, 0xb7, 0x82, 0x3b, 0x98, 0xa6, 0x7d, 0x60, 0x8a, // 7792 - 0xa2, 0xa3, 0x29, 0x82, 0xcc, 0xba, 0xbd, 0x83, 0x04, 0x1b, 0xa2, 0x83, 0x03, 0x41, 0xa1, 0xd6, // 7808 - 0x05, 0xf1, 0x1b, 0xc2, 0xb6, 0xf0, 0xa8, 0x7c, 0x86, 0x3b, 0x46, 0xa8, 0x48, 0x2a, 0x88, 0xdc, // 7824 - 0x76, 0x9a, 0x76, 0xbf, 0x1f, 0x6a, 0xa5, 0x3d, 0x19, 0x8f, 0xeb, 0x38, 0xf3, 0x64, 0xde, 0xc8, // 7840 - 0x2b, 0x0d, 0x0a, 0x28, 0xff, 0xf7, 0xdb, 0xe2, 0x15, 0x42, 0xd4, 0x22, 0xd0, 0x27, 0x5d, 0xe1, // 7856 - 0x79, 0xfe, 0x18, 0xe7, 0x70, 0x88, 0xad, 0x4e, 0xe6, 0xd9, 0x8b, 0x3a, 0xc6, 0xdd, 0x27, 0x51, // 7872 - 0x6e, 0xff, 0xbc, 0x64, 0xf5, 0x33, 0x43, 0x4f, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x51, 0x00, // 7888 - 0x78, 0x30, 0x4f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, // 7904 - 0x31, 0x29, 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, // 7920 - 0x6e, 0x65, 0x74, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x52, 0x65, 0x73, // 7936 - 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x31, 0x15, 0x30, 0x13, 0x06, // 7952 - 0x03, 0x55, 0x04, 0x03, 0x13, 0x0c, 0x49, 0x53, 0x52, 0x47, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, // 7968 - 0x58, 0x32, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, // 7984 - 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xcd, 0x9b, 0xd5, 0x9f, 0x80, 0x83, // 8000 - 0x0a, 0xec, 0x09, 0x4a, 0xf3, 0x16, 0x4a, 0x3e, 0x5c, 0xcf, 0x77, 0xac, 0xde, 0x67, 0x05, 0x0d, // 8016 - 0x1d, 0x07, 0xb6, 0xdc, 0x16, 0xfb, 0x5a, 0x8b, 0x14, 0xdb, 0xe2, 0x71, 0x60, 0xc4, 0xba, 0x45, // 8032 - 0x95, 0x11, 0x89, 0x8e, 0xea, 0x06, 0xdf, 0xf7, 0x2a, 0x16, 0x1c, 0xa4, 0xb9, 0xc5, 0xc5, 0x32, // 8048 - 0xe0, 0x03, 0xe0, 0x1e, 0x82, 0x18, 0x38, 0x8b, 0xd7, 0x45, 0xd8, 0x0a, 0x6a, 0x6e, 0xe6, 0x00, // 8064 - 0x77, 0xfb, 0x02, 0x51, 0x7d, 0x22, 0xd8, 0x0a, 0x6e, 0x9a, 0x5b, 0x77, 0xdf, 0xf0, 0xfa, 0x41, // 8080 - 0xec, 0x39, 0xdc, 0x75, 0xca, 0x68, 0x07, 0x0c, 0x1f, 0xea, 0x00, 0x52, 0x00, 0x5b, 0x30, 0x50, // 8096 - 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1b, 0x47, 0x6c, 0x6f, 0x62, 0x61, // 8112 - 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, // 8128 - 0x41, 0x20, 0x2d, 0x20, 0x52, 0x34, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, // 8144 - 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x31, 0x13, 0x30, 0x11, 0x06, // 8160 - 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, // 8176 - 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, // 8192 - 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00, 0x04, 0xb8, 0xc6, 0x79, 0xd3, 0x8f, // 8208 - 0x6c, 0x25, 0x0e, 0x9f, 0x2e, 0x39, 0x19, 0x1c, 0x03, 0xa4, 0xae, 0x9a, 0xe5, 0x39, 0x07, 0x09, // 8224 - 0x16, 0xca, 0x63, 0xb1, 0xb9, 0x86, 0xf8, 0x8a, 0x57, 0xc1, 0x57, 0xce, 0x42, 0xfa, 0x73, 0xa1, // 8240 - 0xf7, 0x65, 0x42, 0xff, 0x1e, 0xc1, 0x00, 0xb2, 0x6e, 0x73, 0x0e, 0xff, 0xc7, 0x21, 0xe5, 0x18, // 8256 - 0xa4, 0xaa, 0xd9, 0x71, 0x3f, 0xa8, 0xd4, 0xb9, 0xce, 0x8c, 0x1d, 0x00, 0x52, 0x00, 0x78, 0x30, // 8272 - 0x50, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1b, 0x47, 0x6c, 0x6f, 0x62, // 8288 - 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, // 8304 - 0x43, 0x41, 0x20, 0x2d, 0x20, 0x52, 0x35, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, // 8320 - 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x31, 0x13, 0x30, 0x11, // 8336 - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, // 8352 - 0x6e, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, // 8368 - 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x47, 0x45, 0x0e, 0x96, 0xfb, 0x7d, 0x5d, // 8384 - 0xbf, 0xe9, 0x39, 0xd1, 0x21, 0xf8, 0x9f, 0x0b, 0xb6, 0xd5, 0x7b, 0x1e, 0x92, 0x3a, 0x48, 0x59, // 8400 - 0x1c, 0xf0, 0x62, 0x31, 0x2d, 0xc0, 0x7a, 0x28, 0xfe, 0x1a, 0xa7, 0x5c, 0xb3, 0xb6, 0xcc, 0x97, // 8416 - 0xe7, 0x45, 0xd4, 0x58, 0xfa, 0xd1, 0x77, 0x6d, 0x43, 0xa2, 0xc0, 0x87, 0x65, 0x34, 0x0a, 0x1f, // 8432 - 0x7a, 0xdd, 0xeb, 0x3c, 0x33, 0xa1, 0xc5, 0x9d, 0x4d, 0xa4, 0x6f, 0x41, 0x95, 0x38, 0x7f, 0xc9, // 8448 - 0x1e, 0x84, 0xeb, 0xd1, 0x9e, 0x49, 0x92, 0x87, 0x94, 0x87, 0x0c, 0x3a, 0x85, 0x4a, 0x66, 0x9f, // 8464 - 0x9d, 0x59, 0x93, 0x4d, 0x97, 0x61, 0x06, 0x86, 0x4a, 0x00, 0x59, 0x01, 0x26, 0x30, 0x57, 0x31, // 8480 - 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x45, 0x31, 0x19, 0x30, 0x17, // 8496 - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, // 8512 - 0x6e, 0x20, 0x6e, 0x76, 0x2d, 0x73, 0x61, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0b, // 8528 - 0x13, 0x07, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, // 8544 - 0x04, 0x03, 0x13, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, // 8560 - 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, // 8576 - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, // 8592 - 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xda, 0x0e, 0xe6, 0x99, 0x8d, 0xce, 0xa3, 0xe3, 0x4f, // 8608 - 0x8a, 0x7e, 0xfb, 0xf1, 0x8b, 0x83, 0x25, 0x6b, 0xea, 0x48, 0x1f, 0xf1, 0x2a, 0xb0, 0xb9, 0x95, // 8624 - 0x11, 0x04, 0xbd, 0xf0, 0x63, 0xd1, 0xe2, 0x67, 0x66, 0xcf, 0x1c, 0xdd, 0xcf, 0x1b, 0x48, 0x2b, // 8640 - 0xee, 0x8d, 0x89, 0x8e, 0x9a, 0xaf, 0x29, 0x80, 0x65, 0xab, 0xe9, 0xc7, 0x2d, 0x12, 0xcb, 0xab, // 8656 - 0x1c, 0x4c, 0x70, 0x07, 0xa1, 0x3d, 0x0a, 0x30, 0xcd, 0x15, 0x8d, 0x4f, 0xf8, 0xdd, 0xd4, 0x8c, // 8672 - 0x50, 0x15, 0x1c, 0xef, 0x50, 0xee, 0xc4, 0x2e, 0xf7, 0xfc, 0xe9, 0x52, 0xf2, 0x91, 0x7d, 0xe0, // 8688 - 0x6d, 0xd5, 0x35, 0x30, 0x8e, 0x5e, 0x43, 0x73, 0xf2, 0x41, 0xe9, 0xd5, 0x6a, 0xe3, 0xb2, 0x89, // 8704 - 0x3a, 0x56, 0x39, 0x38, 0x6f, 0x06, 0x3c, 0x88, 0x69, 0x5b, 0x2a, 0x4d, 0xc5, 0xa7, 0x54, 0xb8, // 8720 - 0x6c, 0x89, 0xcc, 0x9b, 0xf9, 0x3c, 0xca, 0xe5, 0xfd, 0x89, 0xf5, 0x12, 0x3c, 0x92, 0x78, 0x96, // 8736 - 0xd6, 0xdc, 0x74, 0x6e, 0x93, 0x44, 0x61, 0xd1, 0x8d, 0xc7, 0x46, 0xb2, 0x75, 0x0e, 0x86, 0xe8, // 8752 - 0x19, 0x8a, 0xd5, 0x6d, 0x6c, 0xd5, 0x78, 0x16, 0x95, 0xa2, 0xe9, 0xc8, 0x0a, 0x38, 0xeb, 0xf2, // 8768 - 0x24, 0x13, 0x4f, 0x73, 0x54, 0x93, 0x13, 0x85, 0x3a, 0x1b, 0xbc, 0x1e, 0x34, 0xb5, 0x8b, 0x05, // 8784 - 0x8c, 0xb9, 0x77, 0x8b, 0xb1, 0xdb, 0x1f, 0x20, 0x91, 0xab, 0x09, 0x53, 0x6e, 0x90, 0xce, 0x7b, // 8800 - 0x37, 0x74, 0xb9, 0x70, 0x47, 0x91, 0x22, 0x51, 0x63, 0x16, 0x79, 0xae, 0xb1, 0xae, 0x41, 0x26, // 8816 - 0x08, 0xc8, 0x19, 0x2b, 0xd1, 0x46, 0xaa, 0x48, 0xd6, 0x64, 0x2a, 0xd7, 0x83, 0x34, 0xff, 0x2c, // 8832 - 0x2a, 0xc1, 0x6c, 0x19, 0x43, 0x4a, 0x07, 0x85, 0xe7, 0xd3, 0x7c, 0xf6, 0x21, 0x68, 0xef, 0xea, // 8848 - 0xf2, 0x52, 0x9f, 0x7f, 0x93, 0x90, 0xcf, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x5c, 0x01, 0x26, // 8864 - 0x30, 0x5a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x45, 0x31, // 8880 - 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x09, 0x42, 0x61, 0x6c, 0x74, 0x69, 0x6d, // 8896 - 0x6f, 0x72, 0x65, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0a, 0x43, 0x79, // 8912 - 0x62, 0x65, 0x72, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, // 8928 - 0x03, 0x13, 0x19, 0x42, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, 0x62, // 8944 - 0x65, 0x72, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x82, 0x01, 0x22, // 8960 - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, // 8976 - 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa3, 0x04, 0xbb, // 8992 - 0x22, 0xab, 0x98, 0x3d, 0x57, 0xe8, 0x26, 0x72, 0x9a, 0xb5, 0x79, 0xd4, 0x29, 0xe2, 0xe1, 0xe8, // 9008 - 0x95, 0x80, 0xb1, 0xb0, 0xe3, 0x5b, 0x8e, 0x2b, 0x29, 0x9a, 0x64, 0xdf, 0xa1, 0x5d, 0xed, 0xb0, // 9024 - 0x09, 0x05, 0x6d, 0xdb, 0x28, 0x2e, 0xce, 0x62, 0xa2, 0x62, 0xfe, 0xb4, 0x88, 0xda, 0x12, 0xeb, // 9040 - 0x38, 0xeb, 0x21, 0x9d, 0xc0, 0x41, 0x2b, 0x01, 0x52, 0x7b, 0x88, 0x77, 0xd3, 0x1c, 0x8f, 0xc7, // 9056 - 0xba, 0xb9, 0x88, 0xb5, 0x6a, 0x09, 0xe7, 0x73, 0xe8, 0x11, 0x40, 0xa7, 0xd1, 0xcc, 0xca, 0x62, // 9072 - 0x8d, 0x2d, 0xe5, 0x8f, 0x0b, 0xa6, 0x50, 0xd2, 0xa8, 0x50, 0xc3, 0x28, 0xea, 0xf5, 0xab, 0x25, // 9088 - 0x87, 0x8a, 0x9a, 0x96, 0x1c, 0xa9, 0x67, 0xb8, 0x3f, 0x0c, 0xd5, 0xf7, 0xf9, 0x52, 0x13, 0x2f, // 9104 - 0xc2, 0x1b, 0xd5, 0x70, 0x70, 0xf0, 0x8f, 0xc0, 0x12, 0xca, 0x06, 0xcb, 0x9a, 0xe1, 0xd9, 0xca, // 9120 - 0x33, 0x7a, 0x77, 0xd6, 0xf8, 0xec, 0xb9, 0xf1, 0x68, 0x44, 0x42, 0x48, 0x13, 0xd2, 0xc0, 0xc2, // 9136 - 0xa4, 0xae, 0x5e, 0x60, 0xfe, 0xb6, 0xa6, 0x05, 0xfc, 0xb4, 0xdd, 0x07, 0x59, 0x02, 0xd4, 0x59, // 9152 - 0x18, 0x98, 0x63, 0xf5, 0xa5, 0x63, 0xe0, 0x90, 0x0c, 0x7d, 0x5d, 0xb2, 0x06, 0x7a, 0xf3, 0x85, // 9168 - 0xea, 0xeb, 0xd4, 0x03, 0xae, 0x5e, 0x84, 0x3e, 0x5f, 0xff, 0x15, 0xed, 0x69, 0xbc, 0xf9, 0x39, // 9184 - 0x36, 0x72, 0x75, 0xcf, 0x77, 0x52, 0x4d, 0xf3, 0xc9, 0x90, 0x2c, 0xb9, 0x3d, 0xe5, 0xc9, 0x23, // 9200 - 0x53, 0x3f, 0x1f, 0x24, 0x98, 0x21, 0x5c, 0x07, 0x99, 0x29, 0xbd, 0xc6, 0x3a, 0xec, 0xe7, 0x6e, // 9216 - 0x86, 0x3a, 0x6b, 0x97, 0x74, 0x63, 0x33, 0xbd, 0x68, 0x18, 0x31, 0xf0, 0x78, 0x8d, 0x76, 0xbf, // 9232 - 0xfc, 0x9e, 0x8e, 0x5d, 0x2a, 0x86, 0xa7, 0x4d, 0x90, 0xdc, 0x27, 0x1a, 0x39, 0x02, 0x03, 0x01, // 9248 - 0x00, 0x01, 0x00, 0x63, 0x01, 0x26, 0x30, 0x61, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, // 9264 - 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, // 9280 - 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, // 9296 - 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, // 9312 - 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, // 9328 - 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, // 9344 - 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, // 9360 - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, // 9376 - 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xe2, 0x3b, 0xe1, 0x11, 0x72, 0xde, // 9392 - 0xa8, 0xa4, 0xd3, 0xa3, 0x57, 0xaa, 0x50, 0xa2, 0x8f, 0x0b, 0x77, 0x90, 0xc9, 0xa2, 0xa5, 0xee, // 9408 - 0x12, 0xce, 0x96, 0x5b, 0x01, 0x09, 0x20, 0xcc, 0x01, 0x93, 0xa7, 0x4e, 0x30, 0xb7, 0x53, 0xf7, // 9424 - 0x43, 0xc4, 0x69, 0x00, 0x57, 0x9d, 0xe2, 0x8d, 0x22, 0xdd, 0x87, 0x06, 0x40, 0x00, 0x81, 0x09, // 9440 - 0xce, 0xce, 0x1b, 0x83, 0xbf, 0xdf, 0xcd, 0x3b, 0x71, 0x46, 0xe2, 0xd6, 0x66, 0xc7, 0x05, 0xb3, // 9456 - 0x76, 0x27, 0x16, 0x8f, 0x7b, 0x9e, 0x1e, 0x95, 0x7d, 0xee, 0xb7, 0x48, 0xa3, 0x08, 0xda, 0xd6, // 9472 - 0xaf, 0x7a, 0x0c, 0x39, 0x06, 0x65, 0x7f, 0x4a, 0x5d, 0x1f, 0xbc, 0x17, 0xf8, 0xab, 0xbe, 0xee, // 9488 - 0x28, 0xd7, 0x74, 0x7f, 0x7a, 0x78, 0x99, 0x59, 0x85, 0x68, 0x6e, 0x5c, 0x23, 0x32, 0x4b, 0xbf, // 9504 - 0x4e, 0xc0, 0xe8, 0x5a, 0x6d, 0xe3, 0x70, 0xbf, 0x77, 0x10, 0xbf, 0xfc, 0x01, 0xf6, 0x85, 0xd9, // 9520 - 0xa8, 0x44, 0x10, 0x58, 0x32, 0xa9, 0x75, 0x18, 0xd5, 0xd1, 0xa2, 0xbe, 0x47, 0xe2, 0x27, 0x6a, // 9536 - 0xf4, 0x9a, 0x33, 0xf8, 0x49, 0x08, 0x60, 0x8b, 0xd4, 0x5f, 0xb4, 0x3a, 0x84, 0xbf, 0xa1, 0xaa, // 9552 - 0x4a, 0x4c, 0x7d, 0x3e, 0xcf, 0x4f, 0x5f, 0x6c, 0x76, 0x5e, 0xa0, 0x4b, 0x37, 0x91, 0x9e, 0xdc, // 9568 - 0x22, 0xe6, 0x6d, 0xce, 0x14, 0x1a, 0x8e, 0x6a, 0xcb, 0xfe, 0xcd, 0xb3, 0x14, 0x64, 0x17, 0xc7, // 9584 - 0x5b, 0x29, 0x9e, 0x32, 0xbf, 0xf2, 0xee, 0xfa, 0xd3, 0x0b, 0x42, 0xd4, 0xab, 0xb7, 0x41, 0x32, // 9600 - 0xda, 0x0c, 0xd4, 0xef, 0xf8, 0x81, 0xd5, 0xbb, 0x8d, 0x58, 0x3f, 0xb5, 0x1b, 0xe8, 0x49, 0x28, // 9616 - 0xa2, 0x70, 0xda, 0x31, 0x04, 0xdd, 0xf7, 0xb2, 0x16, 0xf2, 0x4c, 0x0a, 0x4e, 0x07, 0xa8, 0xed, // 9632 - 0x4a, 0x3d, 0x5e, 0xb5, 0x7f, 0xa3, 0x90, 0xc3, 0xaf, 0x27, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, // 9648 - 0x63, 0x01, 0x26, 0x30, 0x61, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, // 9664 - 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, // 9680 - 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, // 9696 - 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, // 9712 - 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x44, // 9728 - 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, // 9744 - 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, // 9760 - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, // 9776 - 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbb, 0x37, 0xcd, 0x34, 0xdc, 0x7b, 0x6b, 0xc9, 0xb2, // 9792 - 0x68, 0x90, 0xad, 0x4a, 0x75, 0xff, 0x46, 0xba, 0x21, 0x0a, 0x08, 0x8d, 0xf5, 0x19, 0x54, 0xc9, // 9808 - 0xfb, 0x88, 0xdb, 0xf3, 0xae, 0xf2, 0x3a, 0x89, 0x91, 0x3c, 0x7a, 0xe6, 0xab, 0x06, 0x1a, 0x6b, // 9824 - 0xcf, 0xac, 0x2d, 0xe8, 0x5e, 0x09, 0x24, 0x44, 0xba, 0x62, 0x9a, 0x7e, 0xd6, 0xa3, 0xa8, 0x7e, // 9840 - 0xe0, 0x54, 0x75, 0x20, 0x05, 0xac, 0x50, 0xb7, 0x9c, 0x63, 0x1a, 0x6c, 0x30, 0xdc, 0xda, 0x1f, // 9856 - 0x19, 0xb1, 0xd7, 0x1e, 0xde, 0xfd, 0xd7, 0xe0, 0xcb, 0x94, 0x83, 0x37, 0xae, 0xec, 0x1f, 0x43, // 9872 - 0x4e, 0xdd, 0x7b, 0x2c, 0xd2, 0xbd, 0x2e, 0xa5, 0x2f, 0xe4, 0xa9, 0xb8, 0xad, 0x3a, 0xd4, 0x99, // 9888 - 0xa4, 0xb6, 0x25, 0xe9, 0x9b, 0x6b, 0x00, 0x60, 0x92, 0x60, 0xff, 0x4f, 0x21, 0x49, 0x18, 0xf7, // 9904 - 0x67, 0x90, 0xab, 0x61, 0x06, 0x9c, 0x8f, 0xf2, 0xba, 0xe9, 0xb4, 0xe9, 0x92, 0x32, 0x6b, 0xb5, // 9920 - 0xf3, 0x57, 0xe8, 0x5d, 0x1b, 0xcd, 0x8c, 0x1d, 0xab, 0x95, 0x04, 0x95, 0x49, 0xf3, 0x35, 0x2d, // 9936 - 0x96, 0xe3, 0x49, 0x6d, 0xdd, 0x77, 0xe3, 0xfb, 0x49, 0x4b, 0xb4, 0xac, 0x55, 0x07, 0xa9, 0x8f, // 9952 - 0x95, 0xb3, 0xb4, 0x23, 0xbb, 0x4c, 0x6d, 0x45, 0xf0, 0xf6, 0xa9, 0xb2, 0x95, 0x30, 0xb4, 0xfd, // 9968 - 0x4c, 0x55, 0x8c, 0x27, 0x4a, 0x57, 0x14, 0x7c, 0x82, 0x9d, 0xcd, 0x73, 0x92, 0xd3, 0x16, 0x4a, // 9984 - 0x06, 0x0c, 0x8c, 0x50, 0xd1, 0x8f, 0x1e, 0x09, 0xbe, 0x17, 0xa1, 0xe6, 0x21, 0xca, 0xfd, 0x83, // 10000 - 0xe5, 0x10, 0xbc, 0x83, 0xa5, 0x0a, 0xc4, 0x67, 0x28, 0xf6, 0x73, 0x14, 0x14, 0x3d, 0x46, 0x76, // 10016 - 0xc3, 0x87, 0x14, 0x89, 0x21, 0x34, 0x4d, 0xaf, 0x0f, 0x45, 0x0c, 0xa6, 0x49, 0xa1, 0xba, 0xbb, // 10032 - 0x9c, 0xc5, 0xb1, 0x33, 0x83, 0x29, 0x85, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x63, 0x00, 0x78, // 10048 - 0x30, 0x61, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, // 10064 - 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, // 10080 - 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, // 10096 - 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, // 10112 - 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, // 10128 - 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, // 10144 - 0x20, 0x47, 0x33, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, // 10160 - 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xdd, 0xa7, 0xd9, 0xbb, 0x8a, // 10176 - 0xb8, 0x0b, 0xfb, 0x0b, 0x7f, 0x21, 0xd2, 0xf0, 0xbe, 0xbe, 0x73, 0xf3, 0x33, 0x5d, 0x1a, 0xbc, // 10192 - 0x34, 0xea, 0xde, 0xc6, 0x9b, 0xbc, 0xd0, 0x95, 0xf6, 0xf0, 0xcc, 0xd0, 0x0b, 0xba, 0x61, 0x5b, // 10208 - 0x51, 0x46, 0x7e, 0x9e, 0x2d, 0x9f, 0xee, 0x8e, 0x63, 0x0c, 0x17, 0xec, 0x07, 0x70, 0xf5, 0xcf, // 10224 - 0x84, 0x2e, 0x40, 0x83, 0x9c, 0xe8, 0x3f, 0x41, 0x6d, 0x3b, 0xad, 0xd3, 0xa4, 0x14, 0x59, 0x36, // 10240 - 0x78, 0x9d, 0x03, 0x43, 0xee, 0x10, 0x13, 0x6c, 0x72, 0xde, 0xae, 0x88, 0xa7, 0xa1, 0x6b, 0xb5, // 10256 - 0x43, 0xce, 0x67, 0xdc, 0x23, 0xff, 0x03, 0x1c, 0xa3, 0xe2, 0x3e, 0x00, 0x64, 0x02, 0x26, 0x30, // 10272 - 0x62, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, // 10288 - 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, // 10304 - 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, // 10320 - 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, // 10336 - 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x44, 0x69, 0x67, 0x69, 0x43, // 10352 - 0x65, 0x72, 0x74, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x52, 0x6f, 0x6f, 0x74, // 10368 - 0x20, 0x47, 0x34, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, // 10384 - 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, // 10400 - 0x82, 0x02, 0x01, 0x00, 0xbf, 0xe6, 0x90, 0x73, 0x68, 0xde, 0xbb, 0xe4, 0x5d, 0x4a, 0x3c, 0x30, // 10416 - 0x22, 0x30, 0x69, 0x33, 0xec, 0xc2, 0xa7, 0x25, 0x2e, 0xc9, 0x21, 0x3d, 0xf2, 0x8a, 0xd8, 0x59, // 10432 - 0xc2, 0xe1, 0x29, 0xa7, 0x3d, 0x58, 0xab, 0x76, 0x9a, 0xcd, 0xae, 0x7b, 0x1b, 0x84, 0x0d, 0xc4, // 10448 - 0x30, 0x1f, 0xf3, 0x1b, 0xa4, 0x38, 0x16, 0xeb, 0x56, 0xc6, 0x97, 0x6d, 0x1d, 0xab, 0xb2, 0x79, // 10464 - 0xf2, 0xca, 0x11, 0xd2, 0xe4, 0x5f, 0xd6, 0x05, 0x3c, 0x52, 0x0f, 0x52, 0x1f, 0xc6, 0x9e, 0x15, // 10480 - 0xa5, 0x7e, 0xbe, 0x9f, 0xa9, 0x57, 0x16, 0x59, 0x55, 0x72, 0xaf, 0x68, 0x93, 0x70, 0xc2, 0xb2, // 10496 - 0xba, 0x75, 0x99, 0x6a, 0x73, 0x32, 0x94, 0xd1, 0x10, 0x44, 0x10, 0x2e, 0xdf, 0x82, 0xf3, 0x07, // 10512 - 0x84, 0xe6, 0x74, 0x3b, 0x6d, 0x71, 0xe2, 0x2d, 0x0c, 0x1b, 0xee, 0x20, 0xd5, 0xc9, 0x20, 0x1d, // 10528 - 0x63, 0x29, 0x2d, 0xce, 0xec, 0x5e, 0x4e, 0xc8, 0x93, 0xf8, 0x21, 0x61, 0x9b, 0x34, 0xeb, 0x05, // 10544 - 0xc6, 0x5e, 0xec, 0x5b, 0x1a, 0xbc, 0xeb, 0xc9, 0xcf, 0xcd, 0xac, 0x34, 0x40, 0x5f, 0xb1, 0x7a, // 10560 - 0x66, 0xee, 0x77, 0xc8, 0x48, 0xa8, 0x66, 0x57, 0x57, 0x9f, 0x54, 0x58, 0x8e, 0x0c, 0x2b, 0xb7, // 10576 - 0x4f, 0xa7, 0x30, 0xd9, 0x56, 0xee, 0xca, 0x7b, 0x5d, 0xe3, 0xad, 0xc9, 0x4f, 0x5e, 0xe5, 0x35, // 10592 - 0xe7, 0x31, 0xcb, 0xda, 0x93, 0x5e, 0xdc, 0x8e, 0x8f, 0x80, 0xda, 0xb6, 0x91, 0x98, 0x40, 0x90, // 10608 - 0x79, 0xc3, 0x78, 0xc7, 0xb6, 0xb1, 0xc4, 0xb5, 0x6a, 0x18, 0x38, 0x03, 0x10, 0x8d, 0xd8, 0xd4, // 10624 - 0x37, 0xa4, 0x2e, 0x05, 0x7d, 0x88, 0xf5, 0x82, 0x3e, 0x10, 0x91, 0x70, 0xab, 0x55, 0x82, 0x41, // 10640 - 0x32, 0xd7, 0xdb, 0x04, 0x73, 0x2a, 0x6e, 0x91, 0x01, 0x7c, 0x21, 0x4c, 0xd4, 0xbc, 0xae, 0x1b, // 10656 - 0x03, 0x75, 0x5d, 0x78, 0x66, 0xd9, 0x3a, 0x31, 0x44, 0x9a, 0x33, 0x40, 0xbf, 0x08, 0xd7, 0x5a, // 10672 - 0x49, 0xa4, 0xc2, 0xe6, 0xa9, 0xa0, 0x67, 0xdd, 0xa4, 0x27, 0xbc, 0xa1, 0x4f, 0x39, 0xb5, 0x11, // 10688 - 0x58, 0x17, 0xf7, 0x24, 0x5c, 0x46, 0x8f, 0x64, 0xf7, 0xc1, 0x69, 0x88, 0x76, 0x98, 0x76, 0x3d, // 10704 - 0x59, 0x5d, 0x42, 0x76, 0x87, 0x89, 0x97, 0x69, 0x7a, 0x48, 0xf0, 0xe0, 0xa2, 0x12, 0x1b, 0x66, // 10720 - 0x9a, 0x74, 0xca, 0xde, 0x4b, 0x1e, 0xe7, 0x0e, 0x63, 0xae, 0xe6, 0xd4, 0xef, 0x92, 0x92, 0x3a, // 10736 - 0x9e, 0x3d, 0xdc, 0x00, 0xe4, 0x45, 0x25, 0x89, 0xb6, 0x9a, 0x44, 0x19, 0x2b, 0x7e, 0xc0, 0x94, // 10752 - 0xb4, 0xd2, 0x61, 0x6d, 0xeb, 0x33, 0xd9, 0xc5, 0xdf, 0x4b, 0x04, 0x00, 0xcc, 0x7d, 0x1c, 0x95, // 10768 - 0xc3, 0x8f, 0xf7, 0x21, 0xb2, 0xb2, 0x11, 0xb7, 0xbb, 0x7f, 0xf2, 0xd5, 0x8c, 0x70, 0x2c, 0x41, // 10784 - 0x60, 0xaa, 0xb1, 0x63, 0x18, 0x44, 0x95, 0x1a, 0x76, 0x62, 0x7e, 0xf6, 0x80, 0xb0, 0xfb, 0xe8, // 10800 - 0x64, 0xa6, 0x33, 0xd1, 0x89, 0x07, 0xe1, 0xbd, 0xb7, 0xe6, 0x43, 0xa4, 0x18, 0xb8, 0xa6, 0x77, // 10816 - 0x01, 0xe1, 0x0f, 0x94, 0x0c, 0x21, 0x1d, 0xb2, 0x54, 0x29, 0x25, 0x89, 0x6c, 0xe5, 0x0e, 0x52, // 10832 - 0x51, 0x47, 0x74, 0xbe, 0x26, 0xac, 0xb6, 0x41, 0x75, 0xde, 0x7a, 0xac, 0x5f, 0x8d, 0x3f, 0xc9, // 10848 - 0xbc, 0xd3, 0x41, 0x11, 0x12, 0x5b, 0xe5, 0x10, 0x50, 0xeb, 0x31, 0xc5, 0xca, 0x72, 0x16, 0x22, // 10864 - 0x09, 0xdf, 0x7c, 0x4c, 0x75, 0x3f, 0x63, 0xec, 0x21, 0x5f, 0xc4, 0x20, 0x51, 0x6b, 0x6f, 0xb1, // 10880 - 0xab, 0x86, 0x8b, 0x4f, 0xc2, 0xd6, 0x45, 0x5f, 0x9d, 0x20, 0xfc, 0xa1, 0x1e, 0xc5, 0xc0, 0x8f, // 10896 - 0xa2, 0xb1, 0x7e, 0x0a, 0x26, 0x99, 0xf5, 0xe4, 0x69, 0x2f, 0x98, 0x1d, 0x2d, 0xf5, 0xd9, 0xa9, // 10912 - 0xb2, 0x1d, 0xe5, 0x1b, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x65, 0x01, 0x24, 0x30, 0x63, 0x31, // 10928 - 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x21, 0x30, 0x1f, // 10944 - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x54, 0x68, 0x65, 0x20, 0x47, 0x6f, 0x20, 0x44, 0x61, // 10960 - 0x64, 0x64, 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, // 10976 - 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x28, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, // 10992 - 0x64, 0x79, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, // 11008 - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, // 11024 - 0x74, 0x79, 0x30, 0x82, 0x01, 0x20, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, // 11040 - 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0d, 0x00, 0x30, 0x82, 0x01, 0x08, 0x02, 0x82, // 11056 - 0x01, 0x01, 0x00, 0xde, 0x9d, 0xd7, 0xea, 0x57, 0x18, 0x49, 0xa1, 0x5b, 0xeb, 0xd7, 0x5f, 0x48, // 11072 - 0x86, 0xea, 0xbe, 0xdd, 0xff, 0xe4, 0xef, 0x67, 0x1c, 0xf4, 0x65, 0x68, 0xb3, 0x57, 0x71, 0xa0, // 11088 - 0x5e, 0x77, 0xbb, 0xed, 0x9b, 0x49, 0xe9, 0x70, 0x80, 0x3d, 0x56, 0x18, 0x63, 0x08, 0x6f, 0xda, // 11104 - 0xf2, 0xcc, 0xd0, 0x3f, 0x7f, 0x02, 0x54, 0x22, 0x54, 0x10, 0xd8, 0xb2, 0x81, 0xd4, 0xc0, 0x75, // 11120 - 0x3d, 0x4b, 0x7f, 0xc7, 0x77, 0xc3, 0x3e, 0x78, 0xab, 0x1a, 0x03, 0xb5, 0x20, 0x6b, 0x2f, 0x6a, // 11136 - 0x2b, 0xb1, 0xc5, 0x88, 0x7e, 0xc4, 0xbb, 0x1e, 0xb0, 0xc1, 0xd8, 0x45, 0x27, 0x6f, 0xaa, 0x37, // 11152 - 0x58, 0xf7, 0x87, 0x26, 0xd7, 0xd8, 0x2d, 0xf6, 0xa9, 0x17, 0xb7, 0x1f, 0x72, 0x36, 0x4e, 0xa6, // 11168 - 0x17, 0x3f, 0x65, 0x98, 0x92, 0xdb, 0x2a, 0x6e, 0x5d, 0xa2, 0xfe, 0x88, 0xe0, 0x0b, 0xde, 0x7f, // 11184 - 0xe5, 0x8d, 0x15, 0xe1, 0xeb, 0xcb, 0x3a, 0xd5, 0xe2, 0x12, 0xa2, 0x13, 0x2d, 0xd8, 0x8e, 0xaf, // 11200 - 0x5f, 0x12, 0x3d, 0xa0, 0x08, 0x05, 0x08, 0xb6, 0x5c, 0xa5, 0x65, 0x38, 0x04, 0x45, 0x99, 0x1e, // 11216 - 0xa3, 0x60, 0x60, 0x74, 0xc5, 0x41, 0xa5, 0x72, 0x62, 0x1b, 0x62, 0xc5, 0x1f, 0x6f, 0x5f, 0x1a, // 11232 - 0x42, 0xbe, 0x02, 0x51, 0x65, 0xa8, 0xae, 0x23, 0x18, 0x6a, 0xfc, 0x78, 0x03, 0xa9, 0x4d, 0x7f, // 11248 - 0x80, 0xc3, 0xfa, 0xab, 0x5a, 0xfc, 0xa1, 0x40, 0xa4, 0xca, 0x19, 0x16, 0xfe, 0xb2, 0xc8, 0xef, // 11264 - 0x5e, 0x73, 0x0d, 0xee, 0x77, 0xbd, 0x9a, 0xf6, 0x79, 0x98, 0xbc, 0xb1, 0x07, 0x67, 0xa2, 0x15, // 11280 - 0x0d, 0xdd, 0xa0, 0x58, 0xc6, 0x44, 0x7b, 0x0a, 0x3e, 0x62, 0x28, 0x5f, 0xba, 0x41, 0x07, 0x53, // 11296 - 0x58, 0xcf, 0x11, 0x7e, 0x38, 0x74, 0xc5, 0xf8, 0xff, 0xb5, 0x69, 0x90, 0x8f, 0x84, 0x74, 0xea, // 11312 - 0x97, 0x1b, 0xaf, 0x02, 0x01, 0x03, 0x00, 0x67, 0x01, 0x26, 0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, // 11328 - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, // 11344 - 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, // 11360 - 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, // 11376 - 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x24, 0x30, 0x22, 0x06, // 11392 - 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x41, // 11408 - 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, // 11424 - 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, // 11440 - 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, // 11456 - 0x01, 0x00, 0xad, 0x0e, 0x15, 0xce, 0xe4, 0x43, 0x80, 0x5c, 0xb1, 0x87, 0xf3, 0xb7, 0x60, 0xf9, // 11472 - 0x71, 0x12, 0xa5, 0xae, 0xdc, 0x26, 0x94, 0x88, 0xaa, 0xf4, 0xce, 0xf5, 0x20, 0x39, 0x28, 0x58, // 11488 - 0x60, 0x0c, 0xf8, 0x80, 0xda, 0xa9, 0x15, 0x95, 0x32, 0x61, 0x3c, 0xb5, 0xb1, 0x28, 0x84, 0x8a, // 11504 - 0x8a, 0xdc, 0x9f, 0x0a, 0x0c, 0x83, 0x17, 0x7a, 0x8f, 0x90, 0xac, 0x8a, 0xe7, 0x79, 0x53, 0x5c, // 11520 - 0x31, 0x84, 0x2a, 0xf6, 0x0f, 0x98, 0x32, 0x36, 0x76, 0xcc, 0xde, 0xdd, 0x3c, 0xa8, 0xa2, 0xef, // 11536 - 0x6a, 0xfb, 0x21, 0xf2, 0x52, 0x61, 0xdf, 0x9f, 0x20, 0xd7, 0x1f, 0xe2, 0xb1, 0xd9, 0xfe, 0x18, // 11552 - 0x64, 0xd2, 0x12, 0x5b, 0x5f, 0xf9, 0x58, 0x18, 0x35, 0xbc, 0x47, 0xcd, 0xa1, 0x36, 0xf9, 0x6b, // 11568 - 0x7f, 0xd4, 0xb0, 0x38, 0x3e, 0xc1, 0x1b, 0xc3, 0x8c, 0x33, 0xd9, 0xd8, 0x2f, 0x18, 0xfe, 0x28, // 11584 - 0x0f, 0xb3, 0xa7, 0x83, 0xd6, 0xc3, 0x6e, 0x44, 0xc0, 0x61, 0x35, 0x96, 0x16, 0xfe, 0x59, 0x9c, // 11600 - 0x8b, 0x76, 0x6d, 0xd7, 0xf1, 0xa2, 0x4b, 0x0d, 0x2b, 0xff, 0x0b, 0x72, 0xda, 0x9e, 0x60, 0xd0, // 11616 - 0x8e, 0x90, 0x35, 0xc6, 0x78, 0x55, 0x87, 0x20, 0xa1, 0xcf, 0xe5, 0x6d, 0x0a, 0xc8, 0x49, 0x7c, // 11632 - 0x31, 0x98, 0x33, 0x6c, 0x22, 0xe9, 0x87, 0xd0, 0x32, 0x5a, 0xa2, 0xba, 0x13, 0x82, 0x11, 0xed, // 11648 - 0x39, 0x17, 0x9d, 0x99, 0x3a, 0x72, 0xa1, 0xe6, 0xfa, 0xa4, 0xd9, 0xd5, 0x17, 0x31, 0x75, 0xae, // 11664 - 0x85, 0x7d, 0x22, 0xae, 0x3f, 0x01, 0x46, 0x86, 0xf6, 0x28, 0x79, 0xc8, 0xb1, 0xda, 0xe4, 0x57, // 11680 - 0x17, 0xc4, 0x7e, 0x1c, 0x0e, 0xb0, 0xb4, 0x92, 0xa6, 0x56, 0xb3, 0xbd, 0xb2, 0x97, 0xed, 0xaa, // 11696 - 0xa7, 0xf0, 0xb7, 0xc5, 0xa8, 0x3f, 0x95, 0x16, 0xd0, 0xff, 0xa1, 0x96, 0xeb, 0x08, 0x5f, 0x18, // 11712 - 0x77, 0x4f, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x67, 0x01, 0x26, 0x30, 0x65, 0x31, 0x0b, 0x30, // 11728 - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, // 11744 - 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, // 11760 - 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, // 11776 - 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x24, 0x30, 0x22, // 11792 - 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, // 11808 - 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, // 11824 - 0x47, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, // 11840 - 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, // 11856 - 0x01, 0x01, 0x00, 0xd9, 0xe7, 0x28, 0x2f, 0x52, 0x3f, 0x36, 0x72, 0x49, 0x88, 0x93, 0x34, 0xf3, // 11872 - 0xf8, 0x6a, 0x1e, 0x31, 0x54, 0x80, 0x9f, 0xad, 0x54, 0x41, 0xb5, 0x47, 0xdf, 0x96, 0xa8, 0xd4, // 11888 - 0xaf, 0x80, 0x2d, 0xb9, 0x0a, 0xcf, 0x75, 0xfd, 0x89, 0xa5, 0x7d, 0x24, 0xfa, 0xe3, 0x22, 0x0c, // 11904 - 0x2b, 0xbc, 0x95, 0x17, 0x0b, 0x33, 0xbf, 0x19, 0x4d, 0x41, 0x06, 0x90, 0x00, 0xbd, 0x0c, 0x4d, // 11920 - 0x10, 0xfe, 0x07, 0xb5, 0xe7, 0x1c, 0x6e, 0x22, 0x55, 0x31, 0x65, 0x97, 0xbd, 0xd3, 0x17, 0xd2, // 11936 - 0x1e, 0x62, 0xf3, 0xdb, 0xea, 0x6c, 0x50, 0x8c, 0x3f, 0x84, 0x0c, 0x96, 0xcf, 0xb7, 0xcb, 0x03, // 11952 - 0xe0, 0xca, 0x6d, 0xa1, 0x14, 0x4c, 0x1b, 0x89, 0xdd, 0xed, 0x00, 0xb0, 0x52, 0x7c, 0xaf, 0x91, // 11968 - 0x6c, 0xb1, 0x38, 0x13, 0xd1, 0xe9, 0x12, 0x08, 0xc0, 0x00, 0xb0, 0x1c, 0x2b, 0x11, 0xda, 0x77, // 11984 - 0x70, 0x36, 0x9b, 0xae, 0xce, 0x79, 0x87, 0xdc, 0x82, 0x70, 0xe6, 0x09, 0x74, 0x70, 0x55, 0x69, // 12000 - 0xaf, 0xa3, 0x68, 0x9f, 0xbf, 0xdd, 0xb6, 0x79, 0xb3, 0xf2, 0x9d, 0x70, 0x29, 0x55, 0xf4, 0xab, // 12016 - 0xff, 0x95, 0x61, 0xf3, 0xc9, 0x40, 0x6f, 0x1d, 0xd1, 0xbe, 0x93, 0xbb, 0xd3, 0x88, 0x2a, 0xbb, // 12032 - 0x9d, 0xbf, 0x72, 0x5a, 0x56, 0x71, 0x3b, 0x3f, 0xd4, 0xf3, 0xd1, 0x0a, 0xfe, 0x28, 0xef, 0xa3, // 12048 - 0xee, 0xd9, 0x99, 0xaf, 0x03, 0xd3, 0x8f, 0x60, 0xb7, 0xf2, 0x92, 0xa1, 0xb1, 0xbd, 0x89, 0x89, // 12064 - 0x1f, 0x30, 0xcd, 0xc3, 0xa6, 0x2e, 0x62, 0x33, 0xae, 0x16, 0x02, 0x77, 0x44, 0x5a, 0xe7, 0x81, // 12080 - 0x0a, 0x3c, 0xa7, 0x44, 0x2e, 0x79, 0xb8, 0x3f, 0x04, 0xbc, 0x5c, 0xa0, 0x87, 0xe1, 0x1b, 0xaf, // 12096 - 0x51, 0x8e, 0xcd, 0xec, 0x2c, 0xfa, 0xf8, 0xfe, 0x6d, 0xf0, 0x3a, 0x7c, 0xaa, 0x8b, 0xe4, 0x67, // 12112 - 0x95, 0x31, 0x8d, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x67, 0x00, 0x78, 0x30, 0x65, 0x31, 0x0b, // 12128 - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, // 12144 - 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, // 12160 - 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, // 12176 - 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x24, 0x30, // 12192 - 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, // 12208 - 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6f, 0x6f, 0x74, // 12224 - 0x20, 0x47, 0x33, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, // 12240 - 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x19, 0xe7, 0xbc, 0xac, 0x44, // 12256 - 0x65, 0xed, 0xcd, 0xb8, 0x3f, 0x58, 0xfb, 0x8d, 0xb1, 0x57, 0xa9, 0x44, 0x2d, 0x05, 0x15, 0xf2, // 12272 - 0xef, 0x0b, 0xff, 0x10, 0x74, 0x9f, 0xb5, 0x62, 0x52, 0x5f, 0x66, 0x7e, 0x1f, 0xe5, 0xdc, 0x1b, // 12288 - 0x45, 0x79, 0x0b, 0xcc, 0xc6, 0x53, 0x0a, 0x9d, 0x8d, 0x5d, 0x02, 0xd9, 0xa9, 0x59, 0xde, 0x02, // 12304 - 0x5a, 0xf6, 0x95, 0x2a, 0x0e, 0x8d, 0x38, 0x4a, 0x8a, 0x49, 0xc6, 0xbc, 0xc6, 0x03, 0x38, 0x07, // 12320 - 0x5f, 0x55, 0xda, 0x7e, 0x09, 0x6e, 0xe2, 0x7f, 0x5e, 0xd0, 0x45, 0x20, 0x0f, 0x59, 0x76, 0x10, // 12336 - 0xd6, 0xa0, 0x24, 0xf0, 0x2d, 0xde, 0x36, 0xf2, 0x6c, 0x29, 0x39, 0x00, 0x6a, 0x01, 0x24, 0x30, // 12352 - 0x68, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x25, // 12368 - 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, // 12384 - 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, // 12400 - 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x29, // 12416 - 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, // 12432 - 0x32, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, // 12448 - 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x20, 0x30, 0x0d, 0x06, // 12464 - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0d, // 12480 - 0x00, 0x30, 0x82, 0x01, 0x08, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb7, 0x32, 0xc8, 0xfe, 0xe9, 0x71, // 12496 - 0xa6, 0x04, 0x85, 0xad, 0x0c, 0x11, 0x64, 0xdf, 0xce, 0x4d, 0xef, 0xc8, 0x03, 0x18, 0x87, 0x3f, // 12512 - 0xa1, 0xab, 0xfb, 0x3c, 0xa6, 0x9f, 0xf0, 0xc3, 0xa1, 0xda, 0xd4, 0xd8, 0x6e, 0x2b, 0x53, 0x90, // 12528 - 0xfb, 0x24, 0xa4, 0x3e, 0x84, 0xf0, 0x9e, 0xe8, 0x5f, 0xec, 0xe5, 0x27, 0x44, 0xf5, 0x28, 0xa6, // 12544 - 0x3f, 0x7b, 0xde, 0xe0, 0x2a, 0xf0, 0xc8, 0xaf, 0x53, 0x2f, 0x9e, 0xca, 0x05, 0x01, 0x93, 0x1e, // 12560 - 0x8f, 0x66, 0x1c, 0x39, 0xa7, 0x4d, 0xfa, 0x5a, 0xb6, 0x73, 0x04, 0x25, 0x66, 0xeb, 0x77, 0x7f, // 12576 - 0xe7, 0x59, 0xc6, 0x4a, 0x99, 0x25, 0x14, 0x54, 0xeb, 0x26, 0xc7, 0xf3, 0x7f, 0x19, 0xd5, 0x30, // 12592 - 0x70, 0x8f, 0xaf, 0xb0, 0x46, 0x2a, 0xff, 0xad, 0xeb, 0x29, 0xed, 0xd7, 0x9f, 0xaa, 0x04, 0x87, // 12608 - 0xa3, 0xd4, 0xf9, 0x89, 0xa5, 0x34, 0x5f, 0xdb, 0x43, 0x91, 0x82, 0x36, 0xd9, 0x66, 0x3c, 0xb1, // 12624 - 0xb8, 0xb9, 0x82, 0xfd, 0x9c, 0x3a, 0x3e, 0x10, 0xc8, 0x3b, 0xef, 0x06, 0x65, 0x66, 0x7a, 0x9b, // 12640 - 0x19, 0x18, 0x3d, 0xff, 0x71, 0x51, 0x3c, 0x30, 0x2e, 0x5f, 0xbe, 0x3d, 0x77, 0x73, 0xb2, 0x5d, // 12656 - 0x06, 0x6c, 0xc3, 0x23, 0x56, 0x9a, 0x2b, 0x85, 0x26, 0x92, 0x1c, 0xa7, 0x02, 0xb3, 0xe4, 0x3f, // 12672 - 0x0d, 0xaf, 0x08, 0x79, 0x82, 0xb8, 0x36, 0x3d, 0xea, 0x9c, 0xd3, 0x35, 0xb3, 0xbc, 0x69, 0xca, // 12688 - 0xf5, 0xcc, 0x9d, 0xe8, 0xfd, 0x64, 0x8d, 0x17, 0x80, 0x33, 0x6e, 0x5e, 0x4a, 0x5d, 0x99, 0xc9, // 12704 - 0x1e, 0x87, 0xb4, 0x9d, 0x1a, 0xc0, 0xd5, 0x6e, 0x13, 0x35, 0x23, 0x5e, 0xdf, 0x9b, 0x5f, 0x3d, // 12720 - 0xef, 0xd6, 0xf7, 0x76, 0xc2, 0xea, 0x3e, 0xbb, 0x78, 0x0d, 0x1c, 0x42, 0x67, 0x6b, 0x04, 0xd8, // 12736 - 0xf8, 0xd6, 0xda, 0x6f, 0x8b, 0xf2, 0x44, 0xa0, 0x01, 0xab, 0x02, 0x01, 0x03, 0x00, 0x6e, 0x01, // 12752 - 0x26, 0x30, 0x6c, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, // 12768 - 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, // 12784 - 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, // 12800 - 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, // 12816 - 0x6f, 0x6d, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x44, 0x69, 0x67, // 12832 - 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x48, 0x69, 0x67, 0x68, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, // 12848 - 0x61, 0x6e, 0x63, 0x65, 0x20, 0x45, 0x56, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, // 12864 - 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, // 12880 - 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, // 12896 - 0xc6, 0xcc, 0xe5, 0x73, 0xe6, 0xfb, 0xd4, 0xbb, 0xe5, 0x2d, 0x2d, 0x32, 0xa6, 0xdf, 0xe5, 0x81, // 12912 - 0x3f, 0xc9, 0xcd, 0x25, 0x49, 0xb6, 0x71, 0x2a, 0xc3, 0xd5, 0x94, 0x34, 0x67, 0xa2, 0x0a, 0x1c, // 12928 - 0xb0, 0x5f, 0x69, 0xa6, 0x40, 0xb1, 0xc4, 0xb7, 0xb2, 0x8f, 0xd0, 0x98, 0xa4, 0xa9, 0x41, 0x59, // 12944 - 0x3a, 0xd3, 0xdc, 0x94, 0xd6, 0x3c, 0xdb, 0x74, 0x38, 0xa4, 0x4a, 0xcc, 0x4d, 0x25, 0x82, 0xf7, // 12960 - 0x4a, 0xa5, 0x53, 0x12, 0x38, 0xee, 0xf3, 0x49, 0x6d, 0x71, 0x91, 0x7e, 0x63, 0xb6, 0xab, 0xa6, // 12976 - 0x5f, 0xc3, 0xa4, 0x84, 0xf8, 0x4f, 0x62, 0x51, 0xbe, 0xf8, 0xc5, 0xec, 0xdb, 0x38, 0x92, 0xe3, // 12992 - 0x06, 0xe5, 0x08, 0x91, 0x0c, 0xc4, 0x28, 0x41, 0x55, 0xfb, 0xcb, 0x5a, 0x89, 0x15, 0x7e, 0x71, // 13008 - 0xe8, 0x35, 0xbf, 0x4d, 0x72, 0x09, 0x3d, 0xbe, 0x3a, 0x38, 0x50, 0x5b, 0x77, 0x31, 0x1b, 0x8d, // 13024 - 0xb3, 0xc7, 0x24, 0x45, 0x9a, 0xa7, 0xac, 0x6d, 0x00, 0x14, 0x5a, 0x04, 0xb7, 0xba, 0x13, 0xeb, // 13040 - 0x51, 0x0a, 0x98, 0x41, 0x41, 0x22, 0x4e, 0x65, 0x61, 0x87, 0x81, 0x41, 0x50, 0xa6, 0x79, 0x5c, // 13056 - 0x89, 0xde, 0x19, 0x4a, 0x57, 0xd5, 0x2e, 0xe6, 0x5d, 0x1c, 0x53, 0x2c, 0x7e, 0x98, 0xcd, 0x1a, // 13072 - 0x06, 0x16, 0xa4, 0x68, 0x73, 0xd0, 0x34, 0x04, 0x13, 0x5c, 0xa1, 0x71, 0xd3, 0x5a, 0x7c, 0x55, // 13088 - 0xdb, 0x5e, 0x64, 0xe1, 0x37, 0x87, 0x30, 0x56, 0x04, 0xe5, 0x11, 0xb4, 0x29, 0x80, 0x12, 0xf1, // 13104 - 0x79, 0x39, 0x88, 0xa2, 0x02, 0x11, 0x7c, 0x27, 0x66, 0xb7, 0x88, 0xb7, 0x78, 0xf2, 0xca, 0x0a, // 13120 - 0xa8, 0x38, 0xab, 0x0a, 0x64, 0xc2, 0xbf, 0x66, 0x5d, 0x95, 0x84, 0xc1, 0xa1, 0x25, 0x1e, 0x87, // 13136 - 0x5d, 0x1a, 0x50, 0x0b, 0x20, 0x12, 0xcc, 0x41, 0xbb, 0x6e, 0x0b, 0x51, 0x38, 0xb8, 0x4b, 0xcb, // 13152 - 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x84, 0x01, 0x26, 0x30, 0x81, 0x81, 0x31, 0x0b, 0x30, 0x09, // 13168 - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, // 13184 - 0x04, 0x08, 0x13, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, // 13200 - 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, // 13216 - 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, // 13232 - 0x0a, 0x13, 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, // 13248 - 0x69, 0x74, 0x65, 0x64, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1e, 0x43, // 13264 - 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, // 13280 - 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, // 13296 - 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, // 13312 - 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd0, 0x40, // 13328 - 0x8b, 0x8b, 0x72, 0xe3, 0x91, 0x1b, 0xf7, 0x51, 0xc1, 0x1b, 0x54, 0x04, 0x98, 0xd3, 0xa9, 0xbf, // 13344 - 0xc1, 0xe6, 0x8a, 0x5d, 0x3b, 0x87, 0xfb, 0xbb, 0x88, 0xce, 0x0d, 0xe3, 0x2f, 0x3f, 0x06, 0x96, // 13360 - 0xf0, 0xa2, 0x29, 0x50, 0x99, 0xae, 0xdb, 0x3b, 0xa1, 0x57, 0xb0, 0x74, 0x51, 0x71, 0xcd, 0xed, // 13376 - 0x42, 0x91, 0x4d, 0x41, 0xfe, 0xa9, 0xc8, 0xd8, 0x6a, 0x86, 0x77, 0x44, 0xbb, 0x59, 0x66, 0x97, // 13392 - 0x50, 0x5e, 0xb4, 0xd4, 0x2c, 0x70, 0x44, 0xcf, 0xda, 0x37, 0x95, 0x42, 0x69, 0x3c, 0x30, 0xc4, // 13408 - 0x71, 0xb3, 0x52, 0xf0, 0x21, 0x4d, 0xa1, 0xd8, 0xba, 0x39, 0x7c, 0x1c, 0x9e, 0xa3, 0x24, 0x9d, // 13424 - 0xf2, 0x83, 0x16, 0x98, 0xaa, 0x16, 0x7c, 0x43, 0x9b, 0x15, 0x5b, 0xb7, 0xae, 0x34, 0x91, 0xfe, // 13440 - 0xd4, 0x62, 0x26, 0x18, 0x46, 0x9a, 0x3f, 0xeb, 0xc1, 0xf9, 0xf1, 0x90, 0x57, 0xeb, 0xac, 0x7a, // 13456 - 0x0d, 0x8b, 0xdb, 0x72, 0x30, 0x6a, 0x66, 0xd5, 0xe0, 0x46, 0xa3, 0x70, 0xdc, 0x68, 0xd9, 0xff, // 13472 - 0x04, 0x48, 0x89, 0x77, 0xde, 0xb5, 0xe9, 0xfb, 0x67, 0x6d, 0x41, 0xe9, 0xbc, 0x39, 0xbd, 0x32, // 13488 - 0xd9, 0x62, 0x02, 0xf1, 0xb1, 0xa8, 0x3d, 0x6e, 0x37, 0x9c, 0xe2, 0x2f, 0xe2, 0xd3, 0xa2, 0x26, // 13504 - 0x8b, 0xc6, 0xb8, 0x55, 0x43, 0x88, 0xe1, 0x23, 0x3e, 0xa5, 0xd2, 0x24, 0x39, 0x6a, 0x47, 0xab, // 13520 - 0x00, 0xd4, 0xa1, 0xb3, 0xa9, 0x25, 0xfe, 0x0d, 0x3f, 0xa7, 0x1d, 0xba, 0xd3, 0x51, 0xc1, 0x0b, // 13536 - 0xa4, 0xda, 0xac, 0x38, 0xef, 0x55, 0x50, 0x24, 0x05, 0x65, 0x46, 0x93, 0x34, 0x4f, 0x2d, 0x8d, // 13552 - 0xad, 0xc6, 0xd4, 0x21, 0x19, 0xd2, 0x8e, 0xca, 0x05, 0x61, 0x71, 0x07, 0x73, 0x47, 0xe5, 0x8a, // 13568 - 0x19, 0x12, 0xbd, 0x04, 0x4d, 0xce, 0x4e, 0x9c, 0xa5, 0x48, 0xac, 0xbb, 0x26, 0xf7, 0x02, 0x03, // 13584 - 0x01, 0x00, 0x01, 0x00, 0x86, 0x01, 0x26, 0x30, 0x81, 0x83, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, // 13600 - 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, // 13616 - 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, // 13632 - 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x1a, // 13648 - 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x47, 0x6f, 0x44, 0x61, 0x64, 0x64, 0x79, // 13664 - 0x2e, 0x63, 0x6f, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, // 13680 - 0x55, 0x04, 0x03, 0x13, 0x28, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x52, 0x6f, // 13696 - 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, // 13712 - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, // 13728 - 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, // 13744 - 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbf, 0x71, // 13760 - 0x62, 0x08, 0xf1, 0xfa, 0x59, 0x34, 0xf7, 0x1b, 0xc9, 0x18, 0xa3, 0xf7, 0x80, 0x49, 0x58, 0xe9, // 13776 - 0x22, 0x83, 0x13, 0xa6, 0xc5, 0x20, 0x43, 0x01, 0x3b, 0x84, 0xf1, 0xe6, 0x85, 0x49, 0x9f, 0x27, // 13792 - 0xea, 0xf6, 0x84, 0x1b, 0x4e, 0xa0, 0xb4, 0xdb, 0x70, 0x98, 0xc7, 0x32, 0x01, 0xb1, 0x05, 0x3e, // 13808 - 0x07, 0x4e, 0xee, 0xf4, 0xfa, 0x4f, 0x2f, 0x59, 0x30, 0x22, 0xe7, 0xab, 0x19, 0x56, 0x6b, 0xe2, // 13824 - 0x80, 0x07, 0xfc, 0xf3, 0x16, 0x75, 0x80, 0x39, 0x51, 0x7b, 0xe5, 0xf9, 0x35, 0xb6, 0x74, 0x4e, // 13840 - 0xa9, 0x8d, 0x82, 0x13, 0xe4, 0xb6, 0x3f, 0xa9, 0x03, 0x83, 0xfa, 0xa2, 0xbe, 0x8a, 0x15, 0x6a, // 13856 - 0x7f, 0xde, 0x0b, 0xc3, 0xb6, 0x19, 0x14, 0x05, 0xca, 0xea, 0xc3, 0xa8, 0x04, 0x94, 0x3b, 0x46, // 13872 - 0x7c, 0x32, 0x0d, 0xf3, 0x00, 0x66, 0x22, 0xc8, 0x8d, 0x69, 0x6d, 0x36, 0x8c, 0x11, 0x18, 0xb7, // 13888 - 0xd3, 0xb2, 0x1c, 0x60, 0xb4, 0x38, 0xfa, 0x02, 0x8c, 0xce, 0xd3, 0xdd, 0x46, 0x07, 0xde, 0x0a, // 13904 - 0x3e, 0xeb, 0x5d, 0x7c, 0xc8, 0x7c, 0xfb, 0xb0, 0x2b, 0x53, 0xa4, 0x92, 0x62, 0x69, 0x51, 0x25, // 13920 - 0x05, 0x61, 0x1a, 0x44, 0x81, 0x8c, 0x2c, 0xa9, 0x43, 0x96, 0x23, 0xdf, 0xac, 0x3a, 0x81, 0x9a, // 13936 - 0x0e, 0x29, 0xc5, 0x1c, 0xa9, 0xe9, 0x5d, 0x1e, 0xb6, 0x9e, 0x9e, 0x30, 0x0a, 0x39, 0xce, 0xf1, // 13952 - 0x88, 0x80, 0xfb, 0x4b, 0x5d, 0xcc, 0x32, 0xec, 0x85, 0x62, 0x43, 0x25, 0x34, 0x02, 0x56, 0x27, // 13968 - 0x01, 0x91, 0xb4, 0x3b, 0x70, 0x2a, 0x3f, 0x6e, 0xb1, 0xe8, 0x9c, 0x88, 0x01, 0x7d, 0x9f, 0xd4, // 13984 - 0xf9, 0xdb, 0x53, 0x6d, 0x60, 0x9d, 0xbf, 0x2c, 0xe7, 0x58, 0xab, 0xb8, 0x5f, 0x46, 0xfc, 0xce, // 14000 - 0xc4, 0x1b, 0x03, 0x3c, 0x09, 0xeb, 0x49, 0x31, 0x5c, 0x69, 0x46, 0xb3, 0xe0, 0x47, 0x02, 0x03, // 14016 - 0x01, 0x00, 0x01, 0x00, 0x88, 0x00, 0x78, 0x30, 0x81, 0x85, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, // 14032 - 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, // 14048 - 0x13, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, // 14064 - 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x53, // 14080 - 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, // 14096 - 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, // 14112 - 0x65, 0x64, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x43, 0x4f, 0x4d, // 14128 - 0x4f, 0x44, 0x4f, 0x20, 0x45, 0x43, 0x43, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, // 14144 - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, // 14160 - 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, // 14176 - 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x03, 0x47, 0x7b, 0x2f, 0x75, 0xc9, 0x82, 0x15, 0x85, // 14192 - 0xfb, 0x75, 0xe4, 0x91, 0x16, 0xd4, 0xab, 0x62, 0x99, 0xf5, 0x3e, 0x52, 0x0b, 0x06, 0xce, 0x41, // 14208 - 0x00, 0x7f, 0x97, 0xe1, 0x0a, 0x24, 0x3c, 0x1d, 0x01, 0x04, 0xee, 0x3d, 0xd2, 0x8d, 0x09, 0x97, // 14224 - 0x0c, 0xe0, 0x75, 0xe4, 0xfa, 0xfb, 0x77, 0x8a, 0x2a, 0xf5, 0x03, 0x60, 0x4b, 0x36, 0x8b, 0x16, // 14240 - 0x23, 0x16, 0xad, 0x09, 0x71, 0xf4, 0x4a, 0xf4, 0x28, 0x50, 0xb4, 0xfe, 0x88, 0x1c, 0x6e, 0x3f, // 14256 - 0x6c, 0x2f, 0x2f, 0x09, 0x59, 0x5b, 0xa5, 0x5b, 0x0b, 0x33, 0x99, 0xe2, 0xc3, 0x3d, 0x89, 0xf9, // 14272 - 0x6a, 0x2c, 0xef, 0xb2, 0xd3, 0x06, 0xe9, 0x00, 0x88, 0x02, 0x26, 0x30, 0x81, 0x85, 0x31, 0x0b, // 14288 - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, // 14304 - 0x03, 0x55, 0x04, 0x08, 0x13, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, // 14320 - 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, // 14336 - 0x07, 0x13, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, // 14352 - 0x55, 0x04, 0x0a, 0x13, 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x41, 0x20, 0x4c, // 14368 - 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, // 14384 - 0x22, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x52, 0x53, 0x41, 0x20, 0x43, 0x65, 0x72, 0x74, // 14400 - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, // 14416 - 0x69, 0x74, 0x79, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, // 14432 - 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, // 14448 - 0x82, 0x02, 0x01, 0x00, 0x91, 0xe8, 0x54, 0x92, 0xd2, 0x0a, 0x56, 0xb1, 0xac, 0x0d, 0x24, 0xdd, // 14464 - 0xc5, 0xcf, 0x44, 0x67, 0x74, 0x99, 0x2b, 0x37, 0xa3, 0x7d, 0x23, 0x70, 0x00, 0x71, 0xbc, 0x53, // 14480 - 0xdf, 0xc4, 0xfa, 0x2a, 0x12, 0x8f, 0x4b, 0x7f, 0x10, 0x56, 0xbd, 0x9f, 0x70, 0x72, 0xb7, 0x61, // 14496 - 0x7f, 0xc9, 0x4b, 0x0f, 0x17, 0xa7, 0x3d, 0xe3, 0xb0, 0x04, 0x61, 0xee, 0xff, 0x11, 0x97, 0xc7, // 14512 - 0xf4, 0x86, 0x3e, 0x0a, 0xfa, 0x3e, 0x5c, 0xf9, 0x93, 0xe6, 0x34, 0x7a, 0xd9, 0x14, 0x6b, 0xe7, // 14528 - 0x9c, 0xb3, 0x85, 0xa0, 0x82, 0x7a, 0x76, 0xaf, 0x71, 0x90, 0xd7, 0xec, 0xfd, 0x0d, 0xfa, 0x9c, // 14544 - 0x6c, 0xfa, 0xdf, 0xb0, 0x82, 0xf4, 0x14, 0x7e, 0xf9, 0xbe, 0xc4, 0xa6, 0x2f, 0x4f, 0x7f, 0x99, // 14560 - 0x7f, 0xb5, 0xfc, 0x67, 0x43, 0x72, 0xbd, 0x0c, 0x00, 0xd6, 0x89, 0xeb, 0x6b, 0x2c, 0xd3, 0xed, // 14576 - 0x8f, 0x98, 0x1c, 0x14, 0xab, 0x7e, 0xe5, 0xe3, 0x6e, 0xfc, 0xd8, 0xa8, 0xe4, 0x92, 0x24, 0xda, // 14592 - 0x43, 0x6b, 0x62, 0xb8, 0x55, 0xfd, 0xea, 0xc1, 0xbc, 0x6c, 0xb6, 0x8b, 0xf3, 0x0e, 0x8d, 0x9a, // 14608 - 0xe4, 0x9b, 0x6c, 0x69, 0x99, 0xf8, 0x78, 0x48, 0x30, 0x45, 0xd5, 0xad, 0xe1, 0x0d, 0x3c, 0x45, // 14624 - 0x60, 0xfc, 0x32, 0x96, 0x51, 0x27, 0xbc, 0x67, 0xc3, 0xca, 0x2e, 0xb6, 0x6b, 0xea, 0x46, 0xc7, // 14640 - 0xc7, 0x20, 0xa0, 0xb1, 0x1f, 0x65, 0xde, 0x48, 0x08, 0xba, 0xa4, 0x4e, 0xa9, 0xf2, 0x83, 0x46, // 14656 - 0x37, 0x84, 0xeb, 0xe8, 0xcc, 0x81, 0x48, 0x43, 0x67, 0x4e, 0x72, 0x2a, 0x9b, 0x5c, 0xbd, 0x4c, // 14672 - 0x1b, 0x28, 0x8a, 0x5c, 0x22, 0x7b, 0xb4, 0xab, 0x98, 0xd9, 0xee, 0xe0, 0x51, 0x83, 0xc3, 0x09, // 14688 - 0x46, 0x4e, 0x6d, 0x3e, 0x99, 0xfa, 0x95, 0x17, 0xda, 0x7c, 0x33, 0x57, 0x41, 0x3c, 0x8d, 0x51, // 14704 - 0xed, 0x0b, 0xb6, 0x5c, 0xaf, 0x2c, 0x63, 0x1a, 0xdf, 0x57, 0xc8, 0x3f, 0xbc, 0xe9, 0x5d, 0xc4, // 14720 - 0x9b, 0xaf, 0x45, 0x99, 0xe2, 0xa3, 0x5a, 0x24, 0xb4, 0xba, 0xa9, 0x56, 0x3d, 0xcf, 0x6f, 0xaa, // 14736 - 0xff, 0x49, 0x58, 0xbe, 0xf0, 0xa8, 0xff, 0xf4, 0xb8, 0xad, 0xe9, 0x37, 0xfb, 0xba, 0xb8, 0xf4, // 14752 - 0x0b, 0x3a, 0xf9, 0xe8, 0x43, 0x42, 0x1e, 0x89, 0xd8, 0x84, 0xcb, 0x13, 0xf1, 0xd9, 0xbb, 0xe1, // 14768 - 0x89, 0x60, 0xb8, 0x8c, 0x28, 0x56, 0xac, 0x14, 0x1d, 0x9c, 0x0a, 0xe7, 0x71, 0xeb, 0xcf, 0x0e, // 14784 - 0xdd, 0x3d, 0xa9, 0x96, 0xa1, 0x48, 0xbd, 0x3c, 0xf7, 0xaf, 0xb5, 0x0d, 0x22, 0x4c, 0xc0, 0x11, // 14800 - 0x81, 0xec, 0x56, 0x3b, 0xf6, 0xd3, 0xa2, 0xe2, 0x5b, 0xb7, 0xb2, 0x04, 0x22, 0x52, 0x95, 0x80, // 14816 - 0x93, 0x69, 0xe8, 0x8e, 0x4c, 0x65, 0xf1, 0x91, 0x03, 0x2d, 0x70, 0x74, 0x02, 0xea, 0x8b, 0x67, // 14832 - 0x15, 0x29, 0x69, 0x52, 0x02, 0xbb, 0xd7, 0xdf, 0x50, 0x6a, 0x55, 0x46, 0xbf, 0xa0, 0xa3, 0x28, // 14848 - 0x61, 0x7f, 0x70, 0xd0, 0xc3, 0xa2, 0xaa, 0x2c, 0x21, 0xaa, 0x47, 0xce, 0x28, 0x9c, 0x06, 0x45, // 14864 - 0x76, 0xbf, 0x82, 0x18, 0x27, 0xb4, 0xd5, 0xae, 0xb4, 0xcb, 0x50, 0xe6, 0x6b, 0xf4, 0x4c, 0x86, // 14880 - 0x71, 0x30, 0xe9, 0xa6, 0xdf, 0x16, 0x86, 0xe0, 0xd8, 0xff, 0x40, 0xdd, 0xfb, 0xd0, 0x42, 0x88, // 14896 - 0x7f, 0xa3, 0x33, 0x3a, 0x2e, 0x5c, 0x1e, 0x41, 0x11, 0x81, 0x63, 0xce, 0x18, 0x71, 0x6b, 0x2b, // 14912 - 0xec, 0xa6, 0x8a, 0xb7, 0x31, 0x5c, 0x3a, 0x6a, 0x47, 0xe0, 0xc3, 0x79, 0x59, 0xd6, 0x20, 0x1a, // 14928 - 0xaf, 0xf2, 0x6a, 0x98, 0xaa, 0x72, 0xbc, 0x57, 0x4a, 0xd2, 0x4b, 0x9d, 0xbb, 0x10, 0xfc, 0xb0, // 14944 - 0x4c, 0x41, 0xe5, 0xed, 0x1d, 0x3d, 0x5e, 0x28, 0x9d, 0x9c, 0xcc, 0xbf, 0xb3, 0x51, 0xda, 0xa7, // 14960 - 0x47, 0xe5, 0x84, 0x53, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x8b, 0x00, 0x78, 0x30, 0x81, 0x88, // 14976 - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, // 14992 - 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, 0x4e, 0x65, 0x77, 0x20, 0x4a, 0x65, 0x72, 0x73, // 15008 - 0x65, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0b, 0x4a, 0x65, 0x72, // 15024 - 0x73, 0x65, 0x79, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, // 15040 - 0x0a, 0x13, 0x15, 0x54, 0x68, 0x65, 0x20, 0x55, 0x53, 0x45, 0x52, 0x54, 0x52, 0x55, 0x53, 0x54, // 15056 - 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, // 15072 - 0x03, 0x13, 0x25, 0x55, 0x53, 0x45, 0x52, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x45, 0x43, 0x43, // 15088 - 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, // 15104 - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, // 15120 - 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, // 15136 - 0x1a, 0xac, 0x54, 0x5a, 0xa9, 0xf9, 0x68, 0x23, 0xe7, 0x7a, 0xd5, 0x24, 0x6f, 0x53, 0xc6, 0x5a, // 15152 - 0xd8, 0x4b, 0xab, 0xc6, 0xd5, 0xb6, 0xd1, 0xe6, 0x73, 0x71, 0xae, 0xdd, 0x9c, 0xd6, 0x0c, 0x61, // 15168 - 0xfd, 0xdb, 0xa0, 0x89, 0x03, 0xb8, 0x05, 0x14, 0xec, 0x57, 0xce, 0xee, 0x5d, 0x3f, 0xe2, 0x21, // 15184 - 0xb3, 0xce, 0xf7, 0xd4, 0x8a, 0x79, 0xe0, 0xa3, 0x83, 0x7e, 0x2d, 0x97, 0xd0, 0x61, 0xc4, 0xf1, // 15200 - 0x99, 0xdc, 0x25, 0x91, 0x63, 0xab, 0x7f, 0x30, 0xa3, 0xb4, 0x70, 0xe2, 0xc7, 0xa1, 0x33, 0x9c, // 15216 - 0xf3, 0xbf, 0x2e, 0x5c, 0x53, 0xb1, 0x5f, 0xb3, 0x7d, 0x32, 0x7f, 0x8a, 0x34, 0xe3, 0x79, 0x79, // 15232 - 0x00, 0x8b, 0x02, 0x26, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, // 15248 - 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, 0x4e, // 15264 - 0x65, 0x77, 0x20, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, // 15280 - 0x04, 0x07, 0x13, 0x0b, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, // 15296 - 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x54, 0x68, 0x65, 0x20, 0x55, 0x53, // 15312 - 0x45, 0x52, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, // 15328 - 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x55, 0x53, 0x45, 0x52, 0x54, 0x72, // 15344 - 0x75, 0x73, 0x74, 0x20, 0x52, 0x53, 0x41, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, // 15360 - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, // 15376 - 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, // 15392 - 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, // 15408 - 0x80, 0x12, 0x65, 0x17, 0x36, 0x0e, 0xc3, 0xdb, 0x08, 0xb3, 0xd0, 0xac, 0x57, 0x0d, 0x76, 0xed, // 15424 - 0xcd, 0x27, 0xd3, 0x4c, 0xad, 0x50, 0x83, 0x61, 0xe2, 0xaa, 0x20, 0x4d, 0x09, 0x2d, 0x64, 0x09, // 15440 - 0xdc, 0xce, 0x89, 0x9f, 0xcc, 0x3d, 0xa9, 0xec, 0xf6, 0xcf, 0xc1, 0xdc, 0xf1, 0xd3, 0xb1, 0xd6, // 15456 - 0x7b, 0x37, 0x28, 0x11, 0x2b, 0x47, 0xda, 0x39, 0xc6, 0xbc, 0x3a, 0x19, 0xb4, 0x5f, 0xa6, 0xbd, // 15472 - 0x7d, 0x9d, 0xa3, 0x63, 0x42, 0xb6, 0x76, 0xf2, 0xa9, 0x3b, 0x2b, 0x91, 0xf8, 0xe2, 0x6f, 0xd0, // 15488 - 0xec, 0x16, 0x20, 0x90, 0x09, 0x3e, 0xe2, 0xe8, 0x74, 0xc9, 0x18, 0xb4, 0x91, 0xd4, 0x62, 0x64, // 15504 - 0xdb, 0x7f, 0xa3, 0x06, 0xf1, 0x88, 0x18, 0x6a, 0x90, 0x22, 0x3c, 0xbc, 0xfe, 0x13, 0xf0, 0x87, // 15520 - 0x14, 0x7b, 0xf6, 0xe4, 0x1f, 0x8e, 0xd4, 0xe4, 0x51, 0xc6, 0x11, 0x67, 0x46, 0x08, 0x51, 0xcb, // 15536 - 0x86, 0x14, 0x54, 0x3f, 0xbc, 0x33, 0xfe, 0x7e, 0x6c, 0x9c, 0xff, 0x16, 0x9d, 0x18, 0xbd, 0x51, // 15552 - 0x8e, 0x35, 0xa6, 0xa7, 0x66, 0xc8, 0x72, 0x67, 0xdb, 0x21, 0x66, 0xb1, 0xd4, 0x9b, 0x78, 0x03, // 15568 - 0xc0, 0x50, 0x3a, 0xe8, 0xcc, 0xf0, 0xdc, 0xbc, 0x9e, 0x4c, 0xfe, 0xaf, 0x05, 0x96, 0x35, 0x1f, // 15584 - 0x57, 0x5a, 0xb7, 0xff, 0xce, 0xf9, 0x3d, 0xb7, 0x2c, 0xb6, 0xf6, 0x54, 0xdd, 0xc8, 0xe7, 0x12, // 15600 - 0x3a, 0x4d, 0xae, 0x4c, 0x8a, 0xb7, 0x5c, 0x9a, 0xb4, 0xb7, 0x20, 0x3d, 0xca, 0x7f, 0x22, 0x34, // 15616 - 0xae, 0x7e, 0x3b, 0x68, 0x66, 0x01, 0x44, 0xe7, 0x01, 0x4e, 0x46, 0x53, 0x9b, 0x33, 0x60, 0xf7, // 15632 - 0x94, 0xbe, 0x53, 0x37, 0x90, 0x73, 0x43, 0xf3, 0x32, 0xc3, 0x53, 0xef, 0xdb, 0xaa, 0xfe, 0x74, // 15648 - 0x4e, 0x69, 0xc7, 0x6b, 0x8c, 0x60, 0x93, 0xde, 0xc4, 0xc7, 0x0c, 0xdf, 0xe1, 0x32, 0xae, 0xcc, // 15664 - 0x93, 0x3b, 0x51, 0x78, 0x95, 0x67, 0x8b, 0xee, 0x3d, 0x56, 0xfe, 0x0c, 0xd0, 0x69, 0x0f, 0x1b, // 15680 - 0x0f, 0xf3, 0x25, 0x26, 0x6b, 0x33, 0x6d, 0xf7, 0x6e, 0x47, 0xfa, 0x73, 0x43, 0xe5, 0x7e, 0x0e, // 15696 - 0xa5, 0x66, 0xb1, 0x29, 0x7c, 0x32, 0x84, 0x63, 0x55, 0x89, 0xc4, 0x0d, 0xc1, 0x93, 0x54, 0x30, // 15712 - 0x19, 0x13, 0xac, 0xd3, 0x7d, 0x37, 0xa7, 0xeb, 0x5d, 0x3a, 0x6c, 0x35, 0x5c, 0xdb, 0x41, 0xd7, // 15728 - 0x12, 0xda, 0xa9, 0x49, 0x0b, 0xdf, 0xd8, 0x80, 0x8a, 0x09, 0x93, 0x62, 0x8e, 0xb5, 0x66, 0xcf, // 15744 - 0x25, 0x88, 0xcd, 0x84, 0xb8, 0xb1, 0x3f, 0xa4, 0x39, 0x0f, 0xd9, 0x02, 0x9e, 0xeb, 0x12, 0x4c, // 15760 - 0x95, 0x7c, 0xf3, 0x6b, 0x05, 0xa9, 0x5e, 0x16, 0x83, 0xcc, 0xb8, 0x67, 0xe2, 0xe8, 0x13, 0x9d, // 15776 - 0xcc, 0x5b, 0x82, 0xd3, 0x4c, 0xb3, 0xed, 0x5b, 0xff, 0xde, 0xe5, 0x73, 0xac, 0x23, 0x3b, 0x2d, // 15792 - 0x00, 0xbf, 0x35, 0x55, 0x74, 0x09, 0x49, 0xd8, 0x49, 0x58, 0x1a, 0x7f, 0x92, 0x36, 0xe6, 0x51, // 15808 - 0x92, 0x0e, 0xf3, 0x26, 0x7d, 0x1c, 0x4d, 0x17, 0xbc, 0xc9, 0xec, 0x43, 0x26, 0xd0, 0xbf, 0x41, // 15824 - 0x5f, 0x40, 0xa9, 0x44, 0x44, 0xf4, 0x99, 0xe7, 0x57, 0x87, 0x9e, 0x50, 0x1f, 0x57, 0x54, 0xa8, // 15840 - 0x3e, 0xfd, 0x74, 0x63, 0x2f, 0xb1, 0x50, 0x65, 0x09, 0xe6, 0x58, 0x42, 0x2e, 0x43, 0x1a, 0x4c, // 15856 - 0xb4, 0xf0, 0x25, 0x47, 0x59, 0xfa, 0x04, 0x1e, 0x93, 0xd4, 0x26, 0x46, 0x4a, 0x50, 0x81, 0xb2, // 15872 - 0xde, 0xbe, 0x78, 0xb7, 0xfc, 0x67, 0x15, 0xe1, 0xc9, 0x57, 0x84, 0x1e, 0x0f, 0x63, 0xd6, 0xe9, // 15888 - 0x62, 0xba, 0xd6, 0x5f, 0x55, 0x2e, 0xea, 0x5c, 0xc6, 0x28, 0x08, 0x04, 0x25, 0x39, 0xb8, 0x0e, // 15904 - 0x2b, 0xa9, 0xf2, 0x4c, 0x97, 0x1c, 0x07, 0x3f, 0x0d, 0x52, 0xf5, 0xed, 0xef, 0x2f, 0x82, 0x0f, // 15920 - 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x92, 0x01, 0x26, 0x30, 0x81, 0x8f, 0x31, 0x0b, 0x30, 0x09, // 15936 - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, // 15952 - 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, // 15968 - 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, // 15984 - 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, // 16000 - 0x69, 0x65, 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, // 16016 - 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, // 16032 - 0x13, 0x29, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x52, 0x6f, 0x6f, 0x74, // 16048 - 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, // 16064 - 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, // 16080 - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, // 16096 - 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbd, 0xed, 0xc1, 0x03, // 16112 - 0xfc, 0xf6, 0x8f, 0xfc, 0x02, 0xb1, 0x6f, 0x5b, 0x9f, 0x48, 0xd9, 0x9d, 0x79, 0xe2, 0xa2, 0xb7, // 16128 - 0x03, 0x61, 0x56, 0x18, 0xc3, 0x47, 0xb6, 0xd7, 0xca, 0x3d, 0x35, 0x2e, 0x89, 0x43, 0xf7, 0xa1, // 16144 - 0x69, 0x9b, 0xde, 0x8a, 0x1a, 0xfd, 0x13, 0x20, 0x9c, 0xb4, 0x49, 0x77, 0x32, 0x29, 0x56, 0xfd, // 16160 - 0xb9, 0xec, 0x8c, 0xdd, 0x22, 0xfa, 0x72, 0xdc, 0x27, 0x61, 0x97, 0xee, 0xf6, 0x5a, 0x84, 0xec, // 16176 - 0x6e, 0x19, 0xb9, 0x89, 0x2c, 0xdc, 0x84, 0x5b, 0xd5, 0x74, 0xfb, 0x6b, 0x5f, 0xc5, 0x89, 0xa5, // 16192 - 0x10, 0x52, 0x89, 0x46, 0x55, 0xf4, 0xb8, 0x75, 0x1c, 0xe6, 0x7f, 0xe4, 0x54, 0xae, 0x4b, 0xf8, // 16208 - 0x55, 0x72, 0x57, 0x02, 0x19, 0xf8, 0x17, 0x71, 0x59, 0xeb, 0x1e, 0x28, 0x07, 0x74, 0xc5, 0x9d, // 16224 - 0x48, 0xbe, 0x6c, 0xb4, 0xf4, 0xa4, 0xb0, 0xf3, 0x64, 0x37, 0x79, 0x92, 0xc0, 0xec, 0x46, 0x5e, // 16240 - 0x7f, 0xe1, 0x6d, 0x53, 0x4c, 0x62, 0xaf, 0xcd, 0x1f, 0x0b, 0x63, 0xbb, 0x3a, 0x9d, 0xfb, 0xfc, // 16256 - 0x79, 0x00, 0x98, 0x61, 0x74, 0xcf, 0x26, 0x82, 0x40, 0x63, 0xf3, 0xb2, 0x72, 0x6a, 0x19, 0x0d, // 16272 - 0x99, 0xca, 0xd4, 0x0e, 0x75, 0xcc, 0x37, 0xfb, 0x8b, 0x89, 0xc1, 0x59, 0xf1, 0x62, 0x7f, 0x5f, // 16288 - 0xb3, 0x5f, 0x65, 0x30, 0xf8, 0xa7, 0xb7, 0x4d, 0x76, 0x5a, 0x1e, 0x76, 0x5e, 0x34, 0xc0, 0xe8, // 16304 - 0x96, 0x56, 0x99, 0x8a, 0xb3, 0xf0, 0x7f, 0xa4, 0xcd, 0xbd, 0xdc, 0x32, 0x31, 0x7c, 0x91, 0xcf, // 16320 - 0xe0, 0x5f, 0x11, 0xf8, 0x6b, 0xaa, 0x49, 0x5c, 0xd1, 0x99, 0x94, 0xd1, 0xa2, 0xe3, 0x63, 0x5b, // 16336 - 0x09, 0x76, 0xb5, 0x56, 0x62, 0xe1, 0x4b, 0x74, 0x1d, 0x96, 0xd4, 0x26, 0xd4, 0x08, 0x04, 0x59, // 16352 - 0xd0, 0x98, 0x0e, 0x0e, 0xe6, 0xde, 0xfc, 0xc3, 0xec, 0x1f, 0x90, 0xf1, 0x02, 0x03, 0x01, 0x00, // 16368 - 0x01, 0x00, 0x9b, 0x01, 0x26, 0x30, 0x81, 0x98, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, // 16384 - 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, // 16400 - 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, // 16416 - 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, // 16432 - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, // 16448 - 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, // 16464 - 0x6e, 0x63, 0x2e, 0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x32, 0x53, 0x74, // 16480 - 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, // 16496 - 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, // 16512 - 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, // 16528 - 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, // 16544 - 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, // 16560 - 0x00, 0xd5, 0x0c, 0x3a, 0xc4, 0x2a, 0xf9, 0x4e, 0xe2, 0xf5, 0xbe, 0x19, 0x97, 0x5f, 0x8e, 0x88, // 16576 - 0x53, 0xb1, 0x1f, 0x3f, 0xcb, 0xcf, 0x9f, 0x20, 0x13, 0x6d, 0x29, 0x3a, 0xc8, 0x0f, 0x7d, 0x3c, // 16592 - 0xf7, 0x6b, 0x76, 0x38, 0x63, 0xd9, 0x36, 0x60, 0xa8, 0x9b, 0x5e, 0x5c, 0x00, 0x80, 0xb2, 0x2f, // 16608 - 0x59, 0x7f, 0xf6, 0x87, 0xf9, 0x25, 0x43, 0x86, 0xe7, 0x69, 0x1b, 0x52, 0x9a, 0x90, 0xe1, 0x71, // 16624 - 0xe3, 0xd8, 0x2d, 0x0d, 0x4e, 0x6f, 0xf6, 0xc8, 0x49, 0xd9, 0xb6, 0xf3, 0x1a, 0x56, 0xae, 0x2b, // 16640 - 0xb6, 0x74, 0x14, 0xeb, 0xcf, 0xfb, 0x26, 0xe3, 0x1a, 0xba, 0x1d, 0x96, 0x2e, 0x6a, 0x3b, 0x58, // 16656 - 0x94, 0x89, 0x47, 0x56, 0xff, 0x25, 0xa0, 0x93, 0x70, 0x53, 0x83, 0xda, 0x84, 0x74, 0x14, 0xc3, // 16672 - 0x67, 0x9e, 0x04, 0x68, 0x3a, 0xdf, 0x8e, 0x40, 0x5a, 0x1d, 0x4a, 0x4e, 0xcf, 0x43, 0x91, 0x3b, // 16688 - 0xe7, 0x56, 0xd6, 0x00, 0x70, 0xcb, 0x52, 0xee, 0x7b, 0x7d, 0xae, 0x3a, 0xe7, 0xbc, 0x31, 0xf9, // 16704 - 0x45, 0xf6, 0xc2, 0x60, 0xcf, 0x13, 0x59, 0x02, 0x2b, 0x80, 0xcc, 0x34, 0x47, 0xdf, 0xb9, 0xde, // 16720 - 0x90, 0x65, 0x6d, 0x02, 0xcf, 0x2c, 0x91, 0xa6, 0xa6, 0xe7, 0xde, 0x85, 0x18, 0x49, 0x7c, 0x66, // 16736 - 0x4e, 0xa3, 0x3a, 0x6d, 0xa9, 0xb5, 0xee, 0x34, 0x2e, 0xba, 0x0d, 0x03, 0xb8, 0x33, 0xdf, 0x47, // 16752 - 0xeb, 0xb1, 0x6b, 0x8d, 0x25, 0xd9, 0x9b, 0xce, 0x81, 0xd1, 0x45, 0x46, 0x32, 0x96, 0x70, 0x87, // 16768 - 0xde, 0x02, 0x0e, 0x49, 0x43, 0x85, 0xb6, 0x6c, 0x73, 0xbb, 0x64, 0xea, 0x61, 0x41, 0xac, 0xc9, // 16784 - 0xd4, 0x54, 0xdf, 0x87, 0x2f, 0xc7, 0x22, 0xb2, 0x26, 0xcc, 0x9f, 0x59, 0x54, 0x68, 0x9f, 0xfc, // 16800 - 0xbe, 0x2a, 0x2f, 0xc4, 0x55, 0x1c, 0x75, 0x40, 0x60, 0x17, 0x85, 0x02, 0x55, 0x39, 0x8b, 0x7f, // 16816 - 0x05, 0x02, 0x03, 0x01, 0x00, 0x01, // 16822 +const uint8_t x509CertificateBundle[] = { + 0x00, 0x29, 0x00, 0x3b, 0x01, 0x26, 0x30, 0x39, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, // 16 + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x06, // 32 + 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, // 48 + 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, // 64 + 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, // 80 + 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, // 96 + 0x01, 0x00, 0xb2, 0x78, 0x80, 0x71, 0xca, 0x78, 0xd5, 0xe3, 0x71, 0xaf, 0x47, 0x80, 0x50, 0x74, // 112 + 0x7d, 0x6e, 0xd8, 0xd7, 0x88, 0x76, 0xf4, 0x99, 0x68, 0xf7, 0x58, 0x21, 0x60, 0xf9, 0x74, 0x84, // 128 + 0x01, 0x2f, 0xac, 0x02, 0x2d, 0x86, 0xd3, 0xa0, 0x43, 0x7a, 0x4e, 0xb2, 0xa4, 0xd0, 0x36, 0xba, // 144 + 0x01, 0xbe, 0x8d, 0xdb, 0x48, 0xc8, 0x07, 0x17, 0x36, 0x4c, 0xf4, 0xee, 0x88, 0x23, 0xc7, 0x3e, // 160 + 0xeb, 0x37, 0xf5, 0xb5, 0x19, 0xf8, 0x49, 0x68, 0xb0, 0xde, 0xd7, 0xb9, 0x76, 0x38, 0x1d, 0x61, // 176 + 0x9e, 0xa4, 0xfe, 0x82, 0x36, 0xa5, 0xe5, 0x4a, 0x56, 0xe4, 0x45, 0xe1, 0xf9, 0xfd, 0xb4, 0x16, // 192 + 0xfa, 0x74, 0xda, 0x9c, 0x9b, 0x35, 0x39, 0x2f, 0xfa, 0xb0, 0x20, 0x50, 0x06, 0x6c, 0x7a, 0xd0, // 208 + 0x80, 0xb2, 0xa6, 0xf9, 0xaf, 0xec, 0x47, 0x19, 0x8f, 0x50, 0x38, 0x07, 0xdc, 0xa2, 0x87, 0x39, // 224 + 0x58, 0xf8, 0xba, 0xd5, 0xa9, 0xf9, 0x48, 0x67, 0x30, 0x96, 0xee, 0x94, 0x78, 0x5e, 0x6f, 0x89, // 240 + 0xa3, 0x51, 0xc0, 0x30, 0x86, 0x66, 0xa1, 0x45, 0x66, 0xba, 0x54, 0xeb, 0xa3, 0xc3, 0x91, 0xf9, // 256 + 0x48, 0xdc, 0xff, 0xd1, 0xe8, 0x30, 0x2d, 0x7d, 0x2d, 0x74, 0x70, 0x35, 0xd7, 0x88, 0x24, 0xf7, // 272 + 0x9e, 0xc4, 0x59, 0x6e, 0xbb, 0x73, 0x87, 0x17, 0xf2, 0x32, 0x46, 0x28, 0xb8, 0x43, 0xfa, 0xb7, // 288 + 0x1d, 0xaa, 0xca, 0xb4, 0xf2, 0x9f, 0x24, 0x0e, 0x2d, 0x4b, 0xf7, 0x71, 0x5c, 0x5e, 0x69, 0xff, // 304 + 0xea, 0x95, 0x02, 0xcb, 0x38, 0x8a, 0xae, 0x50, 0x38, 0x6f, 0xdb, 0xfb, 0x2d, 0x62, 0x1b, 0xc5, // 320 + 0xc7, 0x1e, 0x54, 0xe1, 0x77, 0xe0, 0x67, 0xc8, 0x0f, 0x9c, 0x87, 0x23, 0xd6, 0x3f, 0x40, 0x20, // 336 + 0x7f, 0x20, 0x80, 0xc4, 0x80, 0x4c, 0x3e, 0x3b, 0x24, 0x26, 0x8e, 0x04, 0xae, 0x6c, 0x9a, 0xc8, // 352 + 0xaa, 0x0d, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x3b, 0x02, 0x26, 0x30, 0x39, 0x31, 0x0b, 0x30, // 368 + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, // 384 + 0x55, 0x04, 0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, 0x06, // 400 + 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, // 416 + 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, // 432 + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, // 448 + 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xad, 0x96, 0x9f, 0x2d, 0x9c, 0x4a, 0x4c, 0x4a, 0x81, // 464 + 0x79, 0x51, 0x99, 0xec, 0x8a, 0xcb, 0x6b, 0x60, 0x51, 0x13, 0xbc, 0x4d, 0x6d, 0x06, 0xfc, 0xb0, // 480 + 0x08, 0x8d, 0xdd, 0x19, 0x10, 0x6a, 0xc7, 0x26, 0x0c, 0x35, 0xd8, 0xc0, 0x6f, 0x20, 0x84, 0xe9, // 496 + 0x94, 0xb1, 0x9b, 0x85, 0x03, 0xc3, 0x5b, 0xdb, 0x4a, 0xe8, 0xc8, 0xf8, 0x90, 0x76, 0xd9, 0x5b, // 512 + 0x4f, 0xe3, 0x4c, 0xe8, 0x06, 0x36, 0x4d, 0xcc, 0x9a, 0xac, 0x3d, 0x0c, 0x90, 0x2b, 0x92, 0xd4, // 528 + 0x06, 0x19, 0x60, 0xac, 0x37, 0x44, 0x79, 0x85, 0x81, 0x82, 0xad, 0x5a, 0x37, 0xe0, 0x0d, 0xcc, // 544 + 0x9d, 0xa6, 0x4c, 0x52, 0x76, 0xea, 0x43, 0x9d, 0xb7, 0x04, 0xd1, 0x50, 0xf6, 0x55, 0xe0, 0xd5, // 560 + 0xd2, 0xa6, 0x49, 0x85, 0xe9, 0x37, 0xe9, 0xca, 0x7e, 0xae, 0x5c, 0x95, 0x4d, 0x48, 0x9a, 0x3f, // 576 + 0xae, 0x20, 0x5a, 0x6d, 0x88, 0x95, 0xd9, 0x34, 0xb8, 0x52, 0x1a, 0x43, 0x90, 0xb0, 0xbf, 0x6c, // 592 + 0x05, 0xb9, 0xb6, 0x78, 0xb7, 0xea, 0xd0, 0xe4, 0x3a, 0x3c, 0x12, 0x53, 0x62, 0xff, 0x4a, 0xf2, // 608 + 0x7b, 0xbe, 0x35, 0x05, 0xa9, 0x12, 0x34, 0xe3, 0xf3, 0x64, 0x74, 0x62, 0x2c, 0x3d, 0x00, 0x49, // 624 + 0x5a, 0x28, 0xfe, 0x32, 0x44, 0xbb, 0x87, 0xdd, 0x65, 0x27, 0x02, 0x71, 0x3b, 0xda, 0x4a, 0xf7, // 640 + 0x1f, 0xda, 0xcd, 0xf7, 0x21, 0x55, 0x90, 0x4f, 0x0f, 0xec, 0xae, 0x82, 0xe1, 0x9f, 0x6b, 0xd9, // 656 + 0x45, 0xd3, 0xbb, 0xf0, 0x5f, 0x87, 0xed, 0x3c, 0x2c, 0x39, 0x86, 0xda, 0x3f, 0xde, 0xec, 0x72, // 672 + 0x55, 0xeb, 0x79, 0xa3, 0xad, 0xdb, 0xdd, 0x7c, 0xb0, 0xba, 0x1c, 0xce, 0xfc, 0xde, 0x4f, 0x35, // 688 + 0x76, 0xcf, 0x0f, 0xf8, 0x78, 0x1f, 0x6a, 0x36, 0x51, 0x46, 0x27, 0x61, 0x5b, 0xe9, 0x9e, 0xcf, // 704 + 0xf0, 0xa2, 0x55, 0x7d, 0x7c, 0x25, 0x8a, 0x6f, 0x2f, 0xb4, 0xc5, 0xcf, 0x84, 0x2e, 0x2b, 0xfd, // 720 + 0x0d, 0x51, 0x10, 0x6c, 0xfb, 0x5f, 0x1b, 0xbc, 0x1b, 0x7e, 0xc5, 0xae, 0x3b, 0x98, 0x01, 0x31, // 736 + 0x92, 0xff, 0x0b, 0x57, 0xf4, 0x9a, 0xb2, 0xb9, 0x57, 0xe9, 0xab, 0xef, 0x0d, 0x76, 0xd1, 0xf0, // 752 + 0xee, 0xf4, 0xce, 0x86, 0xa7, 0xe0, 0x6e, 0xe9, 0xb4, 0x69, 0xa1, 0xdf, 0x69, 0xf6, 0x33, 0xc6, // 768 + 0x69, 0x2e, 0x97, 0x13, 0x9e, 0xa5, 0x87, 0xb0, 0x57, 0x10, 0x81, 0x37, 0xc9, 0x53, 0xb3, 0xbb, // 784 + 0x7f, 0xf6, 0x92, 0xd1, 0x9c, 0xd0, 0x18, 0xf4, 0x92, 0x6e, 0xda, 0x83, 0x4f, 0xa6, 0x63, 0x99, // 800 + 0x4c, 0xa5, 0xfb, 0x5e, 0xef, 0x21, 0x64, 0x7a, 0x20, 0x5f, 0x6c, 0x64, 0x85, 0x15, 0xcb, 0x37, // 816 + 0xe9, 0x62, 0x0c, 0x0b, 0x2a, 0x16, 0xdc, 0x01, 0x2e, 0x32, 0xda, 0x3e, 0x4b, 0xf5, 0x9e, 0x3a, // 832 + 0xf6, 0x17, 0x40, 0x94, 0xef, 0x9e, 0x91, 0x08, 0x86, 0xfa, 0xbe, 0x63, 0xa8, 0x5a, 0x33, 0xec, // 848 + 0xcb, 0x74, 0x43, 0x95, 0xf9, 0x6c, 0x69, 0x52, 0x36, 0xc7, 0x29, 0x6f, 0xfc, 0x55, 0x03, 0x5c, // 864 + 0x1f, 0xfb, 0x9f, 0xbd, 0x47, 0xeb, 0xe7, 0x49, 0x47, 0x95, 0x0b, 0x4e, 0x89, 0x22, 0x09, 0x49, // 880 + 0xe0, 0xf5, 0x61, 0x1e, 0xf1, 0xbf, 0x2e, 0x8a, 0x72, 0x6e, 0x80, 0x59, 0xff, 0x57, 0x3a, 0xf9, // 896 + 0x75, 0x32, 0xa3, 0x4e, 0x5f, 0xec, 0xed, 0x28, 0x62, 0xd9, 0x4d, 0x73, 0xf2, 0xcc, 0x81, 0x17, // 912 + 0x60, 0xed, 0xcd, 0xeb, 0xdc, 0xdb, 0xa7, 0xca, 0xc5, 0x7e, 0x02, 0xbd, 0xf2, 0x54, 0x08, 0x54, // 928 + 0xfd, 0xb4, 0x2d, 0x09, 0x2c, 0x17, 0x54, 0x4a, 0x98, 0xd1, 0x54, 0xe1, 0x51, 0x67, 0x08, 0xd2, // 944 + 0xed, 0x6e, 0x7e, 0x6f, 0x3f, 0xd2, 0x2d, 0x81, 0x59, 0x29, 0x66, 0xcb, 0x90, 0x39, 0x95, 0x11, // 960 + 0x1e, 0x74, 0x27, 0xfe, 0xdd, 0xeb, 0xaf, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x3b, 0x00, 0x5b, // 976 + 0x30, 0x39, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, // 992 + 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, // 1008 + 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f, // 1024 + 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x33, 0x30, 0x59, 0x30, 0x13, 0x06, // 1040 + 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, // 1056 + 0x01, 0x07, 0x03, 0x42, 0x00, 0x04, 0x29, 0x97, 0xa7, 0xc6, 0x41, 0x7f, 0xc0, 0x0d, 0x9b, 0xe8, // 1072 + 0x01, 0x1b, 0x56, 0xc6, 0xf2, 0x52, 0xa5, 0xba, 0x2d, 0xb2, 0x12, 0xe8, 0xd2, 0x2e, 0xd7, 0xfa, // 1088 + 0xc9, 0xc5, 0xd8, 0xaa, 0x6d, 0x1f, 0x73, 0x81, 0x3b, 0x3b, 0x98, 0x6b, 0x39, 0x7c, 0x33, 0xa5, // 1104 + 0xc5, 0x4e, 0x86, 0x8e, 0x80, 0x17, 0x68, 0x62, 0x45, 0x57, 0x7d, 0x44, 0x58, 0x1d, 0xb3, 0x37, // 1120 + 0xe5, 0x67, 0x08, 0xeb, 0x66, 0xde, 0x00, 0x3b, 0x00, 0x78, 0x30, 0x39, 0x31, 0x0b, 0x30, 0x09, // 1136 + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, // 1152 + 0x04, 0x0a, 0x13, 0x06, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, // 1168 + 0x55, 0x04, 0x03, 0x13, 0x10, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, // 1184 + 0x20, 0x43, 0x41, 0x20, 0x34, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, // 1200 + 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xd2, 0xab, 0x8a, // 1216 + 0x37, 0x4f, 0xa3, 0x53, 0x0d, 0xfe, 0xc1, 0x8a, 0x7b, 0x4b, 0xa8, 0x7b, 0x46, 0x4b, 0x63, 0xb0, // 1232 + 0x62, 0xf6, 0x2d, 0x1b, 0xdb, 0x08, 0x71, 0x21, 0xd2, 0x00, 0xe8, 0x63, 0xbd, 0x9a, 0x27, 0xfb, // 1248 + 0xf0, 0x39, 0x6e, 0x5d, 0xea, 0x3d, 0xa5, 0xc9, 0x81, 0xaa, 0xa3, 0x5b, 0x20, 0x98, 0x45, 0x5d, // 1264 + 0x16, 0xdb, 0xfd, 0xe8, 0x10, 0x6d, 0xe3, 0x9c, 0xe0, 0xe3, 0xbd, 0x5f, 0x84, 0x62, 0xf3, 0x70, // 1280 + 0x64, 0x33, 0xa0, 0xcb, 0x24, 0x2f, 0x70, 0xba, 0x88, 0xa1, 0x2a, 0xa0, 0x75, 0xf8, 0x81, 0xae, // 1296 + 0x62, 0x06, 0xc4, 0x81, 0xdb, 0x39, 0x6e, 0x29, 0xb0, 0x1e, 0xfa, 0x2e, 0x5c, 0x00, 0x41, 0x01, // 1312 + 0x26, 0x30, 0x3f, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1b, 0x44, 0x69, // 1328 + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, // 1344 + 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x2e, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, // 1360 + 0x04, 0x03, 0x13, 0x0e, 0x44, 0x53, 0x54, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, // 1376 + 0x58, 0x33, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, // 1392 + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, // 1408 + 0x01, 0x01, 0x00, 0xdf, 0xaf, 0xe9, 0x97, 0x50, 0x08, 0x83, 0x57, 0xb4, 0xcc, 0x62, 0x65, 0xf6, // 1424 + 0x90, 0x82, 0xec, 0xc7, 0xd3, 0x2c, 0x6b, 0x30, 0xca, 0x5b, 0xec, 0xd9, 0xc3, 0x7d, 0xc7, 0x40, // 1440 + 0xc1, 0x18, 0x14, 0x8b, 0xe0, 0xe8, 0x33, 0x76, 0x49, 0x2a, 0xe3, 0x3f, 0x21, 0x49, 0x93, 0xac, // 1456 + 0x4e, 0x0e, 0xaf, 0x3e, 0x48, 0xcb, 0x65, 0xee, 0xfc, 0xd3, 0x21, 0x0f, 0x65, 0xd2, 0x2a, 0xd9, // 1472 + 0x32, 0x8f, 0x8c, 0xe5, 0xf7, 0x77, 0xb0, 0x12, 0x7b, 0xb5, 0x95, 0xc0, 0x89, 0xa3, 0xa9, 0xba, // 1488 + 0xed, 0x73, 0x2e, 0x7a, 0x0c, 0x06, 0x32, 0x83, 0xa2, 0x7e, 0x8a, 0x14, 0x30, 0xcd, 0x11, 0xa0, // 1504 + 0xe1, 0x2a, 0x38, 0xb9, 0x79, 0x0a, 0x31, 0xfd, 0x50, 0xbd, 0x80, 0x65, 0xdf, 0xb7, 0x51, 0x63, // 1520 + 0x83, 0xc8, 0xe2, 0x88, 0x61, 0xea, 0x4b, 0x61, 0x81, 0xec, 0x52, 0x6b, 0xb9, 0xa2, 0xe2, 0x4b, // 1536 + 0x1a, 0x28, 0x9f, 0x48, 0xa3, 0x9e, 0x0c, 0xda, 0x09, 0x8e, 0x3e, 0x17, 0x2e, 0x1e, 0xdd, 0x20, // 1552 + 0xdf, 0x5b, 0xc6, 0x2a, 0x8a, 0xab, 0x2e, 0xbd, 0x70, 0xad, 0xc5, 0x0b, 0x1a, 0x25, 0x90, 0x74, // 1568 + 0x72, 0xc5, 0x7b, 0x6a, 0xab, 0x34, 0xd6, 0x30, 0x89, 0xff, 0xe5, 0x68, 0x13, 0x7b, 0x54, 0x0b, // 1584 + 0xc8, 0xd6, 0xae, 0xec, 0x5a, 0x9c, 0x92, 0x1e, 0x3d, 0x64, 0xb3, 0x8c, 0xc6, 0xdf, 0xbf, 0xc9, // 1600 + 0x41, 0x70, 0xec, 0x16, 0x72, 0xd5, 0x26, 0xec, 0x38, 0x55, 0x39, 0x43, 0xd0, 0xfc, 0xfd, 0x18, // 1616 + 0x5c, 0x40, 0xf1, 0x97, 0xeb, 0xd5, 0x9a, 0x9b, 0x8d, 0x1d, 0xba, 0xda, 0x25, 0xb9, 0xc6, 0xd8, // 1632 + 0xdf, 0xc1, 0x15, 0x02, 0x3a, 0xab, 0xda, 0x6e, 0xf1, 0x3e, 0x2e, 0xf5, 0x5c, 0x08, 0x9c, 0x3c, // 1648 + 0xd6, 0x83, 0x69, 0xe4, 0x10, 0x9b, 0x19, 0x2a, 0xb6, 0x29, 0x57, 0xe3, 0xe5, 0x3d, 0x9b, 0x9f, // 1664 + 0xf0, 0x02, 0x5d, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x48, 0x00, 0x78, 0x30, 0x46, 0x31, 0x0b, // 1680 + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x45, 0x31, 0x19, 0x30, 0x17, 0x06, // 1696 + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, // 1712 + 0x20, 0x6e, 0x76, 0x2d, 0x73, 0x61, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, // 1728 + 0x13, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, // 1744 + 0x20, 0x45, 0x34, 0x36, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, // 1760 + 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x9c, 0x0e, 0xb1, 0xcf, // 1776 + 0xb7, 0xe8, 0x9e, 0x52, 0x77, 0x75, 0x34, 0xfa, 0xa5, 0x46, 0xa7, 0xad, 0x32, 0x19, 0x32, 0xb4, // 1792 + 0x07, 0xa9, 0x27, 0xca, 0x94, 0xbb, 0x0c, 0xd2, 0x0a, 0x10, 0xc7, 0xda, 0x89, 0xb0, 0x97, 0x0c, // 1808 + 0x70, 0x13, 0x09, 0x01, 0x8e, 0xd8, 0xea, 0x47, 0xea, 0xbe, 0xb2, 0x80, 0x2b, 0xcd, 0xfc, 0x28, // 1824 + 0x0d, 0xdb, 0xac, 0xbc, 0xa4, 0x86, 0x37, 0xed, 0x70, 0x08, 0x00, 0x75, 0xea, 0x93, 0x0b, 0x7b, // 1840 + 0x2e, 0x52, 0x9c, 0x23, 0x68, 0x23, 0x06, 0x43, 0xec, 0x92, 0x2f, 0x53, 0x84, 0xdb, 0xfb, 0x47, // 1856 + 0x14, 0x07, 0xe8, 0x5f, 0x94, 0x67, 0x5d, 0xc9, 0x7a, 0x81, 0x3c, 0x20, 0x00, 0x48, 0x02, 0x26, // 1872 + 0x30, 0x46, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x45, 0x31, // 1888 + 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, // 1904 + 0x53, 0x69, 0x67, 0x6e, 0x20, 0x6e, 0x76, 0x2d, 0x73, 0x61, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, // 1920 + 0x55, 0x04, 0x03, 0x13, 0x13, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, // 1936 + 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x52, 0x34, 0x36, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, // 1952 + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, // 1968 + 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xac, 0xac, 0x74, 0x32, 0xe8, 0xb3, 0x65, // 1984 + 0xe5, 0xba, 0xed, 0x43, 0x26, 0x1d, 0xa6, 0x89, 0x0d, 0x45, 0xba, 0x29, 0x88, 0xb2, 0xa4, 0x1d, // 2000 + 0x63, 0xdd, 0xd3, 0xc1, 0x2c, 0x09, 0x57, 0x89, 0x39, 0xa1, 0x55, 0xe9, 0x67, 0x34, 0x77, 0x0c, // 2016 + 0x6e, 0xe4, 0x55, 0x1d, 0x52, 0x25, 0xd2, 0x13, 0x6b, 0x5e, 0xe1, 0x1d, 0xa9, 0xb7, 0x7d, 0x89, // 2032 + 0x32, 0x5f, 0x0d, 0x9e, 0x9f, 0x2c, 0x7a, 0x63, 0x60, 0x40, 0x1f, 0xa6, 0xb0, 0xb6, 0x78, 0x8f, // 2048 + 0x99, 0x54, 0x96, 0x08, 0x58, 0xae, 0xe4, 0x06, 0xbc, 0x62, 0x05, 0x02, 0x16, 0xbf, 0xaf, 0xa8, // 2064 + 0x23, 0x03, 0xb6, 0x94, 0x0f, 0xbc, 0x6e, 0x6c, 0xc2, 0xcb, 0xd5, 0xa6, 0xbb, 0x0c, 0xe9, 0xf6, // 2080 + 0xc1, 0x02, 0xfb, 0x21, 0xde, 0x66, 0xdd, 0x17, 0xab, 0x74, 0x42, 0xef, 0xf0, 0x74, 0x2f, 0x25, // 2096 + 0xf4, 0xea, 0x6b, 0x55, 0x5b, 0x90, 0xdb, 0x9d, 0xdf, 0x5e, 0x87, 0x0a, 0x40, 0xfb, 0xad, 0x19, // 2112 + 0x6b, 0xfb, 0xf7, 0xca, 0x60, 0x88, 0xde, 0xda, 0xc1, 0x8f, 0xd6, 0xae, 0xd5, 0x7f, 0xd4, 0x3c, // 2128 + 0x83, 0xee, 0xd7, 0x16, 0x4c, 0x83, 0x45, 0x33, 0x6b, 0x27, 0xd0, 0x86, 0xd0, 0x1c, 0x2d, 0x6b, // 2144 + 0xf3, 0xab, 0x7d, 0xf1, 0x85, 0xa9, 0xf5, 0x28, 0xd2, 0xad, 0xef, 0xf3, 0x84, 0x4b, 0x1c, 0x87, // 2160 + 0xfc, 0x13, 0xa3, 0x3a, 0x72, 0xa2, 0x5a, 0x11, 0x2b, 0xd6, 0x27, 0x71, 0x27, 0xed, 0x81, 0x2d, // 2176 + 0x6d, 0x66, 0x81, 0x92, 0x87, 0xb4, 0x1b, 0x58, 0x7a, 0xcc, 0x3f, 0x0a, 0xfa, 0x46, 0x4f, 0x4d, // 2192 + 0x78, 0x5c, 0xf8, 0x2b, 0x48, 0xe3, 0x04, 0x84, 0xcb, 0x5d, 0xf6, 0xb4, 0x6a, 0xb3, 0x65, 0xfc, // 2208 + 0x42, 0x9e, 0x51, 0x26, 0x23, 0x20, 0xcb, 0x3d, 0x14, 0xf9, 0x81, 0xed, 0x65, 0x16, 0x00, 0x4f, // 2224 + 0x1a, 0x64, 0x97, 0x66, 0x08, 0xcf, 0x8c, 0x7b, 0xe3, 0x2b, 0xc0, 0x9d, 0xf9, 0x14, 0xf2, 0x1b, // 2240 + 0xf1, 0x56, 0x6a, 0x16, 0xbf, 0x2c, 0x85, 0x85, 0xcd, 0x78, 0x38, 0x9a, 0xeb, 0x42, 0x6a, 0x02, // 2256 + 0x34, 0x18, 0x83, 0x17, 0x4e, 0x94, 0x56, 0xf8, 0xb6, 0x82, 0xb5, 0xf3, 0x96, 0xdd, 0x3d, 0xf3, // 2272 + 0xbe, 0x7f, 0x20, 0x77, 0x3e, 0x7b, 0x19, 0x23, 0x6b, 0x2c, 0xd4, 0x72, 0x73, 0x43, 0x57, 0x7d, // 2288 + 0xe0, 0xf8, 0xd7, 0x69, 0x4f, 0x17, 0x36, 0x04, 0xf9, 0xc0, 0x90, 0x60, 0x37, 0x45, 0xde, 0xe6, // 2304 + 0x0c, 0xd8, 0x74, 0x8d, 0xae, 0x9c, 0xa2, 0x6d, 0x74, 0x5d, 0x42, 0xbe, 0x06, 0xf5, 0xd9, 0x64, // 2320 + 0x6e, 0x02, 0x10, 0xac, 0x89, 0xb0, 0x4c, 0x3b, 0x07, 0x4d, 0x40, 0x7e, 0x24, 0xc5, 0x8a, 0x98, // 2336 + 0x82, 0x79, 0x8e, 0xa4, 0xa7, 0x82, 0x20, 0x8d, 0x23, 0xfa, 0x27, 0x71, 0xc9, 0xdf, 0xc6, 0x41, // 2352 + 0x74, 0xa0, 0x4d, 0xf6, 0x91, 0x16, 0xdc, 0x46, 0x8c, 0x5f, 0x29, 0x63, 0x31, 0x59, 0x71, 0x0c, // 2368 + 0xd8, 0x6f, 0xc2, 0xb6, 0x32, 0x7d, 0xfb, 0xe6, 0x5d, 0x53, 0xa6, 0x7e, 0x15, 0xfc, 0xbb, 0x75, // 2384 + 0x7c, 0x5d, 0xec, 0xf8, 0xf6, 0x17, 0x1c, 0xec, 0xc7, 0x6b, 0x19, 0xcb, 0xf3, 0x7b, 0xf0, 0x2b, // 2400 + 0x07, 0xa5, 0xd9, 0x6c, 0x79, 0x54, 0x76, 0x6c, 0x9d, 0x1c, 0xa6, 0x6e, 0x0e, 0xe9, 0x79, 0x0c, // 2416 + 0xa8, 0x23, 0x6a, 0xa3, 0xdf, 0x1b, 0x30, 0x31, 0x9f, 0xb1, 0x54, 0x7b, 0xfe, 0x6a, 0xcb, 0x66, // 2432 + 0xaa, 0xdc, 0x65, 0xd0, 0xa2, 0x9e, 0x4a, 0x9a, 0x07, 0x21, 0x6b, 0x81, 0x8f, 0xdb, 0xc4, 0x59, // 2448 + 0xfa, 0xde, 0x22, 0xc0, 0x04, 0x9c, 0xe3, 0xaa, 0x5b, 0x36, 0x93, 0xe8, 0x3d, 0xbd, 0x7a, 0xa1, // 2464 + 0x9d, 0x0b, 0x76, 0xb1, 0x0b, 0xc7, 0x9d, 0xfd, 0xcf, 0x98, 0xa8, 0x06, 0xc2, 0xf8, 0x2a, 0xa3, // 2480 + 0xa1, 0x83, 0xa0, 0xb7, 0x25, 0x72, 0xa5, 0x02, 0xe3, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x49, // 2496 + 0x02, 0x26, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, // 2512 + 0x53, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x47, 0x6f, 0x6f, 0x67, // 2528 + 0x6c, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, // 2544 + 0x73, 0x20, 0x4c, 0x4c, 0x43, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0b, // 2560 + 0x47, 0x54, 0x53, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x52, 0x31, 0x30, 0x82, 0x02, 0x22, 0x30, // 2576 + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, // 2592 + 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xb6, 0x11, 0x02, 0x8b, // 2608 + 0x1e, 0xe3, 0xa1, 0x77, 0x9b, 0x3b, 0xdc, 0xbf, 0x94, 0x3e, 0xb7, 0x95, 0xa7, 0x40, 0x3c, 0xa1, // 2624 + 0xfd, 0x82, 0xf9, 0x7d, 0x32, 0x06, 0x82, 0x71, 0xf6, 0xf6, 0x8c, 0x7f, 0xfb, 0xe8, 0xdb, 0xbc, // 2640 + 0x6a, 0x2e, 0x97, 0x97, 0xa3, 0x8c, 0x4b, 0xf9, 0x2b, 0xf6, 0xb1, 0xf9, 0xce, 0x84, 0x1d, 0xb1, // 2656 + 0xf9, 0xc5, 0x97, 0xde, 0xef, 0xb9, 0xf2, 0xa3, 0xe9, 0xbc, 0x12, 0x89, 0x5e, 0xa7, 0xaa, 0x52, // 2672 + 0xab, 0xf8, 0x23, 0x27, 0xcb, 0xa4, 0xb1, 0x9c, 0x63, 0xdb, 0xd7, 0x99, 0x7e, 0xf0, 0x0a, 0x5e, // 2688 + 0xeb, 0x68, 0xa6, 0xf4, 0xc6, 0x5a, 0x47, 0x0d, 0x4d, 0x10, 0x33, 0xe3, 0x4e, 0xb1, 0x13, 0xa3, // 2704 + 0xc8, 0x18, 0x6c, 0x4b, 0xec, 0xfc, 0x09, 0x90, 0xdf, 0x9d, 0x64, 0x29, 0x25, 0x23, 0x07, 0xa1, // 2720 + 0xb4, 0xd2, 0x3d, 0x2e, 0x60, 0xe0, 0xcf, 0xd2, 0x09, 0x87, 0xbb, 0xcd, 0x48, 0xf0, 0x4d, 0xc2, // 2736 + 0xc2, 0x7a, 0x88, 0x8a, 0xbb, 0xba, 0xcf, 0x59, 0x19, 0xd6, 0xaf, 0x8f, 0xb0, 0x07, 0xb0, 0x9e, // 2752 + 0x31, 0xf1, 0x82, 0xc1, 0xc0, 0xdf, 0x2e, 0xa6, 0x6d, 0x6c, 0x19, 0x0e, 0xb5, 0xd8, 0x7e, 0x26, // 2768 + 0x1a, 0x45, 0x03, 0x3d, 0xb0, 0x79, 0xa4, 0x94, 0x28, 0xad, 0x0f, 0x7f, 0x26, 0xe5, 0xa8, 0x08, // 2784 + 0xfe, 0x96, 0xe8, 0x3c, 0x68, 0x94, 0x53, 0xee, 0x83, 0x3a, 0x88, 0x2b, 0x15, 0x96, 0x09, 0xb2, // 2800 + 0xe0, 0x7a, 0x8c, 0x2e, 0x75, 0xd6, 0x9c, 0xeb, 0xa7, 0x56, 0x64, 0x8f, 0x96, 0x4f, 0x68, 0xae, // 2816 + 0x3d, 0x97, 0xc2, 0x84, 0x8f, 0xc0, 0xbc, 0x40, 0xc0, 0x0b, 0x5c, 0xbd, 0xf6, 0x87, 0xb3, 0x35, // 2832 + 0x6c, 0xac, 0x18, 0x50, 0x7f, 0x84, 0xe0, 0x4c, 0xcd, 0x92, 0xd3, 0x20, 0xe9, 0x33, 0xbc, 0x52, // 2848 + 0x99, 0xaf, 0x32, 0xb5, 0x29, 0xb3, 0x25, 0x2a, 0xb4, 0x48, 0xf9, 0x72, 0xe1, 0xca, 0x64, 0xf7, // 2864 + 0xe6, 0x82, 0x10, 0x8d, 0xe8, 0x9d, 0xc2, 0x8a, 0x88, 0xfa, 0x38, 0x66, 0x8a, 0xfc, 0x63, 0xf9, // 2880 + 0x01, 0xf9, 0x78, 0xfd, 0x7b, 0x5c, 0x77, 0xfa, 0x76, 0x87, 0xfa, 0xec, 0xdf, 0xb1, 0x0e, 0x79, // 2896 + 0x95, 0x57, 0xb4, 0xbd, 0x26, 0xef, 0xd6, 0x01, 0xd1, 0xeb, 0x16, 0x0a, 0xbb, 0x8e, 0x0b, 0xb5, // 2912 + 0xc5, 0xc5, 0x8a, 0x55, 0xab, 0xd3, 0xac, 0xea, 0x91, 0x4b, 0x29, 0xcc, 0x19, 0xa4, 0x32, 0x25, // 2928 + 0x4e, 0x2a, 0xf1, 0x65, 0x44, 0xd0, 0x02, 0xce, 0xaa, 0xce, 0x49, 0xb4, 0xea, 0x9f, 0x7c, 0x83, // 2944 + 0xb0, 0x40, 0x7b, 0xe7, 0x43, 0xab, 0xa7, 0x6c, 0xa3, 0x8f, 0x7d, 0x89, 0x81, 0xfa, 0x4c, 0xa5, // 2960 + 0xff, 0xd5, 0x8e, 0xc3, 0xce, 0x4b, 0xe0, 0xb5, 0xd8, 0xb3, 0x8e, 0x45, 0xcf, 0x76, 0xc0, 0xed, // 2976 + 0x40, 0x2b, 0xfd, 0x53, 0x0f, 0xb0, 0xa7, 0xd5, 0x3b, 0x0d, 0xb1, 0x8a, 0xa2, 0x03, 0xde, 0x31, // 2992 + 0xad, 0xcc, 0x77, 0xea, 0x6f, 0x7b, 0x3e, 0xd6, 0xdf, 0x91, 0x22, 0x12, 0xe6, 0xbe, 0xfa, 0xd8, // 3008 + 0x32, 0xfc, 0x10, 0x63, 0x14, 0x51, 0x72, 0xde, 0x5d, 0xd6, 0x16, 0x93, 0xbd, 0x29, 0x68, 0x33, // 3024 + 0xef, 0x3a, 0x66, 0xec, 0x07, 0x8a, 0x26, 0xdf, 0x13, 0xd7, 0x57, 0x65, 0x78, 0x27, 0xde, 0x5e, // 3040 + 0x49, 0x14, 0x00, 0xa2, 0x00, 0x7f, 0x9a, 0xa8, 0x21, 0xb6, 0xa9, 0xb1, 0x95, 0xb0, 0xa5, 0xb9, // 3056 + 0x0d, 0x16, 0x11, 0xda, 0xc7, 0x6c, 0x48, 0x3c, 0x40, 0xe0, 0x7e, 0x0d, 0x5a, 0xcd, 0x56, 0x3c, // 3072 + 0xd1, 0x97, 0x05, 0xb9, 0xcb, 0x4b, 0xed, 0x39, 0x4b, 0x9c, 0xc4, 0x3f, 0xd2, 0x55, 0x13, 0x6e, // 3088 + 0x24, 0xb0, 0xd6, 0x71, 0xfa, 0xf4, 0xc1, 0xba, 0xcc, 0xed, 0x1b, 0xf5, 0xfe, 0x81, 0x41, 0xd8, // 3104 + 0x00, 0x98, 0x3d, 0x3a, 0xc8, 0xae, 0x7a, 0x98, 0x37, 0x18, 0x05, 0x95, 0x02, 0x03, 0x01, 0x00, // 3120 + 0x01, 0x00, 0x49, 0x02, 0x26, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, // 3136 + 0x13, 0x02, 0x55, 0x53, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x47, // 3152 + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, // 3168 + 0x69, 0x63, 0x65, 0x73, 0x20, 0x4c, 0x4c, 0x43, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, // 3184 + 0x03, 0x13, 0x0b, 0x47, 0x54, 0x53, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x52, 0x32, 0x30, 0x82, // 3200 + 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, // 3216 + 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xce, // 3232 + 0xde, 0xfd, 0xa6, 0xfb, 0xec, 0xec, 0x14, 0x34, 0x3c, 0x07, 0x06, 0x5a, 0x6c, 0x59, 0xf7, 0x19, // 3248 + 0x35, 0xdd, 0xf7, 0xc1, 0x9d, 0x55, 0xaa, 0xd3, 0xcd, 0x3b, 0xa4, 0x93, 0x72, 0xef, 0x0a, 0xfa, // 3264 + 0x6d, 0x9d, 0xf6, 0xf0, 0x85, 0x80, 0x5b, 0xa1, 0x48, 0x52, 0x9f, 0x39, 0xc5, 0xb7, 0xee, 0x28, // 3280 + 0xac, 0xef, 0xcb, 0x76, 0x68, 0x14, 0xb9, 0xdf, 0xad, 0x01, 0x6c, 0x99, 0x1f, 0xc4, 0x22, 0x1d, // 3296 + 0x9f, 0xfe, 0x72, 0x77, 0xe0, 0x2c, 0x5b, 0xaf, 0xe4, 0x04, 0xbf, 0x4f, 0x72, 0xa0, 0x1a, 0x34, // 3312 + 0x98, 0xe8, 0x39, 0x68, 0xec, 0x95, 0x25, 0x7b, 0x76, 0xa1, 0xe6, 0x69, 0xb9, 0x85, 0x19, 0xbd, // 3328 + 0x89, 0x8c, 0xfe, 0xad, 0xed, 0x36, 0xea, 0x73, 0xbc, 0xff, 0x83, 0xe2, 0xcb, 0x7d, 0xc1, 0xd2, // 3344 + 0xce, 0x4a, 0xb3, 0x8d, 0x05, 0x9e, 0x8b, 0x49, 0x93, 0xdf, 0xc1, 0x5b, 0xd0, 0x6e, 0x5e, 0xf0, // 3360 + 0x2e, 0x30, 0x2e, 0x82, 0xfc, 0xfa, 0xbc, 0xb4, 0x17, 0x0a, 0x48, 0xe5, 0x88, 0x9b, 0xc5, 0x9b, // 3376 + 0x6b, 0xde, 0xb0, 0xca, 0xb4, 0x03, 0xf0, 0xda, 0xf4, 0x90, 0xb8, 0x65, 0x64, 0xf7, 0x5c, 0x4c, // 3392 + 0xad, 0xe8, 0x7e, 0x66, 0x5e, 0x99, 0xd7, 0xb8, 0xc2, 0x3e, 0xc8, 0xd0, 0x13, 0x9d, 0xad, 0xee, // 3408 + 0xe4, 0x45, 0x7b, 0x89, 0x55, 0xf7, 0x8a, 0x1f, 0x62, 0x52, 0x84, 0x12, 0xb3, 0xc2, 0x40, 0x97, // 3424 + 0xe3, 0x8a, 0x1f, 0x47, 0x91, 0xa6, 0x74, 0x5a, 0xd2, 0xf8, 0xb1, 0x63, 0x28, 0x10, 0xb8, 0xb3, // 3440 + 0x09, 0xb8, 0x56, 0x77, 0x40, 0xa2, 0x26, 0x98, 0x79, 0xc6, 0xfe, 0xdf, 0x25, 0xee, 0x3e, 0xe5, // 3456 + 0xa0, 0x7f, 0xd4, 0x61, 0x0f, 0x51, 0x4b, 0x3c, 0x3f, 0x8c, 0xda, 0xe1, 0x70, 0x74, 0xd8, 0xc2, // 3472 + 0x68, 0xa1, 0xf9, 0xc1, 0x0c, 0xe9, 0xa1, 0xe2, 0x7f, 0xbb, 0x55, 0x3c, 0x76, 0x06, 0xee, 0x6a, // 3488 + 0x4e, 0xcc, 0x92, 0x88, 0x30, 0x4d, 0x9a, 0xbd, 0x4f, 0x0b, 0x48, 0x9a, 0x84, 0xb5, 0x98, 0xa3, // 3504 + 0xd5, 0xfb, 0x73, 0xc1, 0x57, 0x61, 0xdd, 0x28, 0x56, 0x75, 0x13, 0xae, 0x87, 0x8e, 0xe7, 0x0c, // 3520 + 0x51, 0x09, 0x10, 0x75, 0x88, 0x4c, 0xbc, 0x8d, 0xf9, 0x7b, 0x3c, 0xd4, 0x22, 0x48, 0x1f, 0x2a, // 3536 + 0xdc, 0xeb, 0x6b, 0xbb, 0x44, 0xb1, 0xcb, 0x33, 0x71, 0x32, 0x46, 0xaf, 0xad, 0x4a, 0xf1, 0x8c, // 3552 + 0xe8, 0x74, 0x3a, 0xac, 0xe7, 0x1a, 0x22, 0x73, 0x80, 0xd2, 0x30, 0xf7, 0x25, 0x42, 0xc7, 0x22, // 3568 + 0x3b, 0x3b, 0x12, 0xad, 0x96, 0x2e, 0xc6, 0xc3, 0x76, 0x07, 0xaa, 0x20, 0xb7, 0x35, 0x49, 0x57, // 3584 + 0xe9, 0x92, 0x49, 0xe8, 0x76, 0x16, 0x72, 0x31, 0x67, 0x2b, 0x96, 0x7e, 0x8a, 0xa3, 0xc7, 0x94, // 3600 + 0x56, 0x22, 0xbf, 0x6a, 0x4b, 0x7e, 0x01, 0x21, 0xb2, 0x23, 0x32, 0xdf, 0xe4, 0x9a, 0x44, 0x6d, // 3616 + 0x59, 0x5b, 0x5d, 0xf5, 0x00, 0xa0, 0x1c, 0x9b, 0xc6, 0x78, 0x97, 0x8d, 0x90, 0xff, 0x9b, 0xc8, // 3632 + 0xaa, 0xb4, 0xaf, 0x11, 0x51, 0x39, 0x5e, 0xd9, 0xfb, 0x67, 0xad, 0xd5, 0x5b, 0x11, 0x9d, 0x32, // 3648 + 0x9a, 0x1b, 0xbd, 0xd5, 0xba, 0x5b, 0xa5, 0xc9, 0xcb, 0x25, 0x69, 0x53, 0x55, 0x27, 0x5c, 0xe0, // 3664 + 0xca, 0x36, 0xcb, 0x88, 0x61, 0xfb, 0x1e, 0xb7, 0xd0, 0xcb, 0xee, 0x16, 0xfb, 0xd3, 0xa6, 0x4c, // 3680 + 0xde, 0x92, 0xa5, 0xd4, 0xe2, 0xdf, 0xf5, 0x06, 0x54, 0xde, 0x2e, 0x9d, 0x4b, 0xb4, 0x93, 0x30, // 3696 + 0xaa, 0x81, 0xce, 0xdd, 0x1a, 0xdc, 0x51, 0x73, 0x0d, 0x4f, 0x70, 0xe9, 0xe5, 0xb6, 0x16, 0x21, // 3712 + 0x19, 0x79, 0xb2, 0xe6, 0x89, 0x0b, 0x75, 0x64, 0xca, 0xd5, 0xab, 0xbc, 0x09, 0xc1, 0x18, 0xa1, // 3728 + 0xff, 0xd4, 0x54, 0xa1, 0x85, 0x3c, 0xfd, 0x14, 0x24, 0x03, 0xb2, 0x87, 0xd3, 0xa4, 0xb7, 0x02, // 3744 + 0x03, 0x01, 0x00, 0x01, 0x00, 0x49, 0x00, 0x78, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, // 3760 + 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x0a, // 3776 + 0x13, 0x19, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x53, // 3792 + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x4c, 0x4c, 0x43, 0x31, 0x14, 0x30, 0x12, 0x06, // 3808 + 0x03, 0x55, 0x04, 0x03, 0x13, 0x0b, 0x47, 0x54, 0x53, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x52, // 3824 + 0x33, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, // 3840 + 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x1f, 0x4f, 0x33, 0x87, 0x33, 0x29, 0x8a, // 3856 + 0xa1, 0x84, 0xde, 0xcb, 0xc7, 0x21, 0x58, 0x41, 0x89, 0xea, 0x56, 0x9d, 0x2b, 0x4b, 0x85, 0xc6, // 3872 + 0x1d, 0x4c, 0x27, 0xbc, 0x7f, 0x26, 0x51, 0x72, 0x6f, 0xe2, 0x9f, 0xd6, 0xa3, 0xca, 0xcc, 0x45, // 3888 + 0x14, 0x46, 0x8b, 0xad, 0xef, 0x7e, 0x86, 0x8c, 0xec, 0xb1, 0x7e, 0x2f, 0xff, 0xa9, 0x71, 0x9d, // 3904 + 0x18, 0x84, 0x45, 0x04, 0x41, 0x55, 0x6e, 0x2b, 0xea, 0x26, 0x7f, 0xbb, 0x90, 0x01, 0xe3, 0x4b, // 3920 + 0x19, 0xba, 0xe4, 0x54, 0x96, 0x45, 0x09, 0xb1, 0xd5, 0x6c, 0x91, 0x44, 0xad, 0x84, 0x13, 0x8e, // 3936 + 0x9a, 0x8c, 0x0d, 0x80, 0x0c, 0x32, 0xf6, 0xe0, 0x27, 0x00, 0x49, 0x00, 0x78, 0x30, 0x47, 0x31, // 3952 + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x22, 0x30, 0x20, // 3968 + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x19, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x54, 0x72, // 3984 + 0x75, 0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x4c, 0x4c, 0x43, // 4000 + 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0b, 0x47, 0x54, 0x53, 0x20, 0x52, // 4016 + 0x6f, 0x6f, 0x74, 0x20, 0x52, 0x34, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, // 4032 + 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xf3, 0x74, // 4048 + 0x73, 0xa7, 0x68, 0x8b, 0x60, 0xae, 0x43, 0xb8, 0x35, 0xc5, 0x81, 0x30, 0x7b, 0x4b, 0x49, 0x9d, // 4064 + 0xfb, 0xc1, 0x61, 0xce, 0xe6, 0xde, 0x46, 0xbd, 0x6b, 0xd5, 0x61, 0x18, 0x35, 0xae, 0x40, 0xdd, // 4080 + 0x73, 0xf7, 0x89, 0x91, 0x30, 0x5a, 0xeb, 0x3c, 0xee, 0x85, 0x7c, 0xa2, 0x40, 0x76, 0x3b, 0xa9, // 4096 + 0xc6, 0xb8, 0x47, 0xd8, 0x2a, 0xe7, 0x92, 0x91, 0x6a, 0x73, 0xe9, 0xb1, 0x72, 0x39, 0x9f, 0x29, // 4112 + 0x9f, 0xa2, 0x98, 0xd3, 0x5f, 0x5e, 0x58, 0x86, 0x65, 0x0f, 0xa1, 0x84, 0x65, 0x06, 0xd1, 0xdc, // 4128 + 0x8b, 0xc9, 0xc7, 0x73, 0xc8, 0x8c, 0x6a, 0x2f, 0xe5, 0xc4, 0xab, 0xd1, 0x1d, 0x8a, 0x00, 0x4c, // 4144 + 0x02, 0x26, 0x30, 0x4a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, // 4160 + 0x53, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x09, 0x49, 0x64, 0x65, 0x6e, // 4176 + 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1e, // 4192 + 0x49, 0x64, 0x65, 0x6e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, // 4208 + 0x63, 0x69, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, 0x82, // 4224 + 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, // 4240 + 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xa7, // 4256 + 0x50, 0x19, 0xde, 0x3f, 0x99, 0x3d, 0xd4, 0x33, 0x46, 0xf1, 0x6f, 0x51, 0x61, 0x82, 0xb2, 0xa9, // 4272 + 0x4f, 0x8f, 0x67, 0x89, 0x5d, 0x84, 0xd9, 0x53, 0xdd, 0x0c, 0x28, 0xd9, 0xd7, 0xf0, 0xff, 0xae, // 4288 + 0x95, 0x43, 0x72, 0x99, 0xf9, 0xb5, 0x5d, 0x7c, 0x8a, 0xc1, 0x42, 0xe1, 0x31, 0x50, 0x74, 0xd1, // 4304 + 0x81, 0x0d, 0x7c, 0xcd, 0x9b, 0x21, 0xab, 0x43, 0xe2, 0xac, 0xad, 0x5e, 0x86, 0x6e, 0xf3, 0x09, // 4320 + 0x8a, 0x1f, 0x5a, 0x32, 0xbd, 0xa2, 0xeb, 0x94, 0xf9, 0xe8, 0x5c, 0x0a, 0xec, 0xff, 0x98, 0xd2, // 4336 + 0xaf, 0x71, 0xb3, 0xb4, 0x53, 0x9f, 0x4e, 0x87, 0xef, 0x92, 0xbc, 0xbd, 0xec, 0x4f, 0x32, 0x30, // 4352 + 0x88, 0x4b, 0x17, 0x5e, 0x57, 0xc4, 0x53, 0xc2, 0xf6, 0x02, 0x97, 0x8d, 0xd9, 0x62, 0x2b, 0xbf, // 4368 + 0x24, 0x1f, 0x62, 0x8d, 0xdf, 0xc3, 0xb8, 0x29, 0x4b, 0x49, 0x78, 0x3c, 0x93, 0x60, 0x88, 0x22, // 4384 + 0xfc, 0x99, 0xda, 0x36, 0xc8, 0xc2, 0xa2, 0xd4, 0x2c, 0x54, 0x00, 0x67, 0x35, 0x6e, 0x73, 0xbf, // 4400 + 0x02, 0x58, 0xf0, 0xa4, 0xdd, 0xe5, 0xb0, 0xa2, 0x26, 0x7a, 0xca, 0xe0, 0x36, 0xa5, 0x19, 0x16, // 4416 + 0xf5, 0xfd, 0xb7, 0xef, 0xae, 0x3f, 0x40, 0xf5, 0x6d, 0x5a, 0x04, 0xfd, 0xce, 0x34, 0xca, 0x24, // 4432 + 0xdc, 0x74, 0x23, 0x1b, 0x5d, 0x33, 0x13, 0x12, 0x5d, 0xc4, 0x01, 0x25, 0xf6, 0x30, 0xdd, 0x02, // 4448 + 0x5d, 0x9f, 0xe0, 0xd5, 0x47, 0xbd, 0xb4, 0xeb, 0x1b, 0xa1, 0xbb, 0x49, 0x49, 0xd8, 0x9f, 0x5b, // 4464 + 0x02, 0xf3, 0x8a, 0xe4, 0x24, 0x90, 0xe4, 0x62, 0x4f, 0x4f, 0xc1, 0xaf, 0x8b, 0x0e, 0x74, 0x17, // 4480 + 0xa8, 0xd1, 0x72, 0x88, 0x6a, 0x7a, 0x01, 0x49, 0xcc, 0xb4, 0x46, 0x79, 0xc6, 0x17, 0xb1, 0xda, // 4496 + 0x98, 0x1e, 0x07, 0x59, 0xfa, 0x75, 0x21, 0x85, 0x65, 0xdd, 0x90, 0x56, 0xce, 0xfb, 0xab, 0xa5, // 4512 + 0x60, 0x9d, 0xc4, 0x9d, 0xf9, 0x52, 0xb0, 0x8b, 0xbd, 0x87, 0xf9, 0x8f, 0x2b, 0x23, 0x0a, 0x23, // 4528 + 0x76, 0x3b, 0xf7, 0x33, 0xe1, 0xc9, 0x00, 0xf3, 0x69, 0xf9, 0x4b, 0xa2, 0xe0, 0x4e, 0xbc, 0x7e, // 4544 + 0x93, 0x39, 0x84, 0x07, 0xf7, 0x44, 0x70, 0x7e, 0xfe, 0x07, 0x5a, 0xe5, 0xb1, 0xac, 0xd1, 0x18, // 4560 + 0xcc, 0xf2, 0x35, 0xe5, 0x49, 0x49, 0x08, 0xca, 0x56, 0xc9, 0x3d, 0xfb, 0x0f, 0x18, 0x7d, 0x8b, // 4576 + 0x3b, 0xc1, 0x13, 0xc2, 0x4d, 0x8f, 0xc9, 0x4f, 0x0e, 0x37, 0xe9, 0x1f, 0xa1, 0x0e, 0x6a, 0xdf, // 4592 + 0x62, 0x2e, 0xcb, 0x35, 0x06, 0x51, 0x79, 0x2c, 0xc8, 0x25, 0x38, 0xf4, 0xfa, 0x4b, 0xa7, 0x89, // 4608 + 0x5c, 0x9c, 0xd2, 0xe3, 0x0d, 0x39, 0x86, 0x4a, 0x74, 0x7c, 0xd5, 0x59, 0x87, 0xc2, 0x3f, 0x4e, // 4624 + 0x0c, 0x5c, 0x52, 0xf4, 0x3d, 0xf7, 0x52, 0x82, 0xf1, 0xea, 0xa3, 0xac, 0xfd, 0x49, 0x34, 0x1a, // 4640 + 0x28, 0xf3, 0x41, 0x88, 0x3a, 0x13, 0xee, 0xe8, 0xde, 0xff, 0x99, 0x1d, 0x5f, 0xba, 0xcb, 0xe8, // 4656 + 0x1e, 0xf2, 0xb9, 0x50, 0x60, 0xc0, 0x31, 0xd3, 0x73, 0xe5, 0xef, 0xbe, 0xa0, 0xed, 0x33, 0x0b, // 4672 + 0x74, 0xbe, 0x20, 0x20, 0xc4, 0x67, 0x6c, 0xf0, 0x08, 0x03, 0x7a, 0x55, 0x80, 0x7f, 0x46, 0x4e, // 4688 + 0x96, 0xa7, 0xf4, 0x1e, 0x3e, 0xe1, 0xf6, 0xd8, 0x09, 0xe1, 0x33, 0x64, 0x2b, 0x63, 0xd7, 0x32, // 4704 + 0x5e, 0x9f, 0xf9, 0xc0, 0x7b, 0x0f, 0x78, 0x6f, 0x97, 0xbc, 0x93, 0x9a, 0xf9, 0x9c, 0x12, 0x90, // 4720 + 0x78, 0x7a, 0x80, 0x87, 0x15, 0xd7, 0x72, 0x74, 0x9c, 0x55, 0x74, 0x78, 0xb1, 0xba, 0xe1, 0x6e, // 4736 + 0x70, 0x04, 0xba, 0x4f, 0xa0, 0xba, 0x68, 0xc3, 0x7b, 0xff, 0x31, 0xf0, 0x73, 0x3d, 0x3d, 0x94, // 4752 + 0x2a, 0xb1, 0x0b, 0x41, 0x0e, 0xa0, 0xfe, 0x4d, 0x88, 0x65, 0x6b, 0x79, 0x33, 0xb4, 0xd7, 0x02, // 4768 + 0x03, 0x01, 0x00, 0x01, 0x00, 0x4e, 0x01, 0x26, 0x30, 0x4c, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, // 4784 + 0x55, 0x04, 0x0b, 0x13, 0x17, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, // 4800 + 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x52, 0x33, 0x31, 0x13, 0x30, 0x11, // 4816 + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, // 4832 + 0x6e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, // 4848 + 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, // 4864 + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, // 4880 + 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xcc, 0x25, 0x76, 0x90, 0x79, 0x06, 0x78, 0x22, 0x16, // 4896 + 0xf5, 0xc0, 0x83, 0xb6, 0x84, 0xca, 0x28, 0x9e, 0xfd, 0x05, 0x76, 0x11, 0xc5, 0xad, 0x88, 0x72, // 4912 + 0xfc, 0x46, 0x02, 0x43, 0xc7, 0xb2, 0x8a, 0x9d, 0x04, 0x5f, 0x24, 0xcb, 0x2e, 0x4b, 0xe1, 0x60, // 4928 + 0x82, 0x46, 0xe1, 0x52, 0xab, 0x0c, 0x81, 0x47, 0x70, 0x6c, 0xdd, 0x64, 0xd1, 0xeb, 0xf5, 0x2c, // 4944 + 0xa3, 0x0f, 0x82, 0x3d, 0x0c, 0x2b, 0xae, 0x97, 0xd7, 0xb6, 0x14, 0x86, 0x10, 0x79, 0xbb, 0x3b, // 4960 + 0x13, 0x80, 0x77, 0x8c, 0x08, 0xe1, 0x49, 0xd2, 0x6a, 0x62, 0x2f, 0x1f, 0x5e, 0xfa, 0x96, 0x68, // 4976 + 0xdf, 0x89, 0x27, 0x95, 0x38, 0x9f, 0x06, 0xd7, 0x3e, 0xc9, 0xcb, 0x26, 0x59, 0x0d, 0x73, 0xde, // 4992 + 0xb0, 0xc8, 0xe9, 0x26, 0x0e, 0x83, 0x15, 0xc6, 0xef, 0x5b, 0x8b, 0xd2, 0x04, 0x60, 0xca, 0x49, // 5008 + 0xa6, 0x28, 0xf6, 0x69, 0x3b, 0xf6, 0xcb, 0xc8, 0x28, 0x91, 0xe5, 0x9d, 0x8a, 0x61, 0x57, 0x37, // 5024 + 0xac, 0x74, 0x14, 0xdc, 0x74, 0xe0, 0x3a, 0xee, 0x72, 0x2f, 0x2e, 0x9c, 0xfb, 0xd0, 0xbb, 0xbf, // 5040 + 0xf5, 0x3d, 0x00, 0xe1, 0x06, 0x33, 0xe8, 0x82, 0x2b, 0xae, 0x53, 0xa6, 0x3a, 0x16, 0x73, 0x8c, // 5056 + 0xdd, 0x41, 0x0e, 0x20, 0x3a, 0xc0, 0xb4, 0xa7, 0xa1, 0xe9, 0xb2, 0x4f, 0x90, 0x2e, 0x32, 0x60, // 5072 + 0xe9, 0x57, 0xcb, 0xb9, 0x04, 0x92, 0x68, 0x68, 0xe5, 0x38, 0x26, 0x60, 0x75, 0xb2, 0x9f, 0x77, // 5088 + 0xff, 0x91, 0x14, 0xef, 0xae, 0x20, 0x49, 0xfc, 0xad, 0x40, 0x15, 0x48, 0xd1, 0x02, 0x31, 0x61, // 5104 + 0x19, 0x5e, 0xb8, 0x97, 0xef, 0xad, 0x77, 0xb7, 0x64, 0x9a, 0x7a, 0xbf, 0x5f, 0xc1, 0x13, 0xef, // 5120 + 0x9b, 0x62, 0xfb, 0x0d, 0x6c, 0xe0, 0x54, 0x69, 0x16, 0xa9, 0x03, 0xda, 0x6e, 0xe9, 0x83, 0x93, // 5136 + 0x71, 0x76, 0xc6, 0x69, 0x85, 0x82, 0x17, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x4e, 0x02, 0x26, // 5152 + 0x30, 0x4c, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x17, 0x47, 0x6c, 0x6f, // 5168 + 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, // 5184 + 0x2d, 0x20, 0x52, 0x36, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x47, // 5200 + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, // 5216 + 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x30, 0x82, // 5232 + 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, // 5248 + 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0x95, // 5264 + 0x07, 0xe8, 0x73, 0xca, 0x66, 0xf9, 0xec, 0x14, 0xca, 0x7b, 0x3c, 0xf7, 0x0d, 0x08, 0xf1, 0xb4, // 5280 + 0x45, 0x0b, 0x2c, 0x82, 0xb4, 0x48, 0xc6, 0xeb, 0x5b, 0x3c, 0xae, 0x83, 0xb8, 0x41, 0x92, 0x33, // 5296 + 0x14, 0xa4, 0x6f, 0x7f, 0xe9, 0x2a, 0xcc, 0xc6, 0xb0, 0x88, 0x6b, 0xc5, 0xb6, 0x89, 0xd1, 0xc6, // 5312 + 0xb2, 0xff, 0x14, 0xce, 0x51, 0x14, 0x21, 0xec, 0x4a, 0xdd, 0x1b, 0x5a, 0xc6, 0xd6, 0x87, 0xee, // 5328 + 0x4d, 0x3a, 0x15, 0x06, 0xed, 0x64, 0x66, 0x0b, 0x92, 0x80, 0xca, 0x44, 0xde, 0x73, 0x94, 0x4e, // 5344 + 0xf3, 0xa7, 0x89, 0x7f, 0x4f, 0x78, 0x63, 0x08, 0xc8, 0x12, 0x50, 0x6d, 0x42, 0x66, 0x2f, 0x4d, // 5360 + 0xb9, 0x79, 0x28, 0x4d, 0x52, 0x1a, 0x8a, 0x1a, 0x80, 0xb7, 0x19, 0x81, 0x0e, 0x7e, 0xc4, 0x8a, // 5376 + 0xbc, 0x64, 0x4c, 0x21, 0x1c, 0x43, 0x68, 0xd7, 0x3d, 0x3c, 0x8a, 0xc5, 0xb2, 0x66, 0xd5, 0x90, // 5392 + 0x9a, 0xb7, 0x31, 0x06, 0xc5, 0xbe, 0xe2, 0x6d, 0x32, 0x06, 0xa6, 0x1e, 0xf9, 0xb9, 0xeb, 0xaa, // 5408 + 0xa3, 0xb8, 0xbf, 0xbe, 0x82, 0x63, 0x50, 0xd0, 0xf0, 0x18, 0x89, 0xdf, 0xe4, 0x0f, 0x79, 0xf5, // 5424 + 0xea, 0xa2, 0x1f, 0x2a, 0xd2, 0x70, 0x2e, 0x7b, 0xe7, 0xbc, 0x93, 0xbb, 0x6d, 0x53, 0xe2, 0x48, // 5440 + 0x7c, 0x8c, 0x10, 0x07, 0x38, 0xff, 0x66, 0xb2, 0x77, 0x61, 0x7e, 0xe0, 0xea, 0x8c, 0x3c, 0xaa, // 5456 + 0xb4, 0xa4, 0xf6, 0xf3, 0x95, 0x4a, 0x12, 0x07, 0x6d, 0xfd, 0x8c, 0xb2, 0x89, 0xcf, 0xd0, 0xa0, // 5472 + 0x61, 0x77, 0xc8, 0x58, 0x74, 0xb0, 0xd4, 0x23, 0x3a, 0xf7, 0x5d, 0x3a, 0xca, 0xa2, 0xdb, 0x9d, // 5488 + 0x09, 0xde, 0x5d, 0x44, 0x2d, 0x90, 0xf1, 0x81, 0xcd, 0x57, 0x92, 0xfa, 0x7e, 0xbc, 0x50, 0x04, // 5504 + 0x63, 0x34, 0xdf, 0x6b, 0x93, 0x18, 0xbe, 0x6b, 0x36, 0xb2, 0x39, 0xe4, 0xac, 0x24, 0x36, 0xb7, // 5520 + 0xf0, 0xef, 0xb6, 0x1c, 0x13, 0x57, 0x93, 0xb6, 0xde, 0xb2, 0xf8, 0xe2, 0x85, 0xb7, 0x73, 0xa2, // 5536 + 0xb8, 0x35, 0xaa, 0x45, 0xf2, 0xe0, 0x9d, 0x36, 0xa1, 0x6f, 0x54, 0x8a, 0xf1, 0x72, 0x56, 0x6e, // 5552 + 0x2e, 0x88, 0xc5, 0x51, 0x42, 0x44, 0x15, 0x94, 0xee, 0xa3, 0xc5, 0x38, 0x96, 0x9b, 0x4e, 0x4e, // 5568 + 0x5a, 0x0b, 0x47, 0xf3, 0x06, 0x36, 0x49, 0x77, 0x30, 0xbc, 0x71, 0x37, 0xe5, 0xa6, 0xec, 0x21, // 5584 + 0x08, 0x75, 0xfc, 0xe6, 0x61, 0x16, 0x3f, 0x77, 0xd5, 0xd9, 0x91, 0x97, 0x84, 0x0a, 0x6c, 0xd4, // 5600 + 0x02, 0x4d, 0x74, 0xc0, 0x14, 0xed, 0xfd, 0x39, 0xfb, 0x83, 0xf2, 0x5e, 0x14, 0xa1, 0x04, 0xb0, // 5616 + 0x0b, 0xe9, 0xfe, 0xee, 0x8f, 0xe1, 0x6e, 0x0b, 0xb2, 0x08, 0xb3, 0x61, 0x66, 0x09, 0x6a, 0xb1, // 5632 + 0x06, 0x3a, 0x65, 0x96, 0x59, 0xc0, 0xf0, 0x35, 0xfd, 0xc9, 0xda, 0x28, 0x8d, 0x1a, 0x11, 0x87, // 5648 + 0x70, 0x81, 0x0a, 0xa8, 0x9a, 0x75, 0x1d, 0x9e, 0x3a, 0x86, 0x05, 0x00, 0x9e, 0xdb, 0x80, 0xd6, // 5664 + 0x25, 0xf9, 0xdc, 0x05, 0x9e, 0x27, 0x59, 0x4c, 0x76, 0x39, 0x5b, 0xea, 0xf9, 0xa5, 0xa1, 0xd8, // 5680 + 0x83, 0x0f, 0xd1, 0xff, 0xdf, 0x30, 0x11, 0xf9, 0x85, 0xcf, 0x33, 0x48, 0xf5, 0xca, 0x6d, 0x64, // 5696 + 0x14, 0x2c, 0x7a, 0x58, 0x4f, 0xd3, 0x4b, 0x08, 0x49, 0xc5, 0x95, 0x64, 0x1a, 0x63, 0x0e, 0x79, // 5712 + 0x3d, 0xf5, 0xb3, 0x8c, 0xca, 0x58, 0xad, 0x9c, 0x42, 0x45, 0x79, 0x6e, 0x0e, 0x87, 0x19, 0x5c, // 5728 + 0x54, 0xb1, 0x65, 0xb6, 0xbf, 0x8c, 0x9b, 0xdc, 0x13, 0xe9, 0x0d, 0x6f, 0xb8, 0x2e, 0xdc, 0x67, // 5744 + 0x6e, 0xc9, 0x8b, 0x11, 0xb5, 0x84, 0x14, 0x8a, 0x00, 0x19, 0x70, 0x83, 0x79, 0x91, 0x97, 0x91, // 5760 + 0xd4, 0x1a, 0x27, 0xbf, 0x37, 0x1e, 0x32, 0x07, 0xd8, 0x14, 0x63, 0x3c, 0x28, 0x4c, 0xaf, 0x02, // 5776 + 0x03, 0x01, 0x00, 0x01, 0x00, 0x4f, 0x02, 0x26, 0x30, 0x4d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, // 5792 + 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, // 5808 + 0x13, 0x09, 0x49, 0x64, 0x65, 0x6e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x2a, 0x30, 0x28, 0x06, // 5824 + 0x03, 0x55, 0x04, 0x03, 0x13, 0x21, 0x49, 0x64, 0x65, 0x6e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, // 5840 + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x53, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x52, 0x6f, // 5856 + 0x6f, 0x74, 0x20, 0x43, 0x41, 0x20, 0x31, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, // 5872 + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, // 5888 + 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xb6, 0x22, 0x94, 0xfc, 0xa4, 0x48, 0xaf, 0xe8, // 5904 + 0x47, 0x6b, 0x0a, 0xfb, 0x27, 0x76, 0xe4, 0xf2, 0x3f, 0x8a, 0x3b, 0x7a, 0x4a, 0x2c, 0x31, 0x2a, // 5920 + 0x8c, 0x8d, 0xb0, 0xa9, 0xc3, 0x31, 0x6b, 0xa8, 0x77, 0x76, 0x84, 0x26, 0xb6, 0xac, 0x81, 0x42, // 5936 + 0x0d, 0x08, 0xeb, 0x55, 0x58, 0xbb, 0x7a, 0xf8, 0xbc, 0x65, 0x7d, 0xf2, 0xa0, 0x6d, 0x8b, 0xa8, // 5952 + 0x47, 0xe9, 0x62, 0x76, 0x1e, 0x11, 0xee, 0x08, 0x14, 0xd1, 0xb2, 0x44, 0x16, 0xf4, 0xea, 0xd0, // 5968 + 0xfa, 0x1e, 0x2f, 0x5e, 0xdb, 0xcb, 0x73, 0x41, 0xae, 0xbc, 0x00, 0xb0, 0x4a, 0x2b, 0x40, 0xb2, // 5984 + 0xac, 0xe1, 0x3b, 0x4b, 0xc2, 0x2d, 0x9d, 0xe4, 0xa1, 0x9b, 0xec, 0x1a, 0x3a, 0x1e, 0xf0, 0x08, // 6000 + 0xb3, 0xd0, 0xe4, 0x24, 0x35, 0x07, 0x9f, 0x9c, 0xb4, 0xc9, 0x52, 0x6d, 0xdb, 0x07, 0xca, 0x8f, // 6016 + 0xb5, 0x5b, 0xf0, 0x83, 0xf3, 0x4f, 0xc7, 0x2d, 0xa5, 0xc8, 0xad, 0xcb, 0x95, 0x20, 0xa4, 0x31, // 6032 + 0x28, 0x57, 0x58, 0x5a, 0xe4, 0x8d, 0x1b, 0x9a, 0xab, 0x9e, 0x0d, 0x0c, 0xf2, 0x0a, 0x33, 0x39, // 6048 + 0x22, 0x39, 0x0a, 0x97, 0x2e, 0xf3, 0x53, 0x77, 0xb9, 0x44, 0x45, 0xfd, 0x84, 0xcb, 0x36, 0x20, // 6064 + 0x81, 0x59, 0x2d, 0x9a, 0x6f, 0x6d, 0x48, 0x48, 0x61, 0xca, 0x4c, 0xdf, 0x53, 0xd1, 0xaf, 0x52, // 6080 + 0xbc, 0x44, 0x9f, 0xab, 0x2f, 0x6b, 0x83, 0x72, 0xef, 0x75, 0x80, 0xda, 0x06, 0x33, 0x1b, 0x5d, // 6096 + 0xc8, 0xda, 0x63, 0xc6, 0x4d, 0xcd, 0xac, 0x66, 0x31, 0xcd, 0xd1, 0xde, 0x3e, 0x87, 0x10, 0x36, // 6112 + 0xe1, 0xb9, 0xa4, 0x7a, 0xef, 0x60, 0x50, 0xb2, 0xcb, 0xca, 0xa6, 0x56, 0xe0, 0x37, 0xaf, 0xab, // 6128 + 0x34, 0x13, 0x39, 0x25, 0xe8, 0x39, 0x66, 0xe4, 0x98, 0x7a, 0xaa, 0x12, 0x98, 0x9c, 0x59, 0x66, // 6144 + 0x86, 0x3e, 0xad, 0xf1, 0xb0, 0xca, 0x3e, 0x06, 0x0f, 0x7b, 0xf0, 0x11, 0x4b, 0x37, 0xa0, 0x44, // 6160 + 0x6d, 0x7b, 0xcb, 0xa8, 0x8c, 0x71, 0xf4, 0xd5, 0xb5, 0x91, 0x36, 0xcc, 0xf0, 0x15, 0xc6, 0x2b, // 6176 + 0xde, 0x51, 0x17, 0xb1, 0x97, 0x4c, 0x50, 0x3d, 0xb1, 0x95, 0x59, 0x7c, 0x05, 0x7d, 0x2d, 0x21, // 6192 + 0xd5, 0x00, 0xbf, 0x01, 0x67, 0xa2, 0x5e, 0x7b, 0xa6, 0x5c, 0xf2, 0xf7, 0x22, 0xf1, 0x90, 0x0d, // 6208 + 0x93, 0xdb, 0xaa, 0x44, 0x51, 0x66, 0xcc, 0x7d, 0x76, 0x03, 0xeb, 0x6a, 0xa8, 0x2a, 0x38, 0x19, // 6224 + 0x97, 0x76, 0x0d, 0x6b, 0x8a, 0x61, 0xf9, 0xbc, 0xf6, 0xee, 0x76, 0xfd, 0x70, 0x2b, 0xdd, 0x29, // 6240 + 0x3c, 0xf8, 0x0a, 0x1e, 0x5b, 0x42, 0x1c, 0x8b, 0x56, 0x2f, 0x55, 0x1b, 0x1c, 0xa1, 0x2e, 0xb5, // 6256 + 0xc7, 0x16, 0xe6, 0xf8, 0xaa, 0x3c, 0x92, 0x8e, 0x69, 0xb6, 0x01, 0xc1, 0xb5, 0x86, 0x9d, 0x89, // 6272 + 0x0f, 0x0b, 0x38, 0x94, 0x54, 0xe8, 0xea, 0xdc, 0x9e, 0x3d, 0x25, 0xbc, 0x53, 0x26, 0xed, 0xd5, // 6288 + 0xab, 0x39, 0xaa, 0xc5, 0x40, 0x4c, 0x54, 0xab, 0xb2, 0xb4, 0xd9, 0xd9, 0xf8, 0xd7, 0x72, 0xdb, // 6304 + 0x1c, 0xbc, 0x6d, 0xbd, 0x65, 0x5f, 0xef, 0x88, 0x35, 0x2a, 0x66, 0x2f, 0xee, 0xf6, 0xb3, 0x65, // 6320 + 0xf0, 0x33, 0x8d, 0x7c, 0x98, 0x41, 0x69, 0x46, 0x0f, 0x43, 0x1c, 0x69, 0xfa, 0x9b, 0xb5, 0xd0, // 6336 + 0x61, 0x6a, 0xcd, 0xca, 0x4b, 0xd9, 0x4c, 0x90, 0x46, 0xab, 0x15, 0x59, 0xa1, 0x47, 0x54, 0x29, // 6352 + 0x2e, 0x83, 0x28, 0x5f, 0x1c, 0xc2, 0xa2, 0xab, 0x72, 0x17, 0x00, 0x06, 0x8e, 0x45, 0xec, 0x8b, // 6368 + 0xe2, 0x33, 0x3d, 0x7f, 0xda, 0x19, 0x44, 0xe4, 0x62, 0x72, 0xc3, 0xdf, 0x22, 0xc6, 0xf2, 0x56, // 6384 + 0xd4, 0xdd, 0x5f, 0x95, 0x72, 0xed, 0x6d, 0x5f, 0xf7, 0x48, 0x03, 0x5b, 0xfd, 0xc5, 0x2a, 0xa0, // 6400 + 0xf6, 0x73, 0x23, 0x84, 0x10, 0x1b, 0x01, 0xe7, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x4f, 0x02, // 6416 + 0x26, 0x30, 0x4d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, // 6432 + 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0e, 0x44, 0x69, 0x67, 0x69, 0x43, // 6448 + 0x65, 0x72, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, // 6464 + 0x04, 0x03, 0x13, 0x1c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x54, 0x4c, 0x53, // 6480 + 0x20, 0x52, 0x53, 0x41, 0x34, 0x30, 0x39, 0x36, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x35, // 6496 + 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, // 6512 + 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, // 6528 + 0x00, 0xb3, 0xd0, 0xf4, 0xc9, 0x79, 0x11, 0x9d, 0xfd, 0xfc, 0x66, 0x81, 0xe7, 0xcc, 0xd5, 0xe4, // 6544 + 0xbc, 0xec, 0x81, 0x3e, 0x6a, 0x35, 0x8e, 0x2e, 0xb7, 0xe7, 0xde, 0xaf, 0xf9, 0x07, 0x4d, 0xcf, // 6560 + 0x30, 0x9d, 0xea, 0x09, 0x0b, 0x99, 0xbd, 0x6c, 0x57, 0xda, 0x18, 0x4a, 0xb8, 0x78, 0xac, 0x3a, // 6576 + 0x39, 0xa8, 0xa6, 0x48, 0xac, 0x2e, 0x72, 0xe5, 0xbd, 0xeb, 0xf1, 0x1a, 0xcd, 0xe7, 0xa4, 0x03, // 6592 + 0xa9, 0x3f, 0x11, 0xb4, 0xd8, 0x2f, 0x89, 0x16, 0xfb, 0x94, 0x01, 0x3d, 0xbb, 0x2f, 0xf8, 0x13, // 6608 + 0x05, 0xa1, 0x78, 0x1c, 0x8e, 0x28, 0xe0, 0x45, 0xe0, 0x83, 0xf4, 0x59, 0x1b, 0x95, 0xb3, 0xae, // 6624 + 0x7e, 0x03, 0x45, 0xe5, 0xbe, 0xc2, 0x42, 0xfe, 0xee, 0xf2, 0x3c, 0xb6, 0x85, 0x13, 0x98, 0x32, // 6640 + 0x9d, 0x16, 0xa8, 0x29, 0xc2, 0x0b, 0x1c, 0x38, 0xdc, 0x9f, 0x31, 0x77, 0x5c, 0xbf, 0x27, 0xa3, // 6656 + 0xfc, 0x27, 0xac, 0xb7, 0x2b, 0xbd, 0x74, 0x9b, 0x17, 0x2d, 0xf2, 0x81, 0xda, 0x5d, 0xb0, 0xe1, // 6672 + 0x23, 0x17, 0x3e, 0x88, 0x4a, 0x12, 0x23, 0xd0, 0xea, 0xcf, 0x9d, 0xde, 0x03, 0x17, 0xb1, 0x42, // 6688 + 0x4a, 0xa0, 0x16, 0x4c, 0xa4, 0x6d, 0x93, 0xe9, 0x3f, 0x3a, 0xee, 0x3a, 0x7c, 0x9d, 0x58, 0x9d, // 6704 + 0xf4, 0x4e, 0x8f, 0xfc, 0x3b, 0x23, 0xc8, 0x6d, 0xb8, 0xe2, 0x05, 0xda, 0xcc, 0xeb, 0xec, 0xc3, // 6720 + 0x31, 0xf4, 0xd7, 0xa7, 0x29, 0x54, 0x80, 0xcf, 0x44, 0x5b, 0x4c, 0x6f, 0x30, 0x9e, 0xf3, 0xcc, // 6736 + 0xdd, 0x1f, 0x94, 0x43, 0x9d, 0x4d, 0x7f, 0x70, 0x70, 0x0d, 0xd4, 0x3a, 0xd1, 0x37, 0xf0, 0x6c, // 6752 + 0x9d, 0x9b, 0xc0, 0x14, 0x93, 0x58, 0xef, 0xcd, 0x41, 0x38, 0x75, 0xbc, 0x13, 0x03, 0x95, 0x7c, // 6768 + 0x7f, 0xe3, 0x5c, 0xe9, 0xd5, 0x0d, 0xd5, 0xe2, 0x7c, 0x10, 0x62, 0xaa, 0x6b, 0xf0, 0x3d, 0x76, // 6784 + 0xf3, 0x3f, 0xa3, 0xe8, 0xb0, 0xc1, 0xfd, 0xef, 0xaa, 0x57, 0x4d, 0xac, 0x86, 0xa7, 0x18, 0xb4, // 6800 + 0x29, 0xc1, 0x2c, 0x0e, 0xbf, 0x64, 0xbe, 0x29, 0x8c, 0xd8, 0x02, 0x2d, 0xcd, 0x5c, 0x2f, 0xf2, // 6816 + 0x7f, 0xef, 0x15, 0xf4, 0x0c, 0x15, 0xac, 0x0a, 0xb0, 0xf1, 0xd3, 0x0d, 0x4f, 0x6a, 0x4d, 0x77, // 6832 + 0x97, 0x01, 0xa0, 0xf1, 0x66, 0xb7, 0xb7, 0xce, 0xef, 0xce, 0xec, 0xec, 0xa5, 0x75, 0xca, 0xac, // 6848 + 0xe3, 0xe1, 0x63, 0xf7, 0xb8, 0xa1, 0x04, 0xc8, 0xbc, 0x7b, 0x3f, 0x5d, 0x2d, 0x16, 0x22, 0x56, // 6864 + 0xed, 0x48, 0x49, 0xfe, 0xa7, 0x2f, 0x79, 0x30, 0x25, 0x9b, 0xba, 0x6b, 0x2d, 0x3f, 0x9d, 0x3b, // 6880 + 0xc4, 0x17, 0xe7, 0x1d, 0x2e, 0xfb, 0xf2, 0xcf, 0xa6, 0xfc, 0xe3, 0x14, 0x2c, 0x96, 0x98, 0x21, // 6896 + 0x8c, 0xb4, 0x91, 0xe9, 0x19, 0x60, 0x83, 0xf2, 0x30, 0x2b, 0x06, 0x73, 0x50, 0xd5, 0x98, 0x3b, // 6912 + 0x06, 0xe9, 0xc7, 0x8a, 0x0c, 0x60, 0x8c, 0x28, 0xf8, 0x52, 0x9b, 0x6e, 0xe1, 0xf6, 0x4d, 0xbb, // 6928 + 0x06, 0x24, 0x9b, 0xd7, 0x2b, 0x26, 0x3f, 0xfd, 0x2a, 0x2f, 0x71, 0xf5, 0xd6, 0x24, 0xbe, 0x7f, // 6944 + 0x31, 0x9e, 0x0f, 0x6d, 0xe8, 0x8f, 0x4f, 0x4d, 0xa3, 0x3f, 0xff, 0x35, 0xea, 0xdf, 0x49, 0x5e, // 6960 + 0x41, 0x8f, 0x86, 0xf9, 0xf1, 0x77, 0x79, 0x4b, 0x1b, 0xb4, 0xa3, 0x5e, 0x2f, 0xfb, 0x46, 0x02, // 6976 + 0xd0, 0x66, 0x13, 0x5e, 0x5e, 0x85, 0x4f, 0xce, 0xd8, 0x70, 0x88, 0x7b, 0xce, 0x01, 0xb5, 0x96, // 6992 + 0x97, 0xd7, 0xcd, 0x7d, 0xfd, 0x82, 0xf8, 0xc2, 0x24, 0xc1, 0xca, 0x01, 0x39, 0x4f, 0x8d, 0xa2, // 7008 + 0xc1, 0x14, 0x40, 0x1f, 0x9c, 0x66, 0xd5, 0x0c, 0x09, 0x46, 0xd6, 0xf2, 0xd0, 0xd1, 0x48, 0x76, // 7024 + 0x56, 0x3a, 0x43, 0xcb, 0xb6, 0x0a, 0x11, 0x39, 0xba, 0x8c, 0x13, 0x6c, 0x06, 0xb5, 0x9e, 0xcf, // 7040 + 0xeb, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x50, 0x00, 0x78, 0x30, 0x4e, 0x31, 0x0b, 0x30, 0x09, // 7056 + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, // 7072 + 0x04, 0x0a, 0x13, 0x0e, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x2c, 0x20, 0x49, 0x6e, // 7088 + 0x63, 0x2e, 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1d, 0x44, 0x69, 0x67, // 7104 + 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x54, 0x4c, 0x53, 0x20, 0x45, 0x43, 0x43, 0x20, 0x50, 0x33, // 7120 + 0x38, 0x34, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x35, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, // 7136 + 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, // 7152 + 0x00, 0x04, 0xc1, 0x44, 0xa1, 0xcf, 0x11, 0x97, 0x50, 0x9a, 0xde, 0x23, 0x82, 0x35, 0x07, 0xcd, // 7168 + 0xd0, 0xcb, 0x18, 0x9d, 0xd2, 0xf1, 0x7f, 0x77, 0x35, 0x4f, 0x3b, 0xdd, 0x94, 0x72, 0x52, 0xed, // 7184 + 0xc2, 0x3b, 0xf8, 0xec, 0xfa, 0x7b, 0x6b, 0x58, 0x20, 0xec, 0x99, 0xae, 0xc9, 0xfc, 0x68, 0xb3, // 7200 + 0x75, 0xb9, 0xdb, 0x09, 0xec, 0xc8, 0x13, 0xf5, 0x4e, 0xc6, 0x0a, 0x1d, 0x66, 0x30, 0x4c, 0xbb, // 7216 + 0x1f, 0x47, 0x0a, 0x3c, 0x61, 0x10, 0x42, 0x29, 0x7c, 0xa5, 0x08, 0x0e, 0xe0, 0x22, 0xe9, 0xd3, // 7232 + 0x35, 0x68, 0xce, 0x9b, 0x63, 0x9f, 0x84, 0xb5, 0x99, 0x4d, 0x58, 0xa0, 0x8e, 0xf5, 0x54, 0xe7, // 7248 + 0x95, 0xc9, 0x00, 0x51, 0x02, 0x26, 0x30, 0x4f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, // 7264 + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x29, 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x20, // 7280 + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, // 7296 + 0x79, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, // 7312 + 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0c, 0x49, 0x53, 0x52, 0x47, 0x20, // 7328 + 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x58, 0x31, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, // 7344 + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, // 7360 + 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, 0xad, 0xe8, 0x24, 0x73, 0xf4, 0x14, 0x37, 0xf3, // 7376 + 0x9b, 0x9e, 0x2b, 0x57, 0x28, 0x1c, 0x87, 0xbe, 0xdc, 0xb7, 0xdf, 0x38, 0x90, 0x8c, 0x6e, 0x3c, // 7392 + 0xe6, 0x57, 0xa0, 0x78, 0xf7, 0x75, 0xc2, 0xa2, 0xfe, 0xf5, 0x6a, 0x6e, 0xf6, 0x00, 0x4f, 0x28, // 7408 + 0xdb, 0xde, 0x68, 0x86, 0x6c, 0x44, 0x93, 0xb6, 0xb1, 0x63, 0xfd, 0x14, 0x12, 0x6b, 0xbf, 0x1f, // 7424 + 0xd2, 0xea, 0x31, 0x9b, 0x21, 0x7e, 0xd1, 0x33, 0x3c, 0xba, 0x48, 0xf5, 0xdd, 0x79, 0xdf, 0xb3, // 7440 + 0xb8, 0xff, 0x12, 0xf1, 0x21, 0x9a, 0x4b, 0xc1, 0x8a, 0x86, 0x71, 0x69, 0x4a, 0x66, 0x66, 0x6c, // 7456 + 0x8f, 0x7e, 0x3c, 0x70, 0xbf, 0xad, 0x29, 0x22, 0x06, 0xf3, 0xe4, 0xc0, 0xe6, 0x80, 0xae, 0xe2, // 7472 + 0x4b, 0x8f, 0xb7, 0x99, 0x7e, 0x94, 0x03, 0x9f, 0xd3, 0x47, 0x97, 0x7c, 0x99, 0x48, 0x23, 0x53, // 7488 + 0xe8, 0x38, 0xae, 0x4f, 0x0a, 0x6f, 0x83, 0x2e, 0xd1, 0x49, 0x57, 0x8c, 0x80, 0x74, 0xb6, 0xda, // 7504 + 0x2f, 0xd0, 0x38, 0x8d, 0x7b, 0x03, 0x70, 0x21, 0x1b, 0x75, 0xf2, 0x30, 0x3c, 0xfa, 0x8f, 0xae, // 7520 + 0xdd, 0xda, 0x63, 0xab, 0xeb, 0x16, 0x4f, 0xc2, 0x8e, 0x11, 0x4b, 0x7e, 0xcf, 0x0b, 0xe8, 0xff, // 7536 + 0xb5, 0x77, 0x2e, 0xf4, 0xb2, 0x7b, 0x4a, 0xe0, 0x4c, 0x12, 0x25, 0x0c, 0x70, 0x8d, 0x03, 0x29, // 7552 + 0xa0, 0xe1, 0x53, 0x24, 0xec, 0x13, 0xd9, 0xee, 0x19, 0xbf, 0x10, 0xb3, 0x4a, 0x8c, 0x3f, 0x89, // 7568 + 0xa3, 0x61, 0x51, 0xde, 0xac, 0x87, 0x07, 0x94, 0xf4, 0x63, 0x71, 0xec, 0x2e, 0xe2, 0x6f, 0x5b, // 7584 + 0x98, 0x81, 0xe1, 0x89, 0x5c, 0x34, 0x79, 0x6c, 0x76, 0xef, 0x3b, 0x90, 0x62, 0x79, 0xe6, 0xdb, // 7600 + 0xa4, 0x9a, 0x2f, 0x26, 0xc5, 0xd0, 0x10, 0xe1, 0x0e, 0xde, 0xd9, 0x10, 0x8e, 0x16, 0xfb, 0xb7, // 7616 + 0xf7, 0xa8, 0xf7, 0xc7, 0xe5, 0x02, 0x07, 0x98, 0x8f, 0x36, 0x08, 0x95, 0xe7, 0xe2, 0x37, 0x96, // 7632 + 0x0d, 0x36, 0x75, 0x9e, 0xfb, 0x0e, 0x72, 0xb1, 0x1d, 0x9b, 0xbc, 0x03, 0xf9, 0x49, 0x05, 0xd8, // 7648 + 0x81, 0xdd, 0x05, 0xb4, 0x2a, 0xd6, 0x41, 0xe9, 0xac, 0x01, 0x76, 0x95, 0x0a, 0x0f, 0xd8, 0xdf, // 7664 + 0xd5, 0xbd, 0x12, 0x1f, 0x35, 0x2f, 0x28, 0x17, 0x6c, 0xd2, 0x98, 0xc1, 0xa8, 0x09, 0x64, 0x77, // 7680 + 0x6e, 0x47, 0x37, 0xba, 0xce, 0xac, 0x59, 0x5e, 0x68, 0x9d, 0x7f, 0x72, 0xd6, 0x89, 0xc5, 0x06, // 7696 + 0x41, 0x29, 0x3e, 0x59, 0x3e, 0xdd, 0x26, 0xf5, 0x24, 0xc9, 0x11, 0xa7, 0x5a, 0xa3, 0x4c, 0x40, // 7712 + 0x1f, 0x46, 0xa1, 0x99, 0xb5, 0xa7, 0x3a, 0x51, 0x6e, 0x86, 0x3b, 0x9e, 0x7d, 0x72, 0xa7, 0x12, // 7728 + 0x05, 0x78, 0x59, 0xed, 0x3e, 0x51, 0x78, 0x15, 0x0b, 0x03, 0x8f, 0x8d, 0xd0, 0x2f, 0x05, 0xb2, // 7744 + 0x3e, 0x7b, 0x4a, 0x1c, 0x4b, 0x73, 0x05, 0x12, 0xfc, 0xc6, 0xea, 0xe0, 0x50, 0x13, 0x7c, 0x43, // 7760 + 0x93, 0x74, 0xb3, 0xca, 0x74, 0xe7, 0x8e, 0x1f, 0x01, 0x08, 0xd0, 0x30, 0xd4, 0x5b, 0x71, 0x36, // 7776 + 0xb4, 0x07, 0xba, 0xc1, 0x30, 0x30, 0x5c, 0x48, 0xb7, 0x82, 0x3b, 0x98, 0xa6, 0x7d, 0x60, 0x8a, // 7792 + 0xa2, 0xa3, 0x29, 0x82, 0xcc, 0xba, 0xbd, 0x83, 0x04, 0x1b, 0xa2, 0x83, 0x03, 0x41, 0xa1, 0xd6, // 7808 + 0x05, 0xf1, 0x1b, 0xc2, 0xb6, 0xf0, 0xa8, 0x7c, 0x86, 0x3b, 0x46, 0xa8, 0x48, 0x2a, 0x88, 0xdc, // 7824 + 0x76, 0x9a, 0x76, 0xbf, 0x1f, 0x6a, 0xa5, 0x3d, 0x19, 0x8f, 0xeb, 0x38, 0xf3, 0x64, 0xde, 0xc8, // 7840 + 0x2b, 0x0d, 0x0a, 0x28, 0xff, 0xf7, 0xdb, 0xe2, 0x15, 0x42, 0xd4, 0x22, 0xd0, 0x27, 0x5d, 0xe1, // 7856 + 0x79, 0xfe, 0x18, 0xe7, 0x70, 0x88, 0xad, 0x4e, 0xe6, 0xd9, 0x8b, 0x3a, 0xc6, 0xdd, 0x27, 0x51, // 7872 + 0x6e, 0xff, 0xbc, 0x64, 0xf5, 0x33, 0x43, 0x4f, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x51, 0x00, // 7888 + 0x78, 0x30, 0x4f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, // 7904 + 0x31, 0x29, 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, // 7920 + 0x6e, 0x65, 0x74, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x52, 0x65, 0x73, // 7936 + 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x31, 0x15, 0x30, 0x13, 0x06, // 7952 + 0x03, 0x55, 0x04, 0x03, 0x13, 0x0c, 0x49, 0x53, 0x52, 0x47, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, // 7968 + 0x58, 0x32, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, // 7984 + 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xcd, 0x9b, 0xd5, 0x9f, 0x80, 0x83, // 8000 + 0x0a, 0xec, 0x09, 0x4a, 0xf3, 0x16, 0x4a, 0x3e, 0x5c, 0xcf, 0x77, 0xac, 0xde, 0x67, 0x05, 0x0d, // 8016 + 0x1d, 0x07, 0xb6, 0xdc, 0x16, 0xfb, 0x5a, 0x8b, 0x14, 0xdb, 0xe2, 0x71, 0x60, 0xc4, 0xba, 0x45, // 8032 + 0x95, 0x11, 0x89, 0x8e, 0xea, 0x06, 0xdf, 0xf7, 0x2a, 0x16, 0x1c, 0xa4, 0xb9, 0xc5, 0xc5, 0x32, // 8048 + 0xe0, 0x03, 0xe0, 0x1e, 0x82, 0x18, 0x38, 0x8b, 0xd7, 0x45, 0xd8, 0x0a, 0x6a, 0x6e, 0xe6, 0x00, // 8064 + 0x77, 0xfb, 0x02, 0x51, 0x7d, 0x22, 0xd8, 0x0a, 0x6e, 0x9a, 0x5b, 0x77, 0xdf, 0xf0, 0xfa, 0x41, // 8080 + 0xec, 0x39, 0xdc, 0x75, 0xca, 0x68, 0x07, 0x0c, 0x1f, 0xea, 0x00, 0x52, 0x00, 0x5b, 0x30, 0x50, // 8096 + 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1b, 0x47, 0x6c, 0x6f, 0x62, 0x61, // 8112 + 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, // 8128 + 0x41, 0x20, 0x2d, 0x20, 0x52, 0x34, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, // 8144 + 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x31, 0x13, 0x30, 0x11, 0x06, // 8160 + 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, // 8176 + 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, // 8192 + 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00, 0x04, 0xb8, 0xc6, 0x79, 0xd3, 0x8f, // 8208 + 0x6c, 0x25, 0x0e, 0x9f, 0x2e, 0x39, 0x19, 0x1c, 0x03, 0xa4, 0xae, 0x9a, 0xe5, 0x39, 0x07, 0x09, // 8224 + 0x16, 0xca, 0x63, 0xb1, 0xb9, 0x86, 0xf8, 0x8a, 0x57, 0xc1, 0x57, 0xce, 0x42, 0xfa, 0x73, 0xa1, // 8240 + 0xf7, 0x65, 0x42, 0xff, 0x1e, 0xc1, 0x00, 0xb2, 0x6e, 0x73, 0x0e, 0xff, 0xc7, 0x21, 0xe5, 0x18, // 8256 + 0xa4, 0xaa, 0xd9, 0x71, 0x3f, 0xa8, 0xd4, 0xb9, 0xce, 0x8c, 0x1d, 0x00, 0x52, 0x00, 0x78, 0x30, // 8272 + 0x50, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1b, 0x47, 0x6c, 0x6f, 0x62, // 8288 + 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x45, 0x43, 0x43, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, // 8304 + 0x43, 0x41, 0x20, 0x2d, 0x20, 0x52, 0x35, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, // 8320 + 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x31, 0x13, 0x30, 0x11, // 8336 + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, // 8352 + 0x6e, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, // 8368 + 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x47, 0x45, 0x0e, 0x96, 0xfb, 0x7d, 0x5d, // 8384 + 0xbf, 0xe9, 0x39, 0xd1, 0x21, 0xf8, 0x9f, 0x0b, 0xb6, 0xd5, 0x7b, 0x1e, 0x92, 0x3a, 0x48, 0x59, // 8400 + 0x1c, 0xf0, 0x62, 0x31, 0x2d, 0xc0, 0x7a, 0x28, 0xfe, 0x1a, 0xa7, 0x5c, 0xb3, 0xb6, 0xcc, 0x97, // 8416 + 0xe7, 0x45, 0xd4, 0x58, 0xfa, 0xd1, 0x77, 0x6d, 0x43, 0xa2, 0xc0, 0x87, 0x65, 0x34, 0x0a, 0x1f, // 8432 + 0x7a, 0xdd, 0xeb, 0x3c, 0x33, 0xa1, 0xc5, 0x9d, 0x4d, 0xa4, 0x6f, 0x41, 0x95, 0x38, 0x7f, 0xc9, // 8448 + 0x1e, 0x84, 0xeb, 0xd1, 0x9e, 0x49, 0x92, 0x87, 0x94, 0x87, 0x0c, 0x3a, 0x85, 0x4a, 0x66, 0x9f, // 8464 + 0x9d, 0x59, 0x93, 0x4d, 0x97, 0x61, 0x06, 0x86, 0x4a, 0x00, 0x59, 0x01, 0x26, 0x30, 0x57, 0x31, // 8480 + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x42, 0x45, 0x31, 0x19, 0x30, 0x17, // 8496 + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x10, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, // 8512 + 0x6e, 0x20, 0x6e, 0x76, 0x2d, 0x73, 0x61, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0b, // 8528 + 0x13, 0x07, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, // 8544 + 0x04, 0x03, 0x13, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x52, // 8560 + 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, // 8576 + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, // 8592 + 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xda, 0x0e, 0xe6, 0x99, 0x8d, 0xce, 0xa3, 0xe3, 0x4f, // 8608 + 0x8a, 0x7e, 0xfb, 0xf1, 0x8b, 0x83, 0x25, 0x6b, 0xea, 0x48, 0x1f, 0xf1, 0x2a, 0xb0, 0xb9, 0x95, // 8624 + 0x11, 0x04, 0xbd, 0xf0, 0x63, 0xd1, 0xe2, 0x67, 0x66, 0xcf, 0x1c, 0xdd, 0xcf, 0x1b, 0x48, 0x2b, // 8640 + 0xee, 0x8d, 0x89, 0x8e, 0x9a, 0xaf, 0x29, 0x80, 0x65, 0xab, 0xe9, 0xc7, 0x2d, 0x12, 0xcb, 0xab, // 8656 + 0x1c, 0x4c, 0x70, 0x07, 0xa1, 0x3d, 0x0a, 0x30, 0xcd, 0x15, 0x8d, 0x4f, 0xf8, 0xdd, 0xd4, 0x8c, // 8672 + 0x50, 0x15, 0x1c, 0xef, 0x50, 0xee, 0xc4, 0x2e, 0xf7, 0xfc, 0xe9, 0x52, 0xf2, 0x91, 0x7d, 0xe0, // 8688 + 0x6d, 0xd5, 0x35, 0x30, 0x8e, 0x5e, 0x43, 0x73, 0xf2, 0x41, 0xe9, 0xd5, 0x6a, 0xe3, 0xb2, 0x89, // 8704 + 0x3a, 0x56, 0x39, 0x38, 0x6f, 0x06, 0x3c, 0x88, 0x69, 0x5b, 0x2a, 0x4d, 0xc5, 0xa7, 0x54, 0xb8, // 8720 + 0x6c, 0x89, 0xcc, 0x9b, 0xf9, 0x3c, 0xca, 0xe5, 0xfd, 0x89, 0xf5, 0x12, 0x3c, 0x92, 0x78, 0x96, // 8736 + 0xd6, 0xdc, 0x74, 0x6e, 0x93, 0x44, 0x61, 0xd1, 0x8d, 0xc7, 0x46, 0xb2, 0x75, 0x0e, 0x86, 0xe8, // 8752 + 0x19, 0x8a, 0xd5, 0x6d, 0x6c, 0xd5, 0x78, 0x16, 0x95, 0xa2, 0xe9, 0xc8, 0x0a, 0x38, 0xeb, 0xf2, // 8768 + 0x24, 0x13, 0x4f, 0x73, 0x54, 0x93, 0x13, 0x85, 0x3a, 0x1b, 0xbc, 0x1e, 0x34, 0xb5, 0x8b, 0x05, // 8784 + 0x8c, 0xb9, 0x77, 0x8b, 0xb1, 0xdb, 0x1f, 0x20, 0x91, 0xab, 0x09, 0x53, 0x6e, 0x90, 0xce, 0x7b, // 8800 + 0x37, 0x74, 0xb9, 0x70, 0x47, 0x91, 0x22, 0x51, 0x63, 0x16, 0x79, 0xae, 0xb1, 0xae, 0x41, 0x26, // 8816 + 0x08, 0xc8, 0x19, 0x2b, 0xd1, 0x46, 0xaa, 0x48, 0xd6, 0x64, 0x2a, 0xd7, 0x83, 0x34, 0xff, 0x2c, // 8832 + 0x2a, 0xc1, 0x6c, 0x19, 0x43, 0x4a, 0x07, 0x85, 0xe7, 0xd3, 0x7c, 0xf6, 0x21, 0x68, 0xef, 0xea, // 8848 + 0xf2, 0x52, 0x9f, 0x7f, 0x93, 0x90, 0xcf, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x5c, 0x01, 0x26, // 8864 + 0x30, 0x5a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x45, 0x31, // 8880 + 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x09, 0x42, 0x61, 0x6c, 0x74, 0x69, 0x6d, // 8896 + 0x6f, 0x72, 0x65, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0a, 0x43, 0x79, // 8912 + 0x62, 0x65, 0x72, 0x54, 0x72, 0x75, 0x73, 0x74, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, // 8928 + 0x03, 0x13, 0x19, 0x42, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, 0x62, // 8944 + 0x65, 0x72, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x82, 0x01, 0x22, // 8960 + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, // 8976 + 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa3, 0x04, 0xbb, // 8992 + 0x22, 0xab, 0x98, 0x3d, 0x57, 0xe8, 0x26, 0x72, 0x9a, 0xb5, 0x79, 0xd4, 0x29, 0xe2, 0xe1, 0xe8, // 9008 + 0x95, 0x80, 0xb1, 0xb0, 0xe3, 0x5b, 0x8e, 0x2b, 0x29, 0x9a, 0x64, 0xdf, 0xa1, 0x5d, 0xed, 0xb0, // 9024 + 0x09, 0x05, 0x6d, 0xdb, 0x28, 0x2e, 0xce, 0x62, 0xa2, 0x62, 0xfe, 0xb4, 0x88, 0xda, 0x12, 0xeb, // 9040 + 0x38, 0xeb, 0x21, 0x9d, 0xc0, 0x41, 0x2b, 0x01, 0x52, 0x7b, 0x88, 0x77, 0xd3, 0x1c, 0x8f, 0xc7, // 9056 + 0xba, 0xb9, 0x88, 0xb5, 0x6a, 0x09, 0xe7, 0x73, 0xe8, 0x11, 0x40, 0xa7, 0xd1, 0xcc, 0xca, 0x62, // 9072 + 0x8d, 0x2d, 0xe5, 0x8f, 0x0b, 0xa6, 0x50, 0xd2, 0xa8, 0x50, 0xc3, 0x28, 0xea, 0xf5, 0xab, 0x25, // 9088 + 0x87, 0x8a, 0x9a, 0x96, 0x1c, 0xa9, 0x67, 0xb8, 0x3f, 0x0c, 0xd5, 0xf7, 0xf9, 0x52, 0x13, 0x2f, // 9104 + 0xc2, 0x1b, 0xd5, 0x70, 0x70, 0xf0, 0x8f, 0xc0, 0x12, 0xca, 0x06, 0xcb, 0x9a, 0xe1, 0xd9, 0xca, // 9120 + 0x33, 0x7a, 0x77, 0xd6, 0xf8, 0xec, 0xb9, 0xf1, 0x68, 0x44, 0x42, 0x48, 0x13, 0xd2, 0xc0, 0xc2, // 9136 + 0xa4, 0xae, 0x5e, 0x60, 0xfe, 0xb6, 0xa6, 0x05, 0xfc, 0xb4, 0xdd, 0x07, 0x59, 0x02, 0xd4, 0x59, // 9152 + 0x18, 0x98, 0x63, 0xf5, 0xa5, 0x63, 0xe0, 0x90, 0x0c, 0x7d, 0x5d, 0xb2, 0x06, 0x7a, 0xf3, 0x85, // 9168 + 0xea, 0xeb, 0xd4, 0x03, 0xae, 0x5e, 0x84, 0x3e, 0x5f, 0xff, 0x15, 0xed, 0x69, 0xbc, 0xf9, 0x39, // 9184 + 0x36, 0x72, 0x75, 0xcf, 0x77, 0x52, 0x4d, 0xf3, 0xc9, 0x90, 0x2c, 0xb9, 0x3d, 0xe5, 0xc9, 0x23, // 9200 + 0x53, 0x3f, 0x1f, 0x24, 0x98, 0x21, 0x5c, 0x07, 0x99, 0x29, 0xbd, 0xc6, 0x3a, 0xec, 0xe7, 0x6e, // 9216 + 0x86, 0x3a, 0x6b, 0x97, 0x74, 0x63, 0x33, 0xbd, 0x68, 0x18, 0x31, 0xf0, 0x78, 0x8d, 0x76, 0xbf, // 9232 + 0xfc, 0x9e, 0x8e, 0x5d, 0x2a, 0x86, 0xa7, 0x4d, 0x90, 0xdc, 0x27, 0x1a, 0x39, 0x02, 0x03, 0x01, // 9248 + 0x00, 0x01, 0x00, 0x63, 0x01, 0x26, 0x30, 0x61, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, // 9264 + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, // 9280 + 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, // 9296 + 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, // 9312 + 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, // 9328 + 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, // 9344 + 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, // 9360 + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, // 9376 + 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xe2, 0x3b, 0xe1, 0x11, 0x72, 0xde, // 9392 + 0xa8, 0xa4, 0xd3, 0xa3, 0x57, 0xaa, 0x50, 0xa2, 0x8f, 0x0b, 0x77, 0x90, 0xc9, 0xa2, 0xa5, 0xee, // 9408 + 0x12, 0xce, 0x96, 0x5b, 0x01, 0x09, 0x20, 0xcc, 0x01, 0x93, 0xa7, 0x4e, 0x30, 0xb7, 0x53, 0xf7, // 9424 + 0x43, 0xc4, 0x69, 0x00, 0x57, 0x9d, 0xe2, 0x8d, 0x22, 0xdd, 0x87, 0x06, 0x40, 0x00, 0x81, 0x09, // 9440 + 0xce, 0xce, 0x1b, 0x83, 0xbf, 0xdf, 0xcd, 0x3b, 0x71, 0x46, 0xe2, 0xd6, 0x66, 0xc7, 0x05, 0xb3, // 9456 + 0x76, 0x27, 0x16, 0x8f, 0x7b, 0x9e, 0x1e, 0x95, 0x7d, 0xee, 0xb7, 0x48, 0xa3, 0x08, 0xda, 0xd6, // 9472 + 0xaf, 0x7a, 0x0c, 0x39, 0x06, 0x65, 0x7f, 0x4a, 0x5d, 0x1f, 0xbc, 0x17, 0xf8, 0xab, 0xbe, 0xee, // 9488 + 0x28, 0xd7, 0x74, 0x7f, 0x7a, 0x78, 0x99, 0x59, 0x85, 0x68, 0x6e, 0x5c, 0x23, 0x32, 0x4b, 0xbf, // 9504 + 0x4e, 0xc0, 0xe8, 0x5a, 0x6d, 0xe3, 0x70, 0xbf, 0x77, 0x10, 0xbf, 0xfc, 0x01, 0xf6, 0x85, 0xd9, // 9520 + 0xa8, 0x44, 0x10, 0x58, 0x32, 0xa9, 0x75, 0x18, 0xd5, 0xd1, 0xa2, 0xbe, 0x47, 0xe2, 0x27, 0x6a, // 9536 + 0xf4, 0x9a, 0x33, 0xf8, 0x49, 0x08, 0x60, 0x8b, 0xd4, 0x5f, 0xb4, 0x3a, 0x84, 0xbf, 0xa1, 0xaa, // 9552 + 0x4a, 0x4c, 0x7d, 0x3e, 0xcf, 0x4f, 0x5f, 0x6c, 0x76, 0x5e, 0xa0, 0x4b, 0x37, 0x91, 0x9e, 0xdc, // 9568 + 0x22, 0xe6, 0x6d, 0xce, 0x14, 0x1a, 0x8e, 0x6a, 0xcb, 0xfe, 0xcd, 0xb3, 0x14, 0x64, 0x17, 0xc7, // 9584 + 0x5b, 0x29, 0x9e, 0x32, 0xbf, 0xf2, 0xee, 0xfa, 0xd3, 0x0b, 0x42, 0xd4, 0xab, 0xb7, 0x41, 0x32, // 9600 + 0xda, 0x0c, 0xd4, 0xef, 0xf8, 0x81, 0xd5, 0xbb, 0x8d, 0x58, 0x3f, 0xb5, 0x1b, 0xe8, 0x49, 0x28, // 9616 + 0xa2, 0x70, 0xda, 0x31, 0x04, 0xdd, 0xf7, 0xb2, 0x16, 0xf2, 0x4c, 0x0a, 0x4e, 0x07, 0xa8, 0xed, // 9632 + 0x4a, 0x3d, 0x5e, 0xb5, 0x7f, 0xa3, 0x90, 0xc3, 0xaf, 0x27, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, // 9648 + 0x63, 0x01, 0x26, 0x30, 0x61, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, // 9664 + 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, // 9680 + 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, // 9696 + 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, // 9712 + 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x44, // 9728 + 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, // 9744 + 0x6f, 0x6f, 0x74, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, // 9760 + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, // 9776 + 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbb, 0x37, 0xcd, 0x34, 0xdc, 0x7b, 0x6b, 0xc9, 0xb2, // 9792 + 0x68, 0x90, 0xad, 0x4a, 0x75, 0xff, 0x46, 0xba, 0x21, 0x0a, 0x08, 0x8d, 0xf5, 0x19, 0x54, 0xc9, // 9808 + 0xfb, 0x88, 0xdb, 0xf3, 0xae, 0xf2, 0x3a, 0x89, 0x91, 0x3c, 0x7a, 0xe6, 0xab, 0x06, 0x1a, 0x6b, // 9824 + 0xcf, 0xac, 0x2d, 0xe8, 0x5e, 0x09, 0x24, 0x44, 0xba, 0x62, 0x9a, 0x7e, 0xd6, 0xa3, 0xa8, 0x7e, // 9840 + 0xe0, 0x54, 0x75, 0x20, 0x05, 0xac, 0x50, 0xb7, 0x9c, 0x63, 0x1a, 0x6c, 0x30, 0xdc, 0xda, 0x1f, // 9856 + 0x19, 0xb1, 0xd7, 0x1e, 0xde, 0xfd, 0xd7, 0xe0, 0xcb, 0x94, 0x83, 0x37, 0xae, 0xec, 0x1f, 0x43, // 9872 + 0x4e, 0xdd, 0x7b, 0x2c, 0xd2, 0xbd, 0x2e, 0xa5, 0x2f, 0xe4, 0xa9, 0xb8, 0xad, 0x3a, 0xd4, 0x99, // 9888 + 0xa4, 0xb6, 0x25, 0xe9, 0x9b, 0x6b, 0x00, 0x60, 0x92, 0x60, 0xff, 0x4f, 0x21, 0x49, 0x18, 0xf7, // 9904 + 0x67, 0x90, 0xab, 0x61, 0x06, 0x9c, 0x8f, 0xf2, 0xba, 0xe9, 0xb4, 0xe9, 0x92, 0x32, 0x6b, 0xb5, // 9920 + 0xf3, 0x57, 0xe8, 0x5d, 0x1b, 0xcd, 0x8c, 0x1d, 0xab, 0x95, 0x04, 0x95, 0x49, 0xf3, 0x35, 0x2d, // 9936 + 0x96, 0xe3, 0x49, 0x6d, 0xdd, 0x77, 0xe3, 0xfb, 0x49, 0x4b, 0xb4, 0xac, 0x55, 0x07, 0xa9, 0x8f, // 9952 + 0x95, 0xb3, 0xb4, 0x23, 0xbb, 0x4c, 0x6d, 0x45, 0xf0, 0xf6, 0xa9, 0xb2, 0x95, 0x30, 0xb4, 0xfd, // 9968 + 0x4c, 0x55, 0x8c, 0x27, 0x4a, 0x57, 0x14, 0x7c, 0x82, 0x9d, 0xcd, 0x73, 0x92, 0xd3, 0x16, 0x4a, // 9984 + 0x06, 0x0c, 0x8c, 0x50, 0xd1, 0x8f, 0x1e, 0x09, 0xbe, 0x17, 0xa1, 0xe6, 0x21, 0xca, 0xfd, 0x83, // 10000 + 0xe5, 0x10, 0xbc, 0x83, 0xa5, 0x0a, 0xc4, 0x67, 0x28, 0xf6, 0x73, 0x14, 0x14, 0x3d, 0x46, 0x76, // 10016 + 0xc3, 0x87, 0x14, 0x89, 0x21, 0x34, 0x4d, 0xaf, 0x0f, 0x45, 0x0c, 0xa6, 0x49, 0xa1, 0xba, 0xbb, // 10032 + 0x9c, 0xc5, 0xb1, 0x33, 0x83, 0x29, 0x85, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x63, 0x00, 0x78, // 10048 + 0x30, 0x61, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, // 10064 + 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, // 10080 + 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, // 10096 + 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, // 10112 + 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, // 10128 + 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, // 10144 + 0x20, 0x47, 0x33, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, // 10160 + 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xdd, 0xa7, 0xd9, 0xbb, 0x8a, // 10176 + 0xb8, 0x0b, 0xfb, 0x0b, 0x7f, 0x21, 0xd2, 0xf0, 0xbe, 0xbe, 0x73, 0xf3, 0x33, 0x5d, 0x1a, 0xbc, // 10192 + 0x34, 0xea, 0xde, 0xc6, 0x9b, 0xbc, 0xd0, 0x95, 0xf6, 0xf0, 0xcc, 0xd0, 0x0b, 0xba, 0x61, 0x5b, // 10208 + 0x51, 0x46, 0x7e, 0x9e, 0x2d, 0x9f, 0xee, 0x8e, 0x63, 0x0c, 0x17, 0xec, 0x07, 0x70, 0xf5, 0xcf, // 10224 + 0x84, 0x2e, 0x40, 0x83, 0x9c, 0xe8, 0x3f, 0x41, 0x6d, 0x3b, 0xad, 0xd3, 0xa4, 0x14, 0x59, 0x36, // 10240 + 0x78, 0x9d, 0x03, 0x43, 0xee, 0x10, 0x13, 0x6c, 0x72, 0xde, 0xae, 0x88, 0xa7, 0xa1, 0x6b, 0xb5, // 10256 + 0x43, 0xce, 0x67, 0xdc, 0x23, 0xff, 0x03, 0x1c, 0xa3, 0xe2, 0x3e, 0x00, 0x64, 0x02, 0x26, 0x30, // 10272 + 0x62, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, // 10288 + 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, // 10304 + 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, // 10320 + 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, // 10336 + 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x44, 0x69, 0x67, 0x69, 0x43, // 10352 + 0x65, 0x72, 0x74, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x52, 0x6f, 0x6f, 0x74, // 10368 + 0x20, 0x47, 0x34, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, // 10384 + 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, // 10400 + 0x82, 0x02, 0x01, 0x00, 0xbf, 0xe6, 0x90, 0x73, 0x68, 0xde, 0xbb, 0xe4, 0x5d, 0x4a, 0x3c, 0x30, // 10416 + 0x22, 0x30, 0x69, 0x33, 0xec, 0xc2, 0xa7, 0x25, 0x2e, 0xc9, 0x21, 0x3d, 0xf2, 0x8a, 0xd8, 0x59, // 10432 + 0xc2, 0xe1, 0x29, 0xa7, 0x3d, 0x58, 0xab, 0x76, 0x9a, 0xcd, 0xae, 0x7b, 0x1b, 0x84, 0x0d, 0xc4, // 10448 + 0x30, 0x1f, 0xf3, 0x1b, 0xa4, 0x38, 0x16, 0xeb, 0x56, 0xc6, 0x97, 0x6d, 0x1d, 0xab, 0xb2, 0x79, // 10464 + 0xf2, 0xca, 0x11, 0xd2, 0xe4, 0x5f, 0xd6, 0x05, 0x3c, 0x52, 0x0f, 0x52, 0x1f, 0xc6, 0x9e, 0x15, // 10480 + 0xa5, 0x7e, 0xbe, 0x9f, 0xa9, 0x57, 0x16, 0x59, 0x55, 0x72, 0xaf, 0x68, 0x93, 0x70, 0xc2, 0xb2, // 10496 + 0xba, 0x75, 0x99, 0x6a, 0x73, 0x32, 0x94, 0xd1, 0x10, 0x44, 0x10, 0x2e, 0xdf, 0x82, 0xf3, 0x07, // 10512 + 0x84, 0xe6, 0x74, 0x3b, 0x6d, 0x71, 0xe2, 0x2d, 0x0c, 0x1b, 0xee, 0x20, 0xd5, 0xc9, 0x20, 0x1d, // 10528 + 0x63, 0x29, 0x2d, 0xce, 0xec, 0x5e, 0x4e, 0xc8, 0x93, 0xf8, 0x21, 0x61, 0x9b, 0x34, 0xeb, 0x05, // 10544 + 0xc6, 0x5e, 0xec, 0x5b, 0x1a, 0xbc, 0xeb, 0xc9, 0xcf, 0xcd, 0xac, 0x34, 0x40, 0x5f, 0xb1, 0x7a, // 10560 + 0x66, 0xee, 0x77, 0xc8, 0x48, 0xa8, 0x66, 0x57, 0x57, 0x9f, 0x54, 0x58, 0x8e, 0x0c, 0x2b, 0xb7, // 10576 + 0x4f, 0xa7, 0x30, 0xd9, 0x56, 0xee, 0xca, 0x7b, 0x5d, 0xe3, 0xad, 0xc9, 0x4f, 0x5e, 0xe5, 0x35, // 10592 + 0xe7, 0x31, 0xcb, 0xda, 0x93, 0x5e, 0xdc, 0x8e, 0x8f, 0x80, 0xda, 0xb6, 0x91, 0x98, 0x40, 0x90, // 10608 + 0x79, 0xc3, 0x78, 0xc7, 0xb6, 0xb1, 0xc4, 0xb5, 0x6a, 0x18, 0x38, 0x03, 0x10, 0x8d, 0xd8, 0xd4, // 10624 + 0x37, 0xa4, 0x2e, 0x05, 0x7d, 0x88, 0xf5, 0x82, 0x3e, 0x10, 0x91, 0x70, 0xab, 0x55, 0x82, 0x41, // 10640 + 0x32, 0xd7, 0xdb, 0x04, 0x73, 0x2a, 0x6e, 0x91, 0x01, 0x7c, 0x21, 0x4c, 0xd4, 0xbc, 0xae, 0x1b, // 10656 + 0x03, 0x75, 0x5d, 0x78, 0x66, 0xd9, 0x3a, 0x31, 0x44, 0x9a, 0x33, 0x40, 0xbf, 0x08, 0xd7, 0x5a, // 10672 + 0x49, 0xa4, 0xc2, 0xe6, 0xa9, 0xa0, 0x67, 0xdd, 0xa4, 0x27, 0xbc, 0xa1, 0x4f, 0x39, 0xb5, 0x11, // 10688 + 0x58, 0x17, 0xf7, 0x24, 0x5c, 0x46, 0x8f, 0x64, 0xf7, 0xc1, 0x69, 0x88, 0x76, 0x98, 0x76, 0x3d, // 10704 + 0x59, 0x5d, 0x42, 0x76, 0x87, 0x89, 0x97, 0x69, 0x7a, 0x48, 0xf0, 0xe0, 0xa2, 0x12, 0x1b, 0x66, // 10720 + 0x9a, 0x74, 0xca, 0xde, 0x4b, 0x1e, 0xe7, 0x0e, 0x63, 0xae, 0xe6, 0xd4, 0xef, 0x92, 0x92, 0x3a, // 10736 + 0x9e, 0x3d, 0xdc, 0x00, 0xe4, 0x45, 0x25, 0x89, 0xb6, 0x9a, 0x44, 0x19, 0x2b, 0x7e, 0xc0, 0x94, // 10752 + 0xb4, 0xd2, 0x61, 0x6d, 0xeb, 0x33, 0xd9, 0xc5, 0xdf, 0x4b, 0x04, 0x00, 0xcc, 0x7d, 0x1c, 0x95, // 10768 + 0xc3, 0x8f, 0xf7, 0x21, 0xb2, 0xb2, 0x11, 0xb7, 0xbb, 0x7f, 0xf2, 0xd5, 0x8c, 0x70, 0x2c, 0x41, // 10784 + 0x60, 0xaa, 0xb1, 0x63, 0x18, 0x44, 0x95, 0x1a, 0x76, 0x62, 0x7e, 0xf6, 0x80, 0xb0, 0xfb, 0xe8, // 10800 + 0x64, 0xa6, 0x33, 0xd1, 0x89, 0x07, 0xe1, 0xbd, 0xb7, 0xe6, 0x43, 0xa4, 0x18, 0xb8, 0xa6, 0x77, // 10816 + 0x01, 0xe1, 0x0f, 0x94, 0x0c, 0x21, 0x1d, 0xb2, 0x54, 0x29, 0x25, 0x89, 0x6c, 0xe5, 0x0e, 0x52, // 10832 + 0x51, 0x47, 0x74, 0xbe, 0x26, 0xac, 0xb6, 0x41, 0x75, 0xde, 0x7a, 0xac, 0x5f, 0x8d, 0x3f, 0xc9, // 10848 + 0xbc, 0xd3, 0x41, 0x11, 0x12, 0x5b, 0xe5, 0x10, 0x50, 0xeb, 0x31, 0xc5, 0xca, 0x72, 0x16, 0x22, // 10864 + 0x09, 0xdf, 0x7c, 0x4c, 0x75, 0x3f, 0x63, 0xec, 0x21, 0x5f, 0xc4, 0x20, 0x51, 0x6b, 0x6f, 0xb1, // 10880 + 0xab, 0x86, 0x8b, 0x4f, 0xc2, 0xd6, 0x45, 0x5f, 0x9d, 0x20, 0xfc, 0xa1, 0x1e, 0xc5, 0xc0, 0x8f, // 10896 + 0xa2, 0xb1, 0x7e, 0x0a, 0x26, 0x99, 0xf5, 0xe4, 0x69, 0x2f, 0x98, 0x1d, 0x2d, 0xf5, 0xd9, 0xa9, // 10912 + 0xb2, 0x1d, 0xe5, 0x1b, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x65, 0x01, 0x24, 0x30, 0x63, 0x31, // 10928 + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x21, 0x30, 0x1f, // 10944 + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x54, 0x68, 0x65, 0x20, 0x47, 0x6f, 0x20, 0x44, 0x61, // 10960 + 0x64, 0x64, 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, // 10976 + 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x28, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, // 10992 + 0x64, 0x79, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, // 11008 + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, // 11024 + 0x74, 0x79, 0x30, 0x82, 0x01, 0x20, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, // 11040 + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0d, 0x00, 0x30, 0x82, 0x01, 0x08, 0x02, 0x82, // 11056 + 0x01, 0x01, 0x00, 0xde, 0x9d, 0xd7, 0xea, 0x57, 0x18, 0x49, 0xa1, 0x5b, 0xeb, 0xd7, 0x5f, 0x48, // 11072 + 0x86, 0xea, 0xbe, 0xdd, 0xff, 0xe4, 0xef, 0x67, 0x1c, 0xf4, 0x65, 0x68, 0xb3, 0x57, 0x71, 0xa0, // 11088 + 0x5e, 0x77, 0xbb, 0xed, 0x9b, 0x49, 0xe9, 0x70, 0x80, 0x3d, 0x56, 0x18, 0x63, 0x08, 0x6f, 0xda, // 11104 + 0xf2, 0xcc, 0xd0, 0x3f, 0x7f, 0x02, 0x54, 0x22, 0x54, 0x10, 0xd8, 0xb2, 0x81, 0xd4, 0xc0, 0x75, // 11120 + 0x3d, 0x4b, 0x7f, 0xc7, 0x77, 0xc3, 0x3e, 0x78, 0xab, 0x1a, 0x03, 0xb5, 0x20, 0x6b, 0x2f, 0x6a, // 11136 + 0x2b, 0xb1, 0xc5, 0x88, 0x7e, 0xc4, 0xbb, 0x1e, 0xb0, 0xc1, 0xd8, 0x45, 0x27, 0x6f, 0xaa, 0x37, // 11152 + 0x58, 0xf7, 0x87, 0x26, 0xd7, 0xd8, 0x2d, 0xf6, 0xa9, 0x17, 0xb7, 0x1f, 0x72, 0x36, 0x4e, 0xa6, // 11168 + 0x17, 0x3f, 0x65, 0x98, 0x92, 0xdb, 0x2a, 0x6e, 0x5d, 0xa2, 0xfe, 0x88, 0xe0, 0x0b, 0xde, 0x7f, // 11184 + 0xe5, 0x8d, 0x15, 0xe1, 0xeb, 0xcb, 0x3a, 0xd5, 0xe2, 0x12, 0xa2, 0x13, 0x2d, 0xd8, 0x8e, 0xaf, // 11200 + 0x5f, 0x12, 0x3d, 0xa0, 0x08, 0x05, 0x08, 0xb6, 0x5c, 0xa5, 0x65, 0x38, 0x04, 0x45, 0x99, 0x1e, // 11216 + 0xa3, 0x60, 0x60, 0x74, 0xc5, 0x41, 0xa5, 0x72, 0x62, 0x1b, 0x62, 0xc5, 0x1f, 0x6f, 0x5f, 0x1a, // 11232 + 0x42, 0xbe, 0x02, 0x51, 0x65, 0xa8, 0xae, 0x23, 0x18, 0x6a, 0xfc, 0x78, 0x03, 0xa9, 0x4d, 0x7f, // 11248 + 0x80, 0xc3, 0xfa, 0xab, 0x5a, 0xfc, 0xa1, 0x40, 0xa4, 0xca, 0x19, 0x16, 0xfe, 0xb2, 0xc8, 0xef, // 11264 + 0x5e, 0x73, 0x0d, 0xee, 0x77, 0xbd, 0x9a, 0xf6, 0x79, 0x98, 0xbc, 0xb1, 0x07, 0x67, 0xa2, 0x15, // 11280 + 0x0d, 0xdd, 0xa0, 0x58, 0xc6, 0x44, 0x7b, 0x0a, 0x3e, 0x62, 0x28, 0x5f, 0xba, 0x41, 0x07, 0x53, // 11296 + 0x58, 0xcf, 0x11, 0x7e, 0x38, 0x74, 0xc5, 0xf8, 0xff, 0xb5, 0x69, 0x90, 0x8f, 0x84, 0x74, 0xea, // 11312 + 0x97, 0x1b, 0xaf, 0x02, 0x01, 0x03, 0x00, 0x67, 0x01, 0x26, 0x30, 0x65, 0x31, 0x0b, 0x30, 0x09, // 11328 + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, // 11344 + 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, // 11360 + 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, // 11376 + 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x24, 0x30, 0x22, 0x06, // 11392 + 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x41, // 11408 + 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, // 11424 + 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, // 11440 + 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, // 11456 + 0x01, 0x00, 0xad, 0x0e, 0x15, 0xce, 0xe4, 0x43, 0x80, 0x5c, 0xb1, 0x87, 0xf3, 0xb7, 0x60, 0xf9, // 11472 + 0x71, 0x12, 0xa5, 0xae, 0xdc, 0x26, 0x94, 0x88, 0xaa, 0xf4, 0xce, 0xf5, 0x20, 0x39, 0x28, 0x58, // 11488 + 0x60, 0x0c, 0xf8, 0x80, 0xda, 0xa9, 0x15, 0x95, 0x32, 0x61, 0x3c, 0xb5, 0xb1, 0x28, 0x84, 0x8a, // 11504 + 0x8a, 0xdc, 0x9f, 0x0a, 0x0c, 0x83, 0x17, 0x7a, 0x8f, 0x90, 0xac, 0x8a, 0xe7, 0x79, 0x53, 0x5c, // 11520 + 0x31, 0x84, 0x2a, 0xf6, 0x0f, 0x98, 0x32, 0x36, 0x76, 0xcc, 0xde, 0xdd, 0x3c, 0xa8, 0xa2, 0xef, // 11536 + 0x6a, 0xfb, 0x21, 0xf2, 0x52, 0x61, 0xdf, 0x9f, 0x20, 0xd7, 0x1f, 0xe2, 0xb1, 0xd9, 0xfe, 0x18, // 11552 + 0x64, 0xd2, 0x12, 0x5b, 0x5f, 0xf9, 0x58, 0x18, 0x35, 0xbc, 0x47, 0xcd, 0xa1, 0x36, 0xf9, 0x6b, // 11568 + 0x7f, 0xd4, 0xb0, 0x38, 0x3e, 0xc1, 0x1b, 0xc3, 0x8c, 0x33, 0xd9, 0xd8, 0x2f, 0x18, 0xfe, 0x28, // 11584 + 0x0f, 0xb3, 0xa7, 0x83, 0xd6, 0xc3, 0x6e, 0x44, 0xc0, 0x61, 0x35, 0x96, 0x16, 0xfe, 0x59, 0x9c, // 11600 + 0x8b, 0x76, 0x6d, 0xd7, 0xf1, 0xa2, 0x4b, 0x0d, 0x2b, 0xff, 0x0b, 0x72, 0xda, 0x9e, 0x60, 0xd0, // 11616 + 0x8e, 0x90, 0x35, 0xc6, 0x78, 0x55, 0x87, 0x20, 0xa1, 0xcf, 0xe5, 0x6d, 0x0a, 0xc8, 0x49, 0x7c, // 11632 + 0x31, 0x98, 0x33, 0x6c, 0x22, 0xe9, 0x87, 0xd0, 0x32, 0x5a, 0xa2, 0xba, 0x13, 0x82, 0x11, 0xed, // 11648 + 0x39, 0x17, 0x9d, 0x99, 0x3a, 0x72, 0xa1, 0xe6, 0xfa, 0xa4, 0xd9, 0xd5, 0x17, 0x31, 0x75, 0xae, // 11664 + 0x85, 0x7d, 0x22, 0xae, 0x3f, 0x01, 0x46, 0x86, 0xf6, 0x28, 0x79, 0xc8, 0xb1, 0xda, 0xe4, 0x57, // 11680 + 0x17, 0xc4, 0x7e, 0x1c, 0x0e, 0xb0, 0xb4, 0x92, 0xa6, 0x56, 0xb3, 0xbd, 0xb2, 0x97, 0xed, 0xaa, // 11696 + 0xa7, 0xf0, 0xb7, 0xc5, 0xa8, 0x3f, 0x95, 0x16, 0xd0, 0xff, 0xa1, 0x96, 0xeb, 0x08, 0x5f, 0x18, // 11712 + 0x77, 0x4f, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x67, 0x01, 0x26, 0x30, 0x65, 0x31, 0x0b, 0x30, // 11728 + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, // 11744 + 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, // 11760 + 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, // 11776 + 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x24, 0x30, 0x22, // 11792 + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, // 11808 + 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, // 11824 + 0x47, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, // 11840 + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, // 11856 + 0x01, 0x01, 0x00, 0xd9, 0xe7, 0x28, 0x2f, 0x52, 0x3f, 0x36, 0x72, 0x49, 0x88, 0x93, 0x34, 0xf3, // 11872 + 0xf8, 0x6a, 0x1e, 0x31, 0x54, 0x80, 0x9f, 0xad, 0x54, 0x41, 0xb5, 0x47, 0xdf, 0x96, 0xa8, 0xd4, // 11888 + 0xaf, 0x80, 0x2d, 0xb9, 0x0a, 0xcf, 0x75, 0xfd, 0x89, 0xa5, 0x7d, 0x24, 0xfa, 0xe3, 0x22, 0x0c, // 11904 + 0x2b, 0xbc, 0x95, 0x17, 0x0b, 0x33, 0xbf, 0x19, 0x4d, 0x41, 0x06, 0x90, 0x00, 0xbd, 0x0c, 0x4d, // 11920 + 0x10, 0xfe, 0x07, 0xb5, 0xe7, 0x1c, 0x6e, 0x22, 0x55, 0x31, 0x65, 0x97, 0xbd, 0xd3, 0x17, 0xd2, // 11936 + 0x1e, 0x62, 0xf3, 0xdb, 0xea, 0x6c, 0x50, 0x8c, 0x3f, 0x84, 0x0c, 0x96, 0xcf, 0xb7, 0xcb, 0x03, // 11952 + 0xe0, 0xca, 0x6d, 0xa1, 0x14, 0x4c, 0x1b, 0x89, 0xdd, 0xed, 0x00, 0xb0, 0x52, 0x7c, 0xaf, 0x91, // 11968 + 0x6c, 0xb1, 0x38, 0x13, 0xd1, 0xe9, 0x12, 0x08, 0xc0, 0x00, 0xb0, 0x1c, 0x2b, 0x11, 0xda, 0x77, // 11984 + 0x70, 0x36, 0x9b, 0xae, 0xce, 0x79, 0x87, 0xdc, 0x82, 0x70, 0xe6, 0x09, 0x74, 0x70, 0x55, 0x69, // 12000 + 0xaf, 0xa3, 0x68, 0x9f, 0xbf, 0xdd, 0xb6, 0x79, 0xb3, 0xf2, 0x9d, 0x70, 0x29, 0x55, 0xf4, 0xab, // 12016 + 0xff, 0x95, 0x61, 0xf3, 0xc9, 0x40, 0x6f, 0x1d, 0xd1, 0xbe, 0x93, 0xbb, 0xd3, 0x88, 0x2a, 0xbb, // 12032 + 0x9d, 0xbf, 0x72, 0x5a, 0x56, 0x71, 0x3b, 0x3f, 0xd4, 0xf3, 0xd1, 0x0a, 0xfe, 0x28, 0xef, 0xa3, // 12048 + 0xee, 0xd9, 0x99, 0xaf, 0x03, 0xd3, 0x8f, 0x60, 0xb7, 0xf2, 0x92, 0xa1, 0xb1, 0xbd, 0x89, 0x89, // 12064 + 0x1f, 0x30, 0xcd, 0xc3, 0xa6, 0x2e, 0x62, 0x33, 0xae, 0x16, 0x02, 0x77, 0x44, 0x5a, 0xe7, 0x81, // 12080 + 0x0a, 0x3c, 0xa7, 0x44, 0x2e, 0x79, 0xb8, 0x3f, 0x04, 0xbc, 0x5c, 0xa0, 0x87, 0xe1, 0x1b, 0xaf, // 12096 + 0x51, 0x8e, 0xcd, 0xec, 0x2c, 0xfa, 0xf8, 0xfe, 0x6d, 0xf0, 0x3a, 0x7c, 0xaa, 0x8b, 0xe4, 0x67, // 12112 + 0x95, 0x31, 0x8d, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x67, 0x00, 0x78, 0x30, 0x65, 0x31, 0x0b, // 12128 + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, // 12144 + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, // 12160 + 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, 0x77, 0x77, // 12176 + 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x31, 0x24, 0x30, // 12192 + 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1b, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, // 12208 + 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6f, 0x6f, 0x74, // 12224 + 0x20, 0x47, 0x33, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, // 12240 + 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x19, 0xe7, 0xbc, 0xac, 0x44, // 12256 + 0x65, 0xed, 0xcd, 0xb8, 0x3f, 0x58, 0xfb, 0x8d, 0xb1, 0x57, 0xa9, 0x44, 0x2d, 0x05, 0x15, 0xf2, // 12272 + 0xef, 0x0b, 0xff, 0x10, 0x74, 0x9f, 0xb5, 0x62, 0x52, 0x5f, 0x66, 0x7e, 0x1f, 0xe5, 0xdc, 0x1b, // 12288 + 0x45, 0x79, 0x0b, 0xcc, 0xc6, 0x53, 0x0a, 0x9d, 0x8d, 0x5d, 0x02, 0xd9, 0xa9, 0x59, 0xde, 0x02, // 12304 + 0x5a, 0xf6, 0x95, 0x2a, 0x0e, 0x8d, 0x38, 0x4a, 0x8a, 0x49, 0xc6, 0xbc, 0xc6, 0x03, 0x38, 0x07, // 12320 + 0x5f, 0x55, 0xda, 0x7e, 0x09, 0x6e, 0xe2, 0x7f, 0x5e, 0xd0, 0x45, 0x20, 0x0f, 0x59, 0x76, 0x10, // 12336 + 0xd6, 0xa0, 0x24, 0xf0, 0x2d, 0xde, 0x36, 0xf2, 0x6c, 0x29, 0x39, 0x00, 0x6a, 0x01, 0x24, 0x30, // 12352 + 0x68, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x25, // 12368 + 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, // 12384 + 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, // 12400 + 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x29, // 12416 + 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, // 12432 + 0x32, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, // 12448 + 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x20, 0x30, 0x0d, 0x06, // 12464 + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0d, // 12480 + 0x00, 0x30, 0x82, 0x01, 0x08, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb7, 0x32, 0xc8, 0xfe, 0xe9, 0x71, // 12496 + 0xa6, 0x04, 0x85, 0xad, 0x0c, 0x11, 0x64, 0xdf, 0xce, 0x4d, 0xef, 0xc8, 0x03, 0x18, 0x87, 0x3f, // 12512 + 0xa1, 0xab, 0xfb, 0x3c, 0xa6, 0x9f, 0xf0, 0xc3, 0xa1, 0xda, 0xd4, 0xd8, 0x6e, 0x2b, 0x53, 0x90, // 12528 + 0xfb, 0x24, 0xa4, 0x3e, 0x84, 0xf0, 0x9e, 0xe8, 0x5f, 0xec, 0xe5, 0x27, 0x44, 0xf5, 0x28, 0xa6, // 12544 + 0x3f, 0x7b, 0xde, 0xe0, 0x2a, 0xf0, 0xc8, 0xaf, 0x53, 0x2f, 0x9e, 0xca, 0x05, 0x01, 0x93, 0x1e, // 12560 + 0x8f, 0x66, 0x1c, 0x39, 0xa7, 0x4d, 0xfa, 0x5a, 0xb6, 0x73, 0x04, 0x25, 0x66, 0xeb, 0x77, 0x7f, // 12576 + 0xe7, 0x59, 0xc6, 0x4a, 0x99, 0x25, 0x14, 0x54, 0xeb, 0x26, 0xc7, 0xf3, 0x7f, 0x19, 0xd5, 0x30, // 12592 + 0x70, 0x8f, 0xaf, 0xb0, 0x46, 0x2a, 0xff, 0xad, 0xeb, 0x29, 0xed, 0xd7, 0x9f, 0xaa, 0x04, 0x87, // 12608 + 0xa3, 0xd4, 0xf9, 0x89, 0xa5, 0x34, 0x5f, 0xdb, 0x43, 0x91, 0x82, 0x36, 0xd9, 0x66, 0x3c, 0xb1, // 12624 + 0xb8, 0xb9, 0x82, 0xfd, 0x9c, 0x3a, 0x3e, 0x10, 0xc8, 0x3b, 0xef, 0x06, 0x65, 0x66, 0x7a, 0x9b, // 12640 + 0x19, 0x18, 0x3d, 0xff, 0x71, 0x51, 0x3c, 0x30, 0x2e, 0x5f, 0xbe, 0x3d, 0x77, 0x73, 0xb2, 0x5d, // 12656 + 0x06, 0x6c, 0xc3, 0x23, 0x56, 0x9a, 0x2b, 0x85, 0x26, 0x92, 0x1c, 0xa7, 0x02, 0xb3, 0xe4, 0x3f, // 12672 + 0x0d, 0xaf, 0x08, 0x79, 0x82, 0xb8, 0x36, 0x3d, 0xea, 0x9c, 0xd3, 0x35, 0xb3, 0xbc, 0x69, 0xca, // 12688 + 0xf5, 0xcc, 0x9d, 0xe8, 0xfd, 0x64, 0x8d, 0x17, 0x80, 0x33, 0x6e, 0x5e, 0x4a, 0x5d, 0x99, 0xc9, // 12704 + 0x1e, 0x87, 0xb4, 0x9d, 0x1a, 0xc0, 0xd5, 0x6e, 0x13, 0x35, 0x23, 0x5e, 0xdf, 0x9b, 0x5f, 0x3d, // 12720 + 0xef, 0xd6, 0xf7, 0x76, 0xc2, 0xea, 0x3e, 0xbb, 0x78, 0x0d, 0x1c, 0x42, 0x67, 0x6b, 0x04, 0xd8, // 12736 + 0xf8, 0xd6, 0xda, 0x6f, 0x8b, 0xf2, 0x44, 0xa0, 0x01, 0xab, 0x02, 0x01, 0x03, 0x00, 0x6e, 0x01, // 12752 + 0x26, 0x30, 0x6c, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, // 12768 + 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, 0x69, 0x67, 0x69, 0x43, // 12784 + 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, // 12800 + 0x13, 0x10, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, // 12816 + 0x6f, 0x6d, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x44, 0x69, 0x67, // 12832 + 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x48, 0x69, 0x67, 0x68, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, // 12848 + 0x61, 0x6e, 0x63, 0x65, 0x20, 0x45, 0x56, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, // 12864 + 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, // 12880 + 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, // 12896 + 0xc6, 0xcc, 0xe5, 0x73, 0xe6, 0xfb, 0xd4, 0xbb, 0xe5, 0x2d, 0x2d, 0x32, 0xa6, 0xdf, 0xe5, 0x81, // 12912 + 0x3f, 0xc9, 0xcd, 0x25, 0x49, 0xb6, 0x71, 0x2a, 0xc3, 0xd5, 0x94, 0x34, 0x67, 0xa2, 0x0a, 0x1c, // 12928 + 0xb0, 0x5f, 0x69, 0xa6, 0x40, 0xb1, 0xc4, 0xb7, 0xb2, 0x8f, 0xd0, 0x98, 0xa4, 0xa9, 0x41, 0x59, // 12944 + 0x3a, 0xd3, 0xdc, 0x94, 0xd6, 0x3c, 0xdb, 0x74, 0x38, 0xa4, 0x4a, 0xcc, 0x4d, 0x25, 0x82, 0xf7, // 12960 + 0x4a, 0xa5, 0x53, 0x12, 0x38, 0xee, 0xf3, 0x49, 0x6d, 0x71, 0x91, 0x7e, 0x63, 0xb6, 0xab, 0xa6, // 12976 + 0x5f, 0xc3, 0xa4, 0x84, 0xf8, 0x4f, 0x62, 0x51, 0xbe, 0xf8, 0xc5, 0xec, 0xdb, 0x38, 0x92, 0xe3, // 12992 + 0x06, 0xe5, 0x08, 0x91, 0x0c, 0xc4, 0x28, 0x41, 0x55, 0xfb, 0xcb, 0x5a, 0x89, 0x15, 0x7e, 0x71, // 13008 + 0xe8, 0x35, 0xbf, 0x4d, 0x72, 0x09, 0x3d, 0xbe, 0x3a, 0x38, 0x50, 0x5b, 0x77, 0x31, 0x1b, 0x8d, // 13024 + 0xb3, 0xc7, 0x24, 0x45, 0x9a, 0xa7, 0xac, 0x6d, 0x00, 0x14, 0x5a, 0x04, 0xb7, 0xba, 0x13, 0xeb, // 13040 + 0x51, 0x0a, 0x98, 0x41, 0x41, 0x22, 0x4e, 0x65, 0x61, 0x87, 0x81, 0x41, 0x50, 0xa6, 0x79, 0x5c, // 13056 + 0x89, 0xde, 0x19, 0x4a, 0x57, 0xd5, 0x2e, 0xe6, 0x5d, 0x1c, 0x53, 0x2c, 0x7e, 0x98, 0xcd, 0x1a, // 13072 + 0x06, 0x16, 0xa4, 0x68, 0x73, 0xd0, 0x34, 0x04, 0x13, 0x5c, 0xa1, 0x71, 0xd3, 0x5a, 0x7c, 0x55, // 13088 + 0xdb, 0x5e, 0x64, 0xe1, 0x37, 0x87, 0x30, 0x56, 0x04, 0xe5, 0x11, 0xb4, 0x29, 0x80, 0x12, 0xf1, // 13104 + 0x79, 0x39, 0x88, 0xa2, 0x02, 0x11, 0x7c, 0x27, 0x66, 0xb7, 0x88, 0xb7, 0x78, 0xf2, 0xca, 0x0a, // 13120 + 0xa8, 0x38, 0xab, 0x0a, 0x64, 0xc2, 0xbf, 0x66, 0x5d, 0x95, 0x84, 0xc1, 0xa1, 0x25, 0x1e, 0x87, // 13136 + 0x5d, 0x1a, 0x50, 0x0b, 0x20, 0x12, 0xcc, 0x41, 0xbb, 0x6e, 0x0b, 0x51, 0x38, 0xb8, 0x4b, 0xcb, // 13152 + 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x84, 0x01, 0x26, 0x30, 0x81, 0x81, 0x31, 0x0b, 0x30, 0x09, // 13168 + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, // 13184 + 0x04, 0x08, 0x13, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, // 13200 + 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, // 13216 + 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, // 13232 + 0x0a, 0x13, 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, // 13248 + 0x69, 0x74, 0x65, 0x64, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1e, 0x43, // 13264 + 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, // 13280 + 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, // 13296 + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, // 13312 + 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd0, 0x40, // 13328 + 0x8b, 0x8b, 0x72, 0xe3, 0x91, 0x1b, 0xf7, 0x51, 0xc1, 0x1b, 0x54, 0x04, 0x98, 0xd3, 0xa9, 0xbf, // 13344 + 0xc1, 0xe6, 0x8a, 0x5d, 0x3b, 0x87, 0xfb, 0xbb, 0x88, 0xce, 0x0d, 0xe3, 0x2f, 0x3f, 0x06, 0x96, // 13360 + 0xf0, 0xa2, 0x29, 0x50, 0x99, 0xae, 0xdb, 0x3b, 0xa1, 0x57, 0xb0, 0x74, 0x51, 0x71, 0xcd, 0xed, // 13376 + 0x42, 0x91, 0x4d, 0x41, 0xfe, 0xa9, 0xc8, 0xd8, 0x6a, 0x86, 0x77, 0x44, 0xbb, 0x59, 0x66, 0x97, // 13392 + 0x50, 0x5e, 0xb4, 0xd4, 0x2c, 0x70, 0x44, 0xcf, 0xda, 0x37, 0x95, 0x42, 0x69, 0x3c, 0x30, 0xc4, // 13408 + 0x71, 0xb3, 0x52, 0xf0, 0x21, 0x4d, 0xa1, 0xd8, 0xba, 0x39, 0x7c, 0x1c, 0x9e, 0xa3, 0x24, 0x9d, // 13424 + 0xf2, 0x83, 0x16, 0x98, 0xaa, 0x16, 0x7c, 0x43, 0x9b, 0x15, 0x5b, 0xb7, 0xae, 0x34, 0x91, 0xfe, // 13440 + 0xd4, 0x62, 0x26, 0x18, 0x46, 0x9a, 0x3f, 0xeb, 0xc1, 0xf9, 0xf1, 0x90, 0x57, 0xeb, 0xac, 0x7a, // 13456 + 0x0d, 0x8b, 0xdb, 0x72, 0x30, 0x6a, 0x66, 0xd5, 0xe0, 0x46, 0xa3, 0x70, 0xdc, 0x68, 0xd9, 0xff, // 13472 + 0x04, 0x48, 0x89, 0x77, 0xde, 0xb5, 0xe9, 0xfb, 0x67, 0x6d, 0x41, 0xe9, 0xbc, 0x39, 0xbd, 0x32, // 13488 + 0xd9, 0x62, 0x02, 0xf1, 0xb1, 0xa8, 0x3d, 0x6e, 0x37, 0x9c, 0xe2, 0x2f, 0xe2, 0xd3, 0xa2, 0x26, // 13504 + 0x8b, 0xc6, 0xb8, 0x55, 0x43, 0x88, 0xe1, 0x23, 0x3e, 0xa5, 0xd2, 0x24, 0x39, 0x6a, 0x47, 0xab, // 13520 + 0x00, 0xd4, 0xa1, 0xb3, 0xa9, 0x25, 0xfe, 0x0d, 0x3f, 0xa7, 0x1d, 0xba, 0xd3, 0x51, 0xc1, 0x0b, // 13536 + 0xa4, 0xda, 0xac, 0x38, 0xef, 0x55, 0x50, 0x24, 0x05, 0x65, 0x46, 0x93, 0x34, 0x4f, 0x2d, 0x8d, // 13552 + 0xad, 0xc6, 0xd4, 0x21, 0x19, 0xd2, 0x8e, 0xca, 0x05, 0x61, 0x71, 0x07, 0x73, 0x47, 0xe5, 0x8a, // 13568 + 0x19, 0x12, 0xbd, 0x04, 0x4d, 0xce, 0x4e, 0x9c, 0xa5, 0x48, 0xac, 0xbb, 0x26, 0xf7, 0x02, 0x03, // 13584 + 0x01, 0x00, 0x01, 0x00, 0x86, 0x01, 0x26, 0x30, 0x81, 0x83, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, // 13600 + 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, // 13616 + 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, // 13632 + 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x1a, // 13648 + 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x47, 0x6f, 0x44, 0x61, 0x64, 0x64, 0x79, // 13664 + 0x2e, 0x63, 0x6f, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, // 13680 + 0x55, 0x04, 0x03, 0x13, 0x28, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x52, 0x6f, // 13696 + 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, // 13712 + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, // 13728 + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, // 13744 + 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbf, 0x71, // 13760 + 0x62, 0x08, 0xf1, 0xfa, 0x59, 0x34, 0xf7, 0x1b, 0xc9, 0x18, 0xa3, 0xf7, 0x80, 0x49, 0x58, 0xe9, // 13776 + 0x22, 0x83, 0x13, 0xa6, 0xc5, 0x20, 0x43, 0x01, 0x3b, 0x84, 0xf1, 0xe6, 0x85, 0x49, 0x9f, 0x27, // 13792 + 0xea, 0xf6, 0x84, 0x1b, 0x4e, 0xa0, 0xb4, 0xdb, 0x70, 0x98, 0xc7, 0x32, 0x01, 0xb1, 0x05, 0x3e, // 13808 + 0x07, 0x4e, 0xee, 0xf4, 0xfa, 0x4f, 0x2f, 0x59, 0x30, 0x22, 0xe7, 0xab, 0x19, 0x56, 0x6b, 0xe2, // 13824 + 0x80, 0x07, 0xfc, 0xf3, 0x16, 0x75, 0x80, 0x39, 0x51, 0x7b, 0xe5, 0xf9, 0x35, 0xb6, 0x74, 0x4e, // 13840 + 0xa9, 0x8d, 0x82, 0x13, 0xe4, 0xb6, 0x3f, 0xa9, 0x03, 0x83, 0xfa, 0xa2, 0xbe, 0x8a, 0x15, 0x6a, // 13856 + 0x7f, 0xde, 0x0b, 0xc3, 0xb6, 0x19, 0x14, 0x05, 0xca, 0xea, 0xc3, 0xa8, 0x04, 0x94, 0x3b, 0x46, // 13872 + 0x7c, 0x32, 0x0d, 0xf3, 0x00, 0x66, 0x22, 0xc8, 0x8d, 0x69, 0x6d, 0x36, 0x8c, 0x11, 0x18, 0xb7, // 13888 + 0xd3, 0xb2, 0x1c, 0x60, 0xb4, 0x38, 0xfa, 0x02, 0x8c, 0xce, 0xd3, 0xdd, 0x46, 0x07, 0xde, 0x0a, // 13904 + 0x3e, 0xeb, 0x5d, 0x7c, 0xc8, 0x7c, 0xfb, 0xb0, 0x2b, 0x53, 0xa4, 0x92, 0x62, 0x69, 0x51, 0x25, // 13920 + 0x05, 0x61, 0x1a, 0x44, 0x81, 0x8c, 0x2c, 0xa9, 0x43, 0x96, 0x23, 0xdf, 0xac, 0x3a, 0x81, 0x9a, // 13936 + 0x0e, 0x29, 0xc5, 0x1c, 0xa9, 0xe9, 0x5d, 0x1e, 0xb6, 0x9e, 0x9e, 0x30, 0x0a, 0x39, 0xce, 0xf1, // 13952 + 0x88, 0x80, 0xfb, 0x4b, 0x5d, 0xcc, 0x32, 0xec, 0x85, 0x62, 0x43, 0x25, 0x34, 0x02, 0x56, 0x27, // 13968 + 0x01, 0x91, 0xb4, 0x3b, 0x70, 0x2a, 0x3f, 0x6e, 0xb1, 0xe8, 0x9c, 0x88, 0x01, 0x7d, 0x9f, 0xd4, // 13984 + 0xf9, 0xdb, 0x53, 0x6d, 0x60, 0x9d, 0xbf, 0x2c, 0xe7, 0x58, 0xab, 0xb8, 0x5f, 0x46, 0xfc, 0xce, // 14000 + 0xc4, 0x1b, 0x03, 0x3c, 0x09, 0xeb, 0x49, 0x31, 0x5c, 0x69, 0x46, 0xb3, 0xe0, 0x47, 0x02, 0x03, // 14016 + 0x01, 0x00, 0x01, 0x00, 0x88, 0x00, 0x78, 0x30, 0x81, 0x85, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, // 14032 + 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x08, // 14048 + 0x13, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x6e, 0x63, 0x68, 0x65, // 14064 + 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x53, // 14080 + 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, // 14096 + 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x41, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, // 14112 + 0x65, 0x64, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x43, 0x4f, 0x4d, // 14128 + 0x4f, 0x44, 0x4f, 0x20, 0x45, 0x43, 0x43, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, // 14144 + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, // 14160 + 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, // 14176 + 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0x03, 0x47, 0x7b, 0x2f, 0x75, 0xc9, 0x82, 0x15, 0x85, // 14192 + 0xfb, 0x75, 0xe4, 0x91, 0x16, 0xd4, 0xab, 0x62, 0x99, 0xf5, 0x3e, 0x52, 0x0b, 0x06, 0xce, 0x41, // 14208 + 0x00, 0x7f, 0x97, 0xe1, 0x0a, 0x24, 0x3c, 0x1d, 0x01, 0x04, 0xee, 0x3d, 0xd2, 0x8d, 0x09, 0x97, // 14224 + 0x0c, 0xe0, 0x75, 0xe4, 0xfa, 0xfb, 0x77, 0x8a, 0x2a, 0xf5, 0x03, 0x60, 0x4b, 0x36, 0x8b, 0x16, // 14240 + 0x23, 0x16, 0xad, 0x09, 0x71, 0xf4, 0x4a, 0xf4, 0x28, 0x50, 0xb4, 0xfe, 0x88, 0x1c, 0x6e, 0x3f, // 14256 + 0x6c, 0x2f, 0x2f, 0x09, 0x59, 0x5b, 0xa5, 0x5b, 0x0b, 0x33, 0x99, 0xe2, 0xc3, 0x3d, 0x89, 0xf9, // 14272 + 0x6a, 0x2c, 0xef, 0xb2, 0xd3, 0x06, 0xe9, 0x00, 0x88, 0x02, 0x26, 0x30, 0x81, 0x85, 0x31, 0x0b, // 14288 + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x1b, 0x30, 0x19, 0x06, // 14304 + 0x03, 0x55, 0x04, 0x08, 0x13, 0x12, 0x47, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x4d, 0x61, // 14320 + 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, // 14336 + 0x07, 0x13, 0x07, 0x53, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x64, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, // 14352 + 0x55, 0x04, 0x0a, 0x13, 0x11, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x43, 0x41, 0x20, 0x4c, // 14368 + 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, // 14384 + 0x22, 0x43, 0x4f, 0x4d, 0x4f, 0x44, 0x4f, 0x20, 0x52, 0x53, 0x41, 0x20, 0x43, 0x65, 0x72, 0x74, // 14400 + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, // 14416 + 0x69, 0x74, 0x79, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, // 14432 + 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, // 14448 + 0x82, 0x02, 0x01, 0x00, 0x91, 0xe8, 0x54, 0x92, 0xd2, 0x0a, 0x56, 0xb1, 0xac, 0x0d, 0x24, 0xdd, // 14464 + 0xc5, 0xcf, 0x44, 0x67, 0x74, 0x99, 0x2b, 0x37, 0xa3, 0x7d, 0x23, 0x70, 0x00, 0x71, 0xbc, 0x53, // 14480 + 0xdf, 0xc4, 0xfa, 0x2a, 0x12, 0x8f, 0x4b, 0x7f, 0x10, 0x56, 0xbd, 0x9f, 0x70, 0x72, 0xb7, 0x61, // 14496 + 0x7f, 0xc9, 0x4b, 0x0f, 0x17, 0xa7, 0x3d, 0xe3, 0xb0, 0x04, 0x61, 0xee, 0xff, 0x11, 0x97, 0xc7, // 14512 + 0xf4, 0x86, 0x3e, 0x0a, 0xfa, 0x3e, 0x5c, 0xf9, 0x93, 0xe6, 0x34, 0x7a, 0xd9, 0x14, 0x6b, 0xe7, // 14528 + 0x9c, 0xb3, 0x85, 0xa0, 0x82, 0x7a, 0x76, 0xaf, 0x71, 0x90, 0xd7, 0xec, 0xfd, 0x0d, 0xfa, 0x9c, // 14544 + 0x6c, 0xfa, 0xdf, 0xb0, 0x82, 0xf4, 0x14, 0x7e, 0xf9, 0xbe, 0xc4, 0xa6, 0x2f, 0x4f, 0x7f, 0x99, // 14560 + 0x7f, 0xb5, 0xfc, 0x67, 0x43, 0x72, 0xbd, 0x0c, 0x00, 0xd6, 0x89, 0xeb, 0x6b, 0x2c, 0xd3, 0xed, // 14576 + 0x8f, 0x98, 0x1c, 0x14, 0xab, 0x7e, 0xe5, 0xe3, 0x6e, 0xfc, 0xd8, 0xa8, 0xe4, 0x92, 0x24, 0xda, // 14592 + 0x43, 0x6b, 0x62, 0xb8, 0x55, 0xfd, 0xea, 0xc1, 0xbc, 0x6c, 0xb6, 0x8b, 0xf3, 0x0e, 0x8d, 0x9a, // 14608 + 0xe4, 0x9b, 0x6c, 0x69, 0x99, 0xf8, 0x78, 0x48, 0x30, 0x45, 0xd5, 0xad, 0xe1, 0x0d, 0x3c, 0x45, // 14624 + 0x60, 0xfc, 0x32, 0x96, 0x51, 0x27, 0xbc, 0x67, 0xc3, 0xca, 0x2e, 0xb6, 0x6b, 0xea, 0x46, 0xc7, // 14640 + 0xc7, 0x20, 0xa0, 0xb1, 0x1f, 0x65, 0xde, 0x48, 0x08, 0xba, 0xa4, 0x4e, 0xa9, 0xf2, 0x83, 0x46, // 14656 + 0x37, 0x84, 0xeb, 0xe8, 0xcc, 0x81, 0x48, 0x43, 0x67, 0x4e, 0x72, 0x2a, 0x9b, 0x5c, 0xbd, 0x4c, // 14672 + 0x1b, 0x28, 0x8a, 0x5c, 0x22, 0x7b, 0xb4, 0xab, 0x98, 0xd9, 0xee, 0xe0, 0x51, 0x83, 0xc3, 0x09, // 14688 + 0x46, 0x4e, 0x6d, 0x3e, 0x99, 0xfa, 0x95, 0x17, 0xda, 0x7c, 0x33, 0x57, 0x41, 0x3c, 0x8d, 0x51, // 14704 + 0xed, 0x0b, 0xb6, 0x5c, 0xaf, 0x2c, 0x63, 0x1a, 0xdf, 0x57, 0xc8, 0x3f, 0xbc, 0xe9, 0x5d, 0xc4, // 14720 + 0x9b, 0xaf, 0x45, 0x99, 0xe2, 0xa3, 0x5a, 0x24, 0xb4, 0xba, 0xa9, 0x56, 0x3d, 0xcf, 0x6f, 0xaa, // 14736 + 0xff, 0x49, 0x58, 0xbe, 0xf0, 0xa8, 0xff, 0xf4, 0xb8, 0xad, 0xe9, 0x37, 0xfb, 0xba, 0xb8, 0xf4, // 14752 + 0x0b, 0x3a, 0xf9, 0xe8, 0x43, 0x42, 0x1e, 0x89, 0xd8, 0x84, 0xcb, 0x13, 0xf1, 0xd9, 0xbb, 0xe1, // 14768 + 0x89, 0x60, 0xb8, 0x8c, 0x28, 0x56, 0xac, 0x14, 0x1d, 0x9c, 0x0a, 0xe7, 0x71, 0xeb, 0xcf, 0x0e, // 14784 + 0xdd, 0x3d, 0xa9, 0x96, 0xa1, 0x48, 0xbd, 0x3c, 0xf7, 0xaf, 0xb5, 0x0d, 0x22, 0x4c, 0xc0, 0x11, // 14800 + 0x81, 0xec, 0x56, 0x3b, 0xf6, 0xd3, 0xa2, 0xe2, 0x5b, 0xb7, 0xb2, 0x04, 0x22, 0x52, 0x95, 0x80, // 14816 + 0x93, 0x69, 0xe8, 0x8e, 0x4c, 0x65, 0xf1, 0x91, 0x03, 0x2d, 0x70, 0x74, 0x02, 0xea, 0x8b, 0x67, // 14832 + 0x15, 0x29, 0x69, 0x52, 0x02, 0xbb, 0xd7, 0xdf, 0x50, 0x6a, 0x55, 0x46, 0xbf, 0xa0, 0xa3, 0x28, // 14848 + 0x61, 0x7f, 0x70, 0xd0, 0xc3, 0xa2, 0xaa, 0x2c, 0x21, 0xaa, 0x47, 0xce, 0x28, 0x9c, 0x06, 0x45, // 14864 + 0x76, 0xbf, 0x82, 0x18, 0x27, 0xb4, 0xd5, 0xae, 0xb4, 0xcb, 0x50, 0xe6, 0x6b, 0xf4, 0x4c, 0x86, // 14880 + 0x71, 0x30, 0xe9, 0xa6, 0xdf, 0x16, 0x86, 0xe0, 0xd8, 0xff, 0x40, 0xdd, 0xfb, 0xd0, 0x42, 0x88, // 14896 + 0x7f, 0xa3, 0x33, 0x3a, 0x2e, 0x5c, 0x1e, 0x41, 0x11, 0x81, 0x63, 0xce, 0x18, 0x71, 0x6b, 0x2b, // 14912 + 0xec, 0xa6, 0x8a, 0xb7, 0x31, 0x5c, 0x3a, 0x6a, 0x47, 0xe0, 0xc3, 0x79, 0x59, 0xd6, 0x20, 0x1a, // 14928 + 0xaf, 0xf2, 0x6a, 0x98, 0xaa, 0x72, 0xbc, 0x57, 0x4a, 0xd2, 0x4b, 0x9d, 0xbb, 0x10, 0xfc, 0xb0, // 14944 + 0x4c, 0x41, 0xe5, 0xed, 0x1d, 0x3d, 0x5e, 0x28, 0x9d, 0x9c, 0xcc, 0xbf, 0xb3, 0x51, 0xda, 0xa7, // 14960 + 0x47, 0xe5, 0x84, 0x53, 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x8b, 0x00, 0x78, 0x30, 0x81, 0x88, // 14976 + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, // 14992 + 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, 0x4e, 0x65, 0x77, 0x20, 0x4a, 0x65, 0x72, 0x73, // 15008 + 0x65, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0b, 0x4a, 0x65, 0x72, // 15024 + 0x73, 0x65, 0x79, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, // 15040 + 0x0a, 0x13, 0x15, 0x54, 0x68, 0x65, 0x20, 0x55, 0x53, 0x45, 0x52, 0x54, 0x52, 0x55, 0x53, 0x54, // 15056 + 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, // 15072 + 0x03, 0x13, 0x25, 0x55, 0x53, 0x45, 0x52, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x45, 0x43, 0x43, // 15088 + 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, // 15104 + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, // 15120 + 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, // 15136 + 0x1a, 0xac, 0x54, 0x5a, 0xa9, 0xf9, 0x68, 0x23, 0xe7, 0x7a, 0xd5, 0x24, 0x6f, 0x53, 0xc6, 0x5a, // 15152 + 0xd8, 0x4b, 0xab, 0xc6, 0xd5, 0xb6, 0xd1, 0xe6, 0x73, 0x71, 0xae, 0xdd, 0x9c, 0xd6, 0x0c, 0x61, // 15168 + 0xfd, 0xdb, 0xa0, 0x89, 0x03, 0xb8, 0x05, 0x14, 0xec, 0x57, 0xce, 0xee, 0x5d, 0x3f, 0xe2, 0x21, // 15184 + 0xb3, 0xce, 0xf7, 0xd4, 0x8a, 0x79, 0xe0, 0xa3, 0x83, 0x7e, 0x2d, 0x97, 0xd0, 0x61, 0xc4, 0xf1, // 15200 + 0x99, 0xdc, 0x25, 0x91, 0x63, 0xab, 0x7f, 0x30, 0xa3, 0xb4, 0x70, 0xe2, 0xc7, 0xa1, 0x33, 0x9c, // 15216 + 0xf3, 0xbf, 0x2e, 0x5c, 0x53, 0xb1, 0x5f, 0xb3, 0x7d, 0x32, 0x7f, 0x8a, 0x34, 0xe3, 0x79, 0x79, // 15232 + 0x00, 0x8b, 0x02, 0x26, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, // 15248 + 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, 0x4e, // 15264 + 0x65, 0x77, 0x20, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, // 15280 + 0x04, 0x07, 0x13, 0x0b, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31, // 15296 + 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x54, 0x68, 0x65, 0x20, 0x55, 0x53, // 15312 + 0x45, 0x52, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, // 15328 + 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x55, 0x53, 0x45, 0x52, 0x54, 0x72, // 15344 + 0x75, 0x73, 0x74, 0x20, 0x52, 0x53, 0x41, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, // 15360 + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, // 15376 + 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, // 15392 + 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, // 15408 + 0x80, 0x12, 0x65, 0x17, 0x36, 0x0e, 0xc3, 0xdb, 0x08, 0xb3, 0xd0, 0xac, 0x57, 0x0d, 0x76, 0xed, // 15424 + 0xcd, 0x27, 0xd3, 0x4c, 0xad, 0x50, 0x83, 0x61, 0xe2, 0xaa, 0x20, 0x4d, 0x09, 0x2d, 0x64, 0x09, // 15440 + 0xdc, 0xce, 0x89, 0x9f, 0xcc, 0x3d, 0xa9, 0xec, 0xf6, 0xcf, 0xc1, 0xdc, 0xf1, 0xd3, 0xb1, 0xd6, // 15456 + 0x7b, 0x37, 0x28, 0x11, 0x2b, 0x47, 0xda, 0x39, 0xc6, 0xbc, 0x3a, 0x19, 0xb4, 0x5f, 0xa6, 0xbd, // 15472 + 0x7d, 0x9d, 0xa3, 0x63, 0x42, 0xb6, 0x76, 0xf2, 0xa9, 0x3b, 0x2b, 0x91, 0xf8, 0xe2, 0x6f, 0xd0, // 15488 + 0xec, 0x16, 0x20, 0x90, 0x09, 0x3e, 0xe2, 0xe8, 0x74, 0xc9, 0x18, 0xb4, 0x91, 0xd4, 0x62, 0x64, // 15504 + 0xdb, 0x7f, 0xa3, 0x06, 0xf1, 0x88, 0x18, 0x6a, 0x90, 0x22, 0x3c, 0xbc, 0xfe, 0x13, 0xf0, 0x87, // 15520 + 0x14, 0x7b, 0xf6, 0xe4, 0x1f, 0x8e, 0xd4, 0xe4, 0x51, 0xc6, 0x11, 0x67, 0x46, 0x08, 0x51, 0xcb, // 15536 + 0x86, 0x14, 0x54, 0x3f, 0xbc, 0x33, 0xfe, 0x7e, 0x6c, 0x9c, 0xff, 0x16, 0x9d, 0x18, 0xbd, 0x51, // 15552 + 0x8e, 0x35, 0xa6, 0xa7, 0x66, 0xc8, 0x72, 0x67, 0xdb, 0x21, 0x66, 0xb1, 0xd4, 0x9b, 0x78, 0x03, // 15568 + 0xc0, 0x50, 0x3a, 0xe8, 0xcc, 0xf0, 0xdc, 0xbc, 0x9e, 0x4c, 0xfe, 0xaf, 0x05, 0x96, 0x35, 0x1f, // 15584 + 0x57, 0x5a, 0xb7, 0xff, 0xce, 0xf9, 0x3d, 0xb7, 0x2c, 0xb6, 0xf6, 0x54, 0xdd, 0xc8, 0xe7, 0x12, // 15600 + 0x3a, 0x4d, 0xae, 0x4c, 0x8a, 0xb7, 0x5c, 0x9a, 0xb4, 0xb7, 0x20, 0x3d, 0xca, 0x7f, 0x22, 0x34, // 15616 + 0xae, 0x7e, 0x3b, 0x68, 0x66, 0x01, 0x44, 0xe7, 0x01, 0x4e, 0x46, 0x53, 0x9b, 0x33, 0x60, 0xf7, // 15632 + 0x94, 0xbe, 0x53, 0x37, 0x90, 0x73, 0x43, 0xf3, 0x32, 0xc3, 0x53, 0xef, 0xdb, 0xaa, 0xfe, 0x74, // 15648 + 0x4e, 0x69, 0xc7, 0x6b, 0x8c, 0x60, 0x93, 0xde, 0xc4, 0xc7, 0x0c, 0xdf, 0xe1, 0x32, 0xae, 0xcc, // 15664 + 0x93, 0x3b, 0x51, 0x78, 0x95, 0x67, 0x8b, 0xee, 0x3d, 0x56, 0xfe, 0x0c, 0xd0, 0x69, 0x0f, 0x1b, // 15680 + 0x0f, 0xf3, 0x25, 0x26, 0x6b, 0x33, 0x6d, 0xf7, 0x6e, 0x47, 0xfa, 0x73, 0x43, 0xe5, 0x7e, 0x0e, // 15696 + 0xa5, 0x66, 0xb1, 0x29, 0x7c, 0x32, 0x84, 0x63, 0x55, 0x89, 0xc4, 0x0d, 0xc1, 0x93, 0x54, 0x30, // 15712 + 0x19, 0x13, 0xac, 0xd3, 0x7d, 0x37, 0xa7, 0xeb, 0x5d, 0x3a, 0x6c, 0x35, 0x5c, 0xdb, 0x41, 0xd7, // 15728 + 0x12, 0xda, 0xa9, 0x49, 0x0b, 0xdf, 0xd8, 0x80, 0x8a, 0x09, 0x93, 0x62, 0x8e, 0xb5, 0x66, 0xcf, // 15744 + 0x25, 0x88, 0xcd, 0x84, 0xb8, 0xb1, 0x3f, 0xa4, 0x39, 0x0f, 0xd9, 0x02, 0x9e, 0xeb, 0x12, 0x4c, // 15760 + 0x95, 0x7c, 0xf3, 0x6b, 0x05, 0xa9, 0x5e, 0x16, 0x83, 0xcc, 0xb8, 0x67, 0xe2, 0xe8, 0x13, 0x9d, // 15776 + 0xcc, 0x5b, 0x82, 0xd3, 0x4c, 0xb3, 0xed, 0x5b, 0xff, 0xde, 0xe5, 0x73, 0xac, 0x23, 0x3b, 0x2d, // 15792 + 0x00, 0xbf, 0x35, 0x55, 0x74, 0x09, 0x49, 0xd8, 0x49, 0x58, 0x1a, 0x7f, 0x92, 0x36, 0xe6, 0x51, // 15808 + 0x92, 0x0e, 0xf3, 0x26, 0x7d, 0x1c, 0x4d, 0x17, 0xbc, 0xc9, 0xec, 0x43, 0x26, 0xd0, 0xbf, 0x41, // 15824 + 0x5f, 0x40, 0xa9, 0x44, 0x44, 0xf4, 0x99, 0xe7, 0x57, 0x87, 0x9e, 0x50, 0x1f, 0x57, 0x54, 0xa8, // 15840 + 0x3e, 0xfd, 0x74, 0x63, 0x2f, 0xb1, 0x50, 0x65, 0x09, 0xe6, 0x58, 0x42, 0x2e, 0x43, 0x1a, 0x4c, // 15856 + 0xb4, 0xf0, 0x25, 0x47, 0x59, 0xfa, 0x04, 0x1e, 0x93, 0xd4, 0x26, 0x46, 0x4a, 0x50, 0x81, 0xb2, // 15872 + 0xde, 0xbe, 0x78, 0xb7, 0xfc, 0x67, 0x15, 0xe1, 0xc9, 0x57, 0x84, 0x1e, 0x0f, 0x63, 0xd6, 0xe9, // 15888 + 0x62, 0xba, 0xd6, 0x5f, 0x55, 0x2e, 0xea, 0x5c, 0xc6, 0x28, 0x08, 0x04, 0x25, 0x39, 0xb8, 0x0e, // 15904 + 0x2b, 0xa9, 0xf2, 0x4c, 0x97, 0x1c, 0x07, 0x3f, 0x0d, 0x52, 0xf5, 0xed, 0xef, 0x2f, 0x82, 0x0f, // 15920 + 0x02, 0x03, 0x01, 0x00, 0x01, 0x00, 0x92, 0x01, 0x26, 0x30, 0x81, 0x8f, 0x31, 0x0b, 0x30, 0x09, // 15936 + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, // 15952 + 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, // 15968 + 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, // 15984 + 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, // 16000 + 0x69, 0x65, 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, // 16016 + 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, // 16032 + 0x13, 0x29, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x52, 0x6f, 0x6f, 0x74, // 16048 + 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, // 16064 + 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, // 16080 + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, // 16096 + 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbd, 0xed, 0xc1, 0x03, // 16112 + 0xfc, 0xf6, 0x8f, 0xfc, 0x02, 0xb1, 0x6f, 0x5b, 0x9f, 0x48, 0xd9, 0x9d, 0x79, 0xe2, 0xa2, 0xb7, // 16128 + 0x03, 0x61, 0x56, 0x18, 0xc3, 0x47, 0xb6, 0xd7, 0xca, 0x3d, 0x35, 0x2e, 0x89, 0x43, 0xf7, 0xa1, // 16144 + 0x69, 0x9b, 0xde, 0x8a, 0x1a, 0xfd, 0x13, 0x20, 0x9c, 0xb4, 0x49, 0x77, 0x32, 0x29, 0x56, 0xfd, // 16160 + 0xb9, 0xec, 0x8c, 0xdd, 0x22, 0xfa, 0x72, 0xdc, 0x27, 0x61, 0x97, 0xee, 0xf6, 0x5a, 0x84, 0xec, // 16176 + 0x6e, 0x19, 0xb9, 0x89, 0x2c, 0xdc, 0x84, 0x5b, 0xd5, 0x74, 0xfb, 0x6b, 0x5f, 0xc5, 0x89, 0xa5, // 16192 + 0x10, 0x52, 0x89, 0x46, 0x55, 0xf4, 0xb8, 0x75, 0x1c, 0xe6, 0x7f, 0xe4, 0x54, 0xae, 0x4b, 0xf8, // 16208 + 0x55, 0x72, 0x57, 0x02, 0x19, 0xf8, 0x17, 0x71, 0x59, 0xeb, 0x1e, 0x28, 0x07, 0x74, 0xc5, 0x9d, // 16224 + 0x48, 0xbe, 0x6c, 0xb4, 0xf4, 0xa4, 0xb0, 0xf3, 0x64, 0x37, 0x79, 0x92, 0xc0, 0xec, 0x46, 0x5e, // 16240 + 0x7f, 0xe1, 0x6d, 0x53, 0x4c, 0x62, 0xaf, 0xcd, 0x1f, 0x0b, 0x63, 0xbb, 0x3a, 0x9d, 0xfb, 0xfc, // 16256 + 0x79, 0x00, 0x98, 0x61, 0x74, 0xcf, 0x26, 0x82, 0x40, 0x63, 0xf3, 0xb2, 0x72, 0x6a, 0x19, 0x0d, // 16272 + 0x99, 0xca, 0xd4, 0x0e, 0x75, 0xcc, 0x37, 0xfb, 0x8b, 0x89, 0xc1, 0x59, 0xf1, 0x62, 0x7f, 0x5f, // 16288 + 0xb3, 0x5f, 0x65, 0x30, 0xf8, 0xa7, 0xb7, 0x4d, 0x76, 0x5a, 0x1e, 0x76, 0x5e, 0x34, 0xc0, 0xe8, // 16304 + 0x96, 0x56, 0x99, 0x8a, 0xb3, 0xf0, 0x7f, 0xa4, 0xcd, 0xbd, 0xdc, 0x32, 0x31, 0x7c, 0x91, 0xcf, // 16320 + 0xe0, 0x5f, 0x11, 0xf8, 0x6b, 0xaa, 0x49, 0x5c, 0xd1, 0x99, 0x94, 0xd1, 0xa2, 0xe3, 0x63, 0x5b, // 16336 + 0x09, 0x76, 0xb5, 0x56, 0x62, 0xe1, 0x4b, 0x74, 0x1d, 0x96, 0xd4, 0x26, 0xd4, 0x08, 0x04, 0x59, // 16352 + 0xd0, 0x98, 0x0e, 0x0e, 0xe6, 0xde, 0xfc, 0xc3, 0xec, 0x1f, 0x90, 0xf1, 0x02, 0x03, 0x01, 0x00, // 16368 + 0x01, 0x00, 0x9b, 0x01, 0x26, 0x30, 0x81, 0x98, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, // 16384 + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, // 16400 + 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, // 16416 + 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, // 16432 + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, // 16448 + 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, // 16464 + 0x6e, 0x63, 0x2e, 0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x32, 0x53, 0x74, // 16480 + 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, // 16496 + 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, // 16512 + 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47, 0x32, // 16528 + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, // 16544 + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, // 16560 + 0x00, 0xd5, 0x0c, 0x3a, 0xc4, 0x2a, 0xf9, 0x4e, 0xe2, 0xf5, 0xbe, 0x19, 0x97, 0x5f, 0x8e, 0x88, // 16576 + 0x53, 0xb1, 0x1f, 0x3f, 0xcb, 0xcf, 0x9f, 0x20, 0x13, 0x6d, 0x29, 0x3a, 0xc8, 0x0f, 0x7d, 0x3c, // 16592 + 0xf7, 0x6b, 0x76, 0x38, 0x63, 0xd9, 0x36, 0x60, 0xa8, 0x9b, 0x5e, 0x5c, 0x00, 0x80, 0xb2, 0x2f, // 16608 + 0x59, 0x7f, 0xf6, 0x87, 0xf9, 0x25, 0x43, 0x86, 0xe7, 0x69, 0x1b, 0x52, 0x9a, 0x90, 0xe1, 0x71, // 16624 + 0xe3, 0xd8, 0x2d, 0x0d, 0x4e, 0x6f, 0xf6, 0xc8, 0x49, 0xd9, 0xb6, 0xf3, 0x1a, 0x56, 0xae, 0x2b, // 16640 + 0xb6, 0x74, 0x14, 0xeb, 0xcf, 0xfb, 0x26, 0xe3, 0x1a, 0xba, 0x1d, 0x96, 0x2e, 0x6a, 0x3b, 0x58, // 16656 + 0x94, 0x89, 0x47, 0x56, 0xff, 0x25, 0xa0, 0x93, 0x70, 0x53, 0x83, 0xda, 0x84, 0x74, 0x14, 0xc3, // 16672 + 0x67, 0x9e, 0x04, 0x68, 0x3a, 0xdf, 0x8e, 0x40, 0x5a, 0x1d, 0x4a, 0x4e, 0xcf, 0x43, 0x91, 0x3b, // 16688 + 0xe7, 0x56, 0xd6, 0x00, 0x70, 0xcb, 0x52, 0xee, 0x7b, 0x7d, 0xae, 0x3a, 0xe7, 0xbc, 0x31, 0xf9, // 16704 + 0x45, 0xf6, 0xc2, 0x60, 0xcf, 0x13, 0x59, 0x02, 0x2b, 0x80, 0xcc, 0x34, 0x47, 0xdf, 0xb9, 0xde, // 16720 + 0x90, 0x65, 0x6d, 0x02, 0xcf, 0x2c, 0x91, 0xa6, 0xa6, 0xe7, 0xde, 0x85, 0x18, 0x49, 0x7c, 0x66, // 16736 + 0x4e, 0xa3, 0x3a, 0x6d, 0xa9, 0xb5, 0xee, 0x34, 0x2e, 0xba, 0x0d, 0x03, 0xb8, 0x33, 0xdf, 0x47, // 16752 + 0xeb, 0xb1, 0x6b, 0x8d, 0x25, 0xd9, 0x9b, 0xce, 0x81, 0xd1, 0x45, 0x46, 0x32, 0x96, 0x70, 0x87, // 16768 + 0xde, 0x02, 0x0e, 0x49, 0x43, 0x85, 0xb6, 0x6c, 0x73, 0xbb, 0x64, 0xea, 0x61, 0x41, 0xac, 0xc9, // 16784 + 0xd4, 0x54, 0xdf, 0x87, 0x2f, 0xc7, 0x22, 0xb2, 0x26, 0xcc, 0x9f, 0x59, 0x54, 0x68, 0x9f, 0xfc, // 16800 + 0xbe, 0x2a, 0x2f, 0xc4, 0x55, 0x1c, 0x75, 0x40, 0x60, 0x17, 0x85, 0x02, 0x55, 0x39, 0x8b, 0x7f, // 16816 + 0x05, 0x02, 0x03, 0x01, 0x00, 0x01, // 16822 }; - diff --git a/Firmware/RTK_Everywhere/ZED.ino b/Firmware/RTK_Everywhere/ZED.ino index 15addaf9a..b8e9a4684 100644 --- a/Firmware/RTK_Everywhere/ZED.ino +++ b/Firmware/RTK_Everywhere/ZED.ino @@ -893,47 +893,44 @@ bool zedBeginPPS() // Enable data output from the NEO bool zedEnableLBandCommunication() { -/* - Paul's Notes on (NEO-D9S) L-Band: - - Torch will receive PointPerfect SPARTN via IP, run it through the PPL, and feed RTCM to the UM980. No L-Band... - - The EVK has ZED-F9P and NEO-D9S. But there are two versions of the PCB: - v1.1 PCB : - Both ZED and NEO are on the i2c_0 I2C bus (the OLED is on i2c_1) - ZED UART1 is connected to the ESP32 (pins 25 and 33) only - ZED UART2 is connected to the I/O connector only - NEO UART1 is connected to test points only - NEO UART2 is not connected - v1.0 PCB (the one we are currently using for code development) : - Both ZED and NEO are on the i2c_0 I2C bus - ZED UART1 is connected to NEO UART1 only - not to ESP32 (Big mistake! Makes BT and Logging much more complicated...) - ZED UART2 is connected to the I/O connector only - NEO UART2 is not connected - - Facet v2 hasn't been built yet. The v2.01 PCB probably won't get built as it needs the new soft power switch. - When v2.10 (?) gets built : - Both ZED and NEO are on the I2C bus - ZED UART1 is connected to the ESP32 (pins 14 and 13) and also to the DATA connector via the Mux (output only) - ZED UART2 is connected to the RADIO connector only - NEO UART1 is not connected - NEO UART2 TX is connected to ESP32 pin 4. If the ESP32 has a UART spare - and it probably does - the PMP data - can go over this connection and avoid having double-PMP traffic on I2C. Neat huh?! - - Facet mosaic v1.0 PCB has been built, but needs the new soft power switch and some other minor mods. - X5 COM1 is connected to the ESP32 (pins 13 and 14) - RTCM from PPL, NMEA and RTCM to PPL and Bluetooth - X5 COM2 is connected to the RADIO connector only - X5 COM3 is connected to the DATA connector via the Mux (I/O) - X5 COM4 is connected to the ESP32 (pins 4 and 25) - raw L-Band to PPL, control from ESP32 to X5 ? - - So, what does all of this mean? - EVK v1.0 supports direct NEO to ZED UART communication, but V1.1 will not. There is no point in supporting it here. - Facet v2 can pipe NEO UART PMP data to the ZED (over I2C or maybe UART), but the hardware doesn't exist yet so there - is no point in adding that feature yet... TODO. - So, right now, we should assume NEO PMP data will arrive via I2C, and will get pushed to the ZED via I2C if the - corrections priority permits. - Deleting: useI2cForLbandCorrections, useI2cForLbandCorrectionsConfigured and rtcmTimeoutBeforeUsingLBand_s -*/ + /* + Paul's Notes on (NEO-D9S) L-Band: + + Torch will receive PointPerfect SPARTN via IP, run it through the PPL, and feed RTCM to the UM980. No L-Band... + + The EVK has ZED-F9P and NEO-D9S. But there are two versions of the PCB: + v1.1 PCB : + Both ZED and NEO are on the i2c_0 I2C bus (the OLED is on i2c_1) + ZED UART1 is connected to the ESP32 (pins 25 and 33) only + ZED UART2 is connected to the I/O connector only + NEO UART1 is connected to test points only + NEO UART2 is not connected + v1.0 PCB (the one we are currently using for code development) : + Both ZED and NEO are on the i2c_0 I2C bus + ZED UART1 is connected to NEO UART1 only - not to ESP32 (Big mistake! Makes BT and Logging much more + complicated...) ZED UART2 is connected to the I/O connector only NEO UART2 is not connected + + Facet v2 hasn't been built yet. The v2.01 PCB probably won't get built as it needs the new soft power switch. + When v2.10 (?) gets built : + Both ZED and NEO are on the I2C bus + ZED UART1 is connected to the ESP32 (pins 14 and 13) and also to the DATA connector via the Mux (output + only) ZED UART2 is connected to the RADIO connector only NEO UART1 is not connected NEO UART2 TX is connected to + ESP32 pin 4. If the ESP32 has a UART spare - and it probably does - the PMP data can go over this connection and + avoid having double-PMP traffic on I2C. Neat huh?! + + Facet mosaic v1.0 PCB has been built, but needs the new soft power switch and some other minor mods. + X5 COM1 is connected to the ESP32 (pins 13 and 14) - RTCM from PPL, NMEA and RTCM to PPL and Bluetooth + X5 COM2 is connected to the RADIO connector only + X5 COM3 is connected to the DATA connector via the Mux (I/O) + X5 COM4 is connected to the ESP32 (pins 4 and 25) - raw L-Band to PPL, control from ESP32 to X5 ? + + So, what does all of this mean? + EVK v1.0 supports direct NEO to ZED UART communication, but V1.1 will not. There is no point in supporting it + here. Facet v2 can pipe NEO UART PMP data to the ZED (over I2C or maybe UART), but the hardware doesn't exist yet + so there is no point in adding that feature yet... TODO. So, right now, we should assume NEO PMP data will arrive + via I2C, and will get pushed to the ZED via I2C if the corrections priority permits. Deleting: + useI2cForLbandCorrections, useI2cForLbandCorrectionsConfigured and rtcmTimeoutBeforeUsingLBand_s + */ bool response = true; @@ -948,20 +945,17 @@ bool zedEnableLBandCommunication() response &= i2cLBand.newCfgValset(); - response &= - i2cLBand.addCfgValset(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_I2C, 1); // Enable UBX-RXM-PMP on NEO's I2C port + response &= i2cLBand.addCfgValset(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_I2C, 1); // Enable UBX-RXM-PMP on NEO's I2C port response &= i2cLBand.addCfgValset(UBLOX_CFG_UART1OUTPROT_UBX, 0); // Disable UBX output on NEO's UART1 - - response &= - i2cLBand.addCfgValset(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART1, 0); // Disable UBX-RXM-PMP on NEO's UART1 + + response &= i2cLBand.addCfgValset(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART1, 0); // Disable UBX-RXM-PMP on NEO's UART1 // TODO: change this as needed for Facet v2 response &= i2cLBand.addCfgValset(UBLOX_CFG_UART2OUTPROT_UBX, 0); // Disable UBX output on NEO's UART2 // TODO: change this as needed for Facet v2 - response &= - i2cLBand.addCfgValset(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART2, 0); // Disable UBX-RXM-PMP on NEO's UART2 + response &= i2cLBand.addCfgValset(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART2, 0); // Disable UBX-RXM-PMP on NEO's UART2 response &= i2cLBand.sendCfgValset(); } @@ -999,8 +993,7 @@ bool zedDisableLBandCommunication() response &= i2cLBand.addCfgValset(UBLOX_CFG_UART2OUTPROT_UBX, 0); // Disable UBX output from NEO's UART2 // TODO: change this as needed for Facet v2 - response &= - i2cLBand.addCfgValset(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART2, 0); // Disable UBX-RXM-PMP on NEO's UART2 + response &= i2cLBand.addCfgValset(UBLOX_CFG_MSGOUT_UBX_RXM_PMP_UART2, 0); // Disable UBX-RXM-PMP on NEO's UART2 response &= i2cLBand.sendCfgValset(); } @@ -1446,8 +1439,8 @@ void zedApplyPointPerfectKeys() if (gnssFirmwareVersionInt < 130) { systemPrintln("Error: PointPerfect corrections currently supported by ZED-F9P firmware v1.30 and above. " - "Please upgrade your ZED firmware: " - "https://learn.sparkfun.com/tutorials/how-to-upgrade-firmware-of-a-u-blox-gnss-receiver"); + "Please upgrade your ZED firmware: " + "https://learn.sparkfun.com/tutorials/how-to-upgrade-firmware-of-a-u-blox-gnss-receiver"); return; } @@ -1482,11 +1475,11 @@ void zedApplyPointPerfectKeys() theGNSS->setVal8(UBLOX_CFG_MSGOUT_UBX_RXM_COR_I2C, 1); // Enable UBX-RXM-COR messages on I2C theGNSS->setVal8(UBLOX_CFG_NAVHPG_DGNSSMODE, - 3); // Set the differential mode - ambiguities are fixed whenever possible + 3); // Set the differential mode - ambiguities are fixed whenever possible bool response = theGNSS->setDynamicSPARTNKeys(currentKeyLengthBytes, currentKeyGPSWeek, currentKeyGPSToW, - settings.pointPerfectCurrentKey, nextKeyLengthBytes, - nextKeyGPSWeek, nextKeyGPSToW, settings.pointPerfectNextKey); + settings.pointPerfectCurrentKey, nextKeyLengthBytes, + nextKeyGPSWeek, nextKeyGPSToW, settings.pointPerfectNextKey); if (response == false) systemPrintln("setDynamicSPARTNKeys failed"); @@ -1569,7 +1562,8 @@ void zedMenuMessages() int incoming = getUserInputNumber(); // Returns EXIT, TIMEOUT, or long if (incoming == 1) - zedMenuMessagesSubtype(settings.ubxMessageRates, "NMEA_"); // The following _ avoids listing NMEANAV2 messages + zedMenuMessagesSubtype(settings.ubxMessageRates, + "NMEA_"); // The following _ avoids listing NMEANAV2 messages else if (incoming == 2) zedMenuMessagesSubtype(settings.ubxMessageRates, "RTCM"); else if (incoming == 3) @@ -1796,7 +1790,7 @@ uint8_t zedGetNAV2MessageCount() int endOfBlock = 0; zedSetMessageOffsets(&ubxMessages[0], "NAV2", startOfBlock, - endOfBlock); // Find start and stop of given messageType in message array + endOfBlock); // Find start and stop of given messageType in message array for (int x = 0; x < (endOfBlock - startOfBlock); x++) { @@ -1805,7 +1799,7 @@ uint8_t zedGetNAV2MessageCount() } zedSetMessageOffsets(&ubxMessages[0], "NMEANAV2", startOfBlock, - endOfBlock); // Find start and stop of given messageType in message array + endOfBlock); // Find start and stop of given messageType in message array for (int x = 0; x < (endOfBlock - startOfBlock); x++) { @@ -1815,7 +1809,7 @@ uint8_t zedGetNAV2MessageCount() return (enabledMessages); } - else + else systemPrintln("zedGetNAV2MessageCount() Platform not supported"); return (false); @@ -1835,7 +1829,7 @@ bool zedSetMessageRateByName(const char *msgName, uint8_t msgRate) } } } - else + else systemPrintln("zedSetMessageRateByName() Platform not supported"); systemPrintf("zedSetMessageRateByName: %s not found\r\n", msgName); @@ -1849,8 +1843,8 @@ uint8_t zedGetMessageRateByName(const char *msgName) { return (settings.ubxMessageRates[zedGetMessageNumberByName(msgName)]); } - else - systemPrintln("zedGetMessageRateByName() Platform not supported"); + else + systemPrintln("zedGetMessageRateByName() Platform not supported"); return (0); } diff --git a/Firmware/RTK_Everywhere/menuBase.ino b/Firmware/RTK_Everywhere/menuBase.ino index befd89ae5..7ec6da991 100644 --- a/Firmware/RTK_Everywhere/menuBase.ino +++ b/Firmware/RTK_Everywhere/menuBase.ino @@ -246,8 +246,8 @@ void menuBase() { // Arbitrary 0.1m minimum - getNewSetting("Enter the positional accuracy required before Survey-In begins", 0.1, - (double)maxSurveyInStartingAccuracy, &settings.surveyInStartingAccuracy); + getNewSetting("Enter the positional accuracy required before Survey-In begins", 0.1, + (double)maxSurveyInStartingAccuracy, &settings.surveyInStartingAccuracy); } else if (incoming == 7) diff --git a/Firmware/RTK_Everywhere/menuCorrectionsPriorities.ino b/Firmware/RTK_Everywhere/menuCorrectionsPriorities.ino index 20995329b..dcf2b42a6 100644 --- a/Firmware/RTK_Everywhere/menuCorrectionsPriorities.ino +++ b/Firmware/RTK_Everywhere/menuCorrectionsPriorities.ino @@ -50,7 +50,8 @@ void menuCorrectionsPriorities() if (incoming == 1) { - getNewSetting("Enter new correction source lifetime in seconds (5-120): ", 5, 120, &settings.correctionsSourcesLifetime_s); + getNewSetting("Enter new correction source lifetime in seconds (5-120): ", 5, 120, + &settings.correctionsSourcesLifetime_s); } else if ((incoming >= 'a') && (incoming < ('a' + correctionsSource::CORR_NUM))) { @@ -184,7 +185,8 @@ bool isHighestRegisteredCorrectionsSource(correctionsSource theSource) if (highestPriority == (int)CORR_NUM) return false; // This is actually an error. No sources were found... - return (settings.correctionsSourcesPriority[(int)theSource] <= highestPriority); // Return true if theSource is highest + return (settings.correctionsSourcesPriority[(int)theSource] <= + highestPriority); // Return true if theSource is highest } // Update when this corrections source was lastSeen. (Re)register it if required. diff --git a/Firmware/RTK_Everywhere/menuGNSS.ino b/Firmware/RTK_Everywhere/menuGNSS.ino index a6b9efb98..68141f6e6 100644 --- a/Firmware/RTK_Everywhere/menuGNSS.ino +++ b/Firmware/RTK_Everywhere/menuGNSS.ino @@ -237,7 +237,7 @@ void menuGNSS() if (getNewSetting("Enter minimum satellite signal level for navigation in dBHz", 0, 90, &minCNO) == INPUT_RESPONSE_VALID) { - gnssSetMinCno(minCNO); //Set the setting and configure the GNSS receiver + gnssSetMinCno(minCNO); // Set the setting and configure the GNSS receiver } } diff --git a/Firmware/RTK_Everywhere/menuMain.ino b/Firmware/RTK_Everywhere/menuMain.ino index e97cfbdad..76949c007 100644 --- a/Firmware/RTK_Everywhere/menuMain.ino +++ b/Firmware/RTK_Everywhere/menuMain.ino @@ -107,7 +107,7 @@ void menuMain() ethernetWebServerStopESP32W5500(); - settings.updateGNSSSettings = false; // On the next boot, no need to update the GNSS on this profile + settings.updateGNSSSettings = false; // On the next boot, no need to update the GNSS on this profile settings.lastState = STATE_BASE_NOT_STARTED; // Record the _next_ state for POR recordSystemSettings(); @@ -133,7 +133,7 @@ void menuMain() getFirmwareVersion(versionString, sizeof(versionString), true); systemPrintf("SparkFun RTK %s %s\r\n", platformPrefix, versionString); - #ifdef COMPILE_BT +#ifdef COMPILE_BT if (settings.bluetoothRadioType == BLUETOOTH_RADIO_SPP_AND_BLE) systemPrint("** Bluetooth SPP and BLE broadcasting as: "); @@ -143,9 +143,9 @@ void menuMain() systemPrint("** Bluetooth Low-Energy broadcasting as: "); systemPrint(deviceName); systemPrintln(" **"); - #else // COMPILE_BT +#else // COMPILE_BT systemPrintln("** Bluetooth Not Compiled **"); - #endif // COMPILE_BT +#endif // COMPILE_BT systemPrintln("Menu: Main"); @@ -160,39 +160,39 @@ void menuMain() if (productVariant != RTK_TORCH) // Torch does not have logging systemPrintln("5) Configure Logging"); - #ifdef COMPILE_WIFI +#ifdef COMPILE_WIFI systemPrintln("6) Configure WiFi"); - #else // COMPILE_WIFI +#else // COMPILE_WIFI systemPrintln("6) **WiFi Not Compiled**"); - #endif // COMPILE_WIFI +#endif // COMPILE_WIFI - #if COMPILE_NETWORK +#if COMPILE_NETWORK systemPrintln("7) Configure TCP/UDP"); - #else // COMPILE_NETWORK +#else // COMPILE_NETWORK systemPrintln("7) **TCP/UDP Not Compiled**"); - #endif // COMPILE_NETWORK +#endif // COMPILE_NETWORK - #ifdef COMPILE_ETHERNET +#ifdef COMPILE_ETHERNET if (present.ethernet_ws5500 == true) systemPrintln("e) Configure Ethernet"); - #endif // COMPILE_ETHERNET +#endif // COMPILE_ETHERNET systemPrintln("f) Firmware Update"); systemPrintln("i) Configure Corrections Priorities"); - #ifdef COMPILE_ETHERNET +#ifdef COMPILE_ETHERNET if (present.ethernet_ws5500 == true) systemPrintln("n) Configure NTP"); - #endif // COMPILE_ETHERNET +#endif // COMPILE_ETHERNET systemPrintln("p) Configure PointPerfect"); - #ifdef COMPILE_ESPNOW +#ifdef COMPILE_ESPNOW systemPrintln("r) Configure Radios"); - #else // COMPILE_ESPNOW +#else // COMPILE_ESPNOW systemPrintln("r) **ESP-Now Not Compiled**"); - #endif // COMPILE_ESPNOW +#endif // COMPILE_ESPNOW systemPrintln("s) Configure System"); @@ -236,10 +236,10 @@ void menuMain() menuUserProfiles(); else if (incoming == 'p') menuPointPerfect(); - #ifdef COMPILE_ESPNOW +#ifdef COMPILE_ESPNOW else if (incoming == 'r') menuRadio(); - #endif // COMPILE_ESPNOW +#endif // COMPILE_ESPNOW else if (incoming == 's') menuSystem(); else if (incoming == 't' && (present.imu_im19 == true)) @@ -283,7 +283,6 @@ void menuMain() gnssSaveConfiguration(); recordSystemSettings(); // Once all menus have exited, record the new settings to LittleFS and config file - } if (settings.debugGnss == true) @@ -563,8 +562,8 @@ void menuRadio() { settings.enableEspNow ^= 1; - //Start ESP-NOW so that getChannel runs correctly - if(settings.enableEspNow == true) + // Start ESP-NOW so that getChannel runs correctly + if (settings.enableEspNow == true) espnowStart(); else espnowStop(); diff --git a/Firmware/RTK_Everywhere/menuMessages.ino b/Firmware/RTK_Everywhere/menuMessages.ino index b8d564c84..28f24abd9 100644 --- a/Firmware/RTK_Everywhere/menuMessages.ino +++ b/Firmware/RTK_Everywhere/menuMessages.ino @@ -601,7 +601,6 @@ void checkGNSSArrayDefaults() if (present.gnss_zedf9p) { - if (settings.ubxMessageRates[0] == 254) { defaultsApplied = true; @@ -629,7 +628,6 @@ void checkGNSSArrayDefaults() } else if (present.gnss_um980) { - if (settings.um980Constellations[0] == 254) { defaultsApplied = true; diff --git a/Firmware/RTK_Everywhere/menuPP.ino b/Firmware/RTK_Everywhere/menuPP.ino index 53d245929..8201e5218 100644 --- a/Firmware/RTK_Everywhere/menuPP.ino +++ b/Firmware/RTK_Everywhere/menuPP.ino @@ -1646,7 +1646,7 @@ void updateLBand() } else if (gnssIsRTKFix() && rtkTimeToFixMs == 0) { - lbandTimeFloatStarted = 0; //Restart timer in case we drop from RTK Fix + lbandTimeFloatStarted = 0; // Restart timer in case we drop from RTK Fix rtkTimeToFixMs = millis(); if (settings.debugCorrections == true) diff --git a/Firmware/RTK_Everywhere/menuPorts.ino b/Firmware/RTK_Everywhere/menuPorts.ino index 44c4bd282..e9004b1db 100644 --- a/Firmware/RTK_Everywhere/menuPorts.ino +++ b/Firmware/RTK_Everywhere/menuPorts.ino @@ -2,17 +2,17 @@ void menuPorts() { if (present.portDataMux == true) { - //RTK Facet mosaic, Facet v2 + // RTK Facet mosaic, Facet v2 menuPortsMultiplexed(); } else if (productVariant == RTK_TORCH) { - //RTK Torch + // RTK Torch menuPortsUsb(); } else { - //RTK EVK + // RTK EVK menuPortsNoMux(); } } @@ -25,7 +25,8 @@ void menuPortsUsb() systemPrintln(); systemPrintln("Menu: Ports"); - systemPrintf("1) Output GNSS data to USB serial: %s\r\n", settings.enableGnssToUsbSerial ? "Enabled" : "Disabled"); + systemPrintf("1) Output GNSS data to USB serial: %s\r\n", + settings.enableGnssToUsbSerial ? "Enabled" : "Disabled"); systemPrintln("x) Exit"); diff --git a/Firmware/RTK_Everywhere/support.ino b/Firmware/RTK_Everywhere/support.ino index 5fea17e81..353d1a587 100644 --- a/Firmware/RTK_Everywhere/support.ino +++ b/Firmware/RTK_Everywhere/support.ino @@ -20,13 +20,11 @@ int systemRead() void systemWrite(const uint8_t *buffer, uint16_t length) { // Output data to bluetooth if necessary - if ((printEndpoint == PRINT_ENDPOINT_ALL) - || (printEndpoint == PRINT_ENDPOINT_BLUETOOTH)) + if ((printEndpoint == PRINT_ENDPOINT_ALL) || (printEndpoint == PRINT_ENDPOINT_BLUETOOTH)) bluetoothWrite(buffer, length); // Output data to USB serial if necessary - if ((printEndpoint != PRINT_ENDPOINT_BLUETOOTH) - && (!forwardGnssDataToUsbSerial)) + if ((printEndpoint != PRINT_ENDPOINT_BLUETOOTH) && (!forwardGnssDataToUsbSerial)) Serial.write(buffer, length); } From cd36b92d0baf7a4cd238d78bf2e82dc21c5216bb Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 23 May 2024 14:28:16 -0600 Subject: [PATCH 092/358] Lowercase prints for message rate settings. --- Firmware/RTK_Everywhere/settings.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 8601b9c8d..c8fbf0a5c 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1788,9 +1788,9 @@ const RTK_Settings_Entry rtkSettingsEntries[] = // ublox GNSS Receiver { 0, 1, 1, 0, 1, 1, 0, 0, _bool, 0, & settings.enableUART2UBXIn, "enableUART2UBXIn", }, - { 1, 1, 1, 1, 1, 1, 0, 0, tUbxConst, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "Constellation_", }, - { 1, 0, 1, 1, 1, 1, 0, 0, tUbxMsgRt, MAX_UBX_MSG, & settings.ubxMessageRates[0], "MessageRate_", }, - { 1, 0, 1, 1, 1, 1, 0, 0, tUbMsgRtb, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "MessageRateBase_", }, + { 1, 1, 1, 1, 1, 1, 0, 0, tUbxConst, MAX_CONSTELLATIONS, & settings.ubxConstellations[0], "constellation_", }, + { 1, 0, 1, 1, 1, 1, 0, 0, tUbxMsgRt, MAX_UBX_MSG, & settings.ubxMessageRates[0], "messageRate_", }, + { 1, 0, 1, 1, 1, 1, 0, 0, tUbMsgRtb, MAX_UBX_MSG_RTCM, & settings.ubxMessageRatesBase[0], "messageRateBase_", }, // UDP Server { 0, 1, 1, 0, 1, 1, 1, 1, _bool, 0, & settings.debugUdpServer, "debugUdpServer", }, @@ -1816,10 +1816,10 @@ const RTK_Settings_Entry rtkSettingsEntries[] = { 0, 1, 1, 0, 0, 0, 0, 1, _bool, 0, & settings.enableImuDebug, "enableImuDebug", }, { 0, 1, 1, 0, 0, 0, 0, 1, _bool, 0, & settings.enableTiltCompensation, "enableTiltCompensation", }, { 0, 1, 1, 0, 0, 0, 0, 1, _float, 3, & settings.tiltPoleLength, "tiltPoleLength", }, - { 0, 1, 1, 1, 0, 0, 0, 1, tUmConst, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "Constellations_", }, - { 0, 0, 1, 1, 0, 0, 0, 1, tUmMRNmea, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "MessageRatesNMEA_", }, - { 0, 0, 1, 1, 0, 0, 0, 1, tUmMRBaRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "MessageRatesRTCMBase_", }, - { 0, 0, 1, 1, 0, 0, 0, 1, tUmMRRvRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "MessageRatesRTCMRover_", }, + { 0, 1, 1, 1, 0, 0, 0, 1, tUmConst, MAX_UM980_CONSTELLATIONS, & settings.um980Constellations, "constellations_", }, + { 0, 0, 1, 1, 0, 0, 0, 1, tUmMRNmea, MAX_UM980_NMEA_MSG, & settings.um980MessageRatesNMEA, "messageRatesNMEA_", }, + { 0, 0, 1, 1, 0, 0, 0, 1, tUmMRBaRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMBase, "messageRatesRTCMBase_", }, + { 0, 0, 1, 1, 0, 0, 0, 1, tUmMRRvRT, MAX_UM980_RTCM_MSG, & settings.um980MessageRatesRTCMRover, "messageRatesRTCMRover_", }, // Web Server { 0, 1, 1, 0, 1, 1, 1, 1, _uint16_t, 0, & settings.httpPort, "httpPort", }, From 023a4bd45a37a2bc1b67f19644333affc745edd6 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 23 May 2024 15:04:30 -0600 Subject: [PATCH 093/358] Change PointPerfect landing page based on platform Fix #320 --- Firmware/RTK_Everywhere/menuPP.ino | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuPP.ino b/Firmware/RTK_Everywhere/menuPP.ino index 8201e5218..35935cbc6 100644 --- a/Firmware/RTK_Everywhere/menuPP.ino +++ b/Firmware/RTK_Everywhere/menuPP.ino @@ -331,10 +331,17 @@ bool pointperfectProvisionDevice() snprintf(hardwareID, sizeof(hardwareID), "%02X%02X%02X%02X%02X%02X%02X", btMACAddress[0], btMACAddress[1], btMACAddress[2], btMACAddress[3], btMACAddress[4], btMACAddress[5], productVariant); + char landingPageUrl[200] = ""; + if (productVariant == RTK_TORCH) + snprintf(landingPageUrl, sizeof(landingPageUrl), + "or goto https://www.sparkfun.com/rtk_torch_registration "); + else + systemPrintln("pointperfectProvisionDevice() Platform missing landing page"); + systemPrintf("This device has been deactivated. Please contact " - "support@sparkfun.com or goto https://www.sparkfun.com/pointperfect to renew the PointPerfect " + "support@sparkfun.com %sto renew the PointPerfect " "subscription. Please reference device ID: %s\r\n", - hardwareID); + landingPageUrl, hardwareID); displayAccountExpired(5000); } @@ -344,10 +351,17 @@ bool pointperfectProvisionDevice() snprintf(hardwareID, sizeof(hardwareID), "%02X%02X%02X%02X%02X%02X%02X", btMACAddress[0], btMACAddress[1], btMACAddress[2], btMACAddress[3], btMACAddress[4], btMACAddress[5], productVariant); + char landingPageUrl[200] = ""; + if (productVariant == RTK_TORCH) + snprintf(landingPageUrl, sizeof(landingPageUrl), + "or goto https://www.sparkfun.com/rtk_torch_registration "); + else + systemPrintln("pointperfectProvisionDevice() Platform missing landing page"); + systemPrintf("This device is not whitelisted. Please contact " - "support@sparkfun.com or goto https://www.sparkfun.com/pointperfect to get your subscription " + "support@sparkfun.com %sto get the subscription " "activated. Please reference device ID: %s\r\n", - hardwareID); + landingPageUrl, hardwareID); displayNotListed(5000); } From 648c240999c0f94d18dc46b5c1c17ca7ae72c927 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 23 May 2024 15:06:42 -0600 Subject: [PATCH 094/358] Stop provisioning process once limit is reached. Fix #319 --- Firmware/RTK_Everywhere/menuPP.ino | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuPP.ino b/Firmware/RTK_Everywhere/menuPP.ino index 35935cbc6..df4d0e3c8 100644 --- a/Firmware/RTK_Everywhere/menuPP.ino +++ b/Firmware/RTK_Everywhere/menuPP.ino @@ -221,6 +221,8 @@ bool pointperfectProvisionDevice() do { + provisionAttempt++; + char hardwareID[15]; snprintf(hardwareID, sizeof(hardwareID), "%02X%02X%02X%02X%02X%02X%02X", btMACAddress[0], btMACAddress[1], btMACAddress[2], btMACAddress[3], btMACAddress[4], btMACAddress[5], @@ -344,6 +346,7 @@ bool pointperfectProvisionDevice() landingPageUrl, hardwareID); displayAccountExpired(5000); + break; } else if (ztpResponse == ZTP_NOT_WHITELISTED) { @@ -364,6 +367,7 @@ bool pointperfectProvisionDevice() landingPageUrl, hardwareID); displayNotListed(5000); + break; } else if (ztpResponse == ZTP_ALREADY_REGISTERED) { @@ -375,11 +379,11 @@ bool pointperfectProvisionDevice() systemPrintf("This device is registered on a different profile. Please contact " "support@sparkfun.com for more assistance. Please reference device ID: %s\r\n", hardwareID); + break; } else if (ztpResponse == ZTP_RESPONSE_TIMEOUT) { // The WiFi failed to connect in a timely manner to the API. - provisionAttempt++; if (provisionAttempt < maxProvisionAttempts) systemPrintf("Provision server response timed out. Trying again.\r\n"); else @@ -388,7 +392,6 @@ bool pointperfectProvisionDevice() else { // Unknown error - provisionAttempt++; if (provisionAttempt < maxProvisionAttempts) systemPrintf("Unknown provisioning error. Trying again.\r\n"); else From e5716bffb537fcf016a5d0cf76e648bdea86bb17 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 23 May 2024 21:08:17 +0000 Subject: [PATCH 095/358] Update form.h via Python --- Firmware/RTK_Everywhere/form.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/form.h b/Firmware/RTK_Everywhere/form.h index 0632f9453..22a647d2c 100644 --- a/Firmware/RTK_Everywhere/form.h +++ b/Firmware/RTK_Everywhere/form.h @@ -26,7 +26,7 @@ // python main_js_zipper.py static const uint8_t main_js[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x5A, 0x67, 0x4B, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, + 0x1F, 0x8B, 0x08, 0x08, 0x40, 0xB0, 0x4F, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x38, 0x92, 0xE8, 0xFF, 0x3C, 0x05, 0x46, 0x3B, 0x67, 0x24, 0x8D, 0x65, 0x99, 0x92, 0x2F, 0xB1, 0xE3, 0x38, 0x7B, 0x7C, 0x4D, 0x7C, 0xDA, 0x17, 0x1D, 0xCB, 0x4E, 0x3A, 0xC9, 0x64, 0xBD, 0xB4, 0x08, 0xCB, 0x9C, 0x48, @@ -886,7 +886,7 @@ static const uint8_t main_js[] PROGMEM = { // python index_html_zipper.py static const uint8_t index_html[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x5A, 0x67, 0x4B, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x1F, 0x8B, 0x08, 0x08, 0x40, 0xB0, 0x4F, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x52, 0xE3, 0x4A, 0x93, 0xE0, 0xFF, 0xF3, 0x14, 0x35, 0x9E, 0x9D, 0x81, 0x9E, 0xC1, 0xC6, 0x17, 0xA0, 0x69, 0xBE, 0x6E, 0x22, 0xB8, 0x76, 0xB3, 0x1F, 0x74, 0x3B, 0x30, 0xFD, 0x9D, 0xCB, 0xC6, 0xEE, 0x09, 0x21, From fdcdb4b3a8ed8c0b6909497574bf07a9938077ba Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 23 May 2024 16:08:49 -0600 Subject: [PATCH 096/358] Remove leading $ with memmove --- Firmware/RTK_Everywhere/menuCommands.ino | 18 +++--- .../CommandLineStructure.ino | 58 +++++++++---------- 2 files changed, 36 insertions(+), 40 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 0bd25202d..f96db3c20 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -1,7 +1,6 @@ void menuCommands() { char cmdBuffer[200]; - char *command; char responseBuffer[200]; char valueBuffer[100]; const int MAX_TOKENS = 10; @@ -28,9 +27,10 @@ void menuCommands() continue; } - // Allow command input via serial menu + // Allow serial input to skip the validation step. Used for testing. else if (cmdBuffer[0] != '$') - command = cmdBuffer; + { + } // Verify command structure else @@ -42,16 +42,13 @@ void menuCommands() } // Remove $ - command = cmdBuffer + 1; + memmove(cmdBuffer, &cmdBuffer[1], sizeof(cmdBuffer) - 1); - // Remove * and CRC - command[strlen(command) - 3] = '\0'; + // Change * to , and null terminate on the first CRC character + cmdBuffer[strlen(cmdBuffer) - 3] = ','; + cmdBuffer[strlen(cmdBuffer) - 2] = '\0'; } - // Change * to , and null terminate on the first CRC character - cmdBuffer[strlen(cmdBuffer) - 3] = ','; - cmdBuffer[strlen(cmdBuffer) - 2] = '\0'; - const int MAX_TOKENS = 10; char valueBuffer[100]; @@ -465,7 +462,6 @@ int commandLookupSettingName(const char *settingName, char *truncatedName, int t commandSplitName(settingName, truncatedName, truncatedNameLen, suffix, suffixLen); // Loop through the settings entries - // TODO: make this faster // E.g. by storing the previous value of i and starting there. // Most of the time, the match will be i+1. for (int i = 0; i < commandCount; i++) diff --git a/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino b/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino index c77230f29..9e8a1343c 100644 --- a/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino +++ b/Firmware/Test Sketches/CommandLineStructure/CommandLineStructure.ino @@ -1,5 +1,5 @@ /* - Demonstration of the command line interface as specified by Avinan Malla + Demonstration of the command line interface as specified by Avinab Malla */ typedef enum @@ -9,6 +9,9 @@ typedef enum SETTING_KNOWN_STRING, } SettingValueResponse; +const uint16_t bufferLen = 1024; +char cmdBuffer[bufferLen]; + void setup() { Serial.begin(115200); @@ -17,110 +20,107 @@ void setup() Serial.println(); Serial.println("SparkFun Command Line Interface Tests"); - const uint16_t bufferLen = 1024; - char cmdBuffer[bufferLen]; - sprintf(cmdBuffer, "$CMD*4A"); //Bad command Serial.printf("command: %s (Unknown command) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPCMD*AA"); //Bad checksum Serial.printf("command: %s (Bad checksum) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPCMD*49"); //Valid command Serial.printf("command: %s (Valid) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); Serial.println(); sprintf(cmdBuffer, "$SPGET,elvMask,15*1A"); //Too many arguments Serial.printf("command: %s (Too many arguments) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPGET*55"); //Bad command Serial.printf("command: %s (Missing command) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPGET,maxHeight*32"); //Unknown setting Serial.printf("command: %s (Unknown setting) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPGET,elvMask*32"); //Valid command Serial.printf("command: %s (Valid) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPGET,ntripClientCasterUserPW*35"); //Valid command, response with escaped quote Serial.printf("command: %s (Valid) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); Serial.println(); sprintf(cmdBuffer, "$SPSET,elvMask*26"); //Incorrect number of arguments Serial.printf("command: %s (Wrong number of arguments) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPSET,maxHeight,15*0E"); //Unknown setting Serial.printf("command: %s (Unknown setting) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPSET,ntripClientCasterUserPW,\"casterPW*3A"); //Missing closing quote Serial.printf("command: %s (Missing quote) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPSET,elvMask,0.77*14"); //Valid Serial.printf("command: %s (Valid) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPSET,ntripClientCasterUserPW,\"MyPass\"*08"); //Valid string Serial.printf("command: %s (Valid) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPSET,ntripClientCasterUserPW,\"complex,password\"*5E"); //Valid string with an internal comma Serial.printf("command: %s (Valid) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPSET,ntripClientCasterUserPW,\"pwWith\\\"quote\"*2C"); //Valid string with an escaped quote Serial.printf("command: %s (Valid) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPSET,ntripClientCasterUserPW,\"a55G\\\"e,e#\"*5A"); //Valid string with an internal escaped quote, and internal comma Serial.printf("command: %s (Valid) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); Serial.println(); sprintf(cmdBuffer, "$SPEXE*5B"); //Incorrect number of arguments Serial.printf("command: %s (Wrong number of arguments) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPEXE,maxHeight*3C"); //Unknown command Serial.printf("command: %s (Unknown command) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPEXE,EXIT*77"); //Valid Serial.printf("command: %s (Valid) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPEXE,APPLY*23"); //Valid Serial.printf("command: %s (Valid) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPEXE,SAVE*76"); //Valid Serial.printf("command: %s (Valid) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPEXE,REBOOT*76"); //Valid Serial.printf("command: %s (Valid) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); sprintf(cmdBuffer, "$SPEXE,LIST*75"); //Valid Serial.printf("command: %s (Valid) - ", cmdBuffer); - commandParser(cmdBuffer); + commandParser(); } -void commandParser(char *cmdBuffer) +void commandParser() { //Verify command structure if (commandValid(cmdBuffer) == false) @@ -130,7 +130,7 @@ void commandParser(char *cmdBuffer) } //Remove $ - cmdBuffer = &cmdBuffer[1]; + memmove(cmdBuffer, &cmdBuffer[1], sizeof(cmdBuffer) - 1); //Change * to , and null terminate on the first CRC character cmdBuffer[strlen(cmdBuffer) - 3] = ','; From 485cf4876c4b371e7a20cef3676dcc1c80360e0a Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 23 May 2024 16:09:20 -0600 Subject: [PATCH 097/358] Change COMMAND_UNKNOWN from positive number Fix #322 --- Firmware/RTK_Everywhere/menuCommands.ino | 4 ++-- Firmware/RTK_Everywhere/settings.h | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index f96db3c20..167892a4f 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -2686,7 +2686,7 @@ bool commandIndexFill() if (commandAvailableOnPlatform(i)) commandCount += 1; } - commandCount += COMMAND_UNKNOWN - 1; + commandCount += COMMAND_COUNT - 1; // Allocate the command array length = commandCount * sizeof(*commandIndex); @@ -2705,7 +2705,7 @@ bool commandIndexFill() commandIndex[commandCount++] = i; // Add the man-machine interface commands to the list - for (i = 1; i < COMMAND_UNKNOWN; i++) + for (i = 1; i < COMMAND_COUNT; i++) commandIndex[commandCount++] = -i; // Sort the commands diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index c8fbf0a5c..358ee0122 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1413,7 +1413,8 @@ typedef struct #define COMMAND_PROFILE_0_INDEX -1 #define COMMAND_PROFILE_NUMBER (COMMAND_PROFILE_0_INDEX - MAX_PROFILE_COUNT) #define COMMAND_DEVICE_ID (COMMAND_PROFILE_NUMBER - 1) -#define COMMAND_UNKNOWN (-(COMMAND_DEVICE_ID - 1)) +#define COMMAND_UNKNOWN (COMMAND_DEVICE_ID - 1) +#define COMMAND_COUNT (-(COMMAND_UNKNOWN)) const RTK_Settings_Entry rtkSettingsEntries[] = { From 3601a60539b1d7fd44d77aaedfdf0c1ddaaf1269 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 23 May 2024 22:14:02 +0000 Subject: [PATCH 098/358] Update form.h via Python --- Firmware/RTK_Everywhere/form.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/form.h b/Firmware/RTK_Everywhere/form.h index 22a647d2c..1d8af80c6 100644 --- a/Firmware/RTK_Everywhere/form.h +++ b/Firmware/RTK_Everywhere/form.h @@ -26,7 +26,7 @@ // python main_js_zipper.py static const uint8_t main_js[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x40, 0xB0, 0x4F, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, + 0x1F, 0x8B, 0x08, 0x08, 0xA9, 0xBF, 0x4F, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x38, 0x92, 0xE8, 0xFF, 0x3C, 0x05, 0x46, 0x3B, 0x67, 0x24, 0x8D, 0x65, 0x99, 0x92, 0x2F, 0xB1, 0xE3, 0x38, 0x7B, 0x7C, 0x4D, 0x7C, 0xDA, 0x17, 0x1D, 0xCB, 0x4E, 0x3A, 0xC9, 0x64, 0xBD, 0xB4, 0x08, 0xCB, 0x9C, 0x48, @@ -886,7 +886,7 @@ static const uint8_t main_js[] PROGMEM = { // python index_html_zipper.py static const uint8_t index_html[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x40, 0xB0, 0x4F, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x1F, 0x8B, 0x08, 0x08, 0xA9, 0xBF, 0x4F, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x52, 0xE3, 0x4A, 0x93, 0xE0, 0xFF, 0xF3, 0x14, 0x35, 0x9E, 0x9D, 0x81, 0x9E, 0xC1, 0xC6, 0x17, 0xA0, 0x69, 0xBE, 0x6E, 0x22, 0xB8, 0x76, 0xB3, 0x1F, 0x74, 0x3B, 0x30, 0xFD, 0x9D, 0xCB, 0xC6, 0xEE, 0x09, 0x21, From 752456c41645e08dd3581ad0d2e395403cf70c7e Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 23 May 2024 16:30:48 -0600 Subject: [PATCH 099/358] Fix const char warnings Fix #288 --- Firmware/RTK_Everywhere/menuCommands.ino | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 167892a4f..6c5d3bb6b 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -37,7 +37,7 @@ void menuCommands() { if (commandValid(cmdBuffer) == false) { - commandSendErrorResponse("SP", "Bad command structure or checksum"); + commandSendErrorResponse((char *)"SP", (char *)"Bad command structure or checksum"); continue; } @@ -132,7 +132,7 @@ void menuCommands() else if (strcmp(tokens[0], "SPGET") == 0) { if (tokenCount != 2) - commandSendErrorResponse(tokens[0], "Incorrect number of arguments"); + commandSendErrorResponse(tokens[0], (char *)"Incorrect number of arguments"); else { auto field = tokens[1]; @@ -152,7 +152,7 @@ void menuCommands() { if (tokenCount != 3) commandSendErrorResponse(tokens[0], - "Incorrect number of arguments"); // Incorrect number of arguments + (char *)"Incorrect number of arguments"); // Incorrect number of arguments else { auto field = tokens[1]; @@ -173,7 +173,7 @@ void menuCommands() { if (tokenCount != 2) commandSendErrorResponse(tokens[0], - "Incorrect number of arguments"); // Incorrect number of arguments + (char *)"Incorrect number of arguments"); // Incorrect number of arguments else { if (strcmp(tokens[1], "EXIT") == 0) @@ -205,12 +205,12 @@ void menuCommands() commandSendExecuteOkResponse(tokens[0], tokens[1]); } else - commandSendErrorResponse(tokens[0], tokens[1], "Unknown command"); + commandSendErrorResponse(tokens[0], tokens[1], (char *)"Unknown command"); } } else { - commandSendErrorResponse(tokens[0], "Unknown command"); + commandSendErrorResponse(tokens[0], (char *)"Unknown command"); } } // while(1) @@ -287,7 +287,7 @@ void commandSendStringResponse(char *command, char *settingName, char *valueBuff // Given a command, send response sentence with OK and checksum and // Ex: observationPositionAccuracy,float,0.5 = -void commandSendExecuteListResponse(const char *settingName, char *settingType, char *settingValue) +void commandSendExecuteListResponse(const char *settingName, const char *settingType, char *settingValue) { // Create string between $ and * for checksum calculation char innerBuffer[200]; From 98bd20cf8a373ce67fc73fe611b95f46e2a240bc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 23 May 2024 22:33:13 +0000 Subject: [PATCH 100/358] Update form.h via Python --- Firmware/RTK_Everywhere/form.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/form.h b/Firmware/RTK_Everywhere/form.h index 1d8af80c6..e9c99d207 100644 --- a/Firmware/RTK_Everywhere/form.h +++ b/Firmware/RTK_Everywhere/form.h @@ -26,7 +26,7 @@ // python main_js_zipper.py static const uint8_t main_js[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0xA9, 0xBF, 0x4F, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, + 0x1F, 0x8B, 0x08, 0x08, 0x29, 0xC4, 0x4F, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x38, 0x92, 0xE8, 0xFF, 0x3C, 0x05, 0x46, 0x3B, 0x67, 0x24, 0x8D, 0x65, 0x99, 0x92, 0x2F, 0xB1, 0xE3, 0x38, 0x7B, 0x7C, 0x4D, 0x7C, 0xDA, 0x17, 0x1D, 0xCB, 0x4E, 0x3A, 0xC9, 0x64, 0xBD, 0xB4, 0x08, 0xCB, 0x9C, 0x48, @@ -886,7 +886,7 @@ static const uint8_t main_js[] PROGMEM = { // python index_html_zipper.py static const uint8_t index_html[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0xA9, 0xBF, 0x4F, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x1F, 0x8B, 0x08, 0x08, 0x29, 0xC4, 0x4F, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x52, 0xE3, 0x4A, 0x93, 0xE0, 0xFF, 0xF3, 0x14, 0x35, 0x9E, 0x9D, 0x81, 0x9E, 0xC1, 0xC6, 0x17, 0xA0, 0x69, 0xBE, 0x6E, 0x22, 0xB8, 0x76, 0xB3, 0x1F, 0x74, 0x3B, 0x30, 0xFD, 0x9D, 0xCB, 0xC6, 0xEE, 0x09, 0x21, From fa8a96c05d2384b47dda70b9972f39e42cd5c29e Mon Sep 17 00:00:00 2001 From: PaulZC Date: Fri, 24 May 2024 10:50:56 +0100 Subject: [PATCH 101/358] Increase stack size. Add handler for HTTPD_WS_TYPE_CLOSE --- Firmware/RTK_Everywhere/Form.ino | 65 +++++++++------------- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 21 ++++--- Firmware/RTK_Everywhere/form.h | 4 +- 3 files changed, 41 insertions(+), 49 deletions(-) diff --git a/Firmware/RTK_Everywhere/Form.ino b/Firmware/RTK_Everywhere/Form.ino index 874554c05..d349e0cd5 100644 --- a/Firmware/RTK_Everywhere/Form.ino +++ b/Firmware/RTK_Everywhere/Form.ino @@ -59,10 +59,6 @@ void sendStringToWebsocket(const char *stringToSend) } -/* - * This handler echos back the received ws data - * and triggers an async send if certain message received - */ static esp_err_t ws_handler(httpd_req_t *req) { // Log the req, so we can reuse it for httpd_ws_send_frame @@ -70,11 +66,12 @@ static esp_err_t ws_handler(httpd_req_t *req) //last_ws_req = req; if (req->method == HTTP_GET) { - // Log the fd, so we can reuse it for httpd_ws_send_frame + // Log the fd, so we can reuse it for httpd_ws_send_frame_async // TODO: do we need to be cleverer about this? last_ws_fd = httpd_req_to_sockfd(req); + if (settings.debugWebConfig == true) - systemPrintln("Handshake done, the new ws connection was opened"); + systemPrintf("Handshake done, the new ws connection was opened with fd %d\r\n", last_ws_fd); websocketConnected = true; lastDynamicDataUpdate = millis(); @@ -82,6 +79,7 @@ static esp_err_t ws_handler(httpd_req_t *req) return ESP_OK; } + httpd_ws_frame_t ws_pkt; uint8_t *buf = NULL; memset(&ws_pkt, 0, sizeof(httpd_ws_frame_t)); @@ -109,8 +107,6 @@ static esp_err_t ws_handler(httpd_req_t *req) free(buf); return ret; } - if (settings.debugWebConfig == true) - systemPrintf("Got packet with message: %s\r\n", ws_pkt.payload); } if (settings.debugWebConfig == true) systemPrintf("Packet type: %d\r\n", ws_pkt.type); @@ -124,6 +120,9 @@ static esp_err_t ws_handler(httpd_req_t *req) if (ws_pkt.type == HTTPD_WS_TYPE_TEXT) { + if (settings.debugWebConfig == true) + systemPrintf("Got packet with message: %s\r\n", ws_pkt.payload); + if (currentlyParsingData == false) { for (int i = 0; i < ws_pkt.len; i++) @@ -134,6 +133,14 @@ static esp_err_t ws_handler(httpd_req_t *req) timeSinceLastIncomingSetting = millis(); } } + else if (ws_pkt.type == HTTPD_WS_TYPE_CLOSE) + { + if (settings.debugWebConfig == true) + systemPrintln("Client closed or refreshed the web page"); + + createSettingsString(settingsCSV); + websocketConnected = false; + } free(buf); return ret; @@ -157,7 +164,7 @@ static void start_wsserver(void) config.server_port = 81; // Increase the stack size from 4K to ~15K - config.stack_size = AP_CONFIG_SETTING_SIZE; + config.stack_size = updateWebSocketStackSize; // Start the httpd server if (settings.debugWebConfig == true) @@ -489,7 +496,7 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) if (online.updatePplTaskRunning == false) xTaskCreate(updateWebServerTask, "UpdateWebServer", // Just for humans - updateWebServerTaskStackSize, // Stack Size + updateWebServerTaskStackSize, // Stack Size - needs to be large enough to hold the file manager list nullptr, // Task input parameter updateWebServerTaskPriority, &updatePplTaskHandle); // Task handle @@ -594,20 +601,20 @@ static void handleFileManager() "?name=" + fileName + "&action=" + fileAction; char slashFileName[60]; - snprintf(slashFileName, sizeof(slashFileName), "/%s", webserver->arg("name")); + snprintf(slashFileName, sizeof(slashFileName), "/%s", fileName.c_str()); - bool fileExists; - fileExists = sd->exists(slashFileName); + bool fileExists = sd->exists(slashFileName); if (fileExists == false) { - systemPrintln(logmessage + " ERROR: file does not exist"); + logmessage += " ERROR: file "; + logmessage += slashFileName; + logmessage += " does not exist"; webserver->send(400, "text/plain", "ERROR: file does not exist"); } else { - if (settings.debugWebConfig == true) - systemPrintln(logmessage + " file exists"); + logmessage += " file exists"; if (fileAction == "download") { @@ -627,7 +634,7 @@ static void handleFileManager() managerTempFile.close(); - // TODO: websocket->textAll("fmNext,1,"); // Tell browser to send next file if needed + sendStringToWebsocket("fmNext,1,"); // Tell browser to send next file if needed } else if (fileAction == "delete") { @@ -640,8 +647,8 @@ static void handleFileManager() logmessage += " ERROR: invalid action param supplied"; webserver->send(400, "text/plain", "ERROR: invalid action param supplied"); } - systemPrintln(logmessage); } + systemPrintln(logmessage); } else { @@ -880,7 +887,8 @@ bool parseIncomingSettings() headPtr = commaPtr + 1; } - // log_d("settingName: %s value: %s", settingName, valueStr); + if (settings.debugWebConfig == true) + systemPrintf("settingName: %s value: %s\r\n", settingName, valueStr); updateSettingWithValue(settingName, valueStr); @@ -963,25 +971,6 @@ void getFileList(String &returnText) systemPrintf("returnText (%d bytes): %s\r\n", returnText.length(), returnText.c_str()); } -/* -// When called, responds with the corrections sources and their priorities -// Source name and priority are formatted in CSV, formatted to html by JS -void createCorrectionsList(String &returnText) -{ - returnText = ""; - - for (int s = 0; s < correctionsSource::CORR_NUM; s++) - { - returnText += String("correctionsPriority.") + - String(correctionsSourceNames[s]) + "," + - String(settings.correctionsSourcesPriority[s]) + ","; - } - - if (settings.debugWebConfig == true) - systemPrintf("returnText (%d bytes): %s\r\n", returnText.length(), returnText.c_str()); -} -*/ - // When called, responds with the messages supported on this platform // Message name and current rate are formatted in CSV, formatted to html by JS void createMessageList(String &returnText) diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index 98a101acd..c2246ded2 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -555,6 +555,16 @@ unsigned long lastRockerSwitchChange; // If quick toggle is detected (less than // Webserver for serving config page from ESP32 as Acess Point //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +// Because the incoming string is longer than max len, there are multiple callbacks so we +// use a global to combine the incoming +#define AP_CONFIG_SETTING_SIZE 10000 +char *settingsCSV; // Push large array onto heap +char *incomingSettings; +int incomingSettingsSpot; +unsigned long timeSinceLastIncomingSetting; +unsigned long lastDynamicDataUpdate; + #ifdef COMPILE_WIFI #ifdef COMPILE_AP @@ -573,19 +583,12 @@ int last_ws_fd; TaskHandle_t webserverTaskHandle; const uint8_t updateWebServerTaskPriority = 0; // 3 being the highest, and 0 being the lowest -const int updateWebServerTaskStackSize = 3000; +const int updateWebServerTaskStackSize = AP_CONFIG_SETTING_SIZE + 3000; // Needs to be large enough to hold the file manager file list +const int updateWebSocketStackSize = AP_CONFIG_SETTING_SIZE + 3000; // Needs to be large enough to hold the full settings string #endif // COMPILE_AP #endif // COMPILE_WIFI -// Because the incoming string is longer than max len, there are multiple callbacks so we -// use a global to combine the incoming -#define AP_CONFIG_SETTING_SIZE 15000 -char *settingsCSV; // Push large array onto heap -char *incomingSettings; -int incomingSettingsSpot; -unsigned long timeSinceLastIncomingSetting; -unsigned long lastDynamicDataUpdate; //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // PointPerfect Corrections diff --git a/Firmware/RTK_Everywhere/form.h b/Firmware/RTK_Everywhere/form.h index 7970f86b2..7b9969a9f 100644 --- a/Firmware/RTK_Everywhere/form.h +++ b/Firmware/RTK_Everywhere/form.h @@ -26,7 +26,7 @@ // python main_js_zipper.py static const uint8_t main_js[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0xF0, 0x72, 0x4F, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, + 0x1F, 0x8B, 0x08, 0x08, 0xF1, 0x55, 0x50, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x3A, 0x92, 0xE0, 0xFF, 0xFE, 0xBE, 0x7E, 0x07, 0xB4, 0xB6, 0xB7, 0x25, 0xB5, 0x65, 0x99, 0x92, 0x2F, 0xB1, 0xE3, 0xD8, 0xB3, 0xBE, 0x26, 0xDE, 0xE3, 0x8B, 0xD6, 0xB2, 0x93, 0x93, 0x9C, 0xCE, 0x78, 0x68, 0x11, 0x96, @@ -890,7 +890,7 @@ static const uint8_t main_js[] PROGMEM = { // python index_html_zipper.py static const uint8_t index_html[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0xEF, 0x72, 0x4F, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x1F, 0x8B, 0x08, 0x08, 0xF0, 0x55, 0x50, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xD9, 0x72, 0xE3, 0x48, 0x92, 0xE0, 0xFB, 0x9A, 0xED, 0x3F, 0x44, 0x73, 0x76, 0x46, 0xCA, 0x19, 0x91, 0xE2, 0x21, 0x29, 0x95, 0xEA, 0x4C, 0x99, 0xE9, 0xCC, 0xD2, 0xB6, 0x94, 0x49, 0x13, 0x95, 0x5D, 0xC7, 0xDA, 0x6E, From 4b0a61daf0121918b54a489707f81bfd24422ec6 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Fri, 24 May 2024 11:46:25 +0100 Subject: [PATCH 102/358] Separate uploadFile and uploadFirmware --- Firmware/RTK_Everywhere/AP-Config/src/main.js | 4 +- Firmware/RTK_Everywhere/Form.ino | 19 +- Firmware/RTK_Everywhere/form.h | 714 +++++++++--------- 3 files changed, 367 insertions(+), 370 deletions(-) diff --git a/Firmware/RTK_Everywhere/AP-Config/src/main.js b/Firmware/RTK_Everywhere/AP-Config/src/main.js index 9c27a13d9..72fbf936c 100644 --- a/Firmware/RTK_Everywhere/AP-Config/src/main.js +++ b/Firmware/RTK_Everywhere/AP-Config/src/main.js @@ -1232,7 +1232,7 @@ function firmwareUploadWait() { var formdata = new FormData(); formdata.append("submitFirmwareFile", file); var ajax = new XMLHttpRequest(); - ajax.open("POST", "/upload"); + ajax.open("POST", "/uploadFirmware"); ajax.send(formdata); ge("firmwareUploadMsg").innerHTML = "
Uploading, please wait..."; @@ -1813,7 +1813,7 @@ function uploadFile() { ajax.addEventListener("load", completeHandler, false); ajax.addEventListener("error", errorHandler, false); ajax.addEventListener("abort", abortHandler, false); - ajax.open("POST", "/"); + ajax.open("POST", "/uploadFile"); ajax.send(formdata); } function progressHandler(event) { diff --git a/Firmware/RTK_Everywhere/Form.ino b/Firmware/RTK_Everywhere/Form.ino index d349e0cd5..e81ca1006 100644 --- a/Firmware/RTK_Everywhere/Form.ino +++ b/Firmware/RTK_Everywhere/Form.ino @@ -339,9 +339,6 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) webserver->onNotFound(notFound); - webserver->onFileUpload( - handleUpload); // Run handleUpload function when any file is uploaded. Must be before server.on() calls. - webserver->on("/", HTTP_GET, []() { webserver->sendHeader("Content-Encoding", "gzip"); webserver->send_P(200, "text/html", (const char *)index_html, sizeof(index_html)); @@ -449,9 +446,13 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) webserver->send_P(200, "text/plain", (const char *)icomoon_woof, sizeof(icomoon_woof)); }); - // Handler for the /upload form POST + // Handler for the /uploadFile form POST + webserver->on( + "/uploadFile", HTTP_POST, handleUpload); // Run handleUpload function when file manager file is uploaded + + // Handler for the /uploadFirmware form POST webserver->on( - "/upload", HTTP_POST, handleFirmwareFileUpload); + "/uploadFirmware", HTTP_POST, handleFirmwareFileUpload); // Handler for file manager webserver->on("/listfiles", HTTP_GET, []() { @@ -1038,12 +1039,8 @@ void createMessageListBase(String &returnText) // Handles uploading of user files to SD // https://github.com/espressif/arduino-esp32/blob/master/libraries/WebServer/examples/FSBrowser/FSBrowser.ino -void handleUpload() +static void handleUpload() { - if (webserver->uri() != "/edit") { - return; - } - String logmessage = ""; String filename = ""; @@ -1088,7 +1085,7 @@ void handleUpload() else if (upload.status == UPLOAD_FILE_END) { - logmessage = "Upload Complete: " + filename + ",size: " + String(upload.totalSize); + logmessage = "Upload Complete: " + filename + ", size: " + String(upload.totalSize); // Attempt to gain access to the SD card if (xSemaphoreTake(sdCardSemaphore, fatSemaphore_longWait_ms) == pdPASS) diff --git a/Firmware/RTK_Everywhere/form.h b/Firmware/RTK_Everywhere/form.h index 7b9969a9f..c229506bd 100644 --- a/Firmware/RTK_Everywhere/form.h +++ b/Firmware/RTK_Everywhere/form.h @@ -26,7 +26,7 @@ // python main_js_zipper.py static const uint8_t main_js[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0xF1, 0x55, 0x50, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, + 0x1F, 0x8B, 0x08, 0x08, 0x14, 0x6D, 0x50, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x3A, 0x92, 0xE0, 0xFF, 0xFE, 0xBE, 0x7E, 0x07, 0xB4, 0xB6, 0xB7, 0x25, 0xB5, 0x65, 0x99, 0x92, 0x2F, 0xB1, 0xE3, 0xD8, 0xB3, 0xBE, 0x26, 0xDE, 0xE3, 0x8B, 0xD6, 0xB2, 0x93, 0x93, 0x9C, 0xCE, 0x78, 0x68, 0x11, 0x96, @@ -528,361 +528,361 @@ static const uint8_t main_js[] PROGMEM = { 0x5C, 0x3A, 0xA5, 0x48, 0xBC, 0xB0, 0xBC, 0x6D, 0x4E, 0x26, 0x6C, 0xD6, 0x25, 0x01, 0xB7, 0x28, 0xE2, 0xA6, 0x00, 0xD5, 0xFC, 0x77, 0xF3, 0x89, 0x43, 0xFC, 0xF5, 0xEC, 0xF4, 0x43, 0x00, 0x49, 0x2B, 0xFE, 0x63, 0x8A, 0x85, 0xC7, 0xD6, 0xA1, 0x46, 0xDB, 0x25, 0x20, 0x1B, 0xB5, 0xDE, 0x45, - 0xFF, 0x0A, 0x62, 0x31, 0x57, 0xA6, 0xB4, 0x5B, 0x35, 0xA9, 0x0A, 0x9D, 0x6F, 0x21, 0x11, 0xF1, - 0x84, 0x64, 0xDA, 0x4E, 0xE4, 0x86, 0xE6, 0x06, 0x1A, 0xDE, 0x2E, 0x65, 0x85, 0x36, 0x38, 0x62, - 0x4E, 0xA4, 0x98, 0xF4, 0xE4, 0x2B, 0xE7, 0x32, 0xBC, 0x7E, 0x60, 0x06, 0x53, 0x1F, 0x5C, 0xD4, - 0x14, 0xED, 0x9D, 0x8D, 0x94, 0xD4, 0xCF, 0x01, 0x9C, 0x9C, 0xE2, 0x6C, 0x36, 0xEA, 0x6B, 0xD5, - 0x32, 0xA6, 0xB9, 0x82, 0xC5, 0xF5, 0x86, 0x38, 0xE8, 0x99, 0xB6, 0x87, 0x2D, 0xAA, 0x8C, 0x95, - 0x75, 0xE7, 0x36, 0x70, 0x8E, 0x69, 0x15, 0x56, 0xA8, 0xE1, 0x17, 0x48, 0x34, 0x7D, 0xA4, 0xCF, - 0xA7, 0xC0, 0xDC, 0x20, 0xC0, 0x4E, 0x5B, 0x8C, 0x4B, 0x99, 0x60, 0xEC, 0x9D, 0xED, 0x1D, 0xF8, - 0x6A, 0xC3, 0x73, 0xFE, 0x6A, 0xBC, 0xF6, 0xF6, 0x9E, 0xE2, 0x3C, 0xF2, 0x27, 0xE7, 0xEE, 0x63, - 0x8F, 0xB4, 0xF7, 0xF5, 0xBA, 0x9A, 0x50, 0x47, 0xB5, 0x69, 0x22, 0x0D, 0xC5, 0x30, 0xD4, 0x62, - 0xBC, 0x44, 0x43, 0x37, 0x6D, 0x48, 0x2F, 0xE6, 0x78, 0x82, 0x80, 0x54, 0x57, 0x02, 0x11, 0x90, - 0x44, 0x47, 0x74, 0x05, 0x65, 0x5A, 0xD6, 0xD1, 0x03, 0xF9, 0x05, 0x5C, 0x3C, 0xB0, 0x03, 0x2F, - 0x69, 0x1D, 0x5E, 0x9C, 0x11, 0xC5, 0x1D, 0xC0, 0x37, 0x32, 0x2E, 0x18, 0x72, 0xAE, 0x34, 0x30, - 0x54, 0x69, 0xA2, 0x9D, 0x5D, 0xA0, 0x32, 0x16, 0x7B, 0xCE, 0xBC, 0x02, 0x37, 0x5A, 0xC9, 0x74, - 0x06, 0xF2, 0x25, 0x16, 0x0D, 0xA4, 0x80, 0x9D, 0x2A, 0xF5, 0xBF, 0x24, 0xBF, 0x30, 0xD0, 0xD1, - 0x0D, 0x96, 0x0D, 0x6E, 0x94, 0xE6, 0x13, 0xF9, 0x45, 0xB9, 0xCA, 0x62, 0xF5, 0x7E, 0xB3, 0xBF, - 0xB6, 0x5D, 0x67, 0x30, 0xB2, 0x07, 0x10, 0x06, 0x16, 0x31, 0xB9, 0x91, 0x7C, 0x26, 0x41, 0xCE, - 0xFD, 0x91, 0x91, 0x7B, 0x7C, 0xA8, 0x7D, 0xAC, 0xAF, 0xA9, 0x61, 0x18, 0x83, 0x09, 0x5A, 0x41, - 0x8F, 0x57, 0x03, 0xA9, 0x8F, 0x07, 0xF2, 0x09, 0x18, 0xAD, 0xA4, 0x22, 0x14, 0x1D, 0x59, 0xBE, - 0xCB, 0x1A, 0x41, 0x0B, 0x75, 0x2E, 0x04, 0xC6, 0x98, 0xB3, 0xE8, 0x13, 0xBA, 0xA1, 0x27, 0x50, - 0xF3, 0x0A, 0x4C, 0x79, 0xF2, 0x2A, 0x3E, 0x29, 0x13, 0x6B, 0x1A, 0x9F, 0x37, 0x48, 0x49, 0x75, - 0xCF, 0x34, 0x0D, 0xDD, 0x4B, 0x66, 0xE4, 0xA4, 0xD7, 0x77, 0xEC, 0x18, 0x5A, 0xCD, 0xA5, 0x57, - 0x21, 0xA4, 0x62, 0x5D, 0x4A, 0xA3, 0x36, 0xEE, 0x4F, 0x46, 0xA7, 0xF5, 0x5D, 0xCA, 0x7E, 0x7F, - 0xA4, 0x7A, 0x07, 0x67, 0x7B, 0xD7, 0x84, 0x75, 0x17, 0xCE, 0x1E, 0x99, 0xBD, 0x1D, 0x46, 0xA7, - 0x90, 0xD9, 0x7A, 0xFB, 0x9E, 0xC6, 0x12, 0xCF, 0xBD, 0xB3, 0xEF, 0xD5, 0x10, 0x65, 0x6D, 0x5F, - 0x59, 0x57, 0x32, 0xFA, 0xCA, 0x98, 0xA1, 0xE9, 0xAB, 0x5C, 0x2D, 0xCD, 0xF8, 0xC5, 0xEC, 0x5B, - 0x63, 0xD7, 0x37, 0xED, 0x41, 0x69, 0x2B, 0x98, 0x94, 0x9A, 0x58, 0xFB, 0x12, 0x44, 0xAC, 0x30, - 0x36, 0x3A, 0xED, 0x35, 0x85, 0xF4, 0xEF, 0x4A, 0xF0, 0x71, 0x39, 0x13, 0x44, 0x19, 0xE4, 0x1D, - 0x43, 0x3E, 0x82, 0xA7, 0x61, 0xAF, 0x08, 0xDE, 0xC8, 0x02, 0xAE, 0x97, 0x35, 0xDD, 0xF3, 0x15, - 0xD5, 0x45, 0xAC, 0xEC, 0x63, 0x18, 0xB1, 0xE0, 0x68, 0x9C, 0xF4, 0x8B, 0x3F, 0xE9, 0xC2, 0x84, - 0xB3, 0x10, 0x88, 0xF4, 0xEE, 0x47, 0x89, 0x72, 0xE7, 0xD2, 0xFD, 0x42, 0x0F, 0xC0, 0x2A, 0xDD, - 0xE7, 0xEE, 0xC8, 0xB3, 0x74, 0x3F, 0x0F, 0x84, 0xB6, 0xFB, 0x8A, 0x73, 0xE9, 0x1C, 0x58, 0x90, - 0x84, 0x98, 0xC7, 0x06, 0x8D, 0x1F, 0x2B, 0x69, 0x65, 0xD9, 0x3E, 0xCB, 0x13, 0xCB, 0xF3, 0x16, - 0x14, 0xE7, 0x49, 0x2E, 0x3C, 0x21, 0x4F, 0x79, 0x3A, 0x7F, 0xE0, 0xA0, 0x03, 0x69, 0x87, 0x20, - 0xD1, 0x96, 0x83, 0x47, 0x33, 0x71, 0x26, 0x09, 0x2B, 0x8A, 0xDA, 0x32, 0x52, 0xA4, 0x22, 0x6C, - 0xB2, 0x6F, 0x4E, 0xAD, 0x43, 0xCF, 0x9D, 0xC0, 0x63, 0xF2, 0x29, 0x8B, 0x8C, 0x94, 0x5C, 0xAF, - 0x80, 0x08, 0x15, 0xA0, 0xAA, 0x93, 0xB2, 0x08, 0x14, 0xA2, 0x8A, 0xAF, 0x8D, 0x25, 0xA9, 0xAA, - 0x8E, 0xAF, 0x14, 0x17, 0xB4, 0xB3, 0x20, 0xFD, 0xC5, 0x80, 0x59, 0x67, 0x43, 0xEE, 0x5B, 0x04, - 0x29, 0xC3, 0x3F, 0x21, 0xDA, 0x8C, 0x9E, 0xA5, 0xFC, 0xAA, 0xAC, 0x2B, 0x02, 0x41, 0xCB, 0x0C, - 0x35, 0xCD, 0xE4, 0xAC, 0x2C, 0x28, 0x93, 0xB6, 0x32, 0x53, 0x7C, 0x0E, 0x71, 0x60, 0xDA, 0x23, - 0xBF, 0x3C, 0x2B, 0xCA, 0xC1, 0xD2, 0x33, 0x85, 0x1E, 0x9C, 0xE7, 0xC1, 0x8D, 0x10, 0x50, 0x31, - 0x36, 0xD0, 0x73, 0x64, 0xE5, 0x8E, 0xE7, 0xB5, 0xD6, 0x2F, 0x09, 0x82, 0x75, 0x62, 0x1E, 0xEB, - 0x81, 0x0C, 0x2E, 0x4D, 0xEC, 0x35, 0xA6, 0x91, 0x99, 0x17, 0x81, 0x4C, 0x78, 0x85, 0x16, 0x01, - 0x35, 0xAB, 0xF8, 0xAC, 0xCC, 0x48, 0x24, 0xC8, 0x4E, 0x93, 0x7E, 0xB1, 0x76, 0x75, 0xB9, 0x2F, - 0x08, 0x45, 0xDB, 0x69, 0x29, 0x9D, 0xF7, 0xAC, 0xFD, 0x2E, 0x9C, 0x1B, 0x5C, 0x65, 0x41, 0xDC, - 0x70, 0x46, 0x2E, 0x14, 0x02, 0xA4, 0x3B, 0x8C, 0x45, 0x6F, 0xE7, 0x55, 0xE1, 0x82, 0x7C, 0xB9, - 0xA2, 0x41, 0x21, 0xBF, 0x96, 0xB7, 0x48, 0x14, 0x89, 0x93, 0xC3, 0x02, 0x50, 0xC9, 0x17, 0x5F, - 0x73, 0x46, 0x10, 0x79, 0x95, 0x3F, 0x33, 0xAF, 0xF2, 0x67, 0xF4, 0x0E, 0x39, 0xD3, 0xF1, 0x41, - 0x22, 0x8B, 0x2F, 0x29, 0xD2, 0x38, 0x96, 0xDF, 0x4E, 0x83, 0xC0, 0x75, 0xB8, 0x5F, 0x39, 0x4D, - 0xBB, 0x08, 0x01, 0x3F, 0xFB, 0xF4, 0x2B, 0xE4, 0xD4, 0x7B, 0x96, 0xAF, 0x47, 0xE3, 0xEA, 0xDA, - 0x8E, 0x80, 0x49, 0x2F, 0xBD, 0x1F, 0x61, 0x44, 0x52, 0x8C, 0xE1, 0x00, 0x1A, 0x34, 0x9E, 0x25, - 0x99, 0x93, 0xF3, 0xE2, 0x35, 0xE5, 0x4B, 0xD5, 0xAC, 0xE8, 0xA4, 0xAC, 0xE0, 0xA9, 0x14, 0x8E, - 0xA8, 0xAE, 0xF6, 0x33, 0x30, 0x33, 0x0E, 0xEA, 0x4E, 0x0F, 0xB9, 0x7A, 0xA6, 0xA1, 0xAB, 0x4F, - 0xDA, 0xC3, 0x72, 0x91, 0xC1, 0x78, 0xDA, 0xD6, 0x9E, 0x82, 0xC5, 0x41, 0x81, 0xE4, 0x13, 0xDC, - 0x20, 0x4C, 0xB3, 0x3E, 0x28, 0xC4, 0x40, 0x25, 0xA0, 0x23, 0xFF, 0x50, 0x9C, 0x88, 0xE7, 0xD3, - 0x0C, 0x1C, 0x7C, 0x63, 0x7F, 0x0B, 0xF7, 0x63, 0xE8, 0xC4, 0x19, 0x78, 0xF4, 0x2E, 0x63, 0xC2, - 0xE3, 0xDB, 0xD0, 0x32, 0xF2, 0x1F, 0xCD, 0x09, 0x7B, 0xD7, 0x82, 0x5A, 0x9B, 0x89, 0x9A, 0x8B, - 0x49, 0x43, 0x3E, 0x25, 0x8D, 0xC5, 0xAD, 0x40, 0x1D, 0x07, 0x12, 0x68, 0xDC, 0x93, 0xA9, 0x8F, - 0x7D, 0xE1, 0x71, 0x81, 0x18, 0x19, 0x7D, 0x46, 0x2A, 0x11, 0x21, 0x61, 0x7E, 0xC3, 0x67, 0xF8, - 0x03, 0xB4, 0xF2, 0xB6, 0x75, 0x45, 0x34, 0x7E, 0x75, 0x5B, 0x33, 0xD6, 0xE5, 0xC5, 0xA4, 0xC8, - 0x58, 0x3F, 0xD1, 0xB1, 0xD6, 0x70, 0x48, 0xFC, 0x11, 0x89, 0x16, 0xA2, 0xF1, 0x52, 0x0C, 0x21, - 0xC5, 0x50, 0x8A, 0x8C, 0x5A, 0x26, 0x47, 0x96, 0x0C, 0xC4, 0x94, 0x25, 0xD9, 0x78, 0xBF, 0xCF, - 0x95, 0x61, 0xD4, 0x64, 0x24, 0x76, 0x5A, 0x4B, 0x5C, 0x4E, 0x1F, 0x97, 0xC1, 0x47, 0x52, 0x14, - 0xB4, 0x5C, 0xA6, 0x09, 0x68, 0x69, 0x97, 0xB5, 0x58, 0x09, 0xC0, 0x73, 0x37, 0xC0, 0x6F, 0x51, - 0x2D, 0x07, 0xFF, 0x12, 0xC1, 0x5F, 0x43, 0xAE, 0x33, 0x7A, 0x46, 0xF0, 0x5A, 0x91, 0x1F, 0xD2, - 0x4B, 0xFE, 0xB6, 0xEF, 0xB4, 0x70, 0x33, 0x00, 0xD2, 0x64, 0x6E, 0x64, 0xE5, 0x69, 0xD1, 0x77, - 0x60, 0x7C, 0x1A, 0x2F, 0xDD, 0x46, 0xD7, 0x30, 0x7B, 0x4C, 0xCF, 0xC7, 0x27, 0x64, 0x1A, 0x93, - 0xD9, 0x83, 0x31, 0x32, 0x6F, 0xDD, 0x07, 0x5C, 0x9A, 0x57, 0x4B, 0x21, 0xAF, 0x0E, 0x71, 0x0E, - 0xAF, 0xBE, 0x2B, 0xE1, 0x52, 0xE8, 0xE4, 0x0E, 0x99, 0x23, 0xD2, 0xC6, 0x7A, 0xA6, 0x93, 0x92, - 0xCF, 0xC7, 0x68, 0x52, 0xB7, 0x28, 0x43, 0x91, 0x1D, 0xA0, 0x11, 0x61, 0x69, 0x38, 0x51, 0xD5, - 0xFD, 0x06, 0xBD, 0x29, 0xDA, 0x1B, 0x7F, 0x60, 0x8D, 0x5F, 0x7A, 0xF6, 0x81, 0x96, 0x80, 0xAE, - 0x18, 0xC8, 0xF6, 0xD1, 0x07, 0x51, 0xA1, 0x48, 0xB0, 0x22, 0xFA, 0x34, 0x53, 0x01, 0x7E, 0x6E, - 0x09, 0x17, 0xBE, 0xBD, 0xDC, 0x14, 0x81, 0xE4, 0x50, 0x11, 0x49, 0x8B, 0x9F, 0x20, 0x69, 0xE6, - 0xD5, 0xDC, 0xD8, 0x61, 0x6D, 0xC7, 0x40, 0xE5, 0x50, 0xDC, 0xA7, 0x82, 0x54, 0x64, 0x8A, 0x5B, - 0x95, 0xB8, 0x63, 0xD8, 0x7A, 0x1C, 0x1C, 0x1D, 0xC7, 0x6B, 0xBE, 0x98, 0xCE, 0x58, 0x70, 0x73, - 0x74, 0xC8, 0x2A, 0x05, 0x97, 0x99, 0x50, 0x39, 0xB2, 0x09, 0x7B, 0x78, 0x4C, 0xA6, 0xD2, 0xBE, - 0x69, 0x1D, 0xC0, 0x33, 0x14, 0x8D, 0x64, 0x9D, 0x78, 0x73, 0xA5, 0x7D, 0xE3, 0x42, 0xA8, 0x3F, - 0xC3, 0x5B, 0xB9, 0xDA, 0xC7, 0xD0, 0x16, 0xFF, 0xF4, 0xF9, 0xCB, 0x3E, 0x79, 0xFE, 0x72, 0x4F, - 0x9D, 0xA7, 0x65, 0xB6, 0x96, 0x37, 0x0A, 0x61, 0x66, 0x4D, 0x18, 0x3F, 0x64, 0x0E, 0x4D, 0xDB, - 0xF1, 0x79, 0xF2, 0x2E, 0x5B, 0x94, 0x55, 0x96, 0x28, 0xD0, 0xC2, 0x4F, 0x8A, 0x2B, 0x27, 0x9D, - 0xDE, 0xDB, 0xBC, 0xE8, 0x1D, 0x38, 0x19, 0xB9, 0x9E, 0xE5, 0x53, 0xC1, 0x09, 0xAF, 0xBE, 0x97, - 0x96, 0x68, 0x69, 0x62, 0xDA, 0x02, 0x48, 0xA2, 0xD1, 0x03, 0x9F, 0x0A, 0x60, 0xD4, 0xEE, 0x37, - 0x5A, 0xFB, 0x6B, 0x98, 0x29, 0x06, 0x25, 0x52, 0xEE, 0x44, 0xD9, 0x39, 0x44, 0xA9, 0x13, 0x4C, - 0x92, 0x14, 0x26, 0x64, 0x83, 0xD1, 0x4D, 0xE1, 0x24, 0x22, 0x98, 0xB6, 0xC9, 0x39, 0xB1, 0x84, - 0xEA, 0x34, 0xC3, 0x44, 0x2C, 0x77, 0x69, 0x05, 0x9F, 0xD3, 0x0A, 0xBE, 0x24, 0x1E, 0xFF, 0x2C, - 0xAF, 0x3D, 0x59, 0x9E, 0x3C, 0xCA, 0xF6, 0x1D, 0x0D, 0x73, 0x95, 0x97, 0x43, 0xC5, 0x0A, 0x93, - 0xA9, 0x7F, 0xDF, 0x58, 0x68, 0xC7, 0x9A, 0xFA, 0x44, 0x09, 0x80, 0x0B, 0xCE, 0x3F, 0x1A, 0x1D, - 0x65, 0x61, 0xF0, 0x90, 0x89, 0xD5, 0x54, 0xEC, 0x88, 0x41, 0x00, 0x72, 0x3F, 0x28, 0x70, 0xE3, - 0x21, 0x75, 0x05, 0x6F, 0x4C, 0x71, 0x7C, 0x05, 0xEF, 0x78, 0x68, 0xB2, 0x4B, 0x93, 0xDE, 0x28, - 0x8B, 0xAB, 0x4E, 0xA6, 0x48, 0xE5, 0x14, 0x89, 0x82, 0x16, 0xC0, 0x26, 0x7E, 0xC4, 0x08, 0x85, - 0x47, 0xBA, 0x93, 0x64, 0x4B, 0x2B, 0x75, 0xFB, 0x6A, 0xD4, 0x0E, 0x69, 0x27, 0xC8, 0x12, 0x3F, - 0xA0, 0x84, 0xD2, 0x34, 0xEB, 0x11, 0x80, 0x25, 0x54, 0xFB, 0x97, 0x5A, 0x33, 0xD5, 0x60, 0x21, - 0x0E, 0x10, 0x50, 0x33, 0xC0, 0xD0, 0x0D, 0xA2, 0x31, 0xF5, 0x8E, 0x1C, 0x85, 0x98, 0x0A, 0xCE, - 0x47, 0xB2, 0xE6, 0xFF, 0xB1, 0x0C, 0x4D, 0xF5, 0xE4, 0x65, 0xAC, 0xED, 0x7C, 0x4D, 0xAB, 0xFB, - 0x39, 0x51, 0xB7, 0x9B, 0x5A, 0xF7, 0x4B, 0xA2, 0xEE, 0xAA, 0x5A, 0x57, 0xAF, 0x1E, 0xC4, 0x01, - 0xD6, 0x25, 0x85, 0x16, 0x29, 0xCF, 0xAB, 0xF2, 0x39, 0xBF, 0xCA, 0x97, 0xD4, 0x2A, 0x32, 0x79, - 0x89, 0x74, 0xC7, 0x51, 0x9E, 0x45, 0x81, 0xE9, 0x64, 0x63, 0xEC, 0x99, 0x64, 0x97, 0xC9, 0x44, - 0x82, 0x3E, 0x9A, 0x38, 0x76, 0x1D, 0xD7, 0x9F, 0x98, 0xE4, 0xA8, 0x48, 0x7D, 0xAB, 0x98, 0xCE, - 0x56, 0x6C, 0x03, 0xB1, 0xEC, 0x88, 0x2E, 0x5A, 0xA9, 0x62, 0xC1, 0xD3, 0x70, 0x89, 0x7B, 0x06, - 0x90, 0x8E, 0xA4, 0xF2, 0x49, 0xAE, 0x25, 0xCC, 0x8C, 0x96, 0x06, 0x59, 0x60, 0x84, 0xD8, 0x79, - 0x70, 0x94, 0x56, 0xBD, 0xD3, 0x84, 0x1C, 0x8C, 0x90, 0xC5, 0xC1, 0xF5, 0xB0, 0x55, 0xCB, 0x79, - 0x91, 0x80, 0x9A, 0x02, 0x67, 0x47, 0xCD, 0x4B, 0xDF, 0xA2, 0x5F, 0x57, 0x3E, 0xAF, 0x7C, 0xA9, - 0x29, 0xE9, 0xE9, 0x34, 0x4C, 0x78, 0x87, 0xD6, 0x9B, 0x49, 0x83, 0x72, 0x2A, 0x77, 0x7D, 0xFB, - 0xEF, 0x18, 0xE9, 0x54, 0xB9, 0xAA, 0x4C, 0xA3, 0x7D, 0x73, 0xBC, 0xEA, 0x96, 0x5E, 0x65, 0x61, - 0xF2, 0xBA, 0x13, 0x2A, 0x0A, 0x82, 0x8B, 0x1B, 0x6C, 0x80, 0x89, 0x54, 0xF0, 0x3C, 0x44, 0x75, - 0x56, 0x41, 0x9A, 0xC2, 0xEC, 0x13, 0x35, 0x9C, 0x68, 0xD7, 0xE6, 0x64, 0xD5, 0x70, 0x76, 0xD1, - 0x72, 0x65, 0x22, 0xA6, 0xF2, 0x02, 0x12, 0x32, 0xB1, 0xF6, 0x89, 0xA5, 0xE4, 0xCF, 0x8D, 0xDA, - 0xFF, 0xD2, 0xB7, 0xE3, 0x18, 0x49, 0x73, 0x6C, 0x0E, 0xEE, 0x1B, 0x29, 0x76, 0x35, 0x51, 0x6D, - 0xFD, 0xB9, 0x11, 0xDC, 0xDB, 0x3E, 0xB3, 0x03, 0x35, 0x9A, 0xD9, 0xAB, 0x80, 0x23, 0xAF, 0x02, - 0x6D, 0x7F, 0x7A, 0xCB, 0x0E, 0xA0, 0x0D, 0x78, 0x22, 0x6E, 0x5D, 0x7E, 0xD7, 0x49, 0x00, 0x1B, - 0xB5, 0x25, 0x8B, 0x25, 0x4B, 0x4D, 0x15, 0x6A, 0xBB, 0x68, 0xF9, 0x0C, 0x55, 0x9A, 0xF2, 0x61, - 0xF5, 0x2B, 0x03, 0x21, 0x9A, 0x31, 0x13, 0x3B, 0xFB, 0x30, 0x46, 0xA1, 0xF0, 0xEE, 0x3E, 0x6C, - 0x90, 0xB7, 0xC3, 0x97, 0xEB, 0x15, 0xDB, 0xE5, 0x87, 0x6D, 0xE6, 0xB6, 0xD3, 0x8F, 0x13, 0xAA, - 0x66, 0x6F, 0x91, 0x23, 0x03, 0x3B, 0xD9, 0x25, 0x77, 0x3A, 0xC6, 0xEA, 0x5A, 0x0B, 0x6D, 0x6E, - 0x4A, 0xF8, 0xD9, 0x67, 0x20, 0x02, 0x0A, 0xCA, 0xEF, 0xC4, 0x65, 0x23, 0x3B, 0xA0, 0x59, 0xA7, - 0x3B, 0x70, 0xFE, 0x1F, 0x01, 0xCF, 0x3A, 0xDF, 0x86, 0xD3, 0x5F, 0x2A, 0x23, 0x52, 0x4C, 0xED, - 0x04, 0x61, 0xD7, 0x30, 0xDA, 0x06, 0x8D, 0x38, 0x68, 0x4B, 0x08, 0xE9, 0x07, 0x40, 0x48, 0x7F, - 0x79, 0x9D, 0xBB, 0xFE, 0x48, 0x98, 0x2A, 0xEC, 0xFC, 0xC3, 0xB6, 0xA5, 0x77, 0xFF, 0x91, 0x34, - 0x96, 0x3C, 0x01, 0x28, 0x08, 0x85, 0x53, 0x80, 0x32, 0x77, 0xA4, 0xED, 0x2F, 0x0F, 0x03, 0xD2, - 0x16, 0xF1, 0xA0, 0x1F, 0x5D, 0x59, 0x28, 0xB9, 0x4A, 0x99, 0x24, 0x6E, 0xFA, 0x32, 0x59, 0x42, - 0x16, 0x74, 0xA2, 0x50, 0x06, 0x4E, 0x7F, 0xAA, 0x88, 0x2A, 0x49, 0x27, 0x8B, 0x57, 0xCF, 0xAC, - 0x94, 0x53, 0x4A, 0x48, 0x77, 0xE6, 0x49, 0x25, 0xA9, 0x76, 0xF3, 0xB6, 0xD6, 0xAA, 0x34, 0x56, - 0xD8, 0x5E, 0x47, 0x82, 0xF9, 0xBA, 0xCE, 0x2C, 0xD1, 0x40, 0x97, 0x3A, 0xB7, 0xE4, 0xB0, 0x59, - 0xB8, 0xC6, 0x93, 0xCF, 0x83, 0xF7, 0x26, 0x3E, 0xC3, 0xC1, 0xBD, 0x6B, 0x15, 0x7B, 0x67, 0x30, - 0x8E, 0x67, 0xD3, 0x3C, 0x32, 0x28, 0xC0, 0x14, 0x86, 0x43, 0xC0, 0xA0, 0x7A, 0x31, 0x25, 0x2F, - 0x28, 0x33, 0xBC, 0x0B, 0x74, 0xD7, 0xBF, 0xE9, 0xCE, 0x03, 0x04, 0x2B, 0xF9, 0xC8, 0x73, 0xB3, - 0xA6, 0x44, 0x00, 0x36, 0xD1, 0x32, 0x6A, 0x08, 0x55, 0xD4, 0x9B, 0x5F, 0x5E, 0x69, 0x85, 0x3E, - 0x59, 0x4B, 0x46, 0x2F, 0x59, 0x55, 0xEF, 0xFB, 0x19, 0x36, 0x69, 0xE6, 0x50, 0x1F, 0x6E, 0x19, - 0x08, 0xAD, 0xED, 0xC0, 0xA5, 0x6E, 0xDD, 0x8D, 0xD5, 0x02, 0xEF, 0x4D, 0xA6, 0xB2, 0x4C, 0xE1, - 0x41, 0x0E, 0xC7, 0x54, 0x06, 0xEB, 0x59, 0xA6, 0xD2, 0xDB, 0x24, 0x8C, 0x78, 0x71, 0xA6, 0x25, - 0x22, 0x37, 0xD3, 0x58, 0x96, 0x3C, 0xB1, 0xBF, 0x56, 0xD5, 0x92, 0xBD, 0xB4, 0xEA, 0x4E, 0xCF, - 0x19, 0x21, 0xB2, 0x59, 0x27, 0x7E, 0x4D, 0x8C, 0x6C, 0xCA, 0xA1, 0x5F, 0x3B, 0x94, 0x51, 0xF5, - 0xB5, 0x94, 0xEA, 0xA9, 0xFE, 0xCF, 0xAC, 0xD9, 0xFA, 0xD7, 0x44, 0x38, 0x7B, 0xDA, 0x3C, 0x10, - 0xEC, 0x0B, 0x69, 0xAF, 0xBA, 0x16, 0x8B, 0xC7, 0x8D, 0xE2, 0x69, 0x0B, 0x02, 0xE9, 0x66, 0x05, - 0xF5, 0xA6, 0xF9, 0x42, 0x64, 0x5B, 0x1B, 0xE2, 0x21, 0xCD, 0xB2, 0x5C, 0x44, 0x23, 0x99, 0x59, - 0x29, 0x1A, 0xC0, 0xAC, 0x5A, 0x31, 0x3F, 0x53, 0x6A, 0x29, 0xA3, 0x9B, 0x5D, 0x4B, 0x1D, 0xD4, - 0x5C, 0xB3, 0x49, 0xD8, 0xDF, 0x8A, 0xA6, 0x13, 0x79, 0xF9, 0xCA, 0x36, 0x9F, 0x08, 0xB3, 0x25, - 0xDB, 0x84, 0xA2, 0xEC, 0xB6, 0x8A, 0x9B, 0x51, 0xB4, 0x83, 0xA7, 0x8E, 0xEC, 0x62, 0xCD, 0x29, - 0x55, 0x49, 0x88, 0xCC, 0x2A, 0xE1, 0xEB, 0x5D, 0x2B, 0x44, 0x30, 0x52, 0xAC, 0x2B, 0x2A, 0x7F, - 0x8A, 0x5A, 0x58, 0x84, 0x01, 0x90, 0xAD, 0x2C, 0xEA, 0xB9, 0xA4, 0xBC, 0xA5, 0xA5, 0xD0, 0xC9, - 0x66, 0xAE, 0xD6, 0x16, 0xE5, 0x78, 0x32, 0xAB, 0xC5, 0x45, 0xE0, 0x4D, 0x69, 0xAB, 0x4B, 0x34, - 0x87, 0x7E, 0xB4, 0xE5, 0x45, 0x96, 0x16, 0x5A, 0x33, 0x7A, 0x8B, 0x62, 0x07, 0xBD, 0x49, 0xEC, - 0x5C, 0xE7, 0x66, 0xA1, 0x49, 0x9E, 0xB7, 0xE4, 0x1A, 0x6B, 0x6A, 0x93, 0x75, 0xF5, 0xC3, 0x46, - 0x2E, 0x8C, 0x37, 0xB2, 0x1D, 0xA8, 0x80, 0xD3, 0xE2, 0x62, 0x0C, 0x50, 0x92, 0x40, 0x7C, 0xD7, - 0x65, 0x3D, 0x90, 0x0C, 0x49, 0x62, 0xB8, 0x35, 0xDB, 0xBD, 0x90, 0x7F, 0x85, 0x91, 0x6E, 0xFF, - 0x3B, 0xD1, 0xD4, 0x8D, 0x7A, 0x3D, 0x0E, 0x36, 0x57, 0xEA, 0xB4, 0x0A, 0xD4, 0xF9, 0xDB, 0xDF, - 0x92, 0x95, 0x3C, 0x1C, 0x4C, 0x3D, 0x87, 0xEE, 0x7D, 0x92, 0x44, 0x0E, 0x71, 0x00, 0x81, 0xEE, - 0xB2, 0xDA, 0xA6, 0x09, 0x07, 0x88, 0x5E, 0x23, 0x32, 0x15, 0x16, 0xC6, 0x6F, 0x5D, 0xAA, 0xCA, - 0x4F, 0xAA, 0x14, 0xEE, 0x60, 0x45, 0xFB, 0xC9, 0xC9, 0x1D, 0xB5, 0x97, 0x04, 0xE6, 0x2D, 0x7A, - 0x34, 0x7D, 0x04, 0x4B, 0x30, 0x82, 0xF0, 0x78, 0x6C, 0xB5, 0x10, 0x9B, 0xF3, 0x88, 0xBE, 0xA8, - 0xC4, 0x12, 0x2B, 0xF8, 0x03, 0x0F, 0x72, 0xED, 0xAA, 0x1B, 0x8E, 0xE8, 0x2D, 0xE3, 0x2B, 0xA8, - 0x9A, 0x08, 0x87, 0xA7, 0x00, 0x76, 0xDF, 0x05, 0x1E, 0x32, 0x47, 0xF6, 0xD0, 0xD9, 0xA9, 0x8F, - 0xF0, 0x5D, 0x50, 0x27, 0x1F, 0xEE, 0x77, 0xE1, 0xE4, 0xF6, 0x6E, 0x85, 0xFC, 0x02, 0x7F, 0xF4, - 0x89, 0xBA, 0xE3, 0x7F, 0x58, 0xBB, 0xEF, 0xE2, 0x77, 0x11, 0x77, 0xD8, 0xBE, 0xE1, 0xD6, 0x7D, - 0xAA, 0x23, 0xDB, 0xDA, 0xA9, 0x03, 0x42, 0x76, 0x7E, 0xDA, 0x1B, 0x8D, 0xEA, 0x88, 0xA6, 0xC6, - 0x27, 0x5F, 0x5D, 0x6F, 0xBC, 0x4C, 0x2B, 0x2E, 0xB3, 0xA6, 0xE2, 0x1B, 0xCB, 0xF0, 0xB9, 0x8E, - 0xB8, 0x77, 0x1B, 0x83, 0x10, 0x92, 0xEC, 0x0E, 0x87, 0x10, 0x82, 0x4C, 0xE8, 0x59, 0x01, 0xB4, - 0x2B, 0x81, 0x17, 0xFD, 0x43, 0xE9, 0x16, 0xD5, 0x3B, 0xB4, 0xA3, 0x7D, 0x0C, 0x5F, 0xF0, 0xAA, - 0x49, 0xEC, 0x7C, 0x1A, 0x8F, 0xEE, 0x83, 0x60, 0x92, 0x9D, 0x81, 0x40, 0xA8, 0xC8, 0x13, 0x11, - 0xBC, 0x3F, 0x62, 0x79, 0x08, 0x60, 0xED, 0xA6, 0xA9, 0x12, 0x6A, 0x9A, 0x4D, 0x56, 0xD8, 0x84, - 0x06, 0x94, 0xCB, 0x6A, 0x84, 0xFB, 0x13, 0x0D, 0xDC, 0x31, 0xE8, 0x99, 0xB0, 0xA2, 0x87, 0xFD, - 0x89, 0xEB, 0xF8, 0x94, 0x54, 0xFA, 0xC6, 0x13, 0x4F, 0xC6, 0x81, 0x0E, 0xFA, 0x1F, 0x59, 0xEA, - 0x0C, 0xB2, 0xF7, 0x70, 0xE9, 0xAE, 0x21, 0xB9, 0x85, 0xCC, 0x18, 0xD1, 0xA5, 0x1D, 0x99, 0x0D, - 0xF9, 0x2B, 0xB0, 0x2C, 0x84, 0xE2, 0xC1, 0xE8, 0xBB, 0x46, 0xE2, 0x79, 0x86, 0x9E, 0xA4, 0xD0, - 0xBB, 0xB7, 0x81, 0x69, 0x13, 0xC1, 0x14, 0x2A, 0xE8, 0x05, 0x5F, 0x5B, 0x31, 0x29, 0xFC, 0x2C, - 0x90, 0x3A, 0xAA, 0xA2, 0x8A, 0xAD, 0x38, 0xEE, 0xBC, 0xDA, 0xC2, 0x46, 0x3D, 0xCC, 0x9B, 0xF6, - 0xA3, 0x07, 0x3E, 0x8D, 0x1D, 0x64, 0xCC, 0x05, 0x16, 0x14, 0x1B, 0xBC, 0x7D, 0xF6, 0xA0, 0x48, - 0xF6, 0x00, 0x42, 0xA5, 0xC2, 0x83, 0xC8, 0x2A, 0xE7, 0x0E, 0x24, 0x7B, 0xF5, 0xEA, 0xC7, 0x0F, - 0x26, 0xA5, 0xE3, 0xF5, 0x0C, 0x68, 0x82, 0x2D, 0xC5, 0x06, 0x55, 0xD0, 0x05, 0x87, 0xEE, 0xA3, - 0x03, 0x87, 0x7E, 0x21, 0x83, 0x08, 0xF7, 0xF9, 0x85, 0xE9, 0x5D, 0x3C, 0xFF, 0x04, 0x80, 0x3C, - 0x39, 0x14, 0x6C, 0x5C, 0x1C, 0xB7, 0x43, 0x8D, 0x19, 0x17, 0x77, 0x14, 0x5A, 0x3F, 0x74, 0x27, - 0xAE, 0x0C, 0x55, 0xDE, 0x27, 0x43, 0x31, 0xB3, 0x96, 0x08, 0x97, 0x00, 0x30, 0x04, 0xC7, 0x2C, - 0x03, 0x05, 0x61, 0x6B, 0x1F, 0x12, 0x3B, 0x41, 0xD6, 0x14, 0xA2, 0x2F, 0xA0, 0x24, 0x91, 0x1D, - 0x2A, 0xAA, 0x2D, 0x4A, 0xB5, 0x08, 0x78, 0x47, 0xDF, 0x87, 0x26, 0x5F, 0xE6, 0x05, 0x2B, 0xDE, - 0xD4, 0x1B, 0x05, 0xEE, 0x00, 0x32, 0xFC, 0x13, 0x11, 0x5C, 0x01, 0x18, 0xFF, 0x42, 0x7B, 0x01, - 0x26, 0x4D, 0x89, 0xAB, 0xBF, 0xC5, 0xF0, 0x21, 0x1F, 0x3C, 0x98, 0x39, 0xFF, 0x62, 0x52, 0x7A, - 0x76, 0x2C, 0x3E, 0x1E, 0xA1, 0x70, 0x8B, 0x09, 0x7F, 0x22, 0xF8, 0x21, 0x73, 0x89, 0x16, 0x26, - 0xF5, 0xDB, 0xA1, 0xED, 0xB4, 0x7D, 0xEF, 0xE1, 0x3B, 0x48, 0x38, 0x1F, 0xD6, 0x8B, 0xC3, 0x0E, - 0x22, 0x7C, 0xF4, 0x25, 0x99, 0x54, 0x69, 0x08, 0x17, 0x4E, 0xD1, 0xF0, 0x13, 0xAE, 0xD3, 0xE5, - 0x85, 0x21, 0x35, 0x0D, 0x09, 0x9C, 0x42, 0x62, 0xB0, 0x52, 0x22, 0x12, 0x27, 0x99, 0x86, 0x24, - 0xAE, 0x09, 0xA9, 0x48, 0xA2, 0xC0, 0x9B, 0x68, 0x55, 0x8B, 0xB6, 0x0D, 0x71, 0x58, 0x4E, 0x11, - 0xC1, 0xC7, 0x4A, 0xE2, 0x9C, 0xB9, 0x89, 0xBD, 0xE8, 0x04, 0x2F, 0x1B, 0xB9, 0x13, 0x82, 0x10, - 0x9E, 0x11, 0x88, 0x00, 0x50, 0xDA, 0x7C, 0x6E, 0xED, 0x4E, 0xAA, 0x4E, 0x49, 0xD8, 0x92, 0xE7, - 0x43, 0xC1, 0x83, 0x55, 0x87, 0x40, 0xFF, 0x4C, 0x41, 0x71, 0x79, 0x7D, 0x4A, 0x88, 0x29, 0xED, - 0x50, 0x6D, 0xBB, 0x84, 0x92, 0xCD, 0x56, 0xB3, 0x11, 0x2D, 0x45, 0x94, 0xAB, 0xC4, 0x83, 0x95, - 0x95, 0x4B, 0x7C, 0x47, 0xD4, 0xE9, 0x3D, 0x4B, 0x59, 0x15, 0xDF, 0x12, 0x66, 0x6F, 0x53, 0xA4, - 0x7D, 0x78, 0x62, 0x4E, 0xB0, 0xF4, 0x51, 0xB2, 0x62, 0x50, 0xB2, 0x62, 0xC1, 0xAF, 0x9D, 0x39, - 0x25, 0xC2, 0x62, 0xB0, 0x2A, 0xE7, 0xBE, 0x62, 0xD4, 0x6A, 0x42, 0x7C, 0x26, 0x9E, 0x3B, 0x84, - 0x97, 0xF2, 0x08, 0xE8, 0xF0, 0xD7, 0x0F, 0xA6, 0x63, 0x8D, 0xB0, 0xA7, 0xB0, 0x99, 0x82, 0x49, - 0xB6, 0xA7, 0x9A, 0x08, 0x5E, 0xE3, 0x62, 0x09, 0xA4, 0x4A, 0xB5, 0xA5, 0x77, 0xBC, 0x35, 0xFE, - 0xAA, 0x57, 0xA9, 0x96, 0xE6, 0xAD, 0xEB, 0xC1, 0x8D, 0x33, 0xFD, 0x6F, 0x46, 0x4B, 0x25, 0xE5, - 0x57, 0x4E, 0xB2, 0x2F, 0x31, 0xB7, 0xA2, 0xC2, 0x8C, 0x30, 0x07, 0x93, 0x30, 0xD0, 0x13, 0xEC, - 0x0D, 0x58, 0x54, 0x0E, 0x2B, 0x6C, 0x8F, 0x68, 0xC2, 0x26, 0xB4, 0x82, 0xD8, 0x9F, 0x81, 0x1B, - 0xC0, 0xF1, 0xF2, 0xAF, 0x60, 0x81, 0x17, 0xB3, 0x5A, 0x71, 0xC0, 0xFB, 0xA6, 0x27, 0x98, 0x69, - 0xCF, 0xCC, 0xE0, 0xBE, 0xED, 0xB9, 0x53, 0x42, 0x11, 0x87, 0x2B, 0x3E, 0x02, 0x3B, 0x15, 0x72, - 0x84, 0x29, 0x7B, 0x1C, 0x4D, 0x43, 0x98, 0x85, 0xFF, 0x9B, 0xCB, 0x27, 0xB6, 0x84, 0xA7, 0xAE, - 0xA8, 0xE1, 0x81, 0x53, 0xBD, 0x0B, 0xA9, 0x3A, 0x8C, 0x64, 0xA6, 0xD1, 0x74, 0x4C, 0x35, 0xE1, - 0x41, 0xAD, 0x16, 0x7A, 0x04, 0x5F, 0x6E, 0x67, 0xC8, 0xC4, 0x9D, 0x6C, 0x43, 0xA8, 0x8C, 0x3F, - 0x93, 0xF1, 0x19, 0xD7, 0xF4, 0xAF, 0x35, 0x28, 0x12, 0xA2, 0x30, 0x34, 0x0F, 0x37, 0x4B, 0x53, - 0x86, 0xA2, 0x3C, 0x65, 0xB9, 0x0C, 0x8D, 0x8D, 0x97, 0x73, 0x9A, 0xFD, 0xEC, 0x6B, 0xA4, 0xF3, - 0x21, 0xCB, 0x18, 0x33, 0x8B, 0xED, 0x3F, 0x9F, 0x58, 0xA5, 0x89, 0x17, 0x39, 0x23, 0x8A, 0x7F, - 0x35, 0xB6, 0x1C, 0x9B, 0x84, 0x52, 0x4B, 0x85, 0x2B, 0x4E, 0x8E, 0x6A, 0x70, 0xF7, 0x00, 0x42, - 0x04, 0x58, 0x00, 0x1D, 0x0C, 0x78, 0x1E, 0x8E, 0x7D, 0x58, 0x74, 0x1B, 0x89, 0xB7, 0x07, 0x59, - 0x30, 0xEA, 0xD5, 0xA0, 0x58, 0x92, 0x10, 0x66, 0xAF, 0x8D, 0x60, 0x2A, 0x0E, 0x28, 0x29, 0x47, - 0x4C, 0x66, 0x67, 0x4E, 0x6B, 0x14, 0x76, 0x32, 0x2A, 0x87, 0xF4, 0x0A, 0x62, 0xA2, 0xD7, 0xAD, - 0xB5, 0xCD, 0xB4, 0x2D, 0x00, 0x69, 0xC3, 0x72, 0xAC, 0xE4, 0x75, 0xAE, 0x50, 0x02, 0x98, 0xA8, - 0x73, 0xDA, 0xBC, 0x2D, 0x79, 0x9D, 0x4B, 0x4D, 0xF6, 0x32, 0x14, 0xCB, 0x4B, 0x74, 0x6E, 0x6A, - 0x4D, 0x32, 0xBB, 0x75, 0x6D, 0x95, 0xE9, 0xD6, 0xD4, 0x4A, 0x4B, 0xBF, 0x90, 0xD9, 0xB1, 0xF4, - 0x66, 0x91, 0x70, 0x5A, 0xFA, 0xAE, 0x75, 0x8C, 0x4E, 0x27, 0x35, 0x45, 0x6F, 0x60, 0x8F, 0x68, - 0x82, 0x51, 0xEC, 0xF8, 0x74, 0xB7, 0x9B, 0x3D, 0x7E, 0x4A, 0xE5, 0x42, 0xFD, 0x9D, 0x90, 0x8D, - 0xF6, 0x29, 0xDD, 0x2F, 0x95, 0xE9, 0x6E, 0x56, 0x2B, 0xC5, 0x73, 0xE3, 0x7E, 0x30, 0x39, 0x0A, - 0xEE, 0xB1, 0xE7, 0xE0, 0x40, 0x43, 0x38, 0x2F, 0x39, 0xFC, 0x70, 0xD0, 0xCB, 0x21, 0x57, 0xC8, - 0xAA, 0x76, 0xD2, 0x93, 0x79, 0x1D, 0xC2, 0xCF, 0xA3, 0x5D, 0x48, 0x75, 0x56, 0x04, 0x84, 0xDC, - 0x11, 0x52, 0x08, 0xB1, 0x74, 0xD4, 0x81, 0x4B, 0x39, 0x2C, 0x24, 0xDC, 0xFE, 0xE0, 0xEB, 0xA3, - 0x7D, 0x67, 0x9F, 0xB3, 0x36, 0x85, 0xDF, 0xE8, 0x12, 0xDA, 0x7C, 0xAD, 0xC3, 0xF3, 0x9E, 0x51, - 0xD9, 0x9F, 0x77, 0xFA, 0xFD, 0xC4, 0xE9, 0x42, 0xD9, 0x04, 0x8B, 0x18, 0x53, 0xF7, 0xC0, 0xC0, - 0x79, 0xB1, 0x22, 0x6C, 0x73, 0x95, 0x67, 0xA4, 0x8D, 0xA6, 0x1A, 0x10, 0xAD, 0xBC, 0xC6, 0x29, - 0x5B, 0x7C, 0x69, 0x71, 0xCA, 0xAB, 0xA7, 0xE7, 0xF8, 0x31, 0xCC, 0x74, 0x2A, 0x0F, 0xBE, 0xC2, - 0xCD, 0xC4, 0x9D, 0x1B, 0x0C, 0xD5, 0x99, 0x3F, 0x64, 0xD7, 0x8D, 0xF5, 0x30, 0xB5, 0xE7, 0x01, - 0x87, 0x49, 0x4A, 0x20, 0x95, 0xEC, 0x27, 0xFB, 0xD8, 0xA6, 0xAB, 0x1F, 0x04, 0xCF, 0xE1, 0xF1, - 0x24, 0x78, 0x96, 0x66, 0x9D, 0xFE, 0xF8, 0xC0, 0xF3, 0x4B, 0x1C, 0x28, 0xE4, 0xA5, 0xBA, 0x48, - 0x70, 0x4A, 0x52, 0x89, 0x20, 0xF2, 0xE3, 0x40, 0x40, 0x18, 0xD9, 0x39, 0x90, 0x4D, 0x03, 0x90, - 0x54, 0x4B, 0xA4, 0x6A, 0x06, 0x79, 0xE0, 0x29, 0x36, 0xC1, 0xD4, 0x21, 0x19, 0x6B, 0xC8, 0x71, - 0x9D, 0xEC, 0xDA, 0xD0, 0x60, 0xEA, 0x79, 0xB0, 0x8B, 0xA1, 0x7D, 0x82, 0xB1, 0xA6, 0x97, 0xA2, - 0xBD, 0x4F, 0xBE, 0x20, 0x67, 0x23, 0x9F, 0x2F, 0xD0, 0xD5, 0x04, 0x2A, 0x4B, 0x76, 0x04, 0xD8, - 0xA9, 0xA2, 0x23, 0xF4, 0x60, 0x69, 0x47, 0x6C, 0x11, 0x1F, 0x95, 0x5A, 0x70, 0x8C, 0x52, 0x4A, - 0x42, 0xD7, 0x30, 0x52, 0xA8, 0x8E, 0x85, 0xAC, 0xBF, 0x2E, 0x0F, 0x84, 0xC1, 0x50, 0x55, 0x41, - 0x1A, 0x19, 0x89, 0xB6, 0x2D, 0xA8, 0x1E, 0xA1, 0x92, 0x1F, 0xEA, 0xCD, 0x6B, 0x4A, 0x87, 0xAD, - 0x15, 0x8F, 0x8D, 0x52, 0x5F, 0x15, 0x69, 0xC8, 0x80, 0x1A, 0xBB, 0xE8, 0x8A, 0x59, 0x8A, 0xC3, - 0x1A, 0xD4, 0xD4, 0x42, 0x20, 0xBC, 0xE5, 0xC7, 0xE0, 0x10, 0x5C, 0x53, 0x9F, 0x5F, 0x55, 0xAE, - 0x20, 0x78, 0xAB, 0x0A, 0x48, 0xB5, 0xD9, 0xB1, 0x13, 0x94, 0xA5, 0xE4, 0xC8, 0xA6, 0xF5, 0x08, - 0x06, 0xED, 0xBC, 0x94, 0x32, 0x3B, 0xA7, 0xA0, 0x6D, 0x6A, 0x4C, 0x34, 0xB5, 0x03, 0x68, 0x48, - 0x27, 0x00, 0xA7, 0x0D, 0x24, 0x2C, 0x05, 0x80, 0xE0, 0x14, 0x9B, 0x3B, 0xB3, 0x38, 0xB1, 0x51, - 0xFE, 0x5F, 0x44, 0x56, 0x4F, 0x9F, 0x2E, 0x6C, 0xDB, 0x49, 0xED, 0x1C, 0x21, 0xFA, 0xC8, 0x2A, - 0x35, 0xEE, 0xE4, 0xBF, 0xE5, 0x6E, 0xA6, 0xE2, 0x15, 0x1F, 0xFC, 0x50, 0x20, 0xB0, 0x07, 0x3F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x6B, 0x15, 0x75, 0x15, 0x61, 0x0B, 0xDB, 0x03, 0xD0, 0x50, 0x6A, 0xF3, - 0x81, 0x6C, 0x72, 0xD9, 0xB5, 0xC4, 0xB6, 0xBA, 0xCE, 0x59, 0xF6, 0xC3, 0x7B, 0x1C, 0x48, 0xFA, - 0x49, 0xD9, 0x4F, 0xE4, 0xEA, 0x30, 0xD5, 0x71, 0x4B, 0x55, 0x87, 0x52, 0x5A, 0x31, 0x5D, 0x57, - 0x0F, 0xAE, 0x2F, 0x2F, 0x8F, 0xCE, 0xAF, 0xB4, 0x9D, 0x4D, 0xED, 0x67, 0x24, 0xF9, 0x44, 0x25, - 0x4F, 0x27, 0xA0, 0x12, 0xC1, 0x71, 0xE3, 0xC7, 0xF4, 0x50, 0x52, 0xF8, 0x2A, 0x32, 0xF5, 0x78, - 0x40, 0x1D, 0x51, 0x08, 0xB9, 0x0F, 0x35, 0xEA, 0xF8, 0x2A, 0xB1, 0x63, 0x3B, 0x1B, 0x52, 0x0A, - 0x49, 0x72, 0xBA, 0x6B, 0x80, 0xDF, 0x4B, 0x3D, 0xD8, 0xE9, 0x05, 0x53, 0x6E, 0x25, 0x8A, 0x27, - 0xCF, 0x35, 0xA7, 0xE5, 0x61, 0xE2, 0x32, 0x23, 0x31, 0xDB, 0x5F, 0x76, 0x1D, 0x7E, 0x25, 0xE3, - 0xAD, 0x5F, 0xDE, 0x8B, 0x69, 0x83, 0x84, 0xD4, 0x27, 0x47, 0x86, 0xF0, 0xE1, 0x3D, 0xCF, 0xA2, - 0x0D, 0xA6, 0xAB, 0x3B, 0xB1, 0x97, 0x3F, 0x77, 0x01, 0xFA, 0x5D, 0x80, 0x66, 0x8D, 0x95, 0xC5, - 0xF5, 0x45, 0x56, 0x58, 0x19, 0xA5, 0x76, 0x7D, 0x55, 0xA8, 0x4A, 0x59, 0x5D, 0x87, 0x0C, 0xB8, - 0x38, 0xDD, 0x44, 0x7F, 0x8C, 0xD0, 0x35, 0x14, 0x74, 0x6B, 0xA7, 0x96, 0xFE, 0xA8, 0x82, 0x96, - 0x9E, 0x66, 0x8A, 0xE2, 0x0E, 0x01, 0x6A, 0xD6, 0xA5, 0x85, 0xCD, 0xBB, 0xBC, 0x35, 0x80, 0x6A, - 0x8B, 0x90, 0x1B, 0xF2, 0x6C, 0x90, 0x5F, 0x41, 0x49, 0x1C, 0xB2, 0xDC, 0xC0, 0x0C, 0x49, 0xE0, - 0xEF, 0x07, 0x70, 0xEB, 0x5E, 0x68, 0x69, 0xD2, 0x6F, 0x56, 0x52, 0x39, 0x56, 0x62, 0xF6, 0x2A, - 0x88, 0x98, 0xC9, 0x31, 0xF1, 0x8A, 0x40, 0x51, 0x9D, 0xAE, 0x40, 0x93, 0x6E, 0x48, 0x54, 0x4C, - 0x3B, 0x49, 0xC3, 0xA5, 0xF2, 0x96, 0x49, 0xC2, 0xAF, 0xF2, 0xBD, 0xFD, 0x80, 0x1D, 0x64, 0xC2, - 0x7B, 0x39, 0x5E, 0xDD, 0xE7, 0x49, 0x59, 0x80, 0xB7, 0xCF, 0xB0, 0x84, 0x91, 0x71, 0x77, 0x02, - 0xFB, 0x8E, 0x65, 0x45, 0x01, 0xC7, 0x13, 0xAA, 0x45, 0xF8, 0x79, 0x0D, 0xBE, 0xC5, 0xFE, 0x87, - 0xC8, 0x76, 0xD0, 0xE1, 0x61, 0xDB, 0x0A, 0x7F, 0xA8, 0x99, 0xDE, 0x14, 0x3D, 0x2F, 0x43, 0x60, - 0x27, 0xA0, 0x4E, 0x20, 0xF7, 0x74, 0x03, 0x90, 0x1E, 0x39, 0x04, 0x97, 0x72, 0x0A, 0x0E, 0x61, - 0x46, 0x35, 0x09, 0x1F, 0xE4, 0xB4, 0xD5, 0x7E, 0xFB, 0xE0, 0xE2, 0xE2, 0xF2, 0xF0, 0xE4, 0x7C, - 0xEF, 0xEA, 0xE8, 0xE6, 0xE4, 0xBC, 0x77, 0x7D, 0x75, 0x73, 0xF5, 0xB9, 0x07, 0xBF, 0x7E, 0xDC, - 0x3B, 0x3D, 0x39, 0xBC, 0xB9, 0x3E, 0xFF, 0xE5, 0xFC, 0xE2, 0xD3, 0xB9, 0x70, 0x19, 0x60, 0x99, - 0xFE, 0xBD, 0x18, 0x56, 0x17, 0xE9, 0x51, 0xF0, 0x14, 0xD5, 0x15, 0x58, 0x78, 0x60, 0x8F, 0xCD, - 0x91, 0xAE, 0x88, 0x69, 0xB4, 0x8B, 0xBB, 0x53, 0x4C, 0x1F, 0xB4, 0x48, 0x5C, 0xA2, 0x12, 0xFD, - 0x42, 0xB6, 0x66, 0x01, 0xE4, 0x41, 0x8F, 0xD8, 0xC3, 0xF2, 0x33, 0x43, 0x7C, 0x16, 0xC8, 0x1B, - 0x7A, 0xBC, 0x37, 0xE9, 0x22, 0x37, 0xA4, 0xFC, 0x27, 0xAC, 0x9E, 0xFA, 0x82, 0x06, 0x1F, 0x98, - 0x0E, 0xC2, 0xC0, 0x18, 0xAA, 0x5C, 0x6D, 0x87, 0x08, 0x03, 0x51, 0x88, 0x10, 0x7C, 0xE7, 0x87, - 0x75, 0xF6, 0x10, 0xFB, 0xC8, 0xAA, 0xC1, 0x8B, 0x30, 0x34, 0x4B, 0x0F, 0xBB, 0x6D, 0xF5, 0x5B, - 0x68, 0xB9, 0x05, 0xCE, 0x60, 0x2D, 0x3A, 0x60, 0x6D, 0xE5, 0x22, 0x51, 0x7C, 0x94, 0x3B, 0x1C, - 0x82, 0x84, 0x9A, 0x56, 0x22, 0x8B, 0x7C, 0xCB, 0x1E, 0xDA, 0x41, 0x3C, 0x64, 0x44, 0x15, 0xA7, - 0x87, 0x96, 0x40, 0x0B, 0x99, 0x7F, 0x74, 0x3B, 0xA0, 0xE5, 0xDB, 0xD2, 0x52, 0x76, 0x9E, 0x5A, - 0x11, 0x23, 0xC0, 0xA9, 0x2F, 0xD7, 0x9B, 0xF1, 0x68, 0x2E, 0x2D, 0x01, 0x4F, 0xE1, 0xBD, 0x8C, - 0xA1, 0xEB, 0x5A, 0x45, 0x9A, 0x23, 0xD2, 0x3C, 0x1E, 0xF4, 0xF2, 0xED, 0xDB, 0x80, 0x5E, 0xE8, - 0x5B, 0x26, 0x84, 0xD0, 0xB4, 0x51, 0x49, 0x7A, 0xF9, 0x15, 0x3C, 0x3D, 0x10, 0x11, 0x91, 0x02, - 0xEF, 0x0F, 0x5F, 0x12, 0x06, 0x1A, 0x89, 0x99, 0xB8, 0xD0, 0x23, 0x27, 0x03, 0x90, 0xA9, 0x89, - 0xEB, 0xFB, 0x36, 0xF8, 0xA9, 0x31, 0x09, 0x81, 0xD9, 0x1B, 0x09, 0x4F, 0x3C, 0x53, 0x85, 0x2F, - 0x67, 0x67, 0xED, 0x31, 0xFB, 0x11, 0x3E, 0x22, 0xED, 0xD7, 0x65, 0xED, 0xD7, 0xB3, 0xB3, 0x7E, - 0xBF, 0xED, 0xD3, 0x1F, 0x19, 0x02, 0xD2, 0x7D, 0x27, 0x30, 0x96, 0x85, 0xEF, 0xB1, 0x56, 0x93, - 0x04, 0x67, 0x17, 0x42, 0x78, 0x66, 0xE7, 0xE2, 0xFF, 0x05, 0x2F, 0x3E, 0xC7, 0x6D, 0xA3, 0x35, - 0x32, 0x0B, 0xB7, 0x8C, 0xD5, 0xD5, 0xB5, 0x37, 0x34, 0x51, 0x12, 0xE5, 0x65, 0x5B, 0x70, 0x23, - 0x8C, 0xB5, 0xC1, 0x2E, 0xEA, 0xCE, 0x03, 0xF3, 0x05, 0xCC, 0x4A, 0x83, 0x46, 0xD4, 0x92, 0xE9, - 0xD7, 0x45, 0xE6, 0x08, 0x72, 0x48, 0x59, 0x40, 0x09, 0x32, 0xD6, 0x51, 0x77, 0xBD, 0xDD, 0x35, - 0xD6, 0xB6, 0x74, 0xB4, 0xC4, 0x1A, 0x6B, 0x17, 0xAD, 0xCE, 0x99, 0x94, 0x2E, 0xA5, 0x66, 0x35, - 0xA6, 0x66, 0xB9, 0x63, 0xAC, 0x2F, 0x77, 0x3A, 0xCB, 0xC6, 0x7A, 0xBB, 0xB3, 0xD1, 0xD5, 0xD2, - 0xA3, 0xD7, 0x7A, 0xBB, 0xE0, 0x9F, 0x3B, 0x27, 0xDA, 0xDE, 0x00, 0x51, 0x77, 0xF8, 0x11, 0x7B, - 0x8C, 0xA0, 0x4E, 0x07, 0xC8, 0xD9, 0xDC, 0xDC, 0xDA, 0xEA, 0xA2, 0xC6, 0x21, 0x13, 0x30, 0xA8, - 0xC2, 0x7E, 0x6B, 0x46, 0x44, 0x8A, 0xFB, 0x62, 0x07, 0x0F, 0xCD, 0x80, 0x28, 0xD5, 0xBE, 0x3D, - 0x74, 0x94, 0x1D, 0x87, 0x3C, 0x9D, 0x8D, 0x58, 0x9B, 0x08, 0xDA, 0x2B, 0x2A, 0x67, 0xDB, 0x36, - 0xF0, 0x85, 0xDD, 0x13, 0xB4, 0x5E, 0x0B, 0xF8, 0x07, 0xBE, 0xAA, 0xF4, 0xEA, 0x0C, 0x1C, 0x66, - 0x89, 0x52, 0xA3, 0xEC, 0x60, 0x3A, 0x45, 0xF0, 0x9D, 0x97, 0xE9, 0x50, 0x42, 0xA5, 0xA2, 0xB1, - 0x5D, 0x5E, 0x06, 0x50, 0x90, 0x03, 0x2D, 0x1E, 0x6E, 0xA2, 0xCB, 0x61, 0x6D, 0xB5, 0x1D, 0x96, - 0xB3, 0x98, 0x96, 0x60, 0xA6, 0xDF, 0x59, 0xEA, 0x34, 0x1A, 0xCF, 0xCB, 0xD1, 0x86, 0x78, 0x90, - 0x4F, 0x10, 0x69, 0xAC, 0x62, 0xA2, 0x48, 0x33, 0x2D, 0xFC, 0x97, 0xBF, 0x88, 0xB2, 0x15, 0x7F, - 0x4B, 0x19, 0xE0, 0x1D, 0xEA, 0x81, 0x0D, 0x4F, 0x32, 0xA4, 0x96, 0x6F, 0x34, 0x9B, 0x4D, 0x78, - 0x2D, 0x2C, 0xA9, 0x01, 0xA4, 0xC7, 0xB7, 0xAA, 0x2F, 0xEB, 0x0C, 0xB2, 0xE4, 0x06, 0xC1, 0x22, - 0x98, 0xE9, 0xDD, 0x15, 0x73, 0xCC, 0xA7, 0xB7, 0xBD, 0x84, 0xCD, 0xCE, 0x20, 0x0C, 0x17, 0x8B, - 0xB7, 0x17, 0x74, 0xBC, 0xC8, 0xE6, 0x15, 0x71, 0x21, 0x92, 0xC1, 0x70, 0x85, 0x23, 0xC3, 0x10, - 0x60, 0xB3, 0x40, 0x31, 0x43, 0x04, 0x22, 0x2C, 0x8E, 0x71, 0xBD, 0xE5, 0x9D, 0x48, 0x79, 0xB1, - 0xAB, 0x6D, 0x39, 0xBA, 0x8C, 0xA6, 0x67, 0xB4, 0x9D, 0x69, 0x40, 0x3D, 0x64, 0x32, 0x50, 0x45, - 0x88, 0xCE, 0xCE, 0x64, 0xD7, 0xE4, 0x63, 0x9B, 0x2C, 0xE6, 0x64, 0x01, 0x92, 0x97, 0xE6, 0x78, - 0x09, 0xA7, 0x21, 0x03, 0x17, 0x77, 0x0D, 0xBA, 0x46, 0x91, 0x71, 0x59, 0xEE, 0x24, 0x0C, 0xF0, - 0xB3, 0x8E, 0xC1, 0xCD, 0xF9, 0xC5, 0xCD, 0xE1, 0xD1, 0xC1, 0xC9, 0xD9, 0xDE, 0x69, 0x62, 0x38, - 0x7C, 0x4C, 0x56, 0x29, 0x0B, 0x3A, 0x17, 0x91, 0xA4, 0xF0, 0x5D, 0x92, 0x0D, 0x76, 0x66, 0x63, - 0x4D, 0xB4, 0xAC, 0x8B, 0xE7, 0x98, 0xC4, 0x71, 0xB1, 0x4D, 0xC8, 0xCF, 0xBF, 0x46, 0x7C, 0xE3, - 0x2D, 0x80, 0x75, 0xC2, 0xB3, 0x6F, 0x9A, 0xED, 0x58, 0x88, 0x6E, 0x29, 0x86, 0xB2, 0x82, 0x36, - 0xC8, 0xF2, 0x40, 0x23, 0x0E, 0x43, 0x24, 0x2B, 0x68, 0x75, 0x03, 0x02, 0xF3, 0x9B, 0x4A, 0x48, - 0x8B, 0x3C, 0xBD, 0x53, 0xB6, 0x41, 0x3A, 0xC4, 0x7F, 0x85, 0x61, 0x49, 0x0D, 0xAE, 0x8D, 0xB6, - 0x1D, 0xCA, 0xAC, 0x85, 0x09, 0x2A, 0xCF, 0x59, 0x3A, 0x65, 0x53, 0x67, 0xE4, 0x3A, 0x4C, 0xD8, - 0xD4, 0xD2, 0xB5, 0x68, 0xBA, 0xCA, 0xAB, 0xF8, 0x1C, 0x67, 0x6B, 0xE1, 0xB9, 0x1A, 0x4F, 0x52, - 0x49, 0x56, 0xD2, 0x66, 0xA8, 0x3A, 0x57, 0x4A, 0xCF, 0xC9, 0xF4, 0x19, 0xA9, 0x17, 0x5A, 0x99, - 0x43, 0xD4, 0x5B, 0x96, 0xB7, 0xD0, 0x80, 0x4E, 0x91, 0xD8, 0xB2, 0x02, 0xB8, 0x78, 0x59, 0x53, - 0xA4, 0x4D, 0x12, 0xAD, 0x0E, 0x13, 0x8E, 0xE5, 0x85, 0x49, 0xC7, 0xCD, 0xD9, 0xD9, 0xCD, 0xE1, - 0x5E, 0xFF, 0x43, 0x42, 0x46, 0xB8, 0xD7, 0x57, 0xAC, 0xD0, 0x78, 0x98, 0xC8, 0x72, 0x22, 0xB0, - 0x28, 0x16, 0x08, 0xAE, 0xEB, 0xA1, 0x29, 0x24, 0x86, 0x88, 0xC7, 0x2E, 0x6D, 0x98, 0xC5, 0x06, - 0x9D, 0xAF, 0x82, 0xAE, 0x4D, 0x8E, 0xF4, 0xEB, 0x1B, 0xB7, 0xF4, 0x51, 0xEB, 0x46, 0xA3, 0x16, - 0xEE, 0xAA, 0x17, 0x30, 0x6A, 0x44, 0xFF, 0xBF, 0xC2, 0x81, 0x7B, 0x55, 0x8B, 0xA4, 0xC0, 0xA6, - 0x62, 0x6B, 0xA5, 0xD8, 0xAD, 0x6E, 0xDC, 0x2D, 0xCD, 0x62, 0xF9, 0x3B, 0x58, 0xC7, 0x98, 0x90, - 0xC6, 0x56, 0xA2, 0x39, 0xCB, 0xE8, 0x76, 0x1E, 0xB3, 0x62, 0x1D, 0xFF, 0x23, 0xD9, 0xC0, 0x35, - 0x2C, 0x5A, 0xA4, 0x86, 0x2D, 0x3C, 0x47, 0xD1, 0x4F, 0xE5, 0x9A, 0x3F, 0x62, 0xDD, 0x68, 0xC4, - 0xD0, 0xA2, 0x4E, 0x38, 0x4C, 0x71, 0xBC, 0xB2, 0x61, 0x7B, 0x8D, 0xAA, 0xF5, 0x7F, 0xA6, 0x56, - 0x0D, 0x2D, 0x67, 0xD2, 0xDD, 0x95, 0x06, 0x04, 0xBB, 0xBE, 0xD2, 0x14, 0x44, 0xF9, 0x4B, 0xB6, - 0x9A, 0x6A, 0xA8, 0xAD, 0x66, 0x58, 0x84, 0x37, 0xC8, 0xC3, 0x2B, 0x02, 0xC1, 0xD6, 0x0F, 0x46, - 0xE5, 0x38, 0x1A, 0xB5, 0x85, 0xDC, 0x69, 0x00, 0x7F, 0x98, 0xFC, 0xFE, 0x00, 0x5A, 0xF5, 0x5D, - 0xF9, 0x3A, 0x00, 0x4C, 0xDA, 0xB7, 0x84, 0x6D, 0x63, 0x8C, 0xEA, 0xCA, 0x44, 0xAA, 0xB7, 0x10, - 0x0E, 0x06, 0xF2, 0xA3, 0xE4, 0x40, 0x3D, 0x25, 0x46, 0x20, 0xAE, 0xA5, 0x93, 0x9F, 0x94, 0xAB, - 0x03, 0x6E, 0x36, 0x95, 0xAE, 0x46, 0x59, 0x50, 0x89, 0x46, 0x02, 0x8B, 0x8B, 0x60, 0x53, 0x3F, - 0xDF, 0x63, 0x81, 0x8B, 0xBF, 0x35, 0x05, 0x86, 0x27, 0xAE, 0x9A, 0x45, 0x42, 0xD2, 0x2E, 0xE4, - 0x66, 0x24, 0xF5, 0x46, 0x3C, 0x44, 0x91, 0xD3, 0xE0, 0x8C, 0xE0, 0xE6, 0x0B, 0x2D, 0x3C, 0x02, - 0xCC, 0x1B, 0x66, 0xFF, 0xF3, 0xD9, 0xFE, 0xC5, 0x29, 0x83, 0x9A, 0x88, 0xD8, 0x19, 0xB9, 0xCE, - 0x90, 0xE6, 0x2C, 0x39, 0xC4, 0x43, 0x0F, 0xAB, 0x56, 0x98, 0xE4, 0x80, 0x28, 0x63, 0x4C, 0xCE, - 0x7B, 0x2A, 0x04, 0x7D, 0x45, 0x32, 0x89, 0x37, 0x8C, 0x6D, 0x35, 0x63, 0x57, 0x54, 0xFC, 0x0E, - 0xA5, 0xAB, 0xC5, 0x48, 0x01, 0xA4, 0x48, 0xD9, 0x20, 0x39, 0x9D, 0xDF, 0x34, 0x35, 0xE9, 0xC1, - 0x66, 0x1C, 0xEA, 0x54, 0xFA, 0xA2, 0x69, 0x95, 0xE0, 0xE5, 0x12, 0x99, 0x69, 0x54, 0xF1, 0x84, - 0x55, 0xB7, 0x35, 0x97, 0x29, 0x73, 0x92, 0x9A, 0x6A, 0xE4, 0x2D, 0xBF, 0x08, 0x7D, 0x4C, 0x02, - 0xAB, 0x51, 0xF8, 0xDF, 0xFF, 0x25, 0x93, 0x08, 0xDF, 0xEA, 0x35, 0x85, 0xD0, 0x4A, 0x90, 0x91, - 0xB6, 0xEF, 0xAA, 0xC6, 0x99, 0x4B, 0xFF, 0xFB, 0x4D, 0x69, 0x52, 0xCF, 0x2E, 0x8C, 0xF3, 0x86, - 0x28, 0x9C, 0xD0, 0x16, 0x02, 0x38, 0x21, 0x01, 0x73, 0xE2, 0x82, 0xB0, 0xF1, 0x59, 0x08, 0xDD, - 0x0B, 0x06, 0xAF, 0x9C, 0x88, 0x9B, 0xBF, 0x13, 0xF5, 0x2C, 0x51, 0x7E, 0xA6, 0x33, 0xEF, 0x97, - 0xA2, 0x9C, 0x43, 0xC8, 0xA6, 0xBC, 0xF8, 0xE2, 0xB0, 0xB1, 0x80, 0xC5, 0x41, 0x9A, 0x8F, 0x25, - 0x97, 0x87, 0x04, 0xA7, 0x5E, 0x6A, 0xD9, 0x48, 0x4E, 0xF8, 0xB2, 0x2B, 0x87, 0x8E, 0xF4, 0xE5, - 0x97, 0xA2, 0x7D, 0xF6, 0x55, 0x45, 0x47, 0x7E, 0x3D, 0xB9, 0xDC, 0xFC, 0xAD, 0x56, 0x5B, 0x58, - 0x2F, 0x9A, 0xD5, 0x97, 0x2E, 0x1D, 0xF5, 0x68, 0xE1, 0xCC, 0x4F, 0xD7, 0xBA, 0x73, 0x12, 0x7B, - 0x21, 0x42, 0x55, 0xAF, 0x25, 0xE6, 0x2C, 0x46, 0xB3, 0xF6, 0x25, 0x7B, 0x2C, 0x5E, 0xBA, 0x37, - 0xEA, 0x8A, 0xB2, 0x80, 0xB9, 0x9D, 0xD9, 0x25, 0x4D, 0x00, 0x93, 0x8C, 0x32, 0xE9, 0xD8, 0x19, - 0xBA, 0x51, 0x0D, 0xE0, 0xB5, 0x2E, 0xDE, 0x6C, 0xE5, 0x6F, 0xD6, 0x4A, 0x3B, 0x80, 0xB0, 0xF4, - 0x41, 0x73, 0x1B, 0xA9, 0x09, 0x36, 0x42, 0x17, 0x04, 0x72, 0xB2, 0x6E, 0xB1, 0x9C, 0x70, 0xE4, - 0x18, 0x7C, 0xEF, 0x49, 0xBE, 0xA0, 0x2C, 0xA9, 0xDD, 0x2E, 0x9C, 0xBE, 0xC3, 0xE0, 0xAB, 0x65, - 0xC1, 0x6F, 0x86, 0x7C, 0x96, 0x0F, 0xFC, 0x50, 0x4F, 0x4A, 0xC3, 0xC6, 0x73, 0xDE, 0x2D, 0x01, - 0x64, 0x70, 0x7E, 0x95, 0xCA, 0x19, 0xF4, 0x25, 0x96, 0x13, 0x58, 0xB6, 0x09, 0x38, 0x92, 0x15, - 0x80, 0x43, 0x37, 0xE1, 0xDD, 0x34, 0x87, 0xE5, 0xC8, 0x0A, 0xED, 0x01, 0x42, 0xEC, 0x38, 0x2F, - 0x8A, 0xBD, 0x00, 0xB3, 0x0E, 0xF5, 0xFE, 0xA3, 0x1D, 0x0C, 0xEE, 0x51, 0x66, 0x1D, 0xEA, 0x4F, - 0xC1, 0x5E, 0x79, 0x7F, 0xAB, 0x66, 0x38, 0x66, 0xE3, 0x52, 0xBB, 0x76, 0xBE, 0x39, 0xBA, 0x77, - 0xC3, 0xD5, 0xEC, 0xDA, 0x03, 0x08, 0xE2, 0x6E, 0x14, 0x36, 0x06, 0xA4, 0xA1, 0x13, 0x0D, 0x1F, - 0x73, 0xC6, 0x49, 0xCE, 0x66, 0xE9, 0x58, 0x63, 0x33, 0xEB, 0x9C, 0xB1, 0xDE, 0x64, 0xA2, 0x45, - 0x8B, 0xC4, 0xCB, 0x96, 0xED, 0x74, 0xE4, 0xCB, 0x0B, 0x43, 0x4E, 0x77, 0x3A, 0x59, 0xCC, 0x8E, - 0x0C, 0x58, 0x0B, 0xE8, 0x75, 0x26, 0x6A, 0xC9, 0x7A, 0xB6, 0x80, 0x5E, 0x8B, 0x4A, 0x35, 0x9B, - 0x01, 0x0B, 0xE9, 0x79, 0x31, 0xF4, 0x8C, 0x09, 0x8B, 0x21, 0x40, 0x5D, 0x59, 0x32, 0xC5, 0x6F, - 0x39, 0x87, 0x8A, 0xEF, 0xF2, 0x22, 0x21, 0x29, 0xA3, 0xEF, 0xFF, 0x1F, 0x67, 0xE8, 0x7F, 0x23, - 0xE1, 0x5A, 0x00 + 0xFF, 0x0A, 0x62, 0x31, 0x57, 0xA6, 0xB4, 0x5B, 0x21, 0xE8, 0x9A, 0x54, 0x95, 0xCE, 0xBB, 0x90, + 0x98, 0x78, 0x62, 0x32, 0xAD, 0x27, 0x72, 0x45, 0x73, 0x13, 0x0D, 0x6F, 0x98, 0xB2, 0x42, 0x1B, + 0x1C, 0x32, 0x27, 0x52, 0x6C, 0x7A, 0xF2, 0xB5, 0x73, 0x19, 0x5E, 0x3F, 0x30, 0x83, 0xA9, 0x0F, + 0xAE, 0x6A, 0x8A, 0x16, 0xCF, 0x46, 0x4A, 0xEA, 0xE7, 0x00, 0x4E, 0x4E, 0x75, 0x36, 0x2B, 0xF5, + 0xB5, 0x6A, 0x19, 0xD3, 0x5D, 0xC1, 0xE2, 0x7A, 0x43, 0x1C, 0xF4, 0x4C, 0xDB, 0xC3, 0x16, 0x55, + 0xCA, 0xCA, 0xFA, 0x73, 0x1B, 0x38, 0xC7, 0xB4, 0x0A, 0x2B, 0xD4, 0xF0, 0x0B, 0x24, 0x9B, 0x3E, + 0xD6, 0xE7, 0x53, 0x60, 0x6E, 0x10, 0x60, 0xA7, 0x2D, 0xC6, 0xA7, 0x4C, 0x30, 0xF6, 0xCE, 0xF6, + 0x0E, 0x7C, 0xB5, 0xE1, 0x39, 0x7F, 0x3D, 0x5E, 0x7B, 0x8B, 0x4F, 0x71, 0x1E, 0xF9, 0x93, 0x73, + 0xF7, 0xB1, 0x47, 0xDA, 0xFB, 0x7A, 0x9D, 0x4D, 0xA8, 0xA3, 0x5A, 0x35, 0x91, 0x8E, 0x62, 0x18, + 0x6A, 0x33, 0x5E, 0xA2, 0xA1, 0x9B, 0x36, 0xA4, 0x17, 0x74, 0x3C, 0x51, 0x40, 0xAA, 0x4B, 0x81, + 0x08, 0x48, 0xA2, 0x23, 0xBA, 0x8A, 0x32, 0x2D, 0xEB, 0xE8, 0x81, 0xFC, 0x02, 0xAE, 0x1E, 0xD8, + 0x81, 0x17, 0xB5, 0x0E, 0x2F, 0xCE, 0x88, 0x02, 0x0F, 0xE0, 0x1B, 0x19, 0x17, 0x0C, 0xB9, 0x57, + 0x1A, 0x18, 0xAA, 0x34, 0xD1, 0xCE, 0x2E, 0x50, 0x19, 0x8B, 0x3F, 0x67, 0x5E, 0x81, 0x9B, 0xAD, + 0x64, 0x5A, 0x03, 0xF9, 0x32, 0x8B, 0x06, 0x54, 0xC0, 0x8E, 0x95, 0xFA, 0x61, 0x92, 0x5F, 0x18, + 0xE8, 0xE8, 0x26, 0xCB, 0x06, 0x77, 0x4A, 0xF3, 0x89, 0xFC, 0xA2, 0x5C, 0x69, 0xB1, 0x7A, 0xBF, + 0xD9, 0x5F, 0xDB, 0xAE, 0x33, 0x18, 0xD9, 0x03, 0x08, 0x07, 0x8B, 0x98, 0xDC, 0x48, 0x3E, 0x97, + 0x20, 0xE7, 0x00, 0xC9, 0xC8, 0x41, 0x3E, 0xD4, 0x3E, 0xDA, 0xD7, 0xD4, 0x30, 0x8C, 0xC1, 0x04, + 0xED, 0xA0, 0xC7, 0xAB, 0x81, 0xD4, 0xC7, 0x03, 0xF9, 0x24, 0x8C, 0x56, 0x52, 0x11, 0x8A, 0x0E, + 0x2D, 0xDF, 0x65, 0x8D, 0xA0, 0x85, 0x3A, 0x17, 0x02, 0x63, 0xCC, 0x59, 0xF4, 0x09, 0xDD, 0xD0, + 0x13, 0xA8, 0x79, 0x0D, 0xA6, 0x3C, 0x79, 0x15, 0x9F, 0x96, 0x89, 0x35, 0x8D, 0xCF, 0x1B, 0xA4, + 0xA4, 0xBC, 0x67, 0x9A, 0x86, 0xEE, 0x29, 0x33, 0x72, 0xD3, 0xEB, 0x3B, 0x76, 0x0C, 0xAD, 0xE6, + 0xD2, 0xAB, 0x10, 0x52, 0xB1, 0x2E, 0xA5, 0x51, 0x1B, 0xF7, 0x27, 0xA3, 0xD3, 0xFA, 0x2E, 0x65, + 0xBF, 0x43, 0x52, 0xBD, 0x83, 0xB3, 0xBD, 0x6F, 0xC2, 0xBA, 0x0B, 0x67, 0x90, 0xCC, 0xDE, 0x0E, + 0xA3, 0xD3, 0xC8, 0x6C, 0xBD, 0x7D, 0x4F, 0x63, 0x8A, 0xE7, 0xDE, 0xD9, 0xF7, 0x6A, 0xA8, 0xB2, + 0xB6, 0xAF, 0xAC, 0x2B, 0x19, 0x7D, 0x65, 0xCC, 0xD0, 0xF4, 0x55, 0xAE, 0x96, 0x66, 0x04, 0x63, + 0x76, 0xAE, 0xB1, 0xEB, 0x9B, 0xF6, 0xA0, 0xB4, 0x35, 0x4C, 0x4A, 0x51, 0xAC, 0x7D, 0x11, 0x22, + 0x56, 0x18, 0x1B, 0x9D, 0xF6, 0x9A, 0x42, 0xFA, 0x77, 0x25, 0x08, 0xB9, 0x9C, 0x29, 0xA2, 0x0C, + 0xF2, 0x8E, 0x21, 0x1F, 0xC5, 0xD3, 0xB0, 0x57, 0x04, 0x6F, 0x64, 0x01, 0xD7, 0xCB, 0x9A, 0xEE, + 0x19, 0x8B, 0xEA, 0x22, 0x56, 0xF6, 0x51, 0x8C, 0x58, 0x70, 0x34, 0xCE, 0xFA, 0xC5, 0x9F, 0x76, + 0x61, 0xC2, 0x59, 0x08, 0x44, 0x7A, 0xF7, 0xA3, 0x84, 0xB9, 0x73, 0xE9, 0x7E, 0xA1, 0x87, 0x60, + 0x95, 0xEE, 0x73, 0xB7, 0xE4, 0x59, 0xBA, 0x9F, 0x07, 0x42, 0xDB, 0x7D, 0xC5, 0xC9, 0x74, 0x0E, + 0x2C, 0x48, 0x42, 0xCC, 0x63, 0x83, 0xC6, 0x9F, 0x95, 0xB4, 0xB2, 0x6C, 0x9F, 0xE5, 0x8B, 0xE5, + 0xF9, 0x0B, 0x8A, 0xF3, 0x24, 0x17, 0x9E, 0x90, 0xAF, 0x3C, 0x9D, 0x3F, 0x70, 0xD0, 0x81, 0xF4, + 0x43, 0x90, 0x70, 0xCB, 0xC1, 0xA3, 0x99, 0x38, 0x93, 0x84, 0x15, 0x45, 0x6F, 0x19, 0x29, 0x52, + 0x11, 0x36, 0xD9, 0x37, 0xA7, 0xD6, 0xA1, 0xE7, 0x4E, 0xE0, 0x51, 0xF9, 0x94, 0x45, 0x46, 0x4A, + 0xB2, 0x57, 0x40, 0x84, 0x0A, 0x50, 0xD5, 0x49, 0x59, 0x04, 0x0A, 0x51, 0xC5, 0xD7, 0xC6, 0x92, + 0x54, 0x55, 0xC7, 0x57, 0x8A, 0x0B, 0xDA, 0x59, 0x90, 0xFE, 0x72, 0xC0, 0xAC, 0xB3, 0x21, 0xF7, + 0x4D, 0x82, 0x94, 0xE1, 0x9F, 0x10, 0x6D, 0x46, 0xCF, 0x52, 0x7E, 0x55, 0xD6, 0x15, 0x81, 0xA0, + 0x65, 0x86, 0x9A, 0x6E, 0x72, 0x56, 0x16, 0x94, 0x49, 0x5F, 0x99, 0x29, 0x3E, 0x87, 0x38, 0x30, + 0xED, 0x91, 0x5F, 0x9E, 0x15, 0xE5, 0x60, 0xE9, 0x99, 0x42, 0x0F, 0xCE, 0xF3, 0xE0, 0x46, 0x08, + 0xA8, 0x18, 0x1B, 0xE8, 0x39, 0xB2, 0x72, 0xC7, 0xF3, 0x5A, 0xEB, 0x97, 0x04, 0xC1, 0x3A, 0x31, + 0x8F, 0xF5, 0x40, 0x06, 0x97, 0x26, 0xF6, 0x1A, 0xD3, 0xC8, 0xCC, 0x8B, 0x40, 0x26, 0xBC, 0x42, + 0x8B, 0x80, 0x9A, 0x5D, 0x7C, 0x56, 0x66, 0x24, 0x12, 0x65, 0xA7, 0x49, 0xBF, 0x58, 0xBB, 0xBA, + 0xDC, 0x17, 0x84, 0xA2, 0xED, 0xB4, 0x94, 0xD6, 0x7B, 0xD6, 0x7E, 0x17, 0xCE, 0x11, 0xAE, 0xB2, + 0x20, 0x6E, 0x38, 0x23, 0x17, 0x0A, 0x01, 0xD2, 0x1D, 0xC6, 0xA2, 0x37, 0xF4, 0xAA, 0x70, 0x41, + 0xBE, 0x64, 0xD1, 0xA0, 0x90, 0x5F, 0xCD, 0x5B, 0x24, 0x8A, 0xC4, 0xC9, 0x61, 0x01, 0xA8, 0xE4, + 0x0B, 0xB0, 0x39, 0x23, 0x88, 0xBC, 0xCB, 0x9F, 0x99, 0x77, 0xF9, 0x33, 0x7A, 0x87, 0x9C, 0xE9, + 0xF8, 0x20, 0x91, 0xCD, 0x97, 0x14, 0x69, 0x1C, 0xCC, 0x6F, 0xA7, 0x41, 0xE0, 0x3A, 0xDC, 0xBF, + 0x9C, 0xA6, 0x5F, 0x84, 0xC0, 0x9F, 0x7D, 0xFA, 0x15, 0x72, 0xEB, 0x3D, 0xCB, 0xD7, 0xA4, 0x71, + 0x75, 0x6D, 0x47, 0xC0, 0xA4, 0x97, 0xDE, 0x8F, 0x30, 0x32, 0x29, 0xC6, 0x70, 0x00, 0x0D, 0x1A, + 0xCF, 0x92, 0xCC, 0xC9, 0xF9, 0xF1, 0x9A, 0xF2, 0xE5, 0x6A, 0x56, 0x94, 0x52, 0x56, 0x10, 0x55, + 0x0A, 0x47, 0x54, 0x97, 0xFB, 0x19, 0x98, 0x19, 0x07, 0x77, 0xA7, 0x87, 0x5E, 0x3D, 0xD3, 0x10, + 0xD6, 0x27, 0xED, 0x61, 0xB9, 0xC8, 0x60, 0x3C, 0x6D, 0x6B, 0x4F, 0xC1, 0xE2, 0xA0, 0x40, 0x12, + 0x0A, 0x6E, 0x10, 0xA6, 0xD9, 0x1F, 0x14, 0x62, 0xA0, 0x12, 0xD0, 0x91, 0x7F, 0x28, 0x4E, 0xC4, + 0xF5, 0x69, 0x06, 0x0E, 0xBE, 0xB1, 0xBF, 0x85, 0x7B, 0x32, 0x74, 0xE2, 0x0C, 0x3C, 0x7A, 0x97, + 0x31, 0xE1, 0x71, 0x6E, 0x68, 0x19, 0xF9, 0x8F, 0xE6, 0x84, 0xBD, 0x6F, 0x41, 0xAD, 0xCD, 0x44, + 0xCD, 0xC5, 0xA4, 0x21, 0x9F, 0x92, 0xC6, 0xE2, 0x57, 0xA0, 0x8E, 0x03, 0x89, 0x34, 0xEE, 0xC9, + 0xD4, 0xC7, 0xBE, 0xF0, 0xC8, 0x40, 0x8C, 0x8C, 0x3E, 0x27, 0x95, 0x88, 0x94, 0x30, 0xBF, 0xE1, + 0x33, 0xFC, 0x01, 0x5A, 0x79, 0xDB, 0xBA, 0x22, 0x1A, 0xC7, 0xBA, 0xAD, 0x19, 0xEB, 0xF2, 0x62, + 0x52, 0x64, 0xAC, 0x9F, 0xE8, 0x58, 0x6B, 0x38, 0x24, 0xFE, 0x88, 0x44, 0x0B, 0x51, 0x79, 0x29, + 0x86, 0x90, 0x62, 0x28, 0x45, 0x46, 0x2D, 0x93, 0x23, 0x4B, 0x06, 0x62, 0xCA, 0x92, 0x6C, 0xBC, + 0xDF, 0xE7, 0xCA, 0x30, 0x6A, 0x32, 0x12, 0x3B, 0xAD, 0x25, 0x2E, 0xA7, 0x8F, 0xCB, 0xE0, 0x2B, + 0x29, 0x0A, 0x5A, 0x2E, 0xD3, 0x04, 0xB4, 0xB4, 0xCB, 0x5A, 0xAC, 0x04, 0xE0, 0xB9, 0x1B, 0xE0, + 0xB7, 0xA8, 0x96, 0x83, 0x7F, 0x89, 0xE0, 0xAF, 0x21, 0xD7, 0x19, 0x3D, 0x23, 0x78, 0xB5, 0xC8, + 0x0F, 0xE9, 0x25, 0x7F, 0xDB, 0x77, 0x5A, 0xB8, 0x19, 0x00, 0x69, 0x52, 0x37, 0xB2, 0xF2, 0xB4, + 0xE8, 0x7B, 0x30, 0x3E, 0x8D, 0x9B, 0x6E, 0xA3, 0x6B, 0x98, 0x3D, 0xA6, 0xE7, 0xE3, 0x13, 0x32, + 0x8D, 0xC9, 0xEC, 0xC1, 0x18, 0x99, 0xB7, 0xEE, 0x03, 0x2E, 0xCD, 0xAB, 0xA5, 0x90, 0x57, 0x87, + 0x38, 0x87, 0x57, 0xDF, 0x95, 0xB0, 0x29, 0x74, 0x72, 0x87, 0xCC, 0x11, 0x69, 0x63, 0x3D, 0xD3, + 0x49, 0xC9, 0xE7, 0x63, 0x34, 0xA9, 0x5B, 0x94, 0xA1, 0xC8, 0x0E, 0xD0, 0x88, 0xB0, 0x34, 0x9C, + 0xA8, 0xEA, 0x7E, 0x83, 0xDE, 0x14, 0xED, 0x8D, 0x3F, 0xB0, 0xC6, 0x2F, 0x3D, 0xFB, 0x40, 0x4B, + 0x40, 0x57, 0x0C, 0x64, 0xFB, 0xE8, 0x83, 0xA8, 0x50, 0x24, 0x58, 0x11, 0x7D, 0x9A, 0xA9, 0x00, + 0x3F, 0xB7, 0x84, 0x0B, 0xDF, 0x5E, 0x6E, 0x8A, 0x40, 0x92, 0xA8, 0x88, 0xA4, 0xC5, 0x4F, 0x90, + 0x34, 0xF3, 0x6A, 0x6E, 0x0C, 0xB1, 0xB6, 0x63, 0xA0, 0x72, 0x28, 0xEE, 0x53, 0x41, 0x2A, 0x32, + 0xC5, 0xAD, 0x4A, 0xFC, 0x31, 0x6C, 0x3D, 0x0E, 0x8E, 0x8E, 0xE3, 0x35, 0x5F, 0x4C, 0x6B, 0x2C, + 0xB8, 0x3B, 0x3A, 0x64, 0x95, 0x82, 0xCB, 0x4C, 0xA8, 0x1C, 0xD9, 0x84, 0x3D, 0x3C, 0x26, 0x53, + 0x69, 0xDF, 0xB4, 0x0E, 0xE0, 0x39, 0x8A, 0x46, 0xB2, 0x4E, 0xBC, 0xB9, 0xD2, 0xBE, 0x75, 0x21, + 0xD4, 0x9F, 0xE1, 0xCD, 0x5C, 0xED, 0xA3, 0x68, 0x8B, 0x7F, 0x02, 0xFD, 0x65, 0x9F, 0x3E, 0x7F, + 0xB9, 0x27, 0xCF, 0xD3, 0x32, 0x5C, 0xCB, 0x1B, 0x85, 0x30, 0xC3, 0x26, 0x8C, 0x1F, 0x32, 0x87, + 0xA6, 0xED, 0xF8, 0x3C, 0x89, 0x97, 0x2D, 0xCA, 0x2A, 0x4B, 0x18, 0x68, 0xE1, 0x27, 0xC5, 0xA5, + 0x93, 0x4E, 0xEF, 0x6D, 0x5E, 0xF4, 0x0E, 0x9C, 0x8D, 0x5C, 0xCF, 0xF2, 0xA9, 0xE0, 0x84, 0x57, + 0xDF, 0x4B, 0x4B, 0xB4, 0x34, 0x31, 0x6D, 0x01, 0x24, 0xD1, 0xE8, 0x81, 0x4F, 0x05, 0x30, 0x6A, + 0xF7, 0x1B, 0xAD, 0xFD, 0x35, 0xCC, 0x18, 0x83, 0x12, 0xA9, 0x77, 0xA2, 0x2C, 0x1D, 0xA2, 0xD4, + 0x09, 0x26, 0x49, 0x0A, 0x13, 0xB2, 0xC2, 0xE8, 0xA6, 0x70, 0x12, 0x11, 0x4C, 0xDB, 0xE4, 0x9C, + 0x58, 0x42, 0x75, 0x9A, 0x69, 0x22, 0x96, 0xBB, 0xB4, 0x82, 0xCF, 0x69, 0x05, 0x5F, 0x12, 0x8F, + 0x80, 0x96, 0xD7, 0x9E, 0x2C, 0x5F, 0x1E, 0x65, 0xFB, 0x8E, 0x86, 0xB9, 0xCA, 0x0B, 0xA2, 0x62, + 0x85, 0xC9, 0xD4, 0xBF, 0x6F, 0x2C, 0xB4, 0x63, 0x4D, 0x7D, 0xC2, 0x04, 0xC0, 0x05, 0xE7, 0x1F, + 0x8D, 0x8E, 0xB2, 0x30, 0x78, 0xC8, 0xC4, 0x6A, 0x2A, 0x76, 0xC4, 0x20, 0x00, 0xB9, 0x3F, 0x14, + 0xB8, 0xF1, 0x90, 0xBA, 0x82, 0x57, 0xA6, 0x38, 0xBE, 0x82, 0x97, 0x3C, 0x34, 0xD9, 0xA5, 0xC9, + 0x6F, 0x94, 0xC5, 0x55, 0x27, 0x53, 0xA4, 0x72, 0x8A, 0x44, 0x41, 0x0B, 0x60, 0x13, 0x3F, 0x62, + 0x84, 0xC2, 0x23, 0xDD, 0x49, 0xB2, 0xA5, 0x95, 0xBA, 0x7F, 0x35, 0x6A, 0x87, 0xB4, 0x13, 0x64, + 0x89, 0x1F, 0x50, 0x42, 0x69, 0xBA, 0xF5, 0x08, 0xC0, 0x12, 0xAA, 0xFD, 0x4B, 0xAD, 0x99, 0x6A, + 0xB0, 0x10, 0x07, 0x08, 0xA8, 0x19, 0x60, 0xE8, 0x06, 0xD1, 0x98, 0x7A, 0x47, 0x8E, 0x42, 0x4C, + 0x05, 0xE7, 0x23, 0x59, 0xF3, 0xFF, 0x58, 0x86, 0xA6, 0x7A, 0xF4, 0x32, 0xD6, 0x76, 0xBE, 0xA6, + 0xD5, 0xFD, 0x9C, 0xA8, 0xDB, 0x4D, 0xAD, 0xFB, 0x25, 0x51, 0x77, 0x55, 0xAD, 0xAB, 0x57, 0x0F, + 0xE2, 0x00, 0xEB, 0x92, 0x43, 0x8B, 0x94, 0xE7, 0x55, 0xF9, 0x9C, 0x5F, 0xE5, 0x4B, 0x6A, 0x15, + 0x99, 0xBC, 0x44, 0xDA, 0xE3, 0x28, 0xDF, 0xA2, 0xC0, 0x74, 0xB2, 0x31, 0xF6, 0x4C, 0xB2, 0xCB, + 0x64, 0x22, 0x41, 0x1F, 0x4F, 0x1C, 0xBB, 0x8E, 0xEB, 0x4F, 0x4C, 0x72, 0x54, 0xA4, 0xBE, 0x55, + 0x4C, 0x67, 0x2B, 0xB6, 0x81, 0x58, 0x76, 0x44, 0x17, 0xAD, 0x54, 0xB1, 0xE0, 0xE9, 0xB8, 0xC4, + 0x3D, 0x03, 0x48, 0x47, 0x52, 0xF9, 0x24, 0xD7, 0x12, 0x66, 0x46, 0x4B, 0x83, 0x2C, 0x30, 0x42, + 0xEC, 0x3C, 0x38, 0x4C, 0xAB, 0xDE, 0x69, 0x42, 0x2E, 0x46, 0xC8, 0xE6, 0xE0, 0x7A, 0xD8, 0xAA, + 0xE5, 0xBC, 0x4C, 0x40, 0x4D, 0x81, 0xB3, 0xA3, 0xE6, 0xA5, 0x6F, 0xD1, 0xAF, 0x2B, 0x9F, 0x57, + 0xBE, 0xD4, 0x94, 0x34, 0x75, 0x1A, 0x26, 0xBC, 0x43, 0xEB, 0xCD, 0xA4, 0x41, 0x39, 0x95, 0xBB, + 0xBE, 0xFD, 0x77, 0x8C, 0x74, 0xAA, 0x5C, 0x55, 0xA6, 0xD1, 0xBE, 0x39, 0x5E, 0x75, 0x4B, 0xAF, + 0xB2, 0x30, 0x79, 0xDD, 0x09, 0x15, 0x05, 0xC1, 0xC5, 0x0D, 0x36, 0xC0, 0x44, 0x2A, 0x78, 0x3E, + 0xA2, 0x3A, 0xAB, 0x20, 0x4D, 0x61, 0xF6, 0x89, 0x1A, 0x4E, 0xB4, 0x6B, 0x73, 0xB2, 0x6A, 0x38, + 0xBB, 0x68, 0xB9, 0x32, 0x11, 0x53, 0x79, 0x01, 0x89, 0x99, 0x58, 0xFB, 0xC4, 0x52, 0xF2, 0xE7, + 0x46, 0xED, 0x7F, 0xE9, 0xDB, 0x71, 0x8C, 0xA4, 0x39, 0x36, 0x07, 0xF7, 0x8D, 0x14, 0xBB, 0x9A, + 0xA8, 0xB6, 0xFE, 0xDC, 0x08, 0xEE, 0x6D, 0x9F, 0xD9, 0x81, 0x1A, 0xCD, 0xEC, 0x55, 0xC0, 0x91, + 0x57, 0x81, 0xB6, 0x3F, 0xBD, 0x65, 0x07, 0xD0, 0x06, 0x3C, 0x15, 0xB7, 0x2E, 0xBF, 0xEF, 0x24, + 0x80, 0x8D, 0xDA, 0x92, 0xC5, 0x92, 0xA5, 0xA8, 0x0A, 0xB5, 0x5D, 0xB4, 0x7C, 0x86, 0x2A, 0x4D, + 0xF9, 0xB0, 0xFA, 0x95, 0x81, 0x10, 0xCD, 0x98, 0x89, 0x9D, 0x7D, 0x18, 0xAB, 0x50, 0x78, 0x77, + 0x1F, 0x36, 0xC8, 0xDB, 0xE1, 0xCB, 0xF5, 0x8A, 0xED, 0xF2, 0xC3, 0x36, 0x73, 0xDB, 0xE9, 0xC7, + 0x89, 0x55, 0xB3, 0xB7, 0xC8, 0x91, 0x81, 0x9D, 0xEC, 0x92, 0x3B, 0x1D, 0x63, 0x75, 0xAD, 0x85, + 0x36, 0x37, 0x25, 0xFC, 0xEC, 0x33, 0x10, 0x01, 0x05, 0xE5, 0x77, 0xE2, 0xB2, 0x91, 0x1D, 0xD0, + 0xAC, 0xD3, 0x1D, 0x38, 0xFF, 0x8F, 0x80, 0x67, 0x9D, 0x6F, 0xC3, 0xE9, 0x2F, 0x95, 0x11, 0x29, + 0xA6, 0x76, 0x82, 0xB0, 0x6B, 0x18, 0x6D, 0x83, 0x46, 0x1E, 0xB4, 0x25, 0x84, 0xF4, 0x03, 0x20, + 0xA4, 0xBF, 0xBC, 0xCE, 0x5D, 0x7F, 0x24, 0x4C, 0x15, 0x76, 0xFE, 0x61, 0xDB, 0xD2, 0xBB, 0xFF, + 0x48, 0x1A, 0x4B, 0x9E, 0x00, 0x14, 0x84, 0xC2, 0x29, 0x40, 0x99, 0x3B, 0xD2, 0xF6, 0x97, 0x87, + 0x03, 0x69, 0x8B, 0x78, 0xF0, 0x8F, 0xAE, 0x2C, 0x94, 0x5C, 0xA5, 0x4C, 0x12, 0x37, 0x7D, 0x99, + 0x2C, 0x21, 0x0B, 0x3A, 0x51, 0x28, 0x03, 0xA7, 0x3F, 0x55, 0x44, 0x95, 0xA4, 0x93, 0xC5, 0xAB, + 0x67, 0x56, 0xCA, 0x29, 0x25, 0xA4, 0x3B, 0xF3, 0xA4, 0x92, 0x54, 0xBB, 0x79, 0x5B, 0x6B, 0x55, + 0x1A, 0x2B, 0x6C, 0xAF, 0x23, 0xC1, 0x7C, 0x5D, 0x67, 0x96, 0x68, 0xA0, 0x4B, 0x9D, 0x5B, 0x72, + 0xD8, 0x2C, 0x5C, 0xE3, 0xC9, 0xE7, 0xC1, 0x7B, 0x13, 0x9F, 0xE1, 0xE0, 0xDE, 0xB5, 0x8A, 0xBD, + 0x37, 0x18, 0xC7, 0xB5, 0x69, 0x1E, 0x1B, 0x14, 0x60, 0x0A, 0xC3, 0x21, 0x60, 0x50, 0xBD, 0x98, + 0x92, 0x17, 0x94, 0x19, 0xDE, 0x05, 0xBA, 0xEB, 0xDF, 0x74, 0xE7, 0x01, 0x82, 0x95, 0x7C, 0xE4, + 0x39, 0x5A, 0x53, 0x22, 0x01, 0x9B, 0x68, 0x19, 0x35, 0x84, 0x2A, 0xEA, 0xCD, 0x2F, 0xAF, 0xB4, + 0x42, 0x9F, 0xAE, 0x25, 0xA3, 0x97, 0xAC, 0xAA, 0xF7, 0xFD, 0x0C, 0x9B, 0x34, 0x73, 0xA8, 0x0F, + 0xB7, 0x0C, 0x84, 0xD6, 0x76, 0xE0, 0x52, 0xB7, 0xEE, 0xC6, 0x6A, 0x81, 0x77, 0x27, 0x53, 0x59, + 0xA6, 0xF0, 0x20, 0x87, 0x63, 0x2A, 0x83, 0xF5, 0x2C, 0x53, 0xE9, 0x6D, 0x12, 0x46, 0xBC, 0x38, + 0xD3, 0x12, 0x11, 0x9C, 0x69, 0x2C, 0x4B, 0x9E, 0xD8, 0x5F, 0xAB, 0x6A, 0xC9, 0x5E, 0x5A, 0x75, + 0xA7, 0xE7, 0x8C, 0x50, 0xD9, 0xAC, 0x13, 0xBF, 0x26, 0x56, 0x36, 0xE5, 0xD0, 0xAF, 0x1D, 0xCA, + 0xA8, 0xFA, 0x5A, 0x4A, 0xF5, 0x54, 0xFF, 0x67, 0xD6, 0x6C, 0xFD, 0x6B, 0x22, 0xAC, 0x3D, 0x6D, + 0x1E, 0x08, 0xF6, 0x85, 0xB4, 0xD7, 0x5D, 0x8B, 0xC5, 0xE5, 0x46, 0x71, 0xB5, 0x05, 0x81, 0x74, + 0xB3, 0x82, 0x7B, 0xD3, 0x7C, 0x21, 0xB2, 0xAD, 0x0D, 0xF1, 0x90, 0x66, 0x59, 0x2E, 0xA2, 0x91, + 0xCC, 0xAC, 0x14, 0x0D, 0x60, 0x56, 0xAD, 0x98, 0x9F, 0x29, 0xB5, 0x94, 0xD1, 0xCD, 0xAE, 0xA5, + 0x0E, 0x6A, 0xAE, 0xD9, 0x24, 0xEC, 0x6F, 0x45, 0xD3, 0x89, 0xBC, 0x7C, 0x65, 0x9B, 0x4F, 0x84, + 0xD9, 0x92, 0x6D, 0x42, 0x51, 0x76, 0x5B, 0xC5, 0xCD, 0x28, 0xDA, 0xC1, 0x53, 0x47, 0x76, 0xB1, + 0xE6, 0x94, 0xAA, 0x24, 0x44, 0x66, 0x95, 0xF0, 0x15, 0xAF, 0x15, 0x22, 0x18, 0x29, 0xD6, 0x15, + 0x95, 0x3F, 0x45, 0x2D, 0x2C, 0xC2, 0x00, 0xC8, 0x56, 0x16, 0xF5, 0x5C, 0x52, 0xDE, 0xD2, 0x52, + 0xE8, 0x64, 0x33, 0x57, 0x6B, 0x8B, 0x72, 0x3C, 0x99, 0xD5, 0xE2, 0x22, 0xF0, 0xA6, 0xB4, 0xD5, + 0x25, 0x9A, 0x43, 0x3F, 0xDA, 0xF2, 0x22, 0x4B, 0x0B, 0xAD, 0x19, 0xBD, 0x49, 0xB1, 0x83, 0xDE, + 0x24, 0x76, 0xAE, 0x73, 0xB3, 0xD0, 0x24, 0xCF, 0x5B, 0x72, 0x8D, 0x35, 0xB5, 0xC9, 0xBA, 0xFA, + 0x61, 0x23, 0x17, 0xC6, 0x1B, 0xD9, 0x0E, 0x54, 0xC0, 0x69, 0x71, 0x31, 0x06, 0x28, 0x49, 0x20, + 0xBE, 0xEB, 0xB2, 0x1F, 0x48, 0x86, 0x24, 0x31, 0xDC, 0x9A, 0xED, 0x5E, 0xC8, 0xBF, 0xC2, 0x48, + 0xB7, 0xFF, 0x9D, 0x68, 0xEA, 0x46, 0xBD, 0x1E, 0x07, 0x9D, 0x2B, 0x75, 0x5A, 0x05, 0xEA, 0xFC, + 0xED, 0x6F, 0xC9, 0x4A, 0x1E, 0x0E, 0xA6, 0x9E, 0x43, 0xF7, 0x3E, 0x49, 0x22, 0x87, 0x38, 0x80, + 0x80, 0x77, 0x59, 0x6D, 0xD3, 0xC4, 0x03, 0x44, 0xAF, 0x11, 0x99, 0x0A, 0x0B, 0xE3, 0x37, 0x2F, + 0x55, 0xE5, 0x27, 0x55, 0x0A, 0x77, 0xB0, 0xA2, 0xFD, 0xE4, 0xE4, 0x8E, 0xDA, 0x4B, 0x02, 0xF3, + 0x16, 0x3D, 0x9A, 0x3E, 0x82, 0x25, 0x18, 0x41, 0x98, 0x3C, 0xB6, 0x5A, 0x88, 0xCD, 0x79, 0x44, + 0x5F, 0x56, 0x62, 0x09, 0x16, 0xFC, 0x81, 0x07, 0x39, 0x77, 0xD5, 0x0D, 0x47, 0xF4, 0xA6, 0xF1, + 0x15, 0x54, 0x4D, 0x84, 0xC3, 0x53, 0x00, 0xBB, 0xEF, 0x02, 0x0F, 0x99, 0x23, 0x7B, 0xE8, 0xEC, + 0xD4, 0x47, 0xF8, 0x2E, 0xA8, 0x93, 0x0F, 0xF7, 0xBB, 0x70, 0x72, 0x7B, 0xB7, 0x42, 0x7E, 0x81, + 0x3F, 0xFA, 0x44, 0xDD, 0xF1, 0x3F, 0xAC, 0xDD, 0x77, 0xF1, 0xFB, 0x88, 0x3B, 0x6C, 0xDF, 0x70, + 0xEB, 0x3E, 0xD5, 0x91, 0x6D, 0xED, 0xD4, 0x01, 0x21, 0x3B, 0x3F, 0xED, 0x8D, 0x46, 0x75, 0x44, + 0x53, 0xE4, 0x93, 0xAF, 0xAE, 0x37, 0x5E, 0xA6, 0x15, 0x97, 0x59, 0x53, 0xF1, 0xAD, 0x65, 0xF8, + 0x5C, 0x47, 0xDC, 0xBB, 0x8D, 0x41, 0x08, 0x49, 0x76, 0x87, 0x43, 0x08, 0x41, 0x26, 0xF4, 0xAC, + 0x00, 0xDA, 0x95, 0xC0, 0x8B, 0xFE, 0xA1, 0x74, 0x8B, 0xEA, 0x1D, 0xDA, 0xD1, 0x3E, 0x86, 0x2F, + 0x79, 0xD5, 0x24, 0x76, 0x3E, 0x8D, 0x47, 0xF7, 0x41, 0x30, 0xC9, 0xCE, 0x44, 0x20, 0x54, 0xE4, + 0x09, 0x09, 0xDE, 0x1F, 0xB1, 0x7C, 0x04, 0xB0, 0x76, 0xD3, 0x94, 0x09, 0x35, 0xCD, 0x26, 0x2B, + 0x6C, 0x42, 0x03, 0xCA, 0x65, 0x35, 0xC2, 0xFD, 0x89, 0x06, 0xEE, 0x18, 0xF4, 0x4C, 0x58, 0xD1, + 0xC3, 0xFE, 0xC4, 0x75, 0x7C, 0x4A, 0x2A, 0x7D, 0xEB, 0x89, 0x27, 0xE5, 0x40, 0x07, 0xFD, 0x8F, + 0x2C, 0x85, 0x06, 0xD9, 0x7B, 0xB8, 0x74, 0xD7, 0x90, 0xDC, 0x42, 0x66, 0x8C, 0xE8, 0xD2, 0x8E, + 0xCC, 0x86, 0xFC, 0x15, 0x58, 0x16, 0x42, 0xF1, 0x60, 0xF4, 0x5D, 0x23, 0xF1, 0x3C, 0x53, 0x4F, + 0x52, 0xE8, 0xDD, 0xDB, 0xC0, 0xB4, 0x89, 0x60, 0x0A, 0x15, 0xF4, 0x82, 0xAF, 0xAD, 0x98, 0x14, + 0x7E, 0x16, 0x48, 0x1D, 0x55, 0x51, 0xC5, 0x56, 0x1C, 0x77, 0x5E, 0x6D, 0x61, 0xA3, 0x1E, 0xE6, + 0x4F, 0xFB, 0xD1, 0x03, 0x9F, 0xC6, 0x0E, 0x32, 0xE6, 0x02, 0x0B, 0x8A, 0x0D, 0xDE, 0x3E, 0x7B, + 0x58, 0x24, 0x7B, 0x00, 0xA1, 0x52, 0xE1, 0x41, 0x64, 0x95, 0x73, 0x07, 0x92, 0xBD, 0x7E, 0xF5, + 0xE3, 0x07, 0x93, 0xD2, 0xF1, 0x7A, 0x06, 0x34, 0xC1, 0x96, 0x62, 0x83, 0x2A, 0xE8, 0x82, 0x43, + 0xF7, 0xD1, 0x81, 0x43, 0xBF, 0x90, 0x41, 0x84, 0xFB, 0xFC, 0xC2, 0xF4, 0x2E, 0x9E, 0x7F, 0x02, + 0x40, 0x9E, 0x1C, 0x0A, 0x36, 0x2E, 0x8E, 0xDB, 0xA1, 0xC6, 0x8C, 0x8B, 0x3B, 0x0A, 0xAD, 0x1F, + 0xBA, 0x13, 0x57, 0x86, 0x2A, 0xEF, 0x93, 0xA1, 0x98, 0x59, 0x4B, 0x84, 0x4B, 0x00, 0x18, 0x82, + 0x63, 0x96, 0x81, 0x82, 0xB0, 0xB5, 0x0F, 0x09, 0x9E, 0x20, 0x6B, 0x0A, 0xD1, 0x17, 0x50, 0x92, + 0xC8, 0x12, 0x15, 0xD5, 0x16, 0xA5, 0x5A, 0x04, 0xBC, 0xA3, 0xEF, 0x43, 0x93, 0x2F, 0xF3, 0x82, + 0x15, 0x6F, 0xEA, 0x8D, 0x02, 0x77, 0x00, 0x99, 0xFE, 0x89, 0x08, 0xAE, 0x00, 0x8C, 0x7F, 0xA1, + 0xBD, 0x00, 0x93, 0xA6, 0xC4, 0xD5, 0xDF, 0x62, 0xF8, 0x90, 0x17, 0x1E, 0xCC, 0x9C, 0x7F, 0x31, + 0x29, 0x3D, 0x3B, 0x16, 0x1F, 0x8F, 0x50, 0xB8, 0xC5, 0xC4, 0x3F, 0x11, 0xFC, 0x90, 0xB9, 0x44, + 0x0B, 0x93, 0xFA, 0xED, 0xD0, 0x76, 0xDA, 0xBE, 0xF7, 0xF0, 0x1D, 0x24, 0x9E, 0x0F, 0xEB, 0xC5, + 0x61, 0x07, 0x11, 0x3E, 0xFA, 0xA2, 0x4C, 0xAA, 0x34, 0x84, 0x0B, 0xA7, 0x68, 0xF8, 0x09, 0xD7, + 0xE9, 0xF2, 0xC2, 0x90, 0x9A, 0x86, 0x04, 0x4E, 0x21, 0x31, 0x58, 0x29, 0x11, 0x89, 0x93, 0x4C, + 0x43, 0x12, 0xD7, 0x84, 0x54, 0x24, 0x51, 0xE0, 0x4D, 0xB4, 0xAA, 0x45, 0xDB, 0x86, 0x38, 0x2C, + 0xA7, 0x88, 0xE0, 0x63, 0x25, 0x71, 0xCE, 0xDC, 0xC4, 0x5E, 0x74, 0x82, 0x97, 0x8D, 0xDC, 0x09, + 0x41, 0x08, 0xCF, 0x08, 0x44, 0x00, 0x28, 0x6D, 0x3E, 0xB7, 0x76, 0x27, 0x55, 0xA7, 0x24, 0x6C, + 0xC9, 0xF3, 0xA1, 0xE0, 0xC1, 0xAA, 0x43, 0xA0, 0x7F, 0xAE, 0xA0, 0xB8, 0xBC, 0x3E, 0x25, 0xC4, + 0x94, 0x76, 0xA8, 0xB6, 0x5D, 0x42, 0xC9, 0x66, 0xAB, 0xD9, 0x88, 0x96, 0x22, 0xCA, 0x55, 0xE2, + 0xC1, 0xCA, 0xCA, 0x25, 0xBE, 0x23, 0xEA, 0xF4, 0x9E, 0xA5, 0xAE, 0x8A, 0x6F, 0x09, 0xB3, 0xB7, + 0x29, 0xD2, 0x3E, 0x3C, 0x31, 0x27, 0xC2, 0x34, 0x52, 0xEA, 0x64, 0x10, 0xB2, 0x63, 0xC1, 0xAF, + 0x9D, 0x39, 0x25, 0xC4, 0x62, 0xB0, 0x2A, 0xE7, 0xC0, 0x62, 0xD4, 0x6A, 0x42, 0x7C, 0x26, 0x9E, + 0x3B, 0x84, 0x17, 0xF3, 0x08, 0xE8, 0xF0, 0xD7, 0x0F, 0xA6, 0x63, 0x8D, 0xB0, 0xA7, 0xB0, 0x99, + 0x82, 0x49, 0xB6, 0xA7, 0x9A, 0x08, 0x5E, 0xE5, 0x62, 0x09, 0xA4, 0x4A, 0xB5, 0xA5, 0x77, 0xBC, + 0x35, 0xFE, 0xBA, 0x57, 0xA9, 0x96, 0xE6, 0xAD, 0xEB, 0xC1, 0x8D, 0x33, 0xFD, 0x6F, 0x46, 0xCB, + 0x94, 0xD4, 0x5F, 0xA3, 0xBC, 0xB4, 0x5F, 0x62, 0xB6, 0x45, 0x85, 0x2D, 0x61, 0x36, 0x26, 0x61, + 0xC8, 0x27, 0xD8, 0x1B, 0xB0, 0xF8, 0x1C, 0x56, 0xD8, 0x1E, 0xD1, 0xD4, 0x4D, 0x68, 0x05, 0xB1, + 0x3F, 0x03, 0x37, 0x80, 0x83, 0xE6, 0x5F, 0xC1, 0x16, 0x2F, 0xE6, 0xB7, 0xE2, 0x80, 0xF7, 0x4D, + 0x4F, 0x30, 0xD8, 0x9E, 0x99, 0xC1, 0x7D, 0xDB, 0x73, 0xA7, 0x84, 0x22, 0x0E, 0x57, 0x7C, 0x16, + 0x76, 0x2A, 0x64, 0x0B, 0x53, 0x76, 0x3B, 0x9A, 0x86, 0x30, 0x1F, 0xFF, 0x37, 0x97, 0x54, 0x6C, + 0x09, 0x8F, 0x5F, 0x51, 0x13, 0x04, 0xA7, 0x7A, 0x17, 0x92, 0x76, 0x18, 0xC9, 0xDC, 0xA3, 0xE9, + 0x98, 0x6A, 0xC2, 0x13, 0x5B, 0x2D, 0xF4, 0x08, 0x5E, 0xDD, 0xCE, 0x90, 0x09, 0x3E, 0xD9, 0x90, + 0x50, 0x69, 0x7F, 0x26, 0x23, 0x35, 0xAE, 0xE9, 0xDF, 0x6F, 0x50, 0x64, 0x45, 0x61, 0x68, 0x1E, + 0x6E, 0x96, 0xB0, 0x0C, 0x45, 0x19, 0xCB, 0x72, 0x19, 0x1A, 0x9B, 0x31, 0xE7, 0xA4, 0x07, 0xD8, + 0xD7, 0x48, 0xFB, 0x43, 0xBE, 0x31, 0x66, 0x20, 0xDB, 0x7F, 0x3E, 0xB1, 0x4A, 0x13, 0x2F, 0x72, + 0x46, 0x9C, 0x08, 0xD5, 0xD8, 0x72, 0x6C, 0x12, 0x4A, 0x2D, 0x15, 0xAE, 0x38, 0x4D, 0xAA, 0xC1, + 0xDD, 0x03, 0x08, 0x11, 0x60, 0x01, 0x74, 0x30, 0xE0, 0x19, 0x39, 0xF6, 0x61, 0xF9, 0x6D, 0x24, + 0x5E, 0x23, 0x64, 0x61, 0xA9, 0x57, 0x83, 0x62, 0xE9, 0x42, 0x98, 0xE5, 0x36, 0x82, 0xA9, 0xB8, + 0xA2, 0xA4, 0x1C, 0x36, 0x99, 0xC5, 0x39, 0xAD, 0x51, 0xD8, 0xC9, 0xA8, 0x1C, 0x12, 0x2D, 0x88, + 0xA9, 0x5F, 0xB7, 0xD6, 0x36, 0xD3, 0x36, 0x03, 0xA4, 0x0D, 0xCB, 0xB6, 0x92, 0xD7, 0xB9, 0x42, + 0xA9, 0x60, 0xA2, 0xCE, 0x69, 0x33, 0xB8, 0xE4, 0x75, 0x2E, 0x35, 0xED, 0xCB, 0x50, 0x2C, 0x2F, + 0xD1, 0xB9, 0xA9, 0x35, 0xC9, 0xEC, 0xD6, 0xB5, 0x55, 0xA6, 0x5B, 0x53, 0x2B, 0x2D, 0x11, 0x43, + 0x66, 0xC7, 0xD2, 0x9B, 0x45, 0xC2, 0x69, 0xE9, 0xBB, 0xD6, 0x31, 0x3A, 0x9D, 0xD4, 0xA4, 0xBD, + 0x81, 0x3D, 0xA2, 0x29, 0x47, 0xB1, 0xE3, 0xD3, 0x7D, 0x6F, 0xF6, 0xF8, 0x29, 0x95, 0x0B, 0xF5, + 0x77, 0x42, 0xB6, 0xDC, 0xA7, 0x74, 0xE7, 0x54, 0xA6, 0xBB, 0x59, 0xAD, 0x14, 0x1F, 0x8E, 0xFB, + 0xC1, 0xE4, 0x28, 0xB8, 0xC7, 0x9E, 0x83, 0x03, 0x0D, 0xE1, 0xBC, 0xE4, 0xF0, 0xC3, 0x41, 0x2F, + 0x87, 0x5C, 0x21, 0xBF, 0xDA, 0x49, 0x4F, 0xE6, 0x75, 0x08, 0x3F, 0x8F, 0x76, 0x21, 0xE9, 0x59, + 0x11, 0x10, 0x72, 0x47, 0x48, 0x21, 0x44, 0xD5, 0x51, 0x57, 0x2E, 0xE5, 0xD8, 0x90, 0x70, 0x00, + 0x84, 0xAF, 0x8F, 0xF6, 0x9D, 0x7D, 0xCE, 0xDA, 0x14, 0x7E, 0xB5, 0x4B, 0x68, 0xF3, 0xB5, 0x0E, + 0x0F, 0x7E, 0x46, 0x65, 0x7F, 0xDE, 0xE9, 0xF7, 0x13, 0xE7, 0x0C, 0x65, 0x3B, 0x2C, 0x62, 0x4C, + 0xDD, 0x0D, 0x03, 0xE7, 0xC5, 0x8A, 0xB0, 0xE1, 0x55, 0x1E, 0x96, 0x36, 0x9A, 0x6A, 0x68, 0xB4, + 0xF2, 0x3E, 0xA7, 0x6C, 0xFB, 0xA5, 0xC5, 0x29, 0xEF, 0xA0, 0x9E, 0xE3, 0xC7, 0x30, 0x41, 0xA9, + 0x3C, 0xF8, 0x0A, 0x37, 0x13, 0xB7, 0x6F, 0x30, 0x54, 0x67, 0xFE, 0x90, 0x5D, 0x3C, 0xD6, 0xC3, + 0x24, 0x9F, 0x07, 0x1C, 0x26, 0x29, 0x81, 0xE4, 0xB2, 0x9F, 0xEC, 0x63, 0x9B, 0xAE, 0x7E, 0x10, + 0x46, 0x87, 0xC7, 0x93, 0xE0, 0x59, 0x9A, 0x75, 0xFA, 0x83, 0x04, 0xCF, 0x34, 0x71, 0xA0, 0x90, + 0x97, 0xEA, 0x2C, 0xC1, 0x29, 0x49, 0x25, 0x82, 0xC8, 0x8F, 0x03, 0xA1, 0x61, 0x64, 0xE7, 0x40, + 0x36, 0x0D, 0x40, 0x52, 0x2D, 0x91, 0xBC, 0x19, 0xE4, 0x81, 0x27, 0xDB, 0x04, 0xA3, 0x87, 0x64, + 0xB6, 0x21, 0x07, 0x77, 0xB2, 0x6B, 0x43, 0x83, 0xA9, 0xE7, 0xC1, 0x2E, 0x86, 0xF6, 0x09, 0xC6, + 0x9A, 0x5E, 0x8F, 0xF6, 0x3E, 0xF9, 0x82, 0x9C, 0x8D, 0x7C, 0xBE, 0x40, 0x57, 0x13, 0xA8, 0x2C, + 0xD9, 0x11, 0x60, 0xA7, 0x8A, 0x8E, 0xD0, 0x83, 0xA5, 0x1D, 0xB1, 0x45, 0x7C, 0x68, 0x6A, 0xC1, + 0x81, 0x4A, 0x29, 0x09, 0x9D, 0xC4, 0x48, 0xA1, 0x3A, 0x16, 0xB2, 0xFE, 0xBA, 0x3C, 0x10, 0x06, + 0x43, 0x55, 0x05, 0x69, 0x64, 0x24, 0xDA, 0xB6, 0xA0, 0x7A, 0x84, 0x4A, 0x7E, 0xBA, 0x37, 0xAF, + 0x29, 0x1D, 0xB6, 0x56, 0x3C, 0x36, 0x4A, 0x7D, 0x55, 0xA4, 0x21, 0x17, 0x6A, 0xEC, 0xAC, 0x2B, + 0xE6, 0x2D, 0x0E, 0x6B, 0x50, 0xA3, 0x0B, 0x81, 0xF0, 0x96, 0x1F, 0x88, 0x43, 0x70, 0x4D, 0x7D, + 0xA6, 0x55, 0xB9, 0x82, 0xE0, 0xB7, 0x2A, 0x20, 0xD5, 0xE6, 0xCB, 0x4E, 0x50, 0x96, 0x92, 0x35, + 0x9B, 0xD6, 0x23, 0x18, 0xB4, 0xF3, 0x52, 0xCA, 0xF5, 0x9C, 0x82, 0xB6, 0xA9, 0x31, 0xD6, 0xD4, + 0x0E, 0xA0, 0x21, 0x9D, 0x00, 0x9C, 0x36, 0x90, 0xB0, 0x14, 0x00, 0x82, 0x7B, 0x6C, 0xEE, 0xCC, + 0xE2, 0xC4, 0x46, 0x99, 0x80, 0x11, 0x59, 0x3D, 0x7D, 0xBA, 0xB0, 0x6D, 0x27, 0xB5, 0x73, 0x84, + 0xE8, 0x23, 0xAB, 0xD4, 0xB8, 0x93, 0xFF, 0x96, 0xBB, 0x99, 0x8A, 0x57, 0x7C, 0x02, 0x44, 0x81, + 0xC0, 0x9E, 0x00, 0xB9, 0xBC, 0xBC, 0xB8, 0xAC, 0x55, 0xD4, 0x55, 0x84, 0x2D, 0x6C, 0x0F, 0x40, + 0x83, 0xAA, 0xCD, 0x07, 0xB2, 0xC9, 0x65, 0x17, 0x14, 0xDB, 0xEA, 0x3A, 0x67, 0xD9, 0x0F, 0xEF, + 0x71, 0x20, 0xE9, 0x27, 0x65, 0x3F, 0x91, 0xAB, 0xC3, 0x54, 0x17, 0x2E, 0x55, 0x1D, 0x4A, 0x09, + 0xC6, 0x74, 0x5D, 0x3D, 0xB8, 0xBE, 0xBC, 0x3C, 0x3A, 0xBF, 0xD2, 0x76, 0x36, 0xB5, 0x9F, 0x91, + 0xE4, 0x13, 0x95, 0x3C, 0x9D, 0x80, 0x4A, 0x04, 0x17, 0x8E, 0x1F, 0xD3, 0x43, 0x49, 0xE1, 0xAB, + 0xC8, 0xD4, 0xE3, 0x01, 0x75, 0x49, 0x21, 0xE4, 0x3E, 0xD4, 0xA8, 0x0B, 0xAC, 0xC4, 0x8E, 0xED, + 0x6C, 0x48, 0x29, 0x24, 0xC9, 0x89, 0xAF, 0x01, 0x7E, 0x2F, 0xF5, 0x60, 0xA7, 0x17, 0x4C, 0xB9, + 0x95, 0x28, 0x9E, 0x3C, 0xEB, 0x9C, 0x96, 0x87, 0x89, 0x6B, 0x8D, 0xC4, 0x6C, 0x7F, 0xD9, 0x75, + 0xF8, 0x95, 0x8C, 0xB7, 0x7E, 0x79, 0x2F, 0xA6, 0x0D, 0x12, 0x52, 0x9F, 0x1C, 0x19, 0xC2, 0x87, + 0xF7, 0x3C, 0x9F, 0x36, 0x18, 0xB1, 0xEE, 0xC4, 0x5E, 0xFE, 0xDC, 0x05, 0xE8, 0x77, 0x01, 0x9A, + 0x35, 0x56, 0x16, 0xD7, 0x17, 0x59, 0x61, 0x65, 0x94, 0xDA, 0xF5, 0x55, 0xA1, 0x2A, 0x65, 0x75, + 0x1D, 0x32, 0xE0, 0xE2, 0x74, 0x13, 0x3D, 0x33, 0x42, 0x27, 0x51, 0xD0, 0xAD, 0x9D, 0x5A, 0xFA, + 0x33, 0x0B, 0x5A, 0x7A, 0x9A, 0x29, 0x8A, 0x3B, 0x04, 0xA8, 0x59, 0x97, 0x16, 0x36, 0xEF, 0xF2, + 0xD6, 0x00, 0xAA, 0x2D, 0x42, 0x6E, 0xC8, 0xB3, 0x41, 0x7E, 0x17, 0x25, 0x71, 0xC8, 0x72, 0x03, + 0x33, 0x24, 0x81, 0xBF, 0x24, 0xC0, 0xAD, 0x7B, 0xA1, 0xA5, 0x49, 0xBF, 0x59, 0x49, 0xE5, 0x58, + 0x89, 0xD9, 0xAB, 0x20, 0x62, 0x26, 0xC7, 0xC4, 0x7B, 0x02, 0x45, 0x75, 0xBA, 0x02, 0x4D, 0xBA, + 0x2B, 0x51, 0x31, 0xED, 0x24, 0x0D, 0x97, 0xCA, 0xEB, 0x26, 0x09, 0x0F, 0xCB, 0xF7, 0xF6, 0x03, + 0x76, 0x90, 0x09, 0x2F, 0xE8, 0x78, 0x75, 0x9F, 0xA7, 0x67, 0x01, 0xDE, 0x3E, 0xC3, 0x12, 0x46, + 0xC6, 0xDD, 0x09, 0xEC, 0x3B, 0x96, 0x1F, 0x05, 0x5C, 0x50, 0xA8, 0x16, 0xE1, 0xE7, 0x35, 0xF8, + 0x16, 0x7B, 0x22, 0x22, 0xDB, 0x41, 0x87, 0x87, 0x6D, 0x2B, 0xFC, 0xA1, 0x06, 0x7B, 0x53, 0xF4, + 0xC1, 0x0C, 0x81, 0x9D, 0x80, 0x3A, 0x81, 0x2C, 0xD4, 0x0D, 0x40, 0x7A, 0xE4, 0x10, 0x5C, 0xCA, + 0x29, 0x38, 0x84, 0x19, 0xD5, 0x24, 0x7C, 0x90, 0x13, 0x58, 0xFB, 0xED, 0x83, 0x8B, 0x8B, 0xCB, + 0xC3, 0x93, 0xF3, 0xBD, 0xAB, 0xA3, 0x9B, 0x93, 0xF3, 0xDE, 0xF5, 0xD5, 0xCD, 0xD5, 0xE7, 0x1E, + 0xFC, 0xFA, 0x71, 0xEF, 0xF4, 0xE4, 0xF0, 0xE6, 0xFA, 0xFC, 0x97, 0xF3, 0x8B, 0x4F, 0xE7, 0xC2, + 0xB5, 0x80, 0x65, 0xFA, 0xF7, 0x62, 0x80, 0x5D, 0xA4, 0x47, 0xC1, 0x67, 0x54, 0x57, 0x60, 0xE1, + 0x81, 0x3D, 0x36, 0x47, 0xBA, 0x22, 0xA6, 0xD1, 0x2E, 0xEE, 0x4E, 0x31, 0x7D, 0xDA, 0x22, 0x71, + 0x9D, 0x4A, 0xF4, 0x0B, 0xD9, 0x9A, 0x05, 0x90, 0x11, 0x3D, 0x62, 0x0F, 0xCB, 0xD4, 0x0C, 0x91, + 0x5A, 0x20, 0x6F, 0xE8, 0xF1, 0xDE, 0xA4, 0x8B, 0xDC, 0x90, 0xF2, 0x9F, 0xB0, 0x7A, 0xEA, 0x0B, + 0x1A, 0x7C, 0x60, 0x3A, 0x08, 0x03, 0x63, 0xA8, 0x72, 0xB5, 0x1D, 0x22, 0x0C, 0x44, 0x21, 0x42, + 0x18, 0x9E, 0x1F, 0xD6, 0xD9, 0x43, 0xEC, 0x23, 0xAB, 0x06, 0x6F, 0xC4, 0xD0, 0x7C, 0x3D, 0xEC, + 0xDE, 0xD5, 0x6F, 0xA1, 0xE5, 0x16, 0xB8, 0x85, 0xB5, 0xE8, 0x80, 0xB5, 0x95, 0x2B, 0x45, 0xF1, + 0x99, 0xEE, 0x70, 0x08, 0x12, 0x6A, 0x5A, 0x89, 0x31, 0xF2, 0x2D, 0x7B, 0x68, 0x07, 0xF1, 0x90, + 0x11, 0x55, 0x9C, 0x1E, 0x64, 0x02, 0x2D, 0x64, 0xFE, 0xD1, 0xED, 0x80, 0x96, 0x6F, 0x4B, 0x4B, + 0xD9, 0x19, 0x6B, 0x45, 0x8C, 0x00, 0xA7, 0xBE, 0x5C, 0x6F, 0xC6, 0xA3, 0xB9, 0xB4, 0x04, 0x3C, + 0x85, 0x97, 0x33, 0x86, 0xAE, 0x6B, 0x15, 0x69, 0x8E, 0x48, 0xF3, 0x78, 0xD0, 0xCB, 0xB7, 0x6F, + 0x03, 0x7A, 0xA1, 0x6F, 0x99, 0x10, 0x42, 0xD3, 0x46, 0x25, 0xE9, 0xE5, 0x97, 0xF1, 0xF4, 0x40, + 0x44, 0x44, 0x0A, 0xFC, 0x40, 0x7C, 0x49, 0x18, 0x68, 0x4C, 0x66, 0xE2, 0x6A, 0x8F, 0x9C, 0x0C, + 0x40, 0xA6, 0x26, 0xAE, 0xEF, 0xDB, 0xE0, 0xB1, 0xC6, 0x24, 0x04, 0x66, 0x6F, 0x24, 0x3C, 0xF1, + 0x4C, 0x15, 0xBE, 0x9C, 0x9D, 0xB5, 0xC7, 0xEC, 0x47, 0xF8, 0x88, 0xB4, 0x5F, 0x97, 0xB5, 0x5F, + 0xCF, 0xCE, 0xFA, 0xFD, 0xB6, 0x4F, 0x7F, 0x64, 0x08, 0x48, 0xF7, 0x9D, 0xC0, 0x58, 0x16, 0xBE, + 0xC7, 0x5A, 0x4D, 0x12, 0x9C, 0x5D, 0x08, 0xE6, 0x99, 0x9D, 0x8B, 0xFF, 0x17, 0xFC, 0xF9, 0x1C, + 0xB7, 0x8D, 0xD6, 0xC8, 0x2C, 0xDC, 0x32, 0x56, 0x57, 0xD7, 0xDE, 0xD0, 0x94, 0x49, 0x94, 0x97, + 0x6D, 0xC1, 0xA1, 0x30, 0xD6, 0x06, 0xBB, 0xA8, 0x3B, 0x0F, 0xCC, 0x17, 0x30, 0x2B, 0x0D, 0x1A, + 0x5B, 0x4B, 0xA6, 0x5F, 0x17, 0x99, 0x23, 0xC8, 0x26, 0x65, 0x01, 0x25, 0xC8, 0x58, 0x47, 0xDD, + 0xF5, 0x76, 0xD7, 0x58, 0xDB, 0xD2, 0xD1, 0x12, 0x6B, 0xAC, 0x5D, 0xB4, 0x3A, 0x67, 0x52, 0xBA, + 0x94, 0x9A, 0xD5, 0x98, 0x9A, 0xE5, 0x8E, 0xB1, 0xBE, 0xDC, 0xE9, 0x2C, 0x1B, 0xEB, 0xED, 0xCE, + 0x46, 0x57, 0x4B, 0x8F, 0x5E, 0xEB, 0xED, 0x82, 0xA7, 0xEE, 0x9C, 0x68, 0x7B, 0x03, 0x44, 0xDD, + 0xE1, 0x47, 0xEC, 0x31, 0x82, 0x3A, 0x1D, 0x20, 0x67, 0x73, 0x73, 0x6B, 0xAB, 0x8B, 0x1A, 0x87, + 0x4C, 0xC0, 0xA0, 0x0A, 0xFB, 0xAD, 0x19, 0x11, 0x29, 0xEE, 0x8B, 0x1D, 0x3C, 0x34, 0x03, 0xA2, + 0x54, 0xFB, 0xF6, 0xD0, 0x51, 0x76, 0x1C, 0xF2, 0x74, 0x36, 0x62, 0x6D, 0x22, 0x68, 0xAF, 0xA8, + 0x9C, 0x6D, 0xDB, 0xC0, 0x2B, 0x76, 0x4F, 0xD0, 0x7A, 0x2D, 0xE0, 0x1F, 0x78, 0xAD, 0xD2, 0xAB, + 0x33, 0x70, 0x9D, 0x25, 0x4A, 0x8D, 0xB2, 0x83, 0xE9, 0x14, 0xC1, 0x8B, 0x5E, 0xA6, 0x43, 0x09, + 0x9A, 0x8A, 0xC6, 0x76, 0x79, 0x19, 0x40, 0x41, 0x36, 0xB4, 0x78, 0xB8, 0x89, 0x2E, 0x87, 0xB5, + 0xD5, 0x76, 0x58, 0xF6, 0x62, 0x5A, 0x82, 0x99, 0x7E, 0x67, 0x49, 0xD4, 0x68, 0x64, 0x2F, 0x47, + 0x1B, 0xE2, 0x41, 0x3E, 0x41, 0xA4, 0xB1, 0x8A, 0x89, 0x22, 0xCD, 0xB4, 0xF0, 0x5F, 0xFE, 0x22, + 0xCA, 0x56, 0xFC, 0x2D, 0x65, 0x80, 0x77, 0xA8, 0x2F, 0x36, 0x3C, 0xCE, 0x90, 0x5A, 0xBE, 0xD1, + 0x6C, 0x36, 0xE1, 0xFD, 0xB0, 0xA4, 0x06, 0x90, 0x9E, 0xE3, 0xAA, 0xBE, 0xAC, 0x33, 0xC8, 0x92, + 0x43, 0x04, 0x8B, 0x65, 0xA6, 0x77, 0x57, 0xCC, 0x45, 0x9F, 0xDE, 0xF6, 0x12, 0x36, 0x3B, 0x83, + 0x30, 0x70, 0x2C, 0xDE, 0x5E, 0xD0, 0xF1, 0x22, 0x9B, 0x57, 0xC4, 0x85, 0x48, 0x06, 0xC3, 0x15, + 0x8E, 0x0C, 0x43, 0x80, 0xCD, 0x42, 0xC6, 0x0C, 0x11, 0x88, 0xB0, 0x38, 0xC6, 0xF5, 0x96, 0x77, + 0x22, 0xE5, 0xC5, 0xAE, 0xB6, 0xE5, 0x38, 0x33, 0x9A, 0xA8, 0xD1, 0x76, 0xA6, 0x01, 0xF5, 0x95, + 0xC9, 0x40, 0x15, 0x21, 0x3A, 0x3B, 0x93, 0x9D, 0x94, 0x8F, 0x6D, 0xB2, 0x98, 0x93, 0x05, 0x48, + 0x5E, 0x9A, 0xE3, 0x25, 0x9C, 0x06, 0x0F, 0x5C, 0xDC, 0x35, 0xE8, 0x1A, 0x45, 0xC6, 0x65, 0xB9, + 0x93, 0x30, 0xC0, 0xCF, 0x3A, 0x06, 0x37, 0xE7, 0x17, 0x37, 0x87, 0x47, 0x07, 0x27, 0x67, 0x7B, + 0xA7, 0x89, 0xE1, 0xF0, 0x31, 0x59, 0xA5, 0x2C, 0xE8, 0x5C, 0x44, 0x92, 0xC2, 0x77, 0x49, 0x36, + 0xD8, 0x99, 0x8D, 0x35, 0xD1, 0xB2, 0x2E, 0x9E, 0x63, 0x12, 0xC7, 0xC5, 0x36, 0x21, 0x3F, 0xFF, + 0x1A, 0xF1, 0x8D, 0xB7, 0x00, 0xD6, 0x09, 0x0F, 0xC1, 0x69, 0xB6, 0x63, 0x21, 0xBA, 0xA5, 0x18, + 0xCA, 0x0A, 0xDA, 0x20, 0xCB, 0x03, 0x8D, 0x3D, 0x0C, 0x91, 0xAC, 0xA0, 0xD5, 0x0D, 0x08, 0xD1, + 0x6F, 0x2A, 0xC1, 0x2D, 0xF2, 0xF4, 0x4E, 0xD9, 0x06, 0xE9, 0x10, 0xFF, 0x15, 0x86, 0x25, 0x35, + 0xCC, 0x36, 0xDA, 0x76, 0x28, 0xB3, 0x16, 0x26, 0xA8, 0x3C, 0x67, 0xE9, 0x94, 0x4D, 0x9D, 0x91, + 0xEB, 0x30, 0x61, 0x53, 0x4B, 0xD7, 0xA2, 0xE9, 0x2A, 0xAF, 0xE2, 0x73, 0x9C, 0xAD, 0x85, 0xE7, + 0x6A, 0x3C, 0x49, 0x25, 0x59, 0x49, 0x9B, 0xA1, 0xEA, 0x5C, 0x29, 0x3D, 0x27, 0xD3, 0x67, 0xA4, + 0x5E, 0x68, 0x65, 0x0E, 0x51, 0xBF, 0x59, 0xDE, 0x42, 0x03, 0x3A, 0x45, 0x62, 0xCB, 0x0A, 0xE0, + 0xE2, 0x65, 0x4D, 0x91, 0x36, 0x49, 0xB4, 0x3A, 0x4C, 0x38, 0x96, 0x17, 0x26, 0x1D, 0x37, 0x67, + 0x67, 0x37, 0x87, 0x7B, 0xFD, 0x0F, 0x09, 0x19, 0xE1, 0xFE, 0x5F, 0xB1, 0x42, 0xE3, 0x01, 0x23, + 0xCB, 0x89, 0x10, 0xA3, 0x58, 0x20, 0xB8, 0xAE, 0x87, 0xA6, 0x90, 0x22, 0x22, 0x1E, 0xBB, 0xB4, + 0x61, 0x16, 0x1B, 0x74, 0xBE, 0x0A, 0xBA, 0x36, 0x39, 0xD2, 0xAF, 0x6F, 0xDC, 0xD2, 0x47, 0xAD, + 0x1B, 0x8D, 0x5A, 0xB8, 0xAB, 0x5E, 0xC0, 0xA8, 0x11, 0xFD, 0xFF, 0x0A, 0x07, 0xEE, 0x55, 0x2D, + 0x92, 0x02, 0x9B, 0x8A, 0xAD, 0x95, 0x62, 0xB7, 0xBA, 0x71, 0xB7, 0x34, 0x8B, 0xE5, 0xEF, 0x60, + 0x1D, 0x63, 0x42, 0x1A, 0x5B, 0x89, 0xE6, 0x2C, 0xA3, 0xDB, 0x79, 0xCC, 0x8A, 0x75, 0xFC, 0x8F, + 0x64, 0x03, 0xD7, 0xB0, 0x68, 0x91, 0x1A, 0xB6, 0xF0, 0x1C, 0x45, 0x3F, 0x95, 0x6B, 0xFE, 0x88, + 0x75, 0xA3, 0x11, 0x43, 0x8B, 0x3A, 0xE1, 0x30, 0xC5, 0xF1, 0xCA, 0x86, 0xED, 0x35, 0xAA, 0xD6, + 0xFF, 0x99, 0x5A, 0x35, 0xB4, 0x9C, 0x49, 0x77, 0x57, 0x1A, 0x10, 0xEC, 0xFA, 0x4A, 0x53, 0x10, + 0x65, 0x32, 0xD9, 0x6A, 0xAA, 0x41, 0xB7, 0x9A, 0x61, 0x11, 0x5E, 0x25, 0x0F, 0xAF, 0x08, 0x04, + 0x5B, 0x3F, 0x18, 0x95, 0xE3, 0xB8, 0xD4, 0x16, 0x72, 0xA7, 0x01, 0xFC, 0x61, 0xF2, 0xFB, 0x03, + 0x68, 0xD5, 0x77, 0xE5, 0xEB, 0x00, 0x30, 0x69, 0xDF, 0x12, 0xB6, 0x8D, 0x31, 0xAA, 0x2B, 0x13, + 0xA9, 0xDE, 0x42, 0x38, 0x18, 0xC8, 0xCF, 0x94, 0x03, 0xF5, 0x94, 0x18, 0x81, 0xB8, 0x96, 0x4E, + 0x7E, 0x52, 0xAE, 0x0E, 0xB8, 0xD9, 0x54, 0xBA, 0x1A, 0x65, 0xE1, 0x25, 0x1A, 0x09, 0x2C, 0x2E, + 0x82, 0x4D, 0xFD, 0x7C, 0x8F, 0x05, 0x2E, 0xFE, 0xD6, 0x14, 0x18, 0x9E, 0xB8, 0x6A, 0x16, 0x09, + 0x49, 0xBB, 0x90, 0x9B, 0x91, 0xD4, 0x1B, 0xF1, 0x10, 0x45, 0x4E, 0x83, 0x33, 0x82, 0x9B, 0x2F, + 0xB4, 0xF0, 0x08, 0x30, 0x6F, 0x98, 0xFD, 0xCF, 0x67, 0xFB, 0x17, 0xA7, 0x0C, 0x6A, 0x22, 0x76, + 0x67, 0xE4, 0x3A, 0x43, 0x9A, 0xBD, 0xE4, 0x10, 0x0F, 0x3D, 0xAC, 0x5A, 0x61, 0x92, 0x03, 0xA2, + 0x8C, 0x31, 0x39, 0xEF, 0xA9, 0x10, 0xF4, 0x15, 0xC9, 0x24, 0xDE, 0x30, 0xB6, 0xD5, 0xDC, 0x5D, + 0x51, 0xF1, 0x3B, 0x94, 0xAE, 0x16, 0x23, 0x05, 0x90, 0x22, 0x65, 0x83, 0xE4, 0x74, 0x7E, 0xD3, + 0xD4, 0x24, 0x0A, 0x9B, 0x71, 0xA8, 0x53, 0xE9, 0x8B, 0xA6, 0x55, 0x82, 0x97, 0x4B, 0x64, 0xA6, + 0x51, 0xC5, 0x13, 0x56, 0xDD, 0xD6, 0x5C, 0xA6, 0xCC, 0x49, 0x6A, 0xAA, 0x91, 0xB7, 0xFC, 0x22, + 0xF4, 0x31, 0x09, 0xAC, 0x46, 0xE1, 0x7F, 0xFF, 0x97, 0x4C, 0x22, 0x7C, 0xAB, 0xD7, 0x14, 0x42, + 0x2B, 0x41, 0x46, 0xDA, 0xBE, 0xAB, 0x1A, 0x67, 0x2E, 0xFD, 0xEF, 0x37, 0xA5, 0x49, 0x3D, 0xBB, + 0x30, 0xCE, 0x1B, 0xA2, 0x70, 0x42, 0x5B, 0x08, 0xE0, 0x84, 0x04, 0xCC, 0x89, 0x0B, 0xC2, 0xC6, + 0x67, 0x21, 0x74, 0x2F, 0x18, 0xBC, 0x72, 0x22, 0x6E, 0xFE, 0x4E, 0xD4, 0xB3, 0x44, 0xF9, 0x99, + 0xCE, 0xBC, 0x5F, 0x8A, 0x72, 0x0E, 0x21, 0x9B, 0xF2, 0xE2, 0x8B, 0xC3, 0xC6, 0x02, 0x16, 0x07, + 0x69, 0x3E, 0x96, 0x5C, 0x1E, 0x12, 0x9C, 0x7A, 0xA9, 0x65, 0x23, 0x39, 0xE1, 0xCB, 0xAE, 0x1C, + 0x3A, 0xD2, 0x97, 0x5F, 0x8A, 0xF6, 0xD9, 0x57, 0x15, 0x1D, 0xF9, 0xF5, 0xE4, 0x72, 0xF3, 0xB7, + 0x5A, 0x6D, 0x61, 0xBD, 0x68, 0x56, 0x5F, 0xBA, 0x74, 0xD4, 0xA3, 0x85, 0x33, 0x3F, 0x5D, 0xEB, + 0xCE, 0x49, 0xEC, 0x85, 0x08, 0x55, 0xBD, 0x96, 0x98, 0xB3, 0x18, 0xCD, 0xDA, 0x97, 0xEC, 0xB1, + 0x78, 0xE9, 0xDE, 0xA8, 0x2B, 0xCA, 0x02, 0xE6, 0x76, 0x66, 0x97, 0x34, 0x01, 0x4C, 0x32, 0xCA, + 0xA4, 0x63, 0x67, 0xE8, 0x46, 0x35, 0x80, 0x77, 0xBB, 0x78, 0xB3, 0x95, 0xBF, 0x59, 0x2B, 0xED, + 0x00, 0x02, 0xD4, 0x07, 0xCD, 0x6D, 0xA4, 0xA6, 0xDA, 0x08, 0x5D, 0x10, 0xC8, 0xC9, 0xBA, 0xC5, + 0xB2, 0xC3, 0x91, 0x63, 0xF0, 0xBD, 0x27, 0xF9, 0x82, 0xB2, 0xF4, 0x76, 0xBB, 0x70, 0xFA, 0x0E, + 0x83, 0xAF, 0x96, 0x05, 0xBF, 0x19, 0xF2, 0x59, 0x3E, 0xF0, 0x43, 0x3D, 0x29, 0x21, 0x1B, 0xCF, + 0x7E, 0xB7, 0x04, 0x90, 0xC1, 0xF9, 0x55, 0x2A, 0x67, 0xD0, 0x97, 0x58, 0x76, 0x60, 0xD9, 0x26, + 0xE0, 0x48, 0x56, 0x00, 0x0E, 0xDD, 0x84, 0x17, 0xD4, 0x1C, 0x96, 0x2D, 0x2B, 0xB4, 0x07, 0x08, + 0xB1, 0xE3, 0xBC, 0x28, 0xF6, 0x02, 0xCC, 0x3A, 0xD4, 0xFB, 0x8F, 0x76, 0x30, 0xB8, 0x47, 0x99, + 0x75, 0xA8, 0x3F, 0x05, 0x7B, 0xEF, 0xFD, 0xAD, 0x9A, 0xEB, 0x98, 0x8D, 0x4B, 0xED, 0xDA, 0xF9, + 0xE6, 0xE8, 0x5E, 0x10, 0x57, 0xF3, 0x6C, 0x0F, 0x20, 0x88, 0xBB, 0x51, 0xD8, 0x18, 0x90, 0x86, + 0x4E, 0x34, 0x7C, 0xCC, 0x19, 0x27, 0x39, 0x9B, 0xA5, 0x63, 0x8D, 0xCD, 0xAC, 0x73, 0xC6, 0x7A, + 0x93, 0x89, 0x16, 0x2D, 0x12, 0x2F, 0x5B, 0xB6, 0xD3, 0x91, 0x2F, 0x2F, 0x0C, 0x39, 0xDD, 0xE9, + 0x64, 0x31, 0x3B, 0x32, 0x60, 0x2D, 0xA0, 0xD7, 0x99, 0xA8, 0x25, 0xEB, 0xD9, 0x02, 0x7A, 0x2D, + 0x2A, 0xD5, 0x6C, 0x06, 0x2C, 0xA4, 0xE7, 0xC5, 0xD0, 0x33, 0x26, 0x2C, 0x86, 0x00, 0x75, 0x65, + 0xC9, 0x14, 0xBF, 0xE5, 0x1C, 0x2A, 0xBE, 0xCB, 0x8B, 0x84, 0xA4, 0x8C, 0xBE, 0xFF, 0x7F, 0x7E, + 0x3E, 0xEA, 0x9C, 0xF3, 0x5A, 0x00 }; ///main_js //To convert AP-Config\index.html to index_html[], run the Python index_html_zipper.py script in the Tools folder: @@ -890,7 +890,7 @@ static const uint8_t main_js[] PROGMEM = { // python index_html_zipper.py static const uint8_t index_html[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0xF0, 0x55, 0x50, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x1F, 0x8B, 0x08, 0x08, 0x12, 0x6D, 0x50, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xD9, 0x72, 0xE3, 0x48, 0x92, 0xE0, 0xFB, 0x9A, 0xED, 0x3F, 0x44, 0x73, 0x76, 0x46, 0xCA, 0x19, 0x91, 0xE2, 0x21, 0x29, 0x95, 0xEA, 0x4C, 0x99, 0xE9, 0xCC, 0xD2, 0xB6, 0x94, 0x49, 0x13, 0x95, 0x5D, 0xC7, 0xDA, 0x6E, From fe59eea892834a42a61067457b636196ee5be888 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Fri, 24 May 2024 15:52:14 +0100 Subject: [PATCH 103/358] Download working with SD hack - full build exceeds 4MB! --- Firmware/RTK_Everywhere/Form.ino | 116 +++++++++++++++------ Firmware/RTK_Everywhere/RTK_Everywhere.ino | 18 +++- Firmware/RTK_Everywhere/settings.h | 2 + 3 files changed, 100 insertions(+), 36 deletions(-) diff --git a/Firmware/RTK_Everywhere/Form.ino b/Firmware/RTK_Everywhere/Form.ino index e81ca1006..337ad1664 100644 --- a/Firmware/RTK_Everywhere/Form.ino +++ b/Firmware/RTK_Everywhere/Form.ino @@ -448,11 +448,19 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) // Handler for the /uploadFile form POST webserver->on( - "/uploadFile", HTTP_POST, handleUpload); // Run handleUpload function when file manager file is uploaded + "/uploadFile", HTTP_POST, + []() { + webserver->send(200, "text/plain", ""); + }, + handleUpload); // Run handleUpload function when file manager file is uploaded // Handler for the /uploadFirmware form POST webserver->on( - "/uploadFirmware", HTTP_POST, handleFirmwareFileUpload); + "/uploadFirmware", HTTP_POST, + []() { + webserver->send(200, "text/plain", ""); + }, + handleFirmwareFileUpload); // Handler for file manager webserver->on("/listfiles", HTTP_GET, []() { @@ -621,21 +629,46 @@ static void handleFileManager() { logmessage += " downloaded"; - if (managerTempFile.open(slashFileName, O_READ) != true) + // This is a nasty hack to allow us to use streamFile to download the file: + // End SdFat, begin SD, open the file using SD, stream it, end SD and allow SdFat to take over again... + + // Attempt to gain access to the SD card + if (xSemaphoreTake(sdCardSemaphore, fatSemaphore_longWait_ms) == pdPASS) { - systemPrintln("Error: File Manager failed to open file"); - return; + markSemaphore(FUNCTION_FILEMANAGER_DOWNLOAD1); + + endSD(true, false); + + if (!SD.begin(pin_microSD_CS)) + { + systemPrintln("Failed to begin SD!"); + } + else + { + File download = SD.open(slashFileName, "r"); + + if (!download) + { + systemPrintf("Failed to open %s for download!\r\n", slashFileName); + } + else + { + webserver->sendHeader("Cache-Control", "no-cache"); + webserver->sendHeader("Content-Disposition", "attachment; filename=" + String(fileName)); + webserver->sendHeader("Access-Control-Allow-Origin", "*"); + webserver->streamFile(download, "application/octet-stream"); + + download.close(); + SD.end(); + + sendStringToWebsocket("fmNext,1,"); // Tell browser to send next file if needed + } + } + + xSemaphoreGive(sdCardSemaphore); + + beginSD(); } - - webserver->sendHeader("Cache-Control", "no-cache"); - webserver->sendHeader("Content-Disposition", "attachment; filename=" + fileName); - webserver->sendHeader("Access-Control-Allow-Origin", "*"); - - // TODO: webserver->streamFile(managerTempFile, "application/octet-stream"); - - managerTempFile.close(); - - sendStringToWebsocket("fmNext,1,"); // Tell browser to send next file if needed } else if (fileAction == "delete") { @@ -1039,33 +1072,53 @@ void createMessageListBase(String &returnText) // Handles uploading of user files to SD // https://github.com/espressif/arduino-esp32/blob/master/libraries/WebServer/examples/FSBrowser/FSBrowser.ino -static void handleUpload() +void handleUpload() { - String logmessage = ""; - String filename = ""; - HTTPUpload &upload = webserver->upload(); if (upload.status == UPLOAD_FILE_START) { - filename = upload.filename; + String filename = upload.filename; - logmessage = "Upload Start: " + filename; + String logmessage = "Upload Start: " + filename; int fileNameLen = filename.length(); char tempFileName[fileNameLen + 2] = {'/'}; // Filename must start with / or VERY bad things happen on SD_MMC filename.toCharArray(&tempFileName[1], fileNameLen + 1); tempFileName[fileNameLen + 1] = '\0'; // Terminate array - // Attempt to gain access to the SD card - if (xSemaphoreTake(sdCardSemaphore, fatSemaphore_longWait_ms) == pdPASS) + // Allocate the managerTempFile + if (!managerTempFile) + { + managerTempFile = new SdFile; + if (!managerTempFile) + { + systemPrintln("Failed to allocate managerTempFile!"); + return; + } + } + + if (managerFileOpen == false) { - markSemaphore(FUNCTION_FILEMANAGER_UPLOAD1); + // Attempt to gain access to the SD card + if (xSemaphoreTake(sdCardSemaphore, fatSemaphore_longWait_ms) == pdPASS) + { + markSemaphore(FUNCTION_FILEMANAGER_UPLOAD1); - managerTempFile.open(tempFileName, O_CREAT | O_APPEND | O_WRITE); + if (managerTempFile->open(tempFileName, O_CREAT | O_APPEND | O_WRITE) == true) + managerFileOpen = true; + else + systemPrintln("Error: handleUpload failed to open file"); - xSemaphoreGive(sdCardSemaphore); + xSemaphoreGive(sdCardSemaphore); + } } + else + { + // File is already in use. Wait your turn. + webserver->send(202, "text/plain", "ERROR: File already uploading"); + } + systemPrintln(logmessage); } @@ -1077,7 +1130,7 @@ static void handleUpload() { markSemaphore(FUNCTION_FILEMANAGER_UPLOAD2); - managerTempFile.write(upload.buf, upload.currentSize); // stream the incoming chunk to the opened file + managerTempFile->write(upload.buf, upload.currentSize); // stream the incoming chunk to the opened file xSemaphoreGive(sdCardSemaphore); } @@ -1085,16 +1138,17 @@ static void handleUpload() else if (upload.status == UPLOAD_FILE_END) { - logmessage = "Upload Complete: " + filename + ", size: " + String(upload.totalSize); + String logmessage = "Upload Complete: " + String(upload.filename) + ", size: " + String(upload.totalSize); // Attempt to gain access to the SD card if (xSemaphoreTake(sdCardSemaphore, fatSemaphore_longWait_ms) == pdPASS) { markSemaphore(FUNCTION_FILEMANAGER_UPLOAD3); - sdUpdateFileCreateTimestamp(&managerTempFile); // Update the file create time & date + sdUpdateFileCreateTimestamp(managerTempFile); // Update the file create time & date - managerTempFile.close(); + managerTempFile->close(); + managerFileOpen = false; xSemaphoreGive(sdCardSemaphore); } @@ -1103,7 +1157,7 @@ static void handleUpload() // Redirect to "/" webserver->sendHeader("Location", "/"); - webserver->send(302); + webserver->send(302, "text/plain", ""); } } diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index c2246ded2..dcb153f04 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -21,7 +21,7 @@ // To reduce compile times, various parts of the firmware can be disabled/removed if they are not // needed during development -#define COMPILE_BT // Comment out to remove Bluetooth functionality +//#define COMPILE_BT // Comment out to remove Bluetooth functionality #define COMPILE_WIFI // Comment out to remove WiFi functionality #define COMPILE_ETHERNET // Comment out to remove Ethernet (W5500) support @@ -242,7 +242,8 @@ typedef enum LoggingType } LoggingType; LoggingType loggingType; -SdFile managerTempFile; // File used for uploading or downloading in the file manager section of AP config +SdFile *managerTempFile = nullptr; // File used for uploading or downloading in the file manager section of AP config +bool managerFileOpen = false; TaskHandle_t sdSizeCheckTaskHandle; // Store handles so that we can delete the task once the size is found const uint8_t sdSizeCheckTaskPriority = 0; // 3 being the highest, and 0 being the lowest @@ -568,9 +569,10 @@ unsigned long lastDynamicDataUpdate; #ifdef COMPILE_WIFI #ifdef COMPILE_AP -#include -#include -#include +#include // Needed for the captive portal +#include // Port 80 +#include // Needed for web sockets only - on port 81 +#include // Needed for web config file download (streamFile) #include "form.h" // https://github.com/espressif/arduino-esp32/blob/master/libraries/DNSServer/examples/CaptivePortal/CaptivePortal.ino @@ -1595,6 +1597,12 @@ void getSemaphoreFunction(char *functionName) case FUNCTION_FILEMANAGER_UPLOAD3: strcpy(functionName, "FileManager Upload3"); break; + case FUNCTION_FILEMANAGER_DOWNLOAD1: + strcpy(functionName, "FileManager Download1"); + break; + case FUNCTION_FILEMANAGER_DOWNLOAD2: + strcpy(functionName, "FileManager Download2"); + break; case FUNCTION_SDSIZECHECK: strcpy(functionName, "SD Size Check"); break; diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 952744755..738f74e17 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -479,6 +479,8 @@ typedef enum FUNCTION_FILEMANAGER_UPLOAD1, FUNCTION_FILEMANAGER_UPLOAD2, FUNCTION_FILEMANAGER_UPLOAD3, + FUNCTION_FILEMANAGER_DOWNLOAD1, + FUNCTION_FILEMANAGER_DOWNLOAD2, FUNCTION_SDSIZECHECK, FUNCTION_LOG_CLOSURE, FUNCTION_PRINT_FILE_LIST, From 78e6b0d15750ac4e7f8f9b366acd1ee3810ffaba Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Fri, 24 May 2024 09:04:59 -0600 Subject: [PATCH 104/358] Update path in zip tools --- Firmware/Tools/index_html_zipper.py | 4 ++-- Firmware/Tools/main_js_zipper.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Firmware/Tools/index_html_zipper.py b/Firmware/Tools/index_html_zipper.py index 2e3e51093..cd37d9217 100644 --- a/Firmware/Tools/index_html_zipper.py +++ b/Firmware/Tools/index_html_zipper.py @@ -37,8 +37,8 @@ import gzip import shutil -defaultsource = '../RTK_Surveyor/AP-Config/index.html' -defaultdest = '../RTK_Surveyor/form.h' +defaultsource = '../RTK_Everywhere/AP-Config/index.html' +defaultdest = '../RTK_Everywhere/form.h' headersearch = 'static const uint8_t index_html[] PROGMEM = {' footersearch = '}; ///index_html' diff --git a/Firmware/Tools/main_js_zipper.py b/Firmware/Tools/main_js_zipper.py index 56c27dcff..4685cbcd2 100644 --- a/Firmware/Tools/main_js_zipper.py +++ b/Firmware/Tools/main_js_zipper.py @@ -37,8 +37,8 @@ import gzip import shutil -defaultsource = '../RTK_Surveyor/AP-Config/src/main.js' -defaultdest = '../RTK_Surveyor/form.h' +defaultsource = '../RTK_Everywhere/AP-Config/src/main.js' +defaultdest = '../RTK_Everywhere/form.h' headersearch = 'static const uint8_t main_js[] PROGMEM = {' footersearch = '}; ///main_js' From 097f9600209e3a2ee00500ccd0ed3a226a1c868b Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Fri, 24 May 2024 09:29:49 -0600 Subject: [PATCH 105/358] Whitespace formatting --- Firmware/RTK_Everywhere/AP-Config/index.html | 87 +++++++++++--------- 1 file changed, 47 insertions(+), 40 deletions(-) diff --git a/Firmware/RTK_Everywhere/AP-Config/index.html b/Firmware/RTK_Everywhere/AP-Config/index.html index 567dfbed2..a5b9b747e 100644 --- a/Firmware/RTK_Everywhere/AP-Config/index.html +++ b/Firmware/RTK_Everywhere/AP-Config/index.html @@ -140,6 +140,7 @@
+
@@ -322,18 +323,18 @@
- - - + + +
-
+ +
@@ -358,8 +361,7 @@
-