diff options
96 files changed, 3115 insertions, 2374 deletions
diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..69645a1 --- /dev/null +++ b/.clang-format @@ -0,0 +1,3 @@ +--- +SortIncludes: 'false' +... diff --git a/jack/autocorrect_data.h b/jack/autocorrect_data.h index f9d6352..e83dcf9 100644 --- a/jack/autocorrect_data.h +++ b/jack/autocorrect_data.h @@ -1,17 +1,17 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #pragma once -#define AUTOCORRECT_MIN_LENGTH 5 -#define AUTOCORRECT_MAX_LENGTH 10 -#define DICTIONARY_SIZE 5867 +#define AUTOCORRECT_MIN_LENGTH 5 // ":abot" +#define AUTOCORRECT_MAX_LENGTH 10 // "competance" +#define DICTIONARY_SIZE 5705 static const uint8_t autocorrect_data[DICTIONARY_SIZE] PROGMEM = { 0x6C, 0x40, 0x00, 0x04, 0x0A, 0x01, 0x06, 0x22, 0x01, 0x07, 0x7D, 0x01, - 0x08, 0x47, 0x03, 0x09, 0x8E, 0x08, 0x0A, 0xBF, 0x08, 0x0B, 0x43, 0x09, - 0x0C, 0xD2, 0x09, 0x0E, 0xDC, 0x09, 0x0F, 0xE8, 0x09, 0x10, 0x09, 0x0B, - 0x11, 0x3B, 0x0B, 0x12, 0x58, 0x0D, 0x13, 0x8C, 0x0D, 0x15, 0xA6, 0x0D, - 0x16, 0x6D, 0x0F, 0x17, 0x21, 0x11, 0x19, 0x59, 0x14, 0x1A, 0x90, 0x14, - 0x1C, 0xB6, 0x14, 0x00, 0x46, 0x5F, 0x00, 0x07, 0x67, 0x00, 0x08, 0x71, + 0x08, 0x3A, 0x03, 0x09, 0x71, 0x08, 0x0A, 0xA2, 0x08, 0x0B, 0x26, 0x09, + 0x0C, 0xB5, 0x09, 0x0E, 0xBF, 0x09, 0x0F, 0xCB, 0x09, 0x10, 0xEC, 0x0A, + 0x11, 0x0A, 0x0B, 0x12, 0x18, 0x0D, 0x13, 0x4C, 0x0D, 0x15, 0x66, 0x0D, + 0x16, 0x0B, 0x0F, 0x17, 0xBF, 0x10, 0x19, 0xE6, 0x13, 0x1A, 0x1D, 0x14, + 0x1C, 0x43, 0x14, 0x00, 0x46, 0x5F, 0x00, 0x07, 0x67, 0x00, 0x08, 0x71, 0x00, 0x0A, 0x9C, 0x00, 0x0F, 0xA8, 0x00, 0x11, 0xB0, 0x00, 0x12, 0xB8, 0x00, 0x16, 0xC2, 0x00, 0x17, 0xCD, 0x00, 0x18, 0x00, 0x01, 0x00, 0x0C, 0x0B, 0x1A, 0x2C, 0x00, 0x80, 0x68, 0x00, 0x16, 0x08, 0x18, 0x2C, 0x00, @@ -39,7 +39,7 @@ static const uint8_t autocorrect_data[DICTIONARY_SIZE] PROGMEM = { 0x16, 0x04, 0x00, 0x86, 0x65, 0x73, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x00, 0x08, 0x0B, 0x06, 0x00, 0x81, 0x63, 0x6B, 0x00, 0x44, 0x93, 0x01, 0x08, 0x9F, 0x01, 0x0F, 0x7F, 0x02, 0x11, 0xA7, 0x02, 0x12, 0xDF, 0x02, - 0x15, 0xFA, 0x02, 0x18, 0x32, 0x03, 0x00, 0x0C, 0x0F, 0x19, 0x11, 0x0C, + 0x15, 0xFA, 0x02, 0x18, 0x25, 0x03, 0x00, 0x0C, 0x0F, 0x19, 0x11, 0x0C, 0x00, 0x83, 0x61, 0x6C, 0x69, 0x64, 0x00, 0x46, 0xC1, 0x01, 0x07, 0xCB, 0x01, 0x08, 0xD5, 0x01, 0x09, 0xE0, 0x01, 0x0A, 0xED, 0x01, 0x0C, 0xF7, 0x01, 0x13, 0x11, 0x02, 0x15, 0x2E, 0x02, 0x16, 0x51, 0x02, 0x17, 0x5D, @@ -69,429 +69,417 @@ static const uint8_t autocorrect_data[DICTIONARY_SIZE] PROGMEM = { 0x83, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x00, 0x04, 0x00, 0x82, 0x6F, 0x75, 0x6E, 0x64, 0x00, 0x4C, 0xE6, 0x02, 0x15, 0xF1, 0x02, 0x00, 0x08, 0x15, 0x13, 0x00, 0x84, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x00, 0x06, 0x08, 0x15, - 0x00, 0x82, 0x6F, 0x72, 0x64, 0x00, 0x44, 0x04, 0x03, 0x08, 0x0F, 0x03, - 0x18, 0x28, 0x03, 0x00, 0x1A, 0x12, 0x09, 0x00, 0x83, 0x72, 0x77, 0x61, - 0x72, 0x64, 0x00, 0x47, 0x16, 0x03, 0x0C, 0x20, 0x03, 0x00, 0x0C, 0x16, - 0x11, 0x12, 0x06, 0x00, 0x80, 0x65, 0x64, 0x00, 0x1A, 0x00, 0x83, 0x65, - 0x69, 0x72, 0x64, 0x00, 0x04, 0x0A, 0x2C, 0x00, 0x83, 0x75, 0x61, 0x72, - 0x64, 0x00, 0x12, 0x00, 0x4B, 0x3B, 0x03, 0x15, 0x41, 0x03, 0x00, 0x16, - 0x00, 0x80, 0x6C, 0x64, 0x00, 0x04, 0x00, 0x80, 0x6E, 0x64, 0x00, 0x44, - 0x75, 0x03, 0x05, 0x82, 0x03, 0x06, 0xAD, 0x03, 0x07, 0x2D, 0x04, 0x08, - 0x49, 0x04, 0x0A, 0x9D, 0x04, 0x0B, 0x15, 0x05, 0x0C, 0x66, 0x05, 0x0F, - 0x6F, 0x05, 0x11, 0x31, 0x06, 0x15, 0x3D, 0x06, 0x16, 0xA7, 0x06, 0x17, - 0x38, 0x07, 0x18, 0x13, 0x08, 0x19, 0x4C, 0x08, 0x00, 0x06, 0x13, 0x16, - 0x08, 0x10, 0x04, 0x11, 0x00, 0x82, 0x61, 0x63, 0x65, 0x00, 0x44, 0x89, - 0x03, 0x0F, 0x93, 0x03, 0x00, 0x0F, 0x0C, 0x04, 0x19, 0x04, 0x00, 0x80, - 0x6C, 0x65, 0x00, 0x44, 0x9A, 0x03, 0x18, 0xA5, 0x03, 0x00, 0x0F, 0x0C, - 0x04, 0x19, 0x04, 0x00, 0x82, 0x62, 0x6C, 0x65, 0x00, 0x12, 0x07, 0x00, - 0x82, 0x62, 0x6C, 0x65, 0x00, 0x48, 0xBA, 0x03, 0x0C, 0xC5, 0x03, 0x11, - 0xCE, 0x03, 0x13, 0x20, 0x04, 0x00, 0x15, 0x08, 0x09, 0x08, 0x15, 0x00, - 0x81, 0x6E, 0x63, 0x65, 0x00, 0x08, 0x13, 0x00, 0x83, 0x69, 0x65, 0x63, - 0x65, 0x00, 0x44, 0xD8, 0x03, 0x08, 0xE5, 0x03, 0x18, 0x16, 0x04, 0x00, - 0x17, 0x08, 0x13, 0x10, 0x12, 0x06, 0x00, 0x83, 0x65, 0x6E, 0x63, 0x65, - 0x00, 0x55, 0xEC, 0x03, 0x17, 0x0B, 0x04, 0x00, 0x08, 0x00, 0x49, 0xF5, - 0x03, 0x0F, 0x02, 0x04, 0x00, 0x15, 0x2C, 0x00, 0x86, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6E, 0x63, 0x65, 0x00, 0x12, 0x17, 0x00, 0x83, 0x61, 0x6E, - 0x63, 0x65, 0x00, 0x11, 0x0C, 0x04, 0x10, 0x00, 0x81, 0x61, 0x6E, 0x63, - 0x65, 0x00, 0x14, 0x08, 0x16, 0x00, 0x82, 0x65, 0x6E, 0x63, 0x65, 0x00, - 0x04, 0x16, 0x08, 0x10, 0x04, 0x11, 0x00, 0x83, 0x70, 0x61, 0x63, 0x65, - 0x00, 0x0C, 0x15, 0x08, 0x19, 0x00, 0x52, 0x39, 0x04, 0x19, 0x3F, 0x04, - 0x00, 0x82, 0x72, 0x69, 0x64, 0x65, 0x00, 0x12, 0x00, 0x85, 0x65, 0x72, - 0x72, 0x69, 0x64, 0x65, 0x00, 0x17, 0x00, 0x44, 0x58, 0x04, 0x0C, 0x63, - 0x04, 0x11, 0x6D, 0x04, 0x17, 0x90, 0x04, 0x00, 0x15, 0x04, 0x18, 0x0A, - 0x00, 0x82, 0x6E, 0x74, 0x65, 0x65, 0x00, 0x10, 0x10, 0x12, 0x06, 0x00, - 0x81, 0x74, 0x65, 0x65, 0x00, 0x04, 0x15, 0x00, 0x44, 0x77, 0x04, 0x18, - 0x83, 0x04, 0x00, 0x0A, 0x00, 0x86, 0x75, 0x61, 0x72, 0x61, 0x6E, 0x74, - 0x65, 0x65, 0x00, 0x04, 0x0A, 0x00, 0x87, 0x75, 0x61, 0x72, 0x61, 0x6E, - 0x74, 0x65, 0x65, 0x00, 0x0C, 0x10, 0x12, 0x06, 0x00, 0x84, 0x6D, 0x69, - 0x74, 0x74, 0x65, 0x65, 0x00, 0x44, 0xA7, 0x04, 0x07, 0xEA, 0x04, 0x10, - 0x0C, 0x05, 0x00, 0x4A, 0xB4, 0x04, 0x11, 0xBF, 0x04, 0x16, 0xC8, 0x04, - 0x18, 0xD1, 0x04, 0x00, 0x15, 0x12, 0x10, 0x00, 0x83, 0x74, 0x67, 0x61, - 0x67, 0x65, 0x00, 0x0B, 0x06, 0x00, 0x83, 0x61, 0x6E, 0x67, 0x65, 0x00, - 0x08, 0x10, 0x00, 0x82, 0x73, 0x61, 0x67, 0x65, 0x00, 0x0A, 0x00, 0x6C, - 0xDA, 0x04, 0x04, 0xE0, 0x04, 0x00, 0x83, 0x61, 0x75, 0x67, 0x65, 0x00, - 0x0F, 0x00, 0x84, 0x6E, 0x67, 0x75, 0x61, 0x67, 0x65, 0x00, 0x08, 0x0F, - 0x00, 0x44, 0xF7, 0x04, 0x0C, 0xFD, 0x04, 0x0F, 0x06, 0x05, 0x00, 0x83, - 0x6C, 0x65, 0x67, 0x65, 0x00, 0x19, 0x0C, 0x15, 0x13, 0x00, 0x82, 0x67, - 0x65, 0x00, 0x04, 0x00, 0x82, 0x67, 0x65, 0x00, 0x04, 0x0C, 0x00, 0x83, - 0x6D, 0x61, 0x67, 0x65, 0x00, 0x17, 0x00, 0x47, 0x27, 0x05, 0x10, 0x31, - 0x05, 0x12, 0x3B, 0x05, 0x16, 0x44, 0x05, 0x17, 0x4D, 0x05, 0x00, 0x11, - 0x04, 0x2C, 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, 0x12, 0x15, 0x09, - 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, 0x17, 0x2C, 0x00, 0x82, 0x20, - 0x74, 0x68, 0x65, 0x00, 0x04, 0x2C, 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, - 0x00, 0x44, 0x54, 0x05, 0x18, 0x5C, 0x05, 0x00, 0x2C, 0x00, 0x82, 0x20, - 0x74, 0x68, 0x65, 0x00, 0x12, 0x05, 0x04, 0x00, 0x82, 0x20, 0x74, 0x68, - 0x65, 0x00, 0x1D, 0x16, 0x2C, 0x00, 0x82, 0x69, 0x7A, 0x65, 0x00, 0x45, - 0x82, 0x05, 0x0C, 0xF3, 0x05, 0x13, 0xFE, 0x05, 0x16, 0x1A, 0x06, 0x17, - 0x22, 0x06, 0x19, 0x2A, 0x06, 0x00, 0x44, 0x8C, 0x05, 0x0C, 0xDC, 0x05, - 0x0F, 0xE8, 0x05, 0x00, 0x4A, 0x96, 0x05, 0x0C, 0xA0, 0x05, 0x0F, 0xBE, - 0x05, 0x00, 0x0C, 0x0F, 0x08, 0x00, 0x83, 0x69, 0x62, 0x6C, 0x65, 0x00, - 0x0F, 0x00, 0x44, 0xA9, 0x05, 0x0C, 0xB4, 0x05, 0x00, 0x19, 0x04, 0x00, - 0x85, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x04, 0x19, 0x04, 0x00, - 0x84, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x44, 0xC5, 0x05, 0x0C, 0xD0, 0x05, - 0x00, 0x19, 0x04, 0x00, 0x84, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, - 0x19, 0x04, 0x00, 0x85, 0x61, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, - 0x04, 0x0F, 0x0C, 0x04, 0x19, 0x04, 0x00, 0x83, 0x62, 0x6C, 0x65, 0x00, - 0x0C, 0x04, 0x19, 0x04, 0x00, 0x82, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x1A, - 0x0B, 0x2C, 0x00, 0x84, 0x77, 0x68, 0x69, 0x6C, 0x65, 0x00, 0x48, 0x05, - 0x06, 0x12, 0x0F, 0x06, 0x00, 0x12, 0x13, 0x00, 0x84, 0x65, 0x6F, 0x70, - 0x6C, 0x65, 0x00, 0x08, 0x12, 0x13, 0x00, 0x85, 0x65, 0x6F, 0x70, 0x6C, - 0x65, 0x00, 0x04, 0x09, 0x00, 0x82, 0x6C, 0x73, 0x65, 0x00, 0x0C, 0x0F, - 0x00, 0x81, 0x74, 0x6C, 0x65, 0x00, 0x08, 0x0F, 0x00, 0x81, 0x65, 0x6C, - 0x00, 0x0C, 0x08, 0x0A, 0x1C, 0x0B, 0x00, 0x83, 0x69, 0x65, 0x6E, 0x65, - 0x00, 0x46, 0x4D, 0x06, 0x0C, 0x57, 0x06, 0x12, 0x63, 0x06, 0x15, 0x8A, - 0x06, 0x18, 0x91, 0x06, 0x00, 0x12, 0x16, 0x2C, 0x00, 0x83, 0x63, 0x6F, - 0x72, 0x65, 0x00, 0x18, 0x14, 0x04, 0x00, 0x84, 0x63, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x00, 0x47, 0x6D, 0x06, 0x08, 0x76, 0x06, 0x09, 0x7E, 0x06, - 0x00, 0x08, 0x05, 0x00, 0x83, 0x66, 0x6F, 0x72, 0x65, 0x00, 0x05, 0x00, - 0x82, 0x66, 0x6F, 0x72, 0x65, 0x00, 0x15, 0x08, 0x0B, 0x17, 0x00, 0x83, - 0x65, 0x66, 0x6F, 0x72, 0x65, 0x00, 0x08, 0x0B, 0x1A, 0x00, 0x81, 0x65, - 0x00, 0x17, 0x00, 0x6C, 0x9A, 0x06, 0x04, 0x9F, 0x06, 0x00, 0x82, 0x72, - 0x75, 0x65, 0x00, 0x10, 0x04, 0x00, 0x82, 0x65, 0x75, 0x72, 0x00, 0x44, - 0xBD, 0x06, 0x08, 0xE1, 0x06, 0x0C, 0xE9, 0x06, 0x0F, 0xF8, 0x06, 0x11, - 0x01, 0x07, 0x12, 0x1F, 0x07, 0x18, 0x2C, 0x07, 0x00, 0x46, 0xC7, 0x06, - 0x08, 0xCF, 0x06, 0x0F, 0xD9, 0x06, 0x00, 0x08, 0x05, 0x00, 0x81, 0x75, - 0x73, 0x65, 0x00, 0x05, 0x2C, 0x00, 0x82, 0x63, 0x61, 0x75, 0x73, 0x65, - 0x00, 0x09, 0x00, 0x83, 0x61, 0x6C, 0x73, 0x65, 0x00, 0x08, 0x0B, 0x17, - 0x00, 0x82, 0x73, 0x65, 0x00, 0x06, 0x15, 0x08, 0x06, 0x1B, 0x08, 0x00, - 0x86, 0x65, 0x72, 0x63, 0x69, 0x73, 0x65, 0x00, 0x0C, 0x04, 0x09, 0x00, - 0x83, 0x6C, 0x73, 0x65, 0x00, 0x48, 0x08, 0x07, 0x12, 0x13, 0x07, 0x00, - 0x16, 0x0C, 0x0F, 0x00, 0x84, 0x63, 0x65, 0x6E, 0x73, 0x65, 0x00, 0x13, - 0x08, 0x15, 0x00, 0x84, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x00, 0x13, - 0x11, 0x04, 0x15, 0x17, 0x00, 0x83, 0x73, 0x70, 0x6F, 0x73, 0x65, 0x00, - 0x06, 0x04, 0x08, 0x05, 0x00, 0x84, 0x63, 0x61, 0x75, 0x73, 0x65, 0x00, - 0x44, 0x45, 0x07, 0x08, 0xF3, 0x07, 0x0F, 0xFE, 0x07, 0x19, 0x0A, 0x08, - 0x00, 0x47, 0x55, 0x07, 0x0A, 0x7A, 0x07, 0x0F, 0x87, 0x07, 0x13, 0xCA, - 0x07, 0x15, 0xD4, 0x07, 0x00, 0x12, 0x10, 0x00, 0x50, 0x5F, 0x07, 0x12, - 0x6E, 0x07, 0x00, 0x12, 0x06, 0x04, 0x00, 0x87, 0x63, 0x6F, 0x6D, 0x6D, - 0x6F, 0x64, 0x61, 0x74, 0x65, 0x00, 0x06, 0x06, 0x04, 0x00, 0x84, 0x6D, - 0x6F, 0x64, 0x61, 0x74, 0x65, 0x00, 0x12, 0x13, 0x12, 0x15, 0x13, 0x00, - 0x84, 0x61, 0x67, 0x61, 0x74, 0x65, 0x00, 0x46, 0x91, 0x07, 0x13, 0x9E, - 0x07, 0x18, 0xAB, 0x07, 0x00, 0x18, 0x0F, 0x04, 0x06, 0x00, 0x85, 0x63, - 0x75, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x10, 0x04, 0x08, 0x17, 0x00, 0x86, - 0x6D, 0x70, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x46, 0xB2, 0x07, 0x0F, 0xBF, - 0x07, 0x00, 0x18, 0x0F, 0x04, 0x06, 0x00, 0x86, 0x63, 0x75, 0x6C, 0x61, - 0x74, 0x65, 0x00, 0x04, 0x06, 0x00, 0x84, 0x63, 0x75, 0x6C, 0x61, 0x74, - 0x65, 0x00, 0x07, 0x18, 0x00, 0x84, 0x70, 0x64, 0x61, 0x74, 0x65, 0x00, - 0x48, 0xDB, 0x07, 0x18, 0xE8, 0x07, 0x00, 0x11, 0x04, 0x0A, 0x00, 0x86, - 0x65, 0x6E, 0x65, 0x72, 0x61, 0x74, 0x65, 0x00, 0x06, 0x04, 0x00, 0x84, - 0x63, 0x75, 0x72, 0x61, 0x74, 0x65, 0x00, 0x0F, 0x0F, 0x04, 0x13, 0x00, - 0x83, 0x65, 0x74, 0x74, 0x65, 0x00, 0x04, 0x13, 0x10, 0x08, 0x17, 0x00, - 0x83, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x0C, 0x15, 0x13, 0x00, 0x81, 0x61, - 0x74, 0x65, 0x00, 0x4A, 0x1D, 0x08, 0x0C, 0x29, 0x08, 0x16, 0x33, 0x08, - 0x00, 0x08, 0x0F, 0x0F, 0x12, 0x06, 0x00, 0x82, 0x61, 0x67, 0x75, 0x65, - 0x00, 0x14, 0x11, 0x18, 0x00, 0x83, 0x69, 0x71, 0x75, 0x65, 0x00, 0x44, - 0x3A, 0x08, 0x15, 0x42, 0x08, 0x00, 0x06, 0x2C, 0x00, 0x82, 0x75, 0x73, - 0x65, 0x00, 0x08, 0x13, 0x00, 0x84, 0x75, 0x72, 0x73, 0x75, 0x65, 0x00, - 0x4C, 0x53, 0x08, 0x12, 0x78, 0x08, 0x00, 0x48, 0x5D, 0x08, 0x0B, 0x67, - 0x08, 0x0F, 0x70, 0x08, 0x00, 0x0F, 0x08, 0x05, 0x00, 0x83, 0x69, 0x65, - 0x76, 0x65, 0x00, 0x06, 0x04, 0x2C, 0x00, 0x81, 0x65, 0x76, 0x65, 0x00, - 0x08, 0x05, 0x00, 0x81, 0x65, 0x76, 0x65, 0x00, 0x52, 0x7F, 0x08, 0x19, - 0x86, 0x08, 0x00, 0x15, 0x13, 0x00, 0x82, 0x76, 0x65, 0x00, 0x05, 0x04, - 0x00, 0x83, 0x6F, 0x76, 0x65, 0x00, 0x4C, 0x95, 0x08, 0x11, 0xB7, 0x08, - 0x00, 0x08, 0x00, 0x4B, 0xA1, 0x08, 0x0F, 0xA8, 0x08, 0x15, 0xB0, 0x08, - 0x00, 0x06, 0x00, 0x82, 0x69, 0x65, 0x66, 0x00, 0x08, 0x05, 0x00, 0x82, - 0x69, 0x65, 0x66, 0x00, 0x05, 0x00, 0x82, 0x69, 0x65, 0x66, 0x00, 0x18, - 0x12, 0x09, 0x2C, 0x00, 0x80, 0x64, 0x00, 0x4C, 0xC6, 0x08, 0x11, 0xD0, - 0x08, 0x00, 0x11, 0x12, 0x0A, 0x2C, 0x00, 0x82, 0x69, 0x6E, 0x67, 0x00, - 0x48, 0xDA, 0x08, 0x0C, 0xE3, 0x08, 0x15, 0x39, 0x09, 0x00, 0x0C, 0x05, - 0x00, 0x83, 0x65, 0x69, 0x6E, 0x67, 0x00, 0x48, 0xF6, 0x08, 0x0B, 0x00, - 0x09, 0x0F, 0x0D, 0x09, 0x15, 0x19, 0x09, 0x17, 0x24, 0x09, 0x1C, 0x2E, - 0x09, 0x00, 0x0B, 0x06, 0x04, 0x06, 0x00, 0x83, 0x69, 0x6E, 0x67, 0x00, - 0x17, 0x06, 0x04, 0x10, 0x00, 0x85, 0x74, 0x63, 0x68, 0x69, 0x6E, 0x67, - 0x00, 0x08, 0x0C, 0x06, 0x00, 0x85, 0x65, 0x69, 0x6C, 0x69, 0x6E, 0x67, - 0x00, 0x18, 0x06, 0x08, 0x15, 0x00, 0x82, 0x72, 0x69, 0x6E, 0x67, 0x00, - 0x0B, 0x2C, 0x00, 0x84, 0x74, 0x68, 0x69, 0x6E, 0x67, 0x00, 0x17, 0x1C, - 0x11, 0x04, 0x00, 0x83, 0x68, 0x69, 0x6E, 0x67, 0x00, 0x0C, 0x17, 0x16, - 0x00, 0x83, 0x72, 0x69, 0x6E, 0x67, 0x00, 0x46, 0x53, 0x09, 0x08, 0x73, - 0x09, 0x0A, 0x7F, 0x09, 0x16, 0x89, 0x09, 0x17, 0x9B, 0x09, 0x00, 0x4C, - 0x5A, 0x09, 0x15, 0x64, 0x09, 0x00, 0x17, 0x1A, 0x16, 0x00, 0x83, 0x69, - 0x74, 0x63, 0x68, 0x00, 0x04, 0x08, 0x16, 0x04, 0x08, 0x15, 0x00, 0x86, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x00, 0x17, 0x07, 0x11, 0x04, 0x2C, - 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, 0x11, 0x08, 0x15, 0x17, 0x16, - 0x00, 0x80, 0x74, 0x68, 0x00, 0x0C, 0x0F, 0x13, 0x10, 0x12, 0x06, 0x04, - 0x00, 0x86, 0x63, 0x6F, 0x6D, 0x70, 0x6C, 0x69, 0x73, 0x68, 0x00, 0x4A, - 0xA5, 0x09, 0x0C, 0xBD, 0x09, 0x15, 0xC8, 0x09, 0x00, 0x48, 0xAC, 0x09, - 0x0C, 0xB6, 0x09, 0x00, 0x15, 0x17, 0x16, 0x00, 0x82, 0x6E, 0x67, 0x74, - 0x68, 0x00, 0x08, 0x0B, 0x00, 0x81, 0x68, 0x74, 0x00, 0x1A, 0x07, 0x11, - 0x04, 0x05, 0x00, 0x81, 0x64, 0x74, 0x68, 0x00, 0x18, 0x17, 0x2C, 0x00, - 0x83, 0x72, 0x75, 0x74, 0x68, 0x00, 0x15, 0x08, 0x0B, 0x17, 0x2C, 0x00, - 0x81, 0x69, 0x72, 0x00, 0x11, 0x0C, 0x17, 0x0B, 0x00, 0x84, 0x74, 0x68, - 0x69, 0x6E, 0x6B, 0x00, 0x44, 0xFE, 0x09, 0x07, 0x52, 0x0A, 0x08, 0x76, - 0x0A, 0x09, 0xCB, 0x0A, 0x0F, 0xD4, 0x0A, 0x17, 0xF1, 0x0A, 0x18, 0xFA, - 0x0A, 0x00, 0x4C, 0x08, 0x0A, 0x17, 0x13, 0x0A, 0x18, 0x2C, 0x0A, 0x00, - 0x06, 0x13, 0x1C, 0x17, 0x00, 0x83, 0x69, 0x63, 0x61, 0x6C, 0x00, 0x4C, - 0x1A, 0x0A, 0x18, 0x22, 0x0A, 0x00, 0x11, 0x0C, 0x00, 0x81, 0x69, 0x61, - 0x6C, 0x00, 0x15, 0x0C, 0x19, 0x00, 0x83, 0x74, 0x75, 0x61, 0x6C, 0x00, - 0x51, 0x36, 0x0A, 0x15, 0x3F, 0x0A, 0x17, 0x48, 0x0A, 0x00, 0x04, 0x2C, - 0x00, 0x82, 0x6E, 0x75, 0x61, 0x6C, 0x00, 0x18, 0x17, 0x04, 0x11, 0x00, - 0x82, 0x61, 0x6C, 0x00, 0x0C, 0x19, 0x00, 0x83, 0x72, 0x74, 0x75, 0x61, - 0x6C, 0x00, 0x48, 0x59, 0x0A, 0x18, 0x60, 0x0A, 0x00, 0x0C, 0x09, 0x00, - 0x81, 0x6C, 0x64, 0x00, 0x52, 0x67, 0x0A, 0x1A, 0x6D, 0x0A, 0x00, 0x06, - 0x00, 0x81, 0x6C, 0x64, 0x00, 0x12, 0x00, 0x84, 0x77, 0x6F, 0x75, 0x6C, - 0x64, 0x00, 0x4A, 0x83, 0x0A, 0x0F, 0x8B, 0x0A, 0x17, 0xB9, 0x0A, 0x18, - 0xC1, 0x0A, 0x00, 0x11, 0x0C, 0x16, 0x00, 0x81, 0x6C, 0x65, 0x00, 0x44, - 0x92, 0x0A, 0x0F, 0xAC, 0x0A, 0x00, 0x15, 0x00, 0x44, 0x9B, 0x0A, 0x15, - 0xA2, 0x0A, 0x00, 0x13, 0x00, 0x81, 0x6C, 0x65, 0x6C, 0x00, 0x04, 0x13, - 0x00, 0x84, 0x61, 0x6C, 0x6C, 0x65, 0x6C, 0x00, 0x04, 0x15, 0x15, 0x04, - 0x13, 0x00, 0x85, 0x61, 0x6C, 0x6C, 0x65, 0x6C, 0x00, 0x17, 0x0C, 0x0F, - 0x00, 0x81, 0x6C, 0x65, 0x00, 0x07, 0x08, 0x0B, 0x06, 0x16, 0x00, 0x81, - 0x6C, 0x65, 0x00, 0x08, 0x16, 0x1C, 0x10, 0x00, 0x81, 0x6C, 0x66, 0x00, - 0x0C, 0x09, 0x00, 0x4F, 0xDE, 0x0A, 0x18, 0xE8, 0x0A, 0x00, 0x0F, 0x18, - 0x09, 0x00, 0x84, 0x66, 0x69, 0x6C, 0x6C, 0x00, 0x09, 0x00, 0x83, 0x6C, - 0x66, 0x69, 0x6C, 0x6C, 0x00, 0x18, 0x16, 0x08, 0x15, 0x00, 0x81, 0x6C, - 0x74, 0x00, 0x09, 0x17, 0x04, 0x08, 0x15, 0x0A, 0x00, 0x85, 0x61, 0x74, - 0x65, 0x66, 0x75, 0x6C, 0x00, 0x44, 0x13, 0x0B, 0x0F, 0x24, 0x0B, 0x15, - 0x2F, 0x0B, 0x00, 0x15, 0x0A, 0x12, 0x17, 0x06, 0x08, 0x13, 0x16, 0x00, - 0x84, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x00, 0x08, 0x05, 0x12, 0x15, - 0x13, 0x00, 0x82, 0x6C, 0x65, 0x6D, 0x00, 0x12, 0x09, 0x12, 0x06, 0x00, - 0x83, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x00, 0x44, 0x5D, 0x0B, 0x07, 0x85, - 0x0B, 0x08, 0x8E, 0x0B, 0x0A, 0x0C, 0x0C, 0x0C, 0x5F, 0x0C, 0x12, 0x79, - 0x0C, 0x13, 0x15, 0x0D, 0x15, 0x21, 0x0D, 0x16, 0x2C, 0x0D, 0x18, 0x36, - 0x0D, 0x1A, 0x4D, 0x0D, 0x00, 0x0C, 0x00, 0x4A, 0x66, 0x0B, 0x17, 0x6E, - 0x0B, 0x00, 0x04, 0x2C, 0x00, 0x82, 0x61, 0x69, 0x6E, 0x00, 0x51, 0x75, - 0x0B, 0x15, 0x7D, 0x0B, 0x00, 0x12, 0x06, 0x00, 0x82, 0x61, 0x69, 0x6E, - 0x00, 0x08, 0x06, 0x00, 0x82, 0x61, 0x69, 0x6E, 0x00, 0x18, 0x12, 0x09, - 0x2C, 0x00, 0x81, 0x6E, 0x64, 0x00, 0x47, 0xA4, 0x0B, 0x08, 0xAE, 0x0B, - 0x0A, 0xD8, 0x0B, 0x13, 0xE4, 0x0B, 0x15, 0xED, 0x0B, 0x16, 0xFA, 0x0B, - 0x1A, 0x04, 0x0C, 0x00, 0x0F, 0x0C, 0x0B, 0x06, 0x00, 0x81, 0x72, 0x65, - 0x6E, 0x00, 0x57, 0xB5, 0x0B, 0x1A, 0xCE, 0x0B, 0x00, 0x48, 0xBC, 0x0B, - 0x1A, 0xC4, 0x0B, 0x00, 0x05, 0x00, 0x82, 0x77, 0x65, 0x65, 0x6E, 0x00, - 0x08, 0x05, 0x00, 0x84, 0x74, 0x77, 0x65, 0x65, 0x6E, 0x00, 0x08, 0x05, - 0x00, 0x83, 0x74, 0x77, 0x65, 0x65, 0x6E, 0x00, 0x12, 0x07, 0x1C, 0x0B, - 0x00, 0x83, 0x72, 0x6F, 0x67, 0x65, 0x6E, 0x00, 0x04, 0x0B, 0x2C, 0x00, - 0x81, 0x70, 0x65, 0x6E, 0x00, 0x07, 0x0F, 0x0B, 0x06, 0x00, 0x84, 0x69, - 0x6C, 0x64, 0x72, 0x65, 0x6E, 0x00, 0x12, 0x12, 0x0B, 0x06, 0x00, 0x83, - 0x73, 0x65, 0x6E, 0x00, 0x17, 0x08, 0x05, 0x00, 0x80, 0x65, 0x6E, 0x00, - 0x48, 0x13, 0x0C, 0x0C, 0x1E, 0x0C, 0x00, 0x0C, 0x15, 0x12, 0x09, 0x00, - 0x83, 0x65, 0x69, 0x67, 0x6E, 0x00, 0x4B, 0x31, 0x0C, 0x0F, 0x37, 0x0C, - 0x11, 0x3F, 0x0C, 0x12, 0x48, 0x0C, 0x15, 0x4F, 0x0C, 0x16, 0x56, 0x0C, - 0x00, 0x17, 0x00, 0x81, 0x6E, 0x67, 0x00, 0x0F, 0x04, 0x00, 0x83, 0x69, - 0x67, 0x6E, 0x00, 0x15, 0x04, 0x08, 0x0F, 0x00, 0x81, 0x6E, 0x67, 0x00, - 0x0A, 0x2C, 0x00, 0x81, 0x6E, 0x67, 0x00, 0x17, 0x16, 0x00, 0x81, 0x6E, - 0x67, 0x00, 0x04, 0x2C, 0x00, 0x82, 0x73, 0x69, 0x67, 0x6E, 0x00, 0x4A, - 0x66, 0x0C, 0x17, 0x6E, 0x0C, 0x00, 0x04, 0x2C, 0x00, 0x81, 0x61, 0x69, - 0x6E, 0x00, 0x04, 0x15, 0x08, 0x06, 0x00, 0x83, 0x74, 0x61, 0x69, 0x6E, - 0x00, 0x4C, 0x83, 0x0C, 0x16, 0xFF, 0x0C, 0x17, 0x09, 0x0D, 0x00, 0x46, - 0x8D, 0x0C, 0x16, 0x9A, 0x0C, 0x17, 0xB4, 0x0C, 0x00, 0x0C, 0x16, 0x08, - 0x07, 0x00, 0x85, 0x63, 0x69, 0x73, 0x69, 0x6F, 0x6E, 0x00, 0x44, 0xA1, - 0x0C, 0x16, 0xAA, 0x0C, 0x00, 0x0C, 0x0F, 0x00, 0x83, 0x69, 0x73, 0x6F, - 0x6E, 0x00, 0x04, 0x06, 0x06, 0x12, 0x00, 0x83, 0x69, 0x6F, 0x6E, 0x00, - 0x47, 0xC4, 0x0C, 0x0C, 0xCE, 0x0C, 0x0F, 0xDD, 0x0C, 0x11, 0xE9, 0x0C, - 0x16, 0xF5, 0x0C, 0x00, 0x07, 0x04, 0x00, 0x83, 0x69, 0x74, 0x69, 0x6F, - 0x6E, 0x00, 0x17, 0x0C, 0x13, 0x08, 0x15, 0x00, 0x86, 0x65, 0x74, 0x69, - 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x04, 0x08, 0x15, 0x00, 0x85, 0x6C, 0x61, - 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x06, 0x18, 0x09, 0x00, 0x85, 0x6E, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x12, 0x13, 0x00, 0x83, 0x69, 0x74, 0x69, - 0x6F, 0x6E, 0x00, 0x0C, 0x19, 0x0C, 0x07, 0x00, 0x81, 0x69, 0x6F, 0x6E, - 0x00, 0x0C, 0x06, 0x04, 0x15, 0x09, 0x00, 0x83, 0x74, 0x69, 0x6F, 0x6E, - 0x00, 0x13, 0x0B, 0x04, 0x00, 0x84, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6E, - 0x00, 0x17, 0x18, 0x08, 0x15, 0x00, 0x83, 0x74, 0x75, 0x72, 0x6E, 0x00, - 0x0A, 0x0C, 0x0B, 0x17, 0x00, 0x82, 0x6E, 0x67, 0x73, 0x00, 0x55, 0x3D, - 0x0D, 0x17, 0x46, 0x0D, 0x00, 0x17, 0x08, 0x15, 0x00, 0x82, 0x75, 0x72, - 0x6E, 0x00, 0x08, 0x15, 0x00, 0x80, 0x72, 0x6E, 0x00, 0x12, 0x0E, 0x11, - 0x18, 0x00, 0x82, 0x6E, 0x6F, 0x77, 0x6E, 0x00, 0x47, 0x62, 0x0D, 0x11, - 0x6D, 0x0D, 0x1A, 0x76, 0x0D, 0x00, 0x08, 0x18, 0x16, 0x13, 0x00, 0x83, - 0x65, 0x75, 0x64, 0x6F, 0x00, 0x1A, 0x0E, 0x2C, 0x00, 0x82, 0x6E, 0x6F, - 0x77, 0x00, 0x4F, 0x7D, 0x0D, 0x11, 0x85, 0x0D, 0x00, 0x0F, 0x12, 0x09, - 0x00, 0x81, 0x6F, 0x77, 0x00, 0x0E, 0x2C, 0x00, 0x81, 0x6F, 0x77, 0x00, - 0x56, 0x93, 0x0D, 0x18, 0x9D, 0x0D, 0x00, 0x04, 0x0B, 0x15, 0x08, 0x13, - 0x00, 0x81, 0x70, 0x73, 0x00, 0x12, 0x12, 0x0F, 0x00, 0x81, 0x6B, 0x75, - 0x70, 0x00, 0x44, 0xC5, 0x0D, 0x08, 0x06, 0x0E, 0x0B, 0x13, 0x0F, 0x0F, - 0x1C, 0x0F, 0x12, 0x2A, 0x0F, 0x13, 0x3B, 0x0F, 0x16, 0x46, 0x0F, 0x17, - 0x4F, 0x0F, 0x18, 0x5B, 0x0F, 0x1C, 0x64, 0x0F, 0x00, 0x4C, 0xCF, 0x0D, - 0x0F, 0xD9, 0x0D, 0x18, 0xFB, 0x0D, 0x00, 0x0F, 0x0C, 0x10, 0x0C, 0x16, - 0x00, 0x82, 0x61, 0x72, 0x00, 0x4C, 0xE0, 0x0D, 0x18, 0xEB, 0x0D, 0x00, - 0x10, 0x10, 0x0C, 0x16, 0x00, 0x84, 0x69, 0x6C, 0x61, 0x72, 0x00, 0x06, - 0x0C, 0x17, 0x04, 0x13, 0x00, 0x86, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6C, - 0x61, 0x72, 0x00, 0x0F, 0x0A, 0x08, 0x15, 0x00, 0x83, 0x75, 0x6C, 0x61, - 0x72, 0x00, 0x44, 0x25, 0x0E, 0x07, 0x2D, 0x0E, 0x0B, 0x3A, 0x0E, 0x0C, - 0x77, 0x0E, 0x0F, 0x91, 0x0E, 0x10, 0x9B, 0x0E, 0x11, 0xA5, 0x0E, 0x12, - 0xD1, 0x0E, 0x17, 0xD9, 0x0E, 0x19, 0xF8, 0x0E, 0x00, 0x0F, 0x06, 0x00, - 0x82, 0x65, 0x61, 0x72, 0x00, 0x11, 0x04, 0x0F, 0x04, 0x06, 0x00, 0x84, - 0x65, 0x6E, 0x64, 0x61, 0x72, 0x00, 0x4A, 0x41, 0x0E, 0x17, 0x4C, 0x0E, - 0x00, 0x0C, 0x08, 0x0B, 0x00, 0x85, 0x69, 0x67, 0x68, 0x65, 0x72, 0x00, - 0x48, 0x56, 0x0E, 0x12, 0x62, 0x0E, 0x18, 0x6E, 0x0E, 0x00, 0x0B, 0x0A, - 0x12, 0x17, 0x00, 0x85, 0x65, 0x74, 0x68, 0x65, 0x72, 0x00, 0x04, 0x11, - 0x00, 0x86, 0x61, 0x6E, 0x6F, 0x74, 0x68, 0x65, 0x72, 0x00, 0x09, 0x00, - 0x83, 0x72, 0x74, 0x68, 0x65, 0x72, 0x00, 0x4B, 0x7E, 0x0E, 0x0F, 0x86, - 0x0E, 0x00, 0x17, 0x2C, 0x00, 0x82, 0x65, 0x69, 0x72, 0x00, 0x13, 0x10, - 0x12, 0x06, 0x00, 0x83, 0x69, 0x6C, 0x65, 0x72, 0x00, 0x17, 0x0C, 0x09, - 0x00, 0x83, 0x6C, 0x74, 0x65, 0x72, 0x00, 0x10, 0x04, 0x15, 0x0A, 0x2C, - 0x00, 0x81, 0x61, 0x72, 0x00, 0x4C, 0xAC, 0x0E, 0x17, 0xB8, 0x0E, 0x00, - 0x0A, 0x0A, 0x08, 0x05, 0x00, 0x84, 0x69, 0x6E, 0x6E, 0x65, 0x72, 0x00, - 0x4C, 0xBF, 0x0E, 0x16, 0xC8, 0x0E, 0x00, 0x12, 0x13, 0x00, 0x83, 0x6E, - 0x74, 0x65, 0x72, 0x00, 0x0C, 0x0F, 0x00, 0x82, 0x65, 0x6E, 0x65, 0x72, - 0x00, 0x09, 0x08, 0x05, 0x00, 0x81, 0x72, 0x65, 0x00, 0x4B, 0xE0, 0x0E, - 0x18, 0xEA, 0x0E, 0x00, 0x12, 0x11, 0x04, 0x00, 0x83, 0x74, 0x68, 0x65, - 0x72, 0x00, 0x13, 0x12, 0x10, 0x06, 0x00, 0x86, 0x6F, 0x6D, 0x70, 0x75, - 0x74, 0x65, 0x72, 0x00, 0x48, 0xFF, 0x0E, 0x1A, 0x0A, 0x0F, 0x00, 0x08, - 0x15, 0x08, 0x0B, 0x1A, 0x00, 0x83, 0x76, 0x65, 0x72, 0x00, 0x12, 0x0B, - 0x00, 0x82, 0x65, 0x76, 0x65, 0x72, 0x00, 0x08, 0x17, 0x12, 0x00, 0x82, - 0x68, 0x65, 0x72, 0x00, 0x04, 0x18, 0x06, 0x0C, 0x17, 0x15, 0x04, 0x13, - 0x00, 0x82, 0x6C, 0x61, 0x72, 0x00, 0x17, 0x04, 0x15, 0x08, 0x17, 0x11, - 0x0C, 0x00, 0x87, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6F, 0x72, 0x00, 0x17, - 0x0F, 0x0F, 0x18, 0x11, 0x00, 0x82, 0x70, 0x74, 0x72, 0x00, 0x04, 0x08, - 0x1C, 0x2C, 0x00, 0x81, 0x72, 0x73, 0x00, 0x12, 0x04, 0x15, 0x08, 0x13, - 0x12, 0x00, 0x82, 0x74, 0x6F, 0x72, 0x00, 0x06, 0x12, 0x2C, 0x00, 0x81, - 0x63, 0x75, 0x72, 0x00, 0x08, 0x19, 0x08, 0x2C, 0x00, 0x81, 0x72, 0x79, - 0x00, 0x44, 0x83, 0x0F, 0x08, 0xB7, 0x0F, 0x0A, 0x47, 0x10, 0x15, 0x52, - 0x10, 0x16, 0x5D, 0x10, 0x17, 0xF5, 0x10, 0x18, 0xFD, 0x10, 0x00, 0x4B, - 0x90, 0x0F, 0x13, 0x9B, 0x0F, 0x15, 0xA5, 0x0F, 0x1C, 0xAE, 0x0F, 0x00, - 0x13, 0x15, 0x08, 0x13, 0x00, 0x83, 0x68, 0x61, 0x70, 0x73, 0x00, 0x0B, - 0x15, 0x08, 0x13, 0x00, 0x82, 0x61, 0x70, 0x73, 0x00, 0x08, 0x1C, 0x2C, - 0x00, 0x82, 0x61, 0x72, 0x73, 0x00, 0x1A, 0x0F, 0x04, 0x00, 0x82, 0x61, - 0x79, 0x73, 0x00, 0x44, 0xC7, 0x0F, 0x06, 0xDE, 0x0F, 0x0C, 0xE9, 0x0F, - 0x0F, 0x35, 0x10, 0x16, 0x3C, 0x10, 0x00, 0x47, 0xCE, 0x0F, 0x0E, 0xD6, - 0x0F, 0x00, 0x0C, 0x2C, 0x00, 0x82, 0x65, 0x61, 0x73, 0x00, 0x17, 0x00, - 0x83, 0x61, 0x6B, 0x65, 0x73, 0x00, 0x08, 0x07, 0x11, 0x0C, 0x00, 0x83, - 0x69, 0x63, 0x65, 0x73, 0x00, 0x46, 0xF3, 0x0F, 0x15, 0x1A, 0x10, 0x17, - 0x29, 0x10, 0x00, 0x48, 0xFA, 0x0F, 0x0C, 0x04, 0x10, 0x00, 0x07, 0x11, - 0x0C, 0x00, 0x84, 0x69, 0x63, 0x65, 0x73, 0x00, 0x47, 0x0B, 0x10, 0x17, - 0x12, 0x10, 0x00, 0x11, 0x0C, 0x00, 0x82, 0x65, 0x73, 0x00, 0x15, 0x08, - 0x19, 0x00, 0x82, 0x65, 0x73, 0x00, 0x12, 0x16, 0x08, 0x06, 0x06, 0x04, - 0x00, 0x84, 0x73, 0x6F, 0x72, 0x69, 0x65, 0x73, 0x00, 0x0F, 0x0C, 0x05, - 0x04, 0x00, 0x83, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x04, 0x09, 0x00, - 0x81, 0x73, 0x65, 0x00, 0x12, 0x0B, 0x06, 0x2C, 0x00, 0x82, 0x6F, 0x73, - 0x65, 0x73, 0x00, 0x0C, 0x11, 0x0B, 0x17, 0x00, 0x83, 0x69, 0x6E, 0x67, - 0x73, 0x00, 0x08, 0x04, 0x1C, 0x2C, 0x00, 0x83, 0x65, 0x61, 0x72, 0x73, - 0x00, 0x44, 0x67, 0x10, 0x08, 0x73, 0x10, 0x12, 0xEA, 0x10, 0x00, 0x15, - 0x04, 0x05, 0x10, 0x08, 0x00, 0x82, 0x72, 0x61, 0x73, 0x73, 0x00, 0x46, - 0x80, 0x10, 0x11, 0x98, 0x10, 0x15, 0xB5, 0x10, 0x16, 0xD2, 0x10, 0x00, - 0x46, 0x87, 0x10, 0x18, 0x90, 0x10, 0x00, 0x12, 0x15, 0x13, 0x00, 0x83, - 0x65, 0x73, 0x73, 0x00, 0x16, 0x00, 0x82, 0x63, 0x65, 0x73, 0x73, 0x00, - 0x4C, 0x9F, 0x10, 0x16, 0xAB, 0x10, 0x00, 0x16, 0x16, 0x18, 0x05, 0x00, - 0x85, 0x69, 0x6E, 0x65, 0x73, 0x73, 0x00, 0x18, 0x05, 0x00, 0x83, 0x69, - 0x6E, 0x65, 0x73, 0x73, 0x00, 0x13, 0x00, 0x55, 0xBE, 0x10, 0x18, 0xC9, - 0x10, 0x00, 0x18, 0x16, 0x00, 0x85, 0x70, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x00, 0x16, 0x00, 0x83, 0x70, 0x72, 0x65, 0x73, 0x73, 0x00, 0x46, 0xD9, - 0x10, 0x12, 0xE2, 0x10, 0x00, 0x06, 0x18, 0x16, 0x00, 0x83, 0x65, 0x73, - 0x73, 0x00, 0x13, 0x00, 0x82, 0x73, 0x65, 0x73, 0x73, 0x00, 0x15, 0x06, - 0x06, 0x04, 0x00, 0x84, 0x72, 0x6F, 0x73, 0x73, 0x00, 0x15, 0x0C, 0x09, - 0x00, 0x81, 0x73, 0x74, 0x00, 0x52, 0x04, 0x11, 0x16, 0x12, 0x11, 0x00, - 0x0F, 0x12, 0x10, 0x12, 0x11, 0x04, 0x00, 0x84, 0x61, 0x6C, 0x6F, 0x75, - 0x73, 0x00, 0x11, 0x08, 0x06, 0x11, 0x12, 0x06, 0x00, 0x85, 0x73, 0x65, - 0x6E, 0x73, 0x75, 0x73, 0x00, 0x44, 0x46, 0x11, 0x08, 0x64, 0x11, 0x0A, - 0x81, 0x11, 0x0B, 0x8B, 0x11, 0x0C, 0xAF, 0x11, 0x0F, 0xBA, 0x11, 0x10, - 0xC5, 0x11, 0x11, 0xD1, 0x11, 0x12, 0x1F, 0x13, 0x13, 0x59, 0x13, 0x16, - 0x75, 0x13, 0x18, 0x15, 0x14, 0x00, 0x55, 0x4D, 0x11, 0x1A, 0x58, 0x11, - 0x00, 0x08, 0x13, 0x08, 0x16, 0x00, 0x83, 0x61, 0x72, 0x61, 0x74, 0x00, - 0x0B, 0x08, 0x10, 0x12, 0x16, 0x00, 0x83, 0x77, 0x68, 0x61, 0x74, 0x00, - 0x44, 0x6B, 0x11, 0x11, 0x74, 0x11, 0x00, 0x15, 0x0A, 0x2C, 0x00, 0x82, - 0x65, 0x61, 0x74, 0x00, 0x10, 0x11, 0x15, 0x08, 0x19, 0x12, 0x0A, 0x00, - 0x82, 0x65, 0x6E, 0x74, 0x00, 0x0B, 0x18, 0x04, 0x06, 0x00, 0x82, 0x67, - 0x68, 0x74, 0x00, 0x47, 0x95, 0x11, 0x0A, 0x9C, 0x11, 0x0C, 0xA4, 0x11, - 0x00, 0x0C, 0x1A, 0x00, 0x81, 0x74, 0x68, 0x00, 0x11, 0x08, 0x0F, 0x00, - 0x81, 0x74, 0x68, 0x00, 0x0A, 0x11, 0x12, 0x17, 0x00, 0x83, 0x69, 0x67, - 0x68, 0x74, 0x00, 0x17, 0x18, 0x12, 0x05, 0x04, 0x00, 0x81, 0x20, 0x69, - 0x74, 0x00, 0x16, 0x18, 0x08, 0x15, 0x00, 0x83, 0x73, 0x75, 0x6C, 0x74, - 0x00, 0x04, 0x17, 0x15, 0x12, 0x13, 0x10, 0x0C, 0x00, 0x81, 0x6E, 0x74, - 0x00, 0x44, 0xDE, 0x11, 0x08, 0x16, 0x12, 0x15, 0x0C, 0x13, 0x16, 0x17, - 0x13, 0x00, 0x4C, 0xEB, 0x11, 0x11, 0xF6, 0x11, 0x15, 0x01, 0x12, 0x17, - 0x0B, 0x12, 0x00, 0x13, 0x0C, 0x06, 0x08, 0x15, 0x00, 0x82, 0x65, 0x6E, - 0x74, 0x00, 0x0C, 0x10, 0x12, 0x15, 0x13, 0x00, 0x82, 0x65, 0x6E, 0x74, - 0x00, 0x04, 0x13, 0x13, 0x04, 0x00, 0x82, 0x65, 0x6E, 0x74, 0x00, 0x08, - 0x13, 0x10, 0x12, 0x06, 0x00, 0x82, 0x65, 0x6E, 0x74, 0x00, 0x4C, 0x23, - 0x12, 0x10, 0x44, 0x12, 0x15, 0xA8, 0x12, 0x19, 0x02, 0x13, 0x00, 0x46, - 0x2A, 0x12, 0x13, 0x37, 0x12, 0x00, 0x08, 0x09, 0x09, 0x08, 0x00, 0x85, - 0x69, 0x63, 0x69, 0x65, 0x6E, 0x74, 0x00, 0x08, 0x06, 0x08, 0x15, 0x00, - 0x85, 0x69, 0x70, 0x69, 0x65, 0x6E, 0x74, 0x00, 0x48, 0x51, 0x12, 0x11, - 0x5D, 0x12, 0x15, 0x7E, 0x12, 0x17, 0x9D, 0x12, 0x00, 0x19, 0x12, 0x0A, - 0x00, 0x83, 0x72, 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x48, 0x64, 0x12, - 0x15, 0x70, 0x12, 0x00, 0x19, 0x12, 0x0A, 0x00, 0x84, 0x72, 0x6E, 0x6D, - 0x65, 0x6E, 0x74, 0x00, 0x12, 0x19, 0x12, 0x0A, 0x00, 0x86, 0x65, 0x72, - 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x48, 0x85, 0x12, 0x12, 0x90, 0x12, - 0x00, 0x19, 0x12, 0x0A, 0x00, 0x83, 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, - 0x19, 0x12, 0x0A, 0x00, 0x85, 0x65, 0x72, 0x6E, 0x6D, 0x65, 0x6E, 0x74, - 0x00, 0x04, 0x17, 0x16, 0x00, 0x83, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x00, - 0x44, 0xB5, 0x12, 0x08, 0xC0, 0x12, 0x09, 0xCC, 0x12, 0x15, 0xD7, 0x12, - 0x00, 0x13, 0x04, 0x00, 0x84, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x00, - 0x09, 0x0C, 0x07, 0x00, 0x84, 0x66, 0x65, 0x72, 0x65, 0x6E, 0x74, 0x00, - 0x09, 0x0C, 0x07, 0x00, 0x83, 0x65, 0x72, 0x65, 0x6E, 0x74, 0x00, 0x44, - 0xDE, 0x12, 0x08, 0xF6, 0x12, 0x00, 0x13, 0x00, 0x44, 0xE7, 0x12, 0x13, - 0xEF, 0x12, 0x00, 0x85, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x00, 0x04, - 0x00, 0x83, 0x65, 0x6E, 0x74, 0x00, 0x09, 0x0C, 0x07, 0x00, 0x85, 0x66, - 0x65, 0x72, 0x65, 0x6E, 0x74, 0x00, 0x08, 0x0F, 0x08, 0x15, 0x00, 0x82, - 0x61, 0x6E, 0x74, 0x00, 0x08, 0x09, 0x09, 0x0C, 0x07, 0x00, 0x81, 0x65, - 0x6E, 0x74, 0x00, 0x12, 0x06, 0x00, 0x82, 0x6E, 0x73, 0x74, 0x00, 0x45, - 0x2F, 0x13, 0x10, 0x36, 0x13, 0x11, 0x3D, 0x13, 0x15, 0x47, 0x13, 0x16, - 0x50, 0x13, 0x00, 0x04, 0x2C, 0x00, 0x80, 0x75, 0x74, 0x00, 0x0F, 0x04, - 0x00, 0x80, 0x73, 0x74, 0x00, 0x07, 0x0C, 0x07, 0x00, 0x82, 0x20, 0x6E, - 0x6F, 0x74, 0x00, 0x13, 0x08, 0x15, 0x00, 0x82, 0x6F, 0x72, 0x74, 0x00, - 0x10, 0x0F, 0x04, 0x00, 0x82, 0x6F, 0x73, 0x74, 0x00, 0x48, 0x60, 0x13, - 0x1C, 0x6B, 0x13, 0x00, 0x0C, 0x06, 0x08, 0x15, 0x00, 0x83, 0x65, 0x69, - 0x70, 0x74, 0x00, 0x06, 0x11, 0x08, 0x00, 0x82, 0x72, 0x79, 0x70, 0x74, - 0x00, 0x48, 0x8B, 0x13, 0x0A, 0xB4, 0x13, 0x0C, 0xBD, 0x13, 0x10, 0xDA, - 0x13, 0x11, 0xE4, 0x13, 0x12, 0xFF, 0x13, 0x18, 0x0A, 0x14, 0x00, 0x4A, - 0x92, 0x13, 0x15, 0xA9, 0x13, 0x00, 0x4C, 0x99, 0x13, 0x18, 0xA1, 0x13, - 0x00, 0x0B, 0x00, 0x82, 0x68, 0x65, 0x73, 0x74, 0x00, 0x16, 0x00, 0x82, - 0x67, 0x65, 0x73, 0x74, 0x00, 0x17, 0x11, 0x0C, 0x00, 0x83, 0x65, 0x72, - 0x65, 0x73, 0x74, 0x00, 0x15, 0x04, 0x0F, 0x00, 0x81, 0x65, 0x73, 0x74, - 0x00, 0x49, 0xC4, 0x13, 0x11, 0xD0, 0x13, 0x00, 0x08, 0x11, 0x04, 0x10, - 0x00, 0x84, 0x69, 0x66, 0x65, 0x73, 0x74, 0x00, 0x04, 0x0A, 0x04, 0x00, - 0x83, 0x69, 0x6E, 0x73, 0x74, 0x00, 0x12, 0x0F, 0x04, 0x00, 0x83, 0x6D, - 0x6F, 0x73, 0x74, 0x00, 0x44, 0xEB, 0x13, 0x11, 0xF6, 0x13, 0x00, 0x0C, - 0x0A, 0x04, 0x00, 0x84, 0x61, 0x69, 0x6E, 0x73, 0x74, 0x00, 0x0C, 0x04, - 0x0A, 0x04, 0x00, 0x82, 0x73, 0x74, 0x00, 0x0F, 0x10, 0x04, 0x00, 0x84, - 0x6C, 0x6D, 0x6F, 0x73, 0x74, 0x00, 0x0D, 0x04, 0x2C, 0x00, 0x83, 0x64, - 0x6A, 0x75, 0x73, 0x74, 0x00, 0x46, 0x1F, 0x14, 0x13, 0x38, 0x14, 0x17, - 0x4F, 0x14, 0x00, 0x48, 0x26, 0x14, 0x15, 0x31, 0x14, 0x00, 0x06, 0x1B, - 0x08, 0x00, 0x84, 0x65, 0x63, 0x75, 0x74, 0x65, 0x00, 0x0C, 0x06, 0x00, - 0x80, 0x69, 0x74, 0x00, 0x57, 0x3F, 0x14, 0x18, 0x47, 0x14, 0x00, 0x11, - 0x0C, 0x00, 0x83, 0x70, 0x75, 0x74, 0x00, 0x12, 0x00, 0x82, 0x74, 0x70, - 0x75, 0x74, 0x00, 0x13, 0x18, 0x12, 0x00, 0x83, 0x74, 0x70, 0x75, 0x74, - 0x00, 0x48, 0x60, 0x14, 0x0C, 0x84, 0x14, 0x00, 0x44, 0x67, 0x14, 0x0C, - 0x6E, 0x14, 0x00, 0x0B, 0x2C, 0x00, 0x81, 0x76, 0x65, 0x00, 0x46, 0x75, - 0x14, 0x08, 0x7D, 0x14, 0x00, 0x08, 0x15, 0x00, 0x82, 0x65, 0x69, 0x76, - 0x00, 0x06, 0x08, 0x15, 0x00, 0x81, 0x76, 0x00, 0x08, 0x0B, 0x06, 0x04, - 0x2C, 0x00, 0x82, 0x69, 0x65, 0x76, 0x65, 0x00, 0x4C, 0x9A, 0x14, 0x11, - 0xA4, 0x14, 0x12, 0xAD, 0x14, 0x00, 0x08, 0x19, 0x08, 0x15, 0x00, 0x82, - 0x69, 0x65, 0x77, 0x00, 0x12, 0x0E, 0x2C, 0x00, 0x82, 0x6E, 0x6F, 0x77, - 0x00, 0x0F, 0x12, 0x09, 0x00, 0x81, 0x6C, 0x6F, 0x77, 0x00, 0x44, 0xD2, - 0x14, 0x06, 0xDD, 0x14, 0x08, 0x18, 0x15, 0x0B, 0x22, 0x15, 0x0F, 0x34, - 0x15, 0x11, 0xF9, 0x15, 0x15, 0x03, 0x16, 0x16, 0xA8, 0x16, 0x17, 0xC3, - 0x16, 0x00, 0x11, 0x13, 0x10, 0x12, 0x06, 0x00, 0x82, 0x61, 0x6E, 0x79, - 0x00, 0x44, 0xEA, 0x14, 0x08, 0xF6, 0x14, 0x0C, 0x01, 0x15, 0x13, 0x0C, - 0x15, 0x00, 0x15, 0x06, 0x12, 0x13, 0x1C, 0x0B, 0x00, 0x82, 0x69, 0x73, - 0x79, 0x00, 0x18, 0x14, 0x08, 0x15, 0x09, 0x00, 0x81, 0x6E, 0x63, 0x79, - 0x00, 0x15, 0x06, 0x12, 0x13, 0x1C, 0x0B, 0x00, 0x81, 0x73, 0x79, 0x00, - 0x18, 0x15, 0x0E, 0x11, 0x04, 0x05, 0x00, 0x81, 0x74, 0x63, 0x79, 0x00, - 0x17, 0x09, 0x04, 0x16, 0x00, 0x82, 0x65, 0x74, 0x79, 0x00, 0x06, 0x15, - 0x04, 0x15, 0x0C, 0x08, 0x0B, 0x00, 0x87, 0x69, 0x65, 0x72, 0x61, 0x72, - 0x63, 0x68, 0x79, 0x00, 0x44, 0x47, 0x15, 0x0B, 0x8A, 0x15, 0x0E, 0x94, - 0x15, 0x0F, 0x9C, 0x15, 0x12, 0xE4, 0x15, 0x15, 0xEE, 0x15, 0x00, 0x45, - 0x5A, 0x15, 0x08, 0x63, 0x15, 0x0F, 0x69, 0x15, 0x11, 0x72, 0x15, 0x15, - 0x79, 0x15, 0x18, 0x82, 0x15, 0x00, 0x12, 0x15, 0x13, 0x00, 0x81, 0x62, - 0x6C, 0x79, 0x00, 0x15, 0x00, 0x80, 0x6C, 0x79, 0x00, 0x08, 0x15, 0x00, - 0x83, 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x0C, 0x09, 0x00, 0x80, 0x6C, 0x79, - 0x00, 0x08, 0x11, 0x08, 0x0A, 0x00, 0x80, 0x6C, 0x79, 0x00, 0x17, 0x06, - 0x04, 0x00, 0x80, 0x6C, 0x79, 0x00, 0x0A, 0x0C, 0x0F, 0x16, 0x00, 0x81, - 0x74, 0x6C, 0x79, 0x00, 0x0C, 0x0F, 0x00, 0x81, 0x65, 0x6C, 0x79, 0x00, - 0x44, 0xA6, 0x15, 0x05, 0xD1, 0x15, 0x08, 0xDA, 0x15, 0x00, 0x56, 0xAD, - 0x15, 0x17, 0xC5, 0x15, 0x00, 0x18, 0x00, 0x6C, 0xB6, 0x15, 0x16, 0xBD, - 0x15, 0x00, 0x83, 0x75, 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x18, 0x00, 0x84, - 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x18, 0x06, 0x04, 0x00, 0x85, 0x74, 0x75, - 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x04, 0x05, 0x12, 0x15, 0x13, 0x00, 0x81, - 0x79, 0x00, 0x04, 0x15, 0x00, 0x84, 0x65, 0x61, 0x6C, 0x6C, 0x79, 0x00, - 0x10, 0x12, 0x11, 0x04, 0x00, 0x82, 0x61, 0x6C, 0x79, 0x00, 0x04, 0x10, - 0x0C, 0x15, 0x13, 0x00, 0x81, 0x69, 0x6C, 0x79, 0x00, 0x08, 0x12, 0x10, - 0x2C, 0x00, 0x82, 0x6E, 0x65, 0x79, 0x00, 0x44, 0x13, 0x16, 0x08, 0x7B, - 0x16, 0x12, 0x84, 0x16, 0x17, 0x91, 0x16, 0x19, 0xA0, 0x16, 0x00, 0x45, - 0x23, 0x16, 0x0C, 0x2C, 0x16, 0x0F, 0x39, 0x16, 0x10, 0x55, 0x16, 0x16, - 0x5E, 0x16, 0x00, 0x0C, 0x0F, 0x00, 0x82, 0x72, 0x61, 0x72, 0x79, 0x00, - 0x0F, 0x0F, 0x0C, 0x1B, 0x18, 0x04, 0x00, 0x84, 0x69, 0x61, 0x72, 0x79, - 0x00, 0x4C, 0x40, 0x16, 0x0F, 0x4A, 0x16, 0x00, 0x1B, 0x18, 0x04, 0x00, - 0x82, 0x69, 0x61, 0x72, 0x79, 0x00, 0x0C, 0x1B, 0x18, 0x04, 0x00, 0x83, - 0x69, 0x61, 0x72, 0x79, 0x00, 0x18, 0x16, 0x00, 0x82, 0x6D, 0x61, 0x72, - 0x79, 0x00, 0x08, 0x06, 0x00, 0x46, 0x68, 0x16, 0x08, 0x73, 0x16, 0x00, - 0x08, 0x11, 0x00, 0x85, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x00, 0x11, - 0x00, 0x82, 0x73, 0x61, 0x72, 0x79, 0x00, 0x13, 0x12, 0x15, 0x13, 0x00, - 0x80, 0x74, 0x79, 0x00, 0x0A, 0x04, 0x17, 0x04, 0x06, 0x00, 0x84, 0x65, - 0x67, 0x6F, 0x72, 0x79, 0x00, 0x11, 0x18, 0x06, 0x12, 0x2C, 0x00, 0x86, - 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x72, 0x79, 0x00, 0x08, 0x2C, 0x00, 0x81, - 0x65, 0x72, 0x79, 0x00, 0x04, 0x00, 0x55, 0xB1, 0x16, 0x1A, 0xBC, 0x16, - 0x00, 0x06, 0x12, 0x13, 0x1C, 0x0B, 0x00, 0x82, 0x69, 0x73, 0x79, 0x00, - 0x0F, 0x04, 0x00, 0x81, 0x79, 0x73, 0x00, 0x49, 0xCD, 0x16, 0x0F, 0xD5, - 0x16, 0x15, 0xDE, 0x16, 0x00, 0x04, 0x16, 0x00, 0x81, 0x65, 0x74, 0x79, - 0x00, 0x0C, 0x05, 0x04, 0x00, 0x81, 0x69, 0x74, 0x79, 0x00, 0x13, 0x08, - 0x12, 0x15, 0x13, 0x00, 0x84, 0x70, 0x65, 0x72, 0x74, 0x79, 0x00}; + 0x00, 0x82, 0x6F, 0x72, 0x64, 0x00, 0x44, 0x01, 0x03, 0x08, 0x0C, 0x03, + 0x00, 0x1A, 0x12, 0x09, 0x00, 0x83, 0x72, 0x77, 0x61, 0x72, 0x64, 0x00, + 0x47, 0x13, 0x03, 0x0C, 0x1D, 0x03, 0x00, 0x0C, 0x16, 0x11, 0x12, 0x06, + 0x00, 0x80, 0x65, 0x64, 0x00, 0x1A, 0x00, 0x83, 0x65, 0x69, 0x72, 0x64, + 0x00, 0x12, 0x00, 0x4B, 0x2E, 0x03, 0x15, 0x34, 0x03, 0x00, 0x16, 0x00, + 0x80, 0x6C, 0x64, 0x00, 0x04, 0x00, 0x80, 0x6E, 0x64, 0x00, 0x44, 0x68, + 0x03, 0x05, 0x75, 0x03, 0x06, 0xA0, 0x03, 0x07, 0x20, 0x04, 0x08, 0x3C, + 0x04, 0x0A, 0x90, 0x04, 0x0B, 0x08, 0x05, 0x0C, 0x59, 0x05, 0x0F, 0x62, + 0x05, 0x11, 0x24, 0x06, 0x15, 0x30, 0x06, 0x16, 0x9A, 0x06, 0x17, 0x1B, + 0x07, 0x18, 0xF6, 0x07, 0x19, 0x2F, 0x08, 0x00, 0x06, 0x13, 0x16, 0x08, + 0x10, 0x04, 0x11, 0x00, 0x82, 0x61, 0x63, 0x65, 0x00, 0x44, 0x7C, 0x03, + 0x0F, 0x86, 0x03, 0x00, 0x0F, 0x0C, 0x04, 0x19, 0x04, 0x00, 0x80, 0x6C, + 0x65, 0x00, 0x44, 0x8D, 0x03, 0x18, 0x98, 0x03, 0x00, 0x0F, 0x0C, 0x04, + 0x19, 0x04, 0x00, 0x82, 0x62, 0x6C, 0x65, 0x00, 0x12, 0x07, 0x00, 0x82, + 0x62, 0x6C, 0x65, 0x00, 0x48, 0xAD, 0x03, 0x0C, 0xB8, 0x03, 0x11, 0xC1, + 0x03, 0x13, 0x13, 0x04, 0x00, 0x15, 0x08, 0x09, 0x08, 0x15, 0x00, 0x81, + 0x6E, 0x63, 0x65, 0x00, 0x08, 0x13, 0x00, 0x83, 0x69, 0x65, 0x63, 0x65, + 0x00, 0x44, 0xCB, 0x03, 0x08, 0xD8, 0x03, 0x18, 0x09, 0x04, 0x00, 0x17, + 0x08, 0x13, 0x10, 0x12, 0x06, 0x00, 0x83, 0x65, 0x6E, 0x63, 0x65, 0x00, + 0x55, 0xDF, 0x03, 0x17, 0xFE, 0x03, 0x00, 0x08, 0x00, 0x49, 0xE8, 0x03, + 0x0F, 0xF5, 0x03, 0x00, 0x15, 0x2C, 0x00, 0x86, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6E, 0x63, 0x65, 0x00, 0x12, 0x17, 0x00, 0x83, 0x61, 0x6E, 0x63, + 0x65, 0x00, 0x11, 0x0C, 0x04, 0x10, 0x00, 0x81, 0x61, 0x6E, 0x63, 0x65, + 0x00, 0x14, 0x08, 0x16, 0x00, 0x82, 0x65, 0x6E, 0x63, 0x65, 0x00, 0x04, + 0x16, 0x08, 0x10, 0x04, 0x11, 0x00, 0x83, 0x70, 0x61, 0x63, 0x65, 0x00, + 0x0C, 0x15, 0x08, 0x19, 0x00, 0x52, 0x2C, 0x04, 0x19, 0x32, 0x04, 0x00, + 0x82, 0x72, 0x69, 0x64, 0x65, 0x00, 0x12, 0x00, 0x85, 0x65, 0x72, 0x72, + 0x69, 0x64, 0x65, 0x00, 0x17, 0x00, 0x44, 0x4B, 0x04, 0x0C, 0x56, 0x04, + 0x11, 0x60, 0x04, 0x17, 0x83, 0x04, 0x00, 0x15, 0x04, 0x18, 0x0A, 0x00, + 0x82, 0x6E, 0x74, 0x65, 0x65, 0x00, 0x10, 0x10, 0x12, 0x06, 0x00, 0x81, + 0x74, 0x65, 0x65, 0x00, 0x04, 0x15, 0x00, 0x44, 0x6A, 0x04, 0x18, 0x76, + 0x04, 0x00, 0x0A, 0x00, 0x86, 0x75, 0x61, 0x72, 0x61, 0x6E, 0x74, 0x65, + 0x65, 0x00, 0x04, 0x0A, 0x00, 0x87, 0x75, 0x61, 0x72, 0x61, 0x6E, 0x74, + 0x65, 0x65, 0x00, 0x0C, 0x10, 0x12, 0x06, 0x00, 0x84, 0x6D, 0x69, 0x74, + 0x74, 0x65, 0x65, 0x00, 0x44, 0x9A, 0x04, 0x07, 0xDD, 0x04, 0x10, 0xFF, + 0x04, 0x00, 0x4A, 0xA7, 0x04, 0x11, 0xB2, 0x04, 0x16, 0xBB, 0x04, 0x18, + 0xC4, 0x04, 0x00, 0x15, 0x12, 0x10, 0x00, 0x83, 0x74, 0x67, 0x61, 0x67, + 0x65, 0x00, 0x0B, 0x06, 0x00, 0x83, 0x61, 0x6E, 0x67, 0x65, 0x00, 0x08, + 0x10, 0x00, 0x82, 0x73, 0x61, 0x67, 0x65, 0x00, 0x0A, 0x00, 0x6C, 0xCD, + 0x04, 0x04, 0xD3, 0x04, 0x00, 0x83, 0x61, 0x75, 0x67, 0x65, 0x00, 0x0F, + 0x00, 0x84, 0x6E, 0x67, 0x75, 0x61, 0x67, 0x65, 0x00, 0x08, 0x0F, 0x00, + 0x44, 0xEA, 0x04, 0x0C, 0xF0, 0x04, 0x0F, 0xF9, 0x04, 0x00, 0x83, 0x6C, + 0x65, 0x67, 0x65, 0x00, 0x19, 0x0C, 0x15, 0x13, 0x00, 0x82, 0x67, 0x65, + 0x00, 0x04, 0x00, 0x82, 0x67, 0x65, 0x00, 0x04, 0x0C, 0x00, 0x83, 0x6D, + 0x61, 0x67, 0x65, 0x00, 0x17, 0x00, 0x47, 0x1A, 0x05, 0x10, 0x24, 0x05, + 0x12, 0x2E, 0x05, 0x16, 0x37, 0x05, 0x17, 0x40, 0x05, 0x00, 0x11, 0x04, + 0x2C, 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, 0x12, 0x15, 0x09, 0x00, + 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, 0x17, 0x2C, 0x00, 0x82, 0x20, 0x74, + 0x68, 0x65, 0x00, 0x04, 0x2C, 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, + 0x44, 0x47, 0x05, 0x18, 0x4F, 0x05, 0x00, 0x2C, 0x00, 0x82, 0x20, 0x74, + 0x68, 0x65, 0x00, 0x12, 0x05, 0x04, 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, + 0x00, 0x1D, 0x16, 0x2C, 0x00, 0x82, 0x69, 0x7A, 0x65, 0x00, 0x45, 0x75, + 0x05, 0x0C, 0xE6, 0x05, 0x13, 0xF1, 0x05, 0x16, 0x0D, 0x06, 0x17, 0x15, + 0x06, 0x19, 0x1D, 0x06, 0x00, 0x44, 0x7F, 0x05, 0x0C, 0xCF, 0x05, 0x0F, + 0xDB, 0x05, 0x00, 0x4A, 0x89, 0x05, 0x0C, 0x93, 0x05, 0x0F, 0xB1, 0x05, + 0x00, 0x0C, 0x0F, 0x08, 0x00, 0x83, 0x69, 0x62, 0x6C, 0x65, 0x00, 0x0F, + 0x00, 0x44, 0x9C, 0x05, 0x0C, 0xA7, 0x05, 0x00, 0x19, 0x04, 0x00, 0x85, + 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x04, 0x19, 0x04, 0x00, 0x84, + 0x61, 0x62, 0x6C, 0x65, 0x00, 0x44, 0xB8, 0x05, 0x0C, 0xC3, 0x05, 0x00, + 0x19, 0x04, 0x00, 0x84, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x19, + 0x04, 0x00, 0x85, 0x61, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x04, + 0x0F, 0x0C, 0x04, 0x19, 0x04, 0x00, 0x83, 0x62, 0x6C, 0x65, 0x00, 0x0C, + 0x04, 0x19, 0x04, 0x00, 0x82, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x1A, 0x0B, + 0x2C, 0x00, 0x84, 0x77, 0x68, 0x69, 0x6C, 0x65, 0x00, 0x48, 0xF8, 0x05, + 0x12, 0x02, 0x06, 0x00, 0x12, 0x13, 0x00, 0x84, 0x65, 0x6F, 0x70, 0x6C, + 0x65, 0x00, 0x08, 0x12, 0x13, 0x00, 0x85, 0x65, 0x6F, 0x70, 0x6C, 0x65, + 0x00, 0x04, 0x09, 0x00, 0x82, 0x6C, 0x73, 0x65, 0x00, 0x0C, 0x0F, 0x00, + 0x81, 0x74, 0x6C, 0x65, 0x00, 0x08, 0x0F, 0x00, 0x81, 0x65, 0x6C, 0x00, + 0x0C, 0x08, 0x0A, 0x1C, 0x0B, 0x00, 0x83, 0x69, 0x65, 0x6E, 0x65, 0x00, + 0x46, 0x40, 0x06, 0x0C, 0x4A, 0x06, 0x12, 0x56, 0x06, 0x15, 0x7D, 0x06, + 0x18, 0x84, 0x06, 0x00, 0x12, 0x16, 0x2C, 0x00, 0x83, 0x63, 0x6F, 0x72, + 0x65, 0x00, 0x18, 0x14, 0x04, 0x00, 0x84, 0x63, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x00, 0x47, 0x60, 0x06, 0x08, 0x69, 0x06, 0x09, 0x71, 0x06, 0x00, + 0x08, 0x05, 0x00, 0x83, 0x66, 0x6F, 0x72, 0x65, 0x00, 0x05, 0x00, 0x82, + 0x66, 0x6F, 0x72, 0x65, 0x00, 0x15, 0x08, 0x0B, 0x17, 0x00, 0x83, 0x65, + 0x66, 0x6F, 0x72, 0x65, 0x00, 0x08, 0x0B, 0x1A, 0x00, 0x81, 0x65, 0x00, + 0x17, 0x00, 0x6C, 0x8D, 0x06, 0x04, 0x92, 0x06, 0x00, 0x82, 0x72, 0x75, + 0x65, 0x00, 0x10, 0x04, 0x00, 0x82, 0x65, 0x75, 0x72, 0x00, 0x44, 0xAD, + 0x06, 0x08, 0xD1, 0x06, 0x0C, 0xD9, 0x06, 0x0F, 0xE8, 0x06, 0x11, 0xF1, + 0x06, 0x18, 0x0F, 0x07, 0x00, 0x46, 0xB7, 0x06, 0x08, 0xBF, 0x06, 0x0F, + 0xC9, 0x06, 0x00, 0x08, 0x05, 0x00, 0x81, 0x75, 0x73, 0x65, 0x00, 0x05, + 0x2C, 0x00, 0x82, 0x63, 0x61, 0x75, 0x73, 0x65, 0x00, 0x09, 0x00, 0x83, + 0x61, 0x6C, 0x73, 0x65, 0x00, 0x08, 0x0B, 0x17, 0x00, 0x82, 0x73, 0x65, + 0x00, 0x06, 0x15, 0x08, 0x06, 0x1B, 0x08, 0x00, 0x86, 0x65, 0x72, 0x63, + 0x69, 0x73, 0x65, 0x00, 0x0C, 0x04, 0x09, 0x00, 0x83, 0x6C, 0x73, 0x65, + 0x00, 0x48, 0xF8, 0x06, 0x12, 0x03, 0x07, 0x00, 0x16, 0x0C, 0x0F, 0x00, + 0x84, 0x63, 0x65, 0x6E, 0x73, 0x65, 0x00, 0x13, 0x08, 0x15, 0x00, 0x84, + 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x00, 0x06, 0x04, 0x08, 0x05, 0x00, + 0x84, 0x63, 0x61, 0x75, 0x73, 0x65, 0x00, 0x44, 0x28, 0x07, 0x08, 0xD6, + 0x07, 0x0F, 0xE1, 0x07, 0x19, 0xED, 0x07, 0x00, 0x47, 0x38, 0x07, 0x0A, + 0x5D, 0x07, 0x0F, 0x6A, 0x07, 0x13, 0xAD, 0x07, 0x15, 0xB7, 0x07, 0x00, + 0x12, 0x10, 0x00, 0x50, 0x42, 0x07, 0x12, 0x51, 0x07, 0x00, 0x12, 0x06, + 0x04, 0x00, 0x87, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x64, 0x61, 0x74, 0x65, + 0x00, 0x06, 0x06, 0x04, 0x00, 0x84, 0x6D, 0x6F, 0x64, 0x61, 0x74, 0x65, + 0x00, 0x12, 0x13, 0x12, 0x15, 0x13, 0x00, 0x84, 0x61, 0x67, 0x61, 0x74, + 0x65, 0x00, 0x46, 0x74, 0x07, 0x13, 0x81, 0x07, 0x18, 0x8E, 0x07, 0x00, + 0x18, 0x0F, 0x04, 0x06, 0x00, 0x85, 0x63, 0x75, 0x6C, 0x61, 0x74, 0x65, + 0x00, 0x10, 0x04, 0x08, 0x17, 0x00, 0x86, 0x6D, 0x70, 0x6C, 0x61, 0x74, + 0x65, 0x00, 0x46, 0x95, 0x07, 0x0F, 0xA2, 0x07, 0x00, 0x18, 0x0F, 0x04, + 0x06, 0x00, 0x86, 0x63, 0x75, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x04, 0x06, + 0x00, 0x84, 0x63, 0x75, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x07, 0x18, 0x00, + 0x84, 0x70, 0x64, 0x61, 0x74, 0x65, 0x00, 0x48, 0xBE, 0x07, 0x18, 0xCB, + 0x07, 0x00, 0x11, 0x04, 0x0A, 0x00, 0x86, 0x65, 0x6E, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x00, 0x06, 0x04, 0x00, 0x84, 0x63, 0x75, 0x72, 0x61, 0x74, + 0x65, 0x00, 0x0F, 0x0F, 0x04, 0x13, 0x00, 0x83, 0x65, 0x74, 0x74, 0x65, + 0x00, 0x04, 0x13, 0x10, 0x08, 0x17, 0x00, 0x83, 0x6C, 0x61, 0x74, 0x65, + 0x00, 0x0C, 0x15, 0x13, 0x00, 0x81, 0x61, 0x74, 0x65, 0x00, 0x4A, 0x00, + 0x08, 0x0C, 0x0C, 0x08, 0x16, 0x16, 0x08, 0x00, 0x08, 0x0F, 0x0F, 0x12, + 0x06, 0x00, 0x82, 0x61, 0x67, 0x75, 0x65, 0x00, 0x14, 0x11, 0x18, 0x00, + 0x83, 0x69, 0x71, 0x75, 0x65, 0x00, 0x44, 0x1D, 0x08, 0x15, 0x25, 0x08, + 0x00, 0x06, 0x2C, 0x00, 0x82, 0x75, 0x73, 0x65, 0x00, 0x08, 0x13, 0x00, + 0x84, 0x75, 0x72, 0x73, 0x75, 0x65, 0x00, 0x4C, 0x36, 0x08, 0x12, 0x5B, + 0x08, 0x00, 0x48, 0x40, 0x08, 0x0B, 0x4A, 0x08, 0x0F, 0x53, 0x08, 0x00, + 0x0F, 0x08, 0x05, 0x00, 0x83, 0x69, 0x65, 0x76, 0x65, 0x00, 0x06, 0x04, + 0x2C, 0x00, 0x81, 0x65, 0x76, 0x65, 0x00, 0x08, 0x05, 0x00, 0x81, 0x65, + 0x76, 0x65, 0x00, 0x52, 0x62, 0x08, 0x19, 0x69, 0x08, 0x00, 0x15, 0x13, + 0x00, 0x82, 0x76, 0x65, 0x00, 0x05, 0x04, 0x00, 0x83, 0x6F, 0x76, 0x65, + 0x00, 0x4C, 0x78, 0x08, 0x11, 0x9A, 0x08, 0x00, 0x08, 0x00, 0x4B, 0x84, + 0x08, 0x0F, 0x8B, 0x08, 0x15, 0x93, 0x08, 0x00, 0x06, 0x00, 0x82, 0x69, + 0x65, 0x66, 0x00, 0x08, 0x05, 0x00, 0x82, 0x69, 0x65, 0x66, 0x00, 0x05, + 0x00, 0x82, 0x69, 0x65, 0x66, 0x00, 0x18, 0x12, 0x09, 0x2C, 0x00, 0x80, + 0x64, 0x00, 0x4C, 0xA9, 0x08, 0x11, 0xB3, 0x08, 0x00, 0x11, 0x12, 0x0A, + 0x2C, 0x00, 0x82, 0x69, 0x6E, 0x67, 0x00, 0x48, 0xBD, 0x08, 0x0C, 0xC6, + 0x08, 0x15, 0x1C, 0x09, 0x00, 0x0C, 0x05, 0x00, 0x83, 0x65, 0x69, 0x6E, + 0x67, 0x00, 0x48, 0xD9, 0x08, 0x0B, 0xE3, 0x08, 0x0F, 0xF0, 0x08, 0x15, + 0xFC, 0x08, 0x17, 0x07, 0x09, 0x1C, 0x11, 0x09, 0x00, 0x0B, 0x06, 0x04, + 0x06, 0x00, 0x83, 0x69, 0x6E, 0x67, 0x00, 0x17, 0x06, 0x04, 0x10, 0x00, + 0x85, 0x74, 0x63, 0x68, 0x69, 0x6E, 0x67, 0x00, 0x08, 0x0C, 0x06, 0x00, + 0x85, 0x65, 0x69, 0x6C, 0x69, 0x6E, 0x67, 0x00, 0x18, 0x06, 0x08, 0x15, + 0x00, 0x82, 0x72, 0x69, 0x6E, 0x67, 0x00, 0x0B, 0x2C, 0x00, 0x84, 0x74, + 0x68, 0x69, 0x6E, 0x67, 0x00, 0x17, 0x1C, 0x11, 0x04, 0x00, 0x83, 0x68, + 0x69, 0x6E, 0x67, 0x00, 0x0C, 0x17, 0x16, 0x00, 0x83, 0x72, 0x69, 0x6E, + 0x67, 0x00, 0x46, 0x36, 0x09, 0x08, 0x56, 0x09, 0x0A, 0x62, 0x09, 0x16, + 0x6C, 0x09, 0x17, 0x7E, 0x09, 0x00, 0x4C, 0x3D, 0x09, 0x15, 0x47, 0x09, + 0x00, 0x17, 0x1A, 0x16, 0x00, 0x83, 0x69, 0x74, 0x63, 0x68, 0x00, 0x04, + 0x08, 0x16, 0x04, 0x08, 0x15, 0x00, 0x86, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x00, 0x17, 0x07, 0x11, 0x04, 0x2C, 0x00, 0x82, 0x20, 0x74, 0x68, + 0x65, 0x00, 0x11, 0x08, 0x15, 0x17, 0x16, 0x00, 0x80, 0x74, 0x68, 0x00, + 0x0C, 0x0F, 0x13, 0x10, 0x12, 0x06, 0x04, 0x00, 0x86, 0x63, 0x6F, 0x6D, + 0x70, 0x6C, 0x69, 0x73, 0x68, 0x00, 0x4A, 0x88, 0x09, 0x0C, 0xA0, 0x09, + 0x15, 0xAB, 0x09, 0x00, 0x48, 0x8F, 0x09, 0x0C, 0x99, 0x09, 0x00, 0x15, + 0x17, 0x16, 0x00, 0x82, 0x6E, 0x67, 0x74, 0x68, 0x00, 0x08, 0x0B, 0x00, + 0x81, 0x68, 0x74, 0x00, 0x1A, 0x07, 0x11, 0x04, 0x05, 0x00, 0x81, 0x64, + 0x74, 0x68, 0x00, 0x18, 0x17, 0x2C, 0x00, 0x83, 0x72, 0x75, 0x74, 0x68, + 0x00, 0x15, 0x08, 0x0B, 0x17, 0x2C, 0x00, 0x81, 0x69, 0x72, 0x00, 0x11, + 0x0C, 0x17, 0x0B, 0x00, 0x84, 0x74, 0x68, 0x69, 0x6E, 0x6B, 0x00, 0x44, + 0xE1, 0x09, 0x07, 0x35, 0x0A, 0x08, 0x59, 0x0A, 0x09, 0xAE, 0x0A, 0x0F, + 0xB7, 0x0A, 0x17, 0xD4, 0x0A, 0x18, 0xDD, 0x0A, 0x00, 0x4C, 0xEB, 0x09, + 0x17, 0xF6, 0x09, 0x18, 0x0F, 0x0A, 0x00, 0x06, 0x13, 0x1C, 0x17, 0x00, + 0x83, 0x69, 0x63, 0x61, 0x6C, 0x00, 0x4C, 0xFD, 0x09, 0x18, 0x05, 0x0A, + 0x00, 0x11, 0x0C, 0x00, 0x81, 0x69, 0x61, 0x6C, 0x00, 0x15, 0x0C, 0x19, + 0x00, 0x83, 0x74, 0x75, 0x61, 0x6C, 0x00, 0x51, 0x19, 0x0A, 0x15, 0x22, + 0x0A, 0x17, 0x2B, 0x0A, 0x00, 0x04, 0x2C, 0x00, 0x82, 0x6E, 0x75, 0x61, + 0x6C, 0x00, 0x18, 0x17, 0x04, 0x11, 0x00, 0x82, 0x61, 0x6C, 0x00, 0x0C, + 0x19, 0x00, 0x83, 0x72, 0x74, 0x75, 0x61, 0x6C, 0x00, 0x48, 0x3C, 0x0A, + 0x18, 0x43, 0x0A, 0x00, 0x0C, 0x09, 0x00, 0x81, 0x6C, 0x64, 0x00, 0x52, + 0x4A, 0x0A, 0x1A, 0x50, 0x0A, 0x00, 0x06, 0x00, 0x81, 0x6C, 0x64, 0x00, + 0x12, 0x00, 0x84, 0x77, 0x6F, 0x75, 0x6C, 0x64, 0x00, 0x4A, 0x66, 0x0A, + 0x0F, 0x6E, 0x0A, 0x17, 0x9C, 0x0A, 0x18, 0xA4, 0x0A, 0x00, 0x11, 0x0C, + 0x16, 0x00, 0x81, 0x6C, 0x65, 0x00, 0x44, 0x75, 0x0A, 0x0F, 0x8F, 0x0A, + 0x00, 0x15, 0x00, 0x44, 0x7E, 0x0A, 0x15, 0x85, 0x0A, 0x00, 0x13, 0x00, + 0x81, 0x6C, 0x65, 0x6C, 0x00, 0x04, 0x13, 0x00, 0x84, 0x61, 0x6C, 0x6C, + 0x65, 0x6C, 0x00, 0x04, 0x15, 0x15, 0x04, 0x13, 0x00, 0x85, 0x61, 0x6C, + 0x6C, 0x65, 0x6C, 0x00, 0x17, 0x0C, 0x0F, 0x00, 0x81, 0x6C, 0x65, 0x00, + 0x07, 0x08, 0x0B, 0x06, 0x16, 0x00, 0x81, 0x6C, 0x65, 0x00, 0x08, 0x16, + 0x1C, 0x10, 0x00, 0x81, 0x6C, 0x66, 0x00, 0x0C, 0x09, 0x00, 0x4F, 0xC1, + 0x0A, 0x18, 0xCB, 0x0A, 0x00, 0x0F, 0x18, 0x09, 0x00, 0x84, 0x66, 0x69, + 0x6C, 0x6C, 0x00, 0x09, 0x00, 0x83, 0x6C, 0x66, 0x69, 0x6C, 0x6C, 0x00, + 0x18, 0x16, 0x08, 0x15, 0x00, 0x81, 0x6C, 0x74, 0x00, 0x09, 0x17, 0x04, + 0x08, 0x15, 0x0A, 0x00, 0x85, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6C, 0x00, + 0x4F, 0xF3, 0x0A, 0x15, 0xFE, 0x0A, 0x00, 0x08, 0x05, 0x12, 0x15, 0x13, + 0x00, 0x82, 0x6C, 0x65, 0x6D, 0x00, 0x12, 0x09, 0x12, 0x06, 0x00, 0x83, + 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x00, 0x44, 0x2C, 0x0B, 0x07, 0x54, 0x0B, + 0x08, 0x5D, 0x0B, 0x0A, 0xCC, 0x0B, 0x0C, 0x1F, 0x0C, 0x12, 0x39, 0x0C, + 0x13, 0xD5, 0x0C, 0x15, 0xE1, 0x0C, 0x16, 0xEC, 0x0C, 0x18, 0xF6, 0x0C, + 0x1A, 0x0D, 0x0D, 0x00, 0x0C, 0x00, 0x4A, 0x35, 0x0B, 0x17, 0x3D, 0x0B, + 0x00, 0x04, 0x2C, 0x00, 0x82, 0x61, 0x69, 0x6E, 0x00, 0x51, 0x44, 0x0B, + 0x15, 0x4C, 0x0B, 0x00, 0x12, 0x06, 0x00, 0x82, 0x61, 0x69, 0x6E, 0x00, + 0x08, 0x06, 0x00, 0x82, 0x61, 0x69, 0x6E, 0x00, 0x18, 0x12, 0x09, 0x2C, + 0x00, 0x81, 0x6E, 0x64, 0x00, 0x47, 0x70, 0x0B, 0x08, 0x7A, 0x0B, 0x13, + 0xA4, 0x0B, 0x15, 0xAD, 0x0B, 0x16, 0xBA, 0x0B, 0x1A, 0xC4, 0x0B, 0x00, + 0x0F, 0x0C, 0x0B, 0x06, 0x00, 0x81, 0x72, 0x65, 0x6E, 0x00, 0x57, 0x81, + 0x0B, 0x1A, 0x9A, 0x0B, 0x00, 0x48, 0x88, 0x0B, 0x1A, 0x90, 0x0B, 0x00, + 0x05, 0x00, 0x82, 0x77, 0x65, 0x65, 0x6E, 0x00, 0x08, 0x05, 0x00, 0x84, + 0x74, 0x77, 0x65, 0x65, 0x6E, 0x00, 0x08, 0x05, 0x00, 0x83, 0x74, 0x77, + 0x65, 0x65, 0x6E, 0x00, 0x04, 0x0B, 0x2C, 0x00, 0x81, 0x70, 0x65, 0x6E, + 0x00, 0x07, 0x0F, 0x0B, 0x06, 0x00, 0x84, 0x69, 0x6C, 0x64, 0x72, 0x65, + 0x6E, 0x00, 0x12, 0x12, 0x0B, 0x06, 0x00, 0x83, 0x73, 0x65, 0x6E, 0x00, + 0x17, 0x08, 0x05, 0x00, 0x80, 0x65, 0x6E, 0x00, 0x48, 0xD3, 0x0B, 0x0C, + 0xDE, 0x0B, 0x00, 0x0C, 0x15, 0x12, 0x09, 0x00, 0x83, 0x65, 0x69, 0x67, + 0x6E, 0x00, 0x4B, 0xF1, 0x0B, 0x0F, 0xF7, 0x0B, 0x11, 0xFF, 0x0B, 0x12, + 0x08, 0x0C, 0x15, 0x0F, 0x0C, 0x16, 0x16, 0x0C, 0x00, 0x17, 0x00, 0x81, + 0x6E, 0x67, 0x00, 0x0F, 0x04, 0x00, 0x83, 0x69, 0x67, 0x6E, 0x00, 0x15, + 0x04, 0x08, 0x0F, 0x00, 0x81, 0x6E, 0x67, 0x00, 0x0A, 0x2C, 0x00, 0x81, + 0x6E, 0x67, 0x00, 0x17, 0x16, 0x00, 0x81, 0x6E, 0x67, 0x00, 0x04, 0x2C, + 0x00, 0x82, 0x73, 0x69, 0x67, 0x6E, 0x00, 0x4A, 0x26, 0x0C, 0x17, 0x2E, + 0x0C, 0x00, 0x04, 0x2C, 0x00, 0x81, 0x61, 0x69, 0x6E, 0x00, 0x04, 0x15, + 0x08, 0x06, 0x00, 0x83, 0x74, 0x61, 0x69, 0x6E, 0x00, 0x4C, 0x43, 0x0C, + 0x16, 0xBF, 0x0C, 0x17, 0xC9, 0x0C, 0x00, 0x46, 0x4D, 0x0C, 0x16, 0x5A, + 0x0C, 0x17, 0x74, 0x0C, 0x00, 0x0C, 0x16, 0x08, 0x07, 0x00, 0x85, 0x63, + 0x69, 0x73, 0x69, 0x6F, 0x6E, 0x00, 0x44, 0x61, 0x0C, 0x16, 0x6A, 0x0C, + 0x00, 0x0C, 0x0F, 0x00, 0x83, 0x69, 0x73, 0x6F, 0x6E, 0x00, 0x04, 0x06, + 0x06, 0x12, 0x00, 0x83, 0x69, 0x6F, 0x6E, 0x00, 0x47, 0x84, 0x0C, 0x0C, + 0x8E, 0x0C, 0x0F, 0x9D, 0x0C, 0x11, 0xA9, 0x0C, 0x16, 0xB5, 0x0C, 0x00, + 0x07, 0x04, 0x00, 0x83, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x17, 0x0C, + 0x13, 0x08, 0x15, 0x00, 0x86, 0x65, 0x74, 0x69, 0x74, 0x69, 0x6F, 0x6E, + 0x00, 0x04, 0x08, 0x15, 0x00, 0x85, 0x6C, 0x61, 0x74, 0x69, 0x6F, 0x6E, + 0x00, 0x06, 0x18, 0x09, 0x00, 0x85, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, + 0x00, 0x12, 0x13, 0x00, 0x83, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x0C, + 0x19, 0x0C, 0x07, 0x00, 0x81, 0x69, 0x6F, 0x6E, 0x00, 0x0C, 0x06, 0x04, + 0x15, 0x09, 0x00, 0x83, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x13, 0x0B, 0x04, + 0x00, 0x84, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6E, 0x00, 0x17, 0x18, 0x08, + 0x15, 0x00, 0x83, 0x74, 0x75, 0x72, 0x6E, 0x00, 0x0A, 0x0C, 0x0B, 0x17, + 0x00, 0x82, 0x6E, 0x67, 0x73, 0x00, 0x55, 0xFD, 0x0C, 0x17, 0x06, 0x0D, + 0x00, 0x17, 0x08, 0x15, 0x00, 0x82, 0x75, 0x72, 0x6E, 0x00, 0x08, 0x15, + 0x00, 0x80, 0x72, 0x6E, 0x00, 0x12, 0x0E, 0x11, 0x18, 0x00, 0x82, 0x6E, + 0x6F, 0x77, 0x6E, 0x00, 0x47, 0x22, 0x0D, 0x11, 0x2D, 0x0D, 0x1A, 0x36, + 0x0D, 0x00, 0x08, 0x18, 0x16, 0x13, 0x00, 0x83, 0x65, 0x75, 0x64, 0x6F, + 0x00, 0x1A, 0x0E, 0x2C, 0x00, 0x82, 0x6E, 0x6F, 0x77, 0x00, 0x4F, 0x3D, + 0x0D, 0x11, 0x45, 0x0D, 0x00, 0x0F, 0x12, 0x09, 0x00, 0x81, 0x6F, 0x77, + 0x00, 0x0E, 0x2C, 0x00, 0x81, 0x6F, 0x77, 0x00, 0x56, 0x53, 0x0D, 0x18, + 0x5D, 0x0D, 0x00, 0x04, 0x0B, 0x15, 0x08, 0x13, 0x00, 0x81, 0x70, 0x73, + 0x00, 0x12, 0x12, 0x0F, 0x00, 0x81, 0x6B, 0x75, 0x70, 0x00, 0x44, 0x82, + 0x0D, 0x08, 0xC3, 0x0D, 0x0B, 0xBC, 0x0E, 0x0F, 0xC5, 0x0E, 0x12, 0xD3, + 0x0E, 0x16, 0xE4, 0x0E, 0x17, 0xED, 0x0E, 0x18, 0xF9, 0x0E, 0x1C, 0x02, + 0x0F, 0x00, 0x4C, 0x8C, 0x0D, 0x0F, 0x96, 0x0D, 0x18, 0xB8, 0x0D, 0x00, + 0x0F, 0x0C, 0x10, 0x0C, 0x16, 0x00, 0x82, 0x61, 0x72, 0x00, 0x4C, 0x9D, + 0x0D, 0x18, 0xA8, 0x0D, 0x00, 0x10, 0x10, 0x0C, 0x16, 0x00, 0x84, 0x69, + 0x6C, 0x61, 0x72, 0x00, 0x06, 0x0C, 0x17, 0x04, 0x13, 0x00, 0x86, 0x72, + 0x74, 0x69, 0x63, 0x75, 0x6C, 0x61, 0x72, 0x00, 0x0F, 0x0A, 0x08, 0x15, + 0x00, 0x83, 0x75, 0x6C, 0x61, 0x72, 0x00, 0x44, 0xE2, 0x0D, 0x07, 0xEA, + 0x0D, 0x0B, 0xF7, 0x0D, 0x0C, 0x34, 0x0E, 0x0F, 0x4E, 0x0E, 0x10, 0x58, + 0x0E, 0x11, 0x62, 0x0E, 0x12, 0x8E, 0x0E, 0x17, 0x96, 0x0E, 0x19, 0xA1, + 0x0E, 0x00, 0x0F, 0x06, 0x00, 0x82, 0x65, 0x61, 0x72, 0x00, 0x11, 0x04, + 0x0F, 0x04, 0x06, 0x00, 0x84, 0x65, 0x6E, 0x64, 0x61, 0x72, 0x00, 0x4A, + 0xFE, 0x0D, 0x17, 0x09, 0x0E, 0x00, 0x0C, 0x08, 0x0B, 0x00, 0x85, 0x69, + 0x67, 0x68, 0x65, 0x72, 0x00, 0x48, 0x13, 0x0E, 0x12, 0x1F, 0x0E, 0x18, + 0x2B, 0x0E, 0x00, 0x0B, 0x0A, 0x12, 0x17, 0x00, 0x85, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x00, 0x04, 0x11, 0x00, 0x86, 0x61, 0x6E, 0x6F, 0x74, 0x68, + 0x65, 0x72, 0x00, 0x09, 0x00, 0x83, 0x72, 0x74, 0x68, 0x65, 0x72, 0x00, + 0x4B, 0x3B, 0x0E, 0x0F, 0x43, 0x0E, 0x00, 0x17, 0x2C, 0x00, 0x82, 0x65, + 0x69, 0x72, 0x00, 0x13, 0x10, 0x12, 0x06, 0x00, 0x83, 0x69, 0x6C, 0x65, + 0x72, 0x00, 0x17, 0x0C, 0x09, 0x00, 0x83, 0x6C, 0x74, 0x65, 0x72, 0x00, + 0x10, 0x04, 0x15, 0x0A, 0x2C, 0x00, 0x81, 0x61, 0x72, 0x00, 0x4C, 0x69, + 0x0E, 0x17, 0x75, 0x0E, 0x00, 0x0A, 0x0A, 0x08, 0x05, 0x00, 0x84, 0x69, + 0x6E, 0x6E, 0x65, 0x72, 0x00, 0x4C, 0x7C, 0x0E, 0x16, 0x85, 0x0E, 0x00, + 0x12, 0x13, 0x00, 0x83, 0x6E, 0x74, 0x65, 0x72, 0x00, 0x0C, 0x0F, 0x00, + 0x82, 0x65, 0x6E, 0x65, 0x72, 0x00, 0x09, 0x08, 0x05, 0x00, 0x81, 0x72, + 0x65, 0x00, 0x0B, 0x12, 0x11, 0x04, 0x00, 0x83, 0x74, 0x68, 0x65, 0x72, + 0x00, 0x48, 0xA8, 0x0E, 0x1A, 0xB3, 0x0E, 0x00, 0x08, 0x15, 0x08, 0x0B, + 0x1A, 0x00, 0x83, 0x76, 0x65, 0x72, 0x00, 0x12, 0x0B, 0x00, 0x82, 0x65, + 0x76, 0x65, 0x72, 0x00, 0x08, 0x17, 0x12, 0x00, 0x82, 0x68, 0x65, 0x72, + 0x00, 0x04, 0x18, 0x06, 0x0C, 0x17, 0x15, 0x04, 0x13, 0x00, 0x82, 0x6C, + 0x61, 0x72, 0x00, 0x17, 0x04, 0x15, 0x08, 0x17, 0x11, 0x0C, 0x00, 0x87, + 0x74, 0x65, 0x72, 0x61, 0x74, 0x6F, 0x72, 0x00, 0x04, 0x08, 0x1C, 0x2C, + 0x00, 0x81, 0x72, 0x73, 0x00, 0x12, 0x04, 0x15, 0x08, 0x13, 0x12, 0x00, + 0x82, 0x74, 0x6F, 0x72, 0x00, 0x06, 0x12, 0x2C, 0x00, 0x81, 0x63, 0x75, + 0x72, 0x00, 0x08, 0x19, 0x08, 0x2C, 0x00, 0x81, 0x72, 0x79, 0x00, 0x44, + 0x21, 0x0F, 0x08, 0x55, 0x0F, 0x0A, 0xE5, 0x0F, 0x15, 0xF0, 0x0F, 0x16, + 0xFB, 0x0F, 0x17, 0x93, 0x10, 0x18, 0x9B, 0x10, 0x00, 0x4B, 0x2E, 0x0F, + 0x13, 0x39, 0x0F, 0x15, 0x43, 0x0F, 0x1C, 0x4C, 0x0F, 0x00, 0x13, 0x15, + 0x08, 0x13, 0x00, 0x83, 0x68, 0x61, 0x70, 0x73, 0x00, 0x0B, 0x15, 0x08, + 0x13, 0x00, 0x82, 0x61, 0x70, 0x73, 0x00, 0x08, 0x1C, 0x2C, 0x00, 0x82, + 0x61, 0x72, 0x73, 0x00, 0x1A, 0x0F, 0x04, 0x00, 0x82, 0x61, 0x79, 0x73, + 0x00, 0x44, 0x65, 0x0F, 0x06, 0x7C, 0x0F, 0x0C, 0x87, 0x0F, 0x0F, 0xD3, + 0x0F, 0x16, 0xDA, 0x0F, 0x00, 0x47, 0x6C, 0x0F, 0x0E, 0x74, 0x0F, 0x00, + 0x0C, 0x2C, 0x00, 0x82, 0x65, 0x61, 0x73, 0x00, 0x17, 0x00, 0x83, 0x61, + 0x6B, 0x65, 0x73, 0x00, 0x08, 0x07, 0x11, 0x0C, 0x00, 0x83, 0x69, 0x63, + 0x65, 0x73, 0x00, 0x46, 0x91, 0x0F, 0x15, 0xB8, 0x0F, 0x17, 0xC7, 0x0F, + 0x00, 0x48, 0x98, 0x0F, 0x0C, 0xA2, 0x0F, 0x00, 0x07, 0x11, 0x0C, 0x00, + 0x84, 0x69, 0x63, 0x65, 0x73, 0x00, 0x47, 0xA9, 0x0F, 0x17, 0xB0, 0x0F, + 0x00, 0x11, 0x0C, 0x00, 0x82, 0x65, 0x73, 0x00, 0x15, 0x08, 0x19, 0x00, + 0x82, 0x65, 0x73, 0x00, 0x12, 0x16, 0x08, 0x06, 0x06, 0x04, 0x00, 0x84, + 0x73, 0x6F, 0x72, 0x69, 0x65, 0x73, 0x00, 0x0F, 0x0C, 0x05, 0x04, 0x00, + 0x83, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x04, 0x09, 0x00, 0x81, 0x73, + 0x65, 0x00, 0x12, 0x0B, 0x06, 0x2C, 0x00, 0x82, 0x6F, 0x73, 0x65, 0x73, + 0x00, 0x0C, 0x11, 0x0B, 0x17, 0x00, 0x83, 0x69, 0x6E, 0x67, 0x73, 0x00, + 0x08, 0x04, 0x1C, 0x2C, 0x00, 0x83, 0x65, 0x61, 0x72, 0x73, 0x00, 0x44, + 0x05, 0x10, 0x08, 0x11, 0x10, 0x12, 0x88, 0x10, 0x00, 0x15, 0x04, 0x05, + 0x10, 0x08, 0x00, 0x82, 0x72, 0x61, 0x73, 0x73, 0x00, 0x46, 0x1E, 0x10, + 0x11, 0x36, 0x10, 0x15, 0x53, 0x10, 0x16, 0x70, 0x10, 0x00, 0x46, 0x25, + 0x10, 0x18, 0x2E, 0x10, 0x00, 0x12, 0x15, 0x13, 0x00, 0x83, 0x65, 0x73, + 0x73, 0x00, 0x16, 0x00, 0x82, 0x63, 0x65, 0x73, 0x73, 0x00, 0x4C, 0x3D, + 0x10, 0x16, 0x49, 0x10, 0x00, 0x16, 0x16, 0x18, 0x05, 0x00, 0x85, 0x69, + 0x6E, 0x65, 0x73, 0x73, 0x00, 0x18, 0x05, 0x00, 0x83, 0x69, 0x6E, 0x65, + 0x73, 0x73, 0x00, 0x13, 0x00, 0x55, 0x5C, 0x10, 0x18, 0x67, 0x10, 0x00, + 0x18, 0x16, 0x00, 0x85, 0x70, 0x70, 0x72, 0x65, 0x73, 0x73, 0x00, 0x16, + 0x00, 0x83, 0x70, 0x72, 0x65, 0x73, 0x73, 0x00, 0x46, 0x77, 0x10, 0x12, + 0x80, 0x10, 0x00, 0x06, 0x18, 0x16, 0x00, 0x83, 0x65, 0x73, 0x73, 0x00, + 0x13, 0x00, 0x82, 0x73, 0x65, 0x73, 0x73, 0x00, 0x15, 0x06, 0x06, 0x04, + 0x00, 0x84, 0x72, 0x6F, 0x73, 0x73, 0x00, 0x15, 0x0C, 0x09, 0x00, 0x81, + 0x73, 0x74, 0x00, 0x52, 0xA2, 0x10, 0x16, 0xB0, 0x10, 0x00, 0x0F, 0x12, + 0x10, 0x12, 0x11, 0x04, 0x00, 0x84, 0x61, 0x6C, 0x6F, 0x75, 0x73, 0x00, + 0x11, 0x08, 0x06, 0x11, 0x12, 0x06, 0x00, 0x85, 0x73, 0x65, 0x6E, 0x73, + 0x75, 0x73, 0x00, 0x44, 0xE4, 0x10, 0x08, 0xF1, 0x10, 0x0A, 0x0E, 0x11, + 0x0B, 0x18, 0x11, 0x0C, 0x3C, 0x11, 0x0F, 0x47, 0x11, 0x10, 0x52, 0x11, + 0x11, 0x5E, 0x11, 0x12, 0xAC, 0x12, 0x13, 0xE6, 0x12, 0x16, 0x02, 0x13, + 0x18, 0xA2, 0x13, 0x00, 0x1A, 0x0B, 0x08, 0x10, 0x12, 0x16, 0x00, 0x83, + 0x77, 0x68, 0x61, 0x74, 0x00, 0x44, 0xF8, 0x10, 0x11, 0x01, 0x11, 0x00, + 0x15, 0x0A, 0x2C, 0x00, 0x82, 0x65, 0x61, 0x74, 0x00, 0x10, 0x11, 0x15, + 0x08, 0x19, 0x12, 0x0A, 0x00, 0x82, 0x65, 0x6E, 0x74, 0x00, 0x0B, 0x18, + 0x04, 0x06, 0x00, 0x82, 0x67, 0x68, 0x74, 0x00, 0x47, 0x22, 0x11, 0x0A, + 0x29, 0x11, 0x0C, 0x31, 0x11, 0x00, 0x0C, 0x1A, 0x00, 0x81, 0x74, 0x68, + 0x00, 0x11, 0x08, 0x0F, 0x00, 0x81, 0x74, 0x68, 0x00, 0x0A, 0x11, 0x12, + 0x17, 0x00, 0x83, 0x69, 0x67, 0x68, 0x74, 0x00, 0x17, 0x18, 0x12, 0x05, + 0x04, 0x00, 0x81, 0x20, 0x69, 0x74, 0x00, 0x16, 0x18, 0x08, 0x15, 0x00, + 0x83, 0x73, 0x75, 0x6C, 0x74, 0x00, 0x04, 0x17, 0x15, 0x12, 0x13, 0x10, + 0x0C, 0x00, 0x81, 0x6E, 0x74, 0x00, 0x44, 0x6B, 0x11, 0x08, 0xA3, 0x11, + 0x15, 0x99, 0x12, 0x16, 0xA4, 0x12, 0x00, 0x4C, 0x78, 0x11, 0x11, 0x83, + 0x11, 0x15, 0x8E, 0x11, 0x17, 0x98, 0x11, 0x00, 0x13, 0x0C, 0x06, 0x08, + 0x15, 0x00, 0x82, 0x65, 0x6E, 0x74, 0x00, 0x0C, 0x10, 0x12, 0x15, 0x13, + 0x00, 0x82, 0x65, 0x6E, 0x74, 0x00, 0x04, 0x13, 0x13, 0x04, 0x00, 0x82, + 0x65, 0x6E, 0x74, 0x00, 0x08, 0x13, 0x10, 0x12, 0x06, 0x00, 0x82, 0x65, + 0x6E, 0x74, 0x00, 0x4C, 0xB0, 0x11, 0x10, 0xD1, 0x11, 0x15, 0x35, 0x12, + 0x19, 0x8F, 0x12, 0x00, 0x46, 0xB7, 0x11, 0x13, 0xC4, 0x11, 0x00, 0x08, + 0x09, 0x09, 0x08, 0x00, 0x85, 0x69, 0x63, 0x69, 0x65, 0x6E, 0x74, 0x00, + 0x08, 0x06, 0x08, 0x15, 0x00, 0x85, 0x69, 0x70, 0x69, 0x65, 0x6E, 0x74, + 0x00, 0x48, 0xDE, 0x11, 0x11, 0xEA, 0x11, 0x15, 0x0B, 0x12, 0x17, 0x2A, + 0x12, 0x00, 0x19, 0x12, 0x0A, 0x00, 0x83, 0x72, 0x6E, 0x6D, 0x65, 0x6E, + 0x74, 0x00, 0x48, 0xF1, 0x11, 0x15, 0xFD, 0x11, 0x00, 0x19, 0x12, 0x0A, + 0x00, 0x84, 0x72, 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x12, 0x19, 0x12, + 0x0A, 0x00, 0x86, 0x65, 0x72, 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x48, + 0x12, 0x12, 0x12, 0x1D, 0x12, 0x00, 0x19, 0x12, 0x0A, 0x00, 0x83, 0x6E, + 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x19, 0x12, 0x0A, 0x00, 0x85, 0x65, 0x72, + 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x04, 0x17, 0x16, 0x00, 0x83, 0x65, + 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x44, 0x42, 0x12, 0x08, 0x4D, 0x12, 0x09, + 0x59, 0x12, 0x15, 0x64, 0x12, 0x00, 0x13, 0x04, 0x00, 0x84, 0x70, 0x61, + 0x72, 0x65, 0x6E, 0x74, 0x00, 0x09, 0x0C, 0x07, 0x00, 0x84, 0x66, 0x65, + 0x72, 0x65, 0x6E, 0x74, 0x00, 0x09, 0x0C, 0x07, 0x00, 0x83, 0x65, 0x72, + 0x65, 0x6E, 0x74, 0x00, 0x44, 0x6B, 0x12, 0x08, 0x83, 0x12, 0x00, 0x13, + 0x00, 0x44, 0x74, 0x12, 0x13, 0x7C, 0x12, 0x00, 0x85, 0x70, 0x61, 0x72, + 0x65, 0x6E, 0x74, 0x00, 0x04, 0x00, 0x83, 0x65, 0x6E, 0x74, 0x00, 0x09, + 0x0C, 0x07, 0x00, 0x85, 0x66, 0x65, 0x72, 0x65, 0x6E, 0x74, 0x00, 0x08, + 0x0F, 0x08, 0x15, 0x00, 0x82, 0x61, 0x6E, 0x74, 0x00, 0x08, 0x09, 0x09, + 0x0C, 0x07, 0x00, 0x81, 0x65, 0x6E, 0x74, 0x00, 0x12, 0x06, 0x00, 0x82, + 0x6E, 0x73, 0x74, 0x00, 0x45, 0xBC, 0x12, 0x10, 0xC3, 0x12, 0x11, 0xCA, + 0x12, 0x15, 0xD4, 0x12, 0x16, 0xDD, 0x12, 0x00, 0x04, 0x2C, 0x00, 0x80, + 0x75, 0x74, 0x00, 0x0F, 0x04, 0x00, 0x80, 0x73, 0x74, 0x00, 0x07, 0x0C, + 0x07, 0x00, 0x82, 0x20, 0x6E, 0x6F, 0x74, 0x00, 0x13, 0x08, 0x15, 0x00, + 0x82, 0x6F, 0x72, 0x74, 0x00, 0x10, 0x0F, 0x04, 0x00, 0x82, 0x6F, 0x73, + 0x74, 0x00, 0x48, 0xED, 0x12, 0x1C, 0xF8, 0x12, 0x00, 0x0C, 0x06, 0x08, + 0x15, 0x00, 0x83, 0x65, 0x69, 0x70, 0x74, 0x00, 0x06, 0x11, 0x08, 0x00, + 0x82, 0x72, 0x79, 0x70, 0x74, 0x00, 0x48, 0x18, 0x13, 0x0A, 0x41, 0x13, + 0x0C, 0x4A, 0x13, 0x10, 0x67, 0x13, 0x11, 0x71, 0x13, 0x12, 0x8C, 0x13, + 0x18, 0x97, 0x13, 0x00, 0x4A, 0x1F, 0x13, 0x15, 0x36, 0x13, 0x00, 0x4C, + 0x26, 0x13, 0x18, 0x2E, 0x13, 0x00, 0x0B, 0x00, 0x82, 0x68, 0x65, 0x73, + 0x74, 0x00, 0x16, 0x00, 0x82, 0x67, 0x65, 0x73, 0x74, 0x00, 0x17, 0x11, + 0x0C, 0x00, 0x83, 0x65, 0x72, 0x65, 0x73, 0x74, 0x00, 0x15, 0x04, 0x0F, + 0x00, 0x81, 0x65, 0x73, 0x74, 0x00, 0x49, 0x51, 0x13, 0x11, 0x5D, 0x13, + 0x00, 0x08, 0x11, 0x04, 0x10, 0x00, 0x84, 0x69, 0x66, 0x65, 0x73, 0x74, + 0x00, 0x04, 0x0A, 0x04, 0x00, 0x83, 0x69, 0x6E, 0x73, 0x74, 0x00, 0x12, + 0x0F, 0x04, 0x00, 0x83, 0x6D, 0x6F, 0x73, 0x74, 0x00, 0x44, 0x78, 0x13, + 0x11, 0x83, 0x13, 0x00, 0x0C, 0x0A, 0x04, 0x00, 0x84, 0x61, 0x69, 0x6E, + 0x73, 0x74, 0x00, 0x0C, 0x04, 0x0A, 0x04, 0x00, 0x82, 0x73, 0x74, 0x00, + 0x0F, 0x10, 0x04, 0x00, 0x84, 0x6C, 0x6D, 0x6F, 0x73, 0x74, 0x00, 0x0D, + 0x04, 0x2C, 0x00, 0x83, 0x64, 0x6A, 0x75, 0x73, 0x74, 0x00, 0x46, 0xAC, + 0x13, 0x13, 0xC5, 0x13, 0x17, 0xDC, 0x13, 0x00, 0x48, 0xB3, 0x13, 0x15, + 0xBE, 0x13, 0x00, 0x06, 0x1B, 0x08, 0x00, 0x84, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x00, 0x0C, 0x06, 0x00, 0x80, 0x69, 0x74, 0x00, 0x57, 0xCC, 0x13, + 0x18, 0xD4, 0x13, 0x00, 0x11, 0x0C, 0x00, 0x83, 0x70, 0x75, 0x74, 0x00, + 0x12, 0x00, 0x82, 0x74, 0x70, 0x75, 0x74, 0x00, 0x13, 0x18, 0x12, 0x00, + 0x83, 0x74, 0x70, 0x75, 0x74, 0x00, 0x48, 0xED, 0x13, 0x0C, 0x11, 0x14, + 0x00, 0x44, 0xF4, 0x13, 0x0C, 0xFB, 0x13, 0x00, 0x0B, 0x2C, 0x00, 0x81, + 0x76, 0x65, 0x00, 0x46, 0x02, 0x14, 0x08, 0x0A, 0x14, 0x00, 0x08, 0x15, + 0x00, 0x82, 0x65, 0x69, 0x76, 0x00, 0x06, 0x08, 0x15, 0x00, 0x81, 0x76, + 0x00, 0x08, 0x0B, 0x06, 0x04, 0x2C, 0x00, 0x82, 0x69, 0x65, 0x76, 0x65, + 0x00, 0x4C, 0x27, 0x14, 0x11, 0x31, 0x14, 0x12, 0x3A, 0x14, 0x00, 0x08, + 0x19, 0x08, 0x15, 0x00, 0x82, 0x69, 0x65, 0x77, 0x00, 0x12, 0x0E, 0x2C, + 0x00, 0x82, 0x6E, 0x6F, 0x77, 0x00, 0x0F, 0x12, 0x09, 0x00, 0x81, 0x6C, + 0x6F, 0x77, 0x00, 0x44, 0x5F, 0x14, 0x06, 0x6A, 0x14, 0x08, 0xA5, 0x14, + 0x0B, 0xAF, 0x14, 0x0F, 0xC1, 0x14, 0x11, 0x86, 0x15, 0x15, 0x90, 0x15, + 0x16, 0x06, 0x16, 0x17, 0x21, 0x16, 0x00, 0x11, 0x13, 0x10, 0x12, 0x06, + 0x00, 0x82, 0x61, 0x6E, 0x79, 0x00, 0x44, 0x77, 0x14, 0x08, 0x83, 0x14, + 0x0C, 0x8E, 0x14, 0x13, 0x99, 0x14, 0x00, 0x15, 0x06, 0x12, 0x13, 0x1C, + 0x0B, 0x00, 0x82, 0x69, 0x73, 0x79, 0x00, 0x18, 0x14, 0x08, 0x15, 0x09, + 0x00, 0x81, 0x6E, 0x63, 0x79, 0x00, 0x15, 0x06, 0x12, 0x13, 0x1C, 0x0B, + 0x00, 0x81, 0x73, 0x79, 0x00, 0x18, 0x15, 0x0E, 0x11, 0x04, 0x05, 0x00, + 0x81, 0x74, 0x63, 0x79, 0x00, 0x17, 0x09, 0x04, 0x16, 0x00, 0x82, 0x65, + 0x74, 0x79, 0x00, 0x06, 0x15, 0x04, 0x15, 0x0C, 0x08, 0x0B, 0x00, 0x87, + 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x00, 0x44, 0xD4, 0x14, + 0x0B, 0x17, 0x15, 0x0E, 0x21, 0x15, 0x0F, 0x29, 0x15, 0x12, 0x71, 0x15, + 0x15, 0x7B, 0x15, 0x00, 0x45, 0xE7, 0x14, 0x08, 0xF0, 0x14, 0x0F, 0xF6, + 0x14, 0x11, 0xFF, 0x14, 0x15, 0x06, 0x15, 0x18, 0x0F, 0x15, 0x00, 0x12, + 0x15, 0x13, 0x00, 0x81, 0x62, 0x6C, 0x79, 0x00, 0x15, 0x00, 0x80, 0x6C, + 0x79, 0x00, 0x08, 0x15, 0x00, 0x83, 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x0C, + 0x09, 0x00, 0x80, 0x6C, 0x79, 0x00, 0x08, 0x11, 0x08, 0x0A, 0x00, 0x80, + 0x6C, 0x79, 0x00, 0x17, 0x06, 0x04, 0x00, 0x80, 0x6C, 0x79, 0x00, 0x0A, + 0x0C, 0x0F, 0x16, 0x00, 0x81, 0x74, 0x6C, 0x79, 0x00, 0x0C, 0x0F, 0x00, + 0x81, 0x65, 0x6C, 0x79, 0x00, 0x44, 0x33, 0x15, 0x05, 0x5E, 0x15, 0x08, + 0x67, 0x15, 0x00, 0x56, 0x3A, 0x15, 0x17, 0x52, 0x15, 0x00, 0x18, 0x00, + 0x6C, 0x43, 0x15, 0x16, 0x4A, 0x15, 0x00, 0x83, 0x75, 0x61, 0x6C, 0x6C, + 0x79, 0x00, 0x18, 0x00, 0x84, 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x18, 0x06, + 0x04, 0x00, 0x85, 0x74, 0x75, 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x04, 0x05, + 0x12, 0x15, 0x13, 0x00, 0x81, 0x79, 0x00, 0x04, 0x15, 0x00, 0x84, 0x65, + 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x10, 0x12, 0x11, 0x04, 0x00, 0x82, 0x61, + 0x6C, 0x79, 0x00, 0x04, 0x10, 0x0C, 0x15, 0x13, 0x00, 0x81, 0x69, 0x6C, + 0x79, 0x00, 0x08, 0x12, 0x10, 0x2C, 0x00, 0x82, 0x6E, 0x65, 0x79, 0x00, + 0x44, 0xA0, 0x15, 0x08, 0xD9, 0x15, 0x12, 0xE2, 0x15, 0x17, 0xEF, 0x15, + 0x19, 0xFE, 0x15, 0x00, 0x45, 0xAA, 0x15, 0x10, 0xB3, 0x15, 0x16, 0xBC, + 0x15, 0x00, 0x0C, 0x0F, 0x00, 0x82, 0x72, 0x61, 0x72, 0x79, 0x00, 0x18, + 0x16, 0x00, 0x82, 0x6D, 0x61, 0x72, 0x79, 0x00, 0x08, 0x06, 0x00, 0x46, + 0xC6, 0x15, 0x08, 0xD1, 0x15, 0x00, 0x08, 0x11, 0x00, 0x85, 0x65, 0x73, + 0x73, 0x61, 0x72, 0x79, 0x00, 0x11, 0x00, 0x82, 0x73, 0x61, 0x72, 0x79, + 0x00, 0x13, 0x12, 0x15, 0x13, 0x00, 0x80, 0x74, 0x79, 0x00, 0x0A, 0x04, + 0x17, 0x04, 0x06, 0x00, 0x84, 0x65, 0x67, 0x6F, 0x72, 0x79, 0x00, 0x11, + 0x18, 0x06, 0x12, 0x2C, 0x00, 0x86, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x72, + 0x79, 0x00, 0x08, 0x2C, 0x00, 0x81, 0x65, 0x72, 0x79, 0x00, 0x04, 0x00, + 0x55, 0x0F, 0x16, 0x1A, 0x1A, 0x16, 0x00, 0x06, 0x12, 0x13, 0x1C, 0x0B, + 0x00, 0x82, 0x69, 0x73, 0x79, 0x00, 0x0F, 0x04, 0x00, 0x81, 0x79, 0x73, + 0x00, 0x49, 0x2B, 0x16, 0x0F, 0x33, 0x16, 0x15, 0x3C, 0x16, 0x00, 0x04, + 0x16, 0x00, 0x81, 0x65, 0x74, 0x79, 0x00, 0x0C, 0x05, 0x04, 0x00, 0x81, + 0x69, 0x74, 0x79, 0x00, 0x13, 0x08, 0x12, 0x15, 0x13, 0x00, 0x84, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x00, +}; diff --git a/jack/autocorrect_dict.txt b/jack/autocorrect_dict.txt index 135bb64..547ad56 100644 --- a/jack/autocorrect_dict.txt +++ b/jack/autocorrect_dict.txt @@ -1,4 +1,4 @@ -# Copyright 2024 [email protected] +# Copyright 2025 [email protected] # SPDX-License-Identifier: GPL-2.0-or-later :theri -> their @@ -120,9 +120,6 @@ aparrent -> apparent apparant -> apparent apparrent -> apparent asthetic -> aesthetic -auxilary -> auxiliary -auxillary -> auxiliary -auxilliary -> auxiliary bankrupcy -> bankruptcy busness -> business bussiness -> business @@ -177,8 +174,6 @@ relevent -> relevant repitition -> repetition safty -> safety saftey -> safety -seperat -> separat -spectogram -> spectrogram symetric -> symmetric tolerence -> tolerance cacheing -> caching @@ -197,7 +192,6 @@ interator -> iterator looup -> lookup namesapce -> namespace namespcae -> namespace -nulltpr -> nullptr operaotr -> operator overide -> override ovveride -> override @@ -237,7 +231,6 @@ fromthe -> from the :aslo: -> also :casue -> cause :choses -> chooses -:gaurd -> guard :haev -> have :hapen -> happen :idaes -> ideas @@ -299,7 +292,6 @@ cheif -> chief cieling -> ceiling circut -> circuit clasic -> classic -cmoputer -> computer coform -> conform comming: -> coming considerd -> considered @@ -330,7 +322,6 @@ greatful -> grateful heigher -> higher higest -> highest howver -> however -hydogen -> hydrogen importamt -> important inclued -> include insted -> instead @@ -388,7 +379,6 @@ supress -> suppress surpress -> suppress thresold -> threshold tongiht -> tonight -tranpose -> transpose typcial -> typical udpate -> update ususally -> usually diff --git a/jack/color.c b/jack/color.c index 4d833f3..9728d99 100644 --- a/jack/color.c +++ b/jack/color.c @@ -1,101 +1,110 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #include "color.h" #include <lib/lib8tion/lib8tion.h> -#define FORCE_REFERENCE(var) __asm__ volatile("" : : "r"(var)) -#define FASTLED_SCALE8_FIXED 1 +#define K255 255 +#define K171 171 +#define K170 170 +#define K85 85 + +// Adapted from https://fastled.io/docs/hsv2rgb_8cpp_source.html +// void hsv2rgb_rainbow() function RGB rgb_matrix_hsv_to_rgb(const HSV hsv) { - const uint8_t Y1 = 1, Y2 = 0, G_2 = 1, Gscale = 0, hue = hsv.h, sat = hsv.s; - uint8_t val = hsv.v, offset = hue & 0x1F, offset8 = offset; - { -#ifdef __AVR__ - offset8 <<= 1; - __asm__ volatile(""); - offset8 <<= 1; - __asm__ volatile(""); - offset8 <<= 1; -#else - offset8 <<= 3; -#endif - } - uint8_t third = scale8(offset8, (256 / 3)), r, g, b; + // Yellow has a higher inherent brightness than + // any other color; 'pure' yellow is perceived to + // be 93% as bright as white. In order to make + // yellow appear the correct relative brightness, + // it has to be rendered brighter than all other + // colors. + const uint8_t hue = hsv.h; + const uint8_t sat = hsv.s; + uint8_t val = hsv.v; + + // offset8 = (hue [0..31]) * 8 + uint8_t offset8 = hue & 0x1F; + offset8 <<= 3; + + uint8_t third = scale8(offset8, (256 / 3)); // max = 85 + uint8_t r, g, b; if (!(hue & 0x80)) { + // 0XX if (!(hue & 0x40)) { + // 00X + // section 0-1 if (!(hue & 0x20)) { - r = 255 - third; + // 000 + // case 0: // R -> O + r = K255 - third; g = third; b = 0; - FORCE_REFERENCE(b); } else { - if (Y1) { - r = 171; - g = 85 + third; - b = 0; - FORCE_REFERENCE(b); - } - if (Y2) { - r = 170 + third; - uint8_t twothirds = scale8(offset8, ((256 * 2) / 3)); - g = 85 + twothirds; - b = 0; - FORCE_REFERENCE(b); - } + // 001 + // case 1: // O -> Y + r = K171; + g = K85 + third; + b = 0; } } else { + // 01X + // section 2-3 if (!(hue & 0x20)) { - if (Y1) { - uint8_t twothirds = scale8(offset8, ((256 * 2) / 3)); - r = 171 - twothirds; - g = 170 + third; - b = 0; - FORCE_REFERENCE(b); - } - if (Y2) { - r = 255 - offset8; - g = 255; - b = 0; - FORCE_REFERENCE(b); - } + // 010 + // case 2: // Y -> G + // uint8_t twothirds = (third << 1); + uint8_t twothirds = scale8(offset8, ((256 * 2) / 3)); // max=170 + r = K171 - twothirds; + g = K170 + third; + b = 0; } else { + // 011 + // case 3: // G -> A r = 0; - FORCE_REFERENCE(r); - g = 255 - third; + g = K255 - third; b = third; } } } else { + // section 4-7 + // 1XX if (!(hue & 0x40)) { + // 10X if (!(hue & 0x20)) { + // 100 + // case 4: // A -> B r = 0; - FORCE_REFERENCE(r); - uint8_t twothirds = scale8(offset8, ((256 * 2) / 3)); - g = 171 - twothirds; - b = 85 + twothirds; + // uint8_t twothirds = (third << 1); + uint8_t twothirds = scale8(offset8, ((256 * 2) / 3)); // max=170 + g = K171 - twothirds; // K170? + b = K85 + twothirds; } else { + // 101 + // case 5: // B -> P r = third; g = 0; - FORCE_REFERENCE(g); - b = 255 - third; + b = K255 - third; } } else { if (!(hue & 0x20)) { - r = 85 + third; + // 110 + // case 6: // P -- K + r = K85 + third; g = 0; - FORCE_REFERENCE(g); - b = 171 - third; + b = K171 - third; } else { - r = 170 + third; + // 111 + // case 7: // K -> R + r = K170 + third; g = 0; - FORCE_REFERENCE(g); - b = 85 - third; + b = K85 - third; } } } - if (G_2) - g = g >> 1; - if (Gscale) - g = scale8_video_LEAVING_R1_DIRTY(g, Gscale); + // This is one of the good places to scale the green down, + // although the client can scale green down as well. + g >>= 1; + // Scale down colors if we're desaturated at all + // and add the brightness_floor to r, g, and b. if (sat != 255) { if (sat == 0) { r = 255; @@ -105,27 +114,26 @@ RGB rgb_matrix_hsv_to_rgb(const HSV hsv) { uint8_t desat = 255 - sat; desat = scale8_video(desat, desat); uint8_t satscale = 255 - desat; - r = scale8_LEAVING_R1_DIRTY(r, satscale); - g = scale8_LEAVING_R1_DIRTY(g, satscale); - b = scale8_LEAVING_R1_DIRTY(b, satscale); - cleanup_R1(); + r = scale8(r, satscale); + g = scale8(g, satscale); + b = scale8(b, satscale); uint8_t brightness_floor = desat; r += brightness_floor; g += brightness_floor; b += brightness_floor; } } + // Now scale everything down if we're at value < 255. if (val != 255) { - val = scale8_video_LEAVING_R1_DIRTY(val, val); + val = scale8_video(val, val); if (val == 0) { r = 0; g = 0; b = 0; } else { - r = scale8_LEAVING_R1_DIRTY(r, val); - g = scale8_LEAVING_R1_DIRTY(g, val); - b = scale8_LEAVING_R1_DIRTY(b, val); - cleanup_R1(); + r = scale8(r, val); + g = scale8(g, val); + b = scale8(b, val); } } return (RGB){.r = r, .g = g, .b = b}; diff --git a/jack/combos.def b/jack/combos.def index 53934f1..e3a44f4 100644 --- a/jack/combos.def +++ b/jack/combos.def @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later // name output keys diff --git a/jack/combos.h b/jack/combos.h deleted file mode 100644 index 27e7a7c..0000000 --- a/jack/combos.h +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2024 [email protected] -// SPDX-License-Identifier: GPL-2.0-or-later -#pragma once - -#define CMB(name, action, ...) name, -enum combos { -#include "combos.def" -}; -#undef CMB - -#define CMB(name, action, ...) \ - uint16_t const name##_combo[] PROGMEM = {__VA_ARGS__, COMBO_END}; -#include "combos.def" -#undef CMB - -#define CMB(name, action, ...) [name] = COMBO(name##_combo, action), -combo_t key_combos[] = { -#include "combos.def" -}; -#undef CMB diff --git a/jack/config.h b/jack/config.h index 2b47028..72347f8 100644 --- a/jack/config.h +++ b/jack/config.h @@ -1,15 +1,17 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #define TAPPING_TERM_PER_KEY #define TAPPING_TERM 140 -#define FORCE_NKRO #define BOTH_SHIFTS_TURNS_ON_CAPS_WORD #define COMBO_TERM 40 #define NO_ACTION_ONESHOT #define UNICODE_SELECTED_MODES UNICODE_MODE_LINUX #define ENABLE_COMPILE_KEYCODE +#define LAYER_STATE_8BIT +#undef LOCKING_SUPPORT_ENABLE +#undef LOCKING_RESYNC_ENABLE #undef MANUFACTURER #define MANUFACTURER "jacks" @@ -33,19 +35,55 @@ #ifdef RGB_MATRIX_ENABLE #define RGB_MATRIX_SLEEP #define RGB_MATRIX_TIMEOUT 300000 -#undef RGB_MATRIX_DEFAULT_MODE -#define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_ALPHAS_MODS -#define ENABLE_RGB_MATRIX_ALPHAS_MODS -#define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT -#define ENABLE_RGB_MATRIX_CYCLE_SPIRAL -#define ENABLE_RGB_MATRIX_RAINDROPS -#define ENABLE_RGB_MATRIX_FRAMEBUFFER_EFFECTS -#define ENABLE_RGB_MATRIX_TYPING_HEATMAP -#define ENABLE_RGB_MATRIX_KEYPRESSES -#define ENABLE_RGB_MATRIX_SOLID_REACTIVE -#define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH -#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS -#define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS #define RGB_MATRIX_KEYPRESSES -#define ENABLE_RGB_MATRIX_SOLID_REACTIVE +#define PALETTEFX_ENABLE_ALL_EFFECTS +#define PALETTEFX_ENABLE_ALL_PALETTES +#undef ENABLE_RGB_MATRIX_ALPHAS_MODS +#undef ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN +#undef ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT +#undef ENABLE_RGB_MATRIX_BREATHING +#undef ENABLE_RGB_MATRIX_BAND_SAT +#undef ENABLE_RGB_MATRIX_BAND_VAL +#undef ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT +#undef ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL +#undef ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT +#undef ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL +#undef ENABLE_RGB_MATRIX_CYCLE_ALL +#undef ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT +#undef ENABLE_RGB_MATRIX_CYCLE_UP_DOWN +#undef ENABLE_RGB_MATRIX_CYCLE_OUT_IN +#undef ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL +#undef ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON +#undef ENABLE_RGB_MATRIX_CYCLE_PINWHEEL +#undef ENABLE_RGB_MATRIX_CYCLE_SPIRAL +#undef ENABLE_RGB_MATRIX_DUAL_BEACON +#undef ENABLE_RGB_MATRIX_RAINBOW_BEACON +#undef ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS +#undef ENABLE_RGB_MATRIX_FLOWER_BLOOMING +#undef ENABLE_RGB_MATRIX_RAINDROPS +#undef ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS +#undef ENABLE_RGB_MATRIX_HUE_BREATHING +#undef ENABLE_RGB_MATRIX_HUE_PENDULUM +#undef ENABLE_RGB_MATRIX_HUE_WAVE +#undef ENABLE_RGB_MATRIX_PIXEL_FRACTAL +#undef ENABLE_RGB_MATRIX_PIXEL_FLOW +#undef ENABLE_RGB_MATRIX_PIXEL_RAIN +#undef ENABLE_RGB_MATRIX_TYPING_HEATMAP +#undef ENABLE_RGB_MATRIX_DIGITAL_RAIN +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS +#undef ENABLE_RGB_MATRIX_SPLASH +#undef ENABLE_RGB_MATRIX_MULTISPLASH +#undef ENABLE_RGB_MATRIX_SOLID_SPLASH +#undef ENABLE_RGB_MATRIX_SOLID_MULTISPLASH +#undef ENABLE_RGB_MATRIX_STARLIGHT +#undef ENABLE_RGB_MATRIX_STARLIGHT_DUAL_HUE +#undef ENABLE_RGB_MATRIX_STARLIGHT_DUAL_SAT +#undef ENABLE_RGB_MATRIX_RIVERFLOW #endif diff --git a/jack/dict.h b/jack/dict.h deleted file mode 100644 index c7a27f4..0000000 --- a/jack/dict.h +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright 2024 [email protected] -// SPDX-License-Identifier: GPL-2.0-or-later -#pragma once - -#define NUM_WORDS 1000 - -const char *dict[NUM_WORDS] = { - "the", "of", "to", "and", "a", - "in", "is", "it", "you", "that", - "he", "was", "for", "on", "are", - "with", "as", "I", "his", "they", - "be", "at", "one", "have", "this", - "from", "or", "had", "by", "not", - "word", "but", "what", "some", "we", - "can", "out", "other", "were", "all", - "there", "when", "up", "use", "your", - "how", "said", "an", "each", "she", - "which", "do", "their", "time", "if", - "will", "way", "about", "many", "then", - "them", "write", "would", "like", "so", - "these", "her", "long", "make", "thing", - "see", "him", "two", "has", "look", - "more", "day", "could", "go", "come", - "did", "number", "sound", "no", "most", - "people", "my", "over", "know", "water", - "than", "call", "first", "who", "may", - "down", "side", "been", "now", "find", - "any", "new", "work", "part", "take", - "get", "place", "made", "live", "where", - "after", "back", "little", "only", "round", - "man", "year", "came", "show", "every", - "good", "me", "give", "our", "under", - "name", "very", "through", "just", "form", - "sentence", "great", "think", "say", "help", - "low", "line", "differ", "turn", "cause", - "much", "mean", "before", "move", "right", - "boy", "old", "too", "same", "tell", - "does", "set", "three", "want", "air", - "well", "also", "play", "small", "end", - "put", "home", "read", "hand", "port", - "large", "spell", "add", "even", "land", - "here", "must", "big", "high", "such", - "follow", "act", "why", "ask", "men", - "change", "went", "light", "kind", "off", - "need", "house", "picture", "try", "us", - "again", "animal", "point", "mother", "world", - "near", "build", "self", "earth", "father", - "head", "stand", "own", "page", "should", - "country", "found", "answer", "school", "grow", - "study", "still", "learn", "plant", "cover", - "food", "sun", "four", "between", "state", - "keep", "eye", "never", "last", "let", - "thought", "city", "tree", "cross", "farm", - "hard", "start", "might", "story", "saw", - "far", "sea", "draw", "left", "late", - "run", "don't", "while", "press", "close", - "night", "real", "life", "few", "north", - "open", "seem", "together", "next", "white", - "children", "begin", "got", "walk", "example", - "ease", "paper", "group", "always", "music", - "those", "both", "mark", "often", "letter", - "until", "mile", "river", "car", "feet", - "care", "second", "book", "carry", "took", - "science", "eat", "room", "friend", "began", - "idea", "fish", "mountain", "stop", "once", - "base", "hear", "horse", "cut", "sure", - "watch", "color", "face", "wood", "main", - "enough", "plain", "girl", "usual", "young", - "ready", "above", "ever", "red", "list", - "though", "feel", "talk", "bird", "soon", - "body", "dog", "family", "direct", "pose", - "leave", "song", "measure", "door", "product", - "black", "short", "numeral", "class", "wind", - "question", "happen", "complete", "ship", "area", - "half", "rock", "order", "fire", "south", - "problem", "piece", "told", "knew", "pass", - "since", "top", "whole", "king", "space", - "heard", "best", "hour", "better", "true", - "during", "hundred", "five", "remember", "step", - "early", "hold", "west", "ground", "interest", - "reach", "fast", "verb", "sing", "listen", - "six", "table", "travel", "less", "morning", - "ten", "simple", "several", "vowel", "toward", - "war", "lay", "against", "pattern", "slow", - "center", "love", "person", "money", "serve", - "appear", "road", "map", "rain", "rule", - "govern", "pull", "cold", "notice", "voice", - "unit", "power", "town", "fine", "certain", - "fly", "fall", "lead", "cry", "dark", - "machine", "note", "wait", "plan", "figure", - "star", "box", "noun", "field", "rest", - "correct", "able", "pound", "done", "beauty", - "drive", "stood", "contain", "front", "teach", - "week", "final", "gave", "green", "oh", - "quick", "develop", "ocean", "warm", "free", - "minute", "strong", "special", "mind", "behind", - "clear", "tail", "produce", "fact", "street", - "inch", "multiply", "nothing", "course", "stay", - "wheel", "full", "force", "blue", "object", - "decide", "surface", "deep", "moon", "island", - "foot", "system", "busy", "test", "record", - "boat", "common", "gold", "possible", "plane", - "stead", "dry", "wonder", "laugh", "thousand", - "ago", "ran", "check", "game", "shape", - "equate", "hot", "miss", "brought", "heat", - "snow", "tire", "bring", "yes", "distant", - "fill", "east", "paint", "language", "among", - "grand", "ball", "yet", "wave", "drop", - "heart", "am", "present", "heavy", "dance", - "engine", "position", "arm", "wide", "sail", - "material", "size", "vary", "settle", "speak", - "weight", "general", "ice", "matter", "circle", - "pair", "include", "divide", "syllable", "felt", - "perhaps", "pick", "sudden", "count", "square", - "reason", "length", "represent", "art", "subject", - "region", "energy", "hunt", "probable", "bed", - "brother", "egg", "ride", "cell", "believe", - "fraction", "forest", "sit", "race", "window", - "store", "summer", "train", "sleep", "prove", - "lone", "leg", "exercise", "wall", "catch", - "mount", "wish", "sky", "board", "joy", - "winter", "sat", "written", "wild", "instrument", - "kept", "glass", "grass", "cow", "job", - "edge", "sign", "visit", "past", "soft", - "fun", "bright", "gas", "weather", "month", - "million", "bear", "finish", "happy", "hope", - "flower", "clothe", "strange", "gone", "jump", - "baby", "eight", "village", "meet", "root", - "buy", "raise", "solve", "metal", "whether", - "push", "seven", "paragraph", "third", "shall", - "held", "hair", "describe", "cook", "floor", - "either", "result", "burn", "hill", "safe", - "cat", "century", "consider", "type", "law", - "bit", "coast", "copy", "phrase", "silent", - "tall", "sand", "soil", "roll", "temperature", - "finger", "industry", "value", "fight", "lie", - "beat", "excite", "natural", "view", "sense", - "ear", "else", "quite", "broke", "case", - "middle", "kill", "son", "lake", "moment", - "scale", "loud", "spring", "observe", "child", - "straight", "consonant", "nation", "dictionary", "milk", - "speed", "method", "organ", "pay", "age", - "section", "dress", "cloud", "surprise", "quiet", - "stone", "tiny", "climb", "cool", "design", - "poor", "lot", "experiment", "bottom", "key", - "iron", "single", "stick", "flat", "twenty", - "skin", "smile", "crease", "hole", "trade", - "melody", "trip", "office", "receive", "row", - "mouth", "exact", "symbol", "die", "least", - "trouble", "shout", "except", "wrote", "seed", - "tone", "join", "suggest", "clean", "break", - "lady", "yard", "rise", "bad", "blow", - "oil", "blood", "touch", "grew", "cent", - "mix", "team", "wire", "cost", "lost", - "brown", "wear", "garden", "equal", "sent", - "choose", "fell", "fit", "flow", "fair", - "bank", "collect", "save", "control", "decimal", - "gentle", "woman", "captain", "practice", "separate", - "difficult", "doctor", "please", "protect", "noon", - "whose", "locate", "ring", "character", "insect", - "caught", "period", "indicate", "radio", "spoke", - "atom", "human", "history", "effect", "electric", - "expect", "crop", "modern", "element", "hit", - "student", "corner", "party", "supply", "bone", - "rail", "imagine", "provide", "agree", "thus", - "capital", "won't", "chair", "danger", "fruit", - "rich", "thick", "soldier", "process", "operate", - "guess", "necessary", "sharp", "wing", "create", - "neighbor", "wash", "bat", "rather", "crowd", - "corn", "compare", "poem", "string", "bell", - "depend", "meat", "rub", "tube", "famous", - "dollar", "stream", "fear", "sight", "thin", - "triangle", "planet", "hurry", "chief", "colony", - "clock", "mine", "tie", "enter", "major", - "fresh", "search", "send", "yellow", "gun", - "allow", "print", "dead", "spot", "desert", - "suit", "current", "lift", "rose", "continue", - "block", "chart", "hat", "sell", "success", - "company", "subtract", "event", "particular", "deal", - "swim", "term", "opposite", "wife", "shoe", - "shoulder", "spread", "arrange", "camp", "invent", - "cotton", "born", "determine", "quart", "nine", - "truck", "noise", "level", "chance", "gather", - "shop", "stretch", "throw", "shine", "property", - "column", "molecule", "select", "wrong", "gray", - "repeat", "require", "broad", "prepare", "salt", - "nose", "plural", "anger", "claim", "continent", - "oxygen", "sugar", "death", "pretty", "skill", - "women", "season", "solution", "magnet", "silver", - "thank", "branch", "match", "suffix", "especially", - "fig", "afraid", "huge", "sister", "steel", - "discuss", "forward", "similar", "guide", "experience", - "score", "apple", "bought", "led", "pitch", - "coat", "mass", "card", "band", "rope", - "slip", "win", "dream", "evening", "condition", - "feed", "tool", "total", "basic", "smell", - "valley", "nor", "double", "seat", "arrive", - "master", "track", "parent", "shore", "division", - "sheet", "substance", "favor", "connect", "post", - "spend", "chord", "fat", "glad", "original", - "share", "station", "dad", "bread", "charge", - "proper", "bar", "offer", "segment", "slave", - "duck", "instant", "market", "degree", "populate", - "chick", "dear", "enemy", "reply", "drink", - "occur", "support", "speech", "nature", "range", - "steam", "motion", "path", "liquid", "log", - "meant", "quotient", "teeth", "shell", "neck"}; diff --git a/jack/introspection.c b/jack/introspection.c new file mode 100644 index 0000000..86f453b --- /dev/null +++ b/jack/introspection.c @@ -0,0 +1,33 @@ +// Copyright 2025 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#include "jack.h" + +#ifdef TAP_DANCE_ENABLE +tap_dance_action_t tap_dance_actions[] = { + [EM_DASH_MINS] = ACTION_TAP_DANCE_FN(em_dash_mins), + [PLY_NXT_PRV] = ACTION_TAP_DANCE_FN(ply_nxt_prv), + [PASTE_RAISE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, raise_paste, td_reset), + [CBRACKET] = ACTION_TAP_DANCE_DOUBLE(KC_LCBR, KC_RCBR), + [SBRACKET] = ACTION_TAP_DANCE_DOUBLE(KC_LBRC, KC_RBRC), +}; +#endif + +#ifdef ENCODER_MAP_ENABLE +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [_BASE] = {{KC_VOLU, KC_VOLD}, {KC_MNXT, KC_MPRV}}, + [_LOWER] = {{XRGB_SAI, XRGB_SAD}, {XRGB_HUI, XRGB_HUD}}, + [_RAISE] = {{C(KC_LEFT), C(KC_RGHT)}, {C(S(KC_TAB)), C(KC_TAB)}}}; +#endif + +#ifdef COMBO_ENABLE +#define CMB(name, action, ...) \ + uint16_t const name##_combo[] PROGMEM = {__VA_ARGS__, COMBO_END}; +#include "combos.def" +#undef CMB + +#define CMB(name, action, ...) [name] = COMBO(name##_combo, action), +combo_t key_combos[] = { +#include "combos.def" +}; +#undef CMB +#endif diff --git a/jack/jack.c b/jack/jack.c index b876fb1..274a011 100644 --- a/jack/jack.c +++ b/jack/jack.c @@ -1,15 +1,6 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #include "jack.h" -#include "combos.h" - -tap_dance_action_t tap_dance_actions[] = { - [EM_DASH_MINS] = ACTION_TAP_DANCE_FN(em_dash_mins), - [PLY_NXT_PRV] = ACTION_TAP_DANCE_FN(ply_nxt_prv), - [PASTE_RAISE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, raise_paste, td_reset), - [CBRACKET] = ACTION_TAP_DANCE_DOUBLE(KC_LCBR, KC_RCBR), - [SBRACKET] = ACTION_TAP_DANCE_DOUBLE(KC_LBRC, KC_RBRC), -}; #if defined(SPLIT_KEYBOARD) && defined(OLED_ENABLE) #include "transactions.h" @@ -21,97 +12,78 @@ void keylogger_sync(uint8_t initiator2target_buffer_size, if (initiator2target_buffer_size == 5) memcpy(&keylog_str, initiator2target_buffer, initiator2target_buffer_size); } +#endif +__attribute__((weak)) void housekeeping_task_keymap(void) {} void housekeeping_task_user(void) { +#if defined(SPLIT_KEYBOARD) && defined(OLED_ENABLE) if (is_keyboard_master()) { static uint32_t last_sync; bool needs_sync = false; static char tmp_keylog[5] = {0}; - if (memcmp(&keylog_str, &tmp_keylog, 5)) { + if (memcmp(&keylog_str, &tmp_keylog, sizeof(tmp_keylog))) { needs_sync = true; - memcpy(&tmp_keylog, &keylog_str, 5); + memcpy(&tmp_keylog, &keylog_str, sizeof(tmp_keylog)); } if (timer_elapsed32(last_sync) > 250) needs_sync = true; - if (needs_sync) { - if (transaction_rpc_send(RPC_ID_USER_KEYLOG_STR, 5, &keylog_str)) + if (needs_sync) + if (transaction_rpc_send(RPC_ID_USER_KEYLOG_STR, sizeof(tmp_keylog), + &keylog_str)) last_sync = timer_read32(); - } } -} #endif + housekeeping_task_keymap(); +} +__attribute__((weak)) void keyboard_post_init_keymap(void) {} void keyboard_post_init_user(void) { #if defined(SPLIT_KEYBOARD) && defined(OLED_ENABLE) transaction_register_rpc(RPC_ID_USER_KEYLOG_STR, keylogger_sync); #endif +#ifdef CUSTOM_TAP_CODE_ENABLE + tap_code_buffer_init(); +#endif #ifdef RGBLIGHT_ENABLE rgblight_enable_noeeprom(); rgblight_sethsv_noeeprom(HSV_CYAN); rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); -#elif RGB_MATRIX_ENABLE +#endif +#ifdef RGB_MATRIX_ENABLE rgb_matrix_enable_noeeprom(); rgb_matrix_sethsv_noeeprom(HSV_CYAN); rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_COLOR); #endif -#ifdef CONSOLE_ENABLE - debug_keyboard = true; - debug_enable = true; - debug_matrix = true; - debug_mouse = true; -#endif #ifdef AUTOCORRECT_ENABLE if (!autocorrect_is_enabled()) autocorrect_enable(); #endif + keyboard_post_init_keymap(); } -bool shutdown_user(bool jump_to_bootloader) { -#ifdef OLED_ENABLE - oled_render_boot(jump_to_bootloader); +void matrix_scan_user(void) { +#ifdef CUSTOM_TAP_CODE_ENABLE + process_tap_code_buffer(); #endif - return true; } -#ifdef ENCODER_MAP_ENABLE -const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [_BASE] = {{KC_VOLU, KC_VOLD}, {KC_MNXT, KC_MPRV}}, - [_LOWER] = {{RGB_SAI, RGB_SAD}, {RGB_HUI, RGB_HUD}}, - [_RAISE] = {{C(KC_LEFT), C(KC_RGHT)}, {C(S(KC_TAB)), C(KC_TAB)}}}; +#ifndef MAGIC_ENABLE +uint16_t keycode_config(uint16_t keycode) { return keycode; } +uint8_t mod_config(uint8_t mod) { return mod; } #endif -#ifdef POINTING_DEVICE_ENABLE -static bool scrolling = false; -layer_state_t layer_state_set_user(layer_state_t state) { - switch (get_highest_layer(state)) { - case _LOWER: - scrolling = true; -#ifdef POINTING_DEVICE_DRIVER_pimoroni_trackball - pimoroni_trackball_set_cpi(0.1); -#else - pointing_device_set_cpi(64); -#endif - break; - default: - if (scrolling) { - scrolling = false; -#ifdef POINTING_DEVICE_DRIVER_pimoroni_trackball - pimoroni_trackball_set_cpi(1); -#else - pointing_device_set_cpi(1024); +#ifdef RP2040_MATH_IN_ROM +typedef void (*init_fn)(void); +extern init_fn __preinit_array_base__; +extern init_fn __preinit_array_end__; #endif - } - } - return state; -} -report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) { - if (scrolling) { - mouse_report.h = mouse_report.x; - mouse_report.v = -mouse_report.y; - mouse_report.x = 0; - mouse_report.y = 0; - } - return mouse_report; -} +__attribute__((weak)) void keyboard_pre_init_keymap(void) {} +void keyboard_pre_init_user(void) { +#ifdef RP2040_MATH_IN_ROM + for (init_fn *func = &__preinit_array_base__; func < &__preinit_array_end__; + func++) + (*func)(); #endif + keyboard_pre_init_keymap(); +} diff --git a/jack/jack.h b/jack/jack.h index 742b6d1..3d3b1c9 100644 --- a/jack/jack.h +++ b/jack/jack.h @@ -1,55 +1,66 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include QMK_KEYBOARD_H -#ifdef OLED_ENABLE -#include "oled.h" -#endif enum layers { _BASE, _LOWER, _RAISE }; enum tapdances { EM_DASH_MINS, PLY_NXT_PRV, PASTE_RAISE, CBRACKET, SBRACKET }; -enum sw_state { NONE, SELECTED, WORD, FIRST_LINE, LINE }; - enum custom_keycodes { UPDIR = QK_USER, - NUKE, - SELWORD, + REMOVE, M_JIGGLE, - TABLE1, - TABLE2, - KC_NOMODE, - KC_WIDE, - KC_SCRIPT, - KC_BLOCKS, - KC_REGIONAL, - KC_AUSSIE, - KC_ZALGO, - KC_SUPER, - RWORD + UC_NOMODE, + UC_WIDE, + UC_SCRIPT, + UC_BLOCKS, + UC_REGIONAL, + UC_AUSSIE, + UC_ZALGO, + UC_SUPER }; -#ifdef UNICODE_COMMON_ENABLE -bool process_record_unicode(uint16_t keycode, keyrecord_t *record); - -enum unicode_mode { - NOMODE, - WIDE, - SCRIPT, - BLOCKS, - REGIONAL, - AUSSIE, - ZALGO, - SUPER +#define CMB(name, action, ...) name, +enum combos { +#include "combos.def" }; -#endif +#undef CMB +bool process_record_unicode(uint16_t keycode, keyrecord_t *record); +bool process_record_taps(uint16_t keycode, keyrecord_t *record); +extern uint8_t extract_mod_bits(uint16_t code); +void tap_code_buffer_init(void); +void tap_code_register(uint8_t code, uint8_t mods, uint16_t delay, + bool register_tap); +void process_tap_code_buffer(void); +void tap_string(const char *str); + +#ifdef TAP_DANCE_ENABLE void td_reset(tap_dance_state_t *state, void *user_data); void em_dash_mins(tap_dance_state_t *state, void *user_data); void ply_nxt_prv(tap_dance_state_t *state, void *user_data); void raise_paste(tap_dance_state_t *state, void *user_data); +#endif + +void oled_timer_reset(void); +void anim_frame(uint16_t size, char const action[][size]); +void wpm_graph(void); +void felix_dog(void); +void layer_anim(void); +void layer_status(void); +void render_mod_status(void); +void add_keylog(uint16_t keycode, keyrecord_t *record); +void render_keylog(void); +void render_wpm(void); +void render_scan_rate(void); + +void keyboard_pre_init_keymap(void); +void keyboard_post_init_keymap(void); +void housekeeping_task_keymap(void); +bool oled_task_keymap(void); +#define KEYLOG_LEN 5 #define PNP TD(PLY_NXT_PRV) #define PSTRSE TD(PASTE_RAISE) #define ESCLWR LT(_LOWER, KC_ESC) @@ -98,16 +109,17 @@ void raise_paste(tap_dance_state_t *state, void *user_data); #define ___LOWER1___ KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0 #define ___LOWER2___ HRML(KC_EXLM, KC_AT, KC_HASH, KC_DLR), KC_PERC, KC_CIRC, HRMR(KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN) -#define ___LOWER3___ KC_VOLD, KC_TAB, KC_CAPS, SELWORD, KC_GRV, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_VOLU -#define ___LOWER4___ _______, _______, _______, _______, NUKE, _______ +#define ___LOWER3___ KC_VOLD, KC_TAB, KC_CAPS, REMOVE, KC_GRV, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_VOLU +#define ___LOWER4___ _______, _______, _______, _______, _______, _______ -#define ___RAISE1___ XRGB_TOG, XRGB_NXT, XRGB_HUI, XRGB_SAI, XRGB_VAI, KC_NOMODE, KC_SCRIPT, KC_BLOCKS, KC_REGIONAL, QK_MAKE -#define ___RAISE2___ M_JIGGLE, XRGB_PRV, XRGB_HUD, XRGB_SAD, XRGB_VAD, KC_WIDE, KC_AUSSIE, KC_ZALGO, KC_SUPER, QK_BOOT -#define ___RAISE3___ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 -#define ___RAISE4___ _______, RWORD, _______, _______, _______, _______ +#define ___RAISE1___ XRGB_TOG, XRGB_NXT, XRGB_HUI, XRGB_SAI, XRGB_VAI, UC_NOMODE, UC_SCRIPT, UC_BLOCKS, UC_REGIONAL, QK_MAKE +#define ___RAISE2___ M_JIGGLE, XRGB_PRV, XRGB_HUD, XRGB_SAD, XRGB_VAD, UC_WIDE, UC_AUSSIE, UC_ZALGO, UC_SUPER, QK_BOOT +#define ___RAISE3___ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 +#define ___RAISE4___ _______, _______, _______, _______, _______, _______ // clang-format on #define LAYOUT_jack_60_ts(...) LAYOUT_60_ansi_tsangan(__VA_ARGS__) #define LAYOUT_jack_3x6(...) LAYOUT_split_3x6_3(__VA_ARGS__) +#define LAYOUT_jack_sp(...) LAYOUT_split_space(__VA_ARGS__) #define LAYOUT_jack_all(...) LAYOUT_all(__VA_ARGS__) #define LAYOUT_jack(...) LAYOUT(__VA_ARGS__) diff --git a/jack/oled.c b/jack/oled.c index 7b975e0..ec52705 100644 --- a/jack/oled.c +++ b/jack/oled.c @@ -1,15 +1,16 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later -#include "oled.h" #include "jack.h" +#include "oled.h" uint32_t oled_timer = 0; char keylog_str[KEYLOG_LEN + 1] = {0}; +extern uint8_t oled_buffer[OLED_MATRIX_SIZE]; +extern OLED_BLOCK_TYPE oled_dirty; void oled_timer_reset(void) { oled_timer = timer_read32(); } __attribute__((weak)) bool oled_task_keymap(void) { return true; } - bool oled_task_user(void) { if (is_keyboard_master()) { if (timer_elapsed32(oled_timer) > 300000) { @@ -220,18 +221,3 @@ void render_scan_rate(void) { oled_write_ln(get_u16_str(get_matrix_scan_rate(), ' '), false); } #endif - -void oled_render_boot(bool jump_to_bootloader) { - oled_clear(); - static const char PROGMEM qmk_logo[16] = {0x80, 0x81, 0x82, 0x83, 0x84, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4}; - oled_write(qmk_logo, false); - oled_set_cursor(0, 4); - oled_write(qmk_logo, false); - oled_set_cursor(0, 8); - oled_write(qmk_logo, false); - oled_set_cursor(0, 12); - oled_write(qmk_logo, false); - oled_render_dirty(true); -} diff --git a/jack/oled.h b/jack/oled.h index 6e33143..b959cc6 100644 --- a/jack/oled.h +++ b/jack/oled.h @@ -1,25 +1,6 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #pragma once -#include "quantum.h" - -#define KEYLOG_LEN 5 -extern uint8_t oled_buffer[OLED_MATRIX_SIZE]; -extern OLED_BLOCK_TYPE oled_dirty; - -void oled_timer_reset(void); -bool oled_task_keymap(void); -void anim_frame(uint16_t size, char const action[][size]); -void wpm_graph(void); -void felix_dog(void); -void layer_anim(void); -void layer_status(void); -void render_mod_status(void); -void add_keylog(uint16_t keycode, keyrecord_t *record); -void render_keylog(void); -void render_wpm(void); -void render_scan_rate(void); -void oled_render_boot(bool jump_to_bootloader); static const char PROGMEM code_to_name[256] = { ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', @@ -43,7 +24,8 @@ static const char PROGMEM code_to_name[256] = { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 'C', 'S', 'A', 'G', 'C', 'S', 'A', 'G', ' ', ' ', ' ', ' ', ' ', 24, 26, 24, 25, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 24, 25, 27, - 26, ' ', ' ', ' '}; + 26, ' ', ' ', ' ', +}; static const char PROGMEM felix_sit[][96] = { { @@ -157,440 +139,444 @@ static const char PROGMEM felix_sneak[][96] = { static const char PROGMEM tap_num[][520] = { { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0x60, 0x9c, 0x03, 0, 0, 0x01, 0x02, 0x04, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x60, 0x9c, 0x03, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x20, 0x11, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, - 0x0e, 0xf0, 0x20, 0xc0, 0x80, 0, 0, 0x80, 0x80, 0xc0, 0x30, 0x0c, + 0x0e, 0xf0, 0x20, 0xc0, 0x80, 0x00, 0x00, 0x80, 0x80, 0xc0, 0x30, 0x0c, 0x02, 0x11, 0x21, 0x40, 0x80, 0x04, 0x06, 0x09, 0x24, 0x24, 0x18, 0x80, - 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0, 0, 0, 0x01, 0x01, 0x01, - 0, 0, 0, 0x80, 0x40, 0x20, 0x20, 0x10, 0x10, 0x8f, 0x48, 0xc4, - 0x84, 0x88, 0x08, 0x10, 0x20, 0x20, 0x40, 0x80, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0, 0, 0x80, + 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x20, 0x10, 0x10, 0x8f, 0x48, 0xc4, + 0x84, 0x88, 0x08, 0x10, 0x20, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x80, 0x80, 0x40, 0xc0, 0x30, 0x08, 0x44, 0x84, 0x02, 0x02, 0x01, 0x01, 0x78, - 0x28, 0x11, 0x21, 0x42, 0x06, 0x05, 0x08, 0x90, 0x60, 0x80, 0, 0, - 0, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0, 0, 0x80, 0x40, 0x40, + 0x28, 0x11, 0x21, 0x42, 0x06, 0x05, 0x08, 0x90, 0x60, 0x80, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x80, 0x40, 0x40, 0x20, 0x20, 0x1f, 0x92, 0x8c, 0x08, 0x18, 0x14, 0x24, 0x7a, 0x46, 0x81, - 0, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x41, 0x44, 0x24, 0x23, 0x10, + 0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x41, 0x44, 0x24, 0x23, 0x10, 0x10, 0x08, 0x88, 0x84, 0x43, 0x5c, 0x20, 0x20, 0x10, 0x10, 0x20, 0x20, - 0x40, 0x80, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0x01, 0x01, 0, 0x18, 0x27, 0x40, 0x80, - 0, 0, 0, 0x01, 0x02, 0x04, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, + 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x18, 0x27, 0x40, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0xc2, 0x21, 0x11, 0x10, 0x08, 0x0b, 0x05, 0x66, 0x42, 0x82, 0x04, 0x04, 0x08, 0x18, 0x14, 0x2c, 0x43, 0x80, 0x04, 0x08, 0x10, 0x20, 0x41, 0x80, 0x80, 0x8f, 0x44, 0x44, 0x20, 0x20, 0x10, 0x10, 0x09, 0x86, 0xb8, 0x40, 0x40, 0x20, 0x20, 0x40, 0x40, 0x80, 0xe0, 0x18, 0x06, 0x01, 0x08, 0x10, - 0x20, 0x40, 0x80, 0, 0, 0, 0x88, 0x80, 0x40, 0x40, 0x20, 0x21, - 0x12, 0x0c, 0x70, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x02, 0x04, 0x08, - 0x10, 0x20, 0x40, 0x40, 0x20, 0x60, 0x9c, 0x03, 0, 0, 0x01, 0x02, + 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x88, 0x80, 0x40, 0x40, 0x20, 0x21, + 0x12, 0x0c, 0x70, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, + 0x10, 0x20, 0x40, 0x40, 0x20, 0x60, 0x9c, 0x03, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x20, 0x11, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x81, 0x8e, 0x70, 0x40, 0x20, 0x20, 0x10, 0x10, 0x08, 0xc8, 0x24, - 0x24, 0x42, 0x82, 0x01, 0x01, 0, 0, 0, 0, 0, 0, 0, - 0, 0x80, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0, 0, 0, 0x01, - 0x01, 0x01, 0, 0, 0, 0, 0x80, 0x80, 0x40, 0x40, 0x20, 0x27, - 0x18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 0x24, 0x42, 0x82, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x20, 0x27, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0x80, 0x70, 0x0c, 0x03, 0, 0x04, 0x08, 0x10, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x70, 0x0c, 0x03, 0x00, 0x04, 0x08, 0x10, 0x20, 0x41, 0x80, 0x80, 0x81, 0x46, 0x40, 0x20, 0x20, 0x10, 0x10, 0x09, 0x86, 0xb8, 0x50, 0x60, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x40, 0xc0, 0x30, 0x08, 0x44, 0x84, 0x02, 0x02, 0x11, 0x19, 0x24, 0x90, 0x91, 0x61, 0x03, - 0x04, 0x04, 0x08, 0x90, 0x60, 0x80, 0, 0, 0, 0x01, 0x01, 0x01, - 0, 0, 0x80, 0x60, 0x10, 0x88, 0x08, 0x04, 0x04, 0x23, 0x12, 0x71, - 0x21, 0x22, 0xc2, 0x04, 0x08, 0x08, 0x10, 0x20, 0xc0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, - 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0, 0, 0, 0, 0, - 0, 0xc0, 0x30, 0x0c, 0x02, 0x11, 0x21, 0x40, 0x80, 0, 0, 0x1e, - 0x0a, 0x04, 0x08, 0x90, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0, 0x01, + 0x04, 0x04, 0x08, 0x90, 0x60, 0x80, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x80, 0x60, 0x10, 0x88, 0x08, 0x04, 0x04, 0x23, 0x12, 0x71, + 0x21, 0x22, 0xc2, 0x04, 0x08, 0x08, 0x10, 0x20, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x30, 0x0c, 0x02, 0x11, 0x21, 0x40, 0x80, 0x00, 0x00, 0x1e, + 0x0a, 0x04, 0x08, 0x90, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0x00, 0x01, 0x02, 0x04, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0xc2, 0x21, 0x11, 0x10, 0x08, 0x0b, 0x45, 0x26, 0x22, 0xc2, 0x04, 0x04, 0x0c, 0x1e, 0x11, 0x20, 0x40, 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x10, 0x11, 0x09, 0x08, 0x04, 0x04, 0x02, 0x82, 0x81, 0x40, 0x47, 0x38, 0x20, 0x10, 0x10, 0x20, 0x20, - 0x40, 0x80, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0x01, 0x02, 0x04, 0x04, 0x02, 0x06, 0x09, 0x10, 0x20, - 0x40, 0x80, 0, 0, 0, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0, + 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x02, 0x06, 0x09, 0x10, 0x20, + 0x40, 0x80, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, 0xc0, 0x20, 0x10, 0x10, 0x08, 0x08, 0x07, 0x64, 0x42, 0x82, 0x04, 0x04, 0x08, 0x10, 0x1c, 0x23, 0x40, 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x23, 0x11, 0x11, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, 0x0e, 0xf0, 0x20, 0xc0, 0x80, 0x80, 0x40, 0x40, 0xe0, 0x18, 0x06, 0x01, 0x08, 0x10, - 0x20, 0x40, 0x80, 0, 0, 0, 0x88, 0x80, 0x40, 0x40, 0x20, 0x21, - 0x12, 0x0c, 0x70, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x02, - 0x04, 0x08, 0x10, 0x10, 0x08, 0x68, 0x9c, 0x03, 0, 0, 0x01, 0x02, + 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x88, 0x80, 0x40, 0x40, 0x20, 0x21, + 0x12, 0x0c, 0x70, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x04, 0x08, 0x10, 0x10, 0x08, 0x68, 0x9c, 0x03, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x20, 0x11, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, 0x0e, 0xf0, 0x20, 0xc0, 0x80, 0x40, 0x40, 0xa0, 0xa0, 0xd0, - 0x90, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0, 0, 0x01, - 0x01, 0x03, 0x04, 0x04, 0x08, 0x90, 0x60, 0x80, 0, 0, 0, 0x01, - 0x01, 0x01, 0, 0, 0, 0, 0x80, 0x80, 0x40, 0x40, 0x20, 0x27, - 0x18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 0x90, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x01, 0x03, 0x04, 0x04, 0x08, 0x90, 0x60, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x20, 0x27, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0x60, 0x9c, 0x03, 0, 0, 0x01, 0x02, 0x04, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x60, 0x9c, 0x03, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x20, 0x11, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x81, - 0x8e, 0x70, 0x40, 0x20, 0x20, 0x40, 0x40, 0x80, 0, 0xc0, 0x30, 0x0c, + 0x8e, 0x70, 0x40, 0x20, 0x20, 0x40, 0x40, 0x80, 0x00, 0xc0, 0x30, 0x0c, 0x02, 0x11, 0x21, 0x40, 0x80, 0x04, 0x06, 0x09, 0x24, 0x24, 0x18, 0x80, - 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0, 0x01, 0x02, 0x04, 0x04, 0x04, + 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0x00, 0x01, 0x02, 0x04, 0x04, 0x04, 0x02, 0x02, 0x81, 0x61, 0x10, 0x88, 0x08, 0x04, 0x05, 0x22, 0x12, 0x71, - 0x21, 0x22, 0xc2, 0x04, 0x08, 0x08, 0x10, 0x20, 0xc0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0, 0, 0x80, - 0x80, 0xc0, 0x30, 0x0c, 0x02, 0x11, 0x21, 0x40, 0x80, 0, 0, 0x1e, - 0x0a, 0x04, 0x08, 0x90, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0, 0, - 0, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0, 0xc0, 0x20, 0x10, 0x10, + 0x21, 0x22, 0xc2, 0x04, 0x08, 0x08, 0x10, 0x20, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x80, + 0x80, 0xc0, 0x30, 0x0c, 0x02, 0x11, 0x21, 0x40, 0x80, 0x00, 0x00, 0x1e, + 0x0a, 0x04, 0x08, 0x90, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, 0xc0, 0x20, 0x10, 0x10, 0x08, 0x08, 0x47, 0x24, 0x22, 0xc2, 0x04, 0x04, 0x08, 0x1e, 0x11, 0x20, 0x40, 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x10, 0x11, 0x09, 0x08, 0x04, - 0x04, 0x02, 0x02, 0x01, 0, 0x07, 0xf8, 0x80, 0x40, 0x40, 0x80, 0x80, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0x01, 0x01, 0, 0x06, 0x09, 0x10, 0x20, - 0x40, 0x80, 0, 0, 0, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0, - 0, 0x80, 0x40, 0x40, 0x20, 0x20, 0x1f, 0x92, 0x0c, 0x08, 0x10, 0x10, - 0x28, 0x68, 0x5c, 0x83, 0, 0, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, + 0x04, 0x02, 0x02, 0x01, 0x00, 0x07, 0xf8, 0x80, 0x40, 0x40, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x06, 0x09, 0x10, 0x20, + 0x40, 0x80, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, + 0x00, 0x80, 0x40, 0x40, 0x20, 0x20, 0x1f, 0x92, 0x0c, 0x08, 0x10, 0x10, + 0x28, 0x68, 0x5c, 0x83, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x23, 0x11, 0x11, 0x08, 0x08, 0x04, 0x04, 0x02, 0x81, 0x8e, 0x70, 0x60, 0x20, 0x20, 0x40, 0x40, 0xc0, 0xa0, 0x60, 0x18, 0x04, 0x22, 0x42, - 0x81, 0x01, 0, 0, 0, 0, 0x20, 0, 0x01, 0x02, 0x82, 0x84, - 0x48, 0x30, 0xc0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x02, - 0x04, 0x08, 0x10, 0x10, 0x08, 0x88, 0x74, 0x0c, 0x03, 0, 0x04, 0x08, + 0x81, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x02, 0x82, 0x84, + 0x48, 0x30, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x04, 0x08, 0x10, 0x10, 0x08, 0x88, 0x74, 0x0c, 0x03, 0x00, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x81, 0x82, 0x44, 0x40, 0x20, 0x20, 0x10, 0x10, 0x09, 0x86, 0xb8, 0x50, 0x60, 0x20, 0x20, 0x10, 0x10, 0x08, 0xc8, 0x24, - 0x24, 0x42, 0x82, 0x01, 0x01, 0, 0, 0, 0, 0, 0, 0, - 0, 0x80, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0, 0x01, 0x02, 0x04, - 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0, 0, 0, 0, 0x81, 0x9e, - 0x60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 0x24, 0x42, 0x82, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0x00, 0x01, 0x02, 0x04, + 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x81, 0x9e, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}; static const char PROGMEM tap_sym[][650] = { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0x80, 0x40, - 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, - 0x08, 0x0c, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x04, 0x04, 0x04, 0x04, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x20, 0x50, 0x40, 0x80, - 0, 0, 0, 0, 0x1c, 0x22, 0x21, 0x21, 0x22, 0x2c, 0x30, 0xd0, - 0x10, 0x11, 0x21, 0x20, 0x40, 0x80, 0x80, 0, 0, 0, 0, 0, - 0x20, 0x20, 0x21, 0x12, 0x1c, 0xf0, 0x10, 0x18, 0x08, 0x08, 0, 0, - 0x01, 0x01, 0x02, 0x04, 0x08, 0x30, 0xc0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0x80, 0xc0, 0xc0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xc0, 0x20, 0x10, - 0x08, 0x04, 0x02, 0x81, 0x01, 0, 0, 0x40, 0x80, 0, 0x80, 0, - 0, 0, 0, 0x18, 0x24, 0x24, 0x24, 0x18, 0, 0xc0, 0x30, 0x0e, - 0x80, 0x40, 0x40, 0x80, 0, 0, 0, 0, 0xc0, 0x20, 0x20, 0x20, - 0x40, 0x40, 0x40, 0x20, 0x18, 0, 0, 0, 0x01, 0x82, 0x44, 0x78, - 0x40, 0x20, 0x10, 0x10, 0x08, 0x08, 0x08, 0x07, 0x04, 0x04, 0x02, 0x02, - 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x81, 0x81, 0x81, 0x82, 0x02, 0x02, 0x02, 0x04, - 0x04, 0x08, 0x0b, 0x10, 0x10, 0x20, 0x60, 0x20, 0x30, 0x18, 0x0c, 0x04, - 0x03, 0x01, 0, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0xfe, 0x01, 0, 0, 0, 0x08, 0x88, 0x85, - 0x4e, 0x74, 0xe2, 0x21, 0x21, 0x17, 0x18, 0x68, 0xc4, 0, 0, 0, - 0, 0, 0, 0x18, 0x07, 0, 0, 0, 0x03, 0x04, 0x04, 0x04, - 0x03, 0, 0, 0, 0x01, 0, 0, 0, 0, 0, 0, 0xc0, - 0x20, 0x10, 0x0c, 0x02, 0x01, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0xc0, 0x60, 0x30, 0x10, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x10, 0x30, 0x40, 0x80, 0, 0x0e, 0x03, 0x01, - 0x01, 0, 0xe0, 0x30, 0x19, 0x07, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xc0, 0x3f, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0x03, 0x04, 0x08, 0x10, 0x20, 0x20, 0xc0, 0, 0, 0, 0x01, - 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, - 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x10, - 0x10, 0x10, 0x10, 0x08, 0x08, 0x34, 0xcf, 0, 0, 0, 0, 0, - 0x3e, 0x63, 0xc1, 0xc1, 0xbe, 0x80, 0, 0, 0, 0, 0, 0, - 0x80, 0, 0, 0x1f, 0x20, 0x40, 0xc0, 0x8e, 0x11, 0x19, 0x0e, 0x03, - 0x86, 0x84, 0xc6, 0x63, 0, 0, 0, 0, 0, 0, 0x01, 0x06, - 0, 0, 0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0xc0, 0x20, 0x18, 0x07, 0x01, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0x03, 0, 0x02, 0x02, 0x01, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0x01, 0, 0, 0, 0, 0, 0, 0, 0x03, 0, - 0, 0, 0x01, 0x03, 0, 0, 0, 0, 0x03, 0, 0, 0, - 0, 0, 0, 0, 0x01, 0x01, 0x01, 0x01, 0x01, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x01, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0}, { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, + 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, + 0x08, 0x0c, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x04, 0x04, 0x04, 0x04, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x20, 0x50, 0x40, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x22, 0x21, 0x21, 0x22, 0x2c, 0x30, 0xd0, + 0x10, 0x11, 0x21, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x20, 0x21, 0x12, 0x1c, 0xf0, 0x10, 0x18, 0x08, 0x08, 0x00, 0x00, + 0x01, 0x01, 0x02, 0x04, 0x08, 0x30, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x20, 0x10, + 0x08, 0x04, 0x02, 0x81, 0x01, 0x00, 0x00, 0x40, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x24, 0x24, 0x24, 0x18, 0x00, 0xc0, 0x30, 0x0e, + 0x80, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x20, 0x20, 0x20, + 0x40, 0x40, 0x40, 0x20, 0x18, 0x00, 0x00, 0x00, 0x01, 0x82, 0x44, 0x78, + 0x40, 0x20, 0x10, 0x10, 0x08, 0x08, 0x08, 0x07, 0x04, 0x04, 0x02, 0x02, + 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x81, 0x81, 0x81, 0x82, 0x02, 0x02, 0x02, 0x04, + 0x04, 0x08, 0x0b, 0x10, 0x10, 0x20, 0x60, 0x20, 0x30, 0x18, 0x0c, 0x04, + 0x03, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x08, 0x88, 0x85, + 0x4e, 0x74, 0xe2, 0x21, 0x21, 0x17, 0x18, 0x68, 0xc4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x07, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, + 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x20, 0x10, 0x0c, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x60, 0x30, 0x10, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x10, 0x30, 0x40, 0x80, 0x00, 0x0e, 0x03, 0x01, + 0x01, 0x00, 0xe0, 0x30, 0x19, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x04, 0x08, 0x10, 0x20, 0x20, 0xc0, 0x00, 0x00, 0x00, 0x01, + 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x10, + 0x10, 0x10, 0x10, 0x08, 0x08, 0x34, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3e, 0x63, 0xc1, 0xc1, 0xbe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x1f, 0x20, 0x40, 0xc0, 0x8e, 0x11, 0x19, 0x0e, 0x03, + 0x86, 0x84, 0xc6, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x20, 0x18, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + }, + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x18, 0x14, 0x14, 0x12, 0x12, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x60, 0x80, 0x80, 0x80, 0, 0, - 0, 0x1c, 0x22, 0x21, 0x21, 0x22, 0x2c, 0x30, 0x50, 0x90, 0x11, 0x11, - 0x20, 0x20, 0x40, 0xc0, 0, 0, 0, 0, 0, 0x10, 0x10, 0x10, - 0x09, 0x0e, 0x78, 0x88, 0x04, 0x04, 0x04, 0, 0, 0, 0, 0, - 0x01, 0x02, 0x0c, 0xf0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xc0, 0x20, 0x10, - 0x08, 0x08, 0x04, 0x82, 0x01, 0x01, 0, 0x40, 0x80, 0, 0x80, 0x80, - 0, 0, 0, 0x30, 0x48, 0x48, 0x48, 0x30, 0, 0x80, 0x60, 0x18, - 0x04, 0x80, 0x80, 0, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, - 0x80, 0, 0, 0x80, 0xe0, 0x01, 0x01, 0x02, 0x06, 0x08, 0x10, 0xe0, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x60, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x1c, 0x22, 0x21, 0x21, 0x22, 0x2c, 0x30, 0x50, 0x90, 0x11, 0x11, + 0x20, 0x20, 0x40, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, + 0x09, 0x0e, 0x78, 0x88, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x0c, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x20, 0x10, + 0x08, 0x08, 0x04, 0x82, 0x01, 0x01, 0x00, 0x40, 0x80, 0x00, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x30, 0x48, 0x48, 0x48, 0x30, 0x00, 0x80, 0x60, 0x18, + 0x04, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x80, 0xe0, 0x01, 0x01, 0x02, 0x06, 0x08, 0x10, 0xe0, 0x10, 0x20, 0x20, 0x20, 0x20, 0x21, 0x16, 0x18, 0x30, 0x50, 0x08, 0x08, - 0x07, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, - 0, 0, 0, 0, 0, 0, 0x80, 0x40, 0x30, 0x0c, 0x02, 0x01, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0xff, 0, 0, 0, 0, 0x08, 0x8c, 0xc5, - 0x4e, 0x74, 0xe2, 0x21, 0x21, 0x17, 0x18, 0x68, 0x84, 0x04, 0, 0, - 0, 0, 0, 0x30, 0x0e, 0x01, 0, 0, 0x07, 0x09, 0x08, 0x09, - 0x06, 0, 0, 0, 0x07, 0, 0, 0, 0x01, 0x01, 0x01, 0x01, - 0, 0, 0, 0, 0, 0x80, 0x70, 0x0f, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xf8, 0x04, 0x02, - 0x02, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0x03, 0x04, 0x08, 0x10, 0x20, 0xe0, 0, 0, 0, 0, 0x81, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x30, 0x0c, 0x02, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x08, 0x8c, 0xc5, + 0x4e, 0x74, 0xe2, 0x21, 0x21, 0x17, 0x18, 0x68, 0x84, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x0e, 0x01, 0x00, 0x00, 0x07, 0x09, 0x08, 0x09, + 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x70, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x04, 0x02, + 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x04, 0x08, 0x10, 0x20, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x81, 0xc0, 0x40, 0x40, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x0a, 0x06, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x18, 0x60, 0x80, 0, 0, - 0, 0, 0x80, 0x78, 0x07, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0x03, 0, 0x02, 0x02, 0x01, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0x01, 0x02, 0, 0, 0x03, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x18, 0x60, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x78, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, }, { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0x80, 0x40, 0x40, 0x20, 0x10, - 0x10, 0x08, 0x04, 0, 0x02, 0x01, 0x01, 0x01, 0, 0, 0, 0, - 0, 0x80, 0x80, 0xe0, 0x80, 0xe0, 0, 0, 0, 0, 0, 0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x20, 0x10, + 0x10, 0x08, 0x04, 0x00, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x80, 0xe0, 0x80, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x22, 0x21, 0x21, 0x23, 0x2c, 0x30, 0x70, 0x51, 0x91, 0x10, 0x10, - 0x10, 0x20, 0x60, 0x80, 0, 0, 0, 0, 0x08, 0x08, 0x08, 0x04, - 0x07, 0x3c, 0xc4, 0x04, 0x04, 0x02, 0x02, 0, 0, 0, 0, 0, - 0x01, 0x07, 0xfc, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0xf0, 0x0c, 0x03, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0x06, 0x18, 0x20, 0xc0, 0, 0, 0, 0x05, 0x06, 0x03, - 0x01, 0x07, 0x01, 0x01, 0x01, 0, 0, 0, 0, 0, 0, 0, + 0x10, 0x20, 0x60, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x04, + 0x07, 0x3c, 0xc4, 0x04, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x18, 0x20, 0xc0, 0x00, 0x00, 0x00, 0x05, 0x06, 0x03, + 0x01, 0x07, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x20, 0x20, 0x20, 0x20, 0x21, 0x16, 0x1c, 0x38, 0x68, 0x04, 0x07, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0x80, 0xc0, 0x20, 0x30, 0x0c, 0x07, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0f, 0x30, 0x40, - 0x40, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0x01, 0, 0, 0x10, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0x80, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0x7e, 0x02, 0x01, - 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x20, 0x30, 0x0c, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x30, 0x40, + 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x02, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, - 0x01, 0x01, 0, 0, 0, 0x01, 0x03, 0x04, 0x18, 0x30, 0x40, 0x80, - 0, 0, 0, 0xc0, 0x3f, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0x01, 0x03, 0, 0x02, 0x01, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x04, 0x18, 0x30, 0x40, 0x80, + 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x02, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, }}; static const char PROGMEM tap_sys[][520] = { - {0x01, 0x80, 0x60, 0x10, 0x48, 0x08, 0x24, 0x04, 0x14, 0x84, 0x14, 0x04, - 0x28, 0x88, 0x10, 0x60, 0x80, 0, 0, 0x04, 0, 0x80, 0x60, 0x10, - 0x08, 0x08, 0x04, 0x44, 0x84, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x60, - 0x82, 0, 0, 0, 0, 0, 0, 0, 0xfc, 0x02, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81, 0x41, - 0x21, 0x21, 0x21, 0xa1, 0x61, 0x41, 0xc1, 0x41, 0xc1, 0x81, 0x81, 0x81, - 0x81, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0xa2, 0xfc, 0, 0, 0, - 0x10, 0, 0, 0, 0, 0, 0x80, 0x40, 0x20, 0x10, 0x10, 0x08, - 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, - 0x20, 0x40, 0x84, 0, 0, 0, 0, 0x04, 0, 0x1f, 0x60, 0x85, - 0x10, 0x40, 0, 0x80, 0x06, 0x07, 0, 0, 0, 0, 0x82, 0x60, - 0x1f, 0, 0, 0, 0, 0x1f, 0x60, 0x80, 0x40, 0x20, 0x20, 0x10, - 0x93, 0x5c, 0x10, 0x20, 0x20, 0x40, 0x80, 0x60, 0x1f, 0, 0, 0, - 0, 0, 0, 0, 0xff, 0xc1, 0x02, 0x0c, 0x70, 0x80, 0, 0, - 0, 0, 0, 0xe0, 0x1c, 0x03, 0, 0xc0, 0x38, 0x06, 0x01, 0x80, - 0x70, 0x0c, 0x02, 0x03, 0x1c, 0xe0, 0x01, 0x06, 0x38, 0xc1, 0x02, 0x0c, - 0x70, 0x80, 0, 0, 0, 0, 0, 0xe0, 0x1c, 0x03, 0, 0xc0, - 0x38, 0x06, 0x01, 0x80, 0xff, 0, 0, 0, 0, 0, 0, 0xf0, - 0x0c, 0x03, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0xc0, 0x30, 0x0c, 0x03, 0, 0, 0, 0, 0, 0, 0x03, - 0x0c, 0xf0, 0x04, 0, 0x80, 0x80, 0x88, 0x80, 0x81, 0x81, 0x02, 0x02, - 0x12, 0x02, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0, 0x08, 0, 0, - 0x80, 0x80, 0x90, 0x80, 0x81, 0x81, 0x02, 0x02, 0x02, 0x02, 0x82, 0x82, - 0x01, 0x01, 0, 0, 0x80, 0x80, 0, 0x01, 0, 0, 0, 0, - 0xff, 0x41, 0x8e, 0xb0, 0xc0, 0x83, 0x9c, 0x60, 0xa0, 0x18, 0x07, 0x80, - 0x40, 0x30, 0x0e, 0x01, 0x80, 0x60, 0x1c, 0x03, 0, 0, 0, 0, - 0, 0, 0x07, 0x18, 0x20, 0x41, 0x8e, 0xb0, 0xc0, 0x83, 0x9c, 0x60, - 0xa0, 0x18, 0x07, 0x80, 0x40, 0x30, 0x0e, 0x01, 0x80, 0x60, 0x1c, 0x03, - 0xff, 0, 0, 0, 0, 0, 0, 0x07, 0x18, 0x60, 0x90, 0x08, - 0x08, 0x04, 0x64, 0x04, 0x02, 0xf2, 0x52, 0x92, 0x13, 0x12, 0x12, 0xf2, - 0x02, 0x04, 0x64, 0x04, 0x08, 0x08, 0x90, 0x70, 0x18, 0x07, 0, 0, - 0x1f, 0x12, 0x99, 0x14, 0x12, 0x1f, 0, 0x04, 0, 0, 0x1f, 0x10, - 0x10, 0x10, 0x10, 0x1f, 0, 0, 0x40, 0, 0x1f, 0x10, 0x10, 0x10, - 0x10, 0x1f, 0, 0, 0, 0x40, 0x0d, 0x0d, 0, 0x0c, 0x0c, 0, - 0x01, 0x01, 0, 0, 0, 0x40, 0, 0, 0x1f, 0x20, 0x40, 0x40, - 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x43, 0x42, 0x42, 0x42, 0x42, 0x41, - 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, - 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x43, 0x42, - 0x42, 0x42, 0x42, 0x41, 0x40, 0x40, 0x40, 0x20, 0x1f, 0, 0, 0x08, - 0, 0, 0, 0, 0, 0, 0x40, 0x01, 0x02, 0x04, 0x04, 0x08, - 0x08, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x11, 0x08, 0x08, 0x04, 0x44, - 0x02, 0x01, 0, 0, 0, 0, 0x20, 0}, + { + 0x01, 0x80, 0x60, 0x10, 0x48, 0x08, 0x24, 0x04, 0x14, 0x84, 0x14, 0x04, + 0x28, 0x88, 0x10, 0x60, 0x80, 0x00, 0x00, 0x04, 0x00, 0x80, 0x60, 0x10, + 0x08, 0x08, 0x04, 0x44, 0x84, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x60, + 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x02, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81, 0x41, + 0x21, 0x21, 0x21, 0xa1, 0x61, 0x41, 0xc1, 0x41, 0xc1, 0x81, 0x81, 0x81, + 0x81, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0xa2, 0xfc, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x10, 0x08, + 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, + 0x20, 0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1f, 0x60, 0x85, + 0x10, 0x40, 0x00, 0x80, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, 0x82, 0x60, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x60, 0x80, 0x40, 0x20, 0x20, 0x10, + 0x93, 0x5c, 0x10, 0x20, 0x20, 0x40, 0x80, 0x60, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0x02, 0x0c, 0x70, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x03, 0x00, 0xc0, 0x38, 0x06, 0x01, 0x80, + 0x70, 0x0c, 0x02, 0x03, 0x1c, 0xe0, 0x01, 0x06, 0x38, 0xc1, 0x02, 0x0c, + 0x70, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x03, 0x00, 0xc0, + 0x38, 0x06, 0x01, 0x80, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x0c, 0xf0, 0x04, 0x00, 0x80, 0x80, 0x88, 0x80, 0x81, 0x81, 0x02, 0x02, + 0x12, 0x02, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0x00, 0x08, 0x00, 0x00, + 0x80, 0x80, 0x90, 0x80, 0x81, 0x81, 0x02, 0x02, 0x02, 0x02, 0x82, 0x82, + 0x01, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x41, 0x8e, 0xb0, 0xc0, 0x83, 0x9c, 0x60, 0xa0, 0x18, 0x07, 0x80, + 0x40, 0x30, 0x0e, 0x01, 0x80, 0x60, 0x1c, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x18, 0x20, 0x41, 0x8e, 0xb0, 0xc0, 0x83, 0x9c, 0x60, + 0xa0, 0x18, 0x07, 0x80, 0x40, 0x30, 0x0e, 0x01, 0x80, 0x60, 0x1c, 0x03, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x60, 0x90, 0x08, + 0x08, 0x04, 0x64, 0x04, 0x02, 0xf2, 0x52, 0x92, 0x13, 0x12, 0x12, 0xf2, + 0x02, 0x04, 0x64, 0x04, 0x08, 0x08, 0x90, 0x70, 0x18, 0x07, 0x00, 0x00, + 0x1f, 0x12, 0x99, 0x14, 0x12, 0x1f, 0x00, 0x04, 0x00, 0x00, 0x1f, 0x10, + 0x10, 0x10, 0x10, 0x1f, 0x00, 0x00, 0x40, 0x00, 0x1f, 0x10, 0x10, 0x10, + 0x10, 0x1f, 0x00, 0x00, 0x00, 0x40, 0x0d, 0x0d, 0x00, 0x0c, 0x0c, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x1f, 0x20, 0x40, 0x40, + 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x43, 0x42, 0x42, 0x42, 0x42, 0x41, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x43, 0x42, + 0x42, 0x42, 0x42, 0x41, 0x40, 0x40, 0x40, 0x20, 0x1f, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x02, 0x04, 0x04, 0x08, + 0x08, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x11, 0x08, 0x08, 0x04, 0x44, + 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, + }, { 0x04, 0x80, 0x60, 0x10, 0x48, 0x08, 0xa4, 0x04, 0x14, 0x04, 0x14, 0x04, - 0x28, 0x88, 0x10, 0x60, 0x80, 0, 0x04, 0, 0, 0x80, 0x60, 0x10, + 0x28, 0x88, 0x10, 0x60, 0x80, 0x00, 0x04, 0x00, 0x00, 0x80, 0x60, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0xc4, 0x04, 0x08, 0x08, 0x10, 0x60, - 0x80, 0x02, 0, 0, 0x04, 0, 0, 0, 0xfc, 0x02, 0x01, 0x01, + 0x80, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xfc, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0xa1, 0x61, 0x41, 0xc1, 0x41, 0x41, 0x81, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0xa2, 0xfc, 0, 0, 0x40, - 0, 0, 0x02, 0, 0, 0, 0x80, 0x40, 0x20, 0x10, 0x10, 0x08, + 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0xa2, 0xfc, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x84, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, - 0x20, 0x42, 0x80, 0, 0, 0x10, 0, 0, 0, 0x1f, 0x60, 0x85, - 0x10, 0x40, 0, 0x81, 0x06, 0x06, 0, 0, 0, 0, 0x82, 0x60, - 0x1f, 0, 0, 0, 0, 0x1f, 0x60, 0x80, 0x40, 0x20, 0x20, 0x10, - 0x50, 0x9e, 0x11, 0x20, 0x20, 0x40, 0x80, 0x60, 0x1f, 0, 0, 0, - 0, 0, 0, 0, 0xff, 0xc0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0xe0, 0x1c, 0x03, 0, 0xc0, 0x38, 0x06, 0x01, 0, - 0, 0, 0, 0x03, 0x1c, 0xe0, 0x01, 0x06, 0x38, 0xc0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0xe0, 0x1c, 0x03, 0, 0xc0, - 0x38, 0x06, 0x01, 0, 0xff, 0, 0, 0, 0, 0, 0, 0xf0, - 0x0c, 0x03, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x1e, - 0xe0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x03, - 0x0c, 0xf0, 0, 0, 0x80, 0x80, 0x90, 0x80, 0x81, 0x81, 0x02, 0x02, - 0x02, 0x02, 0x82, 0x82, 0x81, 0x81, 0x80, 0x88, 0, 0, 0, 0, + 0x20, 0x42, 0x80, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1f, 0x60, 0x85, + 0x10, 0x40, 0x00, 0x81, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x82, 0x60, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x60, 0x80, 0x40, 0x20, 0x20, 0x10, + 0x50, 0x9e, 0x11, 0x20, 0x20, 0x40, 0x80, 0x60, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x03, 0x00, 0xc0, 0x38, 0x06, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x1c, 0xe0, 0x01, 0x06, 0x38, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x03, 0x00, 0xc0, + 0x38, 0x06, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1e, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x0c, 0xf0, 0x00, 0x00, 0x80, 0x80, 0x90, 0x80, 0x81, 0x81, 0x02, 0x02, + 0x02, 0x02, 0x82, 0x82, 0x81, 0x81, 0x80, 0x88, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x88, 0x81, 0x81, 0x02, 0x02, 0x02, 0x02, 0x82, 0x82, - 0x01, 0x81, 0x80, 0, 0, 0, 0, 0, 0, 0, 0x10, 0, + 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xff, 0x41, 0x8e, 0xb0, 0xc0, 0x80, 0x80, 0x40, 0x20, 0x18, 0x07, 0x80, - 0x40, 0x30, 0x0e, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0x07, 0x18, 0x20, 0x41, 0x8e, 0xb0, 0xc0, 0x80, 0x80, 0x40, - 0x20, 0x18, 0x07, 0x80, 0x40, 0x30, 0x0e, 0x01, 0, 0, 0, 0, - 0xff, 0, 0x02, 0, 0, 0, 0, 0x07, 0x18, 0x60, 0x90, 0x08, + 0x40, 0x30, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x18, 0x20, 0x41, 0x8e, 0xb0, 0xc0, 0x80, 0x80, 0x40, + 0x20, 0x18, 0x07, 0x80, 0x40, 0x30, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x60, 0x90, 0x08, 0x08, 0x04, 0x64, 0x04, 0x02, 0xf2, 0x12, 0x92, 0x53, 0x92, 0x12, 0xf2, - 0x02, 0x04, 0x64, 0x04, 0x08, 0x08, 0x90, 0x70, 0x18, 0x07, 0, 0, - 0x1f, 0x10, 0x10, 0x10, 0x10, 0x1f, 0, 0x80, 0, 0, 0x1f, 0x10, - 0x10, 0x10, 0x10, 0x1f, 0, 0, 0, 0, 0x1f, 0x1f, 0x1f, 0x1f, - 0x1f, 0x1f, 0, 0, 0, 0x40, 0x01, 0x01, 0x80, 0x0d, 0x0d, 0, - 0x0c, 0x0c, 0, 0, 0, 0, 0, 0, 0x1f, 0x20, 0x40, 0x40, + 0x02, 0x04, 0x64, 0x04, 0x08, 0x08, 0x90, 0x70, 0x18, 0x07, 0x00, 0x00, + 0x1f, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x00, 0x80, 0x00, 0x00, 0x1f, 0x10, + 0x10, 0x10, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x40, 0x01, 0x01, 0x80, 0x0d, 0x0d, 0x00, + 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x20, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x41, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x41, 0x40, - 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x1f, 0, 0, 0, - 0, 0, 0x08, 0, 0, 0, 0, 0x01, 0x02, 0x04, 0x04, 0x08, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x11, 0x08, 0x08, 0x04, 0x04, - 0x02, 0x01, 0, 0, 0x04, 0, 0, 0, + 0x02, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, }, { - 0, 0x80, 0x60, 0x14, 0x48, 0x08, 0x24, 0x04, 0x14, 0x04, 0x14, 0x04, - 0x28, 0x88, 0x10, 0x60, 0x80, 0, 0, 0x08, 0, 0x80, 0x60, 0x10, + 0x00, 0x80, 0x60, 0x14, 0x48, 0x08, 0x24, 0x04, 0x14, 0x04, 0x14, 0x04, + 0x28, 0x88, 0x10, 0x60, 0x80, 0x00, 0x00, 0x08, 0x00, 0x80, 0x60, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x88, 0x10, 0x60, - 0x80, 0, 0, 0x04, 0, 0, 0, 0, 0xfc, 0x02, 0x01, 0x01, + 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0x21, 0x21, 0x41, 0x81, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0x22, 0xfc, 0, 0, 0x10, - 0, 0, 0, 0, 0x02, 0, 0x80, 0x40, 0x20, 0x10, 0x10, 0x08, + 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0x22, 0xfc, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x40, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, - 0x20, 0x40, 0x80, 0, 0x04, 0, 0, 0, 0, 0x1f, 0x60, 0x85, - 0x10, 0x44, 0x04, 0x84, 0x06, 0x06, 0, 0, 0, 0, 0x82, 0x60, - 0x1f, 0, 0, 0, 0, 0x1f, 0x60, 0x80, 0x40, 0x20, 0x20, 0x10, - 0x10, 0x18, 0x14, 0x22, 0x21, 0x40, 0x80, 0x60, 0x1f, 0, 0, 0, - 0, 0, 0, 0, 0xff, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0xe0, 0x1c, 0x03, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0x03, 0x1c, 0xe0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0xe0, 0x1c, 0x03, 0, 0, - 0, 0, 0, 0, 0xff, 0, 0, 0, 0x08, 0, 0, 0xf0, - 0x0c, 0x03, 0, 0, 0, 0, 0x01, 0x06, 0x08, 0x30, 0x40, 0x80, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x03, - 0x0c, 0xf0, 0, 0, 0x80, 0x80, 0x80, 0x90, 0x81, 0x81, 0x02, 0x12, - 0x02, 0x02, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0, 0, 0x08, 0, + 0x20, 0x40, 0x80, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x60, 0x85, + 0x10, 0x44, 0x04, 0x84, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x82, 0x60, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x60, 0x80, 0x40, 0x20, 0x20, 0x10, + 0x10, 0x18, 0x14, 0x22, 0x21, 0x40, 0x80, 0x60, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x1c, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xf0, + 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0x30, 0x40, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x0c, 0xf0, 0x00, 0x00, 0x80, 0x80, 0x80, 0x90, 0x81, 0x81, 0x02, 0x12, + 0x02, 0x02, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0x00, 0x00, 0x08, 0x00, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0a, - 0x01, 0x81, 0x80, 0, 0x80, 0x80, 0x08, 0, 0, 0, 0x01, 0, - 0xff, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x20, 0x18, 0x07, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0x07, 0x18, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, - 0x20, 0x18, 0x07, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0xff, 0, 0, 0, 0, 0, 0, 0x07, 0x18, 0x60, 0x90, 0x08, + 0x01, 0x81, 0x80, 0x00, 0x80, 0x80, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, + 0xff, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x20, 0x18, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x18, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, + 0x20, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x60, 0x90, 0x08, 0x08, 0x04, 0x64, 0x04, 0x02, 0xf2, 0x12, 0x13, 0x12, 0x92, 0x52, 0xf2, - 0x02, 0x04, 0x64, 0x04, 0x08, 0x08, 0x90, 0x70, 0x18, 0x07, 0, 0, - 0x1f, 0x10, 0x10, 0x10, 0x10, 0x1f, 0, 0, 0x80, 0, 0x1f, 0x10, - 0x16, 0x16, 0x10, 0x1f, 0, 0, 0, 0, 0x1f, 0x10, 0x10, 0x10, - 0x50, 0x1f, 0, 0, 0, 0, 0x0c, 0x0c, 0, 0x01, 0x01, 0, - 0x0d, 0x0d, 0, 0, 0x40, 0, 0, 0, 0x1f, 0x20, 0x40, 0x40, + 0x02, 0x04, 0x64, 0x04, 0x08, 0x08, 0x90, 0x70, 0x18, 0x07, 0x00, 0x00, + 0x1f, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x00, 0x00, 0x80, 0x00, 0x1f, 0x10, + 0x16, 0x16, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x10, 0x10, 0x10, + 0x50, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x01, 0x01, 0x00, + 0x0d, 0x0d, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x1f, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, - 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x1f, 0, 0x80, 0, - 0, 0, 0, 0, 0x08, 0, 0, 0x01, 0x02, 0x04, 0x04, 0x08, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x1f, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x11, 0x08, 0x08, 0x04, 0x04, - 0x02, 0x01, 0x10, 0, 0, 0, 0, 0, + 0x02, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}; diff --git a/jack/oledfont.h b/jack/oledfont.h index 209f143..575829b 100644 --- a/jack/oledfont.h +++ b/jack/oledfont.h @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #include "progmem.h" diff --git a/jack/picosdk_math.mk b/jack/picosdk_math.mk new file mode 100644 index 0000000..82f18a3 --- /dev/null +++ b/jack/picosdk_math.mk @@ -0,0 +1,153 @@ +OPT_DEFS += -DPICO_DOUBLE_IN_RAM=1 \ + -DPICO_FLOAT_IN_RAM=1 + +# bit +SRC += $(PICOSDKROOT)/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S +EXTRALDFLAGS += \ + -Wl,--wrap=__clzsi2 \ + -Wl,--wrap=__clzdi2 \ + -Wl,--wrap=__ctzsi2 \ + -Wl,--wrap=__ctzdi2 \ + -Wl,--wrap=__popcountsi2 \ + -Wl,--wrap=__popcountdi2 + +# double +VPATH += $(PICOSDKROOT)/src/rp2_common/pico_double/include +SRC += \ + $(PICOSDKROOT)/src/rp2_common/pico_double/double_aeabi.S \ + $(PICOSDKROOT)/src/rp2_common/pico_double/double_init_rom.c \ + $(PICOSDKROOT)/src/rp2_common/pico_double/double_math.c \ + $(PICOSDKROOT)/src/rp2_common/pico_double/double_v1_rom_shim.S +EXTRALDFLAGS += \ + -Wl,--wrap=__aeabi_dadd \ + -Wl,--wrap=__aeabi_ddiv \ + -Wl,--wrap=__aeabi_dmul \ + -Wl,--wrap=__aeabi_drsub \ + -Wl,--wrap=__aeabi_dsub \ + -Wl,--wrap=__aeabi_cdcmpeq \ + -Wl,--wrap=__aeabi_cdrcmple \ + -Wl,--wrap=__aeabi_cdcmple \ + -Wl,--wrap=__aeabi_dcmpeq \ + -Wl,--wrap=__aeabi_dcmplt \ + -Wl,--wrap=__aeabi_dcmple \ + -Wl,--wrap=__aeabi_dcmpge \ + -Wl,--wrap=__aeabi_dcmpgt \ + -Wl,--wrap=__aeabi_dcmpun \ + -Wl,--wrap=__aeabi_i2d \ + -Wl,--wrap=__aeabi_l2d \ + -Wl,--wrap=__aeabi_ui2d \ + -Wl,--wrap=__aeabi_ul2d \ + -Wl,--wrap=__aeabi_d2iz \ + -Wl,--wrap=__aeabi_d2lz \ + -Wl,--wrap=__aeabi_d2uiz \ + -Wl,--wrap=__aeabi_d2ulz \ + -Wl,--wrap=__aeabi_d2f \ + -Wl,--wrap=sqrt \ + -Wl,--wrap=cos \ + -Wl,--wrap=sin \ + -Wl,--wrap=tan \ + -Wl,--wrap=atan2 \ + -Wl,--wrap=exp \ + -Wl,--wrap=log \ + -Wl,--wrap=ldexp \ + -Wl,--wrap=copysign \ + -Wl,--wrap=trunc \ + -Wl,--wrap=floor \ + -Wl,--wrap=ceil \ + -Wl,--wrap=round \ + -Wl,--wrap=sincos \ + -Wl,--wrap=asin \ + -Wl,--wrap=acos \ + -Wl,--wrap=atan \ + -Wl,--wrap=sinh \ + -Wl,--wrap=cosh \ + -Wl,--wrap=tanh \ + -Wl,--wrap=asinh \ + -Wl,--wrap=acosh \ + -Wl,--wrap=atanh \ + -Wl,--wrap=exp2 \ + -Wl,--wrap=log2 \ + -Wl,--wrap=exp10 \ + -Wl,--wrap=log10 \ + -Wl,--wrap=pow \ + -Wl,--wrap=powint \ + -Wl,--wrap=hypot \ + -Wl,--wrap=cbrt \ + -Wl,--wrap=fmod \ + -Wl,--wrap=drem \ + -Wl,--wrap=remainder \ + -Wl,--wrap=remquo \ + -Wl,--wrap=expm1 \ + -Wl,--wrap=log1p \ + -Wl,--wrap=fma + +# float +VPATH += $(PICOSDKROOT)/src/rp2_common/pico_float/include +SRC += \ + $(PICOSDKROOT)/src/rp2_common/pico_float/float_aeabi.S \ + $(PICOSDKROOT)/src/rp2_common/pico_float/float_init_rom.c \ + $(PICOSDKROOT)/src/rp2_common/pico_float/float_math.c \ + $(PICOSDKROOT)/src/rp2_common/pico_float/float_v1_rom_shim.S + +EXTRALDFLAGS += \ + -Wl,--wrap=__aeabi_fadd \ + -Wl,--wrap=__aeabi_fdiv \ + -Wl,--wrap=__aeabi_fmul \ + -Wl,--wrap=__aeabi_frsub \ + -Wl,--wrap=__aeabi_fsub \ + -Wl,--wrap=__aeabi_cfcmpeq \ + -Wl,--wrap=__aeabi_cfrcmple \ + -Wl,--wrap=__aeabi_cfcmple \ + -Wl,--wrap=__aeabi_fcmpeq \ + -Wl,--wrap=__aeabi_fcmplt \ + -Wl,--wrap=__aeabi_fcmple \ + -Wl,--wrap=__aeabi_fcmpge \ + -Wl,--wrap=__aeabi_fcmpgt \ + -Wl,--wrap=__aeabi_fcmpun \ + -Wl,--wrap=__aeabi_i2f \ + -Wl,--wrap=__aeabi_l2f \ + -Wl,--wrap=__aeabi_ui2f \ + -Wl,--wrap=__aeabi_ul2f \ + -Wl,--wrap=__aeabi_f2iz \ + -Wl,--wrap=__aeabi_f2lz \ + -Wl,--wrap=__aeabi_f2uiz \ + -Wl,--wrap=__aeabi_f2ulz \ + -Wl,--wrap=__aeabi_f2d \ + -Wl,--wrap=sqrtf \ + -Wl,--wrap=cosf \ + -Wl,--wrap=sinf \ + -Wl,--wrap=tanf \ + -Wl,--wrap=atan2f \ + -Wl,--wrap=expf \ + -Wl,--wrap=logf \ + -Wl,--wrap=ldexpf \ + -Wl,--wrap=copysignf \ + -Wl,--wrap=truncf \ + -Wl,--wrap=floorf \ + -Wl,--wrap=ceilf \ + -Wl,--wrap=roundf \ + -Wl,--wrap=sincosf \ + -Wl,--wrap=asinf \ + -Wl,--wrap=acosf \ + -Wl,--wrap=atanf \ + -Wl,--wrap=sinhf \ + -Wl,--wrap=coshf \ + -Wl,--wrap=tanhf \ + -Wl,--wrap=asinhf \ + -Wl,--wrap=acoshf \ + -Wl,--wrap=atanhf \ + -Wl,--wrap=exp2f \ + -Wl,--wrap=log2f \ + -Wl,--wrap=exp10f \ + -Wl,--wrap=log10f \ + -Wl,--wrap=powf \ + -Wl,--wrap=powintf \ + -Wl,--wrap=hypotf \ + -Wl,--wrap=cbrtf \ + -Wl,--wrap=fmodf \ + -Wl,--wrap=dremf \ + -Wl,--wrap=remainderf \ + -Wl,--wrap=remquof \ + -Wl,--wrap=expm1f \ + -Wl,--wrap=log1pf \ + -Wl,--wrap=fmaf diff --git a/jack/post_rules.mk b/jack/post_rules.mk new file mode 100644 index 0000000..fb10049 --- /dev/null +++ b/jack/post_rules.mk @@ -0,0 +1,14 @@ +ifeq ($(MCU_SERIES), RP2040) + include picosdk_math.mk +endif + +ifeq ($(strip $(RP2040_MATH_IN_ROM)), yes) + OPT_DEFS += -DRP2040_MATH_IN_ROM + MCU_LDSCRIPT = RP2040_FLASH_TIMECRIT_ROM_MATH +endif + +ifeq ($(strip $(MOUSE_JIGGLE_ENABLE)), yes) + OPT_DEFS += -DMOUSE_JIGGLE_ENABLE + MOUSEKEY_ENABLE = yes + DEFERRED_EXEC_ENABLE = yes +endif diff --git a/jack/rgb_matrix_user.inc b/jack/rgb_matrix_user.inc new file mode 100644 index 0000000..2ff9e95 --- /dev/null +++ b/jack/rgb_matrix_user.inc @@ -0,0 +1,835 @@ +// Copyright 2025 Google LLC +// SPDX-License-Identifier: Apache-2.0 +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_GRADIENT_ENABLE) +RGB_MATRIX_EFFECT(PALETTEFX_GRADIENT) +#endif +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_FLOW_ENABLE) +RGB_MATRIX_EFFECT(PALETTEFX_FLOW) +#endif +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_RIPPLE_ENABLE) +RGB_MATRIX_EFFECT(PALETTEFX_RIPPLE) +#endif +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_SPARKLE_ENABLE) +RGB_MATRIX_EFFECT(PALETTEFX_SPARKLE) +#endif +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_VORTEX_ENABLE) +RGB_MATRIX_EFFECT(PALETTEFX_VORTEX) +#endif +#if defined(RGB_MATRIX_KEYREACTIVE_ENABLED) && \ + (defined(PALETTEFX_ENABLE_ALL_EFFECTS) || \ + defined(PALETTEFX_REACTIVE_ENABLE)) +RGB_MATRIX_EFFECT(PALETTEFX_REACTIVE) +#endif + +#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS + +/////////////////////////////////////////////////////////////////////////////// +// PaletteFx function definitions +/////////////////////////////////////////////////////////////////////////////// + +/** Gets the selected palette. */ +static const uint16_t *palettefx_get_palette_data(void); + +/** + * @brief Computes the interpolated HSV palette color at 0 <= x < 256. + * + * Looks up and linearly interpolates `palette` at 0 <= x < 256. The color + * saturation and value are scaled according to rgb_matrix_config. + * + * @note `palette` must point to a PROGMEM address. + * + * @param palette Pointer to PROGMEM of a size-16 table of HSV16 colors. + * @param x Palette lookup position, a value in 0-255. + * @return HSV color. + */ +static hsv_t palettefx_interp_color(const uint16_t *palette, uint8_t x); + +/** Gets the color data for the selected palette. */ +static const uint16_t *palettefx_get_palette_data(void); + +/** + * @brief Compute a scaled 16-bit time that wraps smoothly. + * + * Computes `timer` scaled by `scale`, returning the result as a uint16. + * Generally, the scaled time would have a discontinuity every ~65 seconds when + * `timer` wraps 16-bit range. This is corrected for to wrap smoothly mod 2^16. + * + * @param timer A 32-bit timer. + * @param scale Scale value in 0-255. + * @return Scaled time. + */ +inline static uint16_t palettefx_scaled_time(uint32_t timer, uint8_t scale); + +/////////////////////////////////////////////////////////////////////////////// +// PaletteFx effects +/////////////////////////////////////////////////////////////////////////////// + +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_GRADIENT_ENABLE) +// "Gradient" static effect. This is essentially a palette-colored version of +// RGB_MATRIX_GRADIENT_UP_DOWN. A vertically-sloping gradient is made, with the +// highest color on the top keys of keyboard and the lowest color at the bottom. +static bool PALETTEFX_GRADIENT(effect_params_t *params) { + // On first call, compute and cache the slope of the gradient. + static uint8_t gradient_slope = 0; + if (!gradient_slope) { + uint8_t y_max = 64; // To avoid overflow below, x_max must be at least 64. + for (uint8_t i = 0; i < RGB_MATRIX_LED_COUNT; ++i) { + if (g_led_config.point[i].y > y_max) { + y_max = g_led_config.point[i].y; + } + } + // Compute the quotient `255 / y_max` with 6 fractional bits and rounding. + gradient_slope = (64 * 255 + y_max / 2) / y_max; + } + + RGB_MATRIX_USE_LIMITS(led_min, led_max); + const uint16_t *palette = palettefx_get_palette_data(); + + for (uint8_t i = led_min; i < led_max; ++i) { + RGB_MATRIX_TEST_LED_FLAGS(); + const uint8_t y = g_led_config.point[i].y; + const uint8_t value = 255 - (((uint16_t)y * (uint16_t)gradient_slope) >> 6); + rgb_t rgb = rgb_matrix_hsv_to_rgb(palettefx_interp_color(palette, value)); + rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); + } + + return rgb_matrix_check_finished_leds(led_max); +} +#endif + +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_FLOW_ENABLE) +// "Flow" animated effect. Draws moving wave patterns mimicking the appearance +// of flowing liquid. For interesting variety of patterns, space coordinates are +// slowly rotated and a function of several sine waves is evaluated. +static bool PALETTEFX_FLOW(effect_params_t *params) { + RGB_MATRIX_USE_LIMITS(led_min, led_max); + const uint16_t *palette = palettefx_get_palette_data(); + const uint16_t time = + palettefx_scaled_time(g_rgb_timer, 1 + rgb_matrix_config.speed / 8); + // Compute rotation coefficients with 7 fractional bits. + const int8_t rot_c = cos8(time / 4) - 128; + const int8_t rot_s = sin8(time / 4) - 128; + const uint8_t omega = 32 + sin8(time) / 4; + + for (uint8_t i = led_min; i < led_max; ++i) { + RGB_MATRIX_TEST_LED_FLAGS(); + const uint8_t x = g_led_config.point[i].x; + const uint8_t y = g_led_config.point[i].y; + + // Rotate (x, y) by the 2x2 rotation matrix described by rot_c, rot_s. + const uint8_t x1 = (uint8_t)((((int16_t)rot_c) * ((int16_t)x)) / 128) - + (uint8_t)((((int16_t)rot_s) * ((int16_t)y)) / 128); + const uint8_t y1 = (uint8_t)((((int16_t)rot_s) * ((int16_t)x)) / 128) + + (uint8_t)((((int16_t)rot_c) * ((int16_t)y)) / 128); + + uint8_t value = scale8(sin8(x1 - 2 * time), omega) + y1 + time / 4; + // Evaluate `sawtooth(value)`. + value = 2 * ((value <= 127) ? value : (255 - value)); + + rgb_t rgb = rgb_matrix_hsv_to_rgb(palettefx_interp_color(palette, value)); + rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); + } + + return rgb_matrix_check_finished_leds(led_max); +} +#endif + +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_RIPPLE_ENABLE) +// "Ripple" animated effect. Draws circular rings emanating from random points, +// simulating water drops falling in a quiet pool. +static bool PALETTEFX_RIPPLE(effect_params_t *params) { + RGB_MATRIX_USE_LIMITS(led_min, led_max); + const uint16_t *palette = palettefx_get_palette_data(); + + // Each instance of this struct represents one water drop. For efficiency, at + // most 3 drops are active at any time. + static struct { + uint16_t time; + uint8_t x; + uint8_t y; + uint8_t amplitude; + uint8_t scale; + uint8_t phase; + } drops[3]; + static uint32_t drop_timer = 0; + static uint8_t drops_tail = 0; + + if (params->iter == 0) { + if (params->init) { + for (uint8_t j = 0; j < 3; ++j) { + drops[j].amplitude = 0; + } + drop_timer = g_rgb_timer; + } + + if (drops[drops_tail].amplitude == 0 && + timer_expired32(g_rgb_timer, drop_timer)) { + // Spawn a new drop, located at a random LED. + const uint8_t i = random8_max(RGB_MATRIX_LED_COUNT); + drops[drops_tail].time = (uint16_t)g_rgb_timer; + drops[drops_tail].x = g_led_config.point[i].x; + drops[drops_tail].y = g_led_config.point[i].y; + drops[drops_tail].amplitude = 1; + ++drops_tail; + if (drops_tail == 3) { + drops_tail = 0; + } + drop_timer = g_rgb_timer + 1000; + } + + uint8_t amplitude(uint8_t t) { // Drop amplitude as a function of time. + if (t <= 55) { + return (t < 32) ? (3 + 5 * t) : 192; + } else { + t = (((uint16_t)(255 - t)) * UINT16_C(123)) >> 7; + return scale8(t, t); + } + } + + for (uint8_t j = 0; j < 3; ++j) { + if (drops[j].amplitude == 0) { + continue; + } + const uint16_t tick = scale16by8(g_rgb_timer - drops[j].time, + 1 + rgb_matrix_config.speed / 4); + if (tick < 4 * 255) { + const uint8_t t = (uint8_t)(tick / 4); + drops[j].amplitude = amplitude(t); + drops[j].scale = 255 / (1 + t / 2); + drops[j].phase = (uint8_t)tick; + } else { + drops[j].amplitude = 0; // Animation for this drop is complete. + } + } + } + + for (uint8_t i = led_min; i < led_max; ++i) { + RGB_MATRIX_TEST_LED_FLAGS(); + int16_t value = 128; + + for (uint8_t j = 0; j < 3; ++j) { + if (drops[j].amplitude == 0) { + continue; + } + + const uint8_t x = abs8((g_led_config.point[i].x - drops[j].x) / 2); + const uint8_t y = abs8((g_led_config.point[i].y - drops[j].y) / 2); + const uint8_t r = sqrt16(x * x + y * y); + const uint16_t r_scaled = (uint16_t)r * (uint16_t)drops[j].scale; + + if (r_scaled < 255) { + // The drop is made from a radial sine wave modulated by a smooth bump + // to localize its spatial extent. + const uint8_t bump = scale8(ease8InOutApprox(255 - (uint8_t)r_scaled), + drops[j].amplitude); + const int8_t wave = (int16_t)cos8(8 * r - drops[j].phase) - 128; + value += ((int16_t)wave * (int16_t)bump) / 128; + } + } + + // Clip `value` to 0-255 range. + if (value < 0) { + value = 0; + } + if (value > 255) { + value = 255; + } + rgb_t rgb = + rgb_matrix_hsv_to_rgb(palettefx_interp_color(palette, (uint8_t)value)); + rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); + } + + return rgb_matrix_check_finished_leds(led_max); +} +#endif + +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_SPARKLE_ENABLE) +// "Sparkle" effect. Each LED is animated by a sine wave with pseudorandom +// phase, so that the matrix "sparkles." All the LED sines are modulated by a +// global amplitude factor, which varies by a slower sine wave, so that the +// matrix as a whole periodically brightens and dims. +static bool PALETTEFX_SPARKLE(effect_params_t *params) { + RGB_MATRIX_USE_LIMITS(led_min, led_max); + const uint16_t *palette = palettefx_get_palette_data(); + const uint8_t time = + palettefx_scaled_time(g_rgb_timer, 1 + rgb_matrix_config.speed / 8); + const uint8_t amplitude = 128 + sin8(time) / 2; + uint16_t rand_state = 1 + params->iter; + + for (uint8_t i = led_min; i < led_max; ++i) { + RGB_MATRIX_TEST_LED_FLAGS(); + // Multiplicative congruential generator for a random phase for each LED. + rand_state *= UINT16_C(36563); + const uint8_t phase = (uint8_t)(rand_state >> 8); + + const uint8_t value = scale8(sin8(2 * time + phase), amplitude); + + rgb_t rgb = rgb_matrix_hsv_to_rgb(palettefx_interp_color(palette, value)); + rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); + } + + return rgb_matrix_check_finished_leds(led_max); +} +#endif + +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_SPARKLE_ENABLE) +// "Vortex" animated effect. LEDs are animated according to a polar function +// with the appearance of a spinning vortex centered on k_rgb_matrix_center. +static bool PALETTEFX_VORTEX(effect_params_t *params) { + RGB_MATRIX_USE_LIMITS(led_min, led_max); + const uint16_t *palette = palettefx_get_palette_data(); + const uint16_t time = + palettefx_scaled_time(g_rgb_timer, 1 + rgb_matrix_config.speed / 4); + + for (uint8_t i = led_min; i < led_max; ++i) { + RGB_MATRIX_TEST_LED_FLAGS(); + const int16_t x = g_led_config.point[i].x - k_rgb_matrix_center.x; + const int16_t y = g_led_config.point[i].y - k_rgb_matrix_center.y; + uint8_t value = sin8(atan2_8(y, x) + time - sqrt16(x * x + y * y) / 2); + + rgb_t rgb = rgb_matrix_hsv_to_rgb(palettefx_interp_color(palette, value)); + rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); + } + + return rgb_matrix_check_finished_leds(led_max); +} +#endif + +#if defined(RGB_MATRIX_KEYREACTIVE_ENABLED) && \ + (defined(PALETTEFX_ENABLE_ALL_EFFECTS) || \ + defined(PALETTEFX_REACTIVE_ENABLE)) +// Reactive animated effect. This effect is "reactive," it responds to key +// presses. For each key press, LEDs near the key change momentarily. +static bool PALETTEFX_REACTIVE(effect_params_t *params) { + RGB_MATRIX_USE_LIMITS(led_min, led_max); + const uint16_t *palette = palettefx_get_palette_data(); + const uint8_t count = g_last_hit_tracker.count; + + uint8_t amplitude(uint8_t t) { // Bump amplitude as a function of time. + if (t <= 55) { + return (t < 32) ? (4 + 8 * t) : 255; + } else { + t = (((uint16_t)(255 - t)) * UINT16_C(164)) >> 7; + return scale8(t, t); + } + } + + uint8_t hit_amplitude[LED_HITS_TO_REMEMBER] = {0}; + for (uint8_t j = 0; j < count; ++j) { + const uint16_t tick = + scale16by8(g_last_hit_tracker.tick[j], 1 + rgb_matrix_config.speed / 4); + if (tick <= 255) { + hit_amplitude[j] = amplitude((uint8_t)tick); + } + } + + for (uint8_t i = led_min; i < led_max; ++i) { + RGB_MATRIX_TEST_LED_FLAGS(); + uint8_t value = 0; + + for (uint8_t j = 0; j < count; ++j) { + if (hit_amplitude[j] == 0) { + continue; + } + + uint8_t dx = + abs8((g_led_config.point[i].x - g_last_hit_tracker.x[j]) / 2); + uint8_t dy = + abs8((g_led_config.point[i].y - g_last_hit_tracker.y[j]) / 2); + if (dx < 21 && dy < 21) { + const uint16_t dist_sqr = dx * dx + dy * dy; + if (dist_sqr < 21 * 21) { // Accumulate a radial bump for each hit. + const uint8_t dist = sqrt16(dist_sqr); + value = qadd8(value, scale8(255 - 12 * dist, hit_amplitude[j])); + // Early loop exit where the value has saturated. + if (value == 255) { + break; + } + } + } + } + + hsv_t hsv = palettefx_interp_color(palette, value); + if (value < 32) { // Make the background dark regardless of palette. + hsv.v = scale8(hsv.v, 64 + 6 * value); + } + + const rgb_t rgb = rgb_matrix_hsv_to_rgb(hsv); + rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); + } + return rgb_matrix_check_finished_leds(led_max); +} +#endif + +/////////////////////////////////////////////////////////////////////////////// +// PaletteFx implementation +/////////////////////////////////////////////////////////////////////////////// + +/** + * @brief 16-bit HSV color. + * + * Represents a color with a 16-bit value in hue-saturation-value (HSV) space. + * Components are packed as: + * + * - Hue: lowest 8 bits. + * - Saturation: middle 4 bits. + * - Value: highest 4 bits. + */ +#define HSV16(h, s, v) ((((v) >> 4) << 12) | (((s) >> 4) << 8) | ((h) & 0xff)) + +/** Unpacks 16-bit HSV color to hsv_t. */ +static hsv_t unpack_hsv16(uint16_t hsv16) { + return (hsv_t){ + .h = (uint8_t)hsv16, + .s = ((uint8_t)(hsv16 >> 8) & 0x0f) * 17, + .v = ((uint8_t)(hsv16 >> 12) & 0x0f) * 17, + }; +} + +/** PaletteFx palette color data. */ +static const uint16_t palettefx_palettes[][16] PROGMEM = { +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || \ + defined(PALETTEFX_AFTERBURN_ENABLE) + // "Afterburn" palette. + { + HSV16(139, 255, 85), + HSV16(134, 255, 85), + HSV16(131, 255, 102), + HSV16(128, 255, 102), + HSV16(127, 187, 102), + HSV16(125, 119, 102), + HSV16(124, 51, 102), + HSV16(125, 0, 119), + HSV16(15, 17, 119), + HSV16(17, 51, 153), + HSV16(18, 102, 170), + HSV16(19, 153, 204), + HSV16(21, 187, 238), + HSV16(23, 238, 255), + HSV16(26, 255, 255), + HSV16(30, 255, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_AMBER_ENABLE) + // "Amber" palette. + { + HSV16(5, 187, 170), + HSV16(15, 221, 170), + HSV16(22, 238, 187), + HSV16(23, 238, 187), + HSV16(25, 255, 204), + HSV16(27, 255, 221), + HSV16(29, 255, 238), + HSV16(29, 255, 255), + HSV16(28, 187, 255), + HSV16(30, 68, 255), + HSV16(32, 34, 255), + HSV16(32, 34, 255), + HSV16(26, 119, 255), + HSV16(24, 238, 255), + HSV16(21, 221, 255), + HSV16(16, 204, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_BADWOLF_ENABLE) + // "Bad Wolf" palette. Inspired by the Bad Wolf theme by Steve Losh, which + // is + // distributed under MIT/X11 license. + // https://github.com/sjl/badwolf/tree/61d75affa51d40213d671edc9c8ff83992d7fd6f + { + HSV16(14, 34, 0), + HSV16(245, 255, 255), + HSV16(245, 255, 255), + HSV16(245, 255, 255), + HSV16(14, 34, 0), + HSV16(14, 34, 0), + HSV16(14, 34, 0), + HSV16(14, 34, 0), + HSV16(14, 34, 0), + HSV16(14, 34, 0), + HSV16(24, 17, 136), + HSV16(28, 0, 255), + HSV16(24, 17, 136), + HSV16(14, 34, 0), + HSV16(14, 34, 0), + HSV16(14, 34, 0), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_CARNIVAL_ENABLE) + // "Carnival" palette. + { + HSV16(132, 255, 85), + HSV16(121, 187, 85), + HSV16(108, 170, 102), + HSV16(90, 153, 119), + HSV16(70, 187, 136), + HSV16(57, 255, 153), + HSV16(50, 255, 187), + HSV16(44, 255, 204), + HSV16(39, 255, 238), + HSV16(32, 255, 255), + HSV16(27, 255, 255), + HSV16(22, 255, 255), + HSV16(18, 255, 255), + HSV16(8, 221, 238), + HSV16(252, 204, 238), + HSV16(241, 255, 221), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_CLASSIC_ENABLE) + // "Classic" palette. + { + HSV16(150, 255, 85), + HSV16(151, 238, 119), + HSV16(160, 136, 119), + HSV16(176, 102, 136), + HSV16(193, 85, 136), + HSV16(216, 85, 136), + HSV16(234, 102, 153), + HSV16(247, 119, 187), + HSV16(3, 153, 204), + HSV16(10, 204, 221), + HSV16(15, 255, 255), + HSV16(18, 255, 255), + HSV16(23, 255, 255), + HSV16(24, 204, 255), + HSV16(25, 136, 255), + HSV16(26, 85, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_DRACULA_ENABLE) + // "Dracula" palette. Inspired by the Dracula theme by Zeno Rocha, which is + // distributed under MIT license. + // https://github.com/dracula/dracula-theme/tree/ac4dc82dab2a3c35e5cac0cd80c97fbf4c2ca986 + { + HSV16(165, 153, 119), + HSV16(167, 153, 136), + HSV16(170, 170, 187), + HSV16(173, 170, 221), + HSV16(177, 170, 238), + HSV16(183, 170, 255), + HSV16(190, 170, 255), + HSV16(200, 153, 255), + HSV16(216, 153, 255), + HSV16(230, 170, 255), + HSV16(2, 153, 255), + HSV16(29, 153, 238), + HSV16(44, 255, 255), + HSV16(53, 238, 255), + HSV16(63, 238, 238), + HSV16(85, 238, 238), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_GROOVY_ENABLE) + // "Groovy" palette. Inspired by the Gruvbox theme by Pavel Pertsev, which + // is + // distributed under MIT/X11 license. + // https://github.com/morhetz/gruvbox/tree/f1ecde848f0cdba877acb0c740320568252cc482 + { + HSV16(26, 136, 187), + HSV16(23, 85, 102), + HSV16(21, 85, 85), + HSV16(21, 85, 85), + HSV16(21, 85, 85), + HSV16(17, 102, 102), + HSV16(5, 204, 255), + HSV16(4, 255, 255), + HSV16(4, 255, 255), + HSV16(7, 204, 255), + HSV16(23, 136, 187), + HSV16(26, 136, 187), + HSV16(28, 136, 187), + HSV16(50, 238, 238), + HSV16(54, 255, 238), + HSV16(54, 255, 238), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_NOTPINK_ENABLE) + // "Not Pink" palette. + { + HSV16(9, 255, 153), + HSV16(3, 221, 187), + HSV16(252, 204, 187), + HSV16(248, 204, 187), + HSV16(247, 187, 204), + HSV16(245, 187, 238), + HSV16(244, 170, 255), + HSV16(245, 153, 255), + HSV16(252, 102, 255), + HSV16(16, 68, 255), + HSV16(40, 34, 255), + HSV16(32, 51, 255), + HSV16(6, 85, 255), + HSV16(248, 136, 255), + HSV16(247, 187, 255), + HSV16(249, 221, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_PHOSPHOR_ENABLE) + // "Phosphor" palette. + { + HSV16(116, 102, 34), + HSV16(113, 170, 51), + HSV16(113, 255, 68), + HSV16(110, 255, 68), + HSV16(109, 255, 85), + HSV16(105, 255, 102), + HSV16(95, 238, 102), + HSV16(85, 238, 119), + HSV16(84, 255, 136), + HSV16(84, 255, 153), + HSV16(83, 255, 187), + HSV16(80, 238, 204), + HSV16(69, 221, 238), + HSV16(46, 204, 255), + HSV16(42, 153, 255), + HSV16(40, 102, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || \ + defined(PALETTEFX_POLARIZED_ENABLE) + // "Polarized" palette. Inspired by the Solarized theme by Ethan Schoonover, + // which is distributed under MIT license. + // https://github.com/altercation/solarized/tree/62f656a02f93c5190a8753159e34b385588d5ff3 + { + HSV16(139, 255, 68), + HSV16(139, 221, 85), + HSV16(139, 204, 102), + HSV16(138, 204, 119), + HSV16(137, 204, 136), + HSV16(137, 187, 170), + HSV16(137, 153, 187), + HSV16(132, 170, 187), + HSV16(126, 187, 238), + HSV16(124, 102, 255), + HSV16(124, 102, 255), + HSV16(124, 187, 255), + HSV16(130, 170, 204), + HSV16(137, 153, 187), + HSV16(137, 153, 204), + HSV16(137, 136, 221), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_ROSEGOLD_ENABLE) + // "Rose Gold" palette. + { + HSV16(246, 255, 204), + HSV16(250, 238, 221), + HSV16(253, 221, 238), + HSV16(1, 221, 255), + HSV16(6, 221, 255), + HSV16(12, 221, 255), + HSV16(18, 204, 255), + HSV16(22, 170, 255), + HSV16(20, 204, 255), + HSV16(17, 221, 255), + HSV16(12, 221, 255), + HSV16(7, 221, 255), + HSV16(255, 204, 255), + HSV16(248, 204, 255), + HSV16(241, 238, 255), + HSV16(235, 255, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_SPORT_ENABLE) + // "Sport" palette. + { + HSV16(156, 102, 51), + HSV16(155, 102, 68), + HSV16(155, 102, 68), + HSV16(154, 102, 68), + HSV16(155, 102, 85), + HSV16(156, 85, 102), + HSV16(158, 68, 119), + HSV16(159, 51, 136), + HSV16(158, 17, 153), + HSV16(130, 0, 170), + HSV16(49, 17, 204), + HSV16(42, 51, 238), + HSV16(39, 85, 255), + HSV16(37, 119, 255), + HSV16(36, 170, 255), + HSV16(36, 255, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || \ + defined(PALETTEFX_SYNTHWAVE_ENABLE) + // "Synthwave" palette. + { + HSV16(170, 221, 119), + HSV16(180, 221, 153), + HSV16(196, 238, 153), + HSV16(209, 255, 153), + HSV16(220, 255, 170), + HSV16(227, 255, 204), + HSV16(233, 255, 238), + HSV16(245, 204, 255), + HSV16(3, 170, 255), + HSV16(13, 187, 255), + HSV16(21, 204, 255), + HSV16(28, 221, 255), + HSV16(43, 255, 255), + HSV16(42, 255, 255), + HSV16(68, 68, 255), + HSV16(132, 255, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_THERMAL_ENABLE) + // "Thermal" palette. + { + HSV16(7, 0, 17), + HSV16(8, 0, 17), + HSV16(12, 0, 34), + HSV16(13, 0, 51), + HSV16(15, 17, 51), + HSV16(16, 17, 68), + HSV16(20, 34, 85), + HSV16(95, 0, 102), + HSV16(126, 85, 119), + HSV16(112, 85, 153), + HSV16(54, 136, 187), + HSV16(39, 238, 221), + HSV16(33, 255, 255), + HSV16(25, 238, 255), + HSV16(13, 238, 255), + HSV16(5, 238, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_VIRIDIS_ENABLE) + // "Viridis" palette. Inspired by the Viridis colormap by Stefan van der + // Walt + // and Nathaniel Smith, which is distributed under CC0 license. + // https://github.com/BIDS/colormap/blob/bc549477db0c12b54a5928087552ad2cf274980f/colormaps.py + { + HSV16(204, 221, 102), + HSV16(194, 187, 119), + HSV16(183, 153, 136), + HSV16(169, 119, 153), + HSV16(155, 153, 153), + HSV16(145, 170, 153), + HSV16(137, 187, 153), + HSV16(130, 204, 153), + HSV16(123, 221, 153), + HSV16(117, 221, 170), + HSV16(108, 187, 187), + HSV16(93, 153, 204), + HSV16(71, 170, 221), + HSV16(56, 221, 221), + HSV16(46, 255, 238), + HSV16(39, 255, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || \ + defined(PALETTEFX_WATERMELON_ENABLE) + // "Watermelon" palette. + { + HSV16(67, 255, 102), + HSV16(55, 255, 153), + HSV16(47, 255, 204), + HSV16(48, 136, 238), + HSV16(48, 68, 255), + HSV16(45, 34, 255), + HSV16(39, 34, 255), + HSV16(17, 85, 255), + HSV16(8, 187, 255), + HSV16(1, 255, 255), + HSV16(2, 238, 255), + HSV16(2, 238, 255), + HSV16(0, 238, 255), + HSV16(253, 255, 238), + HSV16(254, 255, 238), + HSV16(255, 255, 221), + }, +#endif +#if __has_include("palettefx_user.inc") // Include user palettes if present. +#include "palettefx_user.inc" +#endif +}; +/** Number of palettes. User palettes, if any, are included in the count. */ +#define NUM_PALETTEFX_PALETTES \ + (sizeof(palettefx_palettes) / sizeof(*palettefx_palettes)) + +// Validate at compile time that `1 <= NUM_PALETTEFX_PALETTES <= 32`. The upper +// limit is due to using RGB Matrix's hue config to select palettes. +_Static_assert( + NUM_PALETTEFX_PALETTES >= 1, + "palettefx: No palettes are enabled. To fix: enable all built-in palettes " + "by adding in config.h `#define PALETTE_ENABLE_ALL_PALETTES`, or enable at " + "least one with `#define PALETTE_<name>_ENABLE`, or define at least one " + "custom palette in palettefx_user.inc."); +_Static_assert( + NUM_PALETTEFX_PALETTES <= 256 / RGB_MATRIX_HUE_STEP, + "palettefx: Too many palettes. Up to 32 (= 256 / RGB_MATRIX_HUE_STEP) " + "palettes are supported. Otherwise, some palettes would be unreachable."); + +/** Gets the index of the selected palette. */ +static uint8_t palettefx_get_palette(void) { + uint8_t i = + (rgb_matrix_get_hue() / RGB_MATRIX_HUE_STEP) % NUM_PALETTEFX_PALETTES; + + if (256 % (RGB_MATRIX_HUE_STEP * NUM_PALETTEFX_PALETTES) != 0) { + // Hue wraps mod 256. If NUM_PALETTEFX_PALETTES is not a power of 2, modulo + // 256 wraps would jump, and adjustment is needed to cycle as desired: + // + // * If the hue is a step or less from 256, assume it has wrapped down + // from 0 and the last palette is selected. + // * Otherwise, i = ((hue / step) % NUM_PALETTEFX_PALETTES) is used. If + // 256 - 2 * step <= hue < 256 - step, hue is set to (step * i). + hsv_t hsv = rgb_matrix_get_hsv(); + if (hsv.h >= 256 - 2 * RGB_MATRIX_HUE_STEP) { + if (hsv.h >= 256 - RGB_MATRIX_HUE_STEP) { + i = NUM_PALETTEFX_PALETTES - 1; + hsv.h = RGB_MATRIX_HUE_STEP * + ((256 / (RGB_MATRIX_HUE_STEP * NUM_PALETTEFX_PALETTES)) * + NUM_PALETTEFX_PALETTES - + 1); + } else { + i %= NUM_PALETTEFX_PALETTES; + hsv.h = RGB_MATRIX_HUE_STEP * i; + } + rgb_matrix_sethsv_noeeprom(hsv.h, hsv.s, hsv.v); + } + } + + return i; +} + +static const uint16_t *palettefx_get_palette_data(void) { + return palettefx_palettes[palettefx_get_palette()]; +} + +static hsv_t palettefx_interp_color(const uint16_t *palette, uint8_t x) { + // Clamp `x` to [8, 247] and subtract 8, mapping to the range [0, 239]. + x = (x <= 8) ? 0 : ((x < 247) ? (x - 8) : 239); + // Get index into the palette, 0 <= i <= 14. + const uint8_t i = x >> 4; + // Fractional position between i and (i + 1). + const uint8_t frac = x << 4; + + // Look up palette colors at i and (i + 1). + hsv_t a = unpack_hsv16(pgm_read_word(&palette[i])); + hsv_t b = unpack_hsv16(pgm_read_word(&palette[i + 1])); + + // Linearly interpolate in HSV, accounting for wrapping in hue. + const uint8_t hue_wrap = 128 & (a.h >= b.h ? (a.h - b.h) : (b.h - a.h)); + return (hsv_t){ + .h = lerp8by8(a.h ^ hue_wrap, b.h ^ hue_wrap, frac) ^ hue_wrap, + .s = scale8(lerp8by8(a.s, b.s, frac), rgb_matrix_config.hsv.s), + .v = scale8(lerp8by8(a.v, b.v, frac), rgb_matrix_config.hsv.v), + }; +} + +static uint16_t palettefx_scaled_time(uint32_t timer, uint8_t scale) { + static uint16_t wrap_correction = 0; + static uint8_t last_high_byte = 0; + const uint8_t high_byte = (uint8_t)(timer >> 16); + + if (last_high_byte != high_byte) { + last_high_byte = high_byte; + wrap_correction += ((uint16_t)scale) << 8; + } + + return scale16by8(timer, scale) + wrap_correction; +} + +#endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS diff --git a/jack/rules.mk b/jack/rules.mk index f75ba4d..71ddad7 100644 --- a/jack/rules.mk +++ b/jack/rules.mk @@ -1,50 +1,49 @@ LTO_ENABLE = yes TOP_SYMBOLS = yes -NRKO_ENABLE = yes -COMBO_ENABLE = yes MAGIC_ENABLE = no +COMBO_ENABLE = yes +COMMAND_ENABLE = no +CONSOLE_ENABLE = no UNICODE_COMMON = yes +GRAVE_ESC_ENABLE = no EXTRAKEY_ENABLE = yes BOOTMAGIC_ENABLE = yes CAPS_WORD_ENABLE = yes TAP_DANCE_ENABLE = yes +SPACE_CADET_ENABLE = no AUTOCORRECT_ENABLE = yes MOUSE_JIGGLE_ENABLE = yes +CUSTOM_TAP_CODE_ENABLE = no DEBOUNCE_TYPE = asym_eager_defer_pk AVR_CFLAGS += -mrelax -INTROSPECTION_KEYMAP_C = jack.c +INTROSPECTION_KEYMAP_C = introspection.c -SRC += tapping.c +SRC += $(USER_PATH)/jack.c $(USER_PATH)/tapping.c ifeq ($(strip $(OLED_ENABLE)), yes) - SRC += oled.c + SRC += $(USER_PATH)/oled.c WPM_ENABLE = yes endif ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) - SRC += color.c + RGB_MATRIX_CUSTOM_USER = yes + SRC += $(USER_PATH)/color.c endif ifeq ($(strip $(UNICODE_COMMON)), yes) UNICODE_ENABLE = no - SRC += unicode.c -endif - -ifeq ($(PLATFORM), CHIBIOS) - RANDWORD = yes - EXTRAFLAGS += -Os -endif - -ifneq ($(findstring Gentoo, $(shell arm-none-eabi-gcc --version)),) - EXTRAFLAGS += -U_FORTIFY_SOURCE + SRC += $(USER_PATH)/unicode.c endif -ifeq ($(strip $(RANDWORD)), yes) - OPT_DEFS += -DRANDWORD +ifeq ($(strip $(CUSTOM_TAP_CODE_ENABLE)), yes) + OPT_DEFS += -DCUSTOM_TAP_CODE_ENABLE + SRC += $(USER_PATH)tap_code.c endif -ifeq ($(strip $(MOUSE_JIGGLE_ENABLE)), yes) - OPT_DEFS += -DMOUSE_JIGGLE_ENABLE - MOUSEKEY_ENABLE = yes - DEFERRED_EXEC_ENABLE = yes +ifeq ($(PLATFORM), CHIBIOS) + ifeq ($(MCU_SERIES), RP2040) + RP2040_MATH_IN_ROM = no + PROGRAM_CMD = doas picotool load $(BUILD_DIR)/$(TARGET).uf2 + endif + EXTRAFLAGS += -O3 endif diff --git a/jack/tap_code.c b/jack/tap_code.c new file mode 100644 index 0000000..a430200 --- /dev/null +++ b/jack/tap_code.c @@ -0,0 +1,159 @@ +// Copyright 2025 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#include "jack.h" + +#define TAP_CODE_BUFFER_SIZE 32 +#define NEXT_TAP_CODE_POS(p) p = ((p + 1) & (TAP_CODE_BUFFER_SIZE - 1)) + +#define CHECK_REGISTERED_MT(keycode) \ + (keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX && \ + (get_mods() & ((keycode & 0x0F00) >> 8))) + +#define PGM_LOADBIT(mem, pos) \ + ((pgm_read_byte(&((mem)[(pos) / 8])) >> ((pos) % 8)) & 1) + +typedef struct { + uint8_t code; + uint8_t mods; + uint16_t delay; + bool register_tap; +} tap_code_buffer; + +tap_code_buffer tap_codes[TAP_CODE_BUFFER_SIZE] = {0}; +static uint16_t process_pos = 0, queue_pos = 0; +static fast_timer_t process_timer = 0; + +void tap_code_buffer_init(void) { memset(&tap_codes, 0, sizeof(tap_codes)); } + +void tap_code_register(uint8_t code, uint8_t mods, uint16_t delay, + bool register_tap) { + if (code && !delay) { + if (mods) + register_mods(mods); + register_code(code); + unregister_code(code); + if (mods) + unregister_mods(mods); + return; + } + if (tap_codes[queue_pos].code) { + if (!process_timer) + process_tap_code_buffer(); + while (timer_elapsed_fast(process_timer) < tap_codes[process_pos].delay) + wait_ms(1); + process_tap_code_buffer(); + } + tap_codes[queue_pos].code = code; + tap_codes[queue_pos].mods = mods; + tap_codes[queue_pos].delay = delay; + tap_codes[queue_pos].register_tap = register_tap; + NEXT_TAP_CODE_POS(queue_pos); +} + +void process_tap_code_buffer(void) { + if (tap_codes[process_pos].code) { + if (!process_timer) { + if (tap_codes[process_pos].register_tap) { + if (tap_codes[process_pos].mods) { + add_weak_mods(tap_codes[process_pos].mods); + } + register_code(tap_codes[process_pos].code); + } + process_timer = timer_read_fast(); + } else if (timer_elapsed_fast(process_timer) >= + tap_codes[process_pos].delay) { + del_weak_mods(tap_codes[process_pos].mods); + unregister_code(tap_codes[process_pos].code); + tap_codes[process_pos].code = 0; + tap_codes[process_pos].mods = 0; + tap_codes[process_pos].delay = 0; + tap_codes[process_pos].register_tap = false; + process_timer = 0; + NEXT_TAP_CODE_POS(process_pos); + } + } +} + +void tap_code(uint8_t code) { + tap_code_register(code, 0, TAP_CODE_DELAY, true); +} + +void tap_code_chord(uint8_t code) { + register_code(code); + tap_code_register(code, 0, TAP_CODE_DELAY, false); +} + +void tap_code_delay(uint8_t code, uint16_t delay) { + tap_code_register(code, 0, delay, true); +} + +void tap_code16(uint16_t code) { + tap_code_register((uint8_t)code, extract_mod_bits(code), TAP_CODE_DELAY, + true); +} + +bool process_record_taps(uint16_t keycode, keyrecord_t *record) { + static fast_timer_t prev_interrupt = 0, prev_key_down = 0; + switch (keycode) { + case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: + case QK_MOD_TAP ... QK_MOD_TAP_MAX: + if (record->event.pressed && + ((timer_elapsed_fast(prev_interrupt) < TAPPING_TERM) || + (timer_elapsed_fast(prev_key_down) < 200) || + CHECK_REGISTERED_MT(keycode))) { + tap_code_chord(keycode & 0xFF); + record->tap.count = 0xF; + prev_interrupt = timer_read_fast(); + return false; + } + if (record->tap.count == 0xF) + return false; + if (record->tap.count > 1 && (keycode == ESCLWR || keycode == RSEBSP)) { + if (record->event.pressed) { + register_code(keycode & 0xFF); + return false; + } else { + unregister_code(keycode & 0xFF); + return false; + } + } + if (record->tap.count && record->event.pressed) { + if (keycode >= QK_MOD_TAP || keycode == ESCLWR || keycode == RSEBSP) + tap_code_chord(keycode & 0xFF); + else + tap_code(keycode & 0xFF); + return false; + } else if (record->tap.interrupted && + (keycode >= QK_MOD_TAP || keycode == ESCLWR || + keycode == RSEBSP)) { + tap_code_chord(keycode & 0xFF); + prev_interrupt = timer_read_fast(); + return false; + } + default: + if (record->event.pressed) + prev_key_down = timer_read_fast(); + break; + } + return true; +} + +extern const uint8_t ascii_to_shift_lut[16]; +extern const uint8_t ascii_to_keycode_lut[128]; + +void tap_char(char ascii_code) { + uint8_t keycode = pgm_read_byte(&ascii_to_keycode_lut[(uint8_t)ascii_code]); + bool shifted = PGM_LOADBIT(ascii_to_shift_lut, (uint8_t)ascii_code); + tap_code_register(keycode, shifted ? MOD_BIT(KC_LSFT) : 0, TAP_CODE_DELAY, + true); +} + +void tap_string(const char *str) { + while (1) { + char ascii_code = pgm_read_byte(str); + if (!ascii_code) + break; + tap_char(ascii_code); + ++str; + } +} diff --git a/jack/tapping.c b/jack/tapping.c index 91690d5..d58b70b 100644 --- a/jack/tapping.c +++ b/jack/tapping.c @@ -1,9 +1,9 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #include "jack.h" -#ifdef RANDWORD -#include "dict.h" -uint16_t word = 0; + +#ifndef CUSTOM_TAP_CODE_ENABLE +#define tap_string send_string_P #endif #define INTERCEPT_MOD_TAP(mod, keycode) \ @@ -14,64 +14,6 @@ uint16_t word = 0; } \ break; -static uint8_t select_word_state = NONE; - -bool process_select_word(uint16_t keycode, keyrecord_t *record) { - if (keycode == KC_LSFT || keycode == KC_RSFT) - return true; - if (keycode == SELWORD && record->event.pressed) { - const bool shifted = get_mods() & MOD_MASK_SHIFT; - if (!shifted) { - set_mods(MOD_BIT(KC_LCTL)); - if (select_word_state == NONE) { - send_keyboard_report(); - tap_code(KC_RGHT); - tap_code(KC_LEFT); - } - register_mods(MOD_BIT(KC_LSFT)); - register_code(KC_RGHT); - select_word_state = WORD; - } else { - if (select_word_state == NONE) { - clear_mods(); - send_keyboard_report(); - tap_code(KC_HOME); - register_mods(MOD_BIT(KC_LSFT)); - tap_code(KC_END); - set_mods(get_mods()); - select_word_state = FIRST_LINE; - } else { - register_code(KC_DOWN); - select_word_state = LINE; - } - } - return false; - } - switch (select_word_state) { - case WORD: - unregister_code(KC_RGHT); - unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL)); - select_word_state = SELECTED; - break; - case FIRST_LINE: - select_word_state = SELECTED; - break; - case LINE: - unregister_code(KC_DOWN); - select_word_state = SELECTED; - break; - case SELECTED: - if (keycode == KC_ESC) { - tap_code(KC_RGHT); - select_word_state = NONE; - return false; - } - default: - select_word_state = NONE; - } - return true; -} - uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case LWRSPC: @@ -88,6 +30,7 @@ uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { } } +#ifdef TAP_DANCE_ENABLE void td_reset(tap_dance_state_t *state, void *user_data) { clear_keyboard(); layer_clear(); @@ -128,14 +71,17 @@ void raise_paste(tap_dance_state_t *state, void *user_data) { else if (state->count == 1) tap_code16(C(S(KC_V))); } +#endif bool process_record_user(uint16_t keycode, keyrecord_t *record) { #ifdef UNICODE_COMMON_ENABLE if (!process_record_unicode(keycode, record)) return false; #endif - if (!process_select_word(keycode, record)) +#ifdef CUSTOM_TAP_CODE_ENABLE + if (!process_record_taps(keycode, record)) return false; +#endif #ifdef OLED_ENABLE if (record->event.pressed) { oled_timer_reset(); @@ -170,12 +116,15 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case UPDIR: if (record->event.pressed) - SEND_STRING("../"); + tap_string(PSTR("../")); break; - case NUKE: + case REMOVE: if (record->event.pressed) { - tap_code16(C(KC_A)); - SEND_STRING("\b```suggestion\n```"); + tap_string(PSTR("```suggestion\n```")); + tap_code(KC_UP); + tap_code(KC_UP); + tap_code(KC_ENT); + tap_code(KC_UP); } break; INTERCEPT_MOD_TAP(LALT_T, KC_EXLM) @@ -186,15 +135,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { INTERCEPT_MOD_TAP(RCTL_T, KC_ASTR) INTERCEPT_MOD_TAP(RGUI_T, KC_LPRN) INTERCEPT_MOD_TAP(RALT_T, KC_RPRN) - case RWORD: -#ifdef RANDWORD - word = rand() % NUM_WORDS; - if (record->event.pressed) { - send_string(dict[word]); - tap_code(KC_SPC); - } -#endif - break; } return true; } diff --git a/jack/unicode.c b/jack/unicode.c index 74c0ccc..a07a862 100644 --- a/jack/unicode.c +++ b/jack/unicode.c @@ -1,7 +1,18 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #include "jack.h" +enum unicode_mode { + NOMODE, + WIDE, + SCRIPT, + BLOCKS, + REGIONAL, + AUSSIE, + ZALGO, + SUPER +}; + uint8_t typing_mode = NOMODE; typedef uint32_t (*translator_function_t)(bool is_shifted, uint32_t keycode); @@ -157,7 +168,7 @@ DEFINE_UNICODE_LUT_TRANSLATOR(unicode_lut_translator_super, ); bool process_record_aussie(uint16_t keycode, keyrecord_t *record) { - bool is_shifted = (get_mods()) & MOD_MASK_SHIFT; + bool is_shifted = (get_mods())&MOD_MASK_SHIFT; if ((KC_A <= keycode) && (keycode <= KC_0)) { if (record->event.pressed) if (!process_record_glyph_replacement(keycode, record, @@ -222,20 +233,10 @@ bool process_record_zalgo(uint16_t keycode, keyrecord_t *record) { bool process_record_unicode(uint16_t keycode, keyrecord_t *record) { switch (keycode) { - case TABLE1: - if (record->event.pressed) { - send_unicode_string("┬──┬ ノ( ゜-゜ノ)"); - } - break; - case TABLE2: - if (record->event.pressed) { - send_unicode_string("(╯°□°)╯︵┻━┻"); - } - break; - case KC_NOMODE ... KC_SUPER: + case UC_NOMODE ... UC_SUPER: if (record->event.pressed) { - if (typing_mode != keycode - KC_NOMODE) - typing_mode = keycode - KC_NOMODE; + if (typing_mode != keycode - UC_NOMODE) + typing_mode = keycode - UC_NOMODE; else typing_mode = NOMODE; } diff --git a/keyboards/endgame/keyboard.json b/keyboards/endgame/keyboard.json new file mode 100644 index 0000000..f76e8ad --- /dev/null +++ b/keyboards/endgame/keyboard.json @@ -0,0 +1,58 @@ +{ + "manufacturer": "jack", + "board_name": "endgame", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "matrix_pins": { + "cols": ["GP27", "GP29", "GP28", "GP26", "GP15", "GP4", "GP3", "GP0", "GP1", "GP2"], + "rows": ["GP14", "GP13", "GP12", "GP11"] + }, + "processor": "RP2040", + "usb": { + "device_version": "1.0.0", + "pid": "0x6567", + "vid": "0x6A73" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 6, "y": 0}, + {"matrix": [0, 6], "x": 7, "y": 0}, + {"matrix": [0, 7], "x": 8, "y": 0}, + {"matrix": [0, 8], "x": 9, "y": 0}, + {"matrix": [0, 9], "x": 10, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1}, + {"matrix": [1, 1], "x": 1, "y": 1}, + {"matrix": [1, 2], "x": 2, "y": 1}, + {"matrix": [1, 3], "x": 3, "y": 1}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 6, "y": 1}, + {"matrix": [1, 6], "x": 7, "y": 1}, + {"matrix": [1, 7], "x": 8, "y": 1}, + {"matrix": [1, 8], "x": 9, "y": 1}, + {"matrix": [1, 9], "x": 10, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 6, "y": 2}, + {"matrix": [2, 6], "x": 7, "y": 2}, + {"matrix": [2, 7], "x": 8, "y": 2}, + {"matrix": [2, 8], "x": 9, "y": 2}, + {"matrix": [2, 9], "x": 10, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.5}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3, "w": 1.5}, + {"matrix": [3, 5], "x": 5.5, "y": 3, "w": 1.5}, + {"matrix": [3, 6], "x": 7, "y": 3}, + {"matrix": [3, 9], "x": 9.5, "y": 3, "w": 1.5} + ] + } + } +} diff --git a/keyboards/leftover30/keymaps/jack/keymap.c b/keyboards/endgame/keymaps/jack/keymap.c index 066d6d3..1a9c5cb 100644 --- a/keyboards/leftover30/keymaps/jack/keymap.c +++ b/keyboards/endgame/keymaps/jack/keymap.c @@ -1,20 +1,26 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-3.0-or-later #include "jack.h" // clang-format off const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = LAYOUT_jack( - ___BASE1___, KC_BSPC, + ___BASE1___, ___BASE2___, - ___BASE3___, - KC_MPLY, XXXXXXX, LWRSPC, C(S(KC_V)), RWORD + ___BASE3___, + ___BASE4___ ), [_LOWER] = LAYOUT_jack( - ___LOWER1___, KC_DEL, + ___LOWER1___, ___LOWER2___, ___LOWER3___, - KC_MUTE, _______, _______, RGB_MOD, RGB_TOG + ___LOWER4___ + ), + [_RAISE] = LAYOUT_jack( + ___RAISE1___, + ___RAISE2___, + ___RAISE3___, + ___RAISE4___ ) }; // clang-format on diff --git a/keyboards/grumpy/keyboard.json b/keyboards/grumpy/keyboard.json deleted file mode 100644 index 2ad7bf2..0000000 --- a/keyboards/grumpy/keyboard.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "keyboard_name": "grumpy", - "manufacturer": "jacks", - "maintainer": "pngu.org", - "processor": "RP2040", - "bootloader": "rp2040", - "diode_direction": "COL2ROW", - "matrix_pins" : { - "cols": ["GP26", "GP27", "GP28", "GP29", "GP6"], - "rows": ["GP7", "GP0", "GP1", "GP2", "GP4", "GP3"] - }, - "usb": { - "vid": "0x6A73", - "pid": "0x6279", - "device_version": "1.0.0" - }, - "layouts": { - "LAYOUT": { - "layout": [ - { "label": "w", "matrix": [0, 1], "x": 1, "y": 0 }, - { "label": "e", "matrix": [0, 2], "x": 2, "y": 0 }, - { "label": "r", "matrix": [0, 3], "x": 3, "y": 0 }, - { "label": "t", "matrix": [0, 4], "x": 4, "y": 0 }, - { "label": "y", "matrix": [3, 4], "x": 5, "y": 0 }, - { "label": "u", "matrix": [3, 3], "x": 6, "y": 0 }, - { "label": "i", "matrix": [3, 2], "x": 7, "y": 0 }, - { "label": "o", "matrix": [3, 1], "x": 8, "y": 0 }, - { "label": "a", "matrix": [1, 0], "x": 0, "y": 1 }, - { "label": "s", "matrix": [1, 1], "x": 1, "y": 1 }, - { "label": "d", "matrix": [1, 2], "x": 2, "y": 1 }, - { "label": "f", "matrix": [1, 3], "x": 3, "y": 1 }, - { "label": "g", "matrix": [1, 4], "x": 4, "y": 1 }, - { "label": "h", "matrix": [4, 4], "x": 5, "y": 1 }, - { "label": "j", "matrix": [4, 3], "x": 6, "y": 1 }, - { "label": "k", "matrix": [4, 2], "x": 7, "y": 1 }, - { "label": "l", "matrix": [4, 1], "x": 8, "y": 1 }, - { "label": ";", "matrix": [4, 0], "x": 9, "y": 1 }, - { "label": "z", "matrix": [2, 0], "x": 0, "y": 2 }, - { "label": "x", "matrix": [2, 1], "x": 1, "y": 2 }, - { "label": "c", "matrix": [2, 2], "x": 2, "y": 2 }, - { "label": "v", "matrix": [2, 3], "x": 3, "y": 2 }, - { "label": "b", "matrix": [2, 4], "x": 4, "y": 2 }, - { "label": "n", "matrix": [5, 4], "x": 5, "y": 2 }, - { "label": "m", "matrix": [5, 3], "x": 6, "y": 2 }, - { "label": ",", "matrix": [5, 2], "x": 7, "y": 2 }, - { "label": ".", "matrix": [5, 1], "x": 8, "y": 2 }, - { "label": "/", "matrix": [5, 0], "x": 9, "y": 2 } - ] - } - } -} diff --git a/keyboards/grumpy/keymaps/jack/keymap.c b/keyboards/grumpy/keymaps/jack/keymap.c deleted file mode 100644 index 1f6d0ad..0000000 --- a/keyboards/grumpy/keymaps/jack/keymap.c +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2024 [email protected] -// SPDX-License-Identifier: GPL-3.0-or-later -#include "jack.h" - -// clang-format off -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_BASE] = LAYOUT( - KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, - KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, - KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH - ) -}; -// clang-format on diff --git a/keyboards/grumpy/readme.md b/keyboards/grumpy/readme.md deleted file mode 100644 index 08c8bb2..0000000 --- a/keyboards/grumpy/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -### [grumpy](https://github.com/weteor/Grumpy) - - diff --git a/keyboards/leftover30/chconf.h b/keyboards/leftover30/chconf.h deleted file mode 100644 index 2add76c..0000000 --- a/keyboards/leftover30/chconf.h +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2024 [email protected] -// SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#define CH_CFG_ST_FREQUENCY 10000 -#define CH_CFG_OPTIMIZE_SPEED FALSE -#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE - -#include_next <chconf.h> diff --git a/keyboards/leftover30/config.h b/keyboards/leftover30/config.h deleted file mode 100644 index d9c5627..0000000 --- a/keyboards/leftover30/config.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2024 [email protected] -// SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#define WS2812_SPI_DRIVER SPID2 -#define WS2812_SPI_MOSI_PAL_MODE 0 -#define WS2812_SPI_SCK_PIN B13 -#define WS2812_EXTERNAL_PULLUP diff --git a/keyboards/leftover30/halconf.h b/keyboards/leftover30/halconf.h deleted file mode 100644 index 4ffc260..0000000 --- a/keyboards/leftover30/halconf.h +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2024 [email protected] -// SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#define HAL_USE_SPI TRUE - -#include_next <halconf.h> diff --git a/keyboards/leftover30/keyboard.json b/keyboards/leftover30/keyboard.json deleted file mode 100644 index 0a32fff..0000000 --- a/keyboards/leftover30/keyboard.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "keyboard_name": "leftover30", - "manufacturer": "jacks", - "maintainer": "pngu.org", - "processor": "STM32F072", - "bootloader": "stm32-dfu", - "diode_direction": "COL2ROW", - "encoder": { - "rotary": [ - {"pin_a": "B12", "pin_b": "B14"} - ] - }, - "features": { - "rgblight": true, - "encoder": true - }, - "matrix_pins": { - "cols": ["A15", "B9", "B8", "B7", "B6", "B5", "C14", "C15", "F1", "F0", "A1"], - "rows": ["B3", "B4", "C13", "A5"] - }, - "rgblight": { - "led_count": 7 - }, - "ws2812": { - "pin": "B15", - "driver": "spi" - }, - "usb": { - "pid": "0x6C6F", - "vid": "0x6A73", - "device_version": "1.0.0" - }, - "layouts": { - "LAYOUT": { - "layout": [ - {"matrix": [0, 0], "x": 0.5, "y": 0}, - {"matrix": [0, 1], "x": 1.5, "y": 0}, - {"matrix": [0, 2], "x": 2.5, "y": 0}, - {"matrix": [0, 3], "x": 3.5, "y": 0}, - {"matrix": [0, 4], "x": 4.5, "y": 0}, - {"matrix": [0, 5], "x": 5.5, "y": 0}, - {"matrix": [0, 6], "x": 6.5, "y": 0}, - {"matrix": [0, 7], "x": 7.5, "y": 0}, - {"matrix": [0, 8], "x": 8.5, "y": 0}, - {"matrix": [0, 9], "x": 9.5, "y": 0}, - {"matrix": [0, 10], "x": 10.5, "y": 0}, - {"matrix": [1, 0], "x": 0.75, "y": 1}, - {"matrix": [1, 1], "x": 1.75, "y": 1}, - {"matrix": [1, 2], "x": 2.75, "y": 1}, - {"matrix": [1, 3], "x": 3.75, "y": 1}, - {"matrix": [1, 4], "x": 4.75, "y": 1}, - {"matrix": [1, 5], "x": 5.75, "y": 1}, - {"matrix": [1, 6], "x": 6.75, "y": 1}, - {"matrix": [1, 7], "x": 7.75, "y": 1}, - {"matrix": [1, 8], "x": 8.75, "y": 1}, - {"matrix": [1, 10], "x": 9.75, "y": 1, "w": 1.75}, - {"matrix": [2, 0], "x": 1, "y": 2}, - {"matrix": [2, 1], "x": 2, "y": 2}, - {"matrix": [2, 2], "x": 3, "y": 2}, - {"matrix": [2, 3], "x": 4, "y": 2}, - {"matrix": [2, 4], "x": 5, "y": 2}, - {"matrix": [2, 5], "x": 6, "y": 2}, - {"matrix": [2, 6], "x": 7, "y": 2}, - {"matrix": [2, 7], "x": 8, "y": 2}, - {"matrix": [2, 8], "x": 9, "y": 2}, - {"matrix": [2, 9], "x": 10, "y": 2, "w": 1.25}, - {"matrix": [3, 0], "x": 0, "y": 3}, - {"matrix": [3, 1], "x": 1.25, "y": 3, "w": 1.25}, - {"matrix": [3, 5], "x": 2.5, "y": 3, "w": 6.25}, - {"matrix": [3, 8], "x": 8.75, "y": 3}, - {"matrix": [3, 9], "x": 9.75, "y": 3, "w": 1.5} - ] - } - } -} diff --git a/keyboards/leftover30/mcuconf.h b/keyboards/leftover30/mcuconf.h deleted file mode 100644 index 10914c8..0000000 --- a/keyboards/leftover30/mcuconf.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2024 [email protected] -// SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include_next <mcuconf.h> - -#undef STM32_SPI_USE_SPI2 -#define STM32_SPI_USE_SPI2 TRUE diff --git a/keyboards/leftover30/readme.md b/keyboards/leftover30/readme.md deleted file mode 100644 index 7eb9850..0000000 --- a/keyboards/leftover30/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -### leftover30 -originally designed by [marksard](https://github.com/marksard/Keyboards/tree/master/leftover30), but the pcb seems to be mia...\ -(arm) pcb redesigned by [tominabox1](https://github.com/tominabox1/) with a somewhat jank case from p3d. - - diff --git a/keyboards/locus/keymaps/jack/keymap.c b/keyboards/locus/keymaps/jack/keymap.c index 0779bc5..7c2915b 100644 --- a/keyboards/locus/keymaps/jack/keymap.c +++ b/keyboards/locus/keymaps/jack/keymap.c @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-3.0-or-later #include "jack.h" diff --git a/keyboards/pseusplit/config.h b/keyboards/pseusplit/config.h new file mode 100644 index 0000000..16bd734 --- /dev/null +++ b/keyboards/pseusplit/config.h @@ -0,0 +1,19 @@ +// Copyright 2025 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define AZOTEQ_IQS5XX_TPS43 + +#define IS31FL3733_I2C_ADDRESS_1 IS31FL3733_I2C_ADDRESS_GND_GND + +#define SPI_DRIVER SPID1 +#define SPI_SCK_PIN B3 +#define SPI_MOSI_PIN B5 +#define SPI_MISO_PIN B4 + +#define LCD_DC_PIN D1 +#define LCD_CS_PIN D3 +#define LCD_RST_PIN D2 +#define LCD_SPI_DIVISOR 4 +#define ST7789_HEIGHT 240 +#define ST7789_WIDTH 240 diff --git a/keyboards/pseusplit/halconf.h b/keyboards/pseusplit/halconf.h new file mode 100644 index 0000000..7470f67 --- /dev/null +++ b/keyboards/pseusplit/halconf.h @@ -0,0 +1,9 @@ +// Copyright 2025 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define HAL_USE_I2C TRUE + +#define HAL_USE_SPI TRUE + +#include_next <halconf.h> diff --git a/keyboards/pseusplit/keyboard.json b/keyboards/pseusplit/keyboard.json new file mode 100644 index 0000000..000c680 --- /dev/null +++ b/keyboards/pseusplit/keyboard.json @@ -0,0 +1,110 @@ +{ + "manufacturer": "pngu.org", + "keyboard_name": "pseusplit", + "maintainer": "jack", + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "pointing_device": true, + "quantum_painter": false, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["C15", "C14", "C13", "B9", "B8", "A9", "A8", "B15", "B14", "B13"], + "rows": ["F1", "F0", "A10", "A15"] + }, + "processor": "STM32G0B1", + "rgb_matrix": { + "driver": "is31fl3733", + "layout": [ + { "matrix": [0, 0], "x": 0, "y": 0, "flags": 4 }, + { "matrix": [0, 1], "x": 25, "y": 0, "flags": 4 }, + { "matrix": [0, 2], "x": 50, "y": 0, "flags": 4 }, + { "matrix": [0, 3], "x": 75, "y": 0, "flags": 4 }, + { "matrix": [0, 4], "x": 100, "y": 0, "flags": 4 }, + { "matrix": [0, 5], "x": 125, "y": 0, "flags": 4 }, + { "matrix": [0, 6], "x": 150, "y": 0, "flags": 4 }, + { "matrix": [0, 7], "x": 175, "y": 0, "flags": 4 }, + { "matrix": [0, 8], "x": 200, "y": 0, "flags": 4 }, + { "matrix": [0, 9], "x": 224, "y": 0, "flags": 4 }, + { "matrix": [1, 0], "x": 0, "y": 21, "flags": 4 }, + { "matrix": [1, 1], "x": 25, "y": 21, "flags": 4 }, + { "matrix": [1, 2], "x": 50, "y": 21, "flags": 4 }, + { "matrix": [1, 3], "x": 75, "y": 21, "flags": 4 }, + { "matrix": [1, 4], "x": 100, "y": 21, "flags": 4 }, + { "matrix": [1, 5], "x": 125, "y": 21, "flags": 4 }, + { "matrix": [1, 6], "x": 150, "y": 21, "flags": 4 }, + { "matrix": [1, 7], "x": 175, "y": 21, "flags": 4 }, + { "matrix": [1, 8], "x": 200, "y": 21, "flags": 4 }, + { "matrix": [1, 9], "x": 224, "y": 21, "flags": 4 }, + { "matrix": [2, 0], "x": 0, "y": 42, "flags": 4 }, + { "matrix": [2, 1], "x": 25, "y": 42, "flags": 4 }, + { "matrix": [2, 2], "x": 50, "y": 42, "flags": 4 }, + { "matrix": [2, 3], "x": 75, "y": 42, "flags": 4 }, + { "matrix": [2, 4], "x": 100, "y": 42, "flags": 4 }, + { "matrix": [2, 5], "x": 125, "y": 42, "flags": 4 }, + { "matrix": [2, 6], "x": 150, "y": 42, "flags": 4 }, + { "matrix": [2, 7], "x": 175, "y": 42, "flags": 4 }, + { "matrix": [2, 8], "x": 200, "y": 42, "flags": 4 }, + { "matrix": [2, 9], "x": 224, "y": 42, "flags": 4 }, + { "matrix": [3, 2], "x": 50, "y": 64, "flags": 4 }, + { "matrix": [3, 3], "x": 75, "y": 64, "flags": 4 }, + { "matrix": [3, 4], "x": 100, "y": 64, "flags": 4 }, + { "matrix": [3, 5], "x": 125, "y": 64, "flags": 4 }, + { "matrix": [3, 6], "x": 150, "y": 64, "flags": 4 }, + { "matrix": [3, 7], "x": 175, "y": 64, "flags": 4 } + ] + }, + "url": "https://git.pngu.org/pseusplit", + "usb": { + "device_version": "1.0.0", + "pid": "0x7073", + "vid": "0x6A73" + }, + "layouts": { + "LAYOUT": { + "layout": [ + { "matrix": [0, 0], "x": 0, "y": 0 }, + { "matrix": [0, 1], "x": 1, "y": 0 }, + { "matrix": [0, 2], "x": 2, "y": 0 }, + { "matrix": [0, 3], "x": 3, "y": 0 }, + { "matrix": [0, 4], "x": 4, "y": 0 }, + { "matrix": [0, 5], "x": 5, "y": 0 }, + { "matrix": [0, 6], "x": 6, "y": 0 }, + { "matrix": [0, 7], "x": 7, "y": 0 }, + { "matrix": [0, 8], "x": 8, "y": 0 }, + { "matrix": [0, 9], "x": 9, "y": 0 }, + { "matrix": [1, 0], "x": 0, "y": 1 }, + { "matrix": [1, 1], "x": 1, "y": 1 }, + { "matrix": [1, 2], "x": 2, "y": 1 }, + { "matrix": [1, 3], "x": 3, "y": 1 }, + { "matrix": [1, 4], "x": 4, "y": 1 }, + { "matrix": [1, 5], "x": 5, "y": 1 }, + { "matrix": [1, 6], "x": 6, "y": 1 }, + { "matrix": [1, 7], "x": 7, "y": 1 }, + { "matrix": [1, 8], "x": 8, "y": 1 }, + { "matrix": [1, 9], "x": 9, "y": 1 }, + { "matrix": [2, 0], "x": 0, "y": 2 }, + { "matrix": [2, 1], "x": 1, "y": 2 }, + { "matrix": [2, 2], "x": 2, "y": 2 }, + { "matrix": [2, 3], "x": 3, "y": 2 }, + { "matrix": [2, 4], "x": 4, "y": 2 }, + { "matrix": [2, 5], "x": 5, "y": 2 }, + { "matrix": [2, 6], "x": 6, "y": 2 }, + { "matrix": [2, 7], "x": 7, "y": 2 }, + { "matrix": [2, 8], "x": 8, "y": 2 }, + { "matrix": [2, 9], "x": 9, "y": 2 }, + { "matrix": [3, 2], "x": 2, "y": 3 }, + { "matrix": [3, 3], "x": 3, "y": 3 }, + { "matrix": [3, 4], "x": 4, "y": 3 }, + { "matrix": [3, 5], "x": 5, "y": 3 }, + { "matrix": [3, 6], "x": 6, "y": 3 }, + { "matrix": [3, 7], "x": 7, "y": 3 } + ] + } + } +} diff --git a/keyboards/pseusplit/keymaps/default/keymap.json b/keyboards/pseusplit/keymaps/default/keymap.json new file mode 100644 index 0000000..d697741 --- /dev/null +++ b/keyboards/pseusplit/keymaps/default/keymap.json @@ -0,0 +1,13 @@ +{ + "keyboard": "pseusplit", + "keymap": "default", + "layout": "LAYOUT", + "layers": [ + [ + "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", + "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SCLN", + "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", + "KC_ESC", "KC_BSPC", "KC_TAB", "KC_SPC", "KC_ENT", "KC_CAPS" + ] + ] +} diff --git a/keyboards/pseusplit/keymaps/jack/keymap.c b/keyboards/pseusplit/keymaps/jack/keymap.c new file mode 100644 index 0000000..1a9c5cb --- /dev/null +++ b/keyboards/pseusplit/keymaps/jack/keymap.c @@ -0,0 +1,26 @@ +// Copyright 2025 [email protected] +// SPDX-License-Identifier: GPL-3.0-or-later +#include "jack.h" + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_jack( + ___BASE1___, + ___BASE2___, + ___BASE3___, + ___BASE4___ + ), + [_LOWER] = LAYOUT_jack( + ___LOWER1___, + ___LOWER2___, + ___LOWER3___, + ___LOWER4___ + ), + [_RAISE] = LAYOUT_jack( + ___RAISE1___, + ___RAISE2___, + ___RAISE3___, + ___RAISE4___ + ) +}; +// clang-format on diff --git a/keyboards/pseusplit/mcuconf.h b/keyboards/pseusplit/mcuconf.h new file mode 100644 index 0000000..f600857 --- /dev/null +++ b/keyboards/pseusplit/mcuconf.h @@ -0,0 +1,11 @@ +// Copyright 2025 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next <mcuconf.h> + +#undef STM32_I2C_USE_I2C1 +#define STM32_I2C_USE_I2C1 TRUE + +#undef STM32_SPI_USE_SPI1 +#define STM32_SPI_USE_SPI1 TRUE diff --git a/keyboards/pseusplit/pseusplit.c b/keyboards/pseusplit/pseusplit.c new file mode 100644 index 0000000..1281783 --- /dev/null +++ b/keyboards/pseusplit/pseusplit.c @@ -0,0 +1,73 @@ +// Copyright 2025 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#include "quantum.h" + +#if defined(QUANTUM_PAINTER_ENABLE) && defined(POINTING_DEVICE_ENABLE) +#error "Cannot enable both Quantum Painter and Pointing Device" +#endif + +#ifdef QUANTUM_PAINTER_ENABLE +#include "qp.h" +static painter_device_t display; + +void keyboard_post_init_kb(void) { + display = + qp_st7789_make_spi_device(ST7789_HEIGHT, ST7789_WIDTH, LCD_CS_PIN, + LCD_DC_PIN, LCD_RST_PIN, LCD_SPI_DIVISOR, 0); + qp_init(display, QP_ROTATION_0); + keyboard_post_init_user(); +} + +void suspend_power_down_kb(void) { + qp_power(display, false); + suspend_power_down_user(); +} + +void suspend_wakeup_init_kb(void) { + qp_power(display, true); + suspend_wakeup_init_user(); +} +#endif // QUANTUM_PAINTER_ENABLE + +#ifdef RGB_MATRIX_ENABLE +const is31fl3733_led_t PROGMEM g_is31fl3733_leds[IS31FL3733_LED_COUNT] = { + // clang-format off + {0, SW2_CS1, SW3_CS1, SW1_CS1}, + {0, SW2_CS2, SW3_CS2, SW1_CS2}, + {0, SW2_CS3, SW3_CS3, SW1_CS3}, + {0, SW2_CS4, SW3_CS4, SW1_CS4}, + {0, SW2_CS5, SW3_CS5, SW1_CS5}, + {0, SW2_CS6, SW3_CS6, SW1_CS6}, + {0, SW2_CS7, SW3_CS7, SW1_CS7}, + {0, SW2_CS8, SW3_CS8, SW1_CS8}, + {0, SW2_CS9, SW3_CS9, SW1_CS9}, + {0, SW2_CS10, SW3_CS10, SW1_CS10}, + {0, SW5_CS1, SW6_CS1, SW4_CS1}, + {0, SW5_CS2, SW6_CS2, SW4_CS2}, + {0, SW5_CS3, SW6_CS3, SW4_CS3}, + {0, SW5_CS4, SW6_CS4, SW4_CS4}, + {0, SW5_CS5, SW6_CS5, SW4_CS5}, + {0, SW5_CS6, SW6_CS6, SW4_CS6}, + {0, SW5_CS7, SW6_CS7, SW4_CS7}, + {0, SW5_CS8, SW6_CS8, SW4_CS8}, + {0, SW5_CS9, SW6_CS9, SW4_CS9}, + {0, SW5_CS10, SW6_CS10, SW4_CS10}, + {0, SW8_CS1, SW9_CS1, SW7_CS1}, + {0, SW8_CS2, SW9_CS2, SW7_CS2}, + {0, SW8_CS3, SW9_CS3, SW7_CS3}, + {0, SW8_CS4, SW9_CS4, SW7_CS4}, + {0, SW8_CS5, SW9_CS5, SW7_CS5}, + {0, SW8_CS6, SW9_CS6, SW7_CS6}, + {0, SW8_CS7, SW9_CS7, SW7_CS7}, + {0, SW8_CS8, SW9_CS8, SW7_CS8}, + {0, SW8_CS9, SW9_CS9, SW7_CS9}, + {0, SW8_CS10, SW9_CS10, SW7_CS10}, + {0, SW10_CS3, SW12_CS3, SW10_CS3}, + {0, SW10_CS4, SW12_CS4, SW10_CS4}, + {0, SW10_CS5, SW12_CS5, SW10_CS5}, + {0, SW10_CS6, SW12_CS6, SW10_CS6}, + {0, SW10_CS7, SW12_CS7, SW10_CS7}, + {0, SW10_CS8, SW12_CS8, SW10_CS8}, + // clang-format on +}; +#endif // RGB_MATRIX_ENABLE diff --git a/keyboards/pseusplit/readme.md b/keyboards/pseusplit/readme.md new file mode 100644 index 0000000..8d55876 --- /dev/null +++ b/keyboards/pseusplit/readme.md @@ -0,0 +1,22 @@ +# Pseusplit + +* Keyboard Maintainer: [Jack Sangdahl](https://github.com/waffle87) +* Hardware Supported: PCBs with integrated STM32G0B1 microcontroller +* Hardware Availability: [git/pseusplit](https://git.pngu.org/pseusplit) + +Make example for this keyboard (after setting up your build environment): + + make pseusplit:default + +Flashing example for this keyboard: + + make pseusplit:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader in 3 ways: + +* **Bootmagic reset**: Hold down the key at (0,0) in the matrix +* **Physical reset button**: Briefly press the button on the back of the PCB diff --git a/keyboards/pseusplit/rules.mk b/keyboards/pseusplit/rules.mk new file mode 100644 index 0000000..fa4968a --- /dev/null +++ b/keyboards/pseusplit/rules.mk @@ -0,0 +1,2 @@ +POINTING_DEVICE_DRIVER = azoteq_iqs5xx +QUANTUM_PAINTER_DRIVERS += st7789_spi diff --git a/keyboards/sweep/config.h b/keyboards/sweep/config.h index e6ef7f3..a172b9d 100644 --- a/keyboards/sweep/config.h +++ b/keyboards/sweep/config.h @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #pragma once @@ -8,32 +8,22 @@ #define RP2040_BOOTLOADER_DOUBLE_TAP_RESET -#ifdef HAL_USE_SPI #define SPI_DRIVER SPID0 #define SPI_SCK_PIN GP6 #define SPI_MOSI_PIN GP3 -#define SPI_MISO_PIN GP5 -#endif +#define SPI_MISO_PIN GP4 -#ifdef QUANTUM_PAINTER_ENABLE -#define LS0XX_CS_PIN GP7 -#define LS0XX_DISPLAY_HEIGHT 160 -#define LS0XX_DISPLAY_WIDTH 68 +#define LCD_CS_PIN GP5 +#define LCD_DC_PIN GP6 +#define LCD_RST_PIN GP28 +#define LCD_DISPLAY_WIDTH 135 +#define LCD_DISPLAY_HEIGHT 240 #define LCD_SPI_DIVISOR 4 -#endif -#ifdef POINTING_DEVICE_ENABLE -#define POINTING_DEVICE_CS_PIN GP4 -#define CIRQUE_PINNACLE_CURVED_OVERLAY -#define CIRQUE_PINNACLE_TAP_ENABLE -#define CIRQUE_PINNACLE_SECONDARY_TAP_ENABLE -#define CIRQUE_PINNACLE_DIAMETER_MM 35 -#define SPLIT_POINTING_ENABLE -#define POINTING_DEVICE_RIGHT -#endif +#define BACKLIGHT_PWM_DRIVER PWMD3 +#define BACKLIGHT_PWM_CHANNEL 2 -#ifdef HAL_USE_I2C -#define I2C_DRIVER I2CD1 -#define I2C1_SDA_PIN GP3 -#define I2C1_SCL_PIN GP6 -#endif +#define ADC_RESOLUTION 12 +#define ADC_SATURATION ((1 << 12) - 1) +#define ADC_CURRENT_PIN GP26 +#define ADC_VOLTAGE_PIN GP27 diff --git a/keyboards/sweep/halconf.h b/keyboards/sweep/halconf.h index 63f81cd..f47c7d4 100644 --- a/keyboards/sweep/halconf.h +++ b/keyboards/sweep/halconf.h @@ -1,8 +1,9 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#define HAL_USE_ADC TRUE #define HAL_USE_SPI TRUE -#define HAL_USE_I2C FALSE +#define HAL_USE_PWM TRUE #include_next <halconf.h> diff --git a/keyboards/sweep/keyboard.json b/keyboards/sweep/keyboard.json index d625fc9..2e7ef33 100644 --- a/keyboards/sweep/keyboard.json +++ b/keyboards/sweep/keyboard.json @@ -1,143 +1,146 @@ { - "manufacturer": "pngu.org", - "keyboard_name": "sweep", - "maintainer": "jack", - "bootloader": "rp2040", - "features": { - "bootmagic": true, - "oled": false, - "pointing_device": true, - "quantum_painter": true, - "rgb_matrix": true + "manufacturer": "pngu.org", + "keyboard_name": "sweep", + "maintainer": "jack", + "bootloader": "rp2040", + "features": { + "backlight": true, + "bootmagic": true, + "quantum_painter": true, + "rgb_matrix": true + }, + "backlight": { + "pin": "GP7" + }, + "matrix_pins": { + "direct": [ + ["GP18", "GP13", "GP12", "GP24", "GP22"], + ["GP16", "GP14", "GP10", "GP25", "GP21"], + ["GP17", "GP15", "GP11", "GP9", "GP23"], + [null, null, null, "GP19", "GP20"] + ] + }, + "processor": "RP2040", + "rgb_matrix": { + "driver": "ws2812", + "layout": [ + { "matrix": [3, 3], "x": 71, "y": 60, "flags": 4 }, + { "matrix": [3, 4], "x": 92, "y": 64, "flags": 4 }, + { "matrix": [2, 4], "x": 81, "y": 39, "flags": 4 }, + { "matrix": [2, 3], "x": 61, "y": 36, "flags": 4 }, + { "matrix": [2, 2], "x": 41, "y": 32, "flags": 4 }, + { "matrix": [2, 1], "x": 20, "y": 37, "flags": 4 }, + { "matrix": [2, 0], "x": 0, "y": 47, "flags": 4 }, + { "matrix": [1, 0], "x": 0, "y": 31, "flags": 4 }, + { "matrix": [1, 1], "x": 20, "y": 21, "flags": 4 }, + { "matrix": [1, 2], "x": 41, "y": 16, "flags": 4 }, + { "matrix": [1, 3], "x": 61, "y": 20, "flags": 4 }, + { "matrix": [1, 4], "x": 81, "y": 23, "flags": 4 }, + { "matrix": [0, 4], "x": 81, "y": 7, "flags": 4 }, + { "matrix": [0, 3], "x": 61, "y": 4, "flags": 4 }, + { "matrix": [0, 2], "x": 41, "y": 0, "flags": 4 }, + { "matrix": [0, 1], "x": 20, "y": 5, "flags": 4 }, + { "matrix": [0, 0], "x": 0, "y": 15, "flags": 4 }, + { "x": 10, "y": 14, "flags": 2 }, + { "x": 71, "y": 6, "flags": 2 }, + { "x": 83, "y": 56, "flags": 2 }, + { "x": 10, "y": 45, "flags": 2 }, + { "matrix": [7, 1], "x": 132, "y": 64, "flags": 4 }, + { "matrix": [7, 0], "x": 153, "y": 60, "flags": 4 }, + { "matrix": [6, 0], "x": 143, "y": 39, "flags": 4 }, + { "matrix": [6, 1], "x": 163, "y": 36, "flags": 4 }, + { "matrix": [6, 2], "x": 183, "y": 32, "flags": 4 }, + { "matrix": [6, 3], "x": 204, "y": 37, "flags": 4 }, + { "matrix": [6, 4], "x": 224, "y": 47, "flags": 4 }, + { "matrix": [5, 4], "x": 224, "y": 31, "flags": 4 }, + { "matrix": [5, 3], "x": 204, "y": 21, "flags": 4 }, + { "matrix": [5, 2], "x": 183, "y": 16, "flags": 4 }, + { "matrix": [5, 1], "x": 163, "y": 20, "flags": 4 }, + { "matrix": [5, 0], "x": 143, "y": 23, "flags": 4 }, + { "matrix": [4, 0], "x": 143, "y": 7, "flags": 4 }, + { "matrix": [4, 1], "x": 163, "y": 4, "flags": 4 }, + { "matrix": [4, 2], "x": 183, "y": 0, "flags": 4 }, + { "matrix": [4, 3], "x": 204, "y": 5, "flags": 4 }, + { "matrix": [4, 4], "x": 224, "y": 15, "flags": 4 }, + { "x": 214, "y": 14, "flags": 2 }, + { "x": 153, "y": 6, "flags": 2 }, + { "x": 144, "y": 56, "flags": 2 }, + { "x": 214, "y": 45, "flags": 2 } + ], + "split_count": [21, 21], + "sleep": true + }, + "split": { + "enabled": true, + "handedness": { + "pin": "GP8" }, "matrix_pins": { + "right": { "direct": [ - ["GP18", "GP13", "GP12", "GP24", "GP22"], - ["GP16", "GP14", "GP10", "GP25", "GP21"], - ["GP17", "GP15", "GP11", "GP9", "GP23"], - [null, null, null, "GP19", "GP20"] + ["GP25", "GP21", "GP17", "GP16", "GP13"], + ["GP24", "GP20", "GP18", "GP15", "GP12"], + ["GP22", "GP23", "GP19", "GP14", "GP11"], + ["GP10", "GP9", null, null, null] ] + } }, - "processor": "RP2040", - "rgb_matrix": { - "driver": "ws2812", - "layout": [ - {"matrix": [3, 3], "x": 71, "y": 60, "flags": 4}, - {"matrix": [3, 4], "x": 92, "y": 64, "flags": 4}, - {"matrix": [2, 4], "x": 81, "y": 39, "flags": 4}, - {"matrix": [2, 3], "x": 61, "y": 36, "flags": 4}, - {"matrix": [2, 2], "x": 41, "y": 32, "flags": 4}, - {"matrix": [2, 1], "x": 20, "y": 37, "flags": 4}, - {"matrix": [2, 0], "x": 0, "y": 47, "flags": 4}, - {"matrix": [1, 0], "x": 0, "y": 31, "flags": 4}, - {"matrix": [1, 1], "x": 20, "y": 21, "flags": 4}, - {"matrix": [1, 2], "x": 41, "y": 16, "flags": 4}, - {"matrix": [1, 3], "x": 61, "y": 20, "flags": 4}, - {"matrix": [1, 4], "x": 81, "y": 23, "flags": 4}, - {"matrix": [0, 4], "x": 81, "y": 7, "flags": 4}, - {"matrix": [0, 3], "x": 61, "y": 4, "flags": 4}, - {"matrix": [0, 2], "x": 41, "y": 0, "flags": 4}, - {"matrix": [0, 1], "x": 20, "y": 5, "flags": 4}, - {"matrix": [0, 0], "x": 0, "y": 15, "flags": 4}, - {"x": 10, "y": 14, "flags": 2}, - {"x": 71, "y": 6, "flags": 2}, - {"x": 83, "y": 56, "flags": 2}, - {"x": 10, "y": 45, "flags": 2}, - {"matrix": [7, 1], "x": 132, "y": 64, "flags": 4}, - {"matrix": [7, 0], "x": 153, "y": 60, "flags": 4}, - {"matrix": [6, 0], "x": 143, "y": 39, "flags": 4}, - {"matrix": [6, 1], "x": 163, "y": 36, "flags": 4}, - {"matrix": [6, 2], "x": 183, "y": 32, "flags": 4}, - {"matrix": [6, 3], "x": 204, "y": 37, "flags": 4}, - {"matrix": [6, 4], "x": 224, "y": 47, "flags": 4}, - {"matrix": [5, 4], "x": 224, "y": 31, "flags": 4}, - {"matrix": [5, 3], "x": 204, "y": 21, "flags": 4}, - {"matrix": [5, 2], "x": 183, "y": 16, "flags": 4}, - {"matrix": [5, 1], "x": 163, "y": 20, "flags": 4}, - {"matrix": [5, 0], "x": 143, "y": 23, "flags": 4}, - {"matrix": [4, 0], "x": 143, "y": 7, "flags": 4}, - {"matrix": [4, 1], "x": 163, "y": 4, "flags": 4}, - {"matrix": [4, 2], "x": 183, "y": 0, "flags": 4}, - {"matrix": [4, 3], "x": 204, "y": 5, "flags": 4}, - {"matrix": [4, 4], "x": 224, "y": 15, "flags": 4}, - {"x": 214, "y": 14, "flags": 2}, - {"x": 153, "y": 6, "flags": 2}, - {"x": 144, "y": 56, "flags": 2}, - {"x": 214, "y": 45, "flags": 2} - ], - "split_count": [21, 21] - }, - "split": { - "enabled": true, - "handedness": { - "pin": "GP8" - }, - "matrix_pins": { - "right": { - "direct": [ - ["GP25", "GP22", "GP17", "GP16", "GP13"], - ["GP24", "GP20", "GP18", "GP15", "GP12"], - ["GP23", "GP21", "GP19", "GP14", "GP11"], - ["GP10", "GP9", null, null, null] - ] - } - }, - "serial": { - "driver": "vendor" - } - }, - "url": "https://git.pngu.org/sweep", - "usb": { - "device_version": "1.0.0", - "pid": "0x7370", - "vid": "0x6A73" - }, - "ws2812": { - "driver": "vendor", - "pin": "GP2" - }, - "community_layouts": ["split_3x5_2"], - "layout_aliases": { - "LAYOUT": "LAYOUT_split_3x5_2" - }, - "layouts": { - "LAYOUT_split_3x5_2": { - "layout": [ - {"matrix": [0, 0], "x": 0, "y": 0.25}, - {"matrix": [0, 1], "x": 1, "y": 0.125}, - {"matrix": [0, 2], "x": 2, "y": 0}, - {"matrix": [0, 3], "x": 3, "y": 0.125}, - {"matrix": [0, 4], "x": 4, "y": 0.25}, - {"matrix": [4, 0], "x": 7, "y": 0.25}, - {"matrix": [4, 1], "x": 8, "y": 0.125}, - {"matrix": [4, 2], "x": 9, "y": 0}, - {"matrix": [4, 3], "x": 10, "y": 0.125}, - {"matrix": [4, 4], "x": 11, "y": 0.25}, - {"matrix": [1, 0], "x": 0, "y": 1.25}, - {"matrix": [1, 1], "x": 1, "y": 1.125}, - {"matrix": [1, 2], "x": 2, "y": 1}, - {"matrix": [1, 3], "x": 3, "y": 1.125}, - {"matrix": [1, 4], "x": 4, "y": 1.25}, - {"matrix": [5, 0], "x": 7, "y": 1.25}, - {"matrix": [5, 1], "x": 8, "y": 1.125}, - {"matrix": [5, 2], "x": 9, "y": 1}, - {"matrix": [5, 3], "x": 10, "y": 1.125}, - {"matrix": [5, 4], "x": 11, "y": 1.25}, - {"matrix": [2, 0], "x": 0, "y": 2.25}, - {"matrix": [2, 1], "x": 1, "y": 2.125}, - {"matrix": [2, 2], "x": 2, "y": 2}, - {"matrix": [2, 3], "x": 3, "y": 2.125}, - {"matrix": [2, 4], "x": 4, "y": 2.25}, - {"matrix": [6, 0], "x": 7, "y": 2.25}, - {"matrix": [6, 1], "x": 8, "y": 2.125}, - {"matrix": [6, 2], "x": 9, "y": 2}, - {"matrix": [6, 3], "x": 10, "y": 2.125}, - {"matrix": [6, 4], "x": 11, "y": 2.25}, - {"matrix": [3, 3], "x": 3.5, "y": 3.25}, - {"matrix": [3, 4], "x": 4.5, "y": 3.5}, - {"matrix": [7, 0], "x": 6.5, "y": 3.5}, - {"matrix": [7, 1], "x": 7.5, "y": 3.25} - ] - } + "serial": { + "driver": "vendor" + } + }, + "url": "https://git.pngu.org/sweep", + "usb": { + "device_version": "1.0.0", + "pid": "0x7370", + "vid": "0x6A73" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP2" + }, + "community_layouts": ["split_3x5_2"], + "layout_aliases": { + "LAYOUT": "LAYOUT_split_3x5_2" + }, + "layouts": { + "LAYOUT_split_3x5_2": { + "layout": [ + { "matrix": [0, 0], "x": 0, "y": 0.25 }, + { "matrix": [0, 1], "x": 1, "y": 0.125 }, + { "matrix": [0, 2], "x": 2, "y": 0 }, + { "matrix": [0, 3], "x": 3, "y": 0.125 }, + { "matrix": [0, 4], "x": 4, "y": 0.25 }, + { "matrix": [4, 0], "x": 7, "y": 0.25 }, + { "matrix": [4, 1], "x": 8, "y": 0.125 }, + { "matrix": [4, 2], "x": 9, "y": 0 }, + { "matrix": [4, 3], "x": 10, "y": 0.125 }, + { "matrix": [4, 4], "x": 11, "y": 0.25 }, + { "matrix": [1, 0], "x": 0, "y": 1.25 }, + { "matrix": [1, 1], "x": 1, "y": 1.125 }, + { "matrix": [1, 2], "x": 2, "y": 1 }, + { "matrix": [1, 3], "x": 3, "y": 1.125 }, + { "matrix": [1, 4], "x": 4, "y": 1.25 }, + { "matrix": [5, 0], "x": 7, "y": 1.25 }, + { "matrix": [5, 1], "x": 8, "y": 1.125 }, + { "matrix": [5, 2], "x": 9, "y": 1 }, + { "matrix": [5, 3], "x": 10, "y": 1.125 }, + { "matrix": [5, 4], "x": 11, "y": 1.25 }, + { "matrix": [2, 0], "x": 0, "y": 2.25 }, + { "matrix": [2, 1], "x": 1, "y": 2.125 }, + { "matrix": [2, 2], "x": 2, "y": 2 }, + { "matrix": [2, 3], "x": 3, "y": 2.125 }, + { "matrix": [2, 4], "x": 4, "y": 2.25 }, + { "matrix": [6, 0], "x": 7, "y": 2.25 }, + { "matrix": [6, 1], "x": 8, "y": 2.125 }, + { "matrix": [6, 2], "x": 9, "y": 2 }, + { "matrix": [6, 3], "x": 10, "y": 2.125 }, + { "matrix": [6, 4], "x": 11, "y": 2.25 }, + { "matrix": [3, 3], "x": 3.5, "y": 3.25 }, + { "matrix": [3, 4], "x": 4.5, "y": 3.5 }, + { "matrix": [7, 0], "x": 6.5, "y": 3.5 }, + { "matrix": [7, 1], "x": 7.5, "y": 3.25 } + ] } + } } diff --git a/keyboards/sweep/keymaps/jack/keymap.c b/keyboards/sweep/keymaps/jack/keymap.c index d505967..5f836e8 100644 --- a/keyboards/sweep/keymaps/jack/keymap.c +++ b/keyboards/sweep/keymaps/jack/keymap.c @@ -1,6 +1,9 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #include "jack.h" +#include "analog.h" + +#define NUM_ADC_READS 32 // clang-format off const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -14,13 +17,54 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ___LOWER1___, ___LOWER2___, ___LOWER3___, - KC_TRNS, KC_TRNS, KC_TRNS, PNP + _______, _______, _______, UPDIR ), [_RAISE] = LAYOUT_jack( ___RAISE1___, ___RAISE2___, ___RAISE3___, - NUKE, KC_TRNS, KC_TRNS, KC_TRNS + PNP, _______, _______, _______ ) }; // clang-format on + +void housekeeping_task_keymap(void) { + static uint32_t last_read = 0; + static int16_t current_reads[NUM_ADC_READS] = {0}; + static int16_t voltage_reads[NUM_ADC_READS] = {0}; + static uint8_t offset = 0; + if (timer_elapsed32(last_read) >= 1) { + int16_t current = analogReadPin(ADC_CURRENT_PIN); + int16_t voltage = analogReadPin(ADC_VOLTAGE_PIN); + int16_t current_ma = + (int16_t)(((3300 * (int32_t)current) / ADC_SATURATION)); + int16_t voltage_mv = + (int16_t)((2 * (3300 * (int32_t)voltage)) / ADC_SATURATION); + if (!last_read) + for (uint8_t i = 0; i < NUM_ADC_READS; ++i) { + current_reads[i] = current_ma; + voltage_reads[i] = voltage_mv; + } + current_reads[offset] = current_ma; + voltage_reads[offset] = voltage_mv; + offset = (offset + 1) % NUM_ADC_READS; + static uint16_t counter = 0; + counter = (counter + 1) % 2500; + if (!counter) + dprintf("Current: %dmA\tVoltage: %dmV\n", (int)current_ma, + (int)voltage_mv); + last_read = timer_read32(); + } + static uint32_t last_draw = 0; + if (timer_elapsed32(last_draw) >= 250) { + int32_t total_current_ma = 0; + int32_t total_voltage_mv = 0; + for (uint8_t i = 0; i < NUM_ADC_READS; ++i) { + total_current_ma += current_reads[i]; + total_voltage_mv += voltage_reads[i]; + } + // int16_t avg_current_ma = (int16_t)(total_current_ma / NUM_ADC_READS); + // int16_t avg_voltage_mv = (int16_t)(total_voltage_mv / NUM_ADC_READS); + last_draw = timer_read32(); + } +} diff --git a/keyboards/sweep/lib/jetbrainsmono11.qff.c b/keyboards/sweep/lib/jetbrainsmono11.qff.c deleted file mode 100644 index 9a60c9f..0000000 --- a/keyboards/sweep/lib/jetbrainsmono11.qff.c +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2024 QMK -// copyright SPDX-License-Identifier: GPL-2.0-or-later - -// Font's metadata -// --------------- -// Glyphs: , !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, 0, 1, 2, 3, 4, 5, 6, -// 7, 8, 9, :, ;, <, =, >, ?, @, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, -// Q, R, S, T, U, V, W, X, Y, Z, [, \, ], ^, _, `, a, b, c, d, e, f, g, h, i, j, -// k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, {, |, }, ~ - -#include <qp.h> - -const uint32_t font_jetbrainsmono11_length = 1365; - -// clang-format off -const uint8_t font_jetbrainsmono11[1365] = { - 0x00, 0xFF, 0x14, 0x00, 0x00, 0x51, 0x46, 0x46, 0x01, 0x55, 0x05, 0x00, 0x00, 0xAA, 0xFA, 0xFF, - 0xFF, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0xFE, 0x1D, 0x01, 0x00, 0x07, 0x00, - 0x00, 0xC7, 0x02, 0x00, 0x87, 0x05, 0x00, 0x47, 0x08, 0x00, 0x07, 0x0B, 0x00, 0xC7, 0x0D, 0x00, - 0x87, 0x10, 0x00, 0x47, 0x13, 0x00, 0x07, 0x16, 0x00, 0xC7, 0x18, 0x00, 0x87, 0x1B, 0x00, 0x47, - 0x1E, 0x00, 0x07, 0x21, 0x00, 0xC7, 0x23, 0x00, 0x87, 0x26, 0x00, 0x47, 0x29, 0x00, 0x07, 0x2C, - 0x00, 0xC7, 0x2E, 0x00, 0x87, 0x31, 0x00, 0x47, 0x34, 0x00, 0x07, 0x37, 0x00, 0xC7, 0x39, 0x00, - 0x87, 0x3C, 0x00, 0x47, 0x3F, 0x00, 0x07, 0x42, 0x00, 0xC7, 0x44, 0x00, 0x87, 0x47, 0x00, 0x47, - 0x4A, 0x00, 0x07, 0x4D, 0x00, 0xC7, 0x4F, 0x00, 0x87, 0x52, 0x00, 0x47, 0x55, 0x00, 0x07, 0x58, - 0x00, 0xC7, 0x5A, 0x00, 0x87, 0x5D, 0x00, 0x47, 0x60, 0x00, 0x07, 0x63, 0x00, 0xC7, 0x65, 0x00, - 0x87, 0x68, 0x00, 0x47, 0x6B, 0x00, 0x07, 0x6E, 0x00, 0xC7, 0x70, 0x00, 0x87, 0x73, 0x00, 0x47, - 0x76, 0x00, 0x07, 0x79, 0x00, 0xC7, 0x7B, 0x00, 0x87, 0x7E, 0x00, 0x47, 0x81, 0x00, 0x07, 0x84, - 0x00, 0xC7, 0x86, 0x00, 0x87, 0x89, 0x00, 0x47, 0x8C, 0x00, 0x07, 0x8F, 0x00, 0xC7, 0x91, 0x00, - 0x87, 0x94, 0x00, 0x47, 0x97, 0x00, 0x07, 0x9A, 0x00, 0xC7, 0x9C, 0x00, 0x87, 0x9F, 0x00, 0x47, - 0xA2, 0x00, 0x07, 0xA5, 0x00, 0xC7, 0xA7, 0x00, 0x87, 0xAA, 0x00, 0x47, 0xAD, 0x00, 0x07, 0xB0, - 0x00, 0xC7, 0xB2, 0x00, 0x87, 0xB5, 0x00, 0x47, 0xB8, 0x00, 0x07, 0xBB, 0x00, 0xC7, 0xBD, 0x00, - 0x87, 0xC0, 0x00, 0x47, 0xC3, 0x00, 0x07, 0xC6, 0x00, 0xC7, 0xC8, 0x00, 0x87, 0xCB, 0x00, 0x47, - 0xCE, 0x00, 0x07, 0xD1, 0x00, 0xC7, 0xD3, 0x00, 0x87, 0xD6, 0x00, 0x47, 0xD9, 0x00, 0x07, 0xDC, - 0x00, 0xC7, 0xDE, 0x00, 0x87, 0xE1, 0x00, 0x47, 0xE4, 0x00, 0x07, 0xE7, 0x00, 0xC7, 0xE9, 0x00, - 0x87, 0xEC, 0x00, 0x47, 0xEF, 0x00, 0x07, 0xF2, 0x00, 0xC7, 0xF4, 0x00, 0x87, 0xF7, 0x00, 0x47, - 0xFA, 0x00, 0x07, 0xFD, 0x00, 0xC7, 0xFF, 0x00, 0x87, 0x02, 0x01, 0x04, 0xFB, 0x15, 0x04, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x81, 0x40, - 0x20, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x85, 0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x89, 0xE0, 0xA3, 0x40, 0x7E, 0x12, 0x01, 0x00, 0x00, 0x08, 0x84, 0x47, 0xE1, - 0xE0, 0xE0, 0x50, 0x1A, 0x04, 0x02, 0x00, 0x00, 0x80, 0xA9, 0x50, 0x71, 0xE0, 0x18, 0x8A, 0x18, - 0x00, 0x00, 0x00, 0x00, 0x43, 0x42, 0x30, 0xA4, 0x22, 0x31, 0x17, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x82, 0x40, 0x20, 0x10, 0x08, 0x04, - 0x04, 0x04, 0x00, 0x00, 0x03, 0x02, 0x01, 0x80, 0x40, 0x00, 0x08, 0x84, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x81, 0xF0, 0x31, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0xF8, 0x10, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x82, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x10, 0x04, 0x82, 0x40, 0x20, 0x08, 0x04, 0x81, 0x00, 0x00, - 0x00, 0x00, 0x47, 0x26, 0x52, 0x89, 0x44, 0x32, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x43, 0x81, 0x40, - 0x20, 0x10, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x47, 0x06, 0x82, 0x60, 0x18, 0x04, 0x1F, 0x00, - 0x00, 0x00, 0x80, 0x07, 0x82, 0xE0, 0x40, 0x40, 0x12, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x02, 0x41, - 0x90, 0x48, 0x3C, 0x10, 0x08, 0x00, 0x00, 0x00, 0x80, 0x47, 0x20, 0xF0, 0xC0, 0x40, 0x32, 0x0E, - 0x00, 0x00, 0x00, 0x00, 0x82, 0x41, 0xF0, 0x88, 0x44, 0x22, 0x0E, 0x00, 0x00, 0x00, 0x80, 0x4F, - 0x04, 0x81, 0x60, 0x10, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x47, 0x26, 0xE1, 0xC8, 0x44, 0x22, - 0x0E, 0x00, 0x00, 0x00, 0x00, 0x47, 0x24, 0x92, 0x71, 0x20, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x40, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, - 0x00, 0x04, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE0, 0x03, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xC0, 0xC0, - 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x81, 0x30, 0x08, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x47, 0x04, 0xC2, 0xA5, 0x52, 0x28, 0x8C, 0x80, 0x03, 0x00, 0x00, 0x82, 0x41, 0xA1, - 0x48, 0x3C, 0x22, 0x11, 0x00, 0x00, 0x00, 0x80, 0x47, 0x26, 0xF1, 0xC8, 0x44, 0x22, 0x0F, 0x00, - 0x00, 0x00, 0x00, 0x47, 0x24, 0x10, 0x08, 0x04, 0x22, 0x0E, 0x00, 0x00, 0x00, 0x80, 0x47, 0x22, - 0x12, 0x89, 0x44, 0x12, 0x0F, 0x00, 0x00, 0x00, 0x80, 0x4F, 0x20, 0xF0, 0x08, 0x04, 0x02, 0x1F, - 0x00, 0x00, 0x00, 0x80, 0x4F, 0x20, 0x10, 0x78, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x47, - 0x26, 0x10, 0xE8, 0x44, 0x32, 0x0E, 0x00, 0x00, 0x00, 0x80, 0x48, 0x24, 0xF2, 0x89, 0x44, 0x22, - 0x11, 0x00, 0x00, 0x00, 0x80, 0x07, 0x81, 0x40, 0x20, 0x10, 0x08, 0x0F, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x02, 0x81, 0x40, 0x20, 0x12, 0x0F, 0x00, 0x00, 0x00, 0x80, 0x48, 0x22, 0x71, 0x68, 0x24, - 0x12, 0x11, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x1F, 0x00, 0x00, 0x00, - 0x80, 0xCC, 0x66, 0x52, 0x89, 0x44, 0x22, 0x11, 0x00, 0x00, 0x00, 0x80, 0xC8, 0x64, 0x52, 0xA9, - 0x74, 0x32, 0x19, 0x00, 0x00, 0x00, 0x00, 0x47, 0x22, 0x12, 0x89, 0x44, 0x12, 0x0E, 0x00, 0x00, - 0x00, 0x80, 0x47, 0x24, 0x12, 0x79, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x47, 0x26, 0x12, - 0x89, 0x44, 0x32, 0x0E, 0x04, 0x02, 0x00, 0x80, 0x47, 0x24, 0x92, 0x79, 0x24, 0x12, 0x11, 0x00, - 0x00, 0x00, 0x00, 0x47, 0x22, 0x60, 0x40, 0x40, 0x22, 0x0E, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x81, - 0x40, 0x20, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x80, 0x48, 0x24, 0x12, 0x89, 0x44, 0x12, 0x0E, - 0x00, 0x00, 0x00, 0x80, 0x48, 0x24, 0x91, 0x50, 0x28, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x40, 0x2A, - 0xC5, 0x32, 0x99, 0x6C, 0x36, 0x09, 0x00, 0x00, 0x00, 0x80, 0x48, 0x42, 0x61, 0x30, 0x28, 0x12, - 0x11, 0x00, 0x00, 0x00, 0x80, 0x48, 0x42, 0xE1, 0x20, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x80, - 0x0F, 0x02, 0x41, 0x10, 0x08, 0x02, 0x1F, 0x00, 0x00, 0x00, 0x0E, 0x81, 0x40, 0x20, 0x10, 0x08, - 0x04, 0x02, 0x07, 0x00, 0x00, 0x81, 0x80, 0x40, 0x40, 0x20, 0x10, 0x10, 0x08, 0x08, 0x00, 0x00, - 0x06, 0x02, 0x81, 0x40, 0x20, 0x10, 0x08, 0x04, 0x03, 0x00, 0x00, 0x00, 0x82, 0x00, 0x11, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x81, - 0xF1, 0x44, 0x32, 0x1F, 0x00, 0x00, 0x00, 0x80, 0x40, 0xE0, 0x91, 0x89, 0x44, 0x32, 0x0F, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xC0, 0x11, 0x09, 0x04, 0x22, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x08, 0xC4, - 0x93, 0x89, 0x44, 0x32, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x11, 0xF9, 0x04, 0x02, 0x0E, - 0x00, 0x00, 0x00, 0x00, 0x8E, 0x40, 0xF0, 0x11, 0x08, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xC0, 0x93, 0x89, 0x44, 0x32, 0x1E, 0x84, 0x03, 0x00, 0x80, 0x40, 0xE0, 0x91, 0x89, 0x44, 0x22, - 0x11, 0x00, 0x00, 0x00, 0x00, 0x02, 0xE0, 0x40, 0x20, 0x10, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, - 0x04, 0xE0, 0x81, 0x40, 0x20, 0x10, 0x08, 0xC4, 0x01, 0x00, 0x80, 0x40, 0x20, 0x93, 0x38, 0x24, - 0x12, 0x11, 0x00, 0x00, 0x00, 0xC0, 0x81, 0x40, 0x20, 0x10, 0x08, 0x04, 0x1C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x60, 0x53, 0xA9, 0x54, 0x2A, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x91, 0x89, - 0x44, 0x22, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x91, 0x89, 0x44, 0x32, 0x0E, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xE0, 0x91, 0x89, 0x44, 0x32, 0x8F, 0x40, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x93, - 0x89, 0x44, 0x32, 0x1E, 0x08, 0x04, 0x00, 0x00, 0x00, 0xE0, 0x11, 0x89, 0x04, 0x02, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xC0, 0x11, 0x38, 0x20, 0x22, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, - 0x23, 0x10, 0x08, 0x04, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x12, 0x89, 0x44, 0x12, 0x0E, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x92, 0x48, 0x28, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x90, 0x42, 0x99, 0x4C, 0x16, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xA3, 0x30, 0x18, 0x14, - 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x92, 0x50, 0x28, 0x0C, 0x04, 0x82, 0x00, 0x00, 0x00, - 0x00, 0xE0, 0x81, 0x20, 0x08, 0x06, 0x1F, 0x00, 0x00, 0x00, 0x08, 0x02, 0x81, 0x30, 0x20, 0x10, - 0x08, 0x04, 0x04, 0x00, 0x00, 0x04, 0x02, 0x81, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x00, - 0x03, 0x83, 0x40, 0xC0, 0x11, 0x08, 0x0C, 0x86, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x69, - 0x00, 0x00, 0x00, 0x00, 0x00, -}; -// clang-format on diff --git a/keyboards/sweep/lib/jetbrainsmono11.qff.h b/keyboards/sweep/lib/jetbrainsmono11.qff.h deleted file mode 100644 index de556e3..0000000 --- a/keyboards/sweep/lib/jetbrainsmono11.qff.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2024 QMK -// SPDX-License-Identifier: GPL-2.0-or-later -#pragma once - -#include <qp.h> - -extern const uint32_t font_jetbrainsmono11_length; -extern const uint8_t font_jetbrainsmono11[1365]; diff --git a/keyboards/sweep/mcuconf.h b/keyboards/sweep/mcuconf.h index be63774..c53d80d 100644 --- a/keyboards/sweep/mcuconf.h +++ b/keyboards/sweep/mcuconf.h @@ -1,11 +1,14 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include_next <mcuconf.h> +#undef RP_ADC_USE_ADC1 +#define RP_ADC_USE_ADC1 TRUE + #undef RP_SPI_USE_SPI0 #define RP_SPI_USE_SPI0 TRUE -#undef RP_I2C_USE_I2C1 -#define RP_I2C_USE_I2C1 TRUE +#undef RP_PWM_USE_PWM3 +#define RP_PWM_USE_PWM3 TRUE diff --git a/keyboards/sweep/readme.md b/keyboards/sweep/readme.md index 1ccc4f3..be6c1a6 100644 --- a/keyboards/sweep/readme.md +++ b/keyboards/sweep/readme.md @@ -1,8 +1,8 @@ # Sweep RP2040 - + -* Keyboard Maintainer: [Jack Sangdahl](https://github.com/waffle87) +* Keyboard Maintainer: [[email protected]](mailto:[email protected]) * Hardware Supported: PCBs with integrated RP2040 microcontroller * Hardware Availability: [git/sweep](https://git.pngu.org/sweep) @@ -20,6 +20,6 @@ See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_to Enter the bootloader in 3 ways: -* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard -* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead +* **Bootmagic reset**: Hold down the key at (0,0) in the matrix and plug in the keyboard +* **Physical reset button**: Hold button labeled BOOT and tap RESET button * **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/sweep/rules.mk b/keyboards/sweep/rules.mk index 172fd27..5533ed9 100644 --- a/keyboards/sweep/rules.mk +++ b/keyboards/sweep/rules.mk @@ -1,8 +1,2 @@ -POINTING_DEVICE_DRIVER = cirque_pinnacle_spi - -# depends on 21844 -QUANTUM_PAINTER_DRIVERS += ls0xx_spi - -ifeq ($(strip $(QUANTUM_PAINTER_ENABLE)), yes) - SRC += lib/jetbrainsmono11.qff.c -endif +QUANTUM_PAINTER_DRIVERS += st7789_spi +ANALOG_DRIVER_REQUIRED = yes diff --git a/keyboards/sweep/sweep.c b/keyboards/sweep/sweep.c index f14a591..c7023bd 100644 --- a/keyboards/sweep/sweep.c +++ b/keyboards/sweep/sweep.c @@ -1,28 +1,17 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later -#include <quantum.h> +#include "quantum.h" #ifdef QUANTUM_PAINTER_ENABLE -#include "lib/jetbrainsmono11.qff.h" -#include <qp.h> -#include <qp_surface.h> +#include "qp.h" + static painter_device_t display; -static painter_font_handle_t font; -static uint8_t framebuffer[SURFACE_REQUIRED_BUFFER_BYTE_SIZE( - LS0XX_DISPLAY_WIDTH, LS0XX_DISPLAY_HEIGHT, 1)] = {0}; void keyboard_post_init_kb(void) { - display = qp_ls0xx_device_t_make_spi_device( - LS0XX_DISPLAY_WIDTH, LS0XX_DISPLAY_HEIGHT, LS0XX_CS_PIN, LCD_SPI_DIVISOR, - 0, framebuffer); + display = qp_st7789_make_spi_device(LCD_DISPLAY_WIDTH, LCD_DISPLAY_HEIGHT, + LCD_CS_PIN, LCD_DC_PIN, LCD_RST_PIN, + LCD_SPI_DIVISOR, 0); qp_init(display, QP_ROTATION_0); - font = qp_load_font_mem(font); - if (font) { - static const char *data = "foo bar baz"; - int16_t width = qp_textwidth(font, data); - qp_drawtext(display, LS0XX_DISPLAY_WIDTH - width - 1, - LS0XX_DISPLAY_HEIGHT - font->line_height - 1, font, data); - } keyboard_post_init_user(); } @@ -36,14 +25,3 @@ void suspend_wakeup_init_kb(void) { suspend_wakeup_init_user(); } #endif // QUANTUM_PAINTER_ENABLE - -#ifdef OLED_ENABLE -oled_rotation_t oled_init_kb(oled_rotation_t rotation) { return rotation; } - -bool oled_task_kb(void) { - if (!oled_task_user()) - return false; - oled_write(PSTR("foo bar baz"), false); - return true; -} -#endif // OLED_ENABLE diff --git a/keyboards/tornish/flash.sh b/keyboards/tornish/flash.sh deleted file mode 100755 index 6de066f..0000000 --- a/keyboards/tornish/flash.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -FIRMWARE=~/git/qmk_firmware/tornish_default.hex -BOOTLOADER=~/git/qmk_me/keyboards/tornish/usbasploader_atmega328p.hex - -qmk compile -kb tornish -km default > /dev/null -sed -i '$ d' $FIRMWARE -cat $BOOTLOADER >> $FIRMWARE -doas avrdude -c usbtiny -p atmega328p -U flash:w:$FIRMWARE:i diff --git a/keyboards/tornish/keyboard.json b/keyboards/tornish/keyboard.json deleted file mode 100644 index 5423d74..0000000 --- a/keyboards/tornish/keyboard.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "keyboard_name": "tornish", - "manufacturer": "jacks", - "maintainer": "pngu.org", - "bootloader": "usbasploader", - "diode_direction": "COL2ROW", - "matrix_pins": { - "cols": ["B3", "B4", "B5", "B0", "D7", "D6"], - "rows": ["D4", "D1", "D0", "D5"] - }, - "processor": "atmega328p", - "usb": { - "device_version": "1.0.0", - "pid": "0x6A73", - "vid": "0x6D64" - }, - "layouts": { - "LAYOUT": { - "layout": [ - {"matrix": [0, 0], "x": 0, "y": 0}, - {"matrix": [0, 1], "x": 1, "y": 0}, - {"matrix": [0, 2], "x": 2, "y": 0}, - {"matrix": [0, 3], "x": 3, "y": 0}, - {"matrix": [0, 4], "x": 4, "y": 0}, - {"matrix": [0, 5], "x": 5, "y": 0}, - {"matrix": [1, 0], "x": 0, "y": 1}, - {"matrix": [1, 1], "x": 1, "y": 1}, - {"matrix": [1, 2], "x": 2, "y": 1}, - {"matrix": [1, 3], "x": 3, "y": 1}, - {"matrix": [1, 4], "x": 4, "y": 1}, - {"matrix": [1, 5], "x": 5, "y": 1}, - {"matrix": [2, 0], "x": 0, "y": 2}, - {"matrix": [2, 1], "x": 1, "y": 2}, - {"matrix": [2, 2], "x": 2, "y": 2}, - {"matrix": [2, 3], "x": 3, "y": 2}, - {"matrix": [2, 4], "x": 4, "y": 2}, - {"matrix": [2, 5], "x": 5, "y": 2}, - {"matrix": [3, 2], "x": 2, "y": 3}, - {"matrix": [3, 3], "x": 3, "y": 3}, - {"matrix": [3, 4], "x": 4, "y": 3}, - {"matrix": [3, 5], "x": 5, "y": 3} - ] - } - } -} diff --git a/keyboards/tornish/keymaps/default/keymap.c b/keyboards/tornish/keymaps/default/keymap.c deleted file mode 100644 index aeb2df2..0000000 --- a/keyboards/tornish/keymaps/default/keymap.c +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2024 [email protected] -// SPDX-License-Identifier: GPL-2.0-or-later -#include QMK_KEYBOARD_H - -enum macros { DAY = QK_USER, CLEAR }; - -// clang-format off -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT( - DAY, KC_Q, KC_W, KC_E, KC_R, KC_T, - CLEAR, KC_A, KC_S, KC_D, KC_F, KC_G, - XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, - KC_ESC, MO(1), KC_SPC, XXXXXXX - ), - [1] = LAYOUT( - XXXXXXX, KC_1, KC_2, KC_3, KC_4, KC_5, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, _______, XXXXXXX, XXXXXXX - ) -}; -// clang-format on - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case DAY: - if (record->event.pressed) { - tap_code(KC_SLSH); - wait_ms(500); - SEND_STRING("time set day" SS_TAP(X_ENT)); - } - break; - case CLEAR: - if (record->event.pressed) { - tap_code(KC_SLSH); - wait_ms(500); - SEND_STRING("weather clear" SS_TAP(X_ENT)); - } - break; - } - return true; -} diff --git a/keyboards/tornish/readme.md b/keyboards/tornish/readme.md deleted file mode 100644 index 3224611..0000000 --- a/keyboards/tornish/readme.md +++ /dev/null @@ -1,11 +0,0 @@ -### half a [torn](https://github.com/rtitmuss/torn) keyboard used solely for minecraft :) - - -for whatever reason, this board does not like to flash over usb. -so [flash.sh](flash.sh) does the work for us: -qmk compile -kb tornish -km default > /dev/null -```shell -sed -i '$ d' $FIRMWARE #remove last line from firmware hex file (eof indicator) -cat $BOOTLOADER >> $FIRMWARE #append bootloader hex file to firmware -avrdude -c usbtiny -p atmega328p -U flash:w:$FIRMWARE:i #flash firmware + bootloader over serial -``` diff --git a/keyboards/tornish/usbasploader_atmega328p.hex b/keyboards/tornish/usbasploader_atmega328p.hex deleted file mode 100644 index 3f3fb14..0000000 --- a/keyboards/tornish/usbasploader_atmega328p.hex +++ /dev/null @@ -1,140 +0,0 @@ -:107000006BC00000AAC000008EC000008CC0000051
-:107010008AC0000088C0000086C0000084C0000054
-:1070200082C0000080C000007EC000007CC0000064
-:107030007AC0000078C0000076C0000074C0000074
-:1070400072C0000070C000006EC000006CC0000084
-:107050006AC0000068C0000066C0000064C0000094
-:1070600062C0000060C00000EC2DFD2DB7B6B0FC82
-:10707000FDCF27BFE895B7B6B0FCFDCF21E1B7B68D
-:10708000B6FCF4CF08950902120001010080320914
-:10709000040000000000000012011001FF000008C1
-:1070A000C016DC050201010200010E035500530069
-:1070B00042006100730070001C03770077007700C6
-:1070C0002E00660069007300630068006C002E00EB
-:1070D000640065000403090411241FBECFEFD8E04B
-:1070E000DEBFCDBF24B7D8E0CEEF39913833399128
-:1070F00009F03FEF30933C0120933B0111E0A0E009
-:10710000B1E0E4E8F8E702C005900D92A630B107BF
-:10711000D9F721E0A6E0B1E001C01D92AB33B20780
-:10712000E1F785D1ADC36CCFA82FB92F80E090E0F7
-:1071300041E050EA609530E009C02D918227979593
-:10714000879510F084279527305EC8F36F5FA8F30A
-:107150000895EADF8D939D930895CF93CFB7CF9392
-:10716000DF93C3954B9BE9F74B9B0BC04B9B09C02F
-:107170004B9B07C04B9B05C04B9B03C04B9B01C067
-:1071800089C06F93C0911E01DD27CB5DDE4F2F9329
-:1071900065E54B9B03C02F916F91E6CF0F931F9333
-:1071A0004F9320E040E15F9309B10C7003FB27F996
-:1071B0003F9350E03BE039C01C7040642F77012FB3
-:1071C0005F5F1EC0406819B11C702F7752501FC0FE
-:1071D000406409B12F770C70D1F15F5F00C023C00C
-:1071E000406219B12F771C7091F15F5F00C025C01C
-:1071F0000C701027515012F45D5F0000115027955C
-:107200002C3F19B1C8F61C700127015027952C3F5F
-:10721000C8F64227499309B10C7010274F731150DB
-:1072200027952C3FA8F64695469519B11C7079F024
-:107230000127015027952C3F98F66B5A60F3315087
-:1072400009B1B0F600C011E01CBB002717C03B50CD
-:107250003195C31BD04011E01CBB0881033CF9F001
-:107260000B34E9F020911C011981110F1213EDCF9D
-:10727000093651F10D3211F0013E39F70093230127
-:107280003F915F914F911F910F912F916F91CCB3CF
-:10729000C0FD67CFDF91CF91CFBFCF9118952091DF
-:1072A0002301222369F310912101112339F5343090
-:1072B0003AF13093210120931D0110911E013BE012
-:1072C000311B30931E011CC0009121010130B4F428
-:1072D0000AE53091010134FD14C000930101C1E1C0
-:1072E000D1E013C0052710E000C000000BB91AC0A0
-:1072F000052710E0221F1DC010E021C04AE502C092
-:1073000032ED432FC4E1D0E032E01AB11C605B9A49
-:107310000BB11AB95CE020E865E320FF05270BB943
-:10732000279517951C3FF0F66695B8F7B1F720FF43
-:1073300005270BB9279517951C3FD0F6279517956C
-:1073400017FF052700001C3F0BB9B0F629913A95AD
-:1073500019F7037F10912201110FC651D0400BB9CC
-:1073600011F010931C0111E01CBB08601AB1137FCF
-:10737000402F437F54E05A95F1F70BB91AB94BB936
-:107380007FCFDC0113964C91139714963C91149780
-:1073900013968D919C911497982789279827129678
-:1073A0002C911297203339F43370E32FF0E0EE5F25
-:1073B000FE4F80810895283561F489E0E1E0F0E036
-:1073C000442371F089E0E3E0F0E0483049F080E0E8
-:1073D0000895203579F4411107C089E0F0E0E0E03C
-:1073E000809357008491089589E0E2E0F0E048300E
-:1073F00071F7F6CF203229F4880F991FFC01849190
-:107400000895283229F4FC01EE0FFF1F3196F7CFC3
-:10741000203A09F41FC2203C21F415966C9122D227
-:10742000D6CF2F3FA1F681EF80930F01D0CF1AB8AE
-:1074300080E28BB981E085BF82E085BFE0E0F1E7C3
-:10744000A89531978040E1F780913B01877F21F437
-:1074500080913C01882371F04D9B0CC0F894539AA5
-:107460001BB81DBA1092690081E085BF15BEF0E01F
-:10747000E0E009958EEF80930F0114BE0FB6F894EB
-:10748000A8958091600088618093600010926000F0
-:107490000FBE80916900826080936900E89A539AD8
-:1074A0008CE0E0E0F5E3A89531978040E1F7539850
-:1074B000789410912101135017FD5AC080911E013C
-:1074C000CCE0D0E0C81BD109CB5DDE4F80911D011F
-:1074D0008D3209F00BC1183009F048C083EC80935D
-:1074E00011018AE580930101109210013881832FE8
-:1074F00080769981882309F49BC046E051E050933F
-:10750000200140931F01933069F4CE013ADF80934C
-:10751000090184E09F81911127C09E81981720F571
-:10752000892F22C0953009F4DFC09A3009F4DCC0FD
-:107530008CEF890F863008F070C04A815B815093D0
-:107540000E0140930D01993009F46EC08E81809335
-:107550000C012D81227020930B0190930A0137FFBB
-:107560008FEF90E890931001809300011092210119
-:107570008091010184FF36C0C0910001CF3F91F19D
-:107580008C2FC93008F088E09C2F981B9093000145
-:107590009091110128E8922790931101CC23B1F02A
-:1075A0004091100147FF2FC190910C01C82F9817EF
-:1075B00008F4C92F9C1B90930C01D0900A01D0E0D5
-:1075C00082E1E82E81E0F82EDC1304C16C2F82E109
-:1075D00091E0BFDDCC5FCC3019F08FEF80930001DC
-:1075E000C093010184E199B19C7031F48150D9F7C5
-:1075F0001092220110921C0180910F01803108F439
-:107600001EC14D9B05C080910F01805180930F01D9
-:1076100080910F0181114DCF21CF80910F019230C8
-:1076200029F48E7F80930F0180E074CF8160FACFC0
-:107630002A8110921A0191110AC010921B012AE1AD
-:1076400031E082E03093200120931F0163CF953019
-:1076500029F4209322012AE131E0F4CF963099F504
-:107660009B81913059F488E990E7909320018093B1
-:107670001F0182E190E4909310014CCF923019F4F5
-:1076800086E890E7F2CF9330A9F7211108C084ED86
-:1076900090E79093200180931F0184E0EBCF21308D
-:1076A00041F488EB90E79093200180931F018CE1D7
-:1076B000E1CF2230F9F68AEA90E790932001809397
-:1076C0001F018EE0D7CF983059F0993019F42093EC
-:1076D0002401C1CF81E09A3009F4BDCF80E0BBCF57
-:1076E00024E231E081E0AECF81E014CF809110013F
-:1076F00087FF3CCF00910C01011708F4102F011BEC
-:1077000000930C01F12CF11628F001112FCF1092EB
-:1077100000012CCF80910D0190910E0120910A0162
-:10772000273058F069919C012F5F3F4F30930E0135
-:1077300020930D0197D0F394E6CF8115904738F749
-:10774000F394F394F894E0910D01F0910E012991D6
-:10775000399181E0090180935700E89511247894CC
-:1077600080910D0190910E01029690930E018093ED
-:107770000D018F779927892B51F00111C4CFF11694
-:1077800008F4C1CF80910B01882309F4BCCFF89491
-:10779000E0910D01F0910E01329783E08093570044
-:1077A000E895789407B600FCFDCFF894E0910D01C0
-:1077B000F0910E01329785E080935700E895789418
-:1077C00007B600FCFDCFF89481E180935700E8955F
-:1077D000789499CF00910D0110910E0126E02D159E
-:1077E00078F4C80137D0F7018083FFEFEF1AFF0A62
-:1077F0000F5F1F4F10930E0100930D01DF5FE4CE6A
-:10780000F8018491F0CF90911F0130912001282F31
-:10781000290FE92FF32FA2E1B1E046FF0BC09491AD
-:107820009D9331962E13FBCFF0932001E0931F011F
-:10783000C82FCCCE91919D932E13FCCFF5CF4D99AF
-:10784000E7CE80910F01823008F4E2CE80910F01E3
-:107850008250DCCEF999FECF92BD81BDF89A99276E
-:1078600080B50895262FF999FECF1FBA92BD81BD2C
-:1078700020BD0FB6F894FA9AF99A0FBE01960895B2
-:04788000F894FFCFAA
-:06788400FF5A1E950F00E3
-:040000030000700089
-:00000001FF
diff --git a/keyboards/xyz60/keyboard.json b/keyboards/xyz60/keyboard.json index d605eb3..316e36a 100644 --- a/keyboards/xyz60/keyboard.json +++ b/keyboards/xyz60/keyboard.json @@ -74,7 +74,7 @@ {"matrix": [4, 1], "x": 0, "y": 0}, {"matrix": [4, 2], "x": 0, "y": 0}, {"matrix": [4, 6], "x": 0, "y": 0}, - {"matrix": [4, 10], "x": 0, "y": 0}, + {"matrix": [4, 11], "x": 0, "y": 0}, {"matrix": [4, 12], "x": 0, "y": 0}, {"matrix": [4, 13], "x": 0, "y": 0} ] diff --git a/keyboards/xyz60/keymaps/jack/keymap.c b/keyboards/xyz60/keymaps/jack/keymap.c index 024d732..81941ed 100644 --- a/keyboards/xyz60/keymaps/jack/keymap.c +++ b/keyboards/xyz60/keymaps/jack/keymap.c @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-3.0-or-later #include "jack.h" #define ___NONE___ \ @@ -12,21 +12,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, ___BASE1___, KC_BSPC, _______, PNP, _______, ___BASE2___, _______, _______, _______, ___BASE3___, _______, - _______, _______, KC_ESC, LWRSPC, PSTRSE, _______, _______ + _______, _______, KC_ESC, LWRSPC, PSTRSE, _______, _______ ), [_LOWER] = LAYOUT_jack_60_ts( _______, ___NONE___, _______, ___LOWER1___, _______, _______, _______, _______, ___LOWER2___, _______, _______, _______, ___LOWER3___, _______, - _______, _______, _______, _______, _______, _______, _______ + _______, _______, _______, _______, _______, _______, _______ ), [_RAISE] = LAYOUT_jack_60_ts( _______, ___NONE___, _______, ___RAISE1___, _______, _______, _______, _______, ___RAISE2___, _______, _______, _______, ___RAISE3___, _______, - _______, _______, _______, _______, _______, _______, _______ + _______, _______, _______, _______, _______, _______, _______ ) }; // clang-format on diff --git a/keymaps/beiwagon/keymap.c b/keymaps/beiwagon/keymap.c new file mode 100644 index 0000000..eaa9c44 --- /dev/null +++ b/keymaps/beiwagon/keymap.c @@ -0,0 +1,26 @@ +// Copyright 2025 [email protected] +// SPDX-License-Identifier: GPL-3.0-or-later +#include "jack.h" + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_jack( + G(KC_F), G(KC_Q), G(KC_R), + KC_VOLD, PNP, KC_VOLU, + REMOVE, XRGB_HUI, XRGB_NXT, + XRGB_TOG, XRGB_HUD, TG(_LOWER) + ), + [_LOWER] = LAYOUT_jack( + QK_BOOT, EE_CLR, QK_MAKE, + _______, _______, _______, + _______, _______, _______, + _______, _______, _______ + ) +}; +// clang-format on + +void keyboard_post_init_keymap(void) { + for (int i = 0; i < RGB_MATRIX_LED_COUNT; ++i) + if (g_led_config.flags[i] & LED_FLAG_UNDERGLOW) + g_led_config.flags[i] &= ~LED_FLAG_UNDERGLOW; +} diff --git a/keymaps/bully/keymap.c b/keymaps/bully/keymap.c index 927d588..cc4275d 100644 --- a/keymaps/bully/keymap.c +++ b/keymaps/bully/keymap.c @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-3.0-or-later #include "jack.h" @@ -6,9 +6,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = LAYOUT_jack( XXXXXXX, ___BASE1___, KC_BSPC, KC_BSPC, - NUKE, ___BASE2___, PNP, + REMOVE, ___BASE2___, PNP, XXXXXXX, ___BASE3___, XXXXXXX, - KC_VOLD, UPDIR, KC_ESC, _______, LT(_LOWER, KC_SPC), _______, PSTRSE, XXXXXXX, KC_VOLU + KC_VOLD, UPDIR, KC_ESC, XXXXXXX, LWRSPC, XXXXXXX, PSTRSE, XXXXXXX, KC_VOLU ), [_LOWER] = LAYOUT_jack( _______, ___LOWER1___, _______, _______, diff --git a/keymaps/crkbd/config.h b/keymaps/crkbd/config.h index 1516e0b..f93a586 100644 --- a/keymaps/crkbd/config.h +++ b/keymaps/crkbd/config.h @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #pragma once @@ -13,9 +13,9 @@ #define WS2812_DI_PIN B5 #define WS2812_PWM_DRIVER PWMD3 #define WS2812_PWM_CHANNEL 3 -#define WS2812_DMA_STREAM STM32_DMA1_STREAM3 -#define WS2812_DMA_CHANNEL 3 -#define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM3_UP +#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3 +#define WS2812_PWM_DMA_CHANNEL 3 +#define WS2812_PWM_DMAMUX_ID STM32_DMAMUX1_TIM3_UP #endif #ifdef ENCODER_ENABLE diff --git a/keymaps/crkbd/halconf.h b/keymaps/crkbd/halconf.h index 547b9db..81505ac 100644 --- a/keymaps/crkbd/halconf.h +++ b/keymaps/crkbd/halconf.h @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/keymaps/crkbd/keymap.c b/keymaps/crkbd/keymap.c index 54fd197..1e634ab 100644 --- a/keymaps/crkbd/keymap.c +++ b/keymaps/crkbd/keymap.c @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #include "jack.h" @@ -6,21 +6,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = LAYOUT_jack_3x6( XXXXXXX, ___BASE1___, XXXXXXX, - XXXXXXX, ___BASE2___, RWORD, + XXXXXXX, ___BASE2___, XXXXXXX, XXXXXXX, ___BASE3___, XXXXXXX, - ___BASE4___ + ___BASE4___ ), [_LOWER] = LAYOUT_jack_3x6( - XXXXXXX, ___LOWER1___, XXXXXXX, - XXXXXXX, ___LOWER2___, XXXXXXX, - XXXXXXX, ___LOWER3___, XXXXXXX, - ___LOWER4___ + _______, ___LOWER1___, _______, + _______, ___LOWER2___, _______, + _______, ___LOWER3___, _______, + ___LOWER4___ ), [_RAISE] = LAYOUT_jack_3x6( - XXXXXXX, ___RAISE1___, XXXXXXX, - XXXXXXX, ___RAISE2___, XXXXXXX, - XXXXXXX, ___RAISE3___, XXXXXXX, - ___RAISE4___ + _______, ___RAISE1___, _______, + _______, ___RAISE2___, _______, + _______, ___RAISE3___, _______, + ___RAISE4___ ) }; // clang-format on @@ -62,31 +62,9 @@ void keyboard_post_init_keymap(void) { } #endif // audio -#ifdef POINTING_DEVICE_ENABLE -uint8_t red = 255, green = 0, blue = 0; - -void trackball_hue(void) { - if (red != 255 && green != 255 && blue != 255) - red = 255; - if (red == 255 && green < 255 && !blue) - green += 15; - else if (green == 255 && !blue && red) - red -= 15; - else if (!red && blue < 255 && green == 255) - blue += 15; - else if (blue == 255 && green && !red) - green -= 15; - else if (!green && blue == 255 && red < 255) - red += 15; - else if (!green && blue && red == 255) - blue -= 15; - pimoroni_trackball_set_rgbw(red, green, blue, 0); -} -#endif // pointing device - #ifdef OLED_ENABLE oled_rotation_t oled_init_user(oled_rotation_t rotation) { - return is_keyboard_master() ? 2 : 3; + return is_keyboard_master() ? OLED_ROTATION_180 : OLED_ROTATION_270; } bool oled_task_keymap(void) { @@ -131,12 +109,4 @@ void matrix_init_user(void) { 4, 4, 4, 2, 2, 2, 2, 2, 2, 1, 1, 1, 4, 4, 4, 4, 4, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 2, 2, 2, 2, 2, 2}}; } - -bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { - rgb_matrix_sethsv_noeeprom(43, 255, 120); - for (uint8_t i = led_min; i <= led_max; i++) - if (g_led_config.flags[i] & LED_FLAG_UNDERGLOW) - rgb_matrix_set_color(i, RGB_RED); - return false; -} #endif // rgb matrix diff --git a/keymaps/crkbd/mcuconf.h b/keymaps/crkbd/mcuconf.h index 871c3e7..db028e0 100644 --- a/keymaps/crkbd/mcuconf.h +++ b/keymaps/crkbd/mcuconf.h @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/keymaps/crkbd/rules.mk b/keymaps/crkbd/rules.mk index b1fff61..42387df 100644 --- a/keymaps/crkbd/rules.mk +++ b/keymaps/crkbd/rules.mk @@ -4,9 +4,6 @@ WS2812_DRIVER = pwm OLED_ENABLE = yes AUDIO_ENABLE = no AUDIO_DRIVER = dac_basic -RGBLIGHT_ENABLE = no -RGB_MATRIX_ENABLE = yes ENCODER_ENABLE = yes -ENCODER_MAP_ENABLE = yes POINTING_DEVICE_ENABLE = no POINTING_DEVICE_DRIVER = pimoroni_trackball diff --git a/keymaps/f60/keymap.c b/keymaps/f60/keymap.c index c730bd5..5f14df5 100644 --- a/keymaps/f60/keymap.c +++ b/keymaps/f60/keymap.c @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #include "jack.h" #define ___NONE___ \ @@ -12,21 +12,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, ___BASE1___, KC_BSPC, _______, PNP, _______, ___BASE2___, _______, _______, _______, ___BASE3___, _______, - _______, _______, KC_ESC, LWRSPC, PSTRSE, _______, _______ + _______, _______, KC_ESC, LWRSPC, PSTRSE, _______, _______ ), [_LOWER] = LAYOUT_jack_60_ts( _______, ___NONE___, _______, ___LOWER1___, _______, _______, _______, _______, ___LOWER2___, _______, _______, _______, ___LOWER3___, _______, - _______, _______, _______, _______, _______, _______, _______ + _______, _______, _______, _______, _______, _______, _______ ), [_RAISE] = LAYOUT_jack_60_ts( _______, ___NONE___, _______, ___RAISE1___, _______, _______, _______, _______, ___RAISE2___, _______, _______, _______, ___RAISE3___, _______, - _______, _______, _______, _______, _______, _______, _______ + _______, _______, _______, _______, _______, _______, _______ ) }; // clang-format on diff --git a/keymaps/f60/readme.md b/keymaps/f60/readme.md deleted file mode 100644 index 8244d1b..0000000 --- a/keymaps/f60/readme.md +++ /dev/null @@ -1,4 +0,0 @@ -### trio60 - - - diff --git a/keymaps/ferris/config.h b/keymaps/ferris/config.h deleted file mode 100644 index 1f624e5..0000000 --- a/keymaps/ferris/config.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2024 [email protected] -// SPDX-License-Identifier: GPL-2.0-or-later -#pragma once - -#define WS2812_DI_PIN B0 -#define RGB_MATRIX_LED_COUNT 34 -#define RGB_MATRIX_SPLIT {17, 17} -#define __ NO_PIN -#undef DIRECT_PINS -#undef DIRECT_PINS_RIGHT -// clang-format off -#define DIRECT_PINS { \ - {D7,F7,F6,F5,F4}, \ - {B1,B3,B2,B6,D3}, \ - {D1,D0,D4,C6,E6}, \ - {B4,B5,__,__,__} \ -} -#define DIRECT_PINS_RIGHT { \ - {F4,F5,F6,F7,D7}, \ - {D3,B6,B2,B3,B1}, \ - {E6,C6,D4,D0,D1}, \ - {B5,B4,__,__,__} \ -} -// clang-format on diff --git a/keymaps/ferris/keymap.c b/keymaps/ferris/keymap.c deleted file mode 100644 index 71f2e14..0000000 --- a/keymaps/ferris/keymap.c +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2024 [email protected] -// SPDX-License-Identifier: GPL-2.0-or-later -#include "jack.h" -#define XX NO_LED - -// clang-format off -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_BASE] = LAYOUT_jack( - ___BASE1___, - ___BASE2___, - ___BASE3___, - ESCLWR, KC_SPC, KC_BSPC, PSTRSE - ), - [_LOWER] = LAYOUT_jack( - ___LOWER1___, - ___LOWER2___, - ___LOWER3___, - XXXXXXX, XXXXXXX, XXXXXXX, PNP - ), - [_RAISE] = LAYOUT_jack( - ___RAISE1___, - ___RAISE2___, - ___RAISE3___, - UPDIR, XXXXXXX, XXXXXXX, XXXXXXX - ) -}; - -led_config_t g_led_config = {{ - {4, 3, 2, 1, 0 }, - {5, 6, 7, 8, 9 }, - {14, 13, 12, 11, 10}, - {XX, XX, XX, 15, 16}, - {17, 18, 19, 20, 21}, - {26, 25, 24, 23, 22}, - {27, 28, 29, 30, 31}, - {33, 32, XX, XX, XX} -}, { - {72,7}, {54,4}, {36,0}, {18,4}, {0,13}, - {0,27}, {18,18},{36,14},{54,18},{72,21}, - {72,35},{54,32},{36,28},{18,32},{0,41}, - {67,45},{90,62}, - {126,13},{144,4}, {162,0}, {180,4}, {198,7}, - {198,21},{180,18},{162,14},{144,18},{126,27}, - {126,41},{144,32},{162,28},{180,32},{198,35}, - {117,62},{135,45} -}, { - 4,4,4,4,4, - 4,4,4,4,4, - 4,4,4,4,4, - 4,4, - 4,4,4,4,4, - 4,4,4,4,4, - 4,4,4,4,4, - 4,4 -}}; -// clang-format on diff --git a/keymaps/ferris/readme.md b/keymaps/ferris/readme.md deleted file mode 100644 index c3ac9ca..0000000 --- a/keymaps/ferris/readme.md +++ /dev/null @@ -1,8 +0,0 @@ -### rgb ferris sweep - - - - -#### notes -an elite-c was required for this pcb, as it exposes an io pin where most pro-micro's have a raw power pin.\ -this means no diodes are required :^) diff --git a/keymaps/ferris/rules.mk b/keymaps/ferris/rules.mk deleted file mode 100644 index 15e72a1..0000000 --- a/keymaps/ferris/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -BOOTLOADER = atmel-dfu -RGB_MATRIX_ENABLE = yes -RGB_MATRIX_DRIVER = ws2812 diff --git a/keymaps/kyria/config.h b/keymaps/kyria/config.h index 25e13a2..d8acae0 100644 --- a/keymaps/kyria/config.h +++ b/keymaps/kyria/config.h @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #pragma once @@ -10,8 +10,6 @@ #define CIRQUE_PINNACLE_SECONDARY_TAP_ENABLE #define CIRQUE_PINNACLE_DIAMETER_MM 35 #define SPLIT_WATCHDOG_ENABLE -#define CRC8_USE_TABLE -#define CRC8_OPTIMIZE_SPEED #undef RGB_MATRIX_MAXIMUM_BRIGHTNESS #define I2C1_CLOCK_SPEED 1000000 #define BOOTMAGIC_LITE_ROW 0 diff --git a/keymaps/kyria/keymap.c b/keymaps/kyria/keymap.c index 99b9da3..dd70d52 100644 --- a/keymaps/kyria/keymap.c +++ b/keymaps/kyria/keymap.c @@ -1,28 +1,28 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #include "jack.h" // clang-format off const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = LAYOUT_jack( - XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, XXXXXXX, - XXXXXXX, HRML(KC_A, KC_S, KC_D, KC_F), KC_G, KC_H, HRMR(KC_J, KC_K, KC_L, KC_SCLN), XXXXXXX, - XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, RWORD, XXXXXXX, XXXXXXX, NUKE, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, XXXXXXX, + XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, XXXXXXX, + XXXXXXX, HRML(KC_A, KC_S, KC_D, KC_F), KC_G, KC_H, HRMR(KC_J, KC_K, KC_L, KC_SCLN), XXXXXXX, + XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_SPC, XXXXXXX, XXXXXXX, KC_BSPC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, XXXXXXX, XXXXXXX, UPDIR, ESCLWR, KC_SPC, XXXXXXX, XXXXXXX, KC_BSPC, PSTRSE, PNP, XXXXXXX ), [_LOWER] = LAYOUT_jack( _______, KC_1, KC_2 , KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, _______, HRML(KC_EXLM, KC_AT, KC_HASH, KC_DLR), KC_PERC, KC_CIRC, HRMR(KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN), _______, - _______, KC_VOLD, KC_TAB, KC_CAPS, KC_TILD, KC_GRV, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_VOLU, _______, + _______, KC_VOLD, KC_TAB, KC_CAPS, REMOVE, KC_GRV, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), [_RAISE] = LAYOUT_jack( - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXXMODE, KC_SCRIPT, KC_BLOCKS, KC_REGIONAL, QK_MAKE, _______, - _______, _______, RGB_RMOD, RGB_HUD, RGB_SAD, RGB_VAD, KC_WIDE, KC_AUSSIE, KC_ZALGO, KC_SUPER, QK_BOOT, _______, - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, UC_NOMODE, UC_SCRIPT, UC_BLOCKS, UC_REGIONAL, QK_MAKE, _______, + _______, M_JIGGLE, RGB_RMOD, RGB_HUD, RGB_SAD, RGB_VAD, UC_WIDE, UC_AUSSIE, UC_ZALGO, UC_SUPER, QK_BOOT, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) }; // clang-format on @@ -36,3 +36,31 @@ bool oled_task_keymap(void) { return false; } #endif + +#ifdef POINTING_DEVICE_ENABLE +static bool scrolling = false; +layer_state_t layer_state_set_user(layer_state_t state) { + switch (get_highest_layer(state)) { + case _LOWER: + scrolling = true; + pointing_device_set_cpi(64); + break; + default: + if (scrolling) { + scrolling = false; + pointing_device_set_cpi(1024); + } + } + return state; +} + +report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) { + if (scrolling) { + mouse_report.h = mouse_report.x; + mouse_report.v = -mouse_report.y; + mouse_report.x = 0; + mouse_report.y = 0; + } + return mouse_report; +} +#endif diff --git a/keymaps/kyria/readme.md b/keymaps/kyria/readme.md index 517429a..06b8f31 100644 --- a/keymaps/kyria/readme.md +++ b/keymaps/kyria/readme.md @@ -1,5 +1,5 @@ ### rp2040 kyria rev2 - + #### parts & notes * microcontrollers: [boardsource blok](https://boardsource.xyz/store/628b95b494dfa308a6581622) diff --git a/keymaps/kyria/rules.mk b/keymaps/kyria/rules.mk index 2694171..cd88dc8 100644 --- a/keymaps/kyria/rules.mk +++ b/keymaps/kyria/rules.mk @@ -1,7 +1,5 @@ CONVERT_TO = blok RGBLIGHT_ENABLE = no RGB_MATRIX_ENABLE = yes -ENCODER_MAP_ENABLE = yes POINTING_DEVICE_ENABLE = yes POINTING_DEVICE_DRIVER = cirque_pinnacle_i2c -PROGRAM_CMD = doas picotool load $(BUILD_DIR)/$(TARGET).uf2 diff --git a/keymaps/onekey/f411_qfplib/config.h b/keymaps/onekey/f411_qfplib/config.h new file mode 100644 index 0000000..8fbef05 --- /dev/null +++ b/keymaps/onekey/f411_qfplib/config.h @@ -0,0 +1,12 @@ +// Copyright 2025 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#undef ADC_PIN +#undef BACKLIGHT_PIN +#undef MATRIX_ROW_PINS +#undef MATRIX_COL_PINS + +// clang-format off +#define DIRECT_PINS {{A0}} +// clang-format on diff --git a/keymaps/onekey/stm32f411/keymap.c b/keymaps/onekey/f411_qfplib/keymap.c index 34b5279..36202c2 100644 --- a/keymaps/onekey/stm32f411/keymap.c +++ b/keymaps/onekey/f411_qfplib/keymap.c @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #include QMK_KEYBOARD_H diff --git a/keymaps/onekey/stm32f411/qfplib/qfplib.h b/keymaps/onekey/f411_qfplib/qfplib/qfplib.h index d172da8..d172da8 100644 --- a/keymaps/onekey/stm32f411/qfplib/qfplib.h +++ b/keymaps/onekey/f411_qfplib/qfplib/qfplib.h diff --git a/keymaps/onekey/stm32f411/qfplib/qfplib.s b/keymaps/onekey/f411_qfplib/qfplib/qfplib.s index e035472..e035472 100644 --- a/keymaps/onekey/stm32f411/qfplib/qfplib.s +++ b/keymaps/onekey/f411_qfplib/qfplib/qfplib.s diff --git a/keymaps/onekey/stm32f411/rules.mk b/keymaps/onekey/f411_qfplib/rules.mk index 8b12a3d..8b12a3d 100644 --- a/keymaps/onekey/stm32f411/rules.mk +++ b/keymaps/onekey/f411_qfplib/rules.mk diff --git a/keymaps/onekey/rp2040/rules.mk b/keymaps/onekey/rp2040/rules.mk deleted file mode 100644 index a263ca2..0000000 --- a/keymaps/onekey/rp2040/rules.mk +++ /dev/null @@ -1,39 +0,0 @@ -CONSOLE_ENABLE = yes -OPT_DEFS += -UCRT0_EXTRA_CORES_NUMBER \ - -DCRT0_EXTRA_CORES_NUMBER=1 - -define WRAP - $(foreach FUNC,$1,$(eval EXTRALDFLAGS += -Wl,--wrap=$(FUNC))) -endef - -SRC += $(PICOSDKROOT)/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S -BIT_FUNCTIONS := __clzsi2 __clzdi2 __ctzsi2 __ctzdi2 __popcountsi2 __popcountdi2 -$(call WRAP, $(BIT_FUNCTIONS)) - -VPATH += $(PICOSDKROOT)/src/rp2_common/pico_double/include -SRC += $(PICOSDKROOT)/src/rp2_common/pico_double/double_aeabi.S \ - $(PICOSDKROOT)/src/rp2_common/pico_double/double_init_rom.c \ - $(PICOSDKROOT)/src/rp2_common/pico_double/double_math.c \ - $(PICOSDKROOT)/src/rp2_common/pico_double/double_v1_rom_shim.S -DOUBLE_FUNCTIONS := __aeabi_dadd __aeabi_ddiv __aeabi_dmul __aeabi_drsub __aeabi_dsub __aeabi_cdcmpeq \ - __aeabi_cdrcmple __aeabi_cdcmple __aeabi_dcmpeq __aeabi_dcmplt __aeabi_dcmple \ - __aeabi_dcmpge __aeabi_dcmpgt __aeabi_dcmpun __aeabi_i2d __aeabi_l2d __aeabi_ui2d \ - __aeabi_ul2d __aeabi_d2iz __aeabi_d2lz __aeabi_d2uiz __aeabi_d2ulz __aeabi_d2f \ - sqrt cos sin tan atan2 exp log ldexp copysign trunc floor ceil round sincos asin \ - acos atan sinh cosh tanh asinh acosh atanh exp2 log2 exp10 log10 pow powint hypot \ - cbrt fmod drem remainder remquo expm1 log1p fma -$(call WRAP, $(DOUBLE_FUNCTIONS)) - -VPATH += $(PICOSDKROOT)/src/rp2_common/pico_float/include -SRC += $(PICOSDKROOT)/src/rp2_common/pico_float/float_aeabi.S \ - $(PICOSDKROOT)/src/rp2_common/pico_float/float_init_rom.c \ - $(PICOSDKROOT)/src/rp2_common/pico_float/float_math.c \ - $(PICOSDKROOT)/src/rp2_common/pico_float/float_v1_rom_shim.S -FLOAT_FUNCTIONS := __aeabi_fadd __aeabi_fdiv __aeabi_fmul __aeabi_frsub __aeabi_fsub __aeabi_cfcmpeq \ - __aeabi_cfrcmple __aeabi_cfcmple __aeabi_fcmpeq __aeabi_fcmplt __aeabi_fcmple \ - __aeabi_fcmpge __aeabi_fcmpgt __aeabi_fcmpun __aeabi_i2f __aeabi_l2f __aeabi_ui2f \ - __aeabi_ul2f __aeabi_f2iz __aeabi_f2lz __aeabi_f2uiz __aeabi_f2ulz __aeabi_f2d \ - sqrtf cosf sinf tanf atan2f expf logf ldexpf copysignf truncf floorf ceilf roundf \ - sincosf asinf acosf atanf sinhf coshf tanhf asinhf acoshf atanhf exp2f log2f exp10f \ - log10f powf powintf hypotf cbrtf fmodf dremf remainderf remquof expm1f log1pf fmaf -$(call WRAP, $(FLOAT_FUNCTIONS)) diff --git a/keymaps/onekey/rp2040/chconf.h b/keymaps/onekey/rp_smp/chconf.h index 5b38d53..8937db2 100644 --- a/keymaps/onekey/rp2040/chconf.h +++ b/keymaps/onekey/rp_smp/chconf.h @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/keymaps/onekey/rp2040/keymap.c b/keymaps/onekey/rp_smp/keymap.c index 07fb9fa..20372fd 100644 --- a/keymaps/onekey/rp2040/keymap.c +++ b/keymaps/onekey/rp_smp/keymap.c @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #include QMK_KEYBOARD_H diff --git a/keymaps/onekey/rp2040/mcuconf.h b/keymaps/onekey/rp_smp/mcuconf.h index abc250c..c35ba16 100644 --- a/keymaps/onekey/rp2040/mcuconf.h +++ b/keymaps/onekey/rp_smp/mcuconf.h @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include_next <mcuconf.h> diff --git a/keymaps/onekey/rp_smp/rules.mk b/keymaps/onekey/rp_smp/rules.mk new file mode 100644 index 0000000..790127f --- /dev/null +++ b/keymaps/onekey/rp_smp/rules.mk @@ -0,0 +1,3 @@ +CONSOLE_ENABLE = yes +OPT_DEFS += -UCRT0_EXTRA_CORES_NUMBER \ + -DCRT0_EXTRA_CORES_NUMBER=1 diff --git a/keymaps/onekey/stm32f411/config.h b/keymaps/onekey/stm32f411/config.h deleted file mode 100644 index 1b03659..0000000 --- a/keymaps/onekey/stm32f411/config.h +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2024 [email protected] -// SPDX-License-Identifier: GPL-2.0-or-later -#pragma once - -#undef ADC_PIN -#undef BACKLIGHT_PIN -#undef MATRIX_ROW_PINS -#undef MATRIX_COL_PINS -#define DIRECT_PINS \ - { \ - { A0 } \ - } diff --git a/keymaps/relic/keymap.c b/keymaps/relic/keymap.c index 7f22e6f..ca296d8 100644 --- a/keymaps/relic/keymap.c +++ b/keymaps/relic/keymap.c @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-3.0-or-later #include "jack.h" @@ -8,13 +8,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ___BASE1___, PNP, ___BASE2___, ___BASE3___, - KC_VOLD, KC_ESC, _______, LWRSPC, _______, RSEBSP, _______, C(S(KC_V)), KC_VOLU + KC_VOLD, KC_ESC, XXXXXXX, LWRSPC, XXXXXXX, RSEBSP, XXXXXXX, C(S(KC_V)), KC_VOLU ), [_LOWER] = LAYOUT_jack_all( ___LOWER1___, _______, ___LOWER2___, ___LOWER3___, - _______, TABLE1, _______, _______, _______, _______, _______, TABLE2, _______ + _______, _______, _______, _______, _______, _______, _______, _______, _______ ), [_RAISE] = LAYOUT_jack_all( ___RAISE1___, _______, diff --git a/keymaps/relic/readme.md b/keymaps/relic/readme.md deleted file mode 100644 index a8e6d47..0000000 --- a/keymaps/relic/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -### relic - - diff --git a/keymaps/vault35/config.h b/keymaps/vault35/config.h index 392a9d4..7fefbd9 100644 --- a/keymaps/vault35/config.h +++ b/keymaps/vault35/config.h @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-3.0-or-later #pragma once diff --git a/keymaps/vault35/keymap.c b/keymaps/vault35/keymap.c index e78c59d..10ee07f 100644 --- a/keymaps/vault35/keymap.c +++ b/keymaps/vault35/keymap.c @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-3.0-or-later #include "jack.h" @@ -8,16 +8,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ___BASE1___, XXXXXXX, ___BASE2___, ___BASE3___, - UPDIR, KC_ESC, LWRSPC, _______, RSEBSP, C(S(KC_V)), PNP + UPDIR, KC_ESC, LWRSPC, XXXXXXX, RSEBSP, C(S(KC_V)), PNP ), [_LOWER] = LAYOUT_jack_all( - ___LOWER1___, XXXXXXX, + ___LOWER1___, _______, ___LOWER2___, ___LOWER3___, _______, _______, _______, _______, _______, _______, _______ ), [_RAISE] = LAYOUT_jack_all( - ___RAISE1___, XXXXXXX, + ___RAISE1___, _______, ___RAISE2___, ___RAISE3___, _______, _______, _______, _______, _______, _______, _______ diff --git a/keymaps/vault35/readme.md b/keymaps/vault35/readme.md deleted file mode 100644 index 15d1db4..0000000 --- a/keymaps/vault35/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -### vault35 - - diff --git a/ld/RP2040_FLASH_TIMECRIT_ROM_MATH.ld b/ld/RP2040_FLASH_TIMECRIT_ROM_MATH.ld new file mode 100644 index 0000000..4b1c595 --- /dev/null +++ b/ld/RP2040_FLASH_TIMECRIT_ROM_MATH.ld @@ -0,0 +1,148 @@ +/* + * Copyright 2006..2021 ChibiOS + * SPDX-License-Identifier: Apache-2.0 + */ + +/* + * RP2040 memory setup. + */ +MEMORY +{ + flash0 (rx) : org = 0x00000000, len = 16k /* ROM */ + flash1 (rx) : org = 0x10000000, len = DEFINED(FLASH_LEN) ? FLASH_LEN : 2048k /* XIP */ + flash2 (rx) : org = 0x00000000, len = 0 + flash3 (rx) : org = 0x00000000, len = 0 + flash4 (rx) : org = 0x00000000, len = 0 + flash5 (rx) : org = 0x00000000, len = 0 + flash6 (rx) : org = 0x00000000, len = 0 + flash7 (rx) : org = 0x00000000, len = 0 + ram0 (wx) : org = 0x20000000, len = 256k /* SRAM0 striped */ + ram1 (wx) : org = 0x00000000, len = 256k /* SRAM0 non striped */ + ram2 (wx) : org = 0x00000000, len = 0 + ram3 (wx) : org = 0x00000000, len = 0 + ram4 (wx) : org = 0x20040000, len = 4k /* SRAM4 */ + ram5 (wx) : org = 0x20041000, len = 4k /* SRAM5 */ + ram6 (wx) : org = 0x00000000, len = 0 + ram7 (wx) : org = 0x20041f00, len = 256 /* SRAM5 boot */ +} + +/* For each data/text section two region are defined, a virtual region + and a load region (_LMA suffix).*/ + +/* Flash region to be used for exception vectors.*/ +REGION_ALIAS("VECTORS_FLASH", flash1); +REGION_ALIAS("VECTORS_FLASH_LMA", flash1); + +/* Flash region to be used for constructors and destructors.*/ +REGION_ALIAS("XTORS_FLASH", flash1); +REGION_ALIAS("XTORS_FLASH_LMA", flash1); + +/* Flash region to be used for code text.*/ +REGION_ALIAS("TEXT_FLASH", flash1); +REGION_ALIAS("TEXT_FLASH_LMA", flash1); + +/* Flash region to be used for read only data.*/ +REGION_ALIAS("RODATA_FLASH", flash1); +REGION_ALIAS("RODATA_FLASH_LMA", flash1); + +/* Flash region to be used for various.*/ +REGION_ALIAS("VARIOUS_FLASH", flash1); +REGION_ALIAS("VARIOUS_FLASH_LMA", flash1); + +/* Flash region to be used for RAM(n) initialization data.*/ +REGION_ALIAS("RAM_INIT_FLASH_LMA", flash1); + +/* RAM region to be used for Main stack. This stack accommodates the processing + of all exceptions and interrupts.*/ +REGION_ALIAS("MAIN_STACK_RAM", ram4); + +/* RAM region to be used for the process stack. This is the stack used by + the main() function.*/ +REGION_ALIAS("PROCESS_STACK_RAM", ram4); + +/* RAM region to be used for Main stack. This stack accommodates the processing + of all exceptions and interrupts.*/ +REGION_ALIAS("C1_MAIN_STACK_RAM", ram5); + +/* RAM region to be used for the process stack. This is the stack used by + the main() function.*/ +REGION_ALIAS("C1_PROCESS_STACK_RAM", ram5); + +/* RAM region to be used for data segment.*/ +REGION_ALIAS("DATA_RAM", ram0); +REGION_ALIAS("DATA_RAM_LMA", flash1); + +/* RAM region to be used for BSS segment.*/ +REGION_ALIAS("BSS_RAM", ram0); + +/* RAM region to be used for the default heap.*/ +REGION_ALIAS("HEAP_RAM", ram0); + +SECTIONS +{ + .flash_begin : { + __flash_binary_start = .; + } > flash1 + + .boot2 : { + __boot2_start__ = .; + KEEP (*(.boot2)) + __boot2_end__ = .; + } > flash1 +} + +/* Generic rules inclusion.*/ +INCLUDE rules_stacks.ld +INCLUDE rules_stacks_c1.ld +INCLUDE RP2040_rules_code_with_boot2.ld + +SECTIONS +{ + .data : ALIGN(4) + { + PROVIDE(_textdata = LOADADDR(.data)); + PROVIDE(_data = .); + __textdata_base__ = LOADADDR(.data); + __data_base__ = .; + *(vtable) + *(.time_critical*) + . = ALIGN(4); + *(.data) + *(.data.*) + *(.ramtext) + . = ALIGN(4); + PROVIDE(_edata = .); + __data_end__ = .; + } > DATA_RAM AT > DATA_RAM_LMA + + .bss (NOLOAD) : ALIGN(4) + { + __bss_base__ = .; + *(.bss) + *(.bss.*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + PROVIDE(end = .); + } > BSS_RAM +} + +INCLUDE rules_memory.ld + +SECTIONS +{ + .flash_end : { + __flash_binary_end = .; + } > flash1 +} + +SECTIONS +{ + .preinit : ALIGN(4){ + . = ALIGN(4); + __preinit_array_base__ = .; + KEEP(*(SORT(.preinit_array.*))) + KEEP(*(.preinit_array)) + __preinit_array_end__ = .; + } > XTORS_FLASH AT > XTORS_FLASH_LMA +} @@ -1,23 +1,21 @@ -### qmk.me -this is a self-contained repository for my personal [qmk](https://github.com/qmk/qmk_firmware) userspace & keyboard code. +## qmk.me +This is a self-contained repository for my personal [QMK](https://github.com/qmk/qmk_firmware) userspace & keyboard code.  ### building -symlinks are used to compile this code in a proper `qmk_firmware` repository. +Symlinks are used to compile this code in a proper `qmk_firmware` repository. eg. ```shell -ln -s ~/qmk.me/jack ~/qmk_firmware/users/jack -ln -s ~/qmk.me/keyboards/relic ~/qmk_firmware/keyboards/relic -echo "users/jack\nkeyboards/relic" >> ~/qmk_firmware/.git/info/exclude +ln -s qmk.me/jack qmk_firmware/users/jack +ln -s qmk.me/keyboards/relic qmk_firmware/keyboards/relic +echo "users/jack\nkeyboards/relic" >> qmk_firmware/.git/info/exclude qmk compile -kb relic -km jack ``` -the official [userspace feature](https://docs.qmk.fm/newbs_external_userspace) -is not used as this repository contains personal keyboards, which are not supported. +The official external [userspace feature](https://docs.qmk.fm/newbs_external_userspace) is not used as this repository contains personal keyboards, which are not supported. ### layout -a simple 34-key layout that makes use of 2 (primary) layers, home-row mods, & combos for many symbols. -mostly used in sway, vim (c, python), & other generic computing tasks. +A simple 34-key layout that makes use of 2 (primary) layers, home-row mods, & combos for many symbols. Mostly used in Sway, Vim (C, Python), & other generic computing tasks.  diff --git a/util/link.sh b/util/link.sh index a451438..c0231bf 100755 --- a/util/link.sh +++ b/util/link.sh @@ -23,9 +23,9 @@ link() { } link crkbd crkbd +link beiwagon boardsource/beiwagon link bully mkh_studio/bully link f60 bioi/f60 -link ferris ferris link kyria splitkb/kyria link relic projectcain/relic link vault35 projectcain/vault35 diff --git a/jack/raw.py b/util/raw.py index 994a92c..fe63d49 100644 --- a/jack/raw.py +++ b/util/raw.py @@ -1,4 +1,4 @@ -# Copyright 2024 [email protected] +# Copyright 2025 [email protected] # SPDX-License-Identifier: GPL-2.0-or-later import hid import sys |